Merge tag 'drm-misc-next-2020-06-19' of git://anongit.freedesktop.org/drm/drm-misc...
authorDave Airlie <airlied@redhat.com>
Tue, 23 Jun 2020 00:58:28 +0000 (10:58 +1000)
committerDave Airlie <airlied@redhat.com>
Wed, 24 Jun 2020 05:45:51 +0000 (15:45 +1000)
drm-misc-next for v5.9:

UAPI Changes:
- Add DRM_MODE_TYPE_USERDEF for video modes specified in cmdline.

Cross-subsystem Changes:
- Assorted devicetree binding updates.
- Add might_sleep() to dma_fence_wait().
- Fix fbdev's get_user_pages_fast() handling, and use pin_user_pages.
- Small cleanup with IS_BUILTIN in video/fbdev drivers.
- Fix video/hdmi coding style for infoframe size.

Core Changes:
- Silence vblank output during init.
- Fix DP-MST corruption during send msg timeout.
- Clear leak in drm_gem_objecs_lookup().
- Make newlines work with force connector attribute.
- Fix module refcounting error in drm_encoder_slave, and use new i2c api.
- Header fix for drm_managed.c
- More struct_mutex removal for !legacy drivers:
  - Remove gem_free_object()
  - Removal of drm_gem_object_put_unlocked().
- Show current->comm alongside pid in debug printfs.
- Add drm_client_modeset_check() + drm_client_framebuffer_flush().
- Replace drm_fb_swab16 with drm_fb_swap that also supports 32-bits.
- Remove mode->vrefresh, and compactify drm_display_mode.
- Use drm_* macros for logging and warnings.
- Add WARN when drm_gem_get_pages is used on a private obj.
- Handle importing and imported dmabuf better in shmem helpers.
- Small fix for drm/mm hole size comparison, and remove invalid entry optimization.
- Add a drm/mm selftest.
- Set DSI connector type for DSI panels.
- Assorted small fixes and documentation updates.
- Fix DDI I2C device registration for MST ports, and flushing on destroy.
- Fix master_set return type, used by vmwgfx.
- Make the drm_set/drop_master ioctl symmetrical.

Driver Changes:
 Allow iommu in the sun4i driver and use it for sun8i.
- Simplify backlight lookup for omap, amba-clcd and tilcdc.
- Hold reg_lock for rockchip.
- Add support for bridge gpio and lane reordering + polarity to ti-sn65dsi86, and fix clock choice.
- Small assorted fixes to tilcdc, vc4, i915, omap, fbdev/sm712fb, fbdev/pxafb, console/newport_con, msm, virtio, udl, malidp, hdlcd, bridge/ti-sn65dsi86, panfrost.
- Remove hw cursor support for mgag200, and use simple kms helper + shmem helpers.
- Add support for KOE  Allow iommu in the sun4i driver and use it for sun8i.
- Simplify backlight lookup for omap, amba-clcd and tilcdc.
- Hold reg_lock for rockchip.
- Add support for bridge gpio and lane reordering + polarity to ti-sn65dsi86, and fix clock choice.
- Small assorted fixes to tilcdc, vc4 (multiple), i915.
- Remove hw cursor support for mgag200, and use simple kms helper + shmem helpers.
- Add support for KOE TX26D202VM0BWA panel.
- Use GEM CMA functions in arc, arm, atmel-hlcdc, fsi-dcu, hisilicon, imx, ingenic, komeda, malidp, mcde, meson, msxfb, rcar-du, shmobile, stm, sti, tilcdc, tve200, zte.
- Remove gem_print_info.
- Improve gem_create_object_helper so udl can use shmem helpers.
- Convert vc4 dt bindings to schemas, and add clock properties.
- Device initialization cleanups for mgag200.
- Add a workaround to fix DP-MST short pulses handling on broken hardware in i915.
- Allow build test compiling arm drivers.
- Use managed pci functions in mgag200 and ast.
- Use dev_groups in malidp.
- Add per pixel alpha support for PX30 VOP in rockchip.
- Silence deferred probe logs in panfrost.

Signed-off-by: Dave Airlie <airlied@redhat.com>
From: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/001cd9a6-405d-4e29-43d8-354f53ae4e8b@linux.intel.com
61 files changed:
1  2 
MAINTAINERS
drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c
drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
drivers/gpu/drm/amd/amdgpu/amdgpu_display.c
drivers/gpu/drm/amd/amdgpu/amdgpu_fb.c
drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c
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/drm_connector.c
drivers/gpu/drm/drm_dp_helper.c
drivers/gpu/drm/drm_dp_mst_topology.c
drivers/gpu/drm/drm_edid.c
drivers/gpu/drm/drm_file.c
drivers/gpu/drm/drm_ioctl.c
drivers/gpu/drm/drm_vm.c
drivers/gpu/drm/etnaviv/etnaviv_drv.c
drivers/gpu/drm/etnaviv/etnaviv_gem.c
drivers/gpu/drm/etnaviv/etnaviv_gem_submit.c
drivers/gpu/drm/exynos/exynos_drm_gem.c
drivers/gpu/drm/exynos/exynos_drm_gem.h
drivers/gpu/drm/exynos/exynos_mixer.c
drivers/gpu/drm/i915/display/intel_display.c
drivers/gpu/drm/i915/display/intel_display_debugfs.c
drivers/gpu/drm/i915/display/intel_dp.c
drivers/gpu/drm/i915/display/intel_dp_mst.c
drivers/gpu/drm/i915/display/intel_hotplug.c
drivers/gpu/drm/i915/display/intel_hotplug.h
drivers/gpu/drm/i915/display/intel_tv.c
drivers/gpu/drm/ingenic/ingenic-drm.c
drivers/gpu/drm/mediatek/mtk_drm_crtc.c
drivers/gpu/drm/mediatek/mtk_drm_gem.c
drivers/gpu/drm/mediatek/mtk_hdmi.c
drivers/gpu/drm/meson/meson_drv.c
drivers/gpu/drm/msm/adreno/a5xx_gpu.c
drivers/gpu/drm/msm/adreno/a6xx_gpu.c
drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c
drivers/gpu/drm/msm/disp/mdp4/mdp4_kms.c
drivers/gpu/drm/msm/disp/mdp5/mdp5_crtc.c
drivers/gpu/drm/msm/msm_drv.c
drivers/gpu/drm/msm/msm_gem.c
drivers/gpu/drm/msm/msm_gem_submit.c
drivers/gpu/drm/msm/msm_gpu.c
drivers/gpu/drm/nouveau/dispnv04/crtc.c
drivers/gpu/drm/nouveau/nouveau_connector.c
drivers/gpu/drm/nouveau/nouveau_display.c
drivers/gpu/drm/nouveau/nouveau_gem.c
drivers/gpu/drm/qxl/qxl_cmd.c
drivers/gpu/drm/qxl/qxl_display.c
drivers/gpu/drm/qxl/qxl_ioctl.c
drivers/gpu/drm/radeon/radeon_cs.c
drivers/gpu/drm/radeon/radeon_gem.c
drivers/gpu/drm/tegra/drm.c
drivers/gpu/drm/virtio/virtgpu_gem.c
drivers/gpu/drm/virtio/virtgpu_ioctl.c
drivers/video/console/newport_con.c
drivers/video/hdmi.c
include/drm/drm_dp_helper.h
include/drm/drm_modes.h
include/linux/hdmi.h

diff --combined MAINTAINERS
@@@ -147,7 -147,7 +147,7 @@@ Maintainers Lis
  M:    Steffen Klassert <klassert@kernel.org>
  L:    netdev@vger.kernel.org
  S:    Odd Fixes
 -F:    Documentation/networking/device_drivers/3com/vortex.txt
 +F:    Documentation/networking/device_drivers/3com/vortex.rst
  F:    drivers/net/ethernet/3com/3c59x.c
  
  3CR990 NETWORK DRIVER
@@@ -189,11 -189,11 +189,11 @@@ F:      drivers/net/hamradio/6pack.
  M:    Johannes Berg <johannes@sipsolutions.net>
  L:    linux-wireless@vger.kernel.org
  S:    Maintained
 -W:    http://wireless.kernel.org/
 +W:    https://wireless.wiki.kernel.org/
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/jberg/mac80211.git
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/jberg/mac80211-next.git
  F:    Documentation/driver-api/80211/cfg80211.rst
 -F:    Documentation/networking/regulatory.txt
 +F:    Documentation/networking/regulatory.rst
  F:    include/linux/ieee80211.h
  F:    include/net/cfg80211.h
  F:    include/net/ieee80211_radiotap.h
@@@ -294,7 -294,6 +294,7 @@@ F: drivers/gpio/gpio-104-idio-16.
  
  ACCES 104-QUAD-8 DRIVER
  M:    William Breathitt Gray <vilhelm.gray@gmail.com>
 +M:    Syed Nayyar Waris <syednwaris@gmail.com>
  L:    linux-iio@vger.kernel.org
  S:    Maintained
  F:    Documentation/ABI/testing/sysfs-bus-counter-104-quad-8
@@@ -506,7 -505,7 +506,7 @@@ F: drivers/hwmon/adm1029.
  ADM8211 WIRELESS DRIVER
  L:    linux-wireless@vger.kernel.org
  S:    Orphan
 -W:    http://wireless.kernel.org/
 +W:    https://wireless.wiki.kernel.org/
  F:    drivers/net/wireless/admtek/adm8211.*
  
  ADP1653 FLASH CONTROLLER DRIVER
@@@ -571,7 -570,7 +571,7 @@@ F: Documentation/devicetree/bindings/ii
  F:    drivers/input/misc/adxl34x.c
  
  ADXL372 THREE-AXIS DIGITAL ACCELEROMETER DRIVER
 -M:    Stefan Popa <stefan.popa@analog.com>
 +M:    Michael Hennerich <michael.hennerich@analog.com>
  S:    Supported
  W:    http://ez.analog.com/community/linux-device-drivers
  F:    Documentation/devicetree/bindings/iio/accel/adi,adxl372.yaml
@@@ -816,7 -815,7 +816,7 @@@ R: Saeed Bishara <saeedb@amazon.com
  R:    Zorik Machulsky <zorik@amazon.com>
  L:    netdev@vger.kernel.org
  S:    Supported
 -F:    Documentation/networking/device_drivers/amazon/ena.txt
 +F:    Documentation/networking/device_drivers/amazon/ena.rst
  F:    drivers/net/ethernet/amazon/
  
  AMAZON RDMA EFA DRIVER
@@@ -843,13 -842,6 +843,13 @@@ S:       Supporte
  T:    git git://people.freedesktop.org/~agd5f/linux
  F:    drivers/gpu/drm/amd/display/
  
 +AMD ENERGY DRIVER
 +M:    Naveen Krishna Chatradhi <nchatrad@amd.com>
 +L:    linux-hwmon@vger.kernel.org
 +S:    Maintained
 +F:    Documentation/hwmon/amd_energy.rst
 +F:    drivers/hwmon/amd_energy.c
 +
  AMD FAM15H PROCESSOR POWER MONITORING DRIVER
  M:    Huang Rui <ray.huang@amd.com>
  L:    linux-hwmon@vger.kernel.org
@@@ -884,7 -876,7 +884,7 @@@ M: Joerg Roedel <joro@8bytes.org
  L:    iommu@lists.linux-foundation.org
  S:    Maintained
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/joro/iommu.git
 -F:    drivers/iommu/amd_iommu*.[ch]
 +F:    drivers/iommu/amd/
  F:    include/linux/amd-iommu.h
  
  AMD KFD
@@@ -900,11 -892,6 +900,11 @@@ F:       drivers/gpu/drm/amd/include/v9_struc
  F:    drivers/gpu/drm/amd/include/vi_structs.h
  F:    include/uapi/linux/kfd_ioctl.h
  
 +AMD SPI DRIVER
 +M:    Sanjay R Mehta <sanju.mehta@amd.com>
 +S:    Maintained
 +F:    drivers/spi/spi-amd.c
 +
  AMD MP2 I2C DRIVER
  M:    Elie Morisse <syniurge@gmail.com>
  M:    Nehal Shah <nehal-bakulchandra.shah@amd.com>
@@@ -935,7 -922,7 +935,7 @@@ F: arch/arm64/boot/dts/amd/amd-seattle-
  F:    drivers/net/ethernet/amd/xgbe/
  
  ANALOG DEVICES INC AD5686 DRIVER
 -M:    Stefan Popa <stefan.popa@analog.com>
 +M:    Michael Hennerich <Michael.Hennerich@analog.com>
  L:    linux-pm@vger.kernel.org
  S:    Supported
  W:    http://ez.analog.com/community/linux-device-drivers
@@@ -943,7 -930,7 +943,7 @@@ F: drivers/iio/dac/ad5686
  F:    drivers/iio/dac/ad5696*
  
  ANALOG DEVICES INC AD5758 DRIVER
 -M:    Stefan Popa <stefan.popa@analog.com>
 +M:    Michael Hennerich <Michael.Hennerich@analog.com>
  L:    linux-iio@vger.kernel.org
  S:    Supported
  W:    http://ez.analog.com/community/linux-device-drivers
@@@ -959,7 -946,7 +959,7 @@@ F: Documentation/devicetree/bindings/ii
  F:    drivers/iio/adc/ad7091r5.c
  
  ANALOG DEVICES INC AD7124 DRIVER
 -M:    Stefan Popa <stefan.popa@analog.com>
 +M:    Michael Hennerich <Michael.Hennerich@analog.com>
  L:    linux-iio@vger.kernel.org
  S:    Supported
  W:    http://ez.analog.com/community/linux-device-drivers
@@@ -983,7 -970,7 +983,7 @@@ F: Documentation/devicetree/bindings/ii
  F:    drivers/iio/adc/ad7292.c
  
  ANALOG DEVICES INC AD7606 DRIVER
 -M:    Stefan Popa <stefan.popa@analog.com>
 +M:    Michael Hennerich <Michael.Hennerich@analog.com>
  M:    Beniamin Bia <beniamin.bia@analog.com>
  L:    linux-iio@vger.kernel.org
  S:    Supported
@@@ -992,7 -979,7 +992,7 @@@ F: Documentation/devicetree/bindings/ii
  F:    drivers/iio/adc/ad7606.c
  
  ANALOG DEVICES INC AD7768-1 DRIVER
 -M:    Stefan Popa <stefan.popa@analog.com>
 +M:    Michael Hennerich <Michael.Hennerich@analog.com>
  L:    linux-iio@vger.kernel.org
  S:    Supported
  W:    http://ez.analog.com/community/linux-device-drivers
@@@ -1043,14 -1030,6 +1043,14 @@@ W:    http://ez.analog.com/community/linux
  F:    Documentation/devicetree/bindings/iio/imu/adi,adis16460.yaml
  F:    drivers/iio/imu/adis16460.c
  
 +ANALOG DEVICES INC ADIS16475 DRIVER
 +M:    Nuno Sa <nuno.sa@analog.com>
 +L:    linux-iio@vger.kernel.org
 +W:    http://ez.analog.com/community/linux-device-drivers
 +S:    Supported
 +F:    drivers/iio/imu/adis16475.c
 +F:    Documentation/devicetree/bindings/iio/imu/adi,adis16475.yaml
 +
  ANALOG DEVICES INC ADM1177 DRIVER
  M:    Beniamin Bia <beniamin.bia@analog.com>
  M:    Michael Hennerich <Michael.Hennerich@analog.com>
@@@ -1061,7 -1040,7 +1061,7 @@@ F:      Documentation/devicetree/bindings/hw
  F:    drivers/hwmon/adm1177.c
  
  ANALOG DEVICES INC ADP5061 DRIVER
 -M:    Stefan Popa <stefan.popa@analog.com>
 +M:    Michael Hennerich <Michael.Hennerich@analog.com>
  L:    linux-pm@vger.kernel.org
  S:    Supported
  W:    http://ez.analog.com/community/linux-device-drivers
@@@ -1130,6 -1109,7 +1130,6 @@@ F:      drivers/iio/amplifiers/hmc425a.
  ANALOG DEVICES INC IIO DRIVERS
  M:    Lars-Peter Clausen <lars@metafoo.de>
  M:    Michael Hennerich <Michael.Hennerich@analog.com>
 -M:    Stefan Popa <stefan.popa@analog.com>
  S:    Supported
  W:    http://wiki.analog.com/
  W:    http://ez.analog.com/community/linux-device-drivers
@@@ -1295,7 -1275,7 +1295,7 @@@ L:      netdev@vger.kernel.or
  S:    Supported
  W:    https://www.marvell.com/
  Q:    http://patchwork.ozlabs.org/project/netdev/list/
 -F:    Documentation/networking/device_drivers/aquantia/atlantic.txt
 +F:    Documentation/networking/device_drivers/aquantia/atlantic.rst
  F:    drivers/net/ethernet/aquantia/atlantic/
  
  AQUANTIA ETHERNET DRIVER PTP SUBSYSTEM
@@@ -1305,13 -1285,6 +1305,13 @@@ S:    Supporte
  W:    http://www.aquantia.com
  F:    drivers/net/ethernet/aquantia/atlantic/aq_ptp*
  
 +ARASAN NAND CONTROLLER DRIVER
 +M:    Naga Sureshkumar Relli <nagasure@xilinx.com>
 +L:    linux-mtd@lists.infradead.org
 +S:    Maintained
 +F:    Documentation/devicetree/bindings/mtd/arasan,nand-controller.yaml
 +F:    drivers/mtd/nand/raw/arasan-nand-controller.c
 +
  ARC FRAMEBUFFER DRIVER
  M:    Jaya Kumar <jayalk@intworks.biz>
  S:    Maintained
@@@ -1350,10 -1323,7 +1350,10 @@@ ARM INTEGRATOR, VERSATILE AND REALVIEW 
  M:    Linus Walleij <linus.walleij@linaro.org>
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
  S:    Maintained
 -F:    Documentation/devicetree/bindings/arm/arm-boards
 +F:    Documentation/devicetree/bindings/arm/arm,integrator.yaml
 +F:    Documentation/devicetree/bindings/arm/arm,realview.yaml
 +F:    Documentation/devicetree/bindings/arm/arm,versatile.yaml
 +F:    Documentation/devicetree/bindings/arm/arm,vexpress-juno.yaml
  F:    Documentation/devicetree/bindings/auxdisplay/arm-charlcd.txt
  F:    Documentation/devicetree/bindings/clock/arm,syscon-icst.yaml
  F:    Documentation/devicetree/bindings/i2c/i2c-versatile.txt
@@@ -1366,11 -1336,10 +1366,11 @@@ F:   arch/arm/mach-integrator
  F:    arch/arm/mach-realview/
  F:    arch/arm/mach-versatile/
  F:    arch/arm/plat-versatile/
 +F:    drivers/bus/arm-integrator-lm.c
  F:    drivers/clk/versatile/
  F:    drivers/i2c/busses/i2c-versatile.c
  F:    drivers/irqchip/irq-versatile-fpga.c
 -F:    drivers/mtd/maps/physmap_of_versatile.c
 +F:    drivers/mtd/maps/physmap-versatile.*
  F:    drivers/power/reset/arm-versatile-reboot.c
  F:    drivers/soc/versatile/
  
@@@ -1485,13 -1454,6 +1485,13 @@@ S:    Maintaine
  F:    Documentation/devicetree/bindings/interrupt-controller/arm,vic.txt
  F:    drivers/irqchip/irq-vic.c
  
 +ARM SMC WATCHDOG DRIVER
 +M:    Julius Werner <jwerner@chromium.org>
 +R:    Evan Benn <evanbenn@chromium.org>
 +S:    Maintained
 +F:    devicetree/bindings/watchdog/arm-smc-wdt.yaml
 +F:    drivers/watchdog/arm_smc_wdt.c
 +
  ARM SMMU DRIVERS
  M:    Will Deacon <will@kernel.org>
  R:    Robin Murphy <robin.murphy@arm.com>
@@@ -1720,6 -1682,11 +1720,6 @@@ S:     Maintaine
  T:    git git://git.armlinux.org.uk/~rmk/linux-arm.git clkdev
  F:    drivers/clk/clkdev.c
  
 -ARM/COMPULAB CM-X270/EM-X270 and CM-X300 MACHINE SUPPORT
 -M:    Mike Rapoport <mike@compulab.co.il>
 -L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
 -S:    Maintained
 -
  ARM/CONEXANT DIGICOLOR MACHINE SUPPORT
  M:    Baruch Siach <baruch@tkos.co.il>
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
@@@ -2028,7 -1995,6 +2028,7 @@@ F:      arch/arm/mach-dove
  F:    arch/arm/mach-mv78xx0/
  F:    arch/arm/mach-orion5x/
  F:    arch/arm/plat-orion/
 +F:    drivers/soc/dove/
  
  ARM/Marvell Kirkwood and Armada 370, 375, 38x, 39x, XP, 3700, 7K/8K, CN9130 SOC support
  M:    Jason Cooper <jason@lakedaemon.net>
@@@ -2174,7 -2140,6 +2174,7 @@@ F:      Documentation/devicetree/bindings/*/
  F:    arch/arm/boot/dts/nuvoton-npcm*
  F:    arch/arm/mach-npcm/
  F:    drivers/*/*npcm*
 +F:    drivers/*/*/*npcm*
  F:    include/dt-bindings/clock/nuvoton,npcm7xx-clock.h
  
  ARM/OPENMOKO NEO FREERUNNER (GTA02) MACHINE SUPPORT
@@@ -2198,7 -2163,6 +2198,7 @@@ L:      linux-oxnas@groups.io (moderated fo
  S:    Maintained
  F:    arch/arm/boot/dts/ox8*.dts*
  F:    arch/arm/mach-oxnas/
 +F:    drivers/power/reset/oxnas-restart.c
  N:    oxnas
  
  ARM/PALM TREO SUPPORT
@@@ -2259,7 -2223,6 +2259,7 @@@ F:      drivers/*/qcom
  F:    drivers/*/qcom/
  F:    drivers/bluetooth/btqcomsmd.c
  F:    drivers/clocksource/timer-qcom.c
 +F:    drivers/cpuidle/cpuidle-qcom-spm.c
  F:    drivers/extcon/extcon-qcom*
  F:    drivers/i2c/busses/i2c-qcom-geni.c
  F:    drivers/i2c/busses/i2c-qup.c
@@@ -2307,8 -2270,6 +2307,8 @@@ L:      linux-arm-kernel@lists.infradead.or
  L:    linux-realtek-soc@lists.infradead.org (moderated for non-subscribers)
  S:    Maintained
  F:    Documentation/devicetree/bindings/arm/realtek.yaml
 +F:    arch/arm/boot/dts/rtd*
 +F:    arch/arm/mach-realtek/
  F:    arch/arm64/boot/dts/realtek/
  
  ARM/RENESAS ARM64 ARCHITECTURE
@@@ -2731,8 -2692,8 +2731,8 @@@ L:      linux-arm-kernel@lists.infradead.or
  S:    Supported
  W:    http://wiki.xilinx.com
  T:    git https://github.com/Xilinx/linux-xlnx.git
 -F:    Documentation/devicetree/bindings/i2c/i2c-cadence.txt
 -F:    Documentation/devicetree/bindings/i2c/i2c-xiic.txt
 +F:    Documentation/devicetree/bindings/i2c/cdns,i2c-r1p10.yaml
 +F:    Documentation/devicetree/bindings/i2c/xlnx,xps-iic-2.00.a.yaml
  F:    arch/arm/mach-zynq/
  F:    drivers/block/xsysace.c
  F:    drivers/clocksource/timer-cadence-ttc.c
@@@ -2886,14 -2847,14 +2886,14 @@@ M:   Nick Kossifidis <mickflemm@gmail.com
  M:    Luis Chamberlain <mcgrof@kernel.org>
  L:    linux-wireless@vger.kernel.org
  S:    Maintained
 -W:    http://wireless.kernel.org/en/users/Drivers/ath5k
 +W:    https://wireless.wiki.kernel.org/en/users/Drivers/ath5k
  F:    drivers/net/wireless/ath/ath5k/
  
  ATHEROS ATH6KL WIRELESS DRIVER
  M:    Kalle Valo <kvalo@codeaurora.org>
  L:    linux-wireless@vger.kernel.org
  S:    Supported
 -W:    http://wireless.kernel.org/en/users/Drivers/ath6kl
 +W:    https://wireless.wiki.kernel.org/en/users/Drivers/ath6kl
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/kvalo/ath.git
  F:    drivers/net/wireless/ath/ath6kl/
  
@@@ -3056,7 -3017,7 +3056,7 @@@ B43 WIRELESS DRIVE
  L:    linux-wireless@vger.kernel.org
  L:    b43-dev@lists.infradead.org
  S:    Odd Fixes
 -W:    http://wireless.kernel.org/en/users/Drivers/b43
 +W:    https://wireless.wiki.kernel.org/en/users/Drivers/b43
  F:    drivers/net/wireless/broadcom/b43/
  
  B43LEGACY WIRELESS DRIVER
@@@ -3064,7 -3025,7 +3064,7 @@@ M:      Larry Finger <Larry.Finger@lwfinger.
  L:    linux-wireless@vger.kernel.org
  L:    b43-dev@lists.infradead.org
  S:    Maintained
 -W:    http://wireless.kernel.org/en/users/Drivers/b43
 +W:    https://wireless.wiki.kernel.org/en/users/Drivers/b43
  F:    drivers/net/wireless/broadcom/b43legacy/
  
  BACKLIGHT CLASS/SUBSYSTEM
@@@ -3228,7 -3189,7 +3228,7 @@@ Q:      https://patchwork.ozlabs.org/project
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/bpf/bpf.git
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/bpf/bpf-next.git
  F:    Documentation/bpf/
 -F:    Documentation/networking/filter.txt
 +F:    Documentation/networking/filter.rst
  F:    arch/*/net/*
  F:    include/linux/bpf*
  F:    include/linux/filter.h
@@@ -3357,7 -3318,7 +3357,7 @@@ L:      bcm-kernel-feedback-list@broadcom.co
  L:    linux-rpi-kernel@lists.infradead.org (moderated for non-subscribers)
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
  S:    Maintained
 -T:    git git://github.com/anholt/linux
 +T:    git git://git.kernel.org/pub/scm/linux/kernel/git/nsaenz/linux-rpi.git
  F:    Documentation/devicetree/bindings/pci/brcm,stb-pcie.yaml
  F:    drivers/pci/controller/pcie-brcmstb.c
  F:    drivers/staging/vc04_services
@@@ -3518,14 -3479,6 +3518,14 @@@ S:    Supporte
  F:    Documentation/devicetree/bindings/i2c/brcm,brcmstb-i2c.yaml
  F:    drivers/i2c/busses/i2c-brcmstb.c
  
 +BROADCOM BRCMSTB USB EHCI DRIVER
 +M:    Al Cooper <alcooperx@gmail.com>
 +L:    linux-usb@vger.kernel.org
 +L:    bcm-kernel-feedback-list@broadcom.com
 +S:    Maintained
 +F:    Documentation/devicetree/bindings/usb/brcm,bcm7445-ehci.yaml
 +F:    drivers/usb/host/ehci-brcm.*
 +
  BROADCOM BRCMSTB USB2 and USB3 PHY DRIVER
  M:    Al Cooper <alcooperx@gmail.com>
  L:    linux-kernel@vger.kernel.org
@@@ -3702,7 -3655,7 +3702,7 @@@ L:      linux-btrfs@vger.kernel.or
  S:    Maintained
  W:    http://btrfs.wiki.kernel.org/
  Q:    http://patchwork.kernel.org/project/linux-btrfs/list/
 -T:    git git://git.kernel.org/pub/scm/linux/kernel/git/mason/linux-btrfs.git
 +T:    git git://git.kernel.org/pub/scm/linux/kernel/git/kdave/linux.git
  F:    Documentation/filesystems/btrfs.rst
  F:    fs/btrfs/
  F:    include/linux/btrfs*
@@@ -3714,7 -3667,7 +3714,7 @@@ L:      linux-media@vger.kernel.or
  S:    Odd fixes
  W:    https://linuxtv.org
  T:    git git://linuxtv.org/media_tree.git
 -F:    Documentation/media/v4l-drivers/bttv*
 +F:    Documentation/driver-api/media/drivers/bttv*
  F:    drivers/media/pci/bt8xx/bttv*
  
  BUS FREQUENCY DRIVER FOR SAMSUNG EXYNOS
@@@ -3775,7 -3728,7 +3775,7 @@@ CACHEFILES: FS-CACHE BACKEND FOR CACHIN
  M:    David Howells <dhowells@redhat.com>
  L:    linux-cachefs@redhat.com (moderated for non-subscribers)
  S:    Supported
 -F:    Documentation/filesystems/caching/cachefiles.txt
 +F:    Documentation/filesystems/caching/cachefiles.rst
  F:    fs/cachefiles/
  
  CADENCE MIPI-CSI2 BRIDGES
@@@ -3786,8 -3739,9 +3786,8 @@@ F:      Documentation/devicetree/bindings/me
  F:    drivers/media/platform/cadence/cdns-csi2*
  
  CADENCE NAND DRIVER
 -M:    Piotr Sroka <piotrs@cadence.com>
  L:    linux-mtd@lists.infradead.org
 -S:    Maintained
 +S:    Orphan
  F:    Documentation/devicetree/bindings/mtd/cadence-nand-controller.txt
  F:    drivers/mtd/nand/raw/cadence-nand-controller.c
  
@@@ -3804,7 -3758,7 +3804,7 @@@ M:      Jonathan Corbet <corbet@lwn.net
  L:    linux-media@vger.kernel.org
  S:    Maintained
  T:    git git://linuxtv.org/media_tree.git
 -F:    Documentation/media/v4l-drivers/cafe_ccic*
 +F:    Documentation/admin-guide/media/cafe_ccic*
  F:    drivers/media/platform/marvell-ccic/
  
  CAIF NETWORK LAYER
@@@ -3886,7 -3840,7 +3886,7 @@@ CARL9170 LINUX COMMUNITY WIRELESS DRIVE
  M:    Christian Lamparter <chunkeey@googlemail.com>
  L:    linux-wireless@vger.kernel.org
  S:    Maintained
 -W:    http://wireless.kernel.org/en/users/Drivers/carl9170
 +W:    https://wireless.wiki.kernel.org/en/users/Drivers/carl9170
  F:    drivers/net/wireless/ath/carl9170/
  
  CAVIUM I2C DRIVER
@@@ -3940,15 -3894,6 +3940,15 @@@ S:    Supporte
  W:    https://developer.arm.com/products/system-ip/trustzone-cryptocell/cryptocell-700-family
  F:    drivers/crypto/ccree/
  
 +CCTRNG ARM TRUSTZONE CRYPTOCELL TRUE RANDOM NUMBER GENERATOR (TRNG) DRIVER
 +M:    Hadar Gat <hadar.gat@arm.com>
 +L:    linux-crypto@vger.kernel.org
 +S:    Supported
 +F:    drivers/char/hw_random/cctrng.c
 +F:    drivers/char/hw_random/cctrng.h
 +F:    Documentation/devicetree/bindings/rng/arm-cctrng.txt
 +W:    https://developer.arm.com/products/system-ip/trustzone-cryptocell/cryptocell-700-family
 +
  CEC FRAMEWORK
  M:    Hans Verkuil <hverkuil-cisco@xs4all.nl>
  L:    linux-media@vger.kernel.org
@@@ -3957,8 -3902,8 +3957,8 @@@ W:      http://linuxtv.or
  T:    git git://linuxtv.org/media_tree.git
  F:    Documentation/ABI/testing/debugfs-cec-error-inj
  F:    Documentation/devicetree/bindings/media/cec.txt
 -F:    Documentation/media/kapi/cec-core.rst
 -F:    Documentation/media/uapi/cec
 +F:    Documentation/driver-api/media/cec-core.rst
 +F:    Documentation/userspace-api/media/cec
  F:    drivers/media/cec/
  F:    drivers/media/rc/keymaps/rc-cec.c
  F:    include/media/cec-notifier.h
@@@ -3986,18 -3931,14 +3986,18 @@@ F:   arch/powerpc/include/uapi/asm/spu*.
  F:    arch/powerpc/oprofile/*cell*
  F:    arch/powerpc/platforms/cell/
  
 +CELLWISE CW2015 BATTERY DRIVER
 +M:    Tobias Schrammm <t.schramm@manjaro.org>
 +S:    Maintained
 +F:    Documentation/devicetree/bindings/power/supply/cw2015_battery.yaml
 +F:    drivers/power/supply/cw2015_battery.c
 +
  CEPH COMMON CODE (LIBCEPH)
  M:    Ilya Dryomov <idryomov@gmail.com>
  M:    Jeff Layton <jlayton@kernel.org>
 -M:    Sage Weil <sage@redhat.com>
  L:    ceph-devel@vger.kernel.org
  S:    Supported
  W:    http://ceph.com/
 -T:    git git://git.kernel.org/pub/scm/linux/kernel/git/sage/ceph-client.git
  T:    git git://github.com/ceph/ceph-client.git
  F:    include/linux/ceph/
  F:    include/linux/crush/
@@@ -4005,10 -3946,12 +4005,10 @@@ F:   net/ceph
  
  CEPH DISTRIBUTED FILE SYSTEM CLIENT (CEPH)
  M:    Jeff Layton <jlayton@kernel.org>
 -M:    Sage Weil <sage@redhat.com>
  M:    Ilya Dryomov <idryomov@gmail.com>
  L:    ceph-devel@vger.kernel.org
  S:    Supported
  W:    http://ceph.com/
 -T:    git git://git.kernel.org/pub/scm/linux/kernel/git/sage/ceph-client.git
  T:    git git://github.com/ceph/ceph-client.git
  F:    Documentation/filesystems/ceph.rst
  F:    fs/ceph/
@@@ -4119,11 -4062,12 +4119,11 @@@ M:   Charles Keepax <ckeepax@opensource.c
  M:    Richard Fitzgerald <rf@opensource.cirrus.com>
  L:    patches@opensource.cirrus.com
  S:    Supported
 -F:    Documentation/devicetree/bindings/clock/cirrus,lochnagar.txt
 -F:    Documentation/devicetree/bindings/hwmon/cirrus,lochnagar.txt
 -F:    Documentation/devicetree/bindings/mfd/cirrus,lochnagar.txt
 -F:    Documentation/devicetree/bindings/pinctrl/cirrus,lochnagar.txt
 -F:    Documentation/devicetree/bindings/regulator/cirrus,lochnagar.txt
 -F:    Documentation/devicetree/bindings/sound/cirrus,lochnagar.txt
 +F:    Documentation/devicetree/bindings/clock/cirrus,lochnagar.yaml
 +F:    Documentation/devicetree/bindings/hwmon/cirrus,lochnagar.yaml
 +F:    Documentation/devicetree/bindings/mfd/cirrus,lochnagar.yaml
 +F:    Documentation/devicetree/bindings/pinctrl/cirrus,lochnagar.yaml
 +F:    Documentation/devicetree/bindings/sound/cirrus,lochnagar.yaml
  F:    Documentation/hwmon/lochnagar.rst
  F:    drivers/clk/clk-lochnagar.c
  F:    drivers/hwmon/lochnagar-hwmon.c
@@@ -4143,9 -4087,9 +4143,9 @@@ L:      patches@opensource.cirrus.co
  S:    Supported
  W:    https://github.com/CirrusLogic/linux-drivers/wiki
  T:    git https://github.com/CirrusLogic/linux-drivers.git
 -F:    Documentation/devicetree/bindings/mfd/madera.txt
 -F:    Documentation/devicetree/bindings/pinctrl/cirrus,madera-pinctrl.txt
 -F:    Documentation/devicetree/bindings/sound/madera.txt
 +F:    Documentation/devicetree/bindings/mfd/cirrus,madera.yaml
 +F:    Documentation/devicetree/bindings/pinctrl/cirrus,madera.yaml
 +F:    Documentation/devicetree/bindings/sound/cirrus,madera.yaml
  F:    drivers/gpio/gpio-madera*
  F:    drivers/irqchip/irq-madera*
  F:    drivers/mfd/cs47l*
@@@ -4256,7 -4200,7 +4256,7 @@@ M:      coda@cs.cmu.ed
  L:    codalist@coda.cs.cmu.edu
  S:    Maintained
  W:    http://www.coda.cs.cmu.edu/
 -F:    Documentation/filesystems/coda.txt
 +F:    Documentation/filesystems/coda.rst
  F:    fs/coda/
  F:    include/linux/coda*.h
  F:    include/uapi/linux/coda*.h
@@@ -4595,7 -4539,7 +4595,7 @@@ L:      linux-media@vger.kernel.or
  S:    Odd fixes
  W:    https://linuxtv.org
  T:    git git://linuxtv.org/media_tree.git
 -F:    Documentation/media/v4l-drivers/cx88*
 +F:    Documentation/driver-api/media/drivers/cx88*
  F:    drivers/media/pci/cx88/
  
  CXD2820R MEDIA DRIVER
@@@ -4711,12 -4655,6 +4711,12 @@@ Q:    http://patchwork.linuxtv.org/project
  T:    git git://linuxtv.org/anttip/media_tree.git
  F:    drivers/media/common/cypress_firmware*
  
 +CYPRESS CY8CTMA140 TOUCHSCREEN DRIVER
 +M:    Linus Walleij <linus.walleij@linaro.org>
 +L:    linux-input@vger.kernel.org
 +S:    Maintained
 +F:    drivers/input/touchscreen/cy8ctma140.c
 +
  CYTTSP TOUCHSCREEN DRIVER
  M:    Ferruh Yigit <fery@cypress.com>
  L:    linux-input@vger.kernel.org
@@@ -4753,7 -4691,7 +4753,7 @@@ F:      net/ax25/sysctl_net_ax25.
  DAVICOM FAST ETHERNET (DMFE) NETWORK DRIVER
  L:    netdev@vger.kernel.org
  S:    Orphan
 -F:    Documentation/networking/device_drivers/dec/dmfe.txt
 +F:    Documentation/networking/device_drivers/dec/dmfe.rst
  F:    drivers/net/ethernet/dec/tulip/dmfe.c
  
  DC390/AM53C974 SCSI driver
@@@ -4787,7 -4725,7 +4787,7 @@@ DECnet NETWORK LAYE
  L:    linux-decnet-user@lists.sourceforge.net
  S:    Orphan
  W:    http://linux-decnet.sourceforge.net
 -F:    Documentation/networking/decnet.txt
 +F:    Documentation/networking/decnet.rst
  F:    net/decnet/
  
  DECSTATION PLATFORM SUPPORT
@@@ -5055,7 -4993,7 +5055,7 @@@ M:      Jan Kara <jack@suse.cz
  R:    Amir Goldstein <amir73il@gmail.com>
  L:    linux-fsdevel@vger.kernel.org
  S:    Maintained
 -F:    Documentation/filesystems/dnotify.txt
 +F:    Documentation/filesystems/dnotify.rst
  F:    fs/notify/dnotify/
  F:    include/linux/dnotify.h
  
@@@ -5069,7 -5007,7 +5069,7 @@@ W:      http://www.win.tue.nl/~aeb/partition
  DISKQUOTA
  M:    Jan Kara <jack@suse.com>
  S:    Maintained
 -F:    Documentation/filesystems/quota.txt
 +F:    Documentation/filesystems/quota.rst
  F:    fs/quota/
  F:    include/linux/quota*.h
  F:    include/uapi/linux/quota*.h
@@@ -5104,7 -5042,10 +5104,7 @@@ F:     drivers/dma-buf
  F:    include/linux/*fence.h
  F:    include/linux/dma-buf*
  F:    include/linux/dma-resv.h
 -F:    include/linux/*fence.h
 -F:    Documentation/driver-api/dma-buf.rst
  K:    \bdma_(?:buf|fence|resv)\b
 -T:    git git://anongit.freedesktop.org/drm/drm-misc
  
  DMA GENERIC OFFLOAD ENGINE SUBSYSTEM
  M:    Vinod Koul <vkoul@kernel.org>
@@@ -5184,14 -5125,12 +5184,14 @@@ F:   scripts/documentation-file-ref-chec
  F:    scripts/kernel-doc
  F:    scripts/sphinx-pre-install
  X:    Documentation/ABI/
 +X:    Documentation/admin-guide/media/
  X:    Documentation/devicetree/
 +X:    Documentation/driver-api/media/
  X:    Documentation/firmware-guide/acpi/
  X:    Documentation/i2c/
 -X:    Documentation/media/
  X:    Documentation/power/
  X:    Documentation/spi/
 +X:    Documentation/userspace-api/media/
  
  DOCUMENTATION SCRIPTS
  M:    Mauro Carvalho Chehab <mchehab@kernel.org>
@@@ -5237,7 -5176,6 +5237,7 @@@ S:      Maintaine
  F:    drivers/soc/fsl/dpio
  
  DPAA2 ETHERNET DRIVER
 +M:    Ioana Ciornei <ioana.ciornei@nxp.com>
  M:    Ioana Radulescu <ruxandra.radulescu@nxp.com>
  L:    netdev@vger.kernel.org
  S:    Maintained
@@@ -5317,9 -5255,8 +5317,9 @@@ F:      drivers/gpu/drm/pl111
  DRM DRIVER FOR ARM VERSATILE TFT PANELS
  M:    Linus Walleij <linus.walleij@linaro.org>
  S:    Maintained
 -F:    drivers/gpu/drm/panel/panel-arm-versatile.c
 +T:    git git://anongit.freedesktop.org/drm/drm-misc
  F:    Documentation/devicetree/bindings/display/panel/arm,versatile-tft-panel.yaml
 +F:    drivers/gpu/drm/panel/panel-arm-versatile.c
  
  DRM DRIVER FOR ASPEED BMC GFX
  M:    Joel Stanley <joel@jms.id.au>
@@@ -5344,8 -5281,8 +5344,8 @@@ F:      drivers/gpu/drm/bochs
  DRM DRIVER FOR BOE HIMAX8279D PANELS
  M:    Jerry Han <hanxu5@huaqin.corp-partner.google.com>
  S:    Maintained
 -F:    drivers/gpu/drm/panel/panel-boe-himax8279d.c
  F:    Documentation/devicetree/bindings/display/panel/boe,himax8279d.yaml
 +F:    drivers/gpu/drm/panel/panel-boe-himax8279d.c
  
  DRM DRIVER FOR FARADAY TVE200 TV ENCODER
  M:    Linus Walleij <linus.walleij@linaro.org>
@@@ -5362,8 -5299,8 +5362,8 @@@ F:      drivers/gpu/drm/panel/panel-feixin-k
  DRM DRIVER FOR FEIYANG FY07024DI26A30-D MIPI-DSI LCD PANELS
  M:    Jagan Teki <jagan@amarulasolutions.com>
  S:    Maintained
 -F:    drivers/gpu/drm/panel/panel-feiyang-fy07024di26a30d.c
  F:    Documentation/devicetree/bindings/display/panel/feiyang,fy07024di26a30d.yaml
 +F:    drivers/gpu/drm/panel/panel-feiyang-fy07024di26a30d.c
  
  DRM DRIVER FOR GRAIN MEDIA GM12U320 PROJECTORS
  M:    Hans de Goede <hdegoede@redhat.com>
@@@ -5397,14 -5334,6 +5397,14 @@@ S:    Orphan / Obsolet
  F:    drivers/gpu/drm/i810/
  F:    include/uapi/drm/i810_drm.h
  
 +DRM DRIVER FOR LVDS PANELS
 +M:    Laurent Pinchart <laurent.pinchart@ideasonboard.com>
 +L:    dri-devel@lists.freedesktop.org
 +T:    git git://anongit.freedesktop.org/drm/drm-misc
 +S:    Maintained
 +F:    drivers/gpu/drm/panel/panel-lvds.c
 +F:    Documentation/devicetree/bindings/display/panel/lvds.yaml
 +
  DRM DRIVER FOR MATROX G200/G400 GRAPHICS CARDS
  S:    Orphan / Obsolete
  F:    drivers/gpu/drm/mga/
@@@ -5453,8 -5382,8 +5453,8 @@@ F:      include/uapi/drm/nouveau_drm.
  DRM DRIVER FOR OLIMEX LCD-OLINUXINO PANELS
  M:    Stefan Mavrodiev <stefan@olimex.com>
  S:    Maintained
 -F:    drivers/gpu/drm/panel/panel-olimex-lcd-olinuxino.c
  F:    Documentation/devicetree/bindings/display/panel/olimex,lcd-olinuxino.yaml
 +F:    drivers/gpu/drm/panel/panel-olimex-lcd-olinuxino.c
  
  DRM DRIVER FOR PERVASIVE DISPLAYS REPAPER PANELS
  M:    Noralf Trønnes <noralf@tronnes.org>
@@@ -5482,6 -5411,12 +5482,6 @@@ T:     git git://anongit.freedesktop.org/dr
  F:    drivers/gpu/drm/qxl/
  F:    include/uapi/drm/qxl_drm.h
  
 -DRM DRIVER FOR RAYDIUM RM67191 PANELS
 -M:    Robert Chiras <robert.chiras@nxp.com>
 -S:    Maintained
 -F:    drivers/gpu/drm/panel/panel-raydium-rm67191.c
 -F:    Documentation/devicetree/bindings/display/panel/raydium,rm67191.yaml
 -
  DRM DRIVER FOR RAGE 128 VIDEO CARDS
  S:    Orphan / Obsolete
  F:    drivers/gpu/drm/r128/
@@@ -5520,7 -5455,7 +5520,7 @@@ F:      drivers/gpu/drm/tiny/st7586.
  DRM DRIVER FOR SITRONIX ST7701 PANELS
  M:    Jagan Teki <jagan@amarulasolutions.com>
  S:    Maintained
 -F:    Documentation/devicetree/bindings/display/panel/sitronix,st7701.txt
 +F:    Documentation/devicetree/bindings/display/panel/sitronix,st7701.yaml
  F:    drivers/gpu/drm/panel/panel-sitronix-st7701.c
  
  DRM DRIVER FOR SITRONIX ST7735R PANELS
@@@ -5581,10 -5516,10 +5581,10 @@@ F:   drivers/gpu/drm/vboxvideo
  
  DRM DRIVER FOR VMWARE VIRTUAL GPU
  M:    "VMware Graphics" <linux-graphics-maintainer@vmware.com>
 -M:    Thomas Hellstrom <thellstrom@vmware.com>
 +M:    Roland Scheidegger <sroland@vmware.com>
  L:    dri-devel@lists.freedesktop.org
  S:    Supported
 -T:    git git://people.freedesktop.org/~thomash/linux
 +T:    git git://people.freedesktop.org/~sroland/linux
  F:    drivers/gpu/drm/vmwgfx/
  F:    include/uapi/drm/vmwgfx_drm.h
  
@@@ -5625,7 -5560,7 +5625,7 @@@ M:      Chen-Yu Tsai <wens@csie.org
  L:    dri-devel@lists.freedesktop.org
  S:    Supported
  T:    git git://anongit.freedesktop.org/drm/drm-misc
 -F:    Documentation/devicetree/bindings/display/sunxi/sun4i-drm.txt
 +F:    Documentation/devicetree/bindings/display/allwinner*
  F:    drivers/gpu/drm/sun4i/
  
  DRM DRIVERS FOR AMLOGIC SOCS
@@@ -5819,7 -5754,7 +5819,7 @@@ M:      Eric Anholt <eric@anholt.net
  S:    Supported
  T:    git git://github.com/anholt/linux
  T:    git git://anongit.freedesktop.org/drm/drm-misc
- F:    Documentation/devicetree/bindings/display/brcm,bcm-vc4.txt
+ F:    Documentation/devicetree/bindings/display/brcm,bcm2835-*.yaml
  F:    drivers/gpu/drm/vc4/
  F:    include/uapi/drm/vc4_drm.h
  
@@@ -6005,7 -5940,6 +6005,7 @@@ F:      lib/dynamic_debug.
  DYNAMIC INTERRUPT MODERATION
  M:    Tal Gilboa <talgi@mellanox.com>
  S:    Maintained
 +F:    Documentation/networking/net_dim.rst
  F:    include/linux/dim.h
  F:    lib/dim/
  
@@@ -6246,6 -6180,7 +6246,6 @@@ M:      Yash Shah <yash.shah@sifive.com
  L:    linux-edac@vger.kernel.org
  S:    Supported
  F:    drivers/edac/sifive_edac.c
 -F:    drivers/soc/sifive_l2_cache.c
  
  EDAC-SKYLAKE
  M:    Tony Luck <tony.luck@intel.com>
@@@ -6305,7 -6240,7 +6305,7 @@@ L:      linux-media@vger.kernel.or
  S:    Maintained
  W:    https://linuxtv.org
  T:    git git://linuxtv.org/media_tree.git
 -F:    Documentation/media/v4l-drivers/em28xx*
 +F:    Documentation/admin-guide/media/em28xx*
  F:    drivers/media/usb/em28xx/
  
  EMBEDDED LINUX
@@@ -6786,13 -6721,6 +6786,13 @@@ S:    Maintaine
  F:    Documentation/devicetree/bindings/crypto/fsl-sec4.txt
  F:    drivers/crypto/caam/
  
 +FREESCALE COLDFIRE M5441X MMC DRIVER
 +M:    Angelo Dureghello <angelo.dureghello@timesys.com>
 +L:    linux-mmc@vger.kernel.org
 +S:    Maintained
 +F:    drivers/mmc/host/sdhci-esdhc-mcf.c
 +F:    include/linux/platform_data/mmc-esdhc-mcf.h
 +
  FREESCALE DIU FRAMEBUFFER DRIVER
  M:    Timur Tabi <timur@kernel.org>
  L:    linux-fbdev@vger.kernel.org
@@@ -7100,30 -7028,18 +7100,30 @@@ R:   Darren Hart <dvhart@infradead.org
  L:    linux-kernel@vger.kernel.org
  S:    Maintained
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git locking/core
 -F:    Documentation/*futex*
 +F:    Documentation/locking/*futex*
  F:    include/asm-generic/futex.h
  F:    include/linux/futex.h
  F:    include/uapi/linux/futex.h
  F:    kernel/futex.c
  F:    tools/perf/bench/futex*
 -F:    tools/testing/selftests/futex/
 +F:    Documentation/locking/*futex*
 +
 +GATEWORKS SYSTEM CONTROLLER (GSC) DRIVER
 +M:    Tim Harvey <tharvey@gateworks.com>
 +M:    Robert Jones <rjones@gateworks.com>
 +S:    Maintained
 +F:    Documentation/devicetree/bindings/mfd/gateworks-gsc.yaml
 +F:    drivers/mfd/gateworks-gsc.c
 +F:    include/linux/mfd/gsc.h
 +F:    Documentation/hwmon/gsc-hwmon.rst
 +F:    drivers/hwmon/gsc-hwmon.c
 +F:    include/linux/platform_data/gsc_hwmon.h
  
  GASKET DRIVER FRAMEWORK
  M:    Rob Springer <rspringer@google.com>
  M:    Todd Poynor <toddpoynor@google.com>
  M:    Ben Chan <benchan@chromium.org>
 +M:    Richard Yeh <rcy@google.com>
  S:    Maintained
  F:    drivers/staging/gasket/
  
@@@ -7207,10 -7123,9 +7207,10 @@@ F:    include/uapi/asm-generic
  
  GENERIC PHY FRAMEWORK
  M:    Kishon Vijay Abraham I <kishon@ti.com>
 +M:    Vinod Koul <vkoul@kernel.org>
  L:    linux-kernel@vger.kernel.org
  S:    Supported
 -T:    git git://git.kernel.org/pub/scm/linux/kernel/git/kishon/linux-phy.git
 +T:    git git://git.kernel.org/pub/scm/linux/kernel/git/phy/linux-phy.git
  F:    Documentation/devicetree/bindings/phy/
  F:    drivers/phy/
  F:    include/linux/phy/
@@@ -7271,7 -7186,7 +7271,7 @@@ L:      cluster-devel@redhat.co
  S:    Supported
  W:    http://sources.redhat.com/cluster/
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/gfs2/linux-gfs2.git
 -F:    Documentation/filesystems/gfs2*.txt
 +F:    Documentation/filesystems/gfs2*
  F:    fs/gfs2/
  F:    include/uapi/linux/gfs2_ondisk.h
  
@@@ -7321,13 -7236,6 +7321,13 @@@ F:    Documentation/firmware-guide/acpi/gp
  F:    drivers/gpio/gpiolib-acpi.c
  F:    drivers/gpio/gpiolib-acpi.h
  
 +GPIO AGGREGATOR
 +M:    Geert Uytterhoeven <geert+renesas@glider.be>
 +L:    linux-gpio@vger.kernel.org
 +S:    Supported
 +F:    Documentation/admin-guide/gpio/gpio-aggregator.rst
 +F:    drivers/gpio/gpio-aggregator.c
 +
  GPIO IR Transmitter
  M:    Sean Young <sean@mess.org>
  L:    linux-media@vger.kernel.org
@@@ -7341,12 -7249,6 +7341,12 @@@ S:    Maintaine
  F:    drivers/gpio/gpio-mockup.c
  F:    tools/testing/selftests/gpio/
  
 +GPIO REGMAP
 +R:    Michael Walle <michael@walle.cc>
 +S:    Maintained
 +F:    drivers/gpio/gpio-regmap.c
 +F:    include/linux/gpio/regmap.h
 +
  GPIO SUBSYSTEM
  M:    Linus Walleij <linus.walleij@linaro.org>
  M:    Bartosz Golaszewski <bgolaszewski@baylibre.com>
@@@ -7560,7 -7462,7 +7560,7 @@@ L:      linux-media@vger.kernel.or
  L:    linux-rockchip@lists.infradead.org
  S:    Maintained
  F:    Documentation/devicetree/bindings/media/nxp,imx8mq-vpu.yaml
 -F:    Documentation/devicetree/bindings/media/rockchip-vpu.txt
 +F:    Documentation/devicetree/bindings/media/rockchip-vpu.yaml
  F:    drivers/staging/media/hantro/
  
  HARD DRIVE ACTIVE PROTECTION SYSTEM (HDAPS) DRIVER
@@@ -7601,7 -7503,7 +7601,7 @@@ L:      linux-remoteproc@vger.kernel.or
  S:    Maintained
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/andersson/remoteproc.git hwspinlock-next
  F:    Documentation/devicetree/bindings/hwlock/
 -F:    Documentation/hwspinlock.txt
 +F:    Documentation/locking/hwspinlock.rst
  F:    drivers/hwspinlock/
  F:    include/linux/hwspinlock.h
  
@@@ -7834,9 -7736,7 +7834,9 @@@ L:      linux-mm@kvack.or
  S:    Maintained
  F:    Documentation/vm/hmm.rst
  F:    include/linux/hmm*
 +F:    lib/test_hmm*
  F:    mm/hmm*
 +F:    tools/testing/selftests/vm/*hmm*
  
  HOST AP DRIVER
  M:    Jouni Malinen <j@w1.fi>
@@@ -7850,6 -7750,11 +7850,6 @@@ L:     platform-driver-x86@vger.kernel.or
  S:    Orphan
  F:    drivers/platform/x86/tc1100-wmi.c
  
 -HP100:        Driver for HP 10/100 Mbit/s Voice Grade Network Adapter Series
 -M:    Jaroslav Kysela <perex@perex.cz>
 -S:    Obsolete
 -F:    drivers/staging/hp/hp100.*
 -
  HPET: High Precision Event Timers driver
  M:    Clemens Ladisch <clemens@ladisch.de>
  S:    Maintained
@@@ -7910,10 -7815,10 +7910,10 @@@ F:   Documentation/devicetree/bindings/ii
  F:    drivers/iio/humidity/hts221*
  
  HUAWEI ETHERNET DRIVER
 -M:    Aviad Krawczyk <aviad.krawczyk@huawei.com>
 +M:    Bin Luo <luobin9@huawei.com>
  L:    netdev@vger.kernel.org
  S:    Supported
 -F:    Documentation/networking/hinic.txt
 +F:    Documentation/networking/hinic.rst
  F:    drivers/net/ethernet/huawei/hinic/
  
  HUGETLB FILESYSTEM
@@@ -7936,7 -7841,7 +7936,7 @@@ T:      git git://linuxtv.org/media_tree.gi
  F:    drivers/media/platform/sti/hva
  
  HWPOISON MEMORY FAILURE HANDLING
 -M:    Naoya Horiguchi <n-horiguchi@ah.jp.nec.com>
 +M:    Naoya Horiguchi <naoya.horiguchi@nec.com>
  L:    linux-mm@kvack.org
  S:    Maintained
  F:    mm/hwpoison-inject.c
@@@ -7965,7 -7870,7 +7965,7 @@@ S:      Supporte
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/hyperv/linux.git
  F:    Documentation/ABI/stable/sysfs-bus-vmbus
  F:    Documentation/ABI/testing/debugfs-hyperv
 -F:    Documentation/networking/device_drivers/microsoft/netvsc.txt
 +F:    Documentation/networking/device_drivers/microsoft/netvsc.rst
  F:    arch/x86/hyperv
  F:    arch/x86/include/asm/hyperv-tlfs.h
  F:    arch/x86/include/asm/mshyperv.h
@@@ -7982,7 -7887,6 +7982,7 @@@ F:      drivers/pci/controller/pci-hyperv.
  F:    drivers/scsi/storvsc_drv.c
  F:    drivers/uio/uio_hv_generic.c
  F:    drivers/video/fbdev/hyperv_fb.c
 +F:    include/asm-generic/hyperv-tlfs.h
  F:    include/asm-generic/mshyperv.h
  F:    include/clocksource/hyperv_timer.h
  F:    include/linux/hyperv.h
@@@ -8049,7 -7953,7 +8049,7 @@@ F:      Documentation/i2c/busses/i2c-parport
  F:    drivers/i2c/busses/i2c-parport.c
  
  I2C SUBSYSTEM
 -M:    Wolfram Sang <wsa@the-dreams.de>
 +M:    Wolfram Sang <wsa@kernel.org>
  L:    linux-i2c@vger.kernel.org
  S:    Maintained
  W:    https://i2c.wiki.kernel.org/
@@@ -8522,7 -8426,6 +8522,7 @@@ F:      drivers/mtd/nand/raw/ingenic
  F:    drivers/pinctrl/pinctrl-ingenic.c
  F:    drivers/power/supply/ingenic-battery.c
  F:    drivers/pwm/pwm-jz4740.c
 +F:    drivers/remoteproc/ingenic_rproc.c
  F:    drivers/rtc/rtc-jz4740.c
  F:    drivers/tty/serial/8250/8250_ingenic.c
  F:    drivers/usb/musb/jz4740.c
@@@ -8600,13 -8503,6 +8600,13 @@@ L:    platform-driver-x86@vger.kernel.or
  S:    Maintained
  F:    drivers/platform/x86/intel_atomisp2_pm.c
  
 +INTEL BROXTON PMC DRIVER
 +M:    Mika Westerberg <mika.westerberg@linux.intel.com>
 +M:    Zha Qipeng <qipeng.zha@intel.com>
 +S:    Maintained
 +F:    drivers/mfd/intel_pmc_bxt.c
 +F:    include/linux/mfd/intel_pmc_bxt.h
 +
  INTEL C600 SERIES SAS CONTROLLER DRIVER
  M:    Intel SCU Linux support <intel-linux-scu@intel.com>
  M:    Artur Paszkiewicz <artur.paszkiewicz@intel.com>
@@@ -8736,7 -8632,8 +8736,7 @@@ M:      Lu Baolu <baolu.lu@linux.intel.com
  L:    iommu@lists.linux-foundation.org
  S:    Supported
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/joro/iommu.git
 -F:    drivers/iommu/dmar.c
 -F:    drivers/iommu/intel*.[ch]
 +F:    drivers/iommu/intel/
  F:    include/linux/intel-iommu.h
  F:    include/linux/intel-svm.h
  
@@@ -8752,18 -8649,16 +8752,18 @@@ M:   Bingbu Cao <bingbu.cao@intel.com
  R:    Tian Shu Qiu <tian.shu.qiu@intel.com>
  L:    linux-media@vger.kernel.org
  S:    Maintained
 -F:    Documentation/media/uapi/v4l/pixfmt-srggb10-ipu3.rst
 +F:    Documentation/userspace-api/media/v4l/pixfmt-srggb10-ipu3.rst
  F:    drivers/media/pci/intel/ipu3/
  
  INTEL IPU3 CSI-2 IMGU DRIVER
  M:    Sakari Ailus <sakari.ailus@linux.intel.com>
 +R:    Bingbu Cao <bingbu.cao@intel.com>
 +R:    Tian Shu Qiu <tian.shu.qiu@intel.com>
  L:    linux-media@vger.kernel.org
  S:    Maintained
 -F:    Documentation/media/uapi/v4l/pixfmt-meta-intel-ipu3.rst
 -F:    Documentation/media/v4l-drivers/ipu3.rst
 -F:    Documentation/media/v4l-drivers/ipu3_rcb.svg
 +F:    Documentation/admin-guide/media/ipu3.rst
 +F:    Documentation/admin-guide/media/ipu3_rcb.svg
 +F:    Documentation/userspace-api/media/v4l/pixfmt-meta-intel-ipu3.rst
  F:    drivers/staging/media/ipu3/
  
  INTEL IXP4XX QMGR, NPE, ETHERNET and HSS SUPPORT
@@@ -8815,13 -8710,6 +8815,13 @@@ F:    include/uapi/linux/mic_common.
  F:    include/uapi/linux/mic_ioctl.h
  F:    include/uapi/linux/scif_ioctl.h
  
 +INTEL P-Unit IPC DRIVER
 +M:    Zha Qipeng <qipeng.zha@intel.com>
 +L:    platform-driver-x86@vger.kernel.org
 +S:    Maintained
 +F:    arch/x86/include/asm/intel_punit_ipc.h
 +F:    drivers/platform/x86/intel_punit_ipc.c
 +
  INTEL PMC CORE DRIVER
  M:    Rajneesh Bhardwaj <rajneesh.bhardwaj@intel.com>
  M:    Vishwanath Somayaji <vishwanath.somayaji@intel.com>
@@@ -8829,6 -8717,15 +8829,6 @@@ L:     platform-driver-x86@vger.kernel.or
  S:    Maintained
  F:    drivers/platform/x86/intel_pmc_core*
  
 -INTEL PMC/P-Unit IPC DRIVER
 -M:    Zha Qipeng<qipeng.zha@intel.com>
 -L:    platform-driver-x86@vger.kernel.org
 -S:    Maintained
 -F:    arch/x86/include/asm/intel_pmc_ipc.h
 -F:    arch/x86/include/asm/intel_punit_ipc.h
 -F:    drivers/platform/x86/intel_pmc_ipc.c
 -F:    drivers/platform/x86/intel_punit_ipc.c
 -
  INTEL PMIC GPIO DRIVERS
  M:    Andy Shevchenko <andy@kernel.org>
  S:    Maintained
@@@ -8848,8 -8745,8 +8848,8 @@@ INTEL PRO/WIRELESS 2100, 2200BG, 2915AB
  M:    Stanislav Yakovlev <stas.yakovlev@gmail.com>
  L:    linux-wireless@vger.kernel.org
  S:    Maintained
 -F:    Documentation/networking/device_drivers/intel/ipw2100.txt
 -F:    Documentation/networking/device_drivers/intel/ipw2200.txt
 +F:    Documentation/networking/device_drivers/intel/ipw2100.rst
 +F:    Documentation/networking/device_drivers/intel/ipw2200.rst
  F:    drivers/net/wireless/intel/ipw2x00/
  
  INTEL PSTATE DRIVER
@@@ -8867,12 -8764,6 +8867,12 @@@ S:    Supporte
  F:    drivers/infiniband/hw/i40iw/
  F:    include/uapi/rdma/i40iw-abi.h
  
 +INTEL SCU DRIVERS
 +M:    Mika Westerberg <mika.westerberg@linux.intel.com>
 +S:    Maintained
 +F:    arch/x86/include/asm/intel_scu_ipc.h
 +F:    drivers/platform/x86/intel_scu_*
 +
  INTEL SPEED SELECT TECHNOLOGY
  M:    Srinivas Pandruvada <srinivas.pandruvada@linux.intel.com>
  L:    platform-driver-x86@vger.kernel.org
@@@ -8939,13 -8830,6 +8939,13 @@@ F:    Documentation/admin-guide/wimax/i240
  F:    drivers/net/wimax/i2400m/
  F:    include/uapi/linux/wimax/i2400m.h
  
 +INTEL WMI SLIM BOOTLOADER (SBL) FIRMWARE UPDATE DRIVER
 +M:    Jithu Joseph <jithu.joseph@intel.com>
 +R:    Maurice Ma <maurice.ma@intel.com>
 +S:    Maintained
 +W:    https://slimbootloader.github.io/security/firmware-update.html
 +F:    drivers/platform/x86/intel-wmi-sbl-fw-update.c
 +
  INTEL WMI THUNDERBOLT FORCE POWER DRIVER
  M:    Mario Limonciello <mario.limonciello@dell.com>
  S:    Maintained
@@@ -9031,7 -8915,7 +9031,7 @@@ M:      Corey Minyard <minyard@acm.org
  L:    openipmi-developer@lists.sourceforge.net (moderated for non-subscribers)
  S:    Supported
  W:    http://openipmi.sourceforge.net/
 -F:    Documentation/IPMI.txt
 +F:    Documentation/driver-api/ipmi.rst
  F:    Documentation/devicetree/bindings/ipmi/
  F:    drivers/char/ipmi/
  F:    include/linux/ipmi*
@@@ -9053,7 -8937,7 +9053,7 @@@ L:      lvs-devel@vger.kernel.or
  S:    Maintained
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/horms/ipvs-next.git
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/horms/ipvs.git
 -F:    Documentation/networking/ipvs-sysctl.txt
 +F:    Documentation/networking/ipvs-sysctl.rst
  F:    include/net/ip_vs.h
  F:    include/uapi/linux/ip_vs.h
  F:    net/netfilter/ipvs/
@@@ -9073,7 -8957,7 +9073,7 @@@ IRQ DOMAINS (IRQ NUMBER MAPPING LIBRARY
  M:    Marc Zyngier <maz@kernel.org>
  S:    Maintained
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git irq/core
 -F:    Documentation/IRQ-domain.txt
 +F:    Documentation/core-api/irq/irq-domain.rst
  F:    include/linux/irqdomain.h
  F:    kernel/irq/irqdomain.c
  F:    kernel/irq/msi.c
@@@ -9198,7 -9082,7 +9198,7 @@@ L:      linux-media@vger.kernel.or
  S:    Maintained
  W:    https://linuxtv.org
  T:    git git://linuxtv.org/media_tree.git
 -F:    Documentation/media/v4l-drivers/ivtv*
 +F:    Documentation/admin-guide/media/ivtv*
  F:    drivers/media/pci/ivtv/
  F:    include/uapi/linux/ivtv*
  
@@@ -9305,17 -9189,6 +9305,17 @@@ F:    Documentation/kbuild/kconfig
  F:    scripts/Kconfig.include
  F:    scripts/kconfig/
  
 +KCSAN
 +M:    Marco Elver <elver@google.com>
 +R:    Dmitry Vyukov <dvyukov@google.com>
 +L:    kasan-dev@googlegroups.com
 +S:    Maintained
 +F:    Documentation/dev-tools/kcsan.rst
 +F:    include/linux/kcsan*.h
 +F:    kernel/kcsan/
 +F:    lib/Kconfig.kcsan
 +F:    scripts/Makefile.kcsan
 +
  KDUMP
  M:    Dave Young <dyoung@redhat.com>
  M:    Baoquan He <bhe@redhat.com>
@@@ -9324,11 -9197,6 +9324,11 @@@ L:    kexec@lists.infradead.or
  S:    Maintained
  W:    http://lse.sourceforge.net/kdump/
  F:    Documentation/admin-guide/kdump/
 +F:    fs/proc/vmcore.c
 +F:    include/linux/crash_core.h
 +F:    include/linux/crash_dump.h
 +F:    include/uapi/linux/vmcore.h
 +F:    kernel/crash_*.c
  
  KEENE FM RADIO TRANSMITTER DRIVER
  M:    Hans Verkuil <hverkuil@xs4all.nl>
@@@ -9439,6 -9307,7 +9439,6 @@@ F:      arch/arm64/include/asm/kvm
  F:    arch/arm64/include/uapi/asm/kvm*
  F:    arch/arm64/kvm/
  F:    include/kvm/arm_*
 -F:    virt/kvm/arm/
  
  KERNEL VIRTUAL MACHINE FOR MIPS (KVM/mips)
  L:    linux-mips@vger.kernel.org
@@@ -9464,7 -9333,6 +9464,7 @@@ M:      Christian Borntraeger <borntraeger@d
  M:    Janosch Frank <frankja@linux.ibm.com>
  R:    David Hildenbrand <david@redhat.com>
  R:    Cornelia Huck <cohuck@redhat.com>
 +R:    Claudio Imbrenda <imbrenda@linux.ibm.com>
  L:    kvm@vger.kernel.org
  S:    Supported
  W:    http://www.ibm.com/developerworks/linux/linux390/
@@@ -9552,13 -9420,6 +9552,13 @@@ F:    include/linux/keyctl.
  F:    include/uapi/linux/keyctl.h
  F:    security/keys/
  
 +KFIFO
 +M:    Stefani Seibold <stefani@seibold.net>
 +S:    Maintained
 +F:    include/linux/kfifo.h
 +F:    lib/kfifo.c
 +F:    samples/kfifo/
 +
  KGDB / KDB /debug_core
  M:    Jason Wessel <jason.wessel@windriver.com>
  M:    Daniel Thompson <daniel.thompson@linaro.org>
@@@ -9649,7 -9510,7 +9649,7 @@@ F:      drivers/soc/lanti
  LAPB module
  L:    linux-x25@vger.kernel.org
  S:    Orphan
 -F:    Documentation/networking/lapb-module.txt
 +F:    Documentation/networking/lapb-module.rst
  F:    include/*/lapb.h
  F:    net/lapb/
  
@@@ -9863,13 -9724,6 +9863,13 @@@ F:    drivers/lightnvm
  F:    include/linux/lightnvm.h
  F:    include/uapi/linux/lightnvm.h
  
 +LINEAR RANGES HELPERS
 +M:    Mark Brown <broonie@kernel.org>
 +R:    Matti Vaittinen <matti.vaittinen@fi.rohmeurope.com>
 +F:    lib/linear_ranges.c
 +F:    lib/test_linear_ranges.c
 +F:    include/linux/linear_range.h
 +
  LINUX FOR POWER MACINTOSH
  M:    Benjamin Herrenschmidt <benh@kernel.crashing.org>
  L:    linuxppc-dev@lists.ozlabs.org
@@@ -9936,7 -9790,7 +9936,7 @@@ F:      arch/powerpc/platforms/83xx
  F:    arch/powerpc/platforms/85xx/
  
  LINUX FOR POWERPC EMBEDDED PPC8XX
 -M:    Christophe Leroy <christophe.leroy@c-s.fr>
 +M:    Christophe Leroy <christophe.leroy@csgroup.eu>
  L:    linuxppc-dev@lists.ozlabs.org
  S:    Maintained
  F:    arch/powerpc/platforms/8xx/
@@@ -9996,12 -9850,10 +9996,12 @@@ S:   Maintaine
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/livepatching/livepatching.git
  F:    Documentation/ABI/testing/sysfs-kernel-livepatch
  F:    Documentation/livepatch/
 +F:    arch/powerpc/include/asm/livepatch.h
 +F:    arch/s390/include/asm/livepatch.h
  F:    arch/x86/include/asm/livepatch.h
 -F:    arch/x86/kernel/livepatch.c
  F:    include/linux/livepatch.h
  F:    kernel/livepatch/
 +F:    lib/livepatch/
  F:    samples/livepatch/
  F:    tools/testing/selftests/livepatch/
  
@@@ -10100,7 -9952,7 +10100,7 @@@ F:    drivers/hid/hid-lg-g15.
  
  LSILOGIC MPT FUSION DRIVERS (FC/SAS/SPI)
  M:    Sathya Prakash <sathya.prakash@broadcom.com>
 -M:    Chaitra P B <chaitra.basappa@broadcom.com>
 +M:    Sreekanth Reddy <sreekanth.reddy@broadcom.com>
  M:    Suganath Prabu Subramani <suganath-prabu.subramani@broadcom.com>
  L:    MPT-FusionLinux.pdl@broadcom.com
  L:    linux-scsi@vger.kernel.org
@@@ -10219,10 -10071,10 +10219,10 @@@ MAC8021
  M:    Johannes Berg <johannes@sipsolutions.net>
  L:    linux-wireless@vger.kernel.org
  S:    Maintained
 -W:    http://wireless.kernel.org/
 +W:    https://wireless.wiki.kernel.org/
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/jberg/mac80211.git
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/jberg/mac80211-next.git
 -F:    Documentation/networking/mac80211-injection.txt
 +F:    Documentation/networking/mac80211-injection.rst
  F:    Documentation/networking/mac80211_hwsim/mac80211_hwsim.rst
  F:    drivers/net/wireless/mac80211_hwsim.[ch]
  F:    include/net/mac80211.h
@@@ -10403,7 -10255,7 +10403,7 @@@ L:   linux-media@vger.kernel.or
  S:    Maintained
  T:    git git://linuxtv.org/media_tree.git
  F:    Documentation/devicetree/bindings/media/i2c/max2175.txt
 -F:    Documentation/media/v4l-drivers/max2175.rst
 +F:    Documentation/userspace-api/media/drivers/max2175.rst
  F:    drivers/media/i2c/max2175*
  F:    include/uapi/linux/max2175.h
  
@@@ -10603,8 -10455,8 +10603,8 @@@ M:   Philipp Zabel <p.zabel@pengutronix.d
  L:    linux-media@vger.kernel.org
  S:    Maintained
  T:    git git://linuxtv.org/media_tree.git
 +F:    Documentation/admin-guide/media/imx.rst
  F:    Documentation/devicetree/bindings/media/imx.txt
 -F:    Documentation/media/v4l-drivers/imx.rst
  F:    drivers/staging/media/imx/
  F:    include/linux/imx-media.h
  F:    include/media/imx.h
@@@ -10614,9 -10466,9 +10614,9 @@@ M:   Rui Miguel Silva <rmfrfs@gmail.com
  L:    linux-media@vger.kernel.org
  S:    Maintained
  T:    git git://linuxtv.org/media_tree.git
 +F:    Documentation/admin-guide/media/imx7.rst
  F:    Documentation/devicetree/bindings/media/imx7-csi.txt
  F:    Documentation/devicetree/bindings/media/imx7-mipi-csi2.txt
 -F:    Documentation/media/v4l-drivers/imx7.rst
  F:    drivers/staging/media/imx/imx7-media-csi.c
  F:    drivers/staging/media/imx/imx7-mipi-csis.c
  
@@@ -10762,10 -10614,8 +10762,10 @@@ S: Maintaine
  W:    https://linuxtv.org
  Q:    http://patchwork.kernel.org/project/linux-media/list/
  T:    git git://linuxtv.org/media_tree.git
 +F:    Documentation/admin-guide/media/
  F:    Documentation/devicetree/bindings/media/
 -F:    Documentation/media/
 +F:    Documentation/driver-api/media/
 +F:    Documentation/userspace-api/media/
  F:    drivers/media/
  F:    drivers/staging/media/
  F:    include/linux/platform_data/media/
@@@ -10816,13 -10666,6 +10816,13 @@@ L: netdev@vger.kernel.or
  S:    Maintained
  F:    drivers/net/ethernet/mediatek/
  
 +MEDIATEK I2C CONTROLLER DRIVER
 +M:    Qii Wang <qii.wang@mediatek.com>
 +L:    linux-i2c@vger.kernel.org
 +S:    Maintained
 +F:    Documentation/devicetree/bindings/i2c/i2c-mt65xx.txt
 +F:    drivers/i2c/busses/i2c-mt65xx.c
 +
  MEDIATEK JPEG DRIVER
  M:    Rick Chang <rick.chang@mediatek.com>
  M:    Bin Liu <bin.liu@mediatek.com>
@@@ -10858,6 -10701,7 +10858,6 @@@ MEDIATEK MT76 WIRELESS LAN DRIVE
  M:    Felix Fietkau <nbd@nbd.name>
  M:    Lorenzo Bianconi <lorenzo.bianconi83@gmail.com>
  R:    Ryder Lee <ryder.lee@mediatek.com>
 -R:    Roy Luo <royluo@google.com>
  L:    linux-wireless@vger.kernel.org
  S:    Maintained
  F:    drivers/net/wireless/mediatek/mt76/
@@@ -10876,8 -10720,9 +10876,8 @@@ F:   Documentation/devicetree/bindings/i2
  F:    drivers/i2c/busses/i2c-mt7621.c
  
  MEDIATEK NAND CONTROLLER DRIVER
 -M:    Xiaolei Li <xiaolei.li@mediatek.com>
  L:    linux-mtd@lists.infradead.org
 -S:    Maintained
 +S:    Orphan
  F:    Documentation/devicetree/bindings/mtd/mtk-nand.txt
  F:    drivers/mtd/nand/raw/mtk_*
  
@@@ -11164,12 -11009,10 +11164,12 @@@ F:        drivers/mtd/nand/raw/meson_
  
  MESON VIDEO DECODER DRIVER FOR AMLOGIC SOCS
  M:    Maxime Jourdan <mjourdan@baylibre.com>
 +M:    Neil Armstrong <narmstrong@baylibre.com>
  L:    linux-media@vger.kernel.org
  L:    linux-amlogic@lists.infradead.org
  S:    Supported
  T:    git git://linuxtv.org/media_tree.git
 +F:    Documentation/devicetree/bindings/media/amlogic,gx-vdec.yaml
  F:    drivers/staging/media/meson/vdec/
  
  METHODE UDPU SUPPORT
@@@ -11369,6 -11212,14 +11369,6 @@@ L:  dmaengine@vger.kernel.or
  S:    Supported
  F:    drivers/dma/at_xdmac.c
  
 -MICROSEMI ETHERNET SWITCH DRIVER
 -M:    Alexandre Belloni <alexandre.belloni@bootlin.com>
 -M:    Microchip Linux Driver Support <UNGLinuxDriver@microchip.com>
 -L:    netdev@vger.kernel.org
 -S:    Supported
 -F:    drivers/net/ethernet/mscc/
 -F:    include/soc/mscc/ocelot*
 -
  MICROSEMI MIPS SOCS
  M:    Alexandre Belloni <alexandre.belloni@bootlin.com>
  M:    Microchip Linux Driver Support <UNGLinuxDriver@microchip.com>
@@@ -11534,20 -11385,15 +11534,20 @@@ F:        kernel/module.
  MONOLITHIC POWER SYSTEM PMIC DRIVER
  M:    Saravanan Sekar <sravanhome@gmail.com>
  S:    Maintained
 +F:    Documentation/devicetree/bindings/mfd/mps,mp2629.yaml
  F:    Documentation/devicetree/bindings/regulator/mps,mp*.yaml
 +F:    drivers/iio/adc/mp2629_adc.c
 +F:    drivers/mfd/mp2629.c
 +F:    drivers/power/supply/mp2629_charger.c
  F:    drivers/regulator/mp5416.c
  F:    drivers/regulator/mpq7920.c
  F:    drivers/regulator/mpq7920.h
 +F:    include/linux/mfd/mp2629.h
  
  MOTION EYE VAIO PICTUREBOOK CAMERA DRIVER
  S:    Orphan
  W:    http://popies.net/meye/
 -F:    Documentation/media/v4l-drivers/meye*
 +F:    Documentation/userspace-api/media/drivers/meye*
  F:    drivers/media/pci/meye/
  F:    include/uapi/linux/meye.h
  
@@@ -11806,8 -11652,8 +11806,8 @@@ NETERION 10GbE DRIVERS (s2io/vxge
  M:    Jon Mason <jdmason@kudzu.us>
  L:    netdev@vger.kernel.org
  S:    Supported
 -F:    Documentation/networking/device_drivers/neterion/s2io.txt
 -F:    Documentation/networking/device_drivers/neterion/vxge.txt
 +F:    Documentation/networking/device_drivers/neterion/s2io.rst
 +F:    Documentation/networking/device_drivers/neterion/vxge.rst
  F:    drivers/net/ethernet/neterion/
  
  NETFILTER
@@@ -11869,9 -11715,8 +11869,9 @@@ F:   net/core/drop_monitor.
  
  NETWORKING DRIVERS
  M:    "David S. Miller" <davem@davemloft.net>
 +M:    Jakub Kicinski <kuba@kernel.org>
  L:    netdev@vger.kernel.org
 -S:    Odd Fixes
 +S:    Maintained
  W:    http://www.linuxfoundation.org/en/Net
  Q:    http://patchwork.ozlabs.org/project/netdev/list/
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net.git
@@@ -12327,18 -12172,6 +12327,18 @@@ M: Peter Zijlstra <peterz@infradead.org
  S:    Supported
  F:    tools/objtool/
  
 +OCELOT ETHERNET SWITCH DRIVER
 +M:    Microchip Linux Driver Support <UNGLinuxDriver@microchip.com>
 +M:    Vladimir Oltean <vladimir.oltean@nxp.com>
 +M:    Claudiu Manoil <claudiu.manoil@nxp.com>
 +M:    Alexandre Belloni <alexandre.belloni@bootlin.com>
 +L:    netdev@vger.kernel.org
 +S:    Supported
 +F:    drivers/net/dsa/ocelot/*
 +F:    drivers/net/ethernet/mscc/
 +F:    include/soc/mscc/ocelot*
 +F:    net/dsa/tag_ocelot.c
 +
  OCXL (Open Coherent Accelerator Processor Interface OpenCAPI) DRIVER
  M:    Frederic Barrat <fbarrat@linux.ibm.com>
  M:    Andrew Donnellan <ajd@linux.ibm.com>
@@@ -12586,15 -12419,6 +12586,15 @@@ S: Maintaine
  T:    git git://linuxtv.org/media_tree.git
  F:    drivers/media/i2c/ov2685.c
  
 +OMNIVISION OV2740 SENSOR DRIVER
 +M:    Tianshu Qiu <tian.shu.qiua@intel.com>
 +R:    Shawn Tu <shawnx.tu@intel.com>
 +R:    Bingbu Cao <bingbu.cao@intel.com>
 +L:    linux-media@vger.kernel.org
 +S:    Maintained
 +T:    git git://linuxtv.org/media_tree.git
 +F:    drivers/media/i2c/ov2740.c
 +
  OMNIVISION OV5640 SENSOR DRIVER
  M:    Steve Longerbeam <slongerbeam@gmail.com>
  L:    linux-media@vger.kernel.org
@@@ -12657,11 -12481,10 +12657,11 @@@ F:        Documentation/devicetree/bindings/me
  F:    drivers/media/i2c/ov7740.c
  
  OMNIVISION OV8856 SENSOR DRIVER
 -M:    Ben Kao <ben.kao@intel.com>
 +M:    Dongchun Zhu <dongchun.zhu@mediatek.com>
  L:    linux-media@vger.kernel.org
  S:    Maintained
  T:    git git://linuxtv.org/media_tree.git
 +F:    Documentation/devicetree/bindings/media/i2c/ov8856.yaml
  F:    drivers/media/i2c/ov8856.c
  
  OMNIVISION OV9640 SENSOR DRIVER
@@@ -12717,8 -12540,8 +12717,8 @@@ M:   Pantelis Antoniou <pantelis.antoniou
  M:    Frank Rowand <frowand.list@gmail.com>
  L:    devicetree@vger.kernel.org
  S:    Maintained
 -F:    Documentation/devicetree/dynamic-resolution-notes.txt
 -F:    Documentation/devicetree/overlay-notes.txt
 +F:    Documentation/devicetree/dynamic-resolution-notes.rst
 +F:    Documentation/devicetree/overlay-notes.rst
  F:    drivers/of/overlay.c
  F:    drivers/of/resolver.c
  K:    of_overlay_notifier_
@@@ -12829,7 -12652,7 +12829,7 @@@ F:   fs/orangefs
  ORINOCO DRIVER
  L:    linux-wireless@vger.kernel.org
  S:    Orphan
 -W:    http://wireless.kernel.org/en/users/Drivers/orinoco
 +W:    https://wireless.wiki.kernel.org/en/users/Drivers/orinoco
  W:    http://www.nongnu.org/orinoco/
  F:    drivers/net/wireless/intersil/orinoco/
  
@@@ -12855,7 -12678,7 +12855,7 @@@ P54 WIRELESS DRIVE
  M:    Christian Lamparter <chunkeey@googlemail.com>
  L:    linux-wireless@vger.kernel.org
  S:    Maintained
 -W:    http://wireless.kernel.org/en/users/Drivers/p54
 +W:    https://wireless.wiki.kernel.org/en/users/Drivers/p54
  F:    drivers/net/wireless/intersil/p54/
  
  PACKING
@@@ -12915,7 -12738,7 +12915,7 @@@ F:   include/uapi/linux/ppdev.
  
  PARAVIRT_OPS INTERFACE
  M:    Juergen Gross <jgross@suse.com>
 -M:    Thomas Hellstrom <thellstrom@vmware.com>
 +M:    Deep Shah <sdeep@vmware.com>
  M:    "VMware, Inc." <pv-drivers@vmware.com>
  L:    virtualization@lists.linux-foundation.org
  S:    Supported
@@@ -12936,7 -12759,7 +12936,7 @@@ M:   "James E.J. Bottomley" <James.Bottom
  M:    Helge Deller <deller@gmx.de>
  L:    linux-parisc@vger.kernel.org
  S:    Maintained
 -W:    http://www.parisc-linux.org/
 +W:    https://parisc.wiki.kernel.org
  Q:    http://patchwork.kernel.org/project/linux-parisc/list/
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/jejb/parisc-2.6.git
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/deller/parisc-linux.git
@@@ -13126,7 -12949,7 +13126,7 @@@ L:   linux-pci@vger.kernel.or
  L:    linux-arm-kernel@lists.infradead.org
  S:    Maintained
  F:    Documentation/devicetree/bindings/pci/layerscape-pcie-gen4.txt
 -F:    drivers/pci/controller/mobibeil/pcie-layerscape-gen4.c
 +F:    drivers/pci/controller/mobiveil/pcie-layerscape-gen4.c
  
  PCI DRIVER FOR RENESAS R-CAR
  M:    Marek Vasut <marek.vasut+renesas@gmail.com>
@@@ -13134,7 -12957,6 +13134,7 @@@ M:   Yoshihiro Shimoda <yoshihiro.shimoda
  L:    linux-pci@vger.kernel.org
  L:    linux-renesas-soc@vger.kernel.org
  S:    Maintained
 +F:    Documentation/devicetree/bindings/pci/*rcar*
  F:    drivers/pci/controller/*rcar*
  
  PCI DRIVER FOR SAMSUNG EXYNOS
@@@ -13224,7 -13046,7 +13224,7 @@@ F:   drivers/pci/controller/pci-xgene-msi
  
  PCI NATIVE HOST BRIDGE AND ENDPOINT DRIVERS
  M:    Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
 -R:    Andrew Murray <amurray@thegoodpenguin.co.uk>
 +R:    Rob Herring <robh@kernel.org>
  L:    linux-pci@vger.kernel.org
  S:    Supported
  Q:    http://patchwork.ozlabs.org/project/linux-pci/list/
@@@ -13328,8 -13150,8 +13328,8 @@@ PCIE DRIVER FOR SOCIONEXT UNIPHIE
  M:    Kunihiko Hayashi <hayashi.kunihiko@socionext.com>
  L:    linux-pci@vger.kernel.org
  S:    Maintained
 -F:    Documentation/devicetree/bindings/pci/uniphier-pcie.txt
 -F:    drivers/pci/controller/dwc/pcie-uniphier.c
 +F:    Documentation/devicetree/bindings/pci/uniphier-pcie*
 +F:    drivers/pci/controller/dwc/pcie-uniphier*
  
  PCIE DRIVER FOR ST SPEAR13XX
  M:    Pratyush Anand <pratyush.anand@gmail.com>
@@@ -13436,7 -13258,7 +13436,7 @@@ F:   drivers/input/joystick/pxrc.
  PHONET PROTOCOL
  M:    Remi Denis-Courmont <courmisch@gmail.com>
  S:    Supported
 -F:    Documentation/networking/phonet.txt
 +F:    Documentation/networking/phonet.rst
  F:    include/linux/phonet.h
  F:    include/net/phonet/
  F:    include/uapi/linux/phonet.h
@@@ -13530,9 -13352,8 +13530,9 @@@ F:   drivers/pinctrl/qcom
  PIN CONTROLLER - RENESAS
  M:    Geert Uytterhoeven <geert+renesas@glider.be>
  L:    linux-renesas-soc@vger.kernel.org
 -S:    Maintained
 +S:    Supported
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/geert/renesas-drivers.git sh-pfc
 +F:    Documentation/devicetree/bindings/pinctrl/renesas,*
  F:    drivers/pinctrl/pinctrl-rz*
  F:    drivers/pinctrl/sh-pfc/
  
@@@ -13778,7 -13599,7 +13778,7 @@@ PRISM54 WIRELESS DRIVE
  M:    Luis Chamberlain <mcgrof@kernel.org>
  L:    linux-wireless@vger.kernel.org
  S:    Obsolete
 -W:    http://wireless.kernel.org/en/users/Drivers/p54
 +W:    https://wireless.wiki.kernel.org/en/users/Drivers/p54
  F:    drivers/net/wireless/intersil/prism54/
  
  PROC FILESYSTEM
@@@ -13847,7 -13668,6 +13847,7 @@@ M:   Tony Luck <tony.luck@intel.com
  S:    Maintained
  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
  F:    Documentation/devicetree/bindings/reserved-memory/ramoops.txt
  F:    drivers/acpi/apei/erst.c
  F:    drivers/firmware/efi/efi-pstore.c
@@@ -13885,8 -13705,8 +13885,8 @@@ M:   Hans Verkuil <hverkuil@xs4all.nl
  L:    linux-media@vger.kernel.org
  S:    Maintained
  T:    git git://linuxtv.org/media_tree.git
 -F:    Documentation/media/cec-drivers/pulse8-cec.rst
 -F:    drivers/media/usb/pulse8-cec/*
 +F:    Documentation/admin-guide/media/pulse8-cec.rst
 +F:    drivers/media/cec/usb/pulse8/
  
  PVRUSB2 VIDEO4LINUX DRIVER
  M:    Mike Isely <isely@pobox.com>
@@@ -13895,7 -13715,7 +13895,7 @@@ L:   linux-media@vger.kernel.or
  S:    Maintained
  W:    http://www.isely.net/pvrusb2/
  T:    git git://linuxtv.org/media_tree.git
 -F:    Documentation/media/v4l-drivers/pvrusb2*
 +F:    Documentation/driver-api/media/drivers/pvrusb2*
  F:    drivers/media/usb/pvrusb2/
  
  PWC WEBCAM DRIVER
@@@ -13924,7 -13744,6 +13924,7 @@@ F:   drivers/media/rc/pwm-ir-tx.
  PWM SUBSYSTEM
  M:    Thierry Reding <thierry.reding@gmail.com>
  R:    Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
 +M:    Lee Jones <lee.jones@linaro.org>
  L:    linux-pwm@vger.kernel.org
  S:    Maintained
  Q:    https://patchwork.ozlabs.org/project/linux-pwm/list/
@@@ -14042,8 -13861,7 +14042,8 @@@ S:   Maintaine
  F:    drivers/scsi/qla1280.[ch]
  
  QLOGIC QLA2XXX FC-SCSI DRIVER
 -M:    hmadhani@marvell.com
 +M:    Nilesh Javali <njavali@marvell.com>
 +M:    GR-QLogic-Storage-Upstream@marvell.com
  L:    linux-scsi@vger.kernel.org
  S:    Supported
  F:    Documentation/scsi/LICENSE.qla2xxx
@@@ -14121,7 -13939,7 +14121,7 @@@ QUALCOMM ATHEROS ATH10K WIRELESS DRIVE
  M:    Kalle Valo <kvalo@codeaurora.org>
  L:    ath10k@lists.infradead.org
  S:    Supported
 -W:    http://wireless.kernel.org/en/users/Drivers/ath10k
 +W:    https://wireless.wiki.kernel.org/en/users/Drivers/ath10k
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/kvalo/ath.git
  F:    drivers/net/wireless/ath/ath10k/
  
@@@ -14136,15 -13954,15 +14136,15 @@@ QUALCOMM ATHEROS ATH9K WIRELESS DRIVE
  M:    QCA ath9k Development <ath9k-devel@qca.qualcomm.com>
  L:    linux-wireless@vger.kernel.org
  S:    Supported
 -W:    http://wireless.kernel.org/en/users/Drivers/ath9k
 +W:    https://wireless.wiki.kernel.org/en/users/Drivers/ath9k
  F:    drivers/net/wireless/ath/ath9k/
  
  QUALCOMM CAMERA SUBSYSTEM DRIVER
  M:    Todor Tomov <todor.too@gmail.com>
  L:    linux-media@vger.kernel.org
  S:    Maintained
 +F:    Documentation/admin-guide/media/qcom_camss.rst
  F:    Documentation/devicetree/bindings/media/qcom,camss.txt
 -F:    Documentation/media/v4l-drivers/qcom_camss.rst
  F:    drivers/media/platform/qcom/camss/
  
  QUALCOMM CORE POWER REDUCTION (CPR) AVS DRIVER
@@@ -14196,15 -14014,6 +14196,15 @@@ L: dmaengine@vger.kernel.or
  S:    Supported
  F:    drivers/dma/qcom/hidma*
  
 +QUALCOMM I2C CCI DRIVER
 +M:    Loic Poulain <loic.poulain@linaro.org>
 +M:    Robert Foss <robert.foss@linaro.org>
 +L:    linux-i2c@vger.kernel.org
 +L:    linux-arm-msm@vger.kernel.org
 +S:    Maintained
 +F:    Documentation/devicetree/bindings/i2c/i2c-qcom-cci.txt
 +F:    drivers/i2c/busses/i2c-qcom-cci.c
 +
  QUALCOMM IOMMU
  M:    Rob Clark <robdclark@gmail.com>
  L:    iommu@lists.linux-foundation.org
@@@ -14212,20 -14021,12 +14212,20 @@@ L:        linux-arm-msm@vger.kernel.or
  S:    Maintained
  F:    drivers/iommu/qcom_iommu.c
  
 +QUALCOMM IPCC MAILBOX DRIVER
 +M:    Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
 +L:    linux-arm-msm@vger.kernel.org
 +S:    Supported
 +F:    Documentation/devicetree/bindings/mailbox/qcom-ipcc.yaml
 +F:    drivers/mailbox/qcom-ipcc.c
 +F:    include/dt-bindings/mailbox/qcom-ipcc.h
 +
  QUALCOMM RMNET DRIVER
  M:    Subash Abhinov Kasiviswanathan <subashab@codeaurora.org>
  M:    Sean Tranchetti <stranche@codeaurora.org>
  L:    netdev@vger.kernel.org
  S:    Maintained
 -F:    Documentation/networking/device_drivers/qualcomm/rmnet.txt
 +F:    Documentation/networking/device_drivers/qualcomm/rmnet.rst
  F:    drivers/net/ethernet/qualcomm/rmnet/
  F:    include/linux/if_rmnet.h
  
@@@ -14250,13 -14051,14 +14250,13 @@@ QUALCOMM WCN36XX WIRELESS DRIVE
  M:    Kalle Valo <kvalo@codeaurora.org>
  L:    wcn36xx@lists.infradead.org
  S:    Supported
 -W:    http://wireless.kernel.org/en/users/Drivers/wcn36xx
 +W:    https://wireless.wiki.kernel.org/en/users/Drivers/wcn36xx
  T:    git git://github.com/KrasnikovEugene/wcn36xx.git
  F:    drivers/net/wireless/ath/wcn36xx/
  
  QUANTENNA QTNFMAC WIRELESS DRIVER
  M:    Igor Mitsyanko <imitsyanko@quantenna.com>
 -M:    Avinash Patil <avinashp@quantenna.com>
 -M:    Sergey Matyukevich <smatyukevich@quantenna.com>
 +R:    Sergey Matyukevich <geomatsi@gmail.com>
  L:    linux-wireless@vger.kernel.org
  S:    Maintained
  F:    drivers/net/wireless/quantenna
  RADEON and AMDGPU DRM DRIVERS
  M:    Alex Deucher <alexander.deucher@amd.com>
  M:    Christian König <christian.koenig@amd.com>
 -M:    David (ChunMing) Zhou <David1.Zhou@amd.com>
  L:    amd-gfx@lists.freedesktop.org
  S:    Supported
  T:    git git://people.freedesktop.org/~agd5f/linux
@@@ -14296,10 -14099,12 +14296,10 @@@ F:        drivers/media/radio/radio-tea5777.
  
  RADOS BLOCK DEVICE (RBD)
  M:    Ilya Dryomov <idryomov@gmail.com>
 -M:    Sage Weil <sage@redhat.com>
  R:    Dongsheng Yang <dongsheng.yang@easystack.cn>
  L:    ceph-devel@vger.kernel.org
  S:    Supported
  W:    http://ceph.com/
 -T:    git git://git.kernel.org/pub/scm/linux/kernel/git/sage/ceph-client.git
  T:    git git://github.com/ceph/ceph-client.git
  F:    Documentation/ABI/testing/sysfs-bus-rbd
  F:    drivers/block/rbd.c
@@@ -14316,7 -14121,7 +14316,7 @@@ M:   Hans Verkuil <hverkuil@xs4all.nl
  L:    linux-media@vger.kernel.org
  S:    Maintained
  T:    git git://linuxtv.org/media_tree.git
 -F:    drivers/media/usb/rainshadow-cec/*
 +F:    drivers/media/cec/usb/rainshadow/
  
  RALINK MIPS ARCHITECTURE
  M:    John Crispin <john@phrozen.org>
@@@ -14410,7 -14215,7 +14410,7 @@@ L:   linux-rdma@vger.kernel.or
  L:    rds-devel@oss.oracle.com (moderated for non-subscribers)
  S:    Supported
  W:    https://oss.oracle.com/projects/rds/
 -F:    Documentation/networking/rds.txt
 +F:    Documentation/networking/rds.rst
  F:    net/rds/
  
  RDT - RESOURCE ALLOCATION
@@@ -14419,7 -14224,7 +14419,7 @@@ M:   Reinette Chatre <reinette.chatre@int
  L:    linux-kernel@vger.kernel.org
  S:    Supported
  F:    Documentation/x86/resctrl*
 -F:    arch/x86/include/asm/resctrl_sched.h
 +F:    arch/x86/include/asm/resctrl.h
  F:    arch/x86/kernel/cpu/resctrl/
  F:    tools/testing/selftests/resctrl/
  
@@@ -14474,7 -14279,7 +14474,7 @@@ REALTEK WIRELESS DRIVER (rtlwifi family
  M:    Ping-Ke Shih <pkshih@realtek.com>
  L:    linux-wireless@vger.kernel.org
  S:    Maintained
 -W:    http://wireless.kernel.org/
 +W:    https://wireless.wiki.kernel.org/
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless-testing.git
  F:    drivers/net/wireless/realtek/rtlwifi/
  
@@@ -14537,7 -14342,6 +14537,7 @@@ M:   Geert Uytterhoeven <geert+renesas@gl
  L:    linux-renesas-soc@vger.kernel.org
  S:    Supported
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/geert/renesas-drivers.git clk-renesas
 +F:    Documentation/devicetree/bindings/clock/renesas,*
  F:    drivers/clk/renesas/
  
  RENESAS EMEV2 I2C DRIVER
@@@ -14547,7 -14351,7 +14547,7 @@@ F:   Documentation/devicetree/bindings/i2
  F:    drivers/i2c/busses/i2c-emev2.c
  
  RENESAS ETHERNET DRIVERS
 -R:    Sergei Shtylyov <sergei.shtylyov@cogentembedded.com>
 +R:    Sergei Shtylyov <sergei.shtylyov@gmail.com>
  L:    netdev@vger.kernel.org
  L:    linux-renesas-soc@vger.kernel.org
  F:    Documentation/devicetree/bindings/net/renesas,*.txt
@@@ -14570,15 -14374,6 +14570,15 @@@ F: Documentation/devicetree/bindings/i2
  F:    drivers/i2c/busses/i2c-rcar.c
  F:    drivers/i2c/busses/i2c-sh_mobile.c
  
 +RENESAS R-CAR THERMAL DRIVERS
 +M:    Niklas Söderlund <niklas.soderlund@ragnatech.se>
 +L:    linux-renesas-soc@vger.kernel.org
 +S:    Supported
 +F:    Documentation/devicetree/bindings/thermal/rcar-gen3-thermal.txt
 +F:    Documentation/devicetree/bindings/thermal/rcar-thermal.txt
 +F:    drivers/thermal/rcar_gen3_thermal.c
 +F:    drivers/thermal/rcar_thermal.c
 +
  RENESAS RIIC DRIVER
  M:    Chris Brandt <chris.brandt@renesas.com>
  S:    Supported
@@@ -14619,7 -14414,7 +14619,7 @@@ RFKIL
  M:    Johannes Berg <johannes@sipsolutions.net>
  L:    linux-wireless@vger.kernel.org
  S:    Maintained
 -W:    http://wireless.kernel.org/
 +W:    https://wireless.wiki.kernel.org/
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/jberg/mac80211.git
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/jberg/mac80211-next.git
  F:    Documentation/ABI/stable/sysfs-class-rfkill
@@@ -14661,13 -14456,6 +14661,13 @@@ F: arch/riscv
  N:    riscv
  K:    riscv
  
 +RNBD BLOCK DRIVERS
 +M:    Danil Kipnis <danil.kipnis@cloud.ionos.com>
 +M:    Jack Wang <jinpu.wang@cloud.ionos.com>
 +L:    linux-block@vger.kernel.org
 +S:    Maintained
 +F:    drivers/block/rnbd/
 +
  ROCCAT DRIVERS
  M:    Stefan Achatz <erazor_de@users.sourceforge.net>
  S:    Maintained
@@@ -14686,19 -14474,10 +14686,19 @@@ ROCKCHIP RASTER 2D GRAPHIC ACCELERATIO
  M:    Jacob Chen <jacob-chen@iotwrt.com>
  M:    Ezequiel Garcia <ezequiel@collabora.com>
  L:    linux-media@vger.kernel.org
 +L:    linux-rockchip@lists.infradead.org
  S:    Maintained
 -F:    Documentation/devicetree/bindings/media/rockchip-rga.txt
 +F:    Documentation/devicetree/bindings/media/rockchip-rga.yaml
  F:    drivers/media/platform/rockchip/rga/
  
 +ROCKCHIP VIDEO DECODER DRIVER
 +M:    Ezequiel Garcia <ezequiel@collabora.com>
 +L:    linux-media@vger.kernel.org
 +L:    linux-rockchip@lists.infradead.org
 +S:    Maintained
 +F:    Documentation/devicetree/bindings/media/rockchip,vdec.yaml
 +F:    drivers/staging/media/rkvdec/
 +
  ROCKER DRIVER
  M:    Jiri Pirko <jiri@resnulli.us>
  L:    netdev@vger.kernel.org
@@@ -14784,7 -14563,7 +14784,7 @@@ F:   drivers/media/dvb-frontends/rtl2832_
  RTL8180 WIRELESS DRIVER
  L:    linux-wireless@vger.kernel.org
  S:    Orphan
 -W:    http://wireless.kernel.org/
 +W:    https://wireless.wiki.kernel.org/
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless-testing.git
  F:    drivers/net/wireless/realtek/rtl818x/rtl8180/
  
@@@ -14794,7 -14573,7 +14794,7 @@@ M:   Hin-Tak Leung <htl10@users.sourcefor
  M:    Larry Finger <Larry.Finger@lwfinger.net>
  L:    linux-wireless@vger.kernel.org
  S:    Maintained
 -W:    http://wireless.kernel.org/
 +W:    https://wireless.wiki.kernel.org/
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless-testing.git
  F:    drivers/net/wireless/realtek/rtl818x/rtl8187/
  
@@@ -14805,19 -14584,12 +14805,19 @@@ S:        Maintaine
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/jes/linux.git rtl8xxxu-devel
  F:    drivers/net/wireless/realtek/rtl8xxxu/
  
 +RTRS TRANSPORT DRIVERS
 +M:    Danil Kipnis <danil.kipnis@cloud.ionos.com>
 +M:    Jack Wang <jinpu.wang@cloud.ionos.com>
 +L:    linux-rdma@vger.kernel.org
 +S:    Maintained
 +F:    drivers/infiniband/ulp/rtrs/
 +
  RXRPC SOCKETS (AF_RXRPC)
  M:    David Howells <dhowells@redhat.com>
  L:    linux-afs@lists.infradead.org
  S:    Supported
  W:    https://www.infradead.org/~dhowells/kafs/
 -F:    Documentation/networking/rxrpc.txt
 +F:    Documentation/networking/rxrpc.rst
  F:    include/keys/rxrpc-type.h
  F:    include/net/af_rxrpc.h
  F:    include/trace/events/rxrpc.h
@@@ -14859,7 -14631,6 +14859,7 @@@ S:   Supporte
  W:    http://www.ibm.com/developerworks/linux/linux390/
  F:    block/partitions/ibm.c
  F:    drivers/s390/block/dasd*
 +F:    include/linux/dasd_mod.h
  
  S390 IOMMU (PCI)
  M:    Gerald Schaefer <gerald.schaefer@de.ibm.com>
@@@ -14870,7 -14641,6 +14870,7 @@@ F:   drivers/iommu/s390-iommu.
  
  S390 IUCV NETWORK LAYER
  M:    Julian Wiedmann <jwi@linux.ibm.com>
 +M:    Karsten Graul <kgraul@linux.ibm.com>
  M:    Ursula Braun <ubraun@linux.ibm.com>
  L:    linux-s390@vger.kernel.org
  S:    Supported
@@@ -14881,7 -14651,6 +14881,7 @@@ F:   net/iucv
  
  S390 NETWORK DRIVERS
  M:    Julian Wiedmann <jwi@linux.ibm.com>
 +M:    Karsten Graul <kgraul@linux.ibm.com>
  M:    Ursula Braun <ubraun@linux.ibm.com>
  L:    linux-s390@vger.kernel.org
  S:    Supported
@@@ -14896,7 -14665,6 +14896,7 @@@ S:   Supporte
  W:    http://www.ibm.com/developerworks/linux/linux390/
  F:    arch/s390/pci/
  F:    drivers/pci/hotplug/s390_pci_hpc.c
 +F:    Documentation/s390/pci.rst
  
  S390 VFIO AP DRIVER
  M:    Tony Krowiak <akrowiak@linux.ibm.com>
@@@ -14956,7 -14724,7 +14956,7 @@@ L:   linux-media@vger.kernel.or
  S:    Odd fixes
  W:    https://linuxtv.org
  T:    git git://linuxtv.org/media_tree.git
 -F:    Documentation/media/v4l-drivers/saa7134*
 +F:    Documentation/driver-api/media/drivers/saa7134*
  F:    drivers/media/pci/saa7134/
  
  SAA7146 VIDEO4LINUX-2 DRIVER
@@@ -15227,7 -14995,7 +15227,7 @@@ M:   Marcelo Ricardo Leitner <marcelo.lei
  L:    linux-sctp@vger.kernel.org
  S:    Maintained
  W:    http://lksctp.sourceforge.net
 -F:    Documentation/networking/sctp.txt
 +F:    Documentation/networking/sctp.rst
  F:    include/linux/sctp.h
  F:    include/net/sctp/
  F:    include/uapi/linux/sctp.h
@@@ -15454,6 -15222,11 +15454,6 @@@ T:  git git://linuxtv.org/media_tree.gi
  F:    drivers/media/i2c/rj54n1cb0c.c
  F:    include/media/i2c/rj54n1cb0c.h
  
 -SH_VEU V4L2 MEM2MEM DRIVER
 -L:    linux-media@vger.kernel.org
 -S:    Orphan
 -F:    drivers/media/platform/sh_veu.c
 -
  SH_VOU V4L2 OUTPUT DRIVER
  L:    linux-media@vger.kernel.org
  S:    Orphan
@@@ -15698,15 -15471,6 +15698,15 @@@ M: Nicolas Pitre <nico@fluxnic.net
  S:    Odd Fixes
  F:    drivers/net/ethernet/smsc/smc91x.*
  
 +SECURE MONITOR CALL(SMC) CALLING CONVENTION (SMCCC)
 +M:    Mark Rutland <mark.rutland@arm.com>
 +M:    Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
 +M:    Sudeep Holla <sudeep.holla@arm.com>
 +L:    linux-arm-kernel@lists.infradead.org
 +S:    Maintained
 +F:    drivers/firmware/smccc/
 +F:    include/linux/arm-smccc.h
 +
  SMIA AND SMIA++ IMAGE SENSOR DRIVER
  M:    Sakari Ailus <sakari.ailus@linux.intel.com>
  L:    linux-media@vger.kernel.org
@@@ -15775,7 -15539,7 +15775,7 @@@ SOCIONEXT (SNI) AVE NETWORK DRIVE
  M:    Kunihiko Hayashi <hayashi.kunihiko@socionext.com>
  L:    netdev@vger.kernel.org
  S:    Maintained
 -F:    Documentation/devicetree/bindings/net/socionext,uniphier-ave4.txt
 +F:    Documentation/devicetree/bindings/net/socionext,uniphier-ave4.yaml
  F:    drivers/net/ethernet/socionext/sni_ave.c
  
  SOCIONEXT (SNI) NETSEC NETWORK DRIVER
@@@ -15883,7 -15647,7 +15883,7 @@@ F:   drivers/ssb
  F:    include/linux/ssb/
  
  SONY IMX214 SENSOR DRIVER
 -M:    Ricardo Ribalda <ricardo.ribalda@gmail.com>
 +M:    Ricardo Ribalda <ribalda@kernel.org>
  L:    linux-media@vger.kernel.org
  S:    Maintained
  T:    git git://linuxtv.org/media_tree.git
@@@ -16106,7 -15870,7 +16106,7 @@@ SPIDERNET NETWORK DRIVER for CEL
  M:    Ishizaki Kou <kou.ishizaki@toshiba.co.jp>
  L:    netdev@vger.kernel.org
  S:    Supported
 -F:    Documentation/networking/device_drivers/toshiba/spider_net.txt
 +F:    Documentation/networking/device_drivers/toshiba/spider_net.rst
  F:    drivers/net/ethernet/toshiba/spider_net*
  
  SPMI SUBSYSTEM
@@@ -16123,7 -15887,7 +16123,7 @@@ M:   Jeremy Kerr <jk@ozlabs.org
  L:    linuxppc-dev@lists.ozlabs.org
  S:    Supported
  W:    http://www.ibm.com/developerworks/power/cell/
 -F:    Documentation/filesystems/spufs.txt
 +F:    Documentation/filesystems/spufs/spufs.rst
  F:    arch/powerpc/platforms/cell/spufs/
  
  SQUASHFS FILE SYSTEM
@@@ -16176,13 -15940,6 +16176,13 @@@ L: stable@vger.kernel.or
  S:    Supported
  F:    Documentation/process/stable-kernel-rules.rst
  
 +STAGING - ATOMISP DRIVER
 +M:    Mauro Carvalho Chehab <mchehab@kernel.org>
 +R:    Sakari Ailus <sakari.ailus@linux.intel.com>
 +L:    linux-media@vger.kernel.org
 +S:    Maintained
 +F:    drivers/staging/media/atomisp/
 +
  STAGING - COMEDI
  M:    Ian Abbott <abbotti@mev.co.uk>
  M:    H Hartley Sweeten <hsweeten@visionengravers.com>
@@@ -16478,10 -16235,9 +16478,10 @@@ F: drivers/tty/serial/8250/8250_lpss.
  
  SYNOPSYS DESIGNWARE APB GPIO DRIVER
  M:    Hoan Tran <hoan@os.amperecomputing.com>
 +M:    Serge Semin <fancer.lancer@gmail.com>
  L:    linux-gpio@vger.kernel.org
  S:    Maintained
 -F:    Documentation/devicetree/bindings/gpio/snps-dwapb-gpio.txt
 +F:    Documentation/devicetree/bindings/gpio/snps,dw-apb-gpio.yaml
  F:    drivers/gpio/gpio-dwapb.c
  
  SYNOPSYS DESIGNWARE AXI DMAC DRIVER
@@@ -16839,16 -16595,6 +16839,16 @@@ M: Laxman Dewangan <ldewangan@nvidia.co
  S:    Supported
  F:    drivers/spi/spi-tegra*
  
 +TEGRA VIDEO DRIVER
 +M:    Thierry Reding <thierry.reding@gmail.com>
 +M:    Jonathan Hunter <jonathanh@nvidia.com>
 +M:    Sowjanya Komatineni <skomatineni@nvidia.com>
 +L:    linux-media@vger.kernel.org
 +L:    linux-tegra@vger.kernel.org
 +S:    Maintained
 +F:    Documentation/devicetree/bindings/display/tegra/nvidia,tegra20-host1x.txt
 +F:    drivers/staging/media/tegra-video/
 +
  TEGRA XUSB PADCTL DRIVER
  M:    JC Kuo <jckuo@nvidia.com>
  S:    Supported
@@@ -16888,7 -16634,7 +16888,7 @@@ S:   Maintaine
  F:    sound/soc/ti/
  
  TEXAS INSTRUMENTS' DAC7612 DAC DRIVER
 -M:    Ricardo Ribalda <ricardo@ribalda.com>
 +M:    Ricardo Ribalda <ribalda@kernel.org>
  L:    linux-iio@vger.kernel.org
  S:    Supported
  F:    Documentation/devicetree/bindings/iio/dac/ti,dac7612.txt
@@@ -17182,8 -16928,8 +17182,8 @@@ F:   drivers/media/platform/ti-vpe
  TI WILINK WIRELESS DRIVERS
  L:    linux-wireless@vger.kernel.org
  S:    Orphan
 -W:    http://wireless.kernel.org/en/users/Drivers/wl12xx
 -W:    http://wireless.kernel.org/en/users/Drivers/wl1251
 +W:    https://wireless.wiki.kernel.org/en/users/Drivers/wl12xx
 +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
@@@ -17221,7 -16967,7 +17221,7 @@@ M:   Samuel Chessman <chessman@tux.org
  L:    tlan-devel@lists.sourceforge.net (subscribers-only)
  S:    Maintained
  W:    http://sourceforge.net/projects/tlan/
 -F:    Documentation/networking/device_drivers/ti/tlan.txt
 +F:    Documentation/networking/device_drivers/ti/tlan.rst
  F:    drivers/net/ethernet/ti/tlan.*
  
  TM6000 VIDEO4LINUX DRIVER
@@@ -17230,7 -16976,7 +17230,7 @@@ L:   linux-media@vger.kernel.or
  S:    Odd fixes
  W:    https://linuxtv.org
  T:    git git://linuxtv.org/media_tree.git
 -F:    Documentation/media/v4l-drivers/tm6000*
 +F:    Documentation/admin-guide/media/tm6000*
  F:    drivers/media/usb/tm6000/
  
  TMIO/SDHI MMC DRIVER
@@@ -17411,7 -17157,7 +17411,7 @@@ TUN/TAP drive
  M:    Maxim Krasnyansky <maxk@qti.qualcomm.com>
  S:    Maintained
  W:    http://vtun.sourceforge.net/tun
 -F:    Documentation/networking/tuntap.txt
 +F:    Documentation/networking/tuntap.rst
  F:    arch/um/os-Linux/drivers/
  
  TURBOCHANNEL SUBSYSTEM
@@@ -17841,13 -17587,6 +17841,13 @@@ F: Documentation/driver-api/usb/typec.r
  F:    drivers/usb/typec/
  F:    include/linux/usb/typec.h
  
 +USB TYPEC INTEL PMC MUX DRIVER
 +M:    Heikki Krogerus <heikki.krogerus@linux.intel.com>
 +L:    linux-usb@vger.kernel.org
 +S:    Maintained
 +F:    Documentation/firmware-guide/acpi/intel-pmc-mux.rst
 +F:    drivers/usb/typec/mux/intel_pmc_mux.c
 +
  USB TYPEC PI3USB30532 MUX DRIVER
  M:    Hans de Goede <hdegoede@redhat.com>
  L:    linux-usb@vger.kernel.org
@@@ -17918,7 -17657,7 +17918,7 @@@ L:   linux-media@vger.kernel.or
  S:    Maintained
  W:    http://royale.zerezo.com/zr364xx/
  T:    git git://linuxtv.org/media_tree.git
 -F:    Documentation/media/v4l-drivers/zr364xx*
 +F:    Documentation/admin-guide/media/zr364xx*
  F:    drivers/media/usb/zr364xx/
  
  USER-MODE LINUX (UML)
@@@ -18067,7 -17806,7 +18067,7 @@@ L:   linux-media@vger.kernel.or
  S:    Maintained
  W:    https://linuxtv.org
  T:    git git://linuxtv.org/media_tree.git
 -F:    drivers/media/platform/vicodec/*
 +F:    drivers/media/test-drivers/vicodec/*
  
  VIDEO I2C POLLING DRIVER
  M:    Matt Ranostay <matt.ranostay@konsulko.com>
@@@ -18098,7 -17837,7 +18098,7 @@@ L:   linux-media@vger.kernel.or
  S:    Maintained
  W:    https://linuxtv.org
  T:    git git://linuxtv.org/media_tree.git
 -F:    drivers/media/platform/vimc/*
 +F:    drivers/media/test-drivers/vimc/*
  
  VIRT LIB
  M:    Alex Williamson <alex.williamson@redhat.com>
@@@ -18162,18 -17901,9 +18162,18 @@@ F: drivers/virtio
  F:    include/linux/vdpa.h
  F:    include/linux/virtio*.h
  F:    include/uapi/linux/virtio_*.h
 -F:    mm/balloon_compaction.c
  F:    tools/virtio/
  
 +VIRTIO BALLOON
 +M:    "Michael S. Tsirkin" <mst@redhat.com>
 +M:    David Hildenbrand <david@redhat.com>
 +L:    virtualization@lists.linux-foundation.org
 +S:    Maintained
 +F:    drivers/virtio/virtio_balloon.c
 +F:    include/uapi/linux/virtio_balloon.h
 +F:    include/linux/balloon_compaction.h
 +F:    mm/balloon_compaction.c
 +
  VIRTIO CRYPTO DRIVER
  M:    Gonglei <arei.gonglei@huawei.com>
  L:    virtualization@lists.linux-foundation.org
@@@ -18239,13 -17969,6 +18239,13 @@@ S: Maintaine
  F:    drivers/iommu/virtio-iommu.c
  F:    include/uapi/linux/virtio_iommu.h
  
 +VIRTIO MEM DRIVER
 +M:    David Hildenbrand <david@redhat.com>
 +L:    virtualization@lists.linux-foundation.org
 +S:    Maintained
 +F:    drivers/virtio/virtio_mem.c
 +F:    include/uapi/linux/virtio_mem.h
 +
  VIRTUAL BOX GUEST DEVICE DRIVER
  M:    Hans de Goede <hdegoede@redhat.com>
  M:    Arnd Bergmann <arnd@arndb.de>
@@@ -18267,13 -17990,21 +18267,13 @@@ S:        Maintaine
  F:    drivers/input/serio/userio.c
  F:    include/uapi/linux/userio.h
  
 -VITESSE FELIX ETHERNET SWITCH DRIVER
 -M:    Vladimir Oltean <vladimir.oltean@nxp.com>
 -M:    Claudiu Manoil <claudiu.manoil@nxp.com>
 -L:    netdev@vger.kernel.org
 -S:    Maintained
 -F:    drivers/net/dsa/ocelot/*
 -F:    net/dsa/tag_ocelot.c
 -
  VIVID VIRTUAL VIDEO DRIVER
  M:    Hans Verkuil <hverkuil@xs4all.nl>
  L:    linux-media@vger.kernel.org
  S:    Maintained
  W:    https://linuxtv.org
  T:    git git://linuxtv.org/media_tree.git
 -F:    drivers/media/platform/vivid/*
 +F:    drivers/media/test-drivers/vivid/*
  
  VLYNQ BUS
  M:    Florian Fainelli <f.fainelli@gmail.com>
@@@ -18302,7 -18033,7 +18302,7 @@@ S:   Maintaine
  F:    drivers/misc/vmw_balloon.c
  
  VMWARE HYPERVISOR INTERFACE
 -M:    Thomas Hellstrom <thellstrom@vmware.com>
 +M:    Deep Shah <sdeep@vmware.com>
  M:    "VMware, Inc." <pv-drivers@vmware.com>
  L:    virtualization@lists.linux-foundation.org
  S:    Supported
@@@ -18371,7 -18102,7 +18371,7 @@@ M:   David Ahern <dsahern@kernel.org
  M:    Shrijeet Mukherjee <shrijeet@gmail.com>
  L:    netdev@vger.kernel.org
  S:    Maintained
 -F:    Documentation/networking/vrf.txt
 +F:    Documentation/networking/vrf.rst
  F:    drivers/net/vrf.c
  
  VSPRINTF
@@@ -18480,7 -18211,7 +18480,7 @@@ M:   Maya Erez <merez@codeaurora.org
  L:    linux-wireless@vger.kernel.org
  L:    wil6210@qti.qualcomm.com
  S:    Supported
 -W:    http://wireless.kernel.org/en/users/Drivers/wil6210
 +W:    https://wireless.wiki.kernel.org/en/users/Drivers/wil6210
  F:    drivers/net/wireless/ath/wil6210/
  
  WIMAX STACK
@@@ -18535,11 -18266,11 +18535,11 @@@ L:        patches@opensource.cirrus.co
  S:    Supported
  W:    https://github.com/CirrusLogic/linux-drivers/wiki
  T:    git https://github.com/CirrusLogic/linux-drivers.git
 -F:    Documentation/devicetree/bindings/extcon/extcon-arizona.txt
 -F:    Documentation/devicetree/bindings/mfd/arizona.txt
 +F:    Documentation/devicetree/bindings/extcon/wlf,arizona.yaml
 +F:    Documentation/devicetree/bindings/mfd/wlf,arizona.yaml
  F:    Documentation/devicetree/bindings/mfd/wm831x.txt
 -F:    Documentation/devicetree/bindings/regulator/arizona-regulator.txt
 -F:    Documentation/devicetree/bindings/sound/wlf,arizona.txt
 +F:    Documentation/devicetree/bindings/regulator/wlf,arizona.yaml
 +F:    Documentation/devicetree/bindings/sound/wlf,arizona.yaml
  F:    Documentation/hwmon/wm83??.rst
  F:    arch/arm/mach-s3c64xx/mach-crag6410*
  F:    drivers/clk/clk-wm83*.c
@@@ -18716,12 -18447,8 +18716,12 @@@ R: Jonathan Lemon <jonathan.lemon@gmail
  L:    netdev@vger.kernel.org
  L:    bpf@vger.kernel.org
  S:    Maintained
 -F:    kernel/bpf/xskmap.c
 +F:    include/net/xdp_sock*
 +F:    include/net/xsk_buff_pool.h
 +F:    include/uapi/linux/if_xdp.h
  F:    net/xdp/
 +F:    samples/bpf/xdpsock*
 +F:    tools/lib/bpf/xsk*
  
  XEN BLOCK SUBSYSTEM
  M:    Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
@@@ -18811,8 -18538,8 +18811,8 @@@ W:   http://xfs.org
  T:    git git://git.kernel.org/pub/scm/fs/xfs/xfs-linux.git
  F:    Documentation/ABI/testing/sysfs-fs-xfs
  F:    Documentation/admin-guide/xfs.rst
 -F:    Documentation/filesystems/xfs-delayed-logging-design.txt
 -F:    Documentation/filesystems/xfs-self-describing-metadata.txt
 +F:    Documentation/filesystems/xfs-delayed-logging-design.rst
 +F:    Documentation/filesystems/xfs-self-describing-metadata.rst
  F:    fs/xfs/
  F:    include/uapi/linux/dqblk_xfs.h
  F:    include/uapi/linux/fsmap.h
@@@ -18913,7 -18640,7 +18913,7 @@@ L:   linux-hams@vger.kernel.or
  S:    Maintained
  W:    http://yaina.de/jreuter/
  W:    http://www.qsl.net/dl1bke/
 -F:    Documentation/networking/z8530drv.txt
 +F:    Documentation/networking/z8530drv.rst
  F:    drivers/net/hamradio/*scc.c
  F:    drivers/net/hamradio/z8530.h
  
@@@ -362,13 -362,13 +362,13 @@@ static int vm_validate_pt_pd_bos(struc
        ret = amdgpu_vm_validate_pt_bos(adev, vm, amdgpu_amdkfd_validate,
                                        &param);
        if (ret) {
 -              pr_err("amdgpu: failed to validate PT BOs\n");
 +              pr_err("failed to validate PT BOs\n");
                return ret;
        }
  
        ret = amdgpu_amdkfd_validate(&param, pd);
        if (ret) {
 -              pr_err("amdgpu: failed to validate PD\n");
 +              pr_err("failed to validate PD\n");
                return ret;
        }
  
        if (vm->use_cpu_for_update) {
                ret = amdgpu_bo_kmap(pd, NULL);
                if (ret) {
 -                      pr_err("amdgpu: failed to kmap PD, ret=%d\n", ret);
 +                      pr_err("failed to kmap PD, ret=%d\n", ret);
                        return ret;
                }
        }
@@@ -660,15 -660,15 +660,15 @@@ static int reserve_bo_and_vm(struct kgd
  
        ret = ttm_eu_reserve_buffers(&ctx->ticket, &ctx->list,
                                     false, &ctx->duplicates);
 -      if (!ret)
 -              ctx->reserved = true;
 -      else {
 -              pr_err("Failed to reserve buffers in ttm\n");
 +      if (ret) {
 +              pr_err("Failed to reserve buffers in ttm.\n");
                kfree(ctx->vm_pd);
                ctx->vm_pd = NULL;
 +              return ret;
        }
  
 -      return ret;
 +      ctx->reserved = true;
 +      return 0;
  }
  
  /**
@@@ -733,15 -733,17 +733,15 @@@ static int reserve_bo_and_cond_vms(stru
  
        ret = ttm_eu_reserve_buffers(&ctx->ticket, &ctx->list,
                                     false, &ctx->duplicates);
 -      if (!ret)
 -              ctx->reserved = true;
 -      else
 -              pr_err("Failed to reserve buffers in ttm.\n");
 -
        if (ret) {
 +              pr_err("Failed to reserve buffers in ttm.\n");
                kfree(ctx->vm_pd);
                ctx->vm_pd = NULL;
 +              return ret;
        }
  
 -      return ret;
 +      ctx->reserved = true;
 +      return 0;
  }
  
  /**
  }
  
  int amdgpu_amdkfd_gpuvm_free_memory_of_gpu(
 -              struct kgd_dev *kgd, struct kgd_mem *mem)
 +              struct kgd_dev *kgd, struct kgd_mem *mem, uint64_t *size)
  {
        struct amdkfd_process_info *process_info = mem->process_info;
        unsigned long bo_size = mem->bo->tbo.mem.size;
        struct kfd_bo_va_list *entry, *tmp;
        struct bo_vm_reservation_context ctx;
        struct ttm_validate_buffer *bo_list_entry;
 +      unsigned int mapped_to_gpu_memory;
        int ret;
 +      bool is_imported = 0;
  
        mutex_lock(&mem->lock);
 -
 -      if (mem->mapped_to_gpu_memory > 0) {
 -              pr_debug("BO VA 0x%llx size 0x%lx is still mapped.\n",
 -                              mem->va, bo_size);
 -              mutex_unlock(&mem->lock);
 -              return -EBUSY;
 -      }
 -
 +      mapped_to_gpu_memory = mem->mapped_to_gpu_memory;
 +      is_imported = mem->is_imported;
        mutex_unlock(&mem->lock);
        /* lock is not needed after this, since mem is unused and will
         * be freed anyway
         */
  
 -      /* No more MMU notifiers */
 -      amdgpu_mn_unregister(mem->bo);
 +      if (mapped_to_gpu_memory > 0) {
 +              pr_debug("BO VA 0x%llx size 0x%lx is still mapped.\n",
 +                              mem->va, bo_size);
 +              return -EBUSY;
 +      }
  
        /* Make sure restore workers don't access the BO any more */
        bo_list_entry = &mem->validate_list;
        list_del(&bo_list_entry->head);
        mutex_unlock(&process_info->lock);
  
 +      /* No more MMU notifiers */
 +      amdgpu_mn_unregister(mem->bo);
 +
        ret = reserve_bo_and_cond_vms(mem, NULL, BO_VM_ALL, &ctx);
        if (unlikely(ret))
                return ret;
                kfree(mem->bo->tbo.sg);
        }
  
 +      /* Update the size of the BO being freed if it was allocated from
 +       * VRAM and is not imported.
 +       */
 +      if (size) {
 +              if ((mem->bo->preferred_domains == AMDGPU_GEM_DOMAIN_VRAM) &&
 +                  (!is_imported))
 +                      *size = bo_size;
 +              else
 +                      *size = 0;
 +      }
 +
        /* Free the BO*/
-       drm_gem_object_put_unlocked(&mem->bo->tbo.base);
 -      amdgpu_bo_unref(&mem->bo);
++      drm_gem_object_put(&mem->bo->tbo.base);
        mutex_destroy(&mem->lock);
        kfree(mem);
  
@@@ -1393,9 -1382,9 +1393,9 @@@ int amdgpu_amdkfd_gpuvm_map_memory_to_g
         * concurrently and the queues are actually stopped
         */
        if (amdgpu_ttm_tt_get_usermm(bo->tbo.ttm)) {
 -              down_write(&current->mm->mmap_sem);
 +              mmap_write_lock(current->mm);
                is_invalid_userptr = atomic_read(&mem->invalid);
 -              up_write(&current->mm->mmap_sem);
 +              mmap_write_unlock(current->mm);
        }
  
        mutex_lock(&mem->lock);
@@@ -1699,8 -1688,7 +1699,8 @@@ int amdgpu_amdkfd_gpuvm_import_dmabuf(s
                | KFD_IOC_ALLOC_MEM_FLAGS_WRITABLE
                | KFD_IOC_ALLOC_MEM_FLAGS_EXECUTABLE;
  
 -      (*mem)->bo = amdgpu_bo_ref(bo);
 +      drm_gem_object_get(&bo->tbo.base);
 +      (*mem)->bo = bo;
        (*mem)->va = va;
        (*mem)->domain = (bo->preferred_domains & AMDGPU_GEM_DOMAIN_VRAM) ?
                AMDGPU_GEM_DOMAIN_VRAM : AMDGPU_GEM_DOMAIN_GTT;
        (*mem)->process_info = avm->process_info;
        add_kgd_mem_to_kfd_bo_list(*mem, avm->process_info, false);
        amdgpu_sync_create(&(*mem)->sync);
 +      (*mem)->is_imported = true;
  
        return 0;
  }
@@@ -57,7 -57,7 +57,7 @@@ static int amdgpu_cs_user_fence_chunk(s
        /* One for TTM and one for the CS job */
        p->uf_entry.tv.num_shared = 2;
  
-       drm_gem_object_put_unlocked(gobj);
+       drm_gem_object_put(gobj);
  
        size = amdgpu_bo_size(bo);
        if (size != PAGE_SIZE || (data->offset + 8) > size) {
@@@ -924,8 -924,7 +924,8 @@@ static int amdgpu_cs_ib_fill(struct amd
  
                ring = to_amdgpu_ring(entity->rq->sched);
                r =  amdgpu_ib_get(adev, vm, ring->funcs->parse_cs ?
 -                                 chunk_ib->ib_bytes : 0, ib);
 +                                 chunk_ib->ib_bytes : 0,
 +                                 AMDGPU_IB_POOL_DELAYED, ib);
                if (r) {
                        DRM_ERROR("Failed to get ib !\n");
                        return r;
@@@ -1208,6 -1207,7 +1208,6 @@@ static int amdgpu_cs_submit(struct amdg
  {
        struct amdgpu_fpriv *fpriv = p->filp->driver_priv;
        struct drm_sched_entity *entity = p->entity;
 -      enum drm_sched_priority priority;
        struct amdgpu_bo_list_entry *e;
        struct amdgpu_job *job;
        uint64_t seq;
  
        trace_amdgpu_cs_ioctl(job);
        amdgpu_vm_bo_trace_cs(&fpriv->vm, &p->ticket);
 -      priority = job->base.s_priority;
        drm_sched_entity_push_job(&job->base, entity);
  
        amdgpu_vm_move_to_lru_tail(p->adev, &fpriv->vm);
@@@ -523,8 -523,7 +523,8 @@@ uint32_t amdgpu_display_supported_domai
                        break;
                case CHIP_RAVEN:
                        /* enable S/G on PCO and RV2 */
 -                      if (adev->rev_id >= 0x8 || adev->pdev->device == 0x15d8)
 +                      if ((adev->apu_flags & AMD_APU_IS_RAVEN2) ||
 +                          (adev->apu_flags & AMD_APU_IS_PICASSO))
                                domain |= AMDGPU_GEM_DOMAIN_GTT;
                        break;
                default:
@@@ -576,14 -575,14 +576,14 @@@ amdgpu_display_user_framebuffer_create(
  
        amdgpu_fb = kzalloc(sizeof(*amdgpu_fb), GFP_KERNEL);
        if (amdgpu_fb == NULL) {
-               drm_gem_object_put_unlocked(obj);
+               drm_gem_object_put(obj);
                return ERR_PTR(-ENOMEM);
        }
  
        ret = amdgpu_display_framebuffer_init(dev, amdgpu_fb, mode_cmd, obj);
        if (ret) {
                kfree(amdgpu_fb);
-               drm_gem_object_put_unlocked(obj);
+               drm_gem_object_put(obj);
                return ERR_PTR(ret);
        }
  
@@@ -114,7 -114,7 +114,7 @@@ static void amdgpufb_destroy_pinned_obj
                amdgpu_bo_unpin(abo);
                amdgpu_bo_unreserve(abo);
        }
-       drm_gem_object_put_unlocked(gobj);
+       drm_gem_object_put(gobj);
  }
  
  static int amdgpufb_create_pinned_object(struct amdgpu_fbdev *rfbdev,
        u32 cpp;
        u64 flags = AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED |
                               AMDGPU_GEM_CREATE_VRAM_CONTIGUOUS     |
 -                             AMDGPU_GEM_CREATE_VRAM_CLEARED        |
 -                             AMDGPU_GEM_CREATE_CPU_GTT_USWC;
 +                             AMDGPU_GEM_CREATE_VRAM_CLEARED;
  
        info = drm_get_format_info(adev->ddev, mode_cmd);
        cpp = info->cpp[0];
@@@ -278,7 -279,7 +278,7 @@@ out
  
        }
        if (fb && ret) {
-               drm_gem_object_put_unlocked(gobj);
+               drm_gem_object_put(gobj);
                drm_framebuffer_unregister_private(fb);
                drm_framebuffer_cleanup(fb);
                kfree(fb);
@@@ -106,7 -106,7 +106,7 @@@ void amdgpu_gem_force_release(struct am
                spin_lock(&file->table_lock);
                idr_for_each_entry(&file->object_idr, gobj, handle) {
                        WARN_ONCE(1, "And also active allocations!\n");
-                       drm_gem_object_put_unlocked(gobj);
+                       drm_gem_object_put(gobj);
                }
                idr_destroy(&file->object_idr);
                spin_unlock(&file->table_lock);
@@@ -162,17 -162,16 +162,17 @@@ void amdgpu_gem_object_close(struct drm
  
        struct amdgpu_bo_list_entry vm_pd;
        struct list_head list, duplicates;
 +      struct dma_fence *fence = NULL;
        struct ttm_validate_buffer tv;
        struct ww_acquire_ctx ticket;
        struct amdgpu_bo_va *bo_va;
 -      int r;
 +      long r;
  
        INIT_LIST_HEAD(&list);
        INIT_LIST_HEAD(&duplicates);
  
        tv.bo = &bo->tbo;
 -      tv.num_shared = 1;
 +      tv.num_shared = 2;
        list_add(&tv.head, &list);
  
        amdgpu_vm_get_pd_bo(vm, &list, &vm_pd);
        r = ttm_eu_reserve_buffers(&ticket, &list, false, &duplicates);
        if (r) {
                dev_err(adev->dev, "leaking bo va because "
 -                      "we fail to reserve bo (%d)\n", r);
 +                      "we fail to reserve bo (%ld)\n", r);
                return;
        }
        bo_va = amdgpu_vm_bo_find(vm, bo);
 -      if (bo_va && --bo_va->ref_count == 0) {
 -              amdgpu_vm_bo_rmv(adev, bo_va);
 -
 -              if (amdgpu_vm_ready(vm)) {
 -                      struct dma_fence *fence = NULL;
 +      if (!bo_va || --bo_va->ref_count)
 +              goto out_unlock;
  
 -                      r = amdgpu_vm_clear_freed(adev, vm, &fence);
 -                      if (unlikely(r)) {
 -                              dev_err(adev->dev, "failed to clear page "
 -                                      "tables on GEM object close (%d)\n", r);
 -                      }
 +      amdgpu_vm_bo_rmv(adev, bo_va);
 +      if (!amdgpu_vm_ready(vm))
 +              goto out_unlock;
  
 -                      if (fence) {
 -                              amdgpu_bo_fence(bo, fence, true);
 -                              dma_fence_put(fence);
 -                      }
 -              }
 +      fence = dma_resv_get_excl(bo->tbo.base.resv);
 +      if (fence) {
 +              amdgpu_bo_fence(bo, fence, true);
 +              fence = NULL;
        }
 +
 +      r = amdgpu_vm_clear_freed(adev, vm, &fence);
 +      if (r || !fence)
 +              goto out_unlock;
 +
 +      amdgpu_bo_fence(bo, fence, true);
 +      dma_fence_put(fence);
 +
 +out_unlock:
 +      if (unlikely(r < 0))
 +              dev_err(adev->dev, "failed to clear page "
 +                      "tables on GEM object close (%ld)\n", r);
        ttm_eu_backoff_reservation(&ticket, &list);
  }
  
@@@ -234,8 -227,7 +234,8 @@@ int amdgpu_gem_create_ioctl(struct drm_
                      AMDGPU_GEM_CREATE_CPU_GTT_USWC |
                      AMDGPU_GEM_CREATE_VRAM_CLEARED |
                      AMDGPU_GEM_CREATE_VM_ALWAYS_VALID |
 -                    AMDGPU_GEM_CREATE_EXPLICIT_SYNC))
 +                    AMDGPU_GEM_CREATE_EXPLICIT_SYNC |
 +                    AMDGPU_GEM_CREATE_ENCRYPTED))
  
                return -EINVAL;
  
        if (args->in.domains & ~AMDGPU_GEM_DOMAIN_MASK)
                return -EINVAL;
  
 +      if (!amdgpu_is_tmz(adev) && (flags & AMDGPU_GEM_CREATE_ENCRYPTED)) {
 +              DRM_NOTE_ONCE("Cannot allocate secure buffer since TMZ is disabled\n");
 +              return -EINVAL;
 +      }
 +
        /* create a gem object to contain this object in */
        if (args->in.domains & (AMDGPU_GEM_DOMAIN_GDS |
            AMDGPU_GEM_DOMAIN_GWS | AMDGPU_GEM_DOMAIN_OA)) {
  
        r = drm_gem_handle_create(filp, gobj, &handle);
        /* drop reference from allocate - handle holds it now */
-       drm_gem_object_put_unlocked(gobj);
+       drm_gem_object_put(gobj);
        if (r)
                return r;
  
@@@ -369,7 -356,7 +369,7 @@@ user_pages_done
                amdgpu_ttm_tt_get_user_pages_done(bo->tbo.ttm);
  
  release_object:
-       drm_gem_object_put_unlocked(gobj);
+       drm_gem_object_put(gobj);
  
        return r;
  }
@@@ -388,11 -375,11 +388,11 @@@ int amdgpu_mode_dumb_mmap(struct drm_fi
        robj = gem_to_amdgpu_bo(gobj);
        if (amdgpu_ttm_tt_get_usermm(robj->tbo.ttm) ||
            (robj->flags & AMDGPU_GEM_CREATE_NO_CPU_ACCESS)) {
-               drm_gem_object_put_unlocked(gobj);
+               drm_gem_object_put(gobj);
                return -EPERM;
        }
        *offset_p = amdgpu_bo_mmap_offset(robj);
-       drm_gem_object_put_unlocked(gobj);
+       drm_gem_object_put(gobj);
        return 0;
  }
  
@@@ -462,7 -449,7 +462,7 @@@ int amdgpu_gem_wait_idle_ioctl(struct d
        } else
                r = ret;
  
-       drm_gem_object_put_unlocked(gobj);
+       drm_gem_object_put(gobj);
        return r;
  }
  
@@@ -505,7 -492,7 +505,7 @@@ int amdgpu_gem_metadata_ioctl(struct dr
  unreserve:
        amdgpu_bo_unreserve(robj);
  out:
-       drm_gem_object_put_unlocked(gobj);
+       drm_gem_object_put(gobj);
        return r;
  }
  
@@@ -704,7 -691,7 +704,7 @@@ error_backoff
        ttm_eu_backoff_reservation(&ticket, &list);
  
  error_unref:
-       drm_gem_object_put_unlocked(gobj);
+       drm_gem_object_put(gobj);
        return r;
  }
  
@@@ -780,7 -767,7 +780,7 @@@ int amdgpu_gem_op_ioctl(struct drm_devi
        }
  
  out:
-       drm_gem_object_put_unlocked(gobj);
+       drm_gem_object_put(gobj);
        return r;
  }
  
@@@ -817,7 -804,7 +817,7 @@@ int amdgpu_mode_dumb_create(struct drm_
  
        r = drm_gem_handle_create(file_priv, gobj, &handle);
        /* drop reference from allocate - handle holds it now */
-       drm_gem_object_put_unlocked(gobj);
+       drm_gem_object_put(gobj);
        if (r) {
                return r;
        }
@@@ -2303,9 -2303,9 +2303,9 @@@ static void dce_v10_0_hide_cursor(struc
        struct amdgpu_device *adev = crtc->dev->dev_private;
        u32 tmp;
  
 -      tmp = RREG32_IDX(mmCUR_CONTROL + amdgpu_crtc->crtc_offset);
 +      tmp = RREG32(mmCUR_CONTROL + amdgpu_crtc->crtc_offset);
        tmp = REG_SET_FIELD(tmp, CUR_CONTROL, CURSOR_EN, 0);
 -      WREG32_IDX(mmCUR_CONTROL + amdgpu_crtc->crtc_offset, tmp);
 +      WREG32(mmCUR_CONTROL + amdgpu_crtc->crtc_offset, tmp);
  }
  
  static void dce_v10_0_show_cursor(struct drm_crtc *crtc)
        WREG32(mmCUR_SURFACE_ADDRESS + amdgpu_crtc->crtc_offset,
               lower_32_bits(amdgpu_crtc->cursor_addr));
  
 -      tmp = RREG32_IDX(mmCUR_CONTROL + amdgpu_crtc->crtc_offset);
 +      tmp = RREG32(mmCUR_CONTROL + amdgpu_crtc->crtc_offset);
        tmp = REG_SET_FIELD(tmp, CUR_CONTROL, CURSOR_EN, 1);
        tmp = REG_SET_FIELD(tmp, CUR_CONTROL, CURSOR_MODE, 2);
 -      WREG32_IDX(mmCUR_CONTROL + amdgpu_crtc->crtc_offset, tmp);
 +      WREG32(mmCUR_CONTROL + amdgpu_crtc->crtc_offset, tmp);
  }
  
  static int dce_v10_0_cursor_move_locked(struct drm_crtc *crtc,
@@@ -2404,7 -2404,7 +2404,7 @@@ static int dce_v10_0_crtc_cursor_set2(s
        aobj = gem_to_amdgpu_bo(obj);
        ret = amdgpu_bo_reserve(aobj, false);
        if (ret != 0) {
-               drm_gem_object_put_unlocked(obj);
+               drm_gem_object_put(obj);
                return ret;
        }
  
        amdgpu_bo_unreserve(aobj);
        if (ret) {
                DRM_ERROR("Failed to pin new cursor BO (%d)\n", ret);
-               drm_gem_object_put_unlocked(obj);
+               drm_gem_object_put(obj);
                return ret;
        }
        amdgpu_crtc->cursor_addr = amdgpu_bo_gpu_offset(aobj);
@@@ -2447,7 -2447,7 +2447,7 @@@ unpin
                        amdgpu_bo_unpin(aobj);
                        amdgpu_bo_unreserve(aobj);
                }
-               drm_gem_object_put_unlocked(amdgpu_crtc->cursor_bo);
+               drm_gem_object_put(amdgpu_crtc->cursor_bo);
        }
  
        amdgpu_crtc->cursor_bo = obj;
@@@ -2382,9 -2382,9 +2382,9 @@@ static void dce_v11_0_hide_cursor(struc
        struct amdgpu_device *adev = crtc->dev->dev_private;
        u32 tmp;
  
 -      tmp = RREG32_IDX(mmCUR_CONTROL + amdgpu_crtc->crtc_offset);
 +      tmp = RREG32(mmCUR_CONTROL + amdgpu_crtc->crtc_offset);
        tmp = REG_SET_FIELD(tmp, CUR_CONTROL, CURSOR_EN, 0);
 -      WREG32_IDX(mmCUR_CONTROL + amdgpu_crtc->crtc_offset, tmp);
 +      WREG32(mmCUR_CONTROL + amdgpu_crtc->crtc_offset, tmp);
  }
  
  static void dce_v11_0_show_cursor(struct drm_crtc *crtc)
        WREG32(mmCUR_SURFACE_ADDRESS + amdgpu_crtc->crtc_offset,
               lower_32_bits(amdgpu_crtc->cursor_addr));
  
 -      tmp = RREG32_IDX(mmCUR_CONTROL + amdgpu_crtc->crtc_offset);
 +      tmp = RREG32(mmCUR_CONTROL + amdgpu_crtc->crtc_offset);
        tmp = REG_SET_FIELD(tmp, CUR_CONTROL, CURSOR_EN, 1);
        tmp = REG_SET_FIELD(tmp, CUR_CONTROL, CURSOR_MODE, 2);
 -      WREG32_IDX(mmCUR_CONTROL + amdgpu_crtc->crtc_offset, tmp);
 +      WREG32(mmCUR_CONTROL + amdgpu_crtc->crtc_offset, tmp);
  }
  
  static int dce_v11_0_cursor_move_locked(struct drm_crtc *crtc,
@@@ -2483,7 -2483,7 +2483,7 @@@ static int dce_v11_0_crtc_cursor_set2(s
        aobj = gem_to_amdgpu_bo(obj);
        ret = amdgpu_bo_reserve(aobj, false);
        if (ret != 0) {
-               drm_gem_object_put_unlocked(obj);
+               drm_gem_object_put(obj);
                return ret;
        }
  
        amdgpu_bo_unreserve(aobj);
        if (ret) {
                DRM_ERROR("Failed to pin new cursor BO (%d)\n", ret);
-               drm_gem_object_put_unlocked(obj);
+               drm_gem_object_put(obj);
                return ret;
        }
        amdgpu_crtc->cursor_addr = amdgpu_bo_gpu_offset(aobj);
@@@ -2526,7 -2526,7 +2526,7 @@@ unpin
                        amdgpu_bo_unpin(aobj);
                        amdgpu_bo_unreserve(aobj);
                }
-               drm_gem_object_put_unlocked(amdgpu_crtc->cursor_bo);
+               drm_gem_object_put(amdgpu_crtc->cursor_bo);
        }
  
        amdgpu_crtc->cursor_bo = obj;
@@@ -2194,9 -2194,9 +2194,9 @@@ static void dce_v6_0_hide_cursor(struc
        struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(crtc);
        struct amdgpu_device *adev = crtc->dev->dev_private;
  
 -      WREG32_IDX(mmCUR_CONTROL + amdgpu_crtc->crtc_offset,
 -                 (CURSOR_24_8_PRE_MULT << CUR_CONTROL__CURSOR_MODE__SHIFT) |
 -                 (CURSOR_URGENT_1_2 << CUR_CONTROL__CURSOR_URGENT_CONTROL__SHIFT));
 +      WREG32(mmCUR_CONTROL + amdgpu_crtc->crtc_offset,
 +             (CURSOR_24_8_PRE_MULT << CUR_CONTROL__CURSOR_MODE__SHIFT) |
 +             (CURSOR_URGENT_1_2 << CUR_CONTROL__CURSOR_URGENT_CONTROL__SHIFT));
  
  
  }
@@@ -2211,10 -2211,10 +2211,10 @@@ static void dce_v6_0_show_cursor(struc
        WREG32(mmCUR_SURFACE_ADDRESS + amdgpu_crtc->crtc_offset,
               lower_32_bits(amdgpu_crtc->cursor_addr));
  
 -      WREG32_IDX(mmCUR_CONTROL + amdgpu_crtc->crtc_offset,
 -                 CUR_CONTROL__CURSOR_EN_MASK |
 -                 (CURSOR_24_8_PRE_MULT << CUR_CONTROL__CURSOR_MODE__SHIFT) |
 -                 (CURSOR_URGENT_1_2 << CUR_CONTROL__CURSOR_URGENT_CONTROL__SHIFT));
 +      WREG32(mmCUR_CONTROL + amdgpu_crtc->crtc_offset,
 +             CUR_CONTROL__CURSOR_EN_MASK |
 +             (CURSOR_24_8_PRE_MULT << CUR_CONTROL__CURSOR_MODE__SHIFT) |
 +             (CURSOR_URGENT_1_2 << CUR_CONTROL__CURSOR_URGENT_CONTROL__SHIFT));
  
  }
  
@@@ -2299,7 -2299,7 +2299,7 @@@ static int dce_v6_0_crtc_cursor_set2(st
        aobj = gem_to_amdgpu_bo(obj);
        ret = amdgpu_bo_reserve(aobj, false);
        if (ret != 0) {
-               drm_gem_object_put_unlocked(obj);
+               drm_gem_object_put(obj);
                return ret;
        }
  
        amdgpu_bo_unreserve(aobj);
        if (ret) {
                DRM_ERROR("Failed to pin new cursor BO (%d)\n", ret);
-               drm_gem_object_put_unlocked(obj);
+               drm_gem_object_put(obj);
                return ret;
        }
        amdgpu_crtc->cursor_addr = amdgpu_bo_gpu_offset(aobj);
@@@ -2342,7 -2342,7 +2342,7 @@@ unpin
                        amdgpu_bo_unpin(aobj);
                        amdgpu_bo_unreserve(aobj);
                }
-               drm_gem_object_put_unlocked(amdgpu_crtc->cursor_bo);
+               drm_gem_object_put(amdgpu_crtc->cursor_bo);
        }
  
        amdgpu_crtc->cursor_bo = obj;
@@@ -2205,9 -2205,9 +2205,9 @@@ static void dce_v8_0_hide_cursor(struc
        struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(crtc);
        struct amdgpu_device *adev = crtc->dev->dev_private;
  
 -      WREG32_IDX(mmCUR_CONTROL + amdgpu_crtc->crtc_offset,
 -                 (CURSOR_24_8_PRE_MULT << CUR_CONTROL__CURSOR_MODE__SHIFT) |
 -                 (CURSOR_URGENT_1_2 << CUR_CONTROL__CURSOR_URGENT_CONTROL__SHIFT));
 +      WREG32(mmCUR_CONTROL + amdgpu_crtc->crtc_offset,
 +             (CURSOR_24_8_PRE_MULT << CUR_CONTROL__CURSOR_MODE__SHIFT) |
 +             (CURSOR_URGENT_1_2 << CUR_CONTROL__CURSOR_URGENT_CONTROL__SHIFT));
  }
  
  static void dce_v8_0_show_cursor(struct drm_crtc *crtc)
        WREG32(mmCUR_SURFACE_ADDRESS + amdgpu_crtc->crtc_offset,
               lower_32_bits(amdgpu_crtc->cursor_addr));
  
 -      WREG32_IDX(mmCUR_CONTROL + amdgpu_crtc->crtc_offset,
 -                 CUR_CONTROL__CURSOR_EN_MASK |
 -                 (CURSOR_24_8_PRE_MULT << CUR_CONTROL__CURSOR_MODE__SHIFT) |
 -                 (CURSOR_URGENT_1_2 << CUR_CONTROL__CURSOR_URGENT_CONTROL__SHIFT));
 +      WREG32(mmCUR_CONTROL + amdgpu_crtc->crtc_offset,
 +             CUR_CONTROL__CURSOR_EN_MASK |
 +             (CURSOR_24_8_PRE_MULT << CUR_CONTROL__CURSOR_MODE__SHIFT) |
 +             (CURSOR_URGENT_1_2 << CUR_CONTROL__CURSOR_URGENT_CONTROL__SHIFT));
  }
  
  static int dce_v8_0_cursor_move_locked(struct drm_crtc *crtc,
@@@ -2305,7 -2305,7 +2305,7 @@@ static int dce_v8_0_crtc_cursor_set2(st
        aobj = gem_to_amdgpu_bo(obj);
        ret = amdgpu_bo_reserve(aobj, false);
        if (ret != 0) {
-               drm_gem_object_put_unlocked(obj);
+               drm_gem_object_put(obj);
                return ret;
        }
  
        amdgpu_bo_unreserve(aobj);
        if (ret) {
                DRM_ERROR("Failed to pin new cursor BO (%d)\n", ret);
-               drm_gem_object_put_unlocked(obj);
+               drm_gem_object_put(obj);
                return ret;
        }
        amdgpu_crtc->cursor_addr = amdgpu_bo_gpu_offset(aobj);
@@@ -2348,7 -2348,7 +2348,7 @@@ unpin
                        amdgpu_bo_unpin(aobj);
                        amdgpu_bo_unreserve(aobj);
                }
-               drm_gem_object_put_unlocked(amdgpu_crtc->cursor_bo);
+               drm_gem_object_put(amdgpu_crtc->cursor_bo);
        }
  
        amdgpu_crtc->cursor_bo = obj;
@@@ -27,7 -27,6 +27,7 @@@
  #include <drm/drm_print.h>
  #include <drm/drm_drv.h>
  #include <drm/drm_file.h>
 +#include <drm/drm_sysfs.h>
  
  #include <linux/uaccess.h>
  
@@@ -524,10 -523,6 +524,10 @@@ int drm_connector_register(struct drm_c
        drm_mode_object_register(connector->dev, &connector->base);
  
        connector->registration_state = DRM_CONNECTOR_REGISTERED;
 +
 +      /* Let userspace know we have a new connector */
 +      drm_sysfs_hotplug_event(connector->dev);
 +
        goto unlock;
  
  err_debugfs:
@@@ -953,8 -948,7 +953,7 @@@ static const struct drm_prop_enum_list 
   *    connector is linked to. Drivers should never set this property directly,
   *    it is handled by the DRM core by calling the &drm_connector_funcs.dpms
   *    callback. For atomic drivers the remapping to the "ACTIVE" property is
-  *    implemented in the DRM core.  This is the only standard connector
-  *    property that userspace can change.
+  *    implemented in the DRM core.
   *
   *    Note that this property cannot be set through the MODE_ATOMIC ioctl,
   *    userspace must use "ACTIVE" on the CRTC instead.
   *      after modeset, the kernel driver may set this to "BAD" and issue a
   *      hotplug uevent. Drivers should update this value using
   *      drm_connector_set_link_status_property().
+  *
+  *      When user-space receives the hotplug uevent and detects a "BAD"
+  *      link-status, the sink doesn't receive pixels anymore (e.g. the screen
+  *      becomes completely black). The list of available modes may have
+  *      changed. User-space is expected to pick a new mode if the current one
+  *      has disappeared and perform a new modeset with link-status set to
+  *      "GOOD" to re-enable the connector.
+  *
+  *      If multiple connectors share the same CRTC and one of them gets a "BAD"
+  *      link-status, the other are unaffected (ie. the sinks still continue to
+  *      receive pixels).
+  *
+  *      When user-space performs an atomic commit on a connector with a "BAD"
+  *      link-status without resetting the property to "GOOD", the sink may
+  *      still not receive pixels. When user-space performs an atomic commit
+  *      which resets the link-status property to "GOOD" without the
+  *      ALLOW_MODESET flag set, it might fail because a modeset is required.
+  *
+  *      User-space can only change link-status to "GOOD", changing it to "BAD"
+  *      is a no-op.
+  *
+  *      For backwards compatibility with non-atomic userspace the kernel
+  *      tries to automatically set the link-status back to "GOOD" in the
+  *      SETCRTC IOCTL. This might fail if the mode is no longer valid, similar
+  *      to how it might fail if a different screen has been connected in the
+  *      interim.
   * non_desktop:
   *    Indicates the output should be ignored for purposes of displaying a
   *    standard desktop environment or console. This is most likely because
@@@ -1238,8 -1238,6 +1238,8 @@@ static const struct dpcd_quirk dpcd_qui
        { OUI(0x00, 0x00, 0x00), DEVICE_ID('C', 'H', '7', '5', '1', '1'), false, BIT(DP_DPCD_QUIRK_NO_SINK_COUNT) },
        /* Synaptics DP1.4 MST hubs can support DSC without virtual DPCD */
        { OUI(0x90, 0xCC, 0x24), DEVICE_ID_ANY, true, BIT(DP_DPCD_QUIRK_DSC_WITHOUT_VIRTUAL_DPCD) },
 +      /* Apple MacBookPro 2017 15 inch eDP Retina panel reports too low DP_MAX_LINK_RATE */
 +      { OUI(0x00, 0x10, 0xfa), DEVICE_ID(101, 68, 21, 101, 98, 97), false, BIT(DP_DPCD_QUIRK_CAN_DO_MAX_LINK_RATE_3_24_GBPS) },
  };
  
  #undef OUI
@@@ -1315,7 -1313,6 +1315,7 @@@ static const struct edid_quirk edid_qui
        { MFG(0x06, 0xaf), PROD_ID(0xeb, 0x41), BIT(DP_QUIRK_FORCE_DPCD_BACKLIGHT) },
        { MFG(0x4d, 0x10), PROD_ID(0xc7, 0x14), BIT(DP_QUIRK_FORCE_DPCD_BACKLIGHT) },
        { MFG(0x4d, 0x10), PROD_ID(0xe6, 0x14), BIT(DP_QUIRK_FORCE_DPCD_BACKLIGHT) },
 +      { MFG(0x4c, 0x83), PROD_ID(0x47, 0x41), BIT(DP_QUIRK_FORCE_DPCD_BACKLIGHT) },
  };
  
  #undef MFG
@@@ -1365,7 -1362,7 +1365,7 @@@ EXPORT_SYMBOL(drm_dp_get_edid_quirks)
  /**
   * drm_dp_read_desc - read sink/branch descriptor from DPCD
   * @aux: DisplayPort AUX channel
-  * @desc: Device decriptor to fill from DPCD
+  * @desc: Device descriptor to fill from DPCD
   * @is_branch: true for branch devices, false for sink devices
   *
   * Read DPCD 0x400 (sink) or 0x500 (branch) into @desc. Also debug log the
@@@ -1591,6 -1588,7 +1591,7 @@@ EXPORT_SYMBOL(drm_dp_get_phy_test_patte
   * drm_dp_set_phy_test_pattern() - set the pattern to the sink.
   * @aux: DisplayPort AUX channel
   * @data: DP phy compliance test parameters.
+  * @dp_rev: DP revision to use for compliance testing
   *
   * Returns 0 on success or a negative error code on failure.
   */
@@@ -1630,177 -1628,3 +1631,177 @@@ int drm_dp_set_phy_test_pattern(struct 
        return 0;
  }
  EXPORT_SYMBOL(drm_dp_set_phy_test_pattern);
 +
 +static const char *dp_pixelformat_get_name(enum dp_pixelformat pixelformat)
 +{
 +      if (pixelformat < 0 || pixelformat > DP_PIXELFORMAT_RESERVED)
 +              return "Invalid";
 +
 +      switch (pixelformat) {
 +      case DP_PIXELFORMAT_RGB:
 +              return "RGB";
 +      case DP_PIXELFORMAT_YUV444:
 +              return "YUV444";
 +      case DP_PIXELFORMAT_YUV422:
 +              return "YUV422";
 +      case DP_PIXELFORMAT_YUV420:
 +              return "YUV420";
 +      case DP_PIXELFORMAT_Y_ONLY:
 +              return "Y_ONLY";
 +      case DP_PIXELFORMAT_RAW:
 +              return "RAW";
 +      default:
 +              return "Reserved";
 +      }
 +}
 +
 +static const char *dp_colorimetry_get_name(enum dp_pixelformat pixelformat,
 +                                         enum dp_colorimetry colorimetry)
 +{
 +      if (pixelformat < 0 || pixelformat > DP_PIXELFORMAT_RESERVED)
 +              return "Invalid";
 +
 +      switch (colorimetry) {
 +      case DP_COLORIMETRY_DEFAULT:
 +              switch (pixelformat) {
 +              case DP_PIXELFORMAT_RGB:
 +                      return "sRGB";
 +              case DP_PIXELFORMAT_YUV444:
 +              case DP_PIXELFORMAT_YUV422:
 +              case DP_PIXELFORMAT_YUV420:
 +                      return "BT.601";
 +              case DP_PIXELFORMAT_Y_ONLY:
 +                      return "DICOM PS3.14";
 +              case DP_PIXELFORMAT_RAW:
 +                      return "Custom Color Profile";
 +              default:
 +                      return "Reserved";
 +              }
 +      case DP_COLORIMETRY_RGB_WIDE_FIXED: /* and DP_COLORIMETRY_BT709_YCC */
 +              switch (pixelformat) {
 +              case DP_PIXELFORMAT_RGB:
 +                      return "Wide Fixed";
 +              case DP_PIXELFORMAT_YUV444:
 +              case DP_PIXELFORMAT_YUV422:
 +              case DP_PIXELFORMAT_YUV420:
 +                      return "BT.709";
 +              default:
 +                      return "Reserved";
 +              }
 +      case DP_COLORIMETRY_RGB_WIDE_FLOAT: /* and DP_COLORIMETRY_XVYCC_601 */
 +              switch (pixelformat) {
 +              case DP_PIXELFORMAT_RGB:
 +                      return "Wide Float";
 +              case DP_PIXELFORMAT_YUV444:
 +              case DP_PIXELFORMAT_YUV422:
 +              case DP_PIXELFORMAT_YUV420:
 +                      return "xvYCC 601";
 +              default:
 +                      return "Reserved";
 +              }
 +      case DP_COLORIMETRY_OPRGB: /* and DP_COLORIMETRY_XVYCC_709 */
 +              switch (pixelformat) {
 +              case DP_PIXELFORMAT_RGB:
 +                      return "OpRGB";
 +              case DP_PIXELFORMAT_YUV444:
 +              case DP_PIXELFORMAT_YUV422:
 +              case DP_PIXELFORMAT_YUV420:
 +                      return "xvYCC 709";
 +              default:
 +                      return "Reserved";
 +              }
 +      case DP_COLORIMETRY_DCI_P3_RGB: /* and DP_COLORIMETRY_SYCC_601 */
 +              switch (pixelformat) {
 +              case DP_PIXELFORMAT_RGB:
 +                      return "DCI-P3";
 +              case DP_PIXELFORMAT_YUV444:
 +              case DP_PIXELFORMAT_YUV422:
 +              case DP_PIXELFORMAT_YUV420:
 +                      return "sYCC 601";
 +              default:
 +                      return "Reserved";
 +              }
 +      case DP_COLORIMETRY_RGB_CUSTOM: /* and DP_COLORIMETRY_OPYCC_601 */
 +              switch (pixelformat) {
 +              case DP_PIXELFORMAT_RGB:
 +                      return "Custom Profile";
 +              case DP_PIXELFORMAT_YUV444:
 +              case DP_PIXELFORMAT_YUV422:
 +              case DP_PIXELFORMAT_YUV420:
 +                      return "OpYCC 601";
 +              default:
 +                      return "Reserved";
 +              }
 +      case DP_COLORIMETRY_BT2020_RGB: /* and DP_COLORIMETRY_BT2020_CYCC */
 +              switch (pixelformat) {
 +              case DP_PIXELFORMAT_RGB:
 +                      return "BT.2020 RGB";
 +              case DP_PIXELFORMAT_YUV444:
 +              case DP_PIXELFORMAT_YUV422:
 +              case DP_PIXELFORMAT_YUV420:
 +                      return "BT.2020 CYCC";
 +              default:
 +                      return "Reserved";
 +              }
 +      case DP_COLORIMETRY_BT2020_YCC:
 +              switch (pixelformat) {
 +              case DP_PIXELFORMAT_YUV444:
 +              case DP_PIXELFORMAT_YUV422:
 +              case DP_PIXELFORMAT_YUV420:
 +                      return "BT.2020 YCC";
 +              default:
 +                      return "Reserved";
 +              }
 +      default:
 +              return "Invalid";
 +      }
 +}
 +
 +static const char *dp_dynamic_range_get_name(enum dp_dynamic_range dynamic_range)
 +{
 +      switch (dynamic_range) {
 +      case DP_DYNAMIC_RANGE_VESA:
 +              return "VESA range";
 +      case DP_DYNAMIC_RANGE_CTA:
 +              return "CTA range";
 +      default:
 +              return "Invalid";
 +      }
 +}
 +
 +static const char *dp_content_type_get_name(enum dp_content_type content_type)
 +{
 +      switch (content_type) {
 +      case DP_CONTENT_TYPE_NOT_DEFINED:
 +              return "Not defined";
 +      case DP_CONTENT_TYPE_GRAPHICS:
 +              return "Graphics";
 +      case DP_CONTENT_TYPE_PHOTO:
 +              return "Photo";
 +      case DP_CONTENT_TYPE_VIDEO:
 +              return "Video";
 +      case DP_CONTENT_TYPE_GAME:
 +              return "Game";
 +      default:
 +              return "Reserved";
 +      }
 +}
 +
 +void drm_dp_vsc_sdp_log(const char *level, struct device *dev,
 +                      const struct drm_dp_vsc_sdp *vsc)
 +{
 +#define DP_SDP_LOG(fmt, ...) dev_printk(level, dev, fmt, ##__VA_ARGS__)
 +      DP_SDP_LOG("DP SDP: %s, revision %u, length %u\n", "VSC",
 +                 vsc->revision, vsc->length);
 +      DP_SDP_LOG("    pixelformat: %s\n",
 +                 dp_pixelformat_get_name(vsc->pixelformat));
 +      DP_SDP_LOG("    colorimetry: %s\n",
 +                 dp_colorimetry_get_name(vsc->pixelformat, vsc->colorimetry));
 +      DP_SDP_LOG("    bpc: %u\n", vsc->bpc);
 +      DP_SDP_LOG("    dynamic range: %s\n",
 +                 dp_dynamic_range_get_name(vsc->dynamic_range));
 +      DP_SDP_LOG("    content type: %s\n",
 +                 dp_content_type_get_name(vsc->content_type));
 +#undef DP_SDP_LOG
 +}
 +EXPORT_SYMBOL(drm_dp_vsc_sdp_log);
@@@ -88,8 -88,8 +88,8 @@@ static int drm_dp_send_enum_path_resour
  static bool drm_dp_validate_guid(struct drm_dp_mst_topology_mgr *mgr,
                                 u8 *guid);
  
- static int drm_dp_mst_register_i2c_bus(struct drm_dp_aux *aux);
- static void drm_dp_mst_unregister_i2c_bus(struct drm_dp_aux *aux);
+ static int drm_dp_mst_register_i2c_bus(struct drm_dp_mst_port *port);
+ static void drm_dp_mst_unregister_i2c_bus(struct drm_dp_mst_port *port);
  static void drm_dp_mst_kick_tx(struct drm_dp_mst_topology_mgr *mgr);
  
  #define DBG_PREFIX "[dp_mst]"
@@@ -1178,12 -1178,38 +1178,38 @@@ static int drm_dp_mst_wait_tx_reply(str
                                    struct drm_dp_sideband_msg_tx *txmsg)
  {
        struct drm_dp_mst_topology_mgr *mgr = mstb->mgr;
+       unsigned long wait_timeout = msecs_to_jiffies(4000);
+       unsigned long wait_expires = jiffies + wait_timeout;
        int ret;
  
-       ret = wait_event_timeout(mgr->tx_waitq,
-                                check_txmsg_state(mgr, txmsg),
-                                (4 * HZ));
-       mutex_lock(&mstb->mgr->qlock);
+       for (;;) {
+               /*
+                * If the driver provides a way for this, change to
+                * poll-waiting for the MST reply interrupt if we didn't receive
+                * it for 50 msec. This would cater for cases where the HPD
+                * pulse signal got lost somewhere, even though the sink raised
+                * the corresponding MST interrupt correctly. One example is the
+                * Club 3D CAC-1557 TypeC -> DP adapter which for some reason
+                * filters out short pulses with a duration less than ~540 usec.
+                *
+                * The poll period is 50 msec to avoid missing an interrupt
+                * after the sink has cleared it (after a 110msec timeout
+                * since it raised the interrupt).
+                */
+               ret = wait_event_timeout(mgr->tx_waitq,
+                                        check_txmsg_state(mgr, txmsg),
+                                        mgr->cbs->poll_hpd_irq ?
+                                               msecs_to_jiffies(50) :
+                                               wait_timeout);
+               if (ret || !mgr->cbs->poll_hpd_irq ||
+                   time_after(jiffies, wait_expires))
+                       break;
+               mgr->cbs->poll_hpd_irq(mgr);
+       }
+       mutex_lock(&mgr->qlock);
        if (ret > 0) {
                if (txmsg->state == DRM_DP_SIDEBAND_TX_TIMEOUT) {
                        ret = -EIO;
  
                /* remove from q */
                if (txmsg->state == DRM_DP_SIDEBAND_TX_QUEUED ||
-                   txmsg->state == DRM_DP_SIDEBAND_TX_START_SEND)
+                   txmsg->state == DRM_DP_SIDEBAND_TX_START_SEND ||
+                   txmsg->state == DRM_DP_SIDEBAND_TX_SENT)
                        list_del(&txmsg->next);
        }
  out:
@@@ -1603,7 -1630,7 +1630,7 @@@ static void drm_dp_destroy_mst_branch_d
        mutex_lock(&mgr->delayed_destroy_lock);
        list_add(&mstb->destroy_next, &mgr->destroy_branch_device_list);
        mutex_unlock(&mgr->delayed_destroy_lock);
-       schedule_work(&mgr->delayed_destroy_work);
+       queue_work(mgr->delayed_destroy_wq, &mgr->delayed_destroy_work);
  }
  
  /**
@@@ -1720,7 -1747,7 +1747,7 @@@ static void drm_dp_destroy_port(struct 
        mutex_lock(&mgr->delayed_destroy_lock);
        list_add(&port->next, &mgr->destroy_port_list);
        mutex_unlock(&mgr->delayed_destroy_lock);
-       schedule_work(&mgr->delayed_destroy_work);
+       queue_work(mgr->delayed_destroy_wq, &mgr->delayed_destroy_work);
  }
  
  /**
@@@ -1966,7 -1993,7 +1993,7 @@@ drm_dp_port_set_pdt(struct drm_dp_mst_p
                        }
  
                        /* remove i2c over sideband */
-                       drm_dp_mst_unregister_i2c_bus(&port->aux);
+                       drm_dp_mst_unregister_i2c_bus(port);
                } else {
                        mutex_lock(&mgr->lock);
                        drm_dp_mst_topology_put_mstb(port->mstb);
        if (port->pdt != DP_PEER_DEVICE_NONE) {
                if (drm_dp_mst_is_end_device(port->pdt, port->mcs)) {
                        /* add i2c over sideband */
-                       ret = drm_dp_mst_register_i2c_bus(&port->aux);
+                       ret = drm_dp_mst_register_i2c_bus(port);
                } else {
                        lct = drm_dp_calculate_rad(port, rad);
                        mstb = drm_dp_add_mst_branch_device(lct, rad);
@@@ -2894,8 -2921,9 +2921,9 @@@ out
        return ret < 0 ? ret : changed;
  }
  
- void drm_dp_send_clear_payload_id_table(struct drm_dp_mst_topology_mgr *mgr,
-                                       struct drm_dp_mst_branch *mstb)
+ static void
+ drm_dp_send_clear_payload_id_table(struct drm_dp_mst_topology_mgr *mgr,
+                                  struct drm_dp_mst_branch *mstb)
  {
        struct drm_dp_sideband_msg_tx *txmsg;
        int ret;
@@@ -3386,12 -3414,8 +3414,12 @@@ static int drm_dp_send_dpcd_write(struc
        drm_dp_queue_down_tx(mgr, txmsg);
  
        ret = drm_dp_mst_wait_tx_reply(mstb, txmsg);
 -      if (ret > 0 && txmsg->reply.reply_type == DP_SIDEBAND_REPLY_NAK)
 -              ret = -EIO;
 +      if (ret > 0) {
 +              if (txmsg->reply.reply_type == DP_SIDEBAND_REPLY_NAK)
 +                      ret = -EIO;
 +              else
 +                      ret = size;
 +      }
  
        kfree(txmsg);
  fail_put:
@@@ -4242,7 -4266,6 +4270,7 @@@ int drm_dp_atomic_release_vcpi_slots(st
        if (pos->vcpi) {
                drm_dp_mst_put_port_malloc(port);
                pos->vcpi = 0;
 +              pos->pbn = 0;
        }
  
        return 0;
@@@ -4641,12 -4664,13 +4669,13 @@@ static void drm_dp_tx_work(struct work_
  static inline void
  drm_dp_delayed_destroy_port(struct drm_dp_mst_port *port)
  {
+       drm_dp_port_set_pdt(port, DP_PEER_DEVICE_NONE, port->mcs);
        if (port->connector) {
                drm_connector_unregister(port->connector);
                drm_connector_put(port->connector);
        }
  
-       drm_dp_port_set_pdt(port, DP_PEER_DEVICE_NONE, port->mcs);
        drm_dp_mst_put_port_malloc(port);
  }
  
@@@ -5179,6 -5203,15 +5208,15 @@@ int drm_dp_mst_topology_mgr_init(struc
        INIT_LIST_HEAD(&mgr->destroy_port_list);
        INIT_LIST_HEAD(&mgr->destroy_branch_device_list);
        INIT_LIST_HEAD(&mgr->up_req_list);
+       /*
+        * delayed_destroy_work will be queued on a dedicated WQ, so that any
+        * requeuing will be also flushed when deiniting the topology manager.
+        */
+       mgr->delayed_destroy_wq = alloc_ordered_workqueue("drm_dp_mst_wq", 0);
+       if (mgr->delayed_destroy_wq == NULL)
+               return -ENOMEM;
        INIT_WORK(&mgr->work, drm_dp_mst_link_probe_work);
        INIT_WORK(&mgr->tx_work, drm_dp_tx_work);
        INIT_WORK(&mgr->delayed_destroy_work, drm_dp_delayed_destroy_work);
@@@ -5223,7 -5256,11 +5261,11 @@@ void drm_dp_mst_topology_mgr_destroy(st
  {
        drm_dp_mst_topology_mgr_set_mst(mgr, false);
        flush_work(&mgr->work);
-       cancel_work_sync(&mgr->delayed_destroy_work);
+       /* The following will also drain any requeued work on the WQ. */
+       if (mgr->delayed_destroy_wq) {
+               destroy_workqueue(mgr->delayed_destroy_wq);
+               mgr->delayed_destroy_wq = NULL;
+       }
        mutex_lock(&mgr->payload_lock);
        kfree(mgr->payloads);
        mgr->payloads = NULL;
@@@ -5346,22 -5383,26 +5388,26 @@@ static const struct i2c_algorithm drm_d
  
  /**
   * drm_dp_mst_register_i2c_bus() - register an I2C adapter for I2C-over-AUX
-  * @aux: DisplayPort AUX channel
+  * @port: The port to add the I2C bus on
   *
   * Returns 0 on success or a negative error code on failure.
   */
- static int drm_dp_mst_register_i2c_bus(struct drm_dp_aux *aux)
+ static int drm_dp_mst_register_i2c_bus(struct drm_dp_mst_port *port)
  {
+       struct drm_dp_aux *aux = &port->aux;
+       struct device *parent_dev = port->mgr->dev->dev;
        aux->ddc.algo = &drm_dp_mst_i2c_algo;
        aux->ddc.algo_data = aux;
        aux->ddc.retries = 3;
  
        aux->ddc.class = I2C_CLASS_DDC;
        aux->ddc.owner = THIS_MODULE;
-       aux->ddc.dev.parent = aux->dev;
-       aux->ddc.dev.of_node = aux->dev->of_node;
+       /* FIXME: set the kdev of the port's connector as parent */
+       aux->ddc.dev.parent = parent_dev;
+       aux->ddc.dev.of_node = parent_dev->of_node;
  
-       strlcpy(aux->ddc.name, aux->name ? aux->name : dev_name(aux->dev),
+       strlcpy(aux->ddc.name, aux->name ? aux->name : dev_name(parent_dev),
                sizeof(aux->ddc.name));
  
        return i2c_add_adapter(&aux->ddc);
  
  /**
   * drm_dp_mst_unregister_i2c_bus() - unregister an I2C-over-AUX adapter
-  * @aux: DisplayPort AUX channel
+  * @port: The port to remove the I2C bus from
   */
- static void drm_dp_mst_unregister_i2c_bus(struct drm_dp_aux *aux)
+ static void drm_dp_mst_unregister_i2c_bus(struct drm_dp_mst_port *port)
  {
-       i2c_del_adapter(&aux->ddc);
+       i2c_del_adapter(&port->aux.ddc);
  }
  
  /**
@@@ -5447,7 -5488,7 +5493,7 @@@ struct drm_dp_aux *drm_dp_mst_dsc_aux_f
  {
        struct drm_dp_mst_port *immediate_upstream_port;
        struct drm_dp_mst_port *fec_port;
-       struct drm_dp_desc desc = { };
+       struct drm_dp_desc desc = {};
        u8 endpoint_fec;
        u8 endpoint_dsc;
  
@@@ -191,11 -191,10 +191,11 @@@ static const struct edid_quirk 
        { "HVR", 0xaa01, EDID_QUIRK_NON_DESKTOP },
        { "HVR", 0xaa02, EDID_QUIRK_NON_DESKTOP },
  
 -      /* Oculus Rift DK1, DK2, and CV1 VR Headsets */
 +      /* Oculus Rift DK1, DK2, CV1 and Rift S VR Headsets */
        { "OVR", 0x0001, EDID_QUIRK_NON_DESKTOP },
        { "OVR", 0x0003, EDID_QUIRK_NON_DESKTOP },
        { "OVR", 0x0004, EDID_QUIRK_NON_DESKTOP },
 +      { "OVR", 0x0012, EDID_QUIRK_NON_DESKTOP },
  
        /* Windows Mixed Reality Headsets */
        { "ACR", 0x7fce, EDID_QUIRK_NON_DESKTOP },
@@@ -720,662 -719,662 +720,662 @@@ static const struct drm_display_mode ed
        { DRM_MODE("640x480", DRM_MODE_TYPE_DRIVER, 25175, 640, 656,
                   752, 800, 0, 480, 490, 492, 525, 0,
                   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
-         .vrefresh = 60, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, },
+         .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, },
        /* 2 - 720x480@60Hz 4:3 */
        { DRM_MODE("720x480", DRM_MODE_TYPE_DRIVER, 27000, 720, 736,
                   798, 858, 0, 480, 489, 495, 525, 0,
                   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
-         .vrefresh = 60, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, },
+         .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, },
        /* 3 - 720x480@60Hz 16:9 */
        { DRM_MODE("720x480", DRM_MODE_TYPE_DRIVER, 27000, 720, 736,
                   798, 858, 0, 480, 489, 495, 525, 0,
                   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
-         .vrefresh = 60, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
+         .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
        /* 4 - 1280x720@60Hz 16:9 */
        { DRM_MODE("1280x720", DRM_MODE_TYPE_DRIVER, 74250, 1280, 1390,
                   1430, 1650, 0, 720, 725, 730, 750, 0,
                   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
-         .vrefresh = 60, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
+         .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
        /* 5 - 1920x1080i@60Hz 16:9 */
        { DRM_MODE("1920x1080i", DRM_MODE_TYPE_DRIVER, 74250, 1920, 2008,
                   2052, 2200, 0, 1080, 1084, 1094, 1125, 0,
                   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC |
                   DRM_MODE_FLAG_INTERLACE),
-         .vrefresh = 60, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
+         .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
        /* 6 - 720(1440)x480i@60Hz 4:3 */
        { DRM_MODE("720x480i", DRM_MODE_TYPE_DRIVER, 13500, 720, 739,
                   801, 858, 0, 480, 488, 494, 525, 0,
                   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
                   DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_DBLCLK),
-         .vrefresh = 60, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, },
+         .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, },
        /* 7 - 720(1440)x480i@60Hz 16:9 */
        { DRM_MODE("720x480i", DRM_MODE_TYPE_DRIVER, 13500, 720, 739,
                   801, 858, 0, 480, 488, 494, 525, 0,
                   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
                   DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_DBLCLK),
-         .vrefresh = 60, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
+         .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
        /* 8 - 720(1440)x240@60Hz 4:3 */
        { DRM_MODE("720x240", DRM_MODE_TYPE_DRIVER, 13500, 720, 739,
                   801, 858, 0, 240, 244, 247, 262, 0,
                   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
                   DRM_MODE_FLAG_DBLCLK),
-         .vrefresh = 60, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, },
+         .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, },
        /* 9 - 720(1440)x240@60Hz 16:9 */
        { DRM_MODE("720x240", DRM_MODE_TYPE_DRIVER, 13500, 720, 739,
                   801, 858, 0, 240, 244, 247, 262, 0,
                   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
                   DRM_MODE_FLAG_DBLCLK),
-         .vrefresh = 60, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
+         .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
        /* 10 - 2880x480i@60Hz 4:3 */
        { DRM_MODE("2880x480i", DRM_MODE_TYPE_DRIVER, 54000, 2880, 2956,
                   3204, 3432, 0, 480, 488, 494, 525, 0,
                   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
                   DRM_MODE_FLAG_INTERLACE),
-         .vrefresh = 60, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, },
+         .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, },
        /* 11 - 2880x480i@60Hz 16:9 */
        { DRM_MODE("2880x480i", DRM_MODE_TYPE_DRIVER, 54000, 2880, 2956,
                   3204, 3432, 0, 480, 488, 494, 525, 0,
                   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
                   DRM_MODE_FLAG_INTERLACE),
-         .vrefresh = 60, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
+         .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
        /* 12 - 2880x240@60Hz 4:3 */
        { DRM_MODE("2880x240", DRM_MODE_TYPE_DRIVER, 54000, 2880, 2956,
                   3204, 3432, 0, 240, 244, 247, 262, 0,
                   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
-         .vrefresh = 60, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, },
+         .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, },
        /* 13 - 2880x240@60Hz 16:9 */
        { DRM_MODE("2880x240", DRM_MODE_TYPE_DRIVER, 54000, 2880, 2956,
                   3204, 3432, 0, 240, 244, 247, 262, 0,
                   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
-         .vrefresh = 60, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
+         .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
        /* 14 - 1440x480@60Hz 4:3 */
        { DRM_MODE("1440x480", DRM_MODE_TYPE_DRIVER, 54000, 1440, 1472,
                   1596, 1716, 0, 480, 489, 495, 525, 0,
                   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
-         .vrefresh = 60, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, },
+         .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, },
        /* 15 - 1440x480@60Hz 16:9 */
        { DRM_MODE("1440x480", DRM_MODE_TYPE_DRIVER, 54000, 1440, 1472,
                   1596, 1716, 0, 480, 489, 495, 525, 0,
                   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
-         .vrefresh = 60, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
+         .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
        /* 16 - 1920x1080@60Hz 16:9 */
        { DRM_MODE("1920x1080", DRM_MODE_TYPE_DRIVER, 148500, 1920, 2008,
                   2052, 2200, 0, 1080, 1084, 1089, 1125, 0,
                   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
-         .vrefresh = 60, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
+         .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
        /* 17 - 720x576@50Hz 4:3 */
        { DRM_MODE("720x576", DRM_MODE_TYPE_DRIVER, 27000, 720, 732,
                   796, 864, 0, 576, 581, 586, 625, 0,
                   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
-         .vrefresh = 50, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, },
+         .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, },
        /* 18 - 720x576@50Hz 16:9 */
        { DRM_MODE("720x576", DRM_MODE_TYPE_DRIVER, 27000, 720, 732,
                   796, 864, 0, 576, 581, 586, 625, 0,
                   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
-         .vrefresh = 50, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
+         .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
        /* 19 - 1280x720@50Hz 16:9 */
        { DRM_MODE("1280x720", DRM_MODE_TYPE_DRIVER, 74250, 1280, 1720,
                   1760, 1980, 0, 720, 725, 730, 750, 0,
                   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
-         .vrefresh = 50, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
+         .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
        /* 20 - 1920x1080i@50Hz 16:9 */
        { DRM_MODE("1920x1080i", DRM_MODE_TYPE_DRIVER, 74250, 1920, 2448,
                   2492, 2640, 0, 1080, 1084, 1094, 1125, 0,
                   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC |
                   DRM_MODE_FLAG_INTERLACE),
-         .vrefresh = 50, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
+         .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
        /* 21 - 720(1440)x576i@50Hz 4:3 */
        { DRM_MODE("720x576i", DRM_MODE_TYPE_DRIVER, 13500, 720, 732,
                   795, 864, 0, 576, 580, 586, 625, 0,
                   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
                   DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_DBLCLK),
-         .vrefresh = 50, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, },
+         .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, },
        /* 22 - 720(1440)x576i@50Hz 16:9 */
        { DRM_MODE("720x576i", DRM_MODE_TYPE_DRIVER, 13500, 720, 732,
                   795, 864, 0, 576, 580, 586, 625, 0,
                   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
                   DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_DBLCLK),
-         .vrefresh = 50, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
+         .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
        /* 23 - 720(1440)x288@50Hz 4:3 */
        { DRM_MODE("720x288", DRM_MODE_TYPE_DRIVER, 13500, 720, 732,
                   795, 864, 0, 288, 290, 293, 312, 0,
                   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
                   DRM_MODE_FLAG_DBLCLK),
-         .vrefresh = 50, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, },
+         .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, },
        /* 24 - 720(1440)x288@50Hz 16:9 */
        { DRM_MODE("720x288", DRM_MODE_TYPE_DRIVER, 13500, 720, 732,
                   795, 864, 0, 288, 290, 293, 312, 0,
                   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
                   DRM_MODE_FLAG_DBLCLK),
-         .vrefresh = 50, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
+         .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
        /* 25 - 2880x576i@50Hz 4:3 */
        { DRM_MODE("2880x576i", DRM_MODE_TYPE_DRIVER, 54000, 2880, 2928,
                   3180, 3456, 0, 576, 580, 586, 625, 0,
                   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
                   DRM_MODE_FLAG_INTERLACE),
-         .vrefresh = 50, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, },
+         .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, },
        /* 26 - 2880x576i@50Hz 16:9 */
        { DRM_MODE("2880x576i", DRM_MODE_TYPE_DRIVER, 54000, 2880, 2928,
                   3180, 3456, 0, 576, 580, 586, 625, 0,
                   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
                   DRM_MODE_FLAG_INTERLACE),
-         .vrefresh = 50, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
+         .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
        /* 27 - 2880x288@50Hz 4:3 */
        { DRM_MODE("2880x288", DRM_MODE_TYPE_DRIVER, 54000, 2880, 2928,
                   3180, 3456, 0, 288, 290, 293, 312, 0,
                   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
-         .vrefresh = 50, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, },
+         .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, },
        /* 28 - 2880x288@50Hz 16:9 */
        { DRM_MODE("2880x288", DRM_MODE_TYPE_DRIVER, 54000, 2880, 2928,
                   3180, 3456, 0, 288, 290, 293, 312, 0,
                   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
-         .vrefresh = 50, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
+         .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
        /* 29 - 1440x576@50Hz 4:3 */
        { DRM_MODE("1440x576", DRM_MODE_TYPE_DRIVER, 54000, 1440, 1464,
                   1592, 1728, 0, 576, 581, 586, 625, 0,
                   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
-         .vrefresh = 50, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, },
+         .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, },
        /* 30 - 1440x576@50Hz 16:9 */
        { DRM_MODE("1440x576", DRM_MODE_TYPE_DRIVER, 54000, 1440, 1464,
                   1592, 1728, 0, 576, 581, 586, 625, 0,
                   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
-         .vrefresh = 50, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
+         .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
        /* 31 - 1920x1080@50Hz 16:9 */
        { DRM_MODE("1920x1080", DRM_MODE_TYPE_DRIVER, 148500, 1920, 2448,
                   2492, 2640, 0, 1080, 1084, 1089, 1125, 0,
                   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
-         .vrefresh = 50, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
+         .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
        /* 32 - 1920x1080@24Hz 16:9 */
        { DRM_MODE("1920x1080", DRM_MODE_TYPE_DRIVER, 74250, 1920, 2558,
                   2602, 2750, 0, 1080, 1084, 1089, 1125, 0,
                   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
-         .vrefresh = 24, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
+         .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
        /* 33 - 1920x1080@25Hz 16:9 */
        { DRM_MODE("1920x1080", DRM_MODE_TYPE_DRIVER, 74250, 1920, 2448,
                   2492, 2640, 0, 1080, 1084, 1089, 1125, 0,
                   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
-         .vrefresh = 25, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
+         .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
        /* 34 - 1920x1080@30Hz 16:9 */
        { DRM_MODE("1920x1080", DRM_MODE_TYPE_DRIVER, 74250, 1920, 2008,
                   2052, 2200, 0, 1080, 1084, 1089, 1125, 0,
                   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
-         .vrefresh = 30, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
+         .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
        /* 35 - 2880x480@60Hz 4:3 */
        { DRM_MODE("2880x480", DRM_MODE_TYPE_DRIVER, 108000, 2880, 2944,
                   3192, 3432, 0, 480, 489, 495, 525, 0,
                   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
-         .vrefresh = 60, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, },
+         .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, },
        /* 36 - 2880x480@60Hz 16:9 */
        { DRM_MODE("2880x480", DRM_MODE_TYPE_DRIVER, 108000, 2880, 2944,
                   3192, 3432, 0, 480, 489, 495, 525, 0,
                   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
-         .vrefresh = 60, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
+         .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
        /* 37 - 2880x576@50Hz 4:3 */
        { DRM_MODE("2880x576", DRM_MODE_TYPE_DRIVER, 108000, 2880, 2928,
                   3184, 3456, 0, 576, 581, 586, 625, 0,
                   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
-         .vrefresh = 50, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, },
+         .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, },
        /* 38 - 2880x576@50Hz 16:9 */
        { DRM_MODE("2880x576", DRM_MODE_TYPE_DRIVER, 108000, 2880, 2928,
                   3184, 3456, 0, 576, 581, 586, 625, 0,
                   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
-         .vrefresh = 50, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
+         .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
        /* 39 - 1920x1080i@50Hz 16:9 */
        { DRM_MODE("1920x1080i", DRM_MODE_TYPE_DRIVER, 72000, 1920, 1952,
                   2120, 2304, 0, 1080, 1126, 1136, 1250, 0,
                   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC |
                   DRM_MODE_FLAG_INTERLACE),
-         .vrefresh = 50, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
+         .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
        /* 40 - 1920x1080i@100Hz 16:9 */
        { DRM_MODE("1920x1080i", DRM_MODE_TYPE_DRIVER, 148500, 1920, 2448,
                   2492, 2640, 0, 1080, 1084, 1094, 1125, 0,
                   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC |
                   DRM_MODE_FLAG_INTERLACE),
-         .vrefresh = 100, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
+         .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
        /* 41 - 1280x720@100Hz 16:9 */
        { DRM_MODE("1280x720", DRM_MODE_TYPE_DRIVER, 148500, 1280, 1720,
                   1760, 1980, 0, 720, 725, 730, 750, 0,
                   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
-         .vrefresh = 100, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
+         .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
        /* 42 - 720x576@100Hz 4:3 */
        { DRM_MODE("720x576", DRM_MODE_TYPE_DRIVER, 54000, 720, 732,
                   796, 864, 0, 576, 581, 586, 625, 0,
                   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
-         .vrefresh = 100, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, },
+         .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, },
        /* 43 - 720x576@100Hz 16:9 */
        { DRM_MODE("720x576", DRM_MODE_TYPE_DRIVER, 54000, 720, 732,
                   796, 864, 0, 576, 581, 586, 625, 0,
                   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
-         .vrefresh = 100, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
+         .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
        /* 44 - 720(1440)x576i@100Hz 4:3 */
        { DRM_MODE("720x576i", DRM_MODE_TYPE_DRIVER, 27000, 720, 732,
                   795, 864, 0, 576, 580, 586, 625, 0,
                   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
                   DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_DBLCLK),
-         .vrefresh = 100, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, },
+         .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, },
        /* 45 - 720(1440)x576i@100Hz 16:9 */
        { DRM_MODE("720x576i", DRM_MODE_TYPE_DRIVER, 27000, 720, 732,
                   795, 864, 0, 576, 580, 586, 625, 0,
                   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
                   DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_DBLCLK),
-         .vrefresh = 100, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
+         .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
        /* 46 - 1920x1080i@120Hz 16:9 */
        { DRM_MODE("1920x1080i", DRM_MODE_TYPE_DRIVER, 148500, 1920, 2008,
                   2052, 2200, 0, 1080, 1084, 1094, 1125, 0,
                   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC |
                   DRM_MODE_FLAG_INTERLACE),
-         .vrefresh = 120, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
+         .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
        /* 47 - 1280x720@120Hz 16:9 */
        { DRM_MODE("1280x720", DRM_MODE_TYPE_DRIVER, 148500, 1280, 1390,
                   1430, 1650, 0, 720, 725, 730, 750, 0,
                   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
-         .vrefresh = 120, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
+         .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
        /* 48 - 720x480@120Hz 4:3 */
        { DRM_MODE("720x480", DRM_MODE_TYPE_DRIVER, 54000, 720, 736,
                   798, 858, 0, 480, 489, 495, 525, 0,
                   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
-         .vrefresh = 120, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, },
+         .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, },
        /* 49 - 720x480@120Hz 16:9 */
        { DRM_MODE("720x480", DRM_MODE_TYPE_DRIVER, 54000, 720, 736,
                   798, 858, 0, 480, 489, 495, 525, 0,
                   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
-         .vrefresh = 120, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
+         .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
        /* 50 - 720(1440)x480i@120Hz 4:3 */
        { DRM_MODE("720x480i", DRM_MODE_TYPE_DRIVER, 27000, 720, 739,
                   801, 858, 0, 480, 488, 494, 525, 0,
                   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
                   DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_DBLCLK),
-         .vrefresh = 120, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, },
+         .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, },
        /* 51 - 720(1440)x480i@120Hz 16:9 */
        { DRM_MODE("720x480i", DRM_MODE_TYPE_DRIVER, 27000, 720, 739,
                   801, 858, 0, 480, 488, 494, 525, 0,
                   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
                   DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_DBLCLK),
-         .vrefresh = 120, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
+         .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
        /* 52 - 720x576@200Hz 4:3 */
        { DRM_MODE("720x576", DRM_MODE_TYPE_DRIVER, 108000, 720, 732,
                   796, 864, 0, 576, 581, 586, 625, 0,
                   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
-         .vrefresh = 200, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, },
+         .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, },
        /* 53 - 720x576@200Hz 16:9 */
        { DRM_MODE("720x576", DRM_MODE_TYPE_DRIVER, 108000, 720, 732,
                   796, 864, 0, 576, 581, 586, 625, 0,
                   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
-         .vrefresh = 200, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
+         .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
        /* 54 - 720(1440)x576i@200Hz 4:3 */
        { DRM_MODE("720x576i", DRM_MODE_TYPE_DRIVER, 54000, 720, 732,
                   795, 864, 0, 576, 580, 586, 625, 0,
                   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
                   DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_DBLCLK),
-         .vrefresh = 200, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, },
+         .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, },
        /* 55 - 720(1440)x576i@200Hz 16:9 */
        { DRM_MODE("720x576i", DRM_MODE_TYPE_DRIVER, 54000, 720, 732,
                   795, 864, 0, 576, 580, 586, 625, 0,
                   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
                   DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_DBLCLK),
-         .vrefresh = 200, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
+         .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
        /* 56 - 720x480@240Hz 4:3 */
        { DRM_MODE("720x480", DRM_MODE_TYPE_DRIVER, 108000, 720, 736,
                   798, 858, 0, 480, 489, 495, 525, 0,
                   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
-         .vrefresh = 240, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, },
+         .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, },
        /* 57 - 720x480@240Hz 16:9 */
        { DRM_MODE("720x480", DRM_MODE_TYPE_DRIVER, 108000, 720, 736,
                   798, 858, 0, 480, 489, 495, 525, 0,
                   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
-         .vrefresh = 240, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
+         .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
        /* 58 - 720(1440)x480i@240Hz 4:3 */
        { DRM_MODE("720x480i", DRM_MODE_TYPE_DRIVER, 54000, 720, 739,
                   801, 858, 0, 480, 488, 494, 525, 0,
                   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
                   DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_DBLCLK),
-         .vrefresh = 240, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, },
+         .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, },
        /* 59 - 720(1440)x480i@240Hz 16:9 */
        { DRM_MODE("720x480i", DRM_MODE_TYPE_DRIVER, 54000, 720, 739,
                   801, 858, 0, 480, 488, 494, 525, 0,
                   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
                   DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_DBLCLK),
-         .vrefresh = 240, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
+         .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
        /* 60 - 1280x720@24Hz 16:9 */
        { DRM_MODE("1280x720", DRM_MODE_TYPE_DRIVER, 59400, 1280, 3040,
                   3080, 3300, 0, 720, 725, 730, 750, 0,
                   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
-         .vrefresh = 24, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
+         .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
        /* 61 - 1280x720@25Hz 16:9 */
        { DRM_MODE("1280x720", DRM_MODE_TYPE_DRIVER, 74250, 1280, 3700,
                   3740, 3960, 0, 720, 725, 730, 750, 0,
                   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
-         .vrefresh = 25, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
+         .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
        /* 62 - 1280x720@30Hz 16:9 */
        { DRM_MODE("1280x720", DRM_MODE_TYPE_DRIVER, 74250, 1280, 3040,
                   3080, 3300, 0, 720, 725, 730, 750, 0,
                   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
-         .vrefresh = 30, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
+         .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
        /* 63 - 1920x1080@120Hz 16:9 */
        { DRM_MODE("1920x1080", DRM_MODE_TYPE_DRIVER, 297000, 1920, 2008,
                   2052, 2200, 0, 1080, 1084, 1089, 1125, 0,
                   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
-         .vrefresh = 120, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
+         .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
        /* 64 - 1920x1080@100Hz 16:9 */
        { DRM_MODE("1920x1080", DRM_MODE_TYPE_DRIVER, 297000, 1920, 2448,
                   2492, 2640, 0, 1080, 1084, 1089, 1125, 0,
                   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
-         .vrefresh = 100, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
+         .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
        /* 65 - 1280x720@24Hz 64:27 */
        { DRM_MODE("1280x720", DRM_MODE_TYPE_DRIVER, 59400, 1280, 3040,
                   3080, 3300, 0, 720, 725, 730, 750, 0,
                   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
-         .vrefresh = 24, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
+         .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
        /* 66 - 1280x720@25Hz 64:27 */
        { DRM_MODE("1280x720", DRM_MODE_TYPE_DRIVER, 74250, 1280, 3700,
                   3740, 3960, 0, 720, 725, 730, 750, 0,
                   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
-         .vrefresh = 25, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
+         .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
        /* 67 - 1280x720@30Hz 64:27 */
        { DRM_MODE("1280x720", DRM_MODE_TYPE_DRIVER, 74250, 1280, 3040,
                   3080, 3300, 0, 720, 725, 730, 750, 0,
                   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
-         .vrefresh = 30, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
+         .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
        /* 68 - 1280x720@50Hz 64:27 */
        { DRM_MODE("1280x720", DRM_MODE_TYPE_DRIVER, 74250, 1280, 1720,
                   1760, 1980, 0, 720, 725, 730, 750, 0,
                   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
-         .vrefresh = 50, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
+         .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
        /* 69 - 1280x720@60Hz 64:27 */
        { DRM_MODE("1280x720", DRM_MODE_TYPE_DRIVER, 74250, 1280, 1390,
                   1430, 1650, 0, 720, 725, 730, 750, 0,
                   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
-         .vrefresh = 60, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
+         .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
        /* 70 - 1280x720@100Hz 64:27 */
        { DRM_MODE("1280x720", DRM_MODE_TYPE_DRIVER, 148500, 1280, 1720,
                   1760, 1980, 0, 720, 725, 730, 750, 0,
                   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
-         .vrefresh = 100, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
+         .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
        /* 71 - 1280x720@120Hz 64:27 */
        { DRM_MODE("1280x720", DRM_MODE_TYPE_DRIVER, 148500, 1280, 1390,
                   1430, 1650, 0, 720, 725, 730, 750, 0,
                   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
-         .vrefresh = 120, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
+         .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
        /* 72 - 1920x1080@24Hz 64:27 */
        { DRM_MODE("1920x1080", DRM_MODE_TYPE_DRIVER, 74250, 1920, 2558,
                   2602, 2750, 0, 1080, 1084, 1089, 1125, 0,
                   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
-         .vrefresh = 24, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
+         .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
        /* 73 - 1920x1080@25Hz 64:27 */
        { DRM_MODE("1920x1080", DRM_MODE_TYPE_DRIVER, 74250, 1920, 2448,
                   2492, 2640, 0, 1080, 1084, 1089, 1125, 0,
                   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
-         .vrefresh = 25, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
+         .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
        /* 74 - 1920x1080@30Hz 64:27 */
        { DRM_MODE("1920x1080", DRM_MODE_TYPE_DRIVER, 74250, 1920, 2008,
                   2052, 2200, 0, 1080, 1084, 1089, 1125, 0,
                   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
-         .vrefresh = 30, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
+         .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
        /* 75 - 1920x1080@50Hz 64:27 */
        { DRM_MODE("1920x1080", DRM_MODE_TYPE_DRIVER, 148500, 1920, 2448,
                   2492, 2640, 0, 1080, 1084, 1089, 1125, 0,
                   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
-         .vrefresh = 50, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
+         .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
        /* 76 - 1920x1080@60Hz 64:27 */
        { DRM_MODE("1920x1080", DRM_MODE_TYPE_DRIVER, 148500, 1920, 2008,
                   2052, 2200, 0, 1080, 1084, 1089, 1125, 0,
                   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
-         .vrefresh = 60, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
+         .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
        /* 77 - 1920x1080@100Hz 64:27 */
        { DRM_MODE("1920x1080", DRM_MODE_TYPE_DRIVER, 297000, 1920, 2448,
                   2492, 2640, 0, 1080, 1084, 1089, 1125, 0,
                   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
-         .vrefresh = 100, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
+         .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
        /* 78 - 1920x1080@120Hz 64:27 */
        { DRM_MODE("1920x1080", DRM_MODE_TYPE_DRIVER, 297000, 1920, 2008,
                   2052, 2200, 0, 1080, 1084, 1089, 1125, 0,
                   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
-         .vrefresh = 120, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
+         .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
        /* 79 - 1680x720@24Hz 64:27 */
        { DRM_MODE("1680x720", DRM_MODE_TYPE_DRIVER, 59400, 1680, 3040,
                   3080, 3300, 0, 720, 725, 730, 750, 0,
                   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
-         .vrefresh = 24, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
+         .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
        /* 80 - 1680x720@25Hz 64:27 */
        { DRM_MODE("1680x720", DRM_MODE_TYPE_DRIVER, 59400, 1680, 2908,
                   2948, 3168, 0, 720, 725, 730, 750, 0,
                   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
-         .vrefresh = 25, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
+         .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
        /* 81 - 1680x720@30Hz 64:27 */
        { DRM_MODE("1680x720", DRM_MODE_TYPE_DRIVER, 59400, 1680, 2380,
                   2420, 2640, 0, 720, 725, 730, 750, 0,
                   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
-         .vrefresh = 30, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
+         .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
        /* 82 - 1680x720@50Hz 64:27 */
        { DRM_MODE("1680x720", DRM_MODE_TYPE_DRIVER, 82500, 1680, 1940,
                   1980, 2200, 0, 720, 725, 730, 750, 0,
                   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
-         .vrefresh = 50, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
+         .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
        /* 83 - 1680x720@60Hz 64:27 */
        { DRM_MODE("1680x720", DRM_MODE_TYPE_DRIVER, 99000, 1680, 1940,
                   1980, 2200, 0, 720, 725, 730, 750, 0,
                   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
-         .vrefresh = 60, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
+         .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
        /* 84 - 1680x720@100Hz 64:27 */
        { DRM_MODE("1680x720", DRM_MODE_TYPE_DRIVER, 165000, 1680, 1740,
                   1780, 2000, 0, 720, 725, 730, 825, 0,
                   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
-         .vrefresh = 100, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
+         .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
        /* 85 - 1680x720@120Hz 64:27 */
        { DRM_MODE("1680x720", DRM_MODE_TYPE_DRIVER, 198000, 1680, 1740,
                   1780, 2000, 0, 720, 725, 730, 825, 0,
                   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
-         .vrefresh = 120, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
+         .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
        /* 86 - 2560x1080@24Hz 64:27 */
        { DRM_MODE("2560x1080", DRM_MODE_TYPE_DRIVER, 99000, 2560, 3558,
                   3602, 3750, 0, 1080, 1084, 1089, 1100, 0,
                   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
-         .vrefresh = 24, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
+         .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
        /* 87 - 2560x1080@25Hz 64:27 */
        { DRM_MODE("2560x1080", DRM_MODE_TYPE_DRIVER, 90000, 2560, 3008,
                   3052, 3200, 0, 1080, 1084, 1089, 1125, 0,
                   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
-         .vrefresh = 25, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
+         .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
        /* 88 - 2560x1080@30Hz 64:27 */
        { DRM_MODE("2560x1080", DRM_MODE_TYPE_DRIVER, 118800, 2560, 3328,
                   3372, 3520, 0, 1080, 1084, 1089, 1125, 0,
                   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
-         .vrefresh = 30, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
+         .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
        /* 89 - 2560x1080@50Hz 64:27 */
        { DRM_MODE("2560x1080", DRM_MODE_TYPE_DRIVER, 185625, 2560, 3108,
                   3152, 3300, 0, 1080, 1084, 1089, 1125, 0,
                   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
-         .vrefresh = 50, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
+         .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
        /* 90 - 2560x1080@60Hz 64:27 */
        { DRM_MODE("2560x1080", DRM_MODE_TYPE_DRIVER, 198000, 2560, 2808,
                   2852, 3000, 0, 1080, 1084, 1089, 1100, 0,
                   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
-         .vrefresh = 60, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
+         .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
        /* 91 - 2560x1080@100Hz 64:27 */
        { DRM_MODE("2560x1080", DRM_MODE_TYPE_DRIVER, 371250, 2560, 2778,
                   2822, 2970, 0, 1080, 1084, 1089, 1250, 0,
                   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
-         .vrefresh = 100, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
+         .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
        /* 92 - 2560x1080@120Hz 64:27 */
        { DRM_MODE("2560x1080", DRM_MODE_TYPE_DRIVER, 495000, 2560, 3108,
                   3152, 3300, 0, 1080, 1084, 1089, 1250, 0,
                   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
-         .vrefresh = 120, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
+         .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
        /* 93 - 3840x2160@24Hz 16:9 */
        { DRM_MODE("3840x2160", DRM_MODE_TYPE_DRIVER, 297000, 3840, 5116,
                   5204, 5500, 0, 2160, 2168, 2178, 2250, 0,
                   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
-         .vrefresh = 24, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
+         .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
        /* 94 - 3840x2160@25Hz 16:9 */
        { DRM_MODE("3840x2160", DRM_MODE_TYPE_DRIVER, 297000, 3840, 4896,
                   4984, 5280, 0, 2160, 2168, 2178, 2250, 0,
                   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
-         .vrefresh = 25, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
+         .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
        /* 95 - 3840x2160@30Hz 16:9 */
        { DRM_MODE("3840x2160", DRM_MODE_TYPE_DRIVER, 297000, 3840, 4016,
                   4104, 4400, 0, 2160, 2168, 2178, 2250, 0,
                   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
-         .vrefresh = 30, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
+         .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
        /* 96 - 3840x2160@50Hz 16:9 */
        { DRM_MODE("3840x2160", DRM_MODE_TYPE_DRIVER, 594000, 3840, 4896,
                   4984, 5280, 0, 2160, 2168, 2178, 2250, 0,
                   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
-         .vrefresh = 50, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
+         .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
        /* 97 - 3840x2160@60Hz 16:9 */
        { DRM_MODE("3840x2160", DRM_MODE_TYPE_DRIVER, 594000, 3840, 4016,
                   4104, 4400, 0, 2160, 2168, 2178, 2250, 0,
                   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
-         .vrefresh = 60, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
+         .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
        /* 98 - 4096x2160@24Hz 256:135 */
        { DRM_MODE("4096x2160", DRM_MODE_TYPE_DRIVER, 297000, 4096, 5116,
                   5204, 5500, 0, 2160, 2168, 2178, 2250, 0,
                   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
-         .vrefresh = 24, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_256_135, },
+         .picture_aspect_ratio = HDMI_PICTURE_ASPECT_256_135, },
        /* 99 - 4096x2160@25Hz 256:135 */
        { DRM_MODE("4096x2160", DRM_MODE_TYPE_DRIVER, 297000, 4096, 5064,
                   5152, 5280, 0, 2160, 2168, 2178, 2250, 0,
                   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
-         .vrefresh = 25, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_256_135, },
+         .picture_aspect_ratio = HDMI_PICTURE_ASPECT_256_135, },
        /* 100 - 4096x2160@30Hz 256:135 */
        { DRM_MODE("4096x2160", DRM_MODE_TYPE_DRIVER, 297000, 4096, 4184,
                   4272, 4400, 0, 2160, 2168, 2178, 2250, 0,
                   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
-         .vrefresh = 30, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_256_135, },
+         .picture_aspect_ratio = HDMI_PICTURE_ASPECT_256_135, },
        /* 101 - 4096x2160@50Hz 256:135 */
        { DRM_MODE("4096x2160", DRM_MODE_TYPE_DRIVER, 594000, 4096, 5064,
                   5152, 5280, 0, 2160, 2168, 2178, 2250, 0,
                   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
-         .vrefresh = 50, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_256_135, },
+         .picture_aspect_ratio = HDMI_PICTURE_ASPECT_256_135, },
        /* 102 - 4096x2160@60Hz 256:135 */
        { DRM_MODE("4096x2160", DRM_MODE_TYPE_DRIVER, 594000, 4096, 4184,
                   4272, 4400, 0, 2160, 2168, 2178, 2250, 0,
                   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
-         .vrefresh = 60, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_256_135, },
+         .picture_aspect_ratio = HDMI_PICTURE_ASPECT_256_135, },
        /* 103 - 3840x2160@24Hz 64:27 */
        { DRM_MODE("3840x2160", DRM_MODE_TYPE_DRIVER, 297000, 3840, 5116,
                   5204, 5500, 0, 2160, 2168, 2178, 2250, 0,
                   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
-         .vrefresh = 24, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
+         .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
        /* 104 - 3840x2160@25Hz 64:27 */
        { DRM_MODE("3840x2160", DRM_MODE_TYPE_DRIVER, 297000, 3840, 4896,
                   4984, 5280, 0, 2160, 2168, 2178, 2250, 0,
                   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
-         .vrefresh = 25, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
+         .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
        /* 105 - 3840x2160@30Hz 64:27 */
        { DRM_MODE("3840x2160", DRM_MODE_TYPE_DRIVER, 297000, 3840, 4016,
                   4104, 4400, 0, 2160, 2168, 2178, 2250, 0,
                   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
-         .vrefresh = 30, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
+         .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
        /* 106 - 3840x2160@50Hz 64:27 */
        { DRM_MODE("3840x2160", DRM_MODE_TYPE_DRIVER, 594000, 3840, 4896,
                   4984, 5280, 0, 2160, 2168, 2178, 2250, 0,
                   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
-         .vrefresh = 50, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
+         .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
        /* 107 - 3840x2160@60Hz 64:27 */
        { DRM_MODE("3840x2160", DRM_MODE_TYPE_DRIVER, 594000, 3840, 4016,
                   4104, 4400, 0, 2160, 2168, 2178, 2250, 0,
                   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
-         .vrefresh = 60, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
+         .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
        /* 108 - 1280x720@48Hz 16:9 */
        { DRM_MODE("1280x720", DRM_MODE_TYPE_DRIVER, 90000, 1280, 2240,
                   2280, 2500, 0, 720, 725, 730, 750, 0,
                   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
-         .vrefresh = 48, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
+         .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
        /* 109 - 1280x720@48Hz 64:27 */
        { DRM_MODE("1280x720", DRM_MODE_TYPE_DRIVER, 90000, 1280, 2240,
                   2280, 2500, 0, 720, 725, 730, 750, 0,
                   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
-         .vrefresh = 48, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
+         .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
        /* 110 - 1680x720@48Hz 64:27 */
        { DRM_MODE("1680x720", DRM_MODE_TYPE_DRIVER, 99000, 1680, 2490,
                   2530, 2750, 0, 720, 725, 730, 750, 0,
                   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
-         .vrefresh = 48, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
+         .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
        /* 111 - 1920x1080@48Hz 16:9 */
        { DRM_MODE("1920x1080", DRM_MODE_TYPE_DRIVER, 148500, 1920, 2558,
                   2602, 2750, 0, 1080, 1084, 1089, 1125, 0,
                   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
-         .vrefresh = 48, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
+         .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
        /* 112 - 1920x1080@48Hz 64:27 */
        { DRM_MODE("1920x1080", DRM_MODE_TYPE_DRIVER, 148500, 1920, 2558,
                   2602, 2750, 0, 1080, 1084, 1089, 1125, 0,
                   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
-         .vrefresh = 48, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
+         .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
        /* 113 - 2560x1080@48Hz 64:27 */
        { DRM_MODE("2560x1080", DRM_MODE_TYPE_DRIVER, 198000, 2560, 3558,
                   3602, 3750, 0, 1080, 1084, 1089, 1100, 0,
                   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
-         .vrefresh = 48, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
+         .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
        /* 114 - 3840x2160@48Hz 16:9 */
        { DRM_MODE("3840x2160", DRM_MODE_TYPE_DRIVER, 594000, 3840, 5116,
                   5204, 5500, 0, 2160, 2168, 2178, 2250, 0,
                   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
-         .vrefresh = 48, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
+         .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
        /* 115 - 4096x2160@48Hz 256:135 */
        { DRM_MODE("4096x2160", DRM_MODE_TYPE_DRIVER, 594000, 4096, 5116,
                   5204, 5500, 0, 2160, 2168, 2178, 2250, 0,
                   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
-         .vrefresh = 48, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_256_135, },
+         .picture_aspect_ratio = HDMI_PICTURE_ASPECT_256_135, },
        /* 116 - 3840x2160@48Hz 64:27 */
        { DRM_MODE("3840x2160", DRM_MODE_TYPE_DRIVER, 594000, 3840, 5116,
                   5204, 5500, 0, 2160, 2168, 2178, 2250, 0,
                   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
-         .vrefresh = 48, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
+         .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
        /* 117 - 3840x2160@100Hz 16:9 */
        { DRM_MODE("3840x2160", DRM_MODE_TYPE_DRIVER, 1188000, 3840, 4896,
                   4984, 5280, 0, 2160, 2168, 2178, 2250, 0,
                   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
-         .vrefresh = 100, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
+         .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
        /* 118 - 3840x2160@120Hz 16:9 */
        { DRM_MODE("3840x2160", DRM_MODE_TYPE_DRIVER, 1188000, 3840, 4016,
                   4104, 4400, 0, 2160, 2168, 2178, 2250, 0,
                   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
-         .vrefresh = 120, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
+         .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
        /* 119 - 3840x2160@100Hz 64:27 */
        { DRM_MODE("3840x2160", DRM_MODE_TYPE_DRIVER, 1188000, 3840, 4896,
                   4984, 5280, 0, 2160, 2168, 2178, 2250, 0,
                   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
-         .vrefresh = 100, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
+         .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
        /* 120 - 3840x2160@120Hz 64:27 */
        { DRM_MODE("3840x2160", DRM_MODE_TYPE_DRIVER, 1188000, 3840, 4016,
                   4104, 4400, 0, 2160, 2168, 2178, 2250, 0,
                   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
-         .vrefresh = 120, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
+         .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
        /* 121 - 5120x2160@24Hz 64:27 */
        { DRM_MODE("5120x2160", DRM_MODE_TYPE_DRIVER, 396000, 5120, 7116,
                   7204, 7500, 0, 2160, 2168, 2178, 2200, 0,
                   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
-         .vrefresh = 24, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
+         .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
        /* 122 - 5120x2160@25Hz 64:27 */
        { DRM_MODE("5120x2160", DRM_MODE_TYPE_DRIVER, 396000, 5120, 6816,
                   6904, 7200, 0, 2160, 2168, 2178, 2200, 0,
                   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
-         .vrefresh = 25, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
+         .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
        /* 123 - 5120x2160@30Hz 64:27 */
        { DRM_MODE("5120x2160", DRM_MODE_TYPE_DRIVER, 396000, 5120, 5784,
                   5872, 6000, 0, 2160, 2168, 2178, 2200, 0,
                   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
-         .vrefresh = 30, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
+         .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
        /* 124 - 5120x2160@48Hz 64:27 */
        { DRM_MODE("5120x2160", DRM_MODE_TYPE_DRIVER, 742500, 5120, 5866,
                   5954, 6250, 0, 2160, 2168, 2178, 2475, 0,
                   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
-         .vrefresh = 48, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
+         .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
        /* 125 - 5120x2160@50Hz 64:27 */
        { DRM_MODE("5120x2160", DRM_MODE_TYPE_DRIVER, 742500, 5120, 6216,
                   6304, 6600, 0, 2160, 2168, 2178, 2250, 0,
                   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
-         .vrefresh = 50, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
+         .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
        /* 126 - 5120x2160@60Hz 64:27 */
        { DRM_MODE("5120x2160", DRM_MODE_TYPE_DRIVER, 742500, 5120, 5284,
                   5372, 5500, 0, 2160, 2168, 2178, 2250, 0,
                   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
-         .vrefresh = 60, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
+         .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
        /* 127 - 5120x2160@100Hz 64:27 */
        { DRM_MODE("5120x2160", DRM_MODE_TYPE_DRIVER, 1485000, 5120, 6216,
                   6304, 6600, 0, 2160, 2168, 2178, 2250, 0,
                   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
-         .vrefresh = 100, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
+         .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
  };
  
  /*
@@@ -1388,137 -1387,137 +1388,137 @@@ static const struct drm_display_mode ed
        { DRM_MODE("5120x2160", DRM_MODE_TYPE_DRIVER, 1485000, 5120, 5284,
                   5372, 5500, 0, 2160, 2168, 2178, 2250, 0,
                   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
-         .vrefresh = 120, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
+         .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
        /* 194 - 7680x4320@24Hz 16:9 */
        { DRM_MODE("7680x4320", DRM_MODE_TYPE_DRIVER, 1188000, 7680, 10232,
                   10408, 11000, 0, 4320, 4336, 4356, 4500, 0,
                   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
-         .vrefresh = 24, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
+         .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
        /* 195 - 7680x4320@25Hz 16:9 */
        { DRM_MODE("7680x4320", DRM_MODE_TYPE_DRIVER, 1188000, 7680, 10032,
                   10208, 10800, 0, 4320, 4336, 4356, 4400, 0,
                   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
-         .vrefresh = 25, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
+         .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
        /* 196 - 7680x4320@30Hz 16:9 */
        { DRM_MODE("7680x4320", DRM_MODE_TYPE_DRIVER, 1188000, 7680, 8232,
                   8408, 9000, 0, 4320, 4336, 4356, 4400, 0,
                   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
-         .vrefresh = 30, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
+         .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
        /* 197 - 7680x4320@48Hz 16:9 */
        { DRM_MODE("7680x4320", DRM_MODE_TYPE_DRIVER, 2376000, 7680, 10232,
                   10408, 11000, 0, 4320, 4336, 4356, 4500, 0,
                   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
-         .vrefresh = 48, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
+         .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
        /* 198 - 7680x4320@50Hz 16:9 */
        { DRM_MODE("7680x4320", DRM_MODE_TYPE_DRIVER, 2376000, 7680, 10032,
                   10208, 10800, 0, 4320, 4336, 4356, 4400, 0,
                   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
-         .vrefresh = 50, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
+         .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
        /* 199 - 7680x4320@60Hz 16:9 */
        { DRM_MODE("7680x4320", DRM_MODE_TYPE_DRIVER, 2376000, 7680, 8232,
                   8408, 9000, 0, 4320, 4336, 4356, 4400, 0,
                   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
-         .vrefresh = 60, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
+         .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
        /* 200 - 7680x4320@100Hz 16:9 */
        { DRM_MODE("7680x4320", DRM_MODE_TYPE_DRIVER, 4752000, 7680, 9792,
                   9968, 10560, 0, 4320, 4336, 4356, 4500, 0,
                   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
-         .vrefresh = 100, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
+         .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
        /* 201 - 7680x4320@120Hz 16:9 */
        { DRM_MODE("7680x4320", DRM_MODE_TYPE_DRIVER, 4752000, 7680, 8032,
                   8208, 8800, 0, 4320, 4336, 4356, 4500, 0,
                   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
-         .vrefresh = 120, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
+         .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
        /* 202 - 7680x4320@24Hz 64:27 */
        { DRM_MODE("7680x4320", DRM_MODE_TYPE_DRIVER, 1188000, 7680, 10232,
                   10408, 11000, 0, 4320, 4336, 4356, 4500, 0,
                   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
-         .vrefresh = 24, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
+         .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
        /* 203 - 7680x4320@25Hz 64:27 */
        { DRM_MODE("7680x4320", DRM_MODE_TYPE_DRIVER, 1188000, 7680, 10032,
                   10208, 10800, 0, 4320, 4336, 4356, 4400, 0,
                   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
-         .vrefresh = 25, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
+         .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
        /* 204 - 7680x4320@30Hz 64:27 */
        { DRM_MODE("7680x4320", DRM_MODE_TYPE_DRIVER, 1188000, 7680, 8232,
                   8408, 9000, 0, 4320, 4336, 4356, 4400, 0,
                   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
-         .vrefresh = 30, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
+         .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
        /* 205 - 7680x4320@48Hz 64:27 */
        { DRM_MODE("7680x4320", DRM_MODE_TYPE_DRIVER, 2376000, 7680, 10232,
                   10408, 11000, 0, 4320, 4336, 4356, 4500, 0,
                   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
-         .vrefresh = 48, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
+         .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
        /* 206 - 7680x4320@50Hz 64:27 */
        { DRM_MODE("7680x4320", DRM_MODE_TYPE_DRIVER, 2376000, 7680, 10032,
                   10208, 10800, 0, 4320, 4336, 4356, 4400, 0,
                   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
-         .vrefresh = 50, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
+         .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
        /* 207 - 7680x4320@60Hz 64:27 */
        { DRM_MODE("7680x4320", DRM_MODE_TYPE_DRIVER, 2376000, 7680, 8232,
                   8408, 9000, 0, 4320, 4336, 4356, 4400, 0,
                   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
-         .vrefresh = 60, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
+         .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
        /* 208 - 7680x4320@100Hz 64:27 */
        { DRM_MODE("7680x4320", DRM_MODE_TYPE_DRIVER, 4752000, 7680, 9792,
                   9968, 10560, 0, 4320, 4336, 4356, 4500, 0,
                   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
-         .vrefresh = 100, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
+         .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
        /* 209 - 7680x4320@120Hz 64:27 */
        { DRM_MODE("7680x4320", DRM_MODE_TYPE_DRIVER, 4752000, 7680, 8032,
                   8208, 8800, 0, 4320, 4336, 4356, 4500, 0,
                   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
-         .vrefresh = 120, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
+         .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
        /* 210 - 10240x4320@24Hz 64:27 */
        { DRM_MODE("10240x4320", DRM_MODE_TYPE_DRIVER, 1485000, 10240, 11732,
                   11908, 12500, 0, 4320, 4336, 4356, 4950, 0,
                   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
-         .vrefresh = 24, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
+         .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
        /* 211 - 10240x4320@25Hz 64:27 */
        { DRM_MODE("10240x4320", DRM_MODE_TYPE_DRIVER, 1485000, 10240, 12732,
                   12908, 13500, 0, 4320, 4336, 4356, 4400, 0,
                   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
-         .vrefresh = 25, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
+         .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
        /* 212 - 10240x4320@30Hz 64:27 */
        { DRM_MODE("10240x4320", DRM_MODE_TYPE_DRIVER, 1485000, 10240, 10528,
                   10704, 11000, 0, 4320, 4336, 4356, 4500, 0,
                   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
-         .vrefresh = 30, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
+         .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
        /* 213 - 10240x4320@48Hz 64:27 */
        { DRM_MODE("10240x4320", DRM_MODE_TYPE_DRIVER, 2970000, 10240, 11732,
                   11908, 12500, 0, 4320, 4336, 4356, 4950, 0,
                   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
-         .vrefresh = 48, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
+         .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
        /* 214 - 10240x4320@50Hz 64:27 */
        { DRM_MODE("10240x4320", DRM_MODE_TYPE_DRIVER, 2970000, 10240, 12732,
                   12908, 13500, 0, 4320, 4336, 4356, 4400, 0,
                   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
-         .vrefresh = 50, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
+         .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
        /* 215 - 10240x4320@60Hz 64:27 */
        { DRM_MODE("10240x4320", DRM_MODE_TYPE_DRIVER, 2970000, 10240, 10528,
                   10704, 11000, 0, 4320, 4336, 4356, 4500, 0,
                   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
-         .vrefresh = 60, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
+         .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
        /* 216 - 10240x4320@100Hz 64:27 */
        { DRM_MODE("10240x4320", DRM_MODE_TYPE_DRIVER, 5940000, 10240, 12432,
                   12608, 13200, 0, 4320, 4336, 4356, 4500, 0,
                   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
-         .vrefresh = 100, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
+         .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
        /* 217 - 10240x4320@120Hz 64:27 */
        { DRM_MODE("10240x4320", DRM_MODE_TYPE_DRIVER, 5940000, 10240, 10528,
                   10704, 11000, 0, 4320, 4336, 4356, 4500, 0,
                   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
-         .vrefresh = 120, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
+         .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
        /* 218 - 4096x2160@100Hz 256:135 */
        { DRM_MODE("4096x2160", DRM_MODE_TYPE_DRIVER, 1188000, 4096, 4896,
                   4984, 5280, 0, 2160, 2168, 2178, 2250, 0,
                   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
-         .vrefresh = 100, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_256_135, },
+         .picture_aspect_ratio = HDMI_PICTURE_ASPECT_256_135, },
        /* 219 - 4096x2160@120Hz 256:135 */
        { DRM_MODE("4096x2160", DRM_MODE_TYPE_DRIVER, 1188000, 4096, 4184,
                   4272, 4400, 0, 2160, 2168, 2178, 2250, 0,
                   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
-         .vrefresh = 120, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_256_135, },
+         .picture_aspect_ratio = HDMI_PICTURE_ASPECT_256_135, },
  };
  
  /*
@@@ -1532,25 -1531,25 +1532,25 @@@ static const struct drm_display_mode ed
                   3840, 4016, 4104, 4400, 0,
                   2160, 2168, 2178, 2250, 0,
                   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
-         .vrefresh = 30, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
+         .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
        /* 2 - 3840x2160@25Hz */
        { DRM_MODE("3840x2160", DRM_MODE_TYPE_DRIVER, 297000,
                   3840, 4896, 4984, 5280, 0,
                   2160, 2168, 2178, 2250, 0,
                   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
-         .vrefresh = 25, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
+         .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
        /* 3 - 3840x2160@24Hz */
        { DRM_MODE("3840x2160", DRM_MODE_TYPE_DRIVER, 297000,
                   3840, 5116, 5204, 5500, 0,
                   2160, 2168, 2178, 2250, 0,
                   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
-         .vrefresh = 24, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
+         .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
        /* 4 - 4096x2160@24Hz (SMPTE) */
        { DRM_MODE("4096x2160", DRM_MODE_TYPE_DRIVER, 297000,
                   4096, 5116, 5204, 5500, 0,
                   2160, 2168, 2178, 2250, 0,
                   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
-         .vrefresh = 24, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_256_135, },
+         .picture_aspect_ratio = HDMI_PICTURE_ASPECT_256_135, },
  };
  
  /*** DDC fetch and block validation ***/
@@@ -2146,10 -2145,8 +2146,8 @@@ static void edid_fixup_preferred(struc
                if (MODE_SIZE(cur_mode) > MODE_SIZE(preferred_mode))
                        preferred_mode = cur_mode;
  
-               cur_vrefresh = cur_mode->vrefresh ?
-                       cur_mode->vrefresh : drm_mode_vrefresh(cur_mode);
-               preferred_vrefresh = preferred_mode->vrefresh ?
-                       preferred_mode->vrefresh : drm_mode_vrefresh(preferred_mode);
+               cur_vrefresh = drm_mode_vrefresh(cur_mode);
+               preferred_vrefresh = drm_mode_vrefresh(preferred_mode);
                /* At a given size, try to get closest to target refresh */
                if ((MODE_SIZE(cur_mode) == MODE_SIZE(preferred_mode)) &&
                    MODE_REFRESH_DIFF(cur_vrefresh, target_refresh) <
@@@ -2654,7 -2651,6 +2652,6 @@@ set_size
        }
  
        mode->type = DRM_MODE_TYPE_DRIVER;
-       mode->vrefresh = drm_mode_vrefresh(mode);
        drm_mode_set_name(mode);
  
        return mode;
@@@ -3299,7 -3295,7 +3296,7 @@@ cea_mode_alternate_clock(const struct d
  {
        unsigned int clock = cea_mode->clock;
  
-       if (cea_mode->vrefresh % 6 != 0)
+       if (drm_mode_vrefresh(cea_mode) % 6 != 0)
                return clock;
  
        /*
@@@ -3626,8 -3622,6 +3623,6 @@@ drm_display_mode_from_vic_index(struct 
        if (!newmode)
                return NULL;
  
-       newmode->vrefresh = 0;
        return newmode;
  }
  
@@@ -5129,7 -5123,7 +5124,7 @@@ static struct drm_display_mode *drm_mod
        struct drm_display_mode *mode;
        unsigned pixel_clock = (timings->pixel_clock[0] |
                                (timings->pixel_clock[1] << 8) |
 -                              (timings->pixel_clock[2] << 16));
 +                              (timings->pixel_clock[2] << 16)) + 1;
        unsigned hactive = (timings->hactive[0] | timings->hactive[1] << 8) + 1;
        unsigned hblank = (timings->hblank[0] | timings->hblank[1] << 8) + 1;
        unsigned hsync = (timings->hsync[0] | (timings->hsync[1] & 0x7f) << 8) + 1;
  
        if (timings->flags & 0x80)
                mode->type |= DRM_MODE_TYPE_PREFERRED;
-       mode->vrefresh = drm_mode_vrefresh(mode);
        drm_mode_set_name(mode);
  
        return mode;
@@@ -253,8 -253,8 +253,8 @@@ void drm_file_free(struct drm_file *fil
  
        dev = file->minor->dev;
  
-       DRM_DEBUG("pid = %d, device = 0x%lx, open_count = %d\n",
-                 task_pid_nr(current),
+       DRM_DEBUG("comm=\"%s\", pid=%d, dev=0x%lx, open_count=%d\n",
+                 current->comm, task_pid_nr(current),
                  (long)old_encode_dev(file->minor->kdev->devt),
                  atomic_read(&dev->open_count));
  
@@@ -342,10 -342,12 +342,12 @@@ static int drm_open_helper(struct file 
                return -EBUSY;  /* No exclusive opens */
        if (!drm_cpu_valid())
                return -EINVAL;
-       if (dev->switch_power_state != DRM_SWITCH_POWER_ON && dev->switch_power_state != DRM_SWITCH_POWER_DYNAMIC_OFF)
+       if (dev->switch_power_state != DRM_SWITCH_POWER_ON &&
+           dev->switch_power_state != DRM_SWITCH_POWER_DYNAMIC_OFF)
                return -EINVAL;
  
-       DRM_DEBUG("pid = %d, minor = %d\n", task_pid_nr(current), minor->index);
+       DRM_DEBUG("comm=\"%s\", pid=%d, minor=%d\n", current->comm,
+                 task_pid_nr(current), minor->index);
  
        priv = drm_file_alloc(minor);
        if (IS_ERR(priv))
@@@ -569,6 -571,9 +571,6 @@@ ssize_t drm_read(struct file *filp, cha
        struct drm_device *dev = file_priv->minor->dev;
        ssize_t ret;
  
 -      if (!access_ok(buffer, count))
 -              return -EFAULT;
 -
        ret = mutex_lock_interruptible(&file_priv->event_read_lock);
        if (ret)
                return ret;
@@@ -741,7 -741,7 +741,7 @@@ static const struct drm_ioctl_desc drm_
   *     };
   *
   * Please make sure that you follow all the best practices from
 - * ``Documentation/ioctl/botching-up-ioctls.rst``. Note that drm_ioctl()
 + * ``Documentation/process/botching-up-ioctls.rst``. Note that drm_ioctl()
   * automatically zero-extends structures, hence make sure you can add more stuff
   * at the end, i.e. don't put a variable sized array there.
   *
@@@ -852,8 -852,8 +852,8 @@@ long drm_ioctl(struct file *filp
                out_size = 0;
        ksize = max(max(in_size, out_size), drv_size);
  
-       DRM_DEBUG("pid=%d, dev=0x%lx, auth=%d, %s\n",
-                 task_pid_nr(current),
+       DRM_DEBUG("comm=\"%s\" pid=%d, dev=0x%lx, auth=%d, %s\n",
+                 current->comm, task_pid_nr(current),
                  (long)old_encode_dev(file_priv->minor->kdev->devt),
                  file_priv->authenticated, ioctl->name);
  
  
        err_i1:
        if (!ioctl)
-               DRM_DEBUG("invalid ioctl: pid=%d, dev=0x%lx, auth=%d, cmd=0x%02x, nr=0x%02x\n",
-                         task_pid_nr(current),
+               DRM_DEBUG("invalid ioctl: comm=\"%s\", pid=%d, dev=0x%lx, auth=%d, cmd=0x%02x, nr=0x%02x\n",
+                         current->comm, task_pid_nr(current),
                          (long)old_encode_dev(file_priv->minor->kdev->devt),
                          file_priv->authenticated, cmd, nr);
  
        if (kdata != stack_kdata)
                kfree(kdata);
        if (retcode)
-               DRM_DEBUG("pid=%d, ret = %d\n", task_pid_nr(current), retcode);
+               DRM_DEBUG("comm=\"%s\", pid=%d, ret=%d\n", current->comm,
+                         task_pid_nr(current), retcode);
        return retcode;
  }
  EXPORT_SYMBOL(drm_ioctl);
diff --combined drivers/gpu/drm/drm_vm.c
@@@ -37,7 -37,6 +37,7 @@@
  #include <linux/pci.h>
  #include <linux/seq_file.h>
  #include <linux/vmalloc.h>
 +#include <linux/pgtable.h>
  
  #if defined(__ia64__)
  #include <linux/efi.h>
  #endif
  #include <linux/mem_encrypt.h>
  
 -#include <asm/pgtable.h>
  
  #include <drm/drm_agpsupport.h>
  #include <drm/drm_device.h>
  #include <drm/drm_drv.h>
  #include <drm/drm_file.h>
  #include <drm/drm_framebuffer.h>
- #include <drm/drm_gem.h>
  #include <drm/drm_print.h>
  
  #include "drm_internal.h"
@@@ -289,7 -289,7 +289,7 @@@ static int etnaviv_ioctl_gem_cpu_prep(s
  
        ret = etnaviv_gem_cpu_prep(obj, args->op, &args->timeout);
  
-       drm_gem_object_put_unlocked(obj);
+       drm_gem_object_put(obj);
  
        return ret;
  }
@@@ -310,7 -310,7 +310,7 @@@ static int etnaviv_ioctl_gem_cpu_fini(s
  
        ret = etnaviv_gem_cpu_fini(obj);
  
-       drm_gem_object_put_unlocked(obj);
+       drm_gem_object_put(obj);
  
        return ret;
  }
@@@ -330,7 -330,7 +330,7 @@@ static int etnaviv_ioctl_gem_info(struc
                return -ENOENT;
  
        ret = etnaviv_gem_mmap_offset(obj, &args->offset);
-       drm_gem_object_put_unlocked(obj);
+       drm_gem_object_put(obj);
  
        return ret;
  }
@@@ -413,7 -413,7 +413,7 @@@ static int etnaviv_ioctl_gem_wait(struc
  
        ret = etnaviv_gem_wait_bo(gpu, obj, timeout);
  
-       drm_gem_object_put_unlocked(obj);
+       drm_gem_object_put(obj);
  
        return ret;
  }
@@@ -726,7 -726,7 +726,7 @@@ static void __exit etnaviv_exit(void
  module_exit(etnaviv_exit);
  
  MODULE_AUTHOR("Christian Gmeiner <christian.gmeiner@gmail.com>");
 -MODULE_AUTHOR("Russell King <rmk+kernel@arm.linux.org.uk>");
 +MODULE_AUTHOR("Russell King <rmk+kernel@armlinux.org.uk>");
  MODULE_AUTHOR("Lucas Stach <l.stach@pengutronix.de>");
  MODULE_DESCRIPTION("etnaviv DRM Driver");
  MODULE_LICENSE("GPL v2");
@@@ -244,7 -244,7 +244,7 @@@ void etnaviv_gem_mapping_unreference(st
        mapping->use -= 1;
        mutex_unlock(&etnaviv_obj->lock);
  
-       drm_gem_object_put_unlocked(&etnaviv_obj->base);
+       drm_gem_object_put(&etnaviv_obj->base);
  }
  
  struct etnaviv_vram_mapping *etnaviv_gem_mapping_get(
@@@ -633,7 -633,7 +633,7 @@@ int etnaviv_gem_new_handle(struct drm_d
  
        /* drop reference from allocate - handle holds it now */
  fail:
-       drm_gem_object_put_unlocked(obj);
+       drm_gem_object_put(obj);
  
        return ret;
  }
@@@ -661,7 -661,7 +661,7 @@@ static int etnaviv_gem_userptr_get_page
        struct etnaviv_gem_userptr *userptr = &etnaviv_obj->userptr;
        int ret, pinned = 0, npages = etnaviv_obj->base.size >> PAGE_SHIFT;
  
 -      might_lock_read(&current->mm->mmap_sem);
 +      might_lock_read(&current->mm->mmap_lock);
  
        if (userptr->mm != current->mm)
                return -EPERM;
@@@ -742,6 -742,6 +742,6 @@@ int etnaviv_gem_new_userptr(struct drm_
        ret = drm_gem_handle_create(file, &etnaviv_obj->base, handle);
  
        /* drop reference from allocate - handle holds it now */
-       drm_gem_object_put_unlocked(&etnaviv_obj->base);
+       drm_gem_object_put(&etnaviv_obj->base);
        return ret;
  }
@@@ -238,10 -238,8 +238,10 @@@ static int submit_pin_objects(struct et
                }
  
                if ((submit->flags & ETNA_SUBMIT_SOFTPIN) &&
 -                   submit->bos[i].va != mapping->iova)
 +                   submit->bos[i].va != mapping->iova) {
 +                      etnaviv_gem_mapping_unreference(mapping);
                        return -EINVAL;
 +              }
  
                atomic_inc(&etnaviv_obj->gpu_active);
  
@@@ -398,7 -396,7 +398,7 @@@ static void submit_cleanup(struct kref 
  
                /* if the GPU submit failed, objects might still be locked */
                submit_unlock_object(submit, i);
-               drm_gem_object_put_unlocked(&etnaviv_obj->base);
+               drm_gem_object_put(&etnaviv_obj->base);
        }
  
        wake_up_all(&submit->gpu->fence_event);
  #include "exynos_drm_drv.h"
  #include "exynos_drm_gem.h"
  
 -static int exynos_drm_alloc_buf(struct exynos_drm_gem *exynos_gem)
 +static int exynos_drm_alloc_buf(struct exynos_drm_gem *exynos_gem, bool kvmap)
  {
        struct drm_device *dev = exynos_gem->base.dev;
 -      unsigned long attr;
 -      unsigned int nr_pages;
 -      struct sg_table sgt;
 -      int ret = -ENOMEM;
 +      unsigned long attr = 0;
  
        if (exynos_gem->dma_addr) {
                DRM_DEV_DEBUG_KMS(to_dma_dev(dev), "already allocated.\n");
                return 0;
        }
  
 -      exynos_gem->dma_attrs = 0;
 -
        /*
         * if EXYNOS_BO_CONTIG, fully physically contiguous memory
         * region will be allocated else physically contiguous
         * as possible.
         */
        if (!(exynos_gem->flags & EXYNOS_BO_NONCONTIG))
 -              exynos_gem->dma_attrs |= DMA_ATTR_FORCE_CONTIGUOUS;
 +              attr |= DMA_ATTR_FORCE_CONTIGUOUS;
  
        /*
         * if EXYNOS_BO_WC or EXYNOS_BO_NONCACHABLE, writecombine mapping
         */
        if (exynos_gem->flags & EXYNOS_BO_WC ||
                        !(exynos_gem->flags & EXYNOS_BO_CACHABLE))
 -              attr = DMA_ATTR_WRITE_COMBINE;
 +              attr |= DMA_ATTR_WRITE_COMBINE;
        else
 -              attr = DMA_ATTR_NON_CONSISTENT;
 -
 -      exynos_gem->dma_attrs |= attr;
 -      exynos_gem->dma_attrs |= DMA_ATTR_NO_KERNEL_MAPPING;
 +              attr |= DMA_ATTR_NON_CONSISTENT;
  
 -      nr_pages = exynos_gem->size >> PAGE_SHIFT;
 -
 -      exynos_gem->pages = kvmalloc_array(nr_pages, sizeof(struct page *),
 -                      GFP_KERNEL | __GFP_ZERO);
 -      if (!exynos_gem->pages) {
 -              DRM_DEV_ERROR(to_dma_dev(dev), "failed to allocate pages.\n");
 -              return -ENOMEM;
 -      }
 +      /* FBDev emulation requires kernel mapping */
 +      if (!kvmap)
 +              attr |= DMA_ATTR_NO_KERNEL_MAPPING;
  
 +      exynos_gem->dma_attrs = attr;
        exynos_gem->cookie = dma_alloc_attrs(to_dma_dev(dev), exynos_gem->size,
                                             &exynos_gem->dma_addr, GFP_KERNEL,
                                             exynos_gem->dma_attrs);
        if (!exynos_gem->cookie) {
                DRM_DEV_ERROR(to_dma_dev(dev), "failed to allocate buffer.\n");
 -              goto err_free;
 -      }
 -
 -      ret = dma_get_sgtable_attrs(to_dma_dev(dev), &sgt, exynos_gem->cookie,
 -                                  exynos_gem->dma_addr, exynos_gem->size,
 -                                  exynos_gem->dma_attrs);
 -      if (ret < 0) {
 -              DRM_DEV_ERROR(to_dma_dev(dev), "failed to get sgtable.\n");
 -              goto err_dma_free;
 -      }
 -
 -      if (drm_prime_sg_to_page_addr_arrays(&sgt, exynos_gem->pages, NULL,
 -                                           nr_pages)) {
 -              DRM_DEV_ERROR(to_dma_dev(dev), "invalid sgtable.\n");
 -              ret = -EINVAL;
 -              goto err_sgt_free;
 +              return -ENOMEM;
        }
  
 -      sg_free_table(&sgt);
 +      if (kvmap)
 +              exynos_gem->kvaddr = exynos_gem->cookie;
  
        DRM_DEV_DEBUG_KMS(to_dma_dev(dev), "dma_addr(0x%lx), size(0x%lx)\n",
                        (unsigned long)exynos_gem->dma_addr, exynos_gem->size);
 -
        return 0;
 -
 -err_sgt_free:
 -      sg_free_table(&sgt);
 -err_dma_free:
 -      dma_free_attrs(to_dma_dev(dev), exynos_gem->size, exynos_gem->cookie,
 -                     exynos_gem->dma_addr, exynos_gem->dma_attrs);
 -err_free:
 -      kvfree(exynos_gem->pages);
 -
 -      return ret;
  }
  
  static void exynos_drm_free_buf(struct exynos_drm_gem *exynos_gem)
        dma_free_attrs(to_dma_dev(dev), exynos_gem->size, exynos_gem->cookie,
                        (dma_addr_t)exynos_gem->dma_addr,
                        exynos_gem->dma_attrs);
 -
 -      kvfree(exynos_gem->pages);
  }
  
  static int exynos_drm_gem_handle_create(struct drm_gem_object *obj,
        DRM_DEV_DEBUG_KMS(to_dma_dev(obj->dev), "gem handle = 0x%x\n", *handle);
  
        /* drop reference from allocate - handle holds it now. */
-       drm_gem_object_put_unlocked(obj);
+       drm_gem_object_put(obj);
  
        return 0;
  }
@@@ -164,8 -203,7 +164,8 @@@ static struct exynos_drm_gem *exynos_dr
  
  struct exynos_drm_gem *exynos_drm_gem_create(struct drm_device *dev,
                                             unsigned int flags,
 -                                           unsigned long size)
 +                                           unsigned long size,
 +                                           bool kvmap)
  {
        struct exynos_drm_gem *exynos_gem;
        int ret;
        /* set memory type and cache attribute from user side. */
        exynos_gem->flags = flags;
  
 -      ret = exynos_drm_alloc_buf(exynos_gem);
 +      ret = exynos_drm_alloc_buf(exynos_gem, kvmap);
        if (ret < 0) {
                drm_gem_object_release(&exynos_gem->base);
                kfree(exynos_gem);
@@@ -216,7 -254,7 +216,7 @@@ int exynos_drm_gem_create_ioctl(struct 
        struct exynos_drm_gem *exynos_gem;
        int ret;
  
 -      exynos_gem = exynos_drm_gem_create(dev, args->flags, args->size);
 +      exynos_gem = exynos_drm_gem_create(dev, args->flags, args->size, false);
        if (IS_ERR(exynos_gem))
                return PTR_ERR(exynos_gem);
  
@@@ -295,7 -333,7 +295,7 @@@ int exynos_drm_gem_get_ioctl(struct drm
        args->flags = exynos_gem->flags;
        args->size = exynos_gem->size;
  
-       drm_gem_object_put_unlocked(obj);
+       drm_gem_object_put(obj);
  
        return 0;
  }
@@@ -327,7 -365,7 +327,7 @@@ int exynos_drm_gem_dumb_create(struct d
        else
                flags = EXYNOS_BO_CONTIG | EXYNOS_BO_WC;
  
 -      exynos_gem = exynos_drm_gem_create(dev, flags, args->size);
 +      exynos_gem = exynos_drm_gem_create(dev, flags, args->size, false);
        if (IS_ERR(exynos_gem)) {
                dev_warn(dev->dev, "FB allocation failed.\n");
                return PTR_ERR(exynos_gem);
        return 0;
  }
  
 -vm_fault_t exynos_drm_gem_fault(struct vm_fault *vmf)
 -{
 -      struct vm_area_struct *vma = vmf->vma;
 -      struct drm_gem_object *obj = vma->vm_private_data;
 -      struct exynos_drm_gem *exynos_gem = to_exynos_gem(obj);
 -      unsigned long pfn;
 -      pgoff_t page_offset;
 -
 -      page_offset = (vmf->address - vma->vm_start) >> PAGE_SHIFT;
 -
 -      if (page_offset >= (exynos_gem->size >> PAGE_SHIFT)) {
 -              DRM_ERROR("invalid page offset\n");
 -              return VM_FAULT_SIGBUS;
 -      }
 -
 -      pfn = page_to_pfn(exynos_gem->pages[page_offset]);
 -      return vmf_insert_mixed(vma, vmf->address,
 -                      __pfn_to_pfn_t(pfn, PFN_DEV));
 -}
 -
  static int exynos_drm_gem_mmap_obj(struct drm_gem_object *obj,
                                   struct vm_area_struct *vma)
  {
@@@ -404,24 -462,11 +404,24 @@@ struct drm_gem_object *exynos_drm_gem_p
  struct sg_table *exynos_drm_gem_prime_get_sg_table(struct drm_gem_object *obj)
  {
        struct exynos_drm_gem *exynos_gem = to_exynos_gem(obj);
 -      int npages;
 +      struct drm_device *drm_dev = obj->dev;
 +      struct sg_table *sgt;
 +      int ret;
  
 -      npages = exynos_gem->size >> PAGE_SHIFT;
 +      sgt = kzalloc(sizeof(*sgt), GFP_KERNEL);
 +      if (!sgt)
 +              return ERR_PTR(-ENOMEM);
  
 -      return drm_prime_pages_to_sg(exynos_gem->pages, npages);
 +      ret = dma_get_sgtable_attrs(to_dma_dev(drm_dev), sgt, exynos_gem->cookie,
 +                                  exynos_gem->dma_addr, exynos_gem->size,
 +                                  exynos_gem->dma_attrs);
 +      if (ret) {
 +              DRM_ERROR("failed to get sgtable, %d\n", ret);
 +              kfree(sgt);
 +              return ERR_PTR(ret);
 +      }
 +
 +      return sgt;
  }
  
  struct drm_gem_object *
@@@ -430,47 -475,52 +430,47 @@@ exynos_drm_gem_prime_import_sg_table(st
                                     struct sg_table *sgt)
  {
        struct exynos_drm_gem *exynos_gem;
 -      int npages;
 -      int ret;
 -
 -      exynos_gem = exynos_drm_gem_init(dev, attach->dmabuf->size);
 -      if (IS_ERR(exynos_gem)) {
 -              ret = PTR_ERR(exynos_gem);
 -              return ERR_PTR(ret);
 -      }
  
 -      exynos_gem->dma_addr = sg_dma_address(sgt->sgl);
 +      if (sgt->nents < 1)
 +              return ERR_PTR(-EINVAL);
  
 -      npages = exynos_gem->size >> PAGE_SHIFT;
 -      exynos_gem->pages = kvmalloc_array(npages, sizeof(struct page *), GFP_KERNEL);
 -      if (!exynos_gem->pages) {
 -              ret = -ENOMEM;
 -              goto err;
 +      /*
 +       * Check if the provided buffer has been mapped as contiguous
 +       * into DMA address space.
 +       */
 +      if (sgt->nents > 1) {
 +              dma_addr_t next_addr = sg_dma_address(sgt->sgl);
 +              struct scatterlist *s;
 +              unsigned int i;
 +
 +              for_each_sg(sgt->sgl, s, sgt->nents, i) {
 +                      if (!sg_dma_len(s))
 +                              break;
 +                      if (sg_dma_address(s) != next_addr) {
 +                              DRM_ERROR("buffer chunks must be mapped contiguously");
 +                              return ERR_PTR(-EINVAL);
 +                      }
 +                      next_addr = sg_dma_address(s) + sg_dma_len(s);
 +              }
        }
  
 -      ret = drm_prime_sg_to_page_addr_arrays(sgt, exynos_gem->pages, NULL,
 -                                             npages);
 -      if (ret < 0)
 -              goto err_free_large;
 -
 -      exynos_gem->sgt = sgt;
 +      exynos_gem = exynos_drm_gem_init(dev, attach->dmabuf->size);
 +      if (IS_ERR(exynos_gem))
 +              return ERR_CAST(exynos_gem);
  
 -      if (sgt->nents == 1) {
 -              /* always physically continuous memory if sgt->nents is 1. */
 -              exynos_gem->flags |= EXYNOS_BO_CONTIG;
 -      } else {
 -              /*
 -               * this case could be CONTIG or NONCONTIG type but for now
 -               * sets NONCONTIG.
 -               * TODO. we have to find a way that exporter can notify
 -               * the type of its own buffer to importer.
 -               */
 +      /*
 +       * Buffer has been mapped as contiguous into DMA address space,
 +       * but if there is IOMMU, it can be either CONTIG or NONCONTIG.
 +       * We assume a simplified logic below:
 +       */
 +      if (is_drm_iommu_supported(dev))
                exynos_gem->flags |= EXYNOS_BO_NONCONTIG;
 -      }
 +      else
 +              exynos_gem->flags |= EXYNOS_BO_CONTIG;
  
 +      exynos_gem->dma_addr = sg_dma_address(sgt->sgl);
 +      exynos_gem->sgt = sgt;
        return &exynos_gem->base;
 -
 -err_free_large:
 -      kvfree(exynos_gem->pages);
 -err:
 -      drm_gem_object_release(&exynos_gem->base);
 -      kfree(exynos_gem);
 -      return ERR_PTR(ret);
  }
  
  void *exynos_drm_gem_prime_vmap(struct drm_gem_object *obj)
   * @base: a gem object.
   *    - a new handle to this gem object would be created
   *    by drm_gem_handle_create().
 - * @buffer: a pointer to exynos_drm_gem_buffer object.
 - *    - contain the information to memory region allocated
 - *    by user request or at framebuffer creation.
 - *    continuous memory region allocated by user request
 - *    or at framebuffer creation.
   * @flags: indicate memory type to allocated buffer and cache attruibute.
   * @size: size requested from user, in bytes and this size is aligned
   *    in page unit.
   * @cookie: cookie returned by dma_alloc_attrs
 - * @kvaddr: kernel virtual address to allocated memory region.
 + * @kvaddr: kernel virtual address to allocated memory region (for fbdev)
   * @dma_addr: bus address(accessed by dma) to allocated memory region.
   *    - this address could be physical address without IOMMU and
   *    device address with IOMMU.
 - * @pages: Array of backing pages.
 + * @dma_attrs: attrs passed dma mapping framework
   * @sgt: Imported sg_table.
   *
   * P.S. this object would be transferred to user as kms_bo.handle so
@@@ -43,6 -48,7 +43,6 @@@ struct exynos_drm_gem 
        void __iomem            *kvaddr;
        dma_addr_t              dma_addr;
        unsigned long           dma_attrs;
 -      struct page             **pages;
        struct sg_table         *sgt;
  };
  
@@@ -52,8 -58,7 +52,8 @@@ void exynos_drm_gem_destroy(struct exyn
  /* create a new buffer with gem object */
  struct exynos_drm_gem *exynos_drm_gem_create(struct drm_device *dev,
                                             unsigned int flags,
 -                                           unsigned long size);
 +                                           unsigned long size,
 +                                           bool kvmap);
  
  /*
   * request gem object creation and buffer allocation as the size
@@@ -81,7 -86,7 +81,7 @@@ struct exynos_drm_gem *exynos_drm_gem_g
   */
  static inline void exynos_drm_gem_put(struct exynos_drm_gem *exynos_gem)
  {
-       drm_gem_object_put_unlocked(&exynos_gem->base);
+       drm_gem_object_put(&exynos_gem->base);
  }
  
  /* get buffer information to memory region allocated by gem. */
@@@ -96,6 -101,9 +96,6 @@@ int exynos_drm_gem_dumb_create(struct d
                               struct drm_device *dev,
                               struct drm_mode_create_dumb *args);
  
 -/* page fault handler and mmap fault address(virtual) to physical memory. */
 -vm_fault_t exynos_drm_gem_fault(struct vm_fault *vmf);
 -
  /* set vm_flags and we can change the vm attribute to other one at here. */
  int exynos_drm_gem_mmap(struct file *filp, struct vm_area_struct *vma);
  
@@@ -1046,7 -1046,7 +1046,7 @@@ static int mixer_mode_valid(struct exyn
        u32 w = mode->hdisplay, h = mode->vdisplay;
  
        DRM_DEV_DEBUG_KMS(ctx->dev, "xres=%d, yres=%d, refresh=%d, intl=%d\n",
-                         w, h, mode->vrefresh,
+                         w, h, drm_mode_vrefresh(mode),
                          !!(mode->flags & DRM_MODE_FLAG_INTERLACE));
  
        if (ctx->mxr_ver == MXR_VER_128_0_0_184)
@@@ -1244,11 -1244,9 +1244,11 @@@ static int mixer_probe(struct platform_
  
        platform_set_drvdata(pdev, ctx);
  
 +      pm_runtime_enable(dev);
 +
        ret = component_add(&pdev->dev, &mixer_component_ops);
 -      if (!ret)
 -              pm_runtime_enable(dev);
 +      if (ret)
 +              pm_runtime_disable(dev);
  
        return ret;
  }
@@@ -238,9 -238,9 +238,9 @@@ static void intel_update_czclk(struct d
                dev_priv->czclk_freq);
  }
  
 -static inline u32 /* units of 100MHz */
 -intel_fdi_link_freq(struct drm_i915_private *dev_priv,
 -                  const struct intel_crtc_state *pipe_config)
 +/* units of 100MHz */
 +static u32 intel_fdi_link_freq(struct drm_i915_private *dev_priv,
 +                             const struct intel_crtc_state *pipe_config)
  {
        if (HAS_DDI(dev_priv))
                return pipe_config->port_clock; /* SPLL */
@@@ -525,7 -525,7 +525,7 @@@ skl_wa_827(struct drm_i915_private *dev
                               intel_de_read(dev_priv, CLKGATE_DIS_PSL(pipe)) & ~(DUPS1_GATING_DIS | DUPS2_GATING_DIS));
  }
  
 -/* Wa_2006604312:icl */
 +/* Wa_2006604312:icl,ehl */
  static void
  icl_wa_scalerclkgating(struct drm_i915_private *dev_priv, enum pipe pipe,
                       bool enable)
@@@ -544,23 -544,17 +544,23 @@@ needs_modeset(const struct intel_crtc_s
        return drm_atomic_crtc_needs_modeset(&state->uapi);
  }
  
 -bool
 -is_trans_port_sync_mode(const struct intel_crtc_state *crtc_state)
 +static bool
 +is_trans_port_sync_slave(const struct intel_crtc_state *crtc_state)
  {
 -      return (crtc_state->master_transcoder != INVALID_TRANSCODER ||
 -              crtc_state->sync_mode_slaves_mask);
 +      return crtc_state->master_transcoder != INVALID_TRANSCODER;
  }
  
  static bool
 -is_trans_port_sync_slave(const struct intel_crtc_state *crtc_state)
 +is_trans_port_sync_master(const struct intel_crtc_state *crtc_state)
  {
 -      return crtc_state->master_transcoder != INVALID_TRANSCODER;
 +      return crtc_state->sync_mode_slaves_mask != 0;
 +}
 +
 +bool
 +is_trans_port_sync_mode(const struct intel_crtc_state *crtc_state)
 +{
 +      return is_trans_port_sync_master(crtc_state) ||
 +              is_trans_port_sync_slave(crtc_state);
  }
  
  /*
@@@ -626,43 -620,45 +626,43 @@@ int chv_calc_dpll_params(int refclk, st
        return clock->dot / 5;
  }
  
 -#define INTELPllInvalid(s)   do { /* DRM_DEBUG(s); */ return false; } while (0)
 -
  /*
   * Returns whether the given set of divisors are valid for a given refclk with
   * the given connectors.
   */
 -static bool intel_PLL_is_valid(struct drm_i915_private *dev_priv,
 +static bool intel_pll_is_valid(struct drm_i915_private *dev_priv,
                               const struct intel_limit *limit,
                               const struct dpll *clock)
  {
 -      if (clock->n   < limit->n.min   || limit->n.max   < clock->n)
 -              INTELPllInvalid("n out of range\n");
 -      if (clock->p1  < limit->p1.min  || limit->p1.max  < clock->p1)
 -              INTELPllInvalid("p1 out of range\n");
 -      if (clock->m2  < limit->m2.min  || limit->m2.max  < clock->m2)
 -              INTELPllInvalid("m2 out of range\n");
 -      if (clock->m1  < limit->m1.min  || limit->m1.max  < clock->m1)
 -              INTELPllInvalid("m1 out of range\n");
 +      if (clock->n < limit->n.min || limit->n.max < clock->n)
 +              return false;
 +      if (clock->p1 < limit->p1.min || limit->p1.max < clock->p1)
 +              return false;
 +      if (clock->m2 < limit->m2.min || limit->m2.max < clock->m2)
 +              return false;
 +      if (clock->m1 < limit->m1.min || limit->m1.max < clock->m1)
 +              return false;
  
        if (!IS_PINEVIEW(dev_priv) && !IS_VALLEYVIEW(dev_priv) &&
            !IS_CHERRYVIEW(dev_priv) && !IS_GEN9_LP(dev_priv))
                if (clock->m1 <= clock->m2)
 -                      INTELPllInvalid("m1 <= m2\n");
 +                      return false;
  
        if (!IS_VALLEYVIEW(dev_priv) && !IS_CHERRYVIEW(dev_priv) &&
            !IS_GEN9_LP(dev_priv)) {
                if (clock->p < limit->p.min || limit->p.max < clock->p)
 -                      INTELPllInvalid("p out of range\n");
 +                      return false;
                if (clock->m < limit->m.min || limit->m.max < clock->m)
 -                      INTELPllInvalid("m out of range\n");
 +                      return false;
        }
  
        if (clock->vco < limit->vco.min || limit->vco.max < clock->vco)
 -              INTELPllInvalid("vco out of range\n");
 +              return false;
        /* XXX: We may need to be checking "Dot clock" depending on the multiplier,
         * connector, etc., rather than just a single range.
         */
        if (clock->dot < limit->dot.min || limit->dot.max < clock->dot)
 -              INTELPllInvalid("dot out of range\n");
 +              return false;
  
        return true;
  }
@@@ -729,7 -725,7 +729,7 @@@ i9xx_find_best_dpll(const struct intel_
                                        int this_err;
  
                                        i9xx_calc_dpll_params(refclk, &clock);
 -                                      if (!intel_PLL_is_valid(to_i915(dev),
 +                                      if (!intel_pll_is_valid(to_i915(dev),
                                                                limit,
                                                                &clock))
                                                continue;
@@@ -785,7 -781,7 +785,7 @@@ pnv_find_best_dpll(const struct intel_l
                                        int this_err;
  
                                        pnv_calc_dpll_params(refclk, &clock);
 -                                      if (!intel_PLL_is_valid(to_i915(dev),
 +                                      if (!intel_pll_is_valid(to_i915(dev),
                                                                limit,
                                                                &clock))
                                                continue;
@@@ -846,7 -842,7 +846,7 @@@ g4x_find_best_dpll(const struct intel_l
                                        int this_err;
  
                                        i9xx_calc_dpll_params(refclk, &clock);
 -                                      if (!intel_PLL_is_valid(to_i915(dev),
 +                                      if (!intel_pll_is_valid(to_i915(dev),
                                                                limit,
                                                                &clock))
                                                continue;
@@@ -943,7 -939,7 +943,7 @@@ vlv_find_best_dpll(const struct intel_l
  
                                        vlv_calc_dpll_params(refclk, &clock);
  
 -                                      if (!intel_PLL_is_valid(to_i915(dev),
 +                                      if (!intel_pll_is_valid(to_i915(dev),
                                                                limit,
                                                                &clock))
                                                continue;
@@@ -1012,7 -1008,7 +1012,7 @@@ chv_find_best_dpll(const struct intel_l
  
                        chv_calc_dpll_params(refclk, &clock);
  
 -                      if (!intel_PLL_is_valid(to_i915(dev), limit, &clock))
 +                      if (!intel_pll_is_valid(to_i915(dev), limit, &clock))
                                continue;
  
                        if (!vlv_PLL_is_optimal(dev, target, &clock, best_clock,
@@@ -1973,16 -1969,16 +1973,16 @@@ static bool is_aux_plane(const struct d
  
  static int main_to_ccs_plane(const struct drm_framebuffer *fb, int main_plane)
  {
 -      WARN_ON(!is_ccs_modifier(fb->modifier) ||
 -              (main_plane && main_plane >= fb->format->num_planes / 2));
 +      drm_WARN_ON(fb->dev, !is_ccs_modifier(fb->modifier) ||
 +                  (main_plane && main_plane >= fb->format->num_planes / 2));
  
        return fb->format->num_planes / 2 + main_plane;
  }
  
  static int ccs_to_main_plane(const struct drm_framebuffer *fb, int ccs_plane)
  {
 -      WARN_ON(!is_ccs_modifier(fb->modifier) ||
 -              ccs_plane < fb->format->num_planes / 2);
 +      drm_WARN_ON(fb->dev, !is_ccs_modifier(fb->modifier) ||
 +                  ccs_plane < fb->format->num_planes / 2);
  
        return ccs_plane - fb->format->num_planes / 2;
  }
@@@ -2914,7 -2910,6 +2914,7 @@@ intel_fb_plane_get_subsampling(int *hsu
  static int
  intel_fb_check_ccs_xy(struct drm_framebuffer *fb, int ccs_plane, int x, int y)
  {
 +      struct drm_i915_private *i915 = to_i915(fb->dev);
        struct intel_framebuffer *intel_fb = to_intel_framebuffer(fb);
        int main_plane;
        int hsub, vsub;
         * x/y offsets must match between CCS and the main surface.
         */
        if (main_x != ccs_x || main_y != ccs_y) {
 -              DRM_DEBUG_KMS("Bad CCS x/y (main %d,%d ccs %d,%d) full (main %d,%d ccs %d,%d)\n",
 +              drm_dbg_kms(&i915->drm,
 +                            "Bad CCS x/y (main %d,%d ccs %d,%d) full (main %d,%d ccs %d,%d)\n",
                              main_x, main_y,
                              ccs_x, ccs_y,
                              intel_fb->normal[main_plane].x,
@@@ -2992,7 -2986,7 +2992,7 @@@ setup_fb_rotation(int plane, const stru
            fb->modifier != I915_FORMAT_MOD_Yf_TILED)
                return 0;
  
 -      if (WARN_ON(plane >= ARRAY_SIZE(rot_info->plane)))
 +      if (drm_WARN_ON(fb->dev, plane >= ARRAY_SIZE(rot_info->plane)))
                return 0;
  
        rot_info->plane[plane] = *plane_info;
@@@ -3342,8 -3336,6 +3342,8 @@@ int skl_format_to_fourcc(int format, bo
                return DRM_FORMAT_RGB565;
        case PLANE_CTL_FORMAT_NV12:
                return DRM_FORMAT_NV12;
 +      case PLANE_CTL_FORMAT_XYUV:
 +              return DRM_FORMAT_XYUV8888;
        case PLANE_CTL_FORMAT_P010:
                return DRM_FORMAT_P010;
        case PLANE_CTL_FORMAT_P012:
@@@ -4588,8 -4580,6 +4588,8 @@@ static u32 skl_plane_ctl_format(u32 pix
        case DRM_FORMAT_XRGB16161616F:
        case DRM_FORMAT_ARGB16161616F:
                return PLANE_CTL_FORMAT_XRGB_16161616F;
 +      case DRM_FORMAT_XYUV8888:
 +              return PLANE_CTL_FORMAT_XYUV;
        case DRM_FORMAT_YUYV:
                return PLANE_CTL_FORMAT_YUV422 | PLANE_CTL_YUV422_YUYV;
        case DRM_FORMAT_YVYU:
@@@ -5008,6 -4998,37 +5008,6 @@@ static void icl_set_pipe_chicken(struc
        intel_de_write(dev_priv, PIPE_CHICKEN(pipe), tmp);
  }
  
 -static void icl_enable_trans_port_sync(const struct intel_crtc_state *crtc_state)
 -{
 -      struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
 -      struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
 -      u32 trans_ddi_func_ctl2_val;
 -      u8 master_select;
 -
 -      /*
 -       * Configure the master select and enable Transcoder Port Sync for
 -       * Slave CRTCs transcoder.
 -       */
 -      if (crtc_state->master_transcoder == INVALID_TRANSCODER)
 -              return;
 -
 -      if (crtc_state->master_transcoder == TRANSCODER_EDP)
 -              master_select = 0;
 -      else
 -              master_select = crtc_state->master_transcoder + 1;
 -
 -      /* Set the master select bits for Tranascoder Port Sync */
 -      trans_ddi_func_ctl2_val = (PORT_SYNC_MODE_MASTER_SELECT(master_select) &
 -                                 PORT_SYNC_MODE_MASTER_SELECT_MASK) <<
 -              PORT_SYNC_MODE_MASTER_SELECT_SHIFT;
 -      /* Enable Transcoder Port Sync */
 -      trans_ddi_func_ctl2_val |= PORT_SYNC_MODE_ENABLE;
 -
 -      intel_de_write(dev_priv,
 -                     TRANS_DDI_FUNC_CTL2(crtc_state->cpu_transcoder),
 -                     trans_ddi_func_ctl2_val);
 -}
 -
  static void intel_fdi_normal_train(struct intel_crtc *crtc)
  {
        struct drm_device *dev = crtc->base.dev;
@@@ -6089,26 -6110,30 +6089,26 @@@ skl_update_scaler(struct intel_crtc_sta
        return 0;
  }
  
 -/**
 - * skl_update_scaler_crtc - Stages update to scaler state for a given crtc.
 - *
 - * @state: crtc's scaler state
 - *
 - * Return
 - *     0 - scaler_usage updated successfully
 - *    error - requested scaling cannot be supported or other error condition
 - */
 -int skl_update_scaler_crtc(struct intel_crtc_state *state)
 +static int skl_update_scaler_crtc(struct intel_crtc_state *crtc_state)
  {
 -      const struct drm_display_mode *adjusted_mode = &state->hw.adjusted_mode;
 -      bool need_scaler = false;
 +      const struct drm_display_mode *adjusted_mode =
 +              &crtc_state->hw.adjusted_mode;
 +      int width, height;
  
 -      if (state->output_format == INTEL_OUTPUT_FORMAT_YCBCR420 ||
 -          state->pch_pfit.enabled)
 -              need_scaler = true;
 +      if (crtc_state->pch_pfit.enabled) {
 +              width = drm_rect_width(&crtc_state->pch_pfit.dst);
 +              height = drm_rect_height(&crtc_state->pch_pfit.dst);
 +      } else {
 +              width = adjusted_mode->crtc_hdisplay;
 +              height = adjusted_mode->crtc_vdisplay;
 +      }
  
 -      return skl_update_scaler(state, !state->hw.active, SKL_CRTC_INDEX,
 -                               &state->scaler_state.scaler_id,
 -                               state->pipe_src_w, state->pipe_src_h,
 -                               adjusted_mode->crtc_hdisplay,
 -                               adjusted_mode->crtc_vdisplay, NULL, 0,
 -                               need_scaler);
 +      return skl_update_scaler(crtc_state, !crtc_state->hw.active,
 +                               SKL_CRTC_INDEX,
 +                               &crtc_state->scaler_state.scaler_id,
 +                               crtc_state->pipe_src_w, crtc_state->pipe_src_h,
 +                               width, height, NULL, 0,
 +                               crtc_state->pch_pfit.enabled);
  }
  
  /**
@@@ -6175,7 -6200,6 +6175,7 @@@ static int skl_update_scaler_plane(stru
        case DRM_FORMAT_UYVY:
        case DRM_FORMAT_VYUY:
        case DRM_FORMAT_NV12:
 +      case DRM_FORMAT_XYUV8888:
        case DRM_FORMAT_P010:
        case DRM_FORMAT_P012:
        case DRM_FORMAT_P016:
@@@ -6217,80 -6241,70 +6217,80 @@@ static void skl_pfit_enable(const struc
  {
        struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
        struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
 -      enum pipe pipe = crtc->pipe;
        const struct intel_crtc_scaler_state *scaler_state =
                &crtc_state->scaler_state;
 +      struct drm_rect src = {
 +              .x2 = crtc_state->pipe_src_w << 16,
 +              .y2 = crtc_state->pipe_src_h << 16,
 +      };
 +      const struct drm_rect *dst = &crtc_state->pch_pfit.dst;
 +      u16 uv_rgb_hphase, uv_rgb_vphase;
 +      enum pipe pipe = crtc->pipe;
 +      int width = drm_rect_width(dst);
 +      int height = drm_rect_height(dst);
 +      int x = dst->x1;
 +      int y = dst->y1;
 +      int hscale, vscale;
 +      unsigned long irqflags;
 +      int id;
  
 -      if (crtc_state->pch_pfit.enabled) {
 -              u16 uv_rgb_hphase, uv_rgb_vphase;
 -              int pfit_w, pfit_h, hscale, vscale;
 -              unsigned long irqflags;
 -              int id;
 -
 -              if (drm_WARN_ON(&dev_priv->drm,
 -                              crtc_state->scaler_state.scaler_id < 0))
 -                      return;
 +      if (!crtc_state->pch_pfit.enabled)
 +              return;
  
 -              pfit_w = (crtc_state->pch_pfit.size >> 16) & 0xFFFF;
 -              pfit_h = crtc_state->pch_pfit.size & 0xFFFF;
 +      if (drm_WARN_ON(&dev_priv->drm,
 +                      crtc_state->scaler_state.scaler_id < 0))
 +              return;
  
 -              hscale = (crtc_state->pipe_src_w << 16) / pfit_w;
 -              vscale = (crtc_state->pipe_src_h << 16) / pfit_h;
 +      hscale = drm_rect_calc_hscale(&src, dst, 0, INT_MAX);
 +      vscale = drm_rect_calc_vscale(&src, dst, 0, INT_MAX);
  
 -              uv_rgb_hphase = skl_scaler_calc_phase(1, hscale, false);
 -              uv_rgb_vphase = skl_scaler_calc_phase(1, vscale, false);
 +      uv_rgb_hphase = skl_scaler_calc_phase(1, hscale, false);
 +      uv_rgb_vphase = skl_scaler_calc_phase(1, vscale, false);
  
 -              id = scaler_state->scaler_id;
 +      id = scaler_state->scaler_id;
  
 -              spin_lock_irqsave(&dev_priv->uncore.lock, irqflags);
 +      spin_lock_irqsave(&dev_priv->uncore.lock, irqflags);
  
 -              intel_de_write_fw(dev_priv, SKL_PS_CTRL(pipe, id), PS_SCALER_EN |
 -                                PS_FILTER_MEDIUM | scaler_state->scalers[id].mode);
 -              intel_de_write_fw(dev_priv, SKL_PS_VPHASE(pipe, id),
 -                                PS_Y_PHASE(0) | PS_UV_RGB_PHASE(uv_rgb_vphase));
 -              intel_de_write_fw(dev_priv, SKL_PS_HPHASE(pipe, id),
 -                                PS_Y_PHASE(0) | PS_UV_RGB_PHASE(uv_rgb_hphase));
 -              intel_de_write_fw(dev_priv, SKL_PS_WIN_POS(pipe, id),
 -                                crtc_state->pch_pfit.pos);
 -              intel_de_write_fw(dev_priv, SKL_PS_WIN_SZ(pipe, id),
 -                                crtc_state->pch_pfit.size);
 +      intel_de_write_fw(dev_priv, SKL_PS_CTRL(pipe, id), PS_SCALER_EN |
 +                        PS_FILTER_MEDIUM | scaler_state->scalers[id].mode);
 +      intel_de_write_fw(dev_priv, SKL_PS_VPHASE(pipe, id),
 +                        PS_Y_PHASE(0) | PS_UV_RGB_PHASE(uv_rgb_vphase));
 +      intel_de_write_fw(dev_priv, SKL_PS_HPHASE(pipe, id),
 +                        PS_Y_PHASE(0) | PS_UV_RGB_PHASE(uv_rgb_hphase));
 +      intel_de_write_fw(dev_priv, SKL_PS_WIN_POS(pipe, id),
 +                        x << 16 | y);
 +      intel_de_write_fw(dev_priv, SKL_PS_WIN_SZ(pipe, id),
 +                        width << 16 | height);
  
 -              spin_unlock_irqrestore(&dev_priv->uncore.lock, irqflags);
 -      }
 +      spin_unlock_irqrestore(&dev_priv->uncore.lock, irqflags);
  }
  
  static void ilk_pfit_enable(const struct intel_crtc_state *crtc_state)
  {
        struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
        struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
 +      const struct drm_rect *dst = &crtc_state->pch_pfit.dst;
        enum pipe pipe = crtc->pipe;
 +      int width = drm_rect_width(dst);
 +      int height = drm_rect_height(dst);
 +      int x = dst->x1;
 +      int y = dst->y1;
  
 -      if (crtc_state->pch_pfit.enabled) {
 -              /* Force use of hard-coded filter coefficients
 -               * as some pre-programmed values are broken,
 -               * e.g. x201.
 -               */
 -              if (IS_IVYBRIDGE(dev_priv) || IS_HASWELL(dev_priv))
 -                      intel_de_write(dev_priv, PF_CTL(pipe),
 -                                     PF_ENABLE | PF_FILTER_MED_3x3 | PF_PIPE_SEL_IVB(pipe));
 -              else
 -                      intel_de_write(dev_priv, PF_CTL(pipe),
 -                                     PF_ENABLE | PF_FILTER_MED_3x3);
 -              intel_de_write(dev_priv, PF_WIN_POS(pipe),
 -                             crtc_state->pch_pfit.pos);
 -              intel_de_write(dev_priv, PF_WIN_SZ(pipe),
 -                             crtc_state->pch_pfit.size);
 -      }
 +      if (!crtc_state->pch_pfit.enabled)
 +              return;
 +
 +      /* Force use of hard-coded filter coefficients
 +       * as some pre-programmed values are broken,
 +       * e.g. x201.
 +       */
 +      if (IS_IVYBRIDGE(dev_priv) || IS_HASWELL(dev_priv))
 +              intel_de_write(dev_priv, PF_CTL(pipe), PF_ENABLE |
 +                             PF_FILTER_MED_3x3 | PF_PIPE_SEL_IVB(pipe));
 +      else
 +              intel_de_write(dev_priv, PF_CTL(pipe), PF_ENABLE |
 +                             PF_FILTER_MED_3x3);
 +      intel_de_write(dev_priv, PF_WIN_POS(pipe), x << 16 | y);
 +      intel_de_write(dev_priv, PF_WIN_SZ(pipe), width << 16 | height);
  }
  
  void hsw_enable_ips(const struct intel_crtc_state *crtc_state)
@@@ -6449,8 -6463,8 +6449,8 @@@ static bool needs_scalerclk_wa(const st
  {
        struct drm_i915_private *dev_priv = to_i915(crtc_state->uapi.crtc->dev);
  
 -      /* Wa_2006604312:icl */
 -      if (crtc_state->scaler_state.scaler_users > 0 && IS_ICELAKE(dev_priv))
 +      /* Wa_2006604312:icl,ehl */
 +      if (crtc_state->scaler_state.scaler_users > 0 && IS_GEN(dev_priv, 11))
                return true;
  
        return false;
@@@ -6520,7 -6534,7 +6520,7 @@@ static void intel_pre_plane_update(stru
            needs_nv12_wa(new_crtc_state))
                skl_wa_827(dev_priv, pipe, true);
  
 -      /* Wa_2006604312:icl */
 +      /* Wa_2006604312:icl,ehl */
        if (!needs_scalerclk_wa(old_crtc_state) &&
            needs_scalerclk_wa(new_crtc_state))
                icl_wa_scalerclkgating(dev_priv, pipe, true);
@@@ -6632,7 -6646,7 +6632,7 @@@ intel_connector_primary_encoder(struct 
                return &dp_to_dig_port(connector->mst_port)->base;
  
        encoder = intel_attached_encoder(connector);
 -      WARN_ON(!encoder);
 +      drm_WARN_ON(connector->base.dev, !encoder);
  
        return encoder;
  }
@@@ -6706,8 -6720,7 +6706,8 @@@ static void intel_encoders_pre_pll_enab
                        continue;
  
                if (encoder->pre_pll_enable)
 -                      encoder->pre_pll_enable(encoder, crtc_state, conn_state);
 +                      encoder->pre_pll_enable(state, encoder,
 +                                              crtc_state, conn_state);
        }
  }
  
@@@ -6728,8 -6741,7 +6728,8 @@@ static void intel_encoders_pre_enable(s
                        continue;
  
                if (encoder->pre_enable)
 -                      encoder->pre_enable(encoder, crtc_state, conn_state);
 +                      encoder->pre_enable(state, encoder,
 +                                          crtc_state, conn_state);
        }
  }
  
@@@ -6750,8 -6762,7 +6750,8 @@@ static void intel_encoders_enable(struc
                        continue;
  
                if (encoder->enable)
 -                      encoder->enable(encoder, crtc_state, conn_state);
 +                      encoder->enable(state, encoder,
 +                                      crtc_state, conn_state);
                intel_opregion_notify_encoder(encoder, true);
        }
  }
@@@ -6774,8 -6785,7 +6774,8 @@@ static void intel_encoders_disable(stru
  
                intel_opregion_notify_encoder(encoder, false);
                if (encoder->disable)
 -                      encoder->disable(encoder, old_crtc_state, old_conn_state);
 +                      encoder->disable(state, encoder,
 +                                       old_crtc_state, old_conn_state);
        }
  }
  
@@@ -6796,8 -6806,7 +6796,8 @@@ static void intel_encoders_post_disable
                        continue;
  
                if (encoder->post_disable)
 -                      encoder->post_disable(encoder, old_crtc_state, old_conn_state);
 +                      encoder->post_disable(state, encoder,
 +                                            old_crtc_state, old_conn_state);
        }
  }
  
@@@ -6818,8 -6827,7 +6818,8 @@@ static void intel_encoders_post_pll_dis
                        continue;
  
                if (encoder->post_pll_disable)
 -                      encoder->post_pll_disable(encoder, old_crtc_state, old_conn_state);
 +                      encoder->post_pll_disable(state, encoder,
 +                                                old_crtc_state, old_conn_state);
        }
  }
  
@@@ -6840,8 -6848,7 +6840,8 @@@ static void intel_encoders_update_pipe(
                        continue;
  
                if (encoder->update_pipe)
 -                      encoder->update_pipe(encoder, crtc_state, conn_state);
 +                      encoder->update_pipe(state, encoder,
 +                                           crtc_state, conn_state);
        }
  }
  
@@@ -7030,6 -7037,9 +7030,6 @@@ static void hsw_crtc_enable(struct inte
        if (!transcoder_is_dsi(cpu_transcoder))
                intel_set_pipe_timings(new_crtc_state);
  
 -      if (INTEL_GEN(dev_priv) >= 11)
 -              icl_enable_trans_port_sync(new_crtc_state);
 -
        intel_set_pipe_src_size(new_crtc_state);
  
        if (cpu_transcoder != TRANSCODER_EDP &&
        if (INTEL_GEN(dev_priv) >= 11)
                icl_set_pipe_chicken(crtc);
  
 -      if (!transcoder_is_dsi(cpu_transcoder))
 -              intel_ddi_enable_transcoder_func(new_crtc_state);
 -
        if (dev_priv->display.initial_watermarks)
                dev_priv->display.initial_watermarks(state, crtc);
  
@@@ -7107,12 -7120,11 +7107,12 @@@ void ilk_pfit_disable(const struct inte
  
        /* To avoid upsetting the power well on haswell only disable the pfit if
         * it's in use. The hw state code will make sure we get this right. */
 -      if (old_crtc_state->pch_pfit.enabled) {
 -              intel_de_write(dev_priv, PF_CTL(pipe), 0);
 -              intel_de_write(dev_priv, PF_WIN_POS(pipe), 0);
 -              intel_de_write(dev_priv, PF_WIN_SZ(pipe), 0);
 -      }
 +      if (!old_crtc_state->pch_pfit.enabled)
 +              return;
 +
 +      intel_de_write(dev_priv, PF_CTL(pipe), 0);
 +      intel_de_write(dev_priv, PF_WIN_POS(pipe), 0);
 +      intel_de_write(dev_priv, PF_WIN_SZ(pipe), 0);
  }
  
  static void ilk_crtc_disable(struct intel_atomic_state *state,
@@@ -7300,17 -7312,7 +7300,17 @@@ intel_aux_power_domain(struct intel_dig
                }
        }
  
 -      switch (dig_port->aux_ch) {
 +      return intel_legacy_aux_to_power_domain(dig_port->aux_ch);
 +}
 +
 +/*
 + * Converts aux_ch to power_domain without caring about TBT ports for that use
 + * intel_aux_power_domain()
 + */
 +enum intel_display_power_domain
 +intel_legacy_aux_to_power_domain(enum aux_ch aux_ch)
 +{
 +      switch (aux_ch) {
        case AUX_CH_A:
                return POWER_DOMAIN_AUX_A;
        case AUX_CH_B:
        case AUX_CH_G:
                return POWER_DOMAIN_AUX_G;
        default:
 -              MISSING_CASE(dig_port->aux_ch);
 +              MISSING_CASE(aux_ch);
                return POWER_DOMAIN_AUX_A;
        }
  }
@@@ -7940,36 -7942,39 +7940,36 @@@ static bool intel_crtc_supports_double_
                (crtc->pipe == PIPE_A || IS_I915G(dev_priv));
  }
  
 -static u32 ilk_pipe_pixel_rate(const struct intel_crtc_state *pipe_config)
 +static u32 ilk_pipe_pixel_rate(const struct intel_crtc_state *crtc_state)
  {
 -      u32 pixel_rate;
 -
 -      pixel_rate = pipe_config->hw.adjusted_mode.crtc_clock;
 +      u32 pixel_rate = crtc_state->hw.adjusted_mode.crtc_clock;
 +      unsigned int pipe_w, pipe_h, pfit_w, pfit_h;
  
        /*
         * We only use IF-ID interlacing. If we ever use
         * PF-ID we'll need to adjust the pixel_rate here.
         */
  
 -      if (pipe_config->pch_pfit.enabled) {
 -              u64 pipe_w, pipe_h, pfit_w, pfit_h;
 -              u32 pfit_size = pipe_config->pch_pfit.size;
 +      if (!crtc_state->pch_pfit.enabled)
 +              return pixel_rate;
  
 -              pipe_w = pipe_config->pipe_src_w;
 -              pipe_h = pipe_config->pipe_src_h;
 +      pipe_w = crtc_state->pipe_src_w;
 +      pipe_h = crtc_state->pipe_src_h;
  
 -              pfit_w = (pfit_size >> 16) & 0xFFFF;
 -              pfit_h = pfit_size & 0xFFFF;
 -              if (pipe_w < pfit_w)
 -                      pipe_w = pfit_w;
 -              if (pipe_h < pfit_h)
 -                      pipe_h = pfit_h;
 +      pfit_w = drm_rect_width(&crtc_state->pch_pfit.dst);
 +      pfit_h = drm_rect_height(&crtc_state->pch_pfit.dst);
  
 -              if (WARN_ON(!pfit_w || !pfit_h))
 -                      return pixel_rate;
 +      if (pipe_w < pfit_w)
 +              pipe_w = pfit_w;
 +      if (pipe_h < pfit_h)
 +              pipe_h = pfit_h;
  
 -              pixel_rate = div_u64(mul_u32_u32(pixel_rate, pipe_w * pipe_h),
 -                                   pfit_w * pfit_h);
 -      }
 +      if (drm_WARN_ON(crtc_state->uapi.crtc->dev,
 +                      !pfit_w || !pfit_h))
 +              return pixel_rate;
  
 -      return pixel_rate;
 +      return div_u64(mul_u32_u32(pixel_rate, pipe_w * pipe_h),
 +                     pfit_w * pfit_h);
  }
  
  static void intel_crtc_compute_pixel_rate(struct intel_crtc_state *crtc_state)
@@@ -8138,7 -8143,7 +8138,7 @@@ static void intel_panel_sanitize_ssc(st
        }
  }
  
 -static inline bool intel_panel_use_ssc(struct drm_i915_private *dev_priv)
 +static bool intel_panel_use_ssc(struct drm_i915_private *dev_priv)
  {
        if (i915_modparams.panel_use_ssc >= 0)
                return i915_modparams.panel_use_ssc != 0;
@@@ -8886,7 -8891,6 +8886,6 @@@ void intel_mode_from_pipe_config(struc
  
        mode->clock = pipe_config->hw.adjusted_mode.crtc_clock;
  
-       mode->vrefresh = drm_mode_vrefresh(mode);
        drm_mode_set_name(mode);
  }
  
@@@ -9162,9 -9166,9 +9161,9 @@@ static bool i9xx_has_pfit(struct drm_i9
                IS_PINEVIEW(dev_priv) || IS_MOBILE(dev_priv);
  }
  
 -static void i9xx_get_pfit_config(struct intel_crtc *crtc,
 -                               struct intel_crtc_state *pipe_config)
 +static void i9xx_get_pfit_config(struct intel_crtc_state *crtc_state)
  {
 +      struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
        struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
        u32 tmp;
  
                        return;
        }
  
 -      pipe_config->gmch_pfit.control = tmp;
 -      pipe_config->gmch_pfit.pgm_ratios = intel_de_read(dev_priv,
 -                                                        PFIT_PGM_RATIOS);
 +      crtc_state->gmch_pfit.control = tmp;
 +      crtc_state->gmch_pfit.pgm_ratios =
 +              intel_de_read(dev_priv, PFIT_PGM_RATIOS);
  }
  
  static void vlv_crtc_clock_get(struct intel_crtc *crtc,
@@@ -9392,6 -9396,7 +9391,6 @@@ static bool i9xx_get_pipe_config(struc
        pipe_config->output_format = INTEL_OUTPUT_FORMAT_RGB;
        pipe_config->cpu_transcoder = (enum transcoder) crtc->pipe;
        pipe_config->shared_dpll = NULL;
 -      pipe_config->master_transcoder = INVALID_TRANSCODER;
  
        ret = false;
  
        intel_get_pipe_timings(crtc, pipe_config);
        intel_get_pipe_src_size(crtc, pipe_config);
  
 -      i9xx_get_pfit_config(crtc, pipe_config);
 +      i9xx_get_pfit_config(pipe_config);
  
        if (INTEL_GEN(dev_priv) >= 4) {
                /* No way to read it out on pipes B and C */
@@@ -10406,47 -10411,37 +10405,47 @@@ static void ilk_get_fdi_m_n_config(stru
                                     &pipe_config->fdi_m_n, NULL);
  }
  
 -static void skl_get_pfit_config(struct intel_crtc *crtc,
 -                              struct intel_crtc_state *pipe_config)
 +static void ilk_get_pfit_pos_size(struct intel_crtc_state *crtc_state,
 +                                u32 pos, u32 size)
  {
 -      struct drm_device *dev = crtc->base.dev;
 -      struct drm_i915_private *dev_priv = to_i915(dev);
 -      struct intel_crtc_scaler_state *scaler_state = &pipe_config->scaler_state;
 -      u32 ps_ctrl = 0;
 +      drm_rect_init(&crtc_state->pch_pfit.dst,
 +                    pos >> 16, pos & 0xffff,
 +                    size >> 16, size & 0xffff);
 +}
 +
 +static void skl_get_pfit_config(struct intel_crtc_state *crtc_state)
 +{
 +      struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
 +      struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
 +      struct intel_crtc_scaler_state *scaler_state = &crtc_state->scaler_state;
        int id = -1;
        int i;
  
        /* find scaler attached to this pipe */
        for (i = 0; i < crtc->num_scalers; i++) {
 -              ps_ctrl = intel_de_read(dev_priv, SKL_PS_CTRL(crtc->pipe, i));
 -              if (ps_ctrl & PS_SCALER_EN && !(ps_ctrl & PS_PLANE_SEL_MASK)) {
 -                      id = i;
 -                      pipe_config->pch_pfit.enabled = true;
 -                      pipe_config->pch_pfit.pos = intel_de_read(dev_priv,
 -                                                                SKL_PS_WIN_POS(crtc->pipe, i));
 -                      pipe_config->pch_pfit.size = intel_de_read(dev_priv,
 -                                                                 SKL_PS_WIN_SZ(crtc->pipe, i));
 -                      scaler_state->scalers[i].in_use = true;
 -                      break;
 -              }
 +              u32 ctl, pos, size;
 +
 +              ctl = intel_de_read(dev_priv, SKL_PS_CTRL(crtc->pipe, i));
 +              if ((ctl & (PS_SCALER_EN | PS_PLANE_SEL_MASK)) != PS_SCALER_EN)
 +                      continue;
 +
 +              id = i;
 +              crtc_state->pch_pfit.enabled = true;
 +
 +              pos = intel_de_read(dev_priv, SKL_PS_WIN_POS(crtc->pipe, i));
 +              size = intel_de_read(dev_priv, SKL_PS_WIN_SZ(crtc->pipe, i));
 +
 +              ilk_get_pfit_pos_size(crtc_state, pos, size);
 +
 +              scaler_state->scalers[i].in_use = true;
 +              break;
        }
  
        scaler_state->scaler_id = id;
 -      if (id >= 0) {
 +      if (id >= 0)
                scaler_state->scaler_users |= (1 << SKL_CRTC_INDEX);
 -      } else {
 +      else
                scaler_state->scaler_users &= ~(1 << SKL_CRTC_INDEX);
 -      }
  }
  
  static void
        kfree(intel_fb);
  }
  
 -static void ilk_get_pfit_config(struct intel_crtc *crtc,
 -                              struct intel_crtc_state *pipe_config)
 +static void ilk_get_pfit_config(struct intel_crtc_state *crtc_state)
  {
 -      struct drm_device *dev = crtc->base.dev;
 -      struct drm_i915_private *dev_priv = to_i915(dev);
 -      u32 tmp;
 +      struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
 +      struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
 +      u32 ctl, pos, size;
  
 -      tmp = intel_de_read(dev_priv, PF_CTL(crtc->pipe));
 -
 -      if (tmp & PF_ENABLE) {
 -              pipe_config->pch_pfit.enabled = true;
 -              pipe_config->pch_pfit.pos = intel_de_read(dev_priv,
 -                                                        PF_WIN_POS(crtc->pipe));
 -              pipe_config->pch_pfit.size = intel_de_read(dev_priv,
 -                                                         PF_WIN_SZ(crtc->pipe));
 -
 -              /* We currently do not free assignements of panel fitters on
 -               * ivb/hsw (since we don't use the higher upscaling modes which
 -               * differentiates them) so just WARN about this case for now. */
 -              if (IS_GEN(dev_priv, 7)) {
 -                      drm_WARN_ON(dev, (tmp & PF_PIPE_SEL_MASK_IVB) !=
 -                                  PF_PIPE_SEL_IVB(crtc->pipe));
 -              }
 -      }
 +      ctl = intel_de_read(dev_priv, PF_CTL(crtc->pipe));
 +      if ((ctl & PF_ENABLE) == 0)
 +              return;
 +
 +      crtc_state->pch_pfit.enabled = true;
 +
 +      pos = intel_de_read(dev_priv, PF_WIN_POS(crtc->pipe));
 +      size = intel_de_read(dev_priv, PF_WIN_SZ(crtc->pipe));
 +
 +      ilk_get_pfit_pos_size(crtc_state, pos, size);
 +
 +      /*
 +       * We currently do not free assignements of panel fitters on
 +       * ivb/hsw (since we don't use the higher upscaling modes which
 +       * differentiates them) so just WARN about this case for now.
 +       */
 +      drm_WARN_ON(&dev_priv->drm, IS_GEN(dev_priv, 7) &&
 +                  (ctl & PF_PIPE_SEL_MASK_IVB) != PF_PIPE_SEL_IVB(crtc->pipe));
  }
  
  static bool ilk_get_pipe_config(struct intel_crtc *crtc,
  
        pipe_config->cpu_transcoder = (enum transcoder) crtc->pipe;
        pipe_config->shared_dpll = NULL;
 -      pipe_config->master_transcoder = INVALID_TRANSCODER;
  
        ret = false;
        tmp = intel_de_read(dev_priv, PIPECONF(crtc->pipe));
        intel_get_pipe_timings(crtc, pipe_config);
        intel_get_pipe_src_size(crtc, pipe_config);
  
 -      ilk_get_pfit_config(crtc, pipe_config);
 +      ilk_get_pfit_config(pipe_config);
  
        ret = true;
  
@@@ -10893,7 -10889,7 +10892,7 @@@ static bool hsw_get_transcoder_state(st
                panel_transcoder_mask |=
                        BIT(TRANSCODER_DSI_0) | BIT(TRANSCODER_DSI_1);
  
 -      if (HAS_TRANSCODER_EDP(dev_priv))
 +      if (HAS_TRANSCODER(dev_priv, TRANSCODER_EDP))
                panel_transcoder_mask |= BIT(TRANSCODER_EDP);
  
        /*
@@@ -11087,6 -11083,61 +11086,6 @@@ static void hsw_get_ddi_port_state(stru
        }
  }
  
 -static enum transcoder transcoder_master_readout(struct drm_i915_private *dev_priv,
 -                                               enum transcoder cpu_transcoder)
 -{
 -      u32 trans_port_sync, master_select;
 -
 -      trans_port_sync = intel_de_read(dev_priv,
 -                                      TRANS_DDI_FUNC_CTL2(cpu_transcoder));
 -
 -      if ((trans_port_sync & PORT_SYNC_MODE_ENABLE) == 0)
 -              return INVALID_TRANSCODER;
 -
 -      master_select = trans_port_sync &
 -                      PORT_SYNC_MODE_MASTER_SELECT_MASK;
 -      if (master_select == 0)
 -              return TRANSCODER_EDP;
 -      else
 -              return master_select - 1;
 -}
 -
 -static void icl_get_trans_port_sync_config(struct intel_crtc_state *crtc_state)
 -{
 -      struct drm_i915_private *dev_priv = to_i915(crtc_state->uapi.crtc->dev);
 -      u32 transcoders;
 -      enum transcoder cpu_transcoder;
 -
 -      crtc_state->master_transcoder = transcoder_master_readout(dev_priv,
 -                                                                crtc_state->cpu_transcoder);
 -
 -      transcoders = BIT(TRANSCODER_A) |
 -              BIT(TRANSCODER_B) |
 -              BIT(TRANSCODER_C) |
 -              BIT(TRANSCODER_D);
 -      for_each_cpu_transcoder_masked(dev_priv, cpu_transcoder, transcoders) {
 -              enum intel_display_power_domain power_domain;
 -              intel_wakeref_t trans_wakeref;
 -
 -              power_domain = POWER_DOMAIN_TRANSCODER(cpu_transcoder);
 -              trans_wakeref = intel_display_power_get_if_enabled(dev_priv,
 -                                                                 power_domain);
 -
 -              if (!trans_wakeref)
 -                      continue;
 -
 -              if (transcoder_master_readout(dev_priv, cpu_transcoder) ==
 -                  crtc_state->cpu_transcoder)
 -                      crtc_state->sync_mode_slaves_mask |= BIT(cpu_transcoder);
 -
 -              intel_display_power_put(dev_priv, power_domain, trans_wakeref);
 -      }
 -
 -      drm_WARN_ON(&dev_priv->drm,
 -                  crtc_state->master_transcoder != INVALID_TRANSCODER &&
 -                  crtc_state->sync_mode_slaves_mask);
 -}
 -
  static bool hsw_get_pipe_config(struct intel_crtc *crtc,
                                struct intel_crtc_state *pipe_config)
  {
                power_domain_mask |= BIT_ULL(power_domain);
  
                if (INTEL_GEN(dev_priv) >= 9)
 -                      skl_get_pfit_config(crtc, pipe_config);
 +                      skl_get_pfit_config(pipe_config);
                else
 -                      ilk_get_pfit_config(crtc, pipe_config);
 +                      ilk_get_pfit_config(pipe_config);
        }
  
        if (hsw_crtc_supports_ips(crtc)) {
                pipe_config->pixel_multiplier = 1;
        }
  
 -      if (INTEL_GEN(dev_priv) >= 11 &&
 -          !transcoder_is_dsi(pipe_config->cpu_transcoder))
 -              icl_get_trans_port_sync_config(pipe_config);
 -
  out:
        for_each_power_domain(power_domain, power_domain_mask)
                intel_display_power_put(dev_priv,
@@@ -12320,8 -12375,10 +12319,8 @@@ int intel_plane_atomic_calc_changes(con
         * only combine the results from all planes in the current place?
         */
        if (!is_crtc_enabled) {
 -              plane_state->uapi.visible = visible = false;
 -              crtc_state->active_planes &= ~BIT(plane->id);
 -              crtc_state->data_rate[plane->id] = 0;
 -              crtc_state->min_cdclk[plane->id] = 0;
 +              intel_plane_set_invisible(crtc_state, plane_state);
 +              visible = false;
        }
  
        if (!was_visible && !visible)
@@@ -12451,10 -12508,8 +12450,10 @@@ static int icl_add_linked_planes(struc
                if (IS_ERR(linked_plane_state))
                        return PTR_ERR(linked_plane_state);
  
 -              WARN_ON(linked_plane_state->planar_linked_plane != plane);
 -              WARN_ON(linked_plane_state->planar_slave == plane_state->planar_slave);
 +              drm_WARN_ON(state->base.dev,
 +                          linked_plane_state->planar_linked_plane != plane);
 +              drm_WARN_ON(state->base.dev,
 +                          linked_plane_state->planar_slave == plane_state->planar_slave);
        }
  
        return 0;
@@@ -12829,20 -12884,19 +12828,20 @@@ compute_baseline_pipe_bpp(struct intel_
        return 0;
  }
  
 -static void intel_dump_crtc_timings(const struct drm_display_mode *mode)
 +static void intel_dump_crtc_timings(struct drm_i915_private *i915,
 +                                  const struct drm_display_mode *mode)
  {
 -      DRM_DEBUG_KMS("crtc timings: %d %d %d %d %d %d %d %d %d, "
 -                    "type: 0x%x flags: 0x%x\n",
 -                    mode->crtc_clock,
 -                    mode->crtc_hdisplay, mode->crtc_hsync_start,
 -                    mode->crtc_hsync_end, mode->crtc_htotal,
 -                    mode->crtc_vdisplay, mode->crtc_vsync_start,
 -                    mode->crtc_vsync_end, mode->crtc_vtotal,
 -                    mode->type, mode->flags);
 +      drm_dbg_kms(&i915->drm, "crtc timings: %d %d %d %d %d %d %d %d %d, "
 +                  "type: 0x%x flags: 0x%x\n",
 +                  mode->crtc_clock,
 +                  mode->crtc_hdisplay, mode->crtc_hsync_start,
 +                  mode->crtc_hsync_end, mode->crtc_htotal,
 +                  mode->crtc_vdisplay, mode->crtc_vsync_start,
 +                  mode->crtc_vsync_end, mode->crtc_vtotal,
 +                  mode->type, mode->flags);
  }
  
 -static inline void
 +static void
  intel_dump_m_n_config(const struct intel_crtc_state *pipe_config,
                      const char *id, unsigned int lane_count,
                      const struct intel_link_m_n *m_n)
@@@ -12866,16 -12920,6 +12865,16 @@@ intel_dump_infoframe(struct drm_i915_pr
        hdmi_infoframe_log(KERN_DEBUG, dev_priv->drm.dev, frame);
  }
  
 +static void
 +intel_dump_dp_vsc_sdp(struct drm_i915_private *dev_priv,
 +                    const struct drm_dp_vsc_sdp *vsc)
 +{
 +      if (!drm_debug_enabled(DRM_UT_KMS))
 +              return;
 +
 +      drm_dp_vsc_sdp_log(KERN_DEBUG, dev_priv->drm.dev, vsc);
 +}
 +
  #define OUTPUT_TYPE(x) [INTEL_OUTPUT_ ## x] = #x
  
  static const char * const output_type_str[] = {
@@@ -12996,11 -13040,6 +12995,11 @@@ static void intel_dump_pipe_config(cons
                    transcoder_name(pipe_config->cpu_transcoder),
                    pipe_config->pipe_bpp, pipe_config->dither);
  
 +      drm_dbg_kms(&dev_priv->drm,
 +                  "port sync: master transcoder: %s, slave transcoder bitmask = 0x%x\n",
 +                  transcoder_name(pipe_config->master_transcoder),
 +                  pipe_config->sync_mode_slaves_mask);
 +
        if (pipe_config->has_pch_encoder)
                intel_dump_m_n_config(pipe_config, "fdi",
                                      pipe_config->fdi_lanes,
        if (pipe_config->infoframes.enable &
            intel_hdmi_infoframe_enable(HDMI_INFOFRAME_TYPE_VENDOR))
                intel_dump_infoframe(dev_priv, &pipe_config->infoframes.hdmi);
 +      if (pipe_config->infoframes.enable &
 +          intel_hdmi_infoframe_enable(HDMI_INFOFRAME_TYPE_DRM))
 +              intel_dump_infoframe(dev_priv, &pipe_config->infoframes.drm);
 +      if (pipe_config->infoframes.enable &
 +          intel_hdmi_infoframe_enable(HDMI_PACKET_TYPE_GAMUT_METADATA))
 +              intel_dump_infoframe(dev_priv, &pipe_config->infoframes.drm);
 +      if (pipe_config->infoframes.enable &
 +          intel_hdmi_infoframe_enable(DP_SDP_VSC))
 +              intel_dump_dp_vsc_sdp(dev_priv, &pipe_config->infoframes.vsc);
  
        drm_dbg_kms(&dev_priv->drm, "requested mode:\n");
        drm_mode_debug_printmodeline(&pipe_config->hw.mode);
        drm_dbg_kms(&dev_priv->drm, "adjusted mode:\n");
        drm_mode_debug_printmodeline(&pipe_config->hw.adjusted_mode);
 -      intel_dump_crtc_timings(&pipe_config->hw.adjusted_mode);
 +      intel_dump_crtc_timings(dev_priv, &pipe_config->hw.adjusted_mode);
        drm_dbg_kms(&dev_priv->drm,
                    "port clock: %d, pipe src size: %dx%d, pixel rate %d\n",
                    pipe_config->port_clock,
                            pipe_config->gmch_pfit.lvds_border_bits);
        else
                drm_dbg_kms(&dev_priv->drm,
 -                          "pch pfit: pos: 0x%08x, size: 0x%08x, %s, force thru: %s\n",
 -                          pipe_config->pch_pfit.pos,
 -                          pipe_config->pch_pfit.size,
 +                          "pch pfit: " DRM_RECT_FMT ", %s, force thru: %s\n",
 +                          DRM_RECT_ARG(&pipe_config->pch_pfit.dst),
                            enableddisabled(pipe_config->pch_pfit.enabled),
                            yesno(pipe_config->pch_pfit.force_thru));
  
@@@ -13195,8 -13226,7 +13194,8 @@@ static void intel_crtc_copy_hw_to_uapi_
  {
        crtc_state->uapi.enable = crtc_state->hw.enable;
        crtc_state->uapi.active = crtc_state->hw.active;
 -      WARN_ON(drm_atomic_set_mode_for_crtc(&crtc_state->uapi, &crtc_state->hw.mode) < 0);
 +      drm_WARN_ON(crtc_state->uapi.crtc->dev,
 +                  drm_atomic_set_mode_for_crtc(&crtc_state->uapi, &crtc_state->hw.mode) < 0);
  
        crtc_state->uapi.adjusted_mode = crtc_state->hw.adjusted_mode;
  
@@@ -13489,13 -13519,6 +13488,13 @@@ intel_compare_infoframe(const union hdm
        return memcmp(a, b, sizeof(*a)) == 0;
  }
  
 +static bool
 +intel_compare_dp_vsc_sdp(const struct drm_dp_vsc_sdp *a,
 +                       const struct drm_dp_vsc_sdp *b)
 +{
 +      return memcmp(a, b, sizeof(*a)) == 0;
 +}
 +
  static void
  pipe_config_infoframe_mismatch(struct drm_i915_private *dev_priv,
                               bool fastset, const char *name,
        }
  }
  
 +static void
 +pipe_config_dp_vsc_sdp_mismatch(struct drm_i915_private *dev_priv,
 +                              bool fastset, const char *name,
 +                              const struct drm_dp_vsc_sdp *a,
 +                              const struct drm_dp_vsc_sdp *b)
 +{
 +      if (fastset) {
 +              if (!drm_debug_enabled(DRM_UT_KMS))
 +                      return;
 +
 +              drm_dbg_kms(&dev_priv->drm,
 +                          "fastset mismatch in %s dp sdp\n", name);
 +              drm_dbg_kms(&dev_priv->drm, "expected:\n");
 +              drm_dp_vsc_sdp_log(KERN_DEBUG, dev_priv->drm.dev, a);
 +              drm_dbg_kms(&dev_priv->drm, "found:\n");
 +              drm_dp_vsc_sdp_log(KERN_DEBUG, dev_priv->drm.dev, b);
 +      } else {
 +              drm_err(&dev_priv->drm, "mismatch in %s dp sdp\n", name);
 +              drm_err(&dev_priv->drm, "expected:\n");
 +              drm_dp_vsc_sdp_log(KERN_ERR, dev_priv->drm.dev, a);
 +              drm_err(&dev_priv->drm, "found:\n");
 +              drm_dp_vsc_sdp_log(KERN_ERR, dev_priv->drm.dev, b);
 +      }
 +}
 +
  static void __printf(4, 5)
  pipe_config_mismatch(bool fastset, const struct intel_crtc *crtc,
                     const char *name, const char *format, ...)
@@@ -13747,17 -13745,6 +13746,17 @@@ intel_pipe_config_compare(const struct 
        } \
  } while (0)
  
 +#define PIPE_CONF_CHECK_DP_VSC_SDP(name) do { \
 +      if (!current_config->has_psr && !pipe_config->has_psr && \
 +          !intel_compare_dp_vsc_sdp(&current_config->infoframes.name, \
 +                                    &pipe_config->infoframes.name)) { \
 +              pipe_config_dp_vsc_sdp_mismatch(dev_priv, fastset, __stringify(name), \
 +                                              &current_config->infoframes.name, \
 +                                              &pipe_config->infoframes.name); \
 +              ret = false; \
 +      } \
 +} while (0)
 +
  #define PIPE_CONF_CHECK_COLOR_LUT(name1, name2, bit_precision) do { \
        if (current_config->name1 != pipe_config->name1) { \
                pipe_config_mismatch(fastset, crtc, __stringify(name1), \
  
                PIPE_CONF_CHECK_BOOL(pch_pfit.enabled);
                if (current_config->pch_pfit.enabled) {
 -                      PIPE_CONF_CHECK_X(pch_pfit.pos);
 -                      PIPE_CONF_CHECK_X(pch_pfit.size);
 +                      PIPE_CONF_CHECK_I(pch_pfit.dst.x1);
 +                      PIPE_CONF_CHECK_I(pch_pfit.dst.y1);
 +                      PIPE_CONF_CHECK_I(pch_pfit.dst.x2);
 +                      PIPE_CONF_CHECK_I(pch_pfit.dst.y2);
                }
  
                PIPE_CONF_CHECK_I(scaler_state.scaler_id);
        PIPE_CONF_CHECK_INFOFRAME(spd);
        PIPE_CONF_CHECK_INFOFRAME(hdmi);
        PIPE_CONF_CHECK_INFOFRAME(drm);
 +      PIPE_CONF_CHECK_DP_VSC_SDP(vsc);
  
        PIPE_CONF_CHECK_X(sync_mode_slaves_mask);
        PIPE_CONF_CHECK_I(master_transcoder);
@@@ -14024,9 -14008,7 +14023,9 @@@ static void verify_wm_state(struct inte
                /* Watermarks */
                for (level = 0; level <= max_level; level++) {
                        if (skl_wm_level_equals(&hw_plane_wm->wm[level],
 -                                              &sw_plane_wm->wm[level]))
 +                                              &sw_plane_wm->wm[level]) ||
 +                          (level == 0 && skl_wm_level_equals(&hw_plane_wm->wm[level],
 +                                                             &sw_plane_wm->sagv_wm0)))
                                continue;
  
                        drm_err(&dev_priv->drm,
                /* Watermarks */
                for (level = 0; level <= max_level; level++) {
                        if (skl_wm_level_equals(&hw_plane_wm->wm[level],
 -                                              &sw_plane_wm->wm[level]))
 +                                              &sw_plane_wm->wm[level]) ||
 +                          (level == 0 && skl_wm_level_equals(&hw_plane_wm->wm[level],
 +                                                             &sw_plane_wm->sagv_wm0)))
                                continue;
  
                        drm_err(&dev_priv->drm,
@@@ -15017,13 -14997,11 +15016,13 @@@ static void intel_pipe_fastset(const st
  }
  
  static void commit_pipe_config(struct intel_atomic_state *state,
 -                             struct intel_crtc_state *old_crtc_state,
 -                             struct intel_crtc_state *new_crtc_state)
 +                             struct intel_crtc *crtc)
  {
 -      struct intel_crtc *crtc = to_intel_crtc(new_crtc_state->uapi.crtc);
        struct drm_i915_private *dev_priv = to_i915(state->base.dev);
 +      const struct intel_crtc_state *old_crtc_state =
 +              intel_atomic_get_old_crtc_state(state, crtc);
 +      const struct intel_crtc_state *new_crtc_state =
 +              intel_atomic_get_new_crtc_state(state, crtc);
        bool modeset = needs_modeset(new_crtc_state);
  
        /*
                dev_priv->display.atomic_update_watermarks(state, crtc);
  }
  
 -static void intel_update_crtc(struct intel_crtc *crtc,
 -                            struct intel_atomic_state *state,
 -                            struct intel_crtc_state *old_crtc_state,
 -                            struct intel_crtc_state *new_crtc_state)
 +static void intel_enable_crtc(struct intel_atomic_state *state,
 +                            struct intel_crtc *crtc)
  {
        struct drm_i915_private *dev_priv = to_i915(state->base.dev);
 -      bool modeset = needs_modeset(new_crtc_state);
 +      const struct intel_crtc_state *new_crtc_state =
 +              intel_atomic_get_new_crtc_state(state, crtc);
  
 -      if (modeset) {
 -              intel_crtc_update_active_timings(new_crtc_state);
 +      if (!needs_modeset(new_crtc_state))
 +              return;
  
 -              dev_priv->display.crtc_enable(state, crtc);
 +      intel_crtc_update_active_timings(new_crtc_state);
  
 -              /* vblanks work again, re-enable pipe CRC. */
 -              intel_crtc_enable_pipe_crc(crtc);
 -      } else {
 +      dev_priv->display.crtc_enable(state, crtc);
 +
 +      /* vblanks work again, re-enable pipe CRC. */
 +      intel_crtc_enable_pipe_crc(crtc);
 +}
 +
 +static void intel_update_crtc(struct intel_atomic_state *state,
 +                            struct intel_crtc *crtc)
 +{
 +      struct drm_i915_private *dev_priv = to_i915(state->base.dev);
 +      const struct intel_crtc_state *old_crtc_state =
 +              intel_atomic_get_old_crtc_state(state, crtc);
 +      struct intel_crtc_state *new_crtc_state =
 +              intel_atomic_get_new_crtc_state(state, crtc);
 +      bool modeset = needs_modeset(new_crtc_state);
 +
 +      if (!modeset) {
                if (new_crtc_state->preload_luts &&
                    (new_crtc_state->uapi.color_mgmt_changed ||
                     new_crtc_state->update_pipe))
        /* Perform vblank evasion around commit operation */
        intel_pipe_update_start(new_crtc_state);
  
 -      commit_pipe_config(state, old_crtc_state, new_crtc_state);
 +      commit_pipe_config(state, crtc);
  
        if (INTEL_GEN(dev_priv) >= 9)
                skl_update_planes_on_crtc(state, crtc);
                intel_crtc_arm_fifo_underrun(crtc, new_crtc_state);
  }
  
 -static struct intel_crtc *intel_get_slave_crtc(const struct intel_crtc_state *new_crtc_state)
 -{
 -      struct drm_i915_private *dev_priv = to_i915(new_crtc_state->uapi.crtc->dev);
 -      enum transcoder slave_transcoder;
 -
 -      drm_WARN_ON(&dev_priv->drm,
 -                  !is_power_of_2(new_crtc_state->sync_mode_slaves_mask));
 -
 -      slave_transcoder = ffs(new_crtc_state->sync_mode_slaves_mask) - 1;
 -      return intel_get_crtc_for_pipe(dev_priv,
 -                                     (enum pipe)slave_transcoder);
 -}
  
  static void intel_old_crtc_state_disables(struct intel_atomic_state *state,
                                          struct intel_crtc_state *old_crtc_state,
@@@ -15192,19 -15169,129 +15191,19 @@@ static void intel_commit_modeset_disabl
  
  static void intel_commit_modeset_enables(struct intel_atomic_state *state)
  {
 +      struct intel_crtc_state *new_crtc_state;
        struct intel_crtc *crtc;
 -      struct intel_crtc_state *old_crtc_state, *new_crtc_state;
        int i;
  
 -      for_each_oldnew_intel_crtc_in_state(state, crtc, old_crtc_state, new_crtc_state, i) {
 +      for_each_new_intel_crtc_in_state(state, crtc, new_crtc_state, i) {
                if (!new_crtc_state->hw.active)
                        continue;
  
 -              intel_update_crtc(crtc, state, old_crtc_state,
 -                                new_crtc_state);
 +              intel_enable_crtc(state, crtc);
 +              intel_update_crtc(state, crtc);
        }
  }
  
 -static void intel_crtc_enable_trans_port_sync(struct intel_crtc *crtc,
 -                                            struct intel_atomic_state *state,
 -                                            struct intel_crtc_state *new_crtc_state)
 -{
 -      struct drm_i915_private *dev_priv = to_i915(state->base.dev);
 -
 -      intel_crtc_update_active_timings(new_crtc_state);
 -      dev_priv->display.crtc_enable(state, crtc);
 -      intel_crtc_enable_pipe_crc(crtc);
 -}
 -
 -static void intel_set_dp_tp_ctl_normal(struct intel_crtc *crtc,
 -                                     struct intel_atomic_state *state)
 -{
 -      struct drm_connector *uninitialized_var(conn);
 -      struct drm_connector_state *conn_state;
 -      struct intel_dp *intel_dp;
 -      int i;
 -
 -      for_each_new_connector_in_state(&state->base, conn, conn_state, i) {
 -              if (conn_state->crtc == &crtc->base)
 -                      break;
 -      }
 -      intel_dp = intel_attached_dp(to_intel_connector(conn));
 -      intel_dp_stop_link_train(intel_dp);
 -}
 -
 -/*
 - * TODO: This is only called from port sync and it is identical to what will be
 - * executed again in intel_update_crtc() over port sync pipes
 - */
 -static void intel_post_crtc_enable_updates(struct intel_crtc *crtc,
 -                                         struct intel_atomic_state *state)
 -{
 -      struct intel_crtc_state *new_crtc_state =
 -              intel_atomic_get_new_crtc_state(state, crtc);
 -      struct intel_crtc_state *old_crtc_state =
 -              intel_atomic_get_old_crtc_state(state, crtc);
 -      bool modeset = needs_modeset(new_crtc_state);
 -
 -      if (new_crtc_state->update_pipe && !new_crtc_state->enable_fbc)
 -              intel_fbc_disable(crtc);
 -      else
 -              intel_fbc_enable(state, crtc);
 -
 -      /* Perform vblank evasion around commit operation */
 -      intel_pipe_update_start(new_crtc_state);
 -      commit_pipe_config(state, old_crtc_state, new_crtc_state);
 -      skl_update_planes_on_crtc(state, crtc);
 -      intel_pipe_update_end(new_crtc_state);
 -
 -      /*
 -       * We usually enable FIFO underrun interrupts as part of the
 -       * CRTC enable sequence during modesets.  But when we inherit a
 -       * valid pipe configuration from the BIOS we need to take care
 -       * of enabling them on the CRTC's first fastset.
 -       */
 -      if (new_crtc_state->update_pipe && !modeset &&
 -          old_crtc_state->hw.mode.private_flags & I915_MODE_FLAG_INHERITED)
 -              intel_crtc_arm_fifo_underrun(crtc, new_crtc_state);
 -}
 -
 -static void intel_update_trans_port_sync_crtcs(struct intel_crtc *crtc,
 -                                             struct intel_atomic_state *state,
 -                                             struct intel_crtc_state *old_crtc_state,
 -                                             struct intel_crtc_state *new_crtc_state)
 -{
 -      struct drm_i915_private *i915 = to_i915(crtc->base.dev);
 -      struct intel_crtc *slave_crtc = intel_get_slave_crtc(new_crtc_state);
 -      struct intel_crtc_state *new_slave_crtc_state =
 -              intel_atomic_get_new_crtc_state(state, slave_crtc);
 -      struct intel_crtc_state *old_slave_crtc_state =
 -              intel_atomic_get_old_crtc_state(state, slave_crtc);
 -
 -      drm_WARN_ON(&i915->drm, !slave_crtc || !new_slave_crtc_state ||
 -                  !old_slave_crtc_state);
 -
 -      drm_dbg_kms(&i915->drm,
 -                  "Updating Transcoder Port Sync Master CRTC = %d %s and Slave CRTC %d %s\n",
 -                  crtc->base.base.id, crtc->base.name,
 -                  slave_crtc->base.base.id, slave_crtc->base.name);
 -
 -      /* Enable seq for slave with with DP_TP_CTL left Idle until the
 -       * master is ready
 -       */
 -      intel_crtc_enable_trans_port_sync(slave_crtc,
 -                                        state,
 -                                        new_slave_crtc_state);
 -
 -      /* Enable seq for master with with DP_TP_CTL left Idle */
 -      intel_crtc_enable_trans_port_sync(crtc,
 -                                        state,
 -                                        new_crtc_state);
 -
 -      /* Set Slave's DP_TP_CTL to Normal */
 -      intel_set_dp_tp_ctl_normal(slave_crtc,
 -                                 state);
 -
 -      /* Set Master's DP_TP_CTL To Normal */
 -      usleep_range(200, 400);
 -      intel_set_dp_tp_ctl_normal(crtc,
 -                                 state);
 -
 -      /* Now do the post crtc enable for all master and slaves */
 -      intel_post_crtc_enable_updates(slave_crtc,
 -                                     state);
 -      intel_post_crtc_enable_updates(crtc,
 -                                     state);
 -}
 -
  static void icl_dbuf_slice_pre_update(struct intel_atomic_state *state)
  {
        struct drm_i915_private *dev_priv = to_i915(state->base.dev);
@@@ -15276,7 -15363,8 +15275,7 @@@ static void skl_commit_modeset_enables(
                        entries[pipe] = new_crtc_state->wm.skl.ddb;
                        update_pipes &= ~BIT(pipe);
  
 -                      intel_update_crtc(crtc, state, old_crtc_state,
 -                                        new_crtc_state);
 +                      intel_update_crtc(state, crtc);
  
                        /*
                         * If this is an already active pipe, it's DDB changed,
                }
        }
  
 +      update_pipes = modeset_pipes;
 +
        /*
         * Enable all pipes that needs a modeset and do not depends on other
         * pipes
         */
 -      for_each_oldnew_intel_crtc_in_state(state, crtc, old_crtc_state,
 -                                          new_crtc_state, i) {
 +      for_each_new_intel_crtc_in_state(state, crtc, new_crtc_state, i) {
                enum pipe pipe = crtc->pipe;
  
                if ((modeset_pipes & BIT(pipe)) == 0)
                        continue;
  
                if (intel_dp_mst_is_slave_trans(new_crtc_state) ||
 -                  is_trans_port_sync_slave(new_crtc_state))
 +                  is_trans_port_sync_master(new_crtc_state))
                        continue;
  
 -              drm_WARN_ON(&dev_priv->drm, skl_ddb_allocation_overlaps(&new_crtc_state->wm.skl.ddb,
 -                                                                      entries, I915_MAX_PIPES, pipe));
 -
 -              entries[pipe] = new_crtc_state->wm.skl.ddb;
                modeset_pipes &= ~BIT(pipe);
  
 -              if (is_trans_port_sync_mode(new_crtc_state)) {
 -                      struct intel_crtc *slave_crtc;
 +              intel_enable_crtc(state, crtc);
 +      }
  
 -                      intel_update_trans_port_sync_crtcs(crtc, state,
 -                                                         old_crtc_state,
 -                                                         new_crtc_state);
 +      /*
 +       * Then we enable all remaining pipes that depend on other
 +       * pipes: MST slaves and port sync masters.
 +       */
 +      for_each_new_intel_crtc_in_state(state, crtc, new_crtc_state, i) {
 +              enum pipe pipe = crtc->pipe;
  
 -                      slave_crtc = intel_get_slave_crtc(new_crtc_state);
 -                      /* TODO: update entries[] of slave */
 -                      modeset_pipes &= ~BIT(slave_crtc->pipe);
 +              if ((modeset_pipes & BIT(pipe)) == 0)
 +                      continue;
  
 -              } else {
 -                      intel_update_crtc(crtc, state, old_crtc_state,
 -                                        new_crtc_state);
 -              }
 +              modeset_pipes &= ~BIT(pipe);
 +
 +              intel_enable_crtc(state, crtc);
        }
  
        /*
 -       * Finally enable all pipes that needs a modeset and depends on
 -       * other pipes, right now it is only MST slaves as both port sync slave
 -       * and master are enabled together
 +       * Finally we do the plane updates/etc. for all pipes that got enabled.
         */
 -      for_each_oldnew_intel_crtc_in_state(state, crtc, old_crtc_state,
 -                                          new_crtc_state, i) {
 +      for_each_new_intel_crtc_in_state(state, crtc, new_crtc_state, i) {
                enum pipe pipe = crtc->pipe;
  
 -              if ((modeset_pipes & BIT(pipe)) == 0)
 +              if ((update_pipes & BIT(pipe)) == 0)
                        continue;
  
                drm_WARN_ON(&dev_priv->drm, skl_ddb_allocation_overlaps(&new_crtc_state->wm.skl.ddb,
                                                                        entries, I915_MAX_PIPES, pipe));
  
                entries[pipe] = new_crtc_state->wm.skl.ddb;
 -              modeset_pipes &= ~BIT(pipe);
 +              update_pipes &= ~BIT(pipe);
  
 -              intel_update_crtc(crtc, state, old_crtc_state, new_crtc_state);
 +              intel_update_crtc(state, crtc);
        }
  
        drm_WARN_ON(&dev_priv->drm, modeset_pipes);
 -
 +      drm_WARN_ON(&dev_priv->drm, update_pipes);
  }
  
  static void intel_atomic_helper_free_state(struct drm_i915_private *dev_priv)
@@@ -15445,11 -15538,16 +15444,11 @@@ static void intel_atomic_commit_tail(st
  
                intel_set_cdclk_pre_plane_update(state);
  
 -              /*
 -               * SKL workaround: bspec recommends we disable the SAGV when we
 -               * have more then one pipe enabled
 -               */
 -              if (!intel_can_enable_sagv(state))
 -                      intel_disable_sagv(dev_priv);
 -
                intel_modeset_verify_disabled(dev_priv, state);
        }
  
 +      intel_sagv_pre_plane_update(state);
 +
        /* Complete the events for pipes that have now been disabled */
        for_each_new_intel_crtc_in_state(state, crtc, new_crtc_state, i) {
                bool modeset = needs_modeset(new_crtc_state);
        if (state->modeset)
                intel_verify_planes(state);
  
 -      if (state->modeset && intel_can_enable_sagv(state))
 -              intel_enable_sagv(dev_priv);
 +      intel_sagv_post_plane_update(state);
  
        drm_atomic_helper_commit_hw_done(&state->base);
  
@@@ -15881,7 -15980,7 +15880,7 @@@ intel_prepare_plane_fb(struct drm_plan
        if (new_plane_state->uapi.fence) { /* explicit fencing */
                ret = i915_sw_fence_await_dma_fence(&state->commit_ready,
                                                    new_plane_state->uapi.fence,
 -                                                  I915_FENCE_TIMEOUT,
 +                                                  i915_fence_timeout(dev_priv),
                                                    GFP_KERNEL);
                if (ret < 0)
                        return ret;
  
                ret = i915_sw_fence_await_reservation(&state->commit_ready,
                                                      obj->base.resv, NULL,
 -                                                    false, I915_FENCE_TIMEOUT,
 +                                                    false,
 +                                                    i915_fence_timeout(dev_priv),
                                                      GFP_KERNEL);
                if (ret < 0)
                        goto unpin_fb;
@@@ -18161,12 -18259,11 +18160,12 @@@ static void intel_sanitize_encoder(stru
                        best_encoder = connector->base.state->best_encoder;
                        connector->base.state->best_encoder = &encoder->base;
  
 +                      /* FIXME NULL atomic state passed! */
                        if (encoder->disable)
 -                              encoder->disable(encoder, crtc_state,
 +                              encoder->disable(NULL, encoder, crtc_state,
                                                 connector->base.state);
                        if (encoder->post_disable)
 -                              encoder->post_disable(encoder, crtc_state,
 +                              encoder->post_disable(NULL, encoder, crtc_state,
                                                      connector->base.state);
  
                        connector->base.state->best_encoder = best_encoder;
@@@ -18703,6 -18800,15 +18702,6 @@@ void intel_modeset_driver_remove_noirq(
  
  #if IS_ENABLED(CONFIG_DRM_I915_CAPTURE_ERROR)
  
 -static bool
 -has_transcoder(struct drm_i915_private *dev_priv, enum transcoder cpu_transcoder)
 -{
 -      if (cpu_transcoder == TRANSCODER_EDP)
 -              return HAS_TRANSCODER_EDP(dev_priv);
 -      else
 -              return INTEL_INFO(dev_priv)->pipe_mask & BIT(cpu_transcoder);
 -}
 -
  struct intel_display_error_state {
  
        u32 power_well_driver;
@@@ -18811,7 -18917,7 +18810,7 @@@ intel_display_capture_error_state(struc
        for (i = 0; i < ARRAY_SIZE(error->transcoder); i++) {
                enum transcoder cpu_transcoder = transcoders[i];
  
 -              if (!has_transcoder(dev_priv, cpu_transcoder))
 +              if (!HAS_TRANSCODER(dev_priv, cpu_transcoder))
                        continue;
  
                error->transcoder[i].available = true;
@@@ -9,7 -9,6 +9,7 @@@
  #include "i915_debugfs.h"
  #include "intel_csr.h"
  #include "intel_display_debugfs.h"
 +#include "intel_display_power.h"
  #include "intel_display_types.h"
  #include "intel_dp.h"
  #include "intel_fbc.h"
@@@ -1099,10 -1098,10 +1099,10 @@@ static void drrs_status_per_crtc(struc
                seq_puts(m, "\n\t\t");
                if (drrs->refresh_rate_type == DRRS_HIGH_RR) {
                        seq_puts(m, "DRRS_State: DRRS_HIGH_RR\n");
-                       vrefresh = panel->fixed_mode->vrefresh;
+                       vrefresh = drm_mode_vrefresh(panel->fixed_mode);
                } else if (drrs->refresh_rate_type == DRRS_LOW_RR) {
                        seq_puts(m, "DRRS_State: DRRS_LOW_RR\n");
-                       vrefresh = panel->downclock_mode->vrefresh;
+                       vrefresh = drm_mode_vrefresh(panel->downclock_mode);
                } else {
                        seq_printf(m, "DRRS_State: Unknown(%d)\n",
                                                drrs->refresh_rate_type);
@@@ -1144,51 -1143,6 +1144,51 @@@ static int i915_drrs_status(struct seq_
        return 0;
  }
  
 +#define LPSP_STATUS(COND) (COND ? seq_puts(m, "LPSP: enabled\n") : \
 +                              seq_puts(m, "LPSP: disabled\n"))
 +
 +static bool
 +intel_lpsp_power_well_enabled(struct drm_i915_private *i915,
 +                            enum i915_power_well_id power_well_id)
 +{
 +      intel_wakeref_t wakeref;
 +      bool is_enabled;
 +
 +      wakeref = intel_runtime_pm_get(&i915->runtime_pm);
 +      is_enabled = intel_display_power_well_is_enabled(i915,
 +                                                       power_well_id);
 +      intel_runtime_pm_put(&i915->runtime_pm, wakeref);
 +
 +      return is_enabled;
 +}
 +
 +static int i915_lpsp_status(struct seq_file *m, void *unused)
 +{
 +      struct drm_i915_private *i915 = node_to_i915(m->private);
 +
 +      switch (INTEL_GEN(i915)) {
 +      case 12:
 +      case 11:
 +              LPSP_STATUS(!intel_lpsp_power_well_enabled(i915, ICL_DISP_PW_3));
 +              break;
 +      case 10:
 +      case 9:
 +              LPSP_STATUS(!intel_lpsp_power_well_enabled(i915, SKL_DISP_PW_2));
 +              break;
 +      default:
 +              /*
 +               * Apart from HASWELL/BROADWELL other legacy platform doesn't
 +               * support lpsp.
 +               */
 +              if (IS_HASWELL(i915) || IS_BROADWELL(i915))
 +                      LPSP_STATUS(!intel_lpsp_power_well_enabled(i915, HSW_DISP_PW_GLOBAL));
 +              else
 +                      seq_puts(m, "LPSP: not supported\n");
 +      }
 +
 +      return 0;
 +}
 +
  static int i915_dp_mst_info(struct seq_file *m, void *unused)
  {
        struct drm_i915_private *dev_priv = node_to_i915(m->private);
@@@ -1956,7 -1910,6 +1956,7 @@@ static const struct drm_info_list intel
        {"i915_dp_mst_info", i915_dp_mst_info, 0},
        {"i915_ddb_info", i915_ddb_info, 0},
        {"i915_drrs_status", i915_drrs_status, 0},
 +      {"i915_lpsp_status", i915_lpsp_status, 0},
  };
  
  static const struct {
@@@ -2038,48 -1991,6 +2038,48 @@@ static int i915_hdcp_sink_capability_sh
  }
  DEFINE_SHOW_ATTRIBUTE(i915_hdcp_sink_capability);
  
 +#define LPSP_CAPABLE(COND) (COND ? seq_puts(m, "LPSP: capable\n") : \
 +                              seq_puts(m, "LPSP: incapable\n"))
 +
 +static int i915_lpsp_capability_show(struct seq_file *m, void *data)
 +{
 +      struct drm_connector *connector = m->private;
 +      struct intel_encoder *encoder =
 +                      intel_attached_encoder(to_intel_connector(connector));
 +      struct drm_i915_private *i915 = to_i915(connector->dev);
 +
 +      if (connector->status != connector_status_connected)
 +              return -ENODEV;
 +
 +      switch (INTEL_GEN(i915)) {
 +      case 12:
 +              /*
 +               * Actually TGL can drive LPSP on port till DDI_C
 +               * but there is no physical connected DDI_C on TGL sku's,
 +               * even driver is not initilizing DDI_C port for gen12.
 +               */
 +              LPSP_CAPABLE(encoder->port <= PORT_B);
 +              break;
 +      case 11:
 +              LPSP_CAPABLE(connector->connector_type == DRM_MODE_CONNECTOR_DSI ||
 +                           connector->connector_type == DRM_MODE_CONNECTOR_eDP);
 +              break;
 +      case 10:
 +      case 9:
 +              LPSP_CAPABLE(encoder->port == PORT_A &&
 +                           (connector->connector_type == DRM_MODE_CONNECTOR_DSI ||
 +                           connector->connector_type == DRM_MODE_CONNECTOR_eDP  ||
 +                           connector->connector_type == DRM_MODE_CONNECTOR_DisplayPort));
 +              break;
 +      default:
 +              if (IS_HASWELL(i915) || IS_BROADWELL(i915))
 +                      LPSP_CAPABLE(connector->connector_type == DRM_MODE_CONNECTOR_eDP);
 +      }
 +
 +      return 0;
 +}
 +DEFINE_SHOW_ATTRIBUTE(i915_lpsp_capability);
 +
  static int i915_dsc_fec_support_show(struct seq_file *m, void *data)
  {
        struct drm_connector *connector = m->private;
@@@ -2223,16 -2134,5 +2223,16 @@@ int intel_connector_debugfs_add(struct 
                debugfs_create_file("i915_dsc_fec_support", S_IRUGO, root,
                                    connector, &i915_dsc_fec_support_fops);
  
 +      /* Legacy panels doesn't lpsp on any platform */
 +      if ((INTEL_GEN(dev_priv) >= 9 || IS_HASWELL(dev_priv) ||
 +           IS_BROADWELL(dev_priv)) &&
 +           (connector->connector_type == DRM_MODE_CONNECTOR_DSI ||
 +           connector->connector_type == DRM_MODE_CONNECTOR_eDP ||
 +           connector->connector_type == DRM_MODE_CONNECTOR_DisplayPort ||
 +           connector->connector_type == DRM_MODE_CONNECTOR_HDMIA ||
 +           connector->connector_type == DRM_MODE_CONNECTOR_HDMIB))
 +              debugfs_create_file("i915_lpsp_capability", 0444, root,
 +                                  connector, &i915_lpsp_capability_fops);
 +
        return 0;
  }
@@@ -48,6 -48,7 +48,6 @@@
  #include "intel_audio.h"
  #include "intel_connector.h"
  #include "intel_ddi.h"
 -#include "intel_display_debugfs.h"
  #include "intel_display_types.h"
  #include "intel_dp.h"
  #include "intel_dp_link_training.h"
@@@ -163,17 -164,6 +163,17 @@@ static void intel_dp_set_sink_rates(str
        };
        int i, max_rate;
  
 +      if (drm_dp_has_quirk(&intel_dp->desc, 0,
 +                           DP_DPCD_QUIRK_CAN_DO_MAX_LINK_RATE_3_24_GBPS)) {
 +              /* Needed, e.g., for Apple MBP 2017, 15 inch eDP Retina panel */
 +              static const int quirk_rates[] = { 162000, 270000, 324000 };
 +
 +              memcpy(intel_dp->sink_rates, quirk_rates, sizeof(quirk_rates));
 +              intel_dp->num_sink_rates = ARRAY_SIZE(quirk_rates);
 +
 +              return;
 +      }
 +
        max_rate = drm_dp_bw_code_to_link_rate(intel_dp->dpcd[DP_MAX_LINK_RATE]);
  
        for (i = 0; i < ARRAY_SIZE(dp_rates); i++) {
@@@ -462,7 -452,6 +462,7 @@@ static bool intel_dp_can_link_train_fal
  int intel_dp_get_link_train_fallback_values(struct intel_dp *intel_dp,
                                            int link_rate, u8 lane_count)
  {
 +      struct drm_i915_private *i915 = dp_to_i915(intel_dp);
        int index;
  
        index = intel_dp_rate_index(intel_dp->common_rates,
                    !intel_dp_can_link_train_fallback_for_edp(intel_dp,
                                                              intel_dp->common_rates[index - 1],
                                                              lane_count)) {
 -                      DRM_DEBUG_KMS("Retrying Link training for eDP with same parameters\n");
 +                      drm_dbg_kms(&i915->drm,
 +                                  "Retrying Link training for eDP with same parameters\n");
                        return 0;
                }
                intel_dp->max_link_rate = intel_dp->common_rates[index - 1];
                    !intel_dp_can_link_train_fallback_for_edp(intel_dp,
                                                              intel_dp_max_common_rate(intel_dp),
                                                              lane_count >> 1)) {
 -                      DRM_DEBUG_KMS("Retrying Link training for eDP with same parameters\n");
 +                      drm_dbg_kms(&i915->drm,
 +                                  "Retrying Link training for eDP with same parameters\n");
                        return 0;
                }
                intel_dp->max_link_rate = intel_dp_max_common_rate(intel_dp);
                intel_dp->max_link_lane_count = lane_count >> 1;
        } else {
 -              DRM_ERROR("Link Training Unsuccessful\n");
 +              drm_err(&i915->drm, "Link Training Unsuccessful\n");
                return -1;
        }
  
@@@ -566,7 -553,6 +566,7 @@@ static u16 intel_dp_dsc_get_output_bpp(
  static u8 intel_dp_dsc_get_slice_count(struct intel_dp *intel_dp,
                                       int mode_clock, int mode_hdisplay)
  {
 +      struct drm_i915_private *i915 = dp_to_i915(intel_dp);
        u8 min_slice_count, i;
        int max_slice_width;
  
  
        max_slice_width = drm_dp_dsc_sink_max_slice_width(intel_dp->dsc_dpcd);
        if (max_slice_width < DP_DSC_MIN_SLICE_WIDTH_VALUE) {
 -              DRM_DEBUG_KMS("Unsupported slice width %d by DP DSC Sink device\n",
 -                            max_slice_width);
 +              drm_dbg_kms(&i915->drm,
 +                          "Unsupported slice width %d by DP DSC Sink device\n",
 +                          max_slice_width);
                return 0;
        }
        /* Also take into account max slice width */
                        return valid_dsc_slicecount[i];
        }
  
 -      DRM_DEBUG_KMS("Unsupported Slice Count %d\n", min_slice_count);
 +      drm_dbg_kms(&i915->drm, "Unsupported Slice Count %d\n",
 +                  min_slice_count);
        return 0;
  }
  
@@@ -1359,7 -1343,8 +1359,7 @@@ intel_dp_aux_xfer(struct intel_dp *inte
        bool is_tc_port = intel_phy_is_tc(i915, phy);
        i915_reg_t ch_ctl, ch_data[5];
        u32 aux_clock_divider;
 -      enum intel_display_power_domain aux_domain =
 -              intel_aux_power_domain(intel_dig_port);
 +      enum intel_display_power_domain aux_domain;
        intel_wakeref_t aux_wakeref;
        intel_wakeref_t pps_wakeref;
        int i, ret, recv_bytes;
        if (is_tc_port)
                intel_tc_port_lock(intel_dig_port);
  
 +      aux_domain = intel_aux_power_domain(intel_dig_port);
 +
        aux_wakeref = intel_display_power_get(i915, aux_domain);
        pps_wakeref = pps_lock(intel_dp);
  
@@@ -1849,7 -1832,6 +1849,7 @@@ static void snprintf_int_array(char *st
  
  static void intel_dp_print_rates(struct intel_dp *intel_dp)
  {
 +      struct drm_i915_private *i915 = dp_to_i915(intel_dp);
        char str[128]; /* FIXME: too big for stack? */
  
        if (!drm_debug_enabled(DRM_UT_KMS))
  
        snprintf_int_array(str, sizeof(str),
                           intel_dp->source_rates, intel_dp->num_source_rates);
 -      DRM_DEBUG_KMS("source rates: %s\n", str);
 +      drm_dbg_kms(&i915->drm, "source rates: %s\n", str);
  
        snprintf_int_array(str, sizeof(str),
                           intel_dp->sink_rates, intel_dp->num_sink_rates);
 -      DRM_DEBUG_KMS("sink rates: %s\n", str);
 +      drm_dbg_kms(&i915->drm, "sink rates: %s\n", str);
  
        snprintf_int_array(str, sizeof(str),
                           intel_dp->common_rates, intel_dp->num_common_rates);
 -      DRM_DEBUG_KMS("common rates: %s\n", str);
 +      drm_dbg_kms(&i915->drm, "common rates: %s\n", str);
  }
  
  int
@@@ -1972,8 -1954,6 +1972,8 @@@ intel_dp_adjust_compliance_config(struc
                                  struct intel_crtc_state *pipe_config,
                                  struct link_config_limits *limits)
  {
 +      struct drm_i915_private *i915 = dp_to_i915(intel_dp);
 +
        /* For DP Compliance we override the computed bpp for the pipe */
        if (intel_dp->compliance.test_data.bpc != 0) {
                int bpp = 3 * intel_dp->compliance.test_data.bpc;
                limits->min_bpp = limits->max_bpp = bpp;
                pipe_config->dither_force_disable = bpp == 6 * 3;
  
 -              DRM_DEBUG_KMS("Setting pipe_bpp to %d\n", bpp);
 +              drm_dbg_kms(&i915->drm, "Setting pipe_bpp to %d\n", bpp);
        }
  
        /* Use values requested by Compliance Test Request */
@@@ -2075,7 -2055,6 +2075,7 @@@ static int intel_dp_dsc_compute_bpp(str
  static int intel_dp_dsc_compute_params(struct intel_encoder *encoder,
                                       struct intel_crtc_state *crtc_state)
  {
 +      struct drm_i915_private *i915 = to_i915(encoder->base.dev);
        struct intel_dp *intel_dp = enc_to_intel_dp(encoder);
        struct drm_dsc_config *vdsc_cfg = &crtc_state->dsc.config;
        u8 line_buf_depth;
  
        line_buf_depth = drm_dp_dsc_sink_line_buf_depth(intel_dp->dsc_dpcd);
        if (!line_buf_depth) {
 -              DRM_DEBUG_KMS("DSC Sink Line Buffer Depth invalid\n");
 +              drm_dbg_kms(&i915->drm,
 +                          "DSC Sink Line Buffer Depth invalid\n");
                return -EINVAL;
        }
  
@@@ -2136,8 -2114,7 +2136,8 @@@ static int intel_dp_dsc_compute_config(
  {
        struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp);
        struct drm_i915_private *dev_priv = to_i915(dig_port->base.base.dev);
 -      struct drm_display_mode *adjusted_mode = &pipe_config->hw.adjusted_mode;
 +      const struct drm_display_mode *adjusted_mode =
 +              &pipe_config->hw.adjusted_mode;
        u8 dsc_max_bpc;
        int pipe_bpp;
        int ret;
@@@ -2252,9 -2229,7 +2252,9 @@@ intel_dp_compute_link_config(struct int
                             struct intel_crtc_state *pipe_config,
                             struct drm_connector_state *conn_state)
  {
 -      struct drm_display_mode *adjusted_mode = &pipe_config->hw.adjusted_mode;
 +      struct drm_i915_private *i915 = to_i915(encoder->base.dev);
 +      const struct drm_display_mode *adjusted_mode =
 +              &pipe_config->hw.adjusted_mode;
        struct intel_dp *intel_dp = enc_to_intel_dp(encoder);
        struct link_config_limits limits;
        int common_len;
  
        intel_dp_adjust_compliance_config(intel_dp, pipe_config, &limits);
  
 -      DRM_DEBUG_KMS("DP link computation with max lane count %i "
 -                    "max rate %d max bpp %d pixel clock %iKHz\n",
 -                    limits.max_lane_count,
 -                    intel_dp->common_rates[limits.max_clock],
 -                    limits.max_bpp, adjusted_mode->crtc_clock);
 +      drm_dbg_kms(&i915->drm, "DP link computation with max lane count %i "
 +                  "max rate %d max bpp %d pixel clock %iKHz\n",
 +                  limits.max_lane_count,
 +                  intel_dp->common_rates[limits.max_clock],
 +                  limits.max_bpp, adjusted_mode->crtc_clock);
  
        /*
         * Optimize for slow and wide. This is the place to add alternative
        ret = intel_dp_compute_link_config_wide(intel_dp, pipe_config, &limits);
  
        /* enable compression if the mode doesn't fit available BW */
 -      DRM_DEBUG_KMS("Force DSC en = %d\n", intel_dp->force_dsc_en);
 +      drm_dbg_kms(&i915->drm, "Force DSC en = %d\n", intel_dp->force_dsc_en);
        if (ret || intel_dp->force_dsc_en) {
                ret = intel_dp_dsc_compute_config(intel_dp, pipe_config,
                                                  conn_state, &limits);
        }
  
        if (pipe_config->dsc.compression_enable) {
 -              DRM_DEBUG_KMS("DP lane count %d clock %d Input bpp %d Compressed bpp %d\n",
 -                            pipe_config->lane_count, pipe_config->port_clock,
 -                            pipe_config->pipe_bpp,
 -                            pipe_config->dsc.compressed_bpp);
 -
 -              DRM_DEBUG_KMS("DP link rate required %i available %i\n",
 -                            intel_dp_link_required(adjusted_mode->crtc_clock,
 -                                                   pipe_config->dsc.compressed_bpp),
 -                            intel_dp_max_data_rate(pipe_config->port_clock,
 -                                                   pipe_config->lane_count));
 +              drm_dbg_kms(&i915->drm,
 +                          "DP lane count %d clock %d Input bpp %d Compressed bpp %d\n",
 +                          pipe_config->lane_count, pipe_config->port_clock,
 +                          pipe_config->pipe_bpp,
 +                          pipe_config->dsc.compressed_bpp);
 +
 +              drm_dbg_kms(&i915->drm,
 +                          "DP link rate required %i available %i\n",
 +                          intel_dp_link_required(adjusted_mode->crtc_clock,
 +                                                 pipe_config->dsc.compressed_bpp),
 +                          intel_dp_max_data_rate(pipe_config->port_clock,
 +                                                 pipe_config->lane_count));
        } else {
 -              DRM_DEBUG_KMS("DP lane count %d clock %d bpp %d\n",
 -                            pipe_config->lane_count, pipe_config->port_clock,
 -                            pipe_config->pipe_bpp);
 +              drm_dbg_kms(&i915->drm, "DP lane count %d clock %d bpp %d\n",
 +                          pipe_config->lane_count, pipe_config->port_clock,
 +                          pipe_config->pipe_bpp);
  
 -              DRM_DEBUG_KMS("DP link rate required %i available %i\n",
 -                            intel_dp_link_required(adjusted_mode->crtc_clock,
 -                                                   pipe_config->pipe_bpp),
 -                            intel_dp_max_data_rate(pipe_config->port_clock,
 -                                                   pipe_config->lane_count));
 +              drm_dbg_kms(&i915->drm,
 +                          "DP link rate required %i available %i\n",
 +                          intel_dp_link_required(adjusted_mode->crtc_clock,
 +                                                 pipe_config->pipe_bpp),
 +                          intel_dp_max_data_rate(pipe_config->port_clock,
 +                                                 pipe_config->lane_count));
        }
        return 0;
  }
  
  static int
  intel_dp_ycbcr420_config(struct intel_dp *intel_dp,
 -                       struct drm_connector *connector,
 -                       struct intel_crtc_state *crtc_state)
 +                       struct intel_crtc_state *crtc_state,
 +                       const struct drm_connector_state *conn_state)
  {
 +      struct drm_connector *connector = conn_state->connector;
        const struct drm_display_info *info = &connector->display_info;
        const struct drm_display_mode *adjusted_mode =
                &crtc_state->hw.adjusted_mode;
 -      struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
 -      int ret;
  
        if (!drm_mode_is_420_only(info, adjusted_mode) ||
            !intel_dp_get_colorimetry_status(intel_dp) ||
  
        crtc_state->output_format = INTEL_OUTPUT_FORMAT_YCBCR420;
  
 -      /* YCBCR 420 output conversion needs a scaler */
 -      ret = skl_update_scaler_crtc(crtc_state);
 -      if (ret) {
 -              DRM_DEBUG_KMS("Scaler allocation for output failed\n");
 -              return ret;
 -      }
 -
 -      intel_pch_panel_fitting(crtc, crtc_state, DRM_MODE_SCALE_FULLSCREEN);
 -
 -      return 0;
 +      return intel_pch_panel_fitting(crtc_state, conn_state);
  }
  
  bool intel_dp_limited_color_range(const struct intel_crtc_state *crtc_state,
@@@ -2402,164 -2384,6 +2402,164 @@@ static bool intel_dp_port_has_audio(str
        return true;
  }
  
 +static void intel_dp_compute_vsc_colorimetry(const struct intel_crtc_state *crtc_state,
 +                                           const struct drm_connector_state *conn_state,
 +                                           struct drm_dp_vsc_sdp *vsc)
 +{
 +      struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
 +      struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
 +
 +      /*
 +       * Prepare VSC Header for SU as per DP 1.4 spec, Table 2-118
 +       * VSC SDP supporting 3D stereo, PSR2, and Pixel Encoding/
 +       * Colorimetry Format indication.
 +       */
 +      vsc->revision = 0x5;
 +      vsc->length = 0x13;
 +
 +      /* DP 1.4a spec, Table 2-120 */
 +      switch (crtc_state->output_format) {
 +      case INTEL_OUTPUT_FORMAT_YCBCR444:
 +              vsc->pixelformat = DP_PIXELFORMAT_YUV444;
 +              break;
 +      case INTEL_OUTPUT_FORMAT_YCBCR420:
 +              vsc->pixelformat = DP_PIXELFORMAT_YUV420;
 +              break;
 +      case INTEL_OUTPUT_FORMAT_RGB:
 +      default:
 +              vsc->pixelformat = DP_PIXELFORMAT_RGB;
 +      }
 +
 +      switch (conn_state->colorspace) {
 +      case DRM_MODE_COLORIMETRY_BT709_YCC:
 +              vsc->colorimetry = DP_COLORIMETRY_BT709_YCC;
 +              break;
 +      case DRM_MODE_COLORIMETRY_XVYCC_601:
 +              vsc->colorimetry = DP_COLORIMETRY_XVYCC_601;
 +              break;
 +      case DRM_MODE_COLORIMETRY_XVYCC_709:
 +              vsc->colorimetry = DP_COLORIMETRY_XVYCC_709;
 +              break;
 +      case DRM_MODE_COLORIMETRY_SYCC_601:
 +              vsc->colorimetry = DP_COLORIMETRY_SYCC_601;
 +              break;
 +      case DRM_MODE_COLORIMETRY_OPYCC_601:
 +              vsc->colorimetry = DP_COLORIMETRY_OPYCC_601;
 +              break;
 +      case DRM_MODE_COLORIMETRY_BT2020_CYCC:
 +              vsc->colorimetry = DP_COLORIMETRY_BT2020_CYCC;
 +              break;
 +      case DRM_MODE_COLORIMETRY_BT2020_RGB:
 +              vsc->colorimetry = DP_COLORIMETRY_BT2020_RGB;
 +              break;
 +      case DRM_MODE_COLORIMETRY_BT2020_YCC:
 +              vsc->colorimetry = DP_COLORIMETRY_BT2020_YCC;
 +              break;
 +      case DRM_MODE_COLORIMETRY_DCI_P3_RGB_D65:
 +      case DRM_MODE_COLORIMETRY_DCI_P3_RGB_THEATER:
 +              vsc->colorimetry = DP_COLORIMETRY_DCI_P3_RGB;
 +              break;
 +      default:
 +              /*
 +               * RGB->YCBCR color conversion uses the BT.709
 +               * color space.
 +               */
 +              if (crtc_state->output_format == INTEL_OUTPUT_FORMAT_YCBCR420)
 +                      vsc->colorimetry = DP_COLORIMETRY_BT709_YCC;
 +              else
 +                      vsc->colorimetry = DP_COLORIMETRY_DEFAULT;
 +              break;
 +      }
 +
 +      vsc->bpc = crtc_state->pipe_bpp / 3;
 +
 +      /* only RGB pixelformat supports 6 bpc */
 +      drm_WARN_ON(&dev_priv->drm,
 +                  vsc->bpc == 6 && vsc->pixelformat != DP_PIXELFORMAT_RGB);
 +
 +      /* all YCbCr are always limited range */
 +      vsc->dynamic_range = DP_DYNAMIC_RANGE_CTA;
 +      vsc->content_type = DP_CONTENT_TYPE_NOT_DEFINED;
 +}
 +
 +static void intel_dp_compute_vsc_sdp(struct intel_dp *intel_dp,
 +                                   struct intel_crtc_state *crtc_state,
 +                                   const struct drm_connector_state *conn_state)
 +{
 +      struct drm_dp_vsc_sdp *vsc = &crtc_state->infoframes.vsc;
 +
 +      /* When a crtc state has PSR, VSC SDP will be handled by PSR routine */
 +      if (crtc_state->has_psr)
 +              return;
 +
 +      if (!intel_dp_needs_vsc_sdp(crtc_state, conn_state))
 +              return;
 +
 +      crtc_state->infoframes.enable |= intel_hdmi_infoframe_enable(DP_SDP_VSC);
 +      vsc->sdp_type = DP_SDP_VSC;
 +      intel_dp_compute_vsc_colorimetry(crtc_state, conn_state,
 +                                       &crtc_state->infoframes.vsc);
 +}
 +
 +void intel_dp_compute_psr_vsc_sdp(struct intel_dp *intel_dp,
 +                                const struct intel_crtc_state *crtc_state,
 +                                const struct drm_connector_state *conn_state,
 +                                struct drm_dp_vsc_sdp *vsc)
 +{
 +      struct drm_i915_private *dev_priv = dp_to_i915(intel_dp);
 +
 +      vsc->sdp_type = DP_SDP_VSC;
 +
 +      if (dev_priv->psr.psr2_enabled) {
 +              if (dev_priv->psr.colorimetry_support &&
 +                  intel_dp_needs_vsc_sdp(crtc_state, conn_state)) {
 +                      /* [PSR2, +Colorimetry] */
 +                      intel_dp_compute_vsc_colorimetry(crtc_state, conn_state,
 +                                                       vsc);
 +              } else {
 +                      /*
 +                       * [PSR2, -Colorimetry]
 +                       * Prepare VSC Header for SU as per eDP 1.4 spec, Table 6-11
 +                       * 3D stereo + PSR/PSR2 + Y-coordinate.
 +                       */
 +                      vsc->revision = 0x4;
 +                      vsc->length = 0xe;
 +              }
 +      } else {
 +              /*
 +               * [PSR1]
 +               * Prepare VSC Header for SU as per DP 1.4 spec, Table 2-118
 +               * VSC SDP supporting 3D stereo + PSR (applies to eDP v1.3 or
 +               * higher).
 +               */
 +              vsc->revision = 0x2;
 +              vsc->length = 0x8;
 +      }
 +}
 +
 +static void
 +intel_dp_compute_hdr_metadata_infoframe_sdp(struct intel_dp *intel_dp,
 +                                          struct intel_crtc_state *crtc_state,
 +                                          const struct drm_connector_state *conn_state)
 +{
 +      int ret;
 +      struct drm_i915_private *dev_priv = dp_to_i915(intel_dp);
 +      struct hdmi_drm_infoframe *drm_infoframe = &crtc_state->infoframes.drm.drm;
 +
 +      if (!conn_state->hdr_output_metadata)
 +              return;
 +
 +      ret = drm_hdmi_infoframe_set_hdr_metadata(drm_infoframe, conn_state);
 +
 +      if (ret) {
 +              drm_dbg_kms(&dev_priv->drm, "couldn't set HDR metadata in infoframe\n");
 +              return;
 +      }
 +
 +      crtc_state->infoframes.enable |=
 +              intel_hdmi_infoframe_enable(HDMI_PACKET_TYPE_GAMUT_METADATA);
 +}
 +
  int
  intel_dp_compute_config(struct intel_encoder *encoder,
                        struct intel_crtc_state *pipe_config,
        struct intel_dp *intel_dp = enc_to_intel_dp(encoder);
        struct intel_lspcon *lspcon = enc_to_intel_lspcon(encoder);
        enum port port = encoder->port;
 -      struct intel_crtc *intel_crtc = to_intel_crtc(pipe_config->uapi.crtc);
        struct intel_connector *intel_connector = intel_dp->attached_connector;
        struct intel_digital_connector_state *intel_conn_state =
                to_intel_digital_connector_state(conn_state);
        if (lspcon->active)
                lspcon_ycbcr420_config(&intel_connector->base, pipe_config);
        else
 -              ret = intel_dp_ycbcr420_config(intel_dp, &intel_connector->base,
 -                                             pipe_config);
 -
 +              ret = intel_dp_ycbcr420_config(intel_dp, pipe_config,
 +                                             conn_state);
        if (ret)
                return ret;
  
                intel_fixed_panel_mode(intel_connector->panel.fixed_mode,
                                       adjusted_mode);
  
 -              if (INTEL_GEN(dev_priv) >= 9) {
 -                      ret = skl_update_scaler_crtc(pipe_config);
 -                      if (ret)
 -                              return ret;
 -              }
 -
                if (HAS_GMCH(dev_priv))
 -                      intel_gmch_panel_fitting(intel_crtc, pipe_config,
 -                                               conn_state->scaling_mode);
 +                      ret = intel_gmch_panel_fitting(pipe_config, conn_state);
                else
 -                      intel_pch_panel_fitting(intel_crtc, pipe_config,
 -                                              conn_state->scaling_mode);
 +                      ret = intel_pch_panel_fitting(pipe_config, conn_state);
 +              if (ret)
 +                      return ret;
        }
  
        if (adjusted_mode->flags & DRM_MODE_FLAG_DBLSCAN)
                intel_dp_set_clock(encoder, pipe_config);
  
        intel_psr_compute_config(intel_dp, pipe_config);
 +      intel_dp_compute_vsc_sdp(intel_dp, pipe_config, conn_state);
 +      intel_dp_compute_hdr_metadata_infoframe_sdp(intel_dp, pipe_config, conn_state);
  
        return 0;
  }
@@@ -2687,6 -2517,9 +2687,6 @@@ static void intel_dp_prepare(struct int
                                 intel_crtc_has_type(pipe_config,
                                                     INTEL_OUTPUT_DP_MST));
  
 -      intel_dp->regs.dp_tp_ctl = DP_TP_CTL(port);
 -      intel_dp->regs.dp_tp_status = DP_TP_STATUS(port);
 -
        /*
         * There are four kinds of DP registers:
         *
@@@ -2800,27 -2633,22 +2800,27 @@@ static void wait_panel_status(struct in
  
  static void wait_panel_on(struct intel_dp *intel_dp)
  {
 -      DRM_DEBUG_KMS("Wait for panel power on\n");
 +      struct drm_i915_private *i915 = dp_to_i915(intel_dp);
 +
 +      drm_dbg_kms(&i915->drm, "Wait for panel power on\n");
        wait_panel_status(intel_dp, IDLE_ON_MASK, IDLE_ON_VALUE);
  }
  
  static void wait_panel_off(struct intel_dp *intel_dp)
  {
 -      DRM_DEBUG_KMS("Wait for panel power off time\n");
 +      struct drm_i915_private *i915 = dp_to_i915(intel_dp);
 +
 +      drm_dbg_kms(&i915->drm, "Wait for panel power off time\n");
        wait_panel_status(intel_dp, IDLE_OFF_MASK, IDLE_OFF_VALUE);
  }
  
  static void wait_panel_power_cycle(struct intel_dp *intel_dp)
  {
 +      struct drm_i915_private *i915 = dp_to_i915(intel_dp);
        ktime_t panel_power_on_time;
        s64 panel_power_off_duration;
  
 -      DRM_DEBUG_KMS("Wait for panel power cycle\n");
 +      drm_dbg_kms(&i915->drm, "Wait for panel power cycle\n");
  
        /* take the difference of currrent time and panel power off time
         * and then make panel wait for t11_t12 if needed. */
@@@ -3184,12 -3012,11 +3184,12 @@@ void intel_edp_backlight_on(const struc
                            const struct drm_connector_state *conn_state)
  {
        struct intel_dp *intel_dp = enc_to_intel_dp(to_intel_encoder(conn_state->best_encoder));
 +      struct drm_i915_private *i915 = dp_to_i915(intel_dp);
  
        if (!intel_dp_is_edp(intel_dp))
                return;
  
 -      DRM_DEBUG_KMS("\n");
 +      drm_dbg_kms(&i915->drm, "\n");
  
        intel_panel_enable_backlight(crtc_state, conn_state);
        _intel_edp_backlight_on(intel_dp);
@@@ -3223,12 -3050,11 +3223,12 @@@ static void _intel_edp_backlight_off(st
  void intel_edp_backlight_off(const struct drm_connector_state *old_conn_state)
  {
        struct intel_dp *intel_dp = enc_to_intel_dp(to_intel_encoder(old_conn_state->best_encoder));
 +      struct drm_i915_private *i915 = dp_to_i915(intel_dp);
  
        if (!intel_dp_is_edp(intel_dp))
                return;
  
 -      DRM_DEBUG_KMS("\n");
 +      drm_dbg_kms(&i915->drm, "\n");
  
        _intel_edp_backlight_off(intel_dp);
        intel_panel_disable_backlight(old_conn_state);
  static void intel_edp_backlight_power(struct intel_connector *connector,
                                      bool enable)
  {
 +      struct drm_i915_private *i915 = to_i915(connector->base.dev);
        struct intel_dp *intel_dp = intel_attached_dp(connector);
        intel_wakeref_t wakeref;
        bool is_enabled;
        if (is_enabled == enable)
                return;
  
 -      DRM_DEBUG_KMS("panel power control backlight %s\n",
 -                    enable ? "enable" : "disable");
 +      drm_dbg_kms(&i915->drm, "panel power control backlight %s\n",
 +                  enable ? "enable" : "disable");
  
        if (enable)
                _intel_edp_backlight_on(intel_dp);
@@@ -3363,7 -3188,6 +3363,7 @@@ void intel_dp_sink_set_decompression_st
                                           const struct intel_crtc_state *crtc_state,
                                           bool enable)
  {
 +      struct drm_i915_private *i915 = dp_to_i915(intel_dp);
        int ret;
  
        if (!crtc_state->dsc.compression_enable)
        ret = drm_dp_dpcd_writeb(&intel_dp->aux, DP_DSC_ENABLE,
                                 enable ? DP_DECOMPRESSION_EN : 0);
        if (ret < 0)
 -              DRM_DEBUG_KMS("Failed to %s sink decompression state\n",
 -                            enable ? "enable" : "disable");
 +              drm_dbg_kms(&i915->drm,
 +                          "Failed to %s sink decompression state\n",
 +                          enable ? "enable" : "disable");
  }
  
  /* If the sink supports it, try to set the power state appropriately */
  void intel_dp_sink_dpms(struct intel_dp *intel_dp, int mode)
  {
 +      struct drm_i915_private *i915 = dp_to_i915(intel_dp);
        int ret, i;
  
        /* Should have a valid DPCD by this point */
        }
  
        if (ret != 1)
 -              DRM_DEBUG_KMS("failed to %s sink power state\n",
 -                            mode == DRM_MODE_DPMS_ON ? "enable" : "disable");
 +              drm_dbg_kms(&i915->drm, "failed to %s sink power state\n",
 +                          mode == DRM_MODE_DPMS_ON ? "enable" : "disable");
  }
  
  static bool cpt_dp_port_selected(struct drm_i915_private *dev_priv,
@@@ -3571,8 -3393,7 +3571,8 @@@ static void intel_dp_get_config(struct 
        }
  }
  
 -static void intel_disable_dp(struct intel_encoder *encoder,
 +static void intel_disable_dp(struct intel_atomic_state *state,
 +                           struct intel_encoder *encoder,
                             const struct intel_crtc_state *old_crtc_state,
                             const struct drm_connector_state *old_conn_state)
  {
        intel_edp_panel_off(intel_dp);
  }
  
 -static void g4x_disable_dp(struct intel_encoder *encoder,
 +static void g4x_disable_dp(struct intel_atomic_state *state,
 +                         struct intel_encoder *encoder,
                           const struct intel_crtc_state *old_crtc_state,
                           const struct drm_connector_state *old_conn_state)
  {
 -      intel_disable_dp(encoder, old_crtc_state, old_conn_state);
 +      intel_disable_dp(state, encoder, old_crtc_state, old_conn_state);
  }
  
 -static void vlv_disable_dp(struct intel_encoder *encoder,
 +static void vlv_disable_dp(struct intel_atomic_state *state,
 +                         struct intel_encoder *encoder,
                           const struct intel_crtc_state *old_crtc_state,
                           const struct drm_connector_state *old_conn_state)
  {
 -      intel_disable_dp(encoder, old_crtc_state, old_conn_state);
 +      intel_disable_dp(state, encoder, old_crtc_state, old_conn_state);
  }
  
 -static void g4x_post_disable_dp(struct intel_encoder *encoder,
 +static void g4x_post_disable_dp(struct intel_atomic_state *state,
 +                              struct intel_encoder *encoder,
                                const struct intel_crtc_state *old_crtc_state,
                                const struct drm_connector_state *old_conn_state)
  {
                ilk_edp_pll_off(intel_dp, old_crtc_state);
  }
  
 -static void vlv_post_disable_dp(struct intel_encoder *encoder,
 +static void vlv_post_disable_dp(struct intel_atomic_state *state,
 +                              struct intel_encoder *encoder,
                                const struct intel_crtc_state *old_crtc_state,
                                const struct drm_connector_state *old_conn_state)
  {
        intel_dp_link_down(encoder, old_crtc_state);
  }
  
 -static void chv_post_disable_dp(struct intel_encoder *encoder,
 +static void chv_post_disable_dp(struct intel_atomic_state *state,
 +                              struct intel_encoder *encoder,
                                const struct intel_crtc_state *old_crtc_state,
                                const struct drm_connector_state *old_conn_state)
  {
  }
  
  static void
 -_intel_dp_set_link_train(struct intel_dp *intel_dp,
 -                       u32 *DP,
 -                       u8 dp_train_pat)
 +cpt_set_link_train(struct intel_dp *intel_dp,
 +                 u8 dp_train_pat)
  {
        struct drm_i915_private *dev_priv = dp_to_i915(intel_dp);
 -      struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
 -      enum port port = intel_dig_port->base.port;
 -      u8 train_pat_mask = drm_dp_training_pattern_mask(intel_dp->dpcd);
 +      u32 *DP = &intel_dp->DP;
  
 -      if (dp_train_pat & train_pat_mask)
 -              drm_dbg_kms(&dev_priv->drm,
 -                          "Using DP training pattern TPS%d\n",
 -                          dp_train_pat & train_pat_mask);
 -
 -      if (HAS_DDI(dev_priv)) {
 -              u32 temp = intel_de_read(dev_priv, intel_dp->regs.dp_tp_ctl);
 -
 -              if (dp_train_pat & DP_LINK_SCRAMBLING_DISABLE)
 -                      temp |= DP_TP_CTL_SCRAMBLE_DISABLE;
 -              else
 -                      temp &= ~DP_TP_CTL_SCRAMBLE_DISABLE;
 +      *DP &= ~DP_LINK_TRAIN_MASK_CPT;
  
 -              temp &= ~DP_TP_CTL_LINK_TRAIN_MASK;
 -              switch (dp_train_pat & train_pat_mask) {
 -              case DP_TRAINING_PATTERN_DISABLE:
 -                      temp |= DP_TP_CTL_LINK_TRAIN_NORMAL;
 -
 -                      break;
 -              case DP_TRAINING_PATTERN_1:
 -                      temp |= DP_TP_CTL_LINK_TRAIN_PAT1;
 -                      break;
 -              case DP_TRAINING_PATTERN_2:
 -                      temp |= DP_TP_CTL_LINK_TRAIN_PAT2;
 -                      break;
 -              case DP_TRAINING_PATTERN_3:
 -                      temp |= DP_TP_CTL_LINK_TRAIN_PAT3;
 -                      break;
 -              case DP_TRAINING_PATTERN_4:
 -                      temp |= DP_TP_CTL_LINK_TRAIN_PAT4;
 -                      break;
 -              }
 -              intel_de_write(dev_priv, intel_dp->regs.dp_tp_ctl, temp);
 +      switch (dp_train_pat & DP_TRAINING_PATTERN_MASK) {
 +      case DP_TRAINING_PATTERN_DISABLE:
 +              *DP |= DP_LINK_TRAIN_OFF_CPT;
 +              break;
 +      case DP_TRAINING_PATTERN_1:
 +              *DP |= DP_LINK_TRAIN_PAT_1_CPT;
 +              break;
 +      case DP_TRAINING_PATTERN_2:
 +              *DP |= DP_LINK_TRAIN_PAT_2_CPT;
 +              break;
 +      case DP_TRAINING_PATTERN_3:
 +              drm_dbg_kms(&dev_priv->drm,
 +                          "TPS3 not supported, using TPS2 instead\n");
 +              *DP |= DP_LINK_TRAIN_PAT_2_CPT;
 +              break;
 +      }
  
 -      } else if ((IS_IVYBRIDGE(dev_priv) && port == PORT_A) ||
 -                 (HAS_PCH_CPT(dev_priv) && port != PORT_A)) {
 -              *DP &= ~DP_LINK_TRAIN_MASK_CPT;
 +      intel_de_write(dev_priv, intel_dp->output_reg, intel_dp->DP);
 +      intel_de_posting_read(dev_priv, intel_dp->output_reg);
 +}
  
 -              switch (dp_train_pat & DP_TRAINING_PATTERN_MASK) {
 -              case DP_TRAINING_PATTERN_DISABLE:
 -                      *DP |= DP_LINK_TRAIN_OFF_CPT;
 -                      break;
 -              case DP_TRAINING_PATTERN_1:
 -                      *DP |= DP_LINK_TRAIN_PAT_1_CPT;
 -                      break;
 -              case DP_TRAINING_PATTERN_2:
 -                      *DP |= DP_LINK_TRAIN_PAT_2_CPT;
 -                      break;
 -              case DP_TRAINING_PATTERN_3:
 -                      drm_dbg_kms(&dev_priv->drm,
 -                                  "TPS3 not supported, using TPS2 instead\n");
 -                      *DP |= DP_LINK_TRAIN_PAT_2_CPT;
 -                      break;
 -              }
 +static void
 +g4x_set_link_train(struct intel_dp *intel_dp,
 +                 u8 dp_train_pat)
 +{
 +      struct drm_i915_private *dev_priv = dp_to_i915(intel_dp);
 +      u32 *DP = &intel_dp->DP;
  
 -      } else {
 -              *DP &= ~DP_LINK_TRAIN_MASK;
 +      *DP &= ~DP_LINK_TRAIN_MASK;
  
 -              switch (dp_train_pat & DP_TRAINING_PATTERN_MASK) {
 -              case DP_TRAINING_PATTERN_DISABLE:
 -                      *DP |= DP_LINK_TRAIN_OFF;
 -                      break;
 -              case DP_TRAINING_PATTERN_1:
 -                      *DP |= DP_LINK_TRAIN_PAT_1;
 -                      break;
 -              case DP_TRAINING_PATTERN_2:
 -                      *DP |= DP_LINK_TRAIN_PAT_2;
 -                      break;
 -              case DP_TRAINING_PATTERN_3:
 -                      drm_dbg_kms(&dev_priv->drm,
 -                                  "TPS3 not supported, using TPS2 instead\n");
 -                      *DP |= DP_LINK_TRAIN_PAT_2;
 -                      break;
 -              }
 +      switch (dp_train_pat & DP_TRAINING_PATTERN_MASK) {
 +      case DP_TRAINING_PATTERN_DISABLE:
 +              *DP |= DP_LINK_TRAIN_OFF;
 +              break;
 +      case DP_TRAINING_PATTERN_1:
 +              *DP |= DP_LINK_TRAIN_PAT_1;
 +              break;
 +      case DP_TRAINING_PATTERN_2:
 +              *DP |= DP_LINK_TRAIN_PAT_2;
 +              break;
 +      case DP_TRAINING_PATTERN_3:
 +              drm_dbg_kms(&dev_priv->drm,
 +                          "TPS3 not supported, using TPS2 instead\n");
 +              *DP |= DP_LINK_TRAIN_PAT_2;
 +              break;
        }
 +
 +      intel_de_write(dev_priv, intel_dp->output_reg, intel_dp->DP);
 +      intel_de_posting_read(dev_priv, intel_dp->output_reg);
  }
  
  static void intel_dp_enable_port(struct intel_dp *intel_dp,
        intel_de_posting_read(dev_priv, intel_dp->output_reg);
  }
  
 -static void intel_enable_dp(struct intel_encoder *encoder,
 +static void intel_enable_dp(struct intel_atomic_state *state,
 +                          struct intel_encoder *encoder,
                            const struct intel_crtc_state *pipe_config,
                            const struct drm_connector_state *conn_state)
  {
        }
  }
  
 -static void g4x_enable_dp(struct intel_encoder *encoder,
 +static void g4x_enable_dp(struct intel_atomic_state *state,
 +                        struct intel_encoder *encoder,
                          const struct intel_crtc_state *pipe_config,
                          const struct drm_connector_state *conn_state)
  {
 -      intel_enable_dp(encoder, pipe_config, conn_state);
 +      intel_enable_dp(state, encoder, pipe_config, conn_state);
        intel_edp_backlight_on(pipe_config, conn_state);
  }
  
 -static void vlv_enable_dp(struct intel_encoder *encoder,
 +static void vlv_enable_dp(struct intel_atomic_state *state,
 +                        struct intel_encoder *encoder,
                          const struct intel_crtc_state *pipe_config,
                          const struct drm_connector_state *conn_state)
  {
        intel_edp_backlight_on(pipe_config, conn_state);
  }
  
 -static void g4x_pre_enable_dp(struct intel_encoder *encoder,
 +static void g4x_pre_enable_dp(struct intel_atomic_state *state,
 +                            struct intel_encoder *encoder,
                              const struct intel_crtc_state *pipe_config,
                              const struct drm_connector_state *conn_state)
  {
@@@ -3922,18 -3761,16 +3922,18 @@@ static void vlv_init_panel_power_sequen
        intel_dp_init_panel_power_sequencer_registers(intel_dp, true);
  }
  
 -static void vlv_pre_enable_dp(struct intel_encoder *encoder,
 +static void vlv_pre_enable_dp(struct intel_atomic_state *state,
 +                            struct intel_encoder *encoder,
                              const struct intel_crtc_state *pipe_config,
                              const struct drm_connector_state *conn_state)
  {
        vlv_phy_pre_encoder_enable(encoder, pipe_config);
  
 -      intel_enable_dp(encoder, pipe_config, conn_state);
 +      intel_enable_dp(state, encoder, pipe_config, conn_state);
  }
  
 -static void vlv_dp_pre_pll_enable(struct intel_encoder *encoder,
 +static void vlv_dp_pre_pll_enable(struct intel_atomic_state *state,
 +                                struct intel_encoder *encoder,
                                  const struct intel_crtc_state *pipe_config,
                                  const struct drm_connector_state *conn_state)
  {
        vlv_phy_pre_pll_enable(encoder, pipe_config);
  }
  
 -static void chv_pre_enable_dp(struct intel_encoder *encoder,
 +static void chv_pre_enable_dp(struct intel_atomic_state *state,
 +                            struct intel_encoder *encoder,
                              const struct intel_crtc_state *pipe_config,
                              const struct drm_connector_state *conn_state)
  {
        chv_phy_pre_encoder_enable(encoder, pipe_config);
  
 -      intel_enable_dp(encoder, pipe_config, conn_state);
 +      intel_enable_dp(state, encoder, pipe_config, conn_state);
  
        /* Second common lane will stay alive on its own now */
        chv_phy_release_cl2_override(encoder);
  }
  
 -static void chv_dp_pre_pll_enable(struct intel_encoder *encoder,
 +static void chv_dp_pre_pll_enable(struct intel_atomic_state *state,
 +                                struct intel_encoder *encoder,
                                  const struct intel_crtc_state *pipe_config,
                                  const struct drm_connector_state *conn_state)
  {
        chv_phy_pre_pll_enable(encoder, pipe_config);
  }
  
 -static void chv_dp_post_pll_disable(struct intel_encoder *encoder,
 +static void chv_dp_post_pll_disable(struct intel_atomic_state *state,
 +                                  struct intel_encoder *encoder,
                                    const struct intel_crtc_state *old_crtc_state,
                                    const struct drm_connector_state *old_conn_state)
  {
@@@ -4050,7 -3884,7 +4050,7 @@@ intel_dp_pre_emphasis_max(struct intel_
        }
  }
  
 -static u32 vlv_signal_levels(struct intel_dp *intel_dp)
 +static void vlv_set_signal_levels(struct intel_dp *intel_dp)
  {
        struct intel_encoder *encoder = &dp_to_dig_port(intel_dp)->base;
        unsigned long demph_reg_value, preemph_reg_value,
                        uniqtranscale_reg_value = 0x5598DA3A;
                        break;
                default:
 -                      return 0;
 +                      return;
                }
                break;
        case DP_TRAIN_PRE_EMPH_LEVEL_1:
                        uniqtranscale_reg_value = 0x55ADDA3A;
                        break;
                default:
 -                      return 0;
 +                      return;
                }
                break;
        case DP_TRAIN_PRE_EMPH_LEVEL_2:
                        uniqtranscale_reg_value = 0x55ADDA3A;
                        break;
                default:
 -                      return 0;
 +                      return;
                }
                break;
        case DP_TRAIN_PRE_EMPH_LEVEL_3:
                        uniqtranscale_reg_value = 0x55ADDA3A;
                        break;
                default:
 -                      return 0;
 +                      return;
                }
                break;
        default:
 -              return 0;
 +              return;
        }
  
        vlv_set_phy_signal_level(encoder, demph_reg_value, preemph_reg_value,
                                 uniqtranscale_reg_value, 0);
 -
 -      return 0;
  }
  
 -static u32 chv_signal_levels(struct intel_dp *intel_dp)
 +static void chv_set_signal_levels(struct intel_dp *intel_dp)
  {
        struct intel_encoder *encoder = &dp_to_dig_port(intel_dp)->base;
        u32 deemph_reg_value, margin_reg_value;
                        uniq_trans_scale = true;
                        break;
                default:
 -                      return 0;
 +                      return;
                }
                break;
        case DP_TRAIN_PRE_EMPH_LEVEL_1:
                        margin_reg_value = 154;
                        break;
                default:
 -                      return 0;
 +                      return;
                }
                break;
        case DP_TRAIN_PRE_EMPH_LEVEL_2:
                        margin_reg_value = 154;
                        break;
                default:
 -                      return 0;
 +                      return;
                }
                break;
        case DP_TRAIN_PRE_EMPH_LEVEL_3:
                        margin_reg_value = 154;
                        break;
                default:
 -                      return 0;
 +                      return;
                }
                break;
        default:
 -              return 0;
 +              return;
        }
  
        chv_set_phy_signal_level(encoder, deemph_reg_value,
                                 margin_reg_value, uniq_trans_scale);
 -
 -      return 0;
  }
  
 -static u32
 -g4x_signal_levels(u8 train_set)
 +static u32 g4x_signal_levels(u8 train_set)
  {
        u32 signal_levels = 0;
  
        return signal_levels;
  }
  
 +static void
 +g4x_set_signal_levels(struct intel_dp *intel_dp)
 +{
 +      struct drm_i915_private *dev_priv = dp_to_i915(intel_dp);
 +      u8 train_set = intel_dp->train_set[0];
 +      u32 signal_levels;
 +
 +      signal_levels = g4x_signal_levels(train_set);
 +
 +      drm_dbg_kms(&dev_priv->drm, "Using signal levels %08x\n",
 +                  signal_levels);
 +
 +      intel_dp->DP &= ~(DP_VOLTAGE_MASK | DP_PRE_EMPHASIS_MASK);
 +      intel_dp->DP |= signal_levels;
 +
 +      intel_de_write(dev_priv, intel_dp->output_reg, intel_dp->DP);
 +      intel_de_posting_read(dev_priv, intel_dp->output_reg);
 +}
 +
  /* SNB CPU eDP voltage swing and pre-emphasis control */
 -static u32
 -snb_cpu_edp_signal_levels(u8 train_set)
 +static u32 snb_cpu_edp_signal_levels(u8 train_set)
  {
 -      int signal_levels = train_set & (DP_TRAIN_VOLTAGE_SWING_MASK |
 -                                       DP_TRAIN_PRE_EMPHASIS_MASK);
 +      u8 signal_levels = train_set & (DP_TRAIN_VOLTAGE_SWING_MASK |
 +                                      DP_TRAIN_PRE_EMPHASIS_MASK);
 +
        switch (signal_levels) {
        case DP_TRAIN_VOLTAGE_SWING_LEVEL_0 | DP_TRAIN_PRE_EMPH_LEVEL_0:
        case DP_TRAIN_VOLTAGE_SWING_LEVEL_1 | DP_TRAIN_PRE_EMPH_LEVEL_0:
        }
  }
  
 +static void
 +snb_cpu_edp_set_signal_levels(struct intel_dp *intel_dp)
 +{
 +      struct drm_i915_private *dev_priv = dp_to_i915(intel_dp);
 +      u8 train_set = intel_dp->train_set[0];
 +      u32 signal_levels;
 +
 +      signal_levels = snb_cpu_edp_signal_levels(train_set);
 +
 +      drm_dbg_kms(&dev_priv->drm, "Using signal levels %08x\n",
 +                  signal_levels);
 +
 +      intel_dp->DP &= ~EDP_LINK_TRAIN_VOL_EMP_MASK_SNB;
 +      intel_dp->DP |= signal_levels;
 +
 +      intel_de_write(dev_priv, intel_dp->output_reg, intel_dp->DP);
 +      intel_de_posting_read(dev_priv, intel_dp->output_reg);
 +}
 +
  /* IVB CPU eDP voltage swing and pre-emphasis control */
 -static u32
 -ivb_cpu_edp_signal_levels(u8 train_set)
 +static u32 ivb_cpu_edp_signal_levels(u8 train_set)
  {
 -      int signal_levels = train_set & (DP_TRAIN_VOLTAGE_SWING_MASK |
 -                                       DP_TRAIN_PRE_EMPHASIS_MASK);
 +      u8 signal_levels = train_set & (DP_TRAIN_VOLTAGE_SWING_MASK |
 +                                      DP_TRAIN_PRE_EMPHASIS_MASK);
 +
        switch (signal_levels) {
        case DP_TRAIN_VOLTAGE_SWING_LEVEL_0 | DP_TRAIN_PRE_EMPH_LEVEL_0:
                return EDP_LINK_TRAIN_400MV_0DB_IVB;
        }
  }
  
 -void
 -intel_dp_set_signal_levels(struct intel_dp *intel_dp)
 +static void
 +ivb_cpu_edp_set_signal_levels(struct intel_dp *intel_dp)
  {
        struct drm_i915_private *dev_priv = dp_to_i915(intel_dp);
 -      struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
 -      enum port port = intel_dig_port->base.port;
 -      u32 signal_levels, mask = 0;
        u8 train_set = intel_dp->train_set[0];
 +      u32 signal_levels;
  
 -      if (IS_GEN9_LP(dev_priv) || INTEL_GEN(dev_priv) >= 10) {
 -              signal_levels = bxt_signal_levels(intel_dp);
 -      } else if (HAS_DDI(dev_priv)) {
 -              signal_levels = ddi_signal_levels(intel_dp);
 -              mask = DDI_BUF_EMP_MASK;
 -      } else if (IS_CHERRYVIEW(dev_priv)) {
 -              signal_levels = chv_signal_levels(intel_dp);
 -      } else if (IS_VALLEYVIEW(dev_priv)) {
 -              signal_levels = vlv_signal_levels(intel_dp);
 -      } else if (IS_IVYBRIDGE(dev_priv) && port == PORT_A) {
 -              signal_levels = ivb_cpu_edp_signal_levels(train_set);
 -              mask = EDP_LINK_TRAIN_VOL_EMP_MASK_IVB;
 -      } else if (IS_GEN(dev_priv, 6) && port == PORT_A) {
 -              signal_levels = snb_cpu_edp_signal_levels(train_set);
 -              mask = EDP_LINK_TRAIN_VOL_EMP_MASK_SNB;
 -      } else {
 -              signal_levels = g4x_signal_levels(train_set);
 -              mask = DP_VOLTAGE_MASK | DP_PRE_EMPHASIS_MASK;
 -      }
 +      signal_levels = ivb_cpu_edp_signal_levels(train_set);
  
 -      if (mask)
 -              drm_dbg_kms(&dev_priv->drm, "Using signal levels %08x\n",
 -                          signal_levels);
 +      drm_dbg_kms(&dev_priv->drm, "Using signal levels %08x\n",
 +                  signal_levels);
  
 -      drm_dbg_kms(&dev_priv->drm, "Using vswing level %d%s\n",
 -                  train_set & DP_TRAIN_VOLTAGE_SWING_MASK,
 +      intel_dp->DP &= ~EDP_LINK_TRAIN_VOL_EMP_MASK_IVB;
 +      intel_dp->DP |= signal_levels;
 +
 +      intel_de_write(dev_priv, intel_dp->output_reg, intel_dp->DP);
 +      intel_de_posting_read(dev_priv, intel_dp->output_reg);
 +}
 +
 +void intel_dp_set_signal_levels(struct intel_dp *intel_dp)
 +{
 +      struct drm_i915_private *dev_priv = dp_to_i915(intel_dp);
 +      u8 train_set = intel_dp->train_set[0];
 +
 +      drm_dbg_kms(&dev_priv->drm, "Using vswing level %d%s\n",
 +                  train_set & DP_TRAIN_VOLTAGE_SWING_MASK,
                    train_set & DP_TRAIN_MAX_SWING_REACHED ? " (max)" : "");
        drm_dbg_kms(&dev_priv->drm, "Using pre-emphasis level %d%s\n",
                    (train_set & DP_TRAIN_PRE_EMPHASIS_MASK) >>
                    train_set & DP_TRAIN_MAX_PRE_EMPHASIS_REACHED ?
                    " (max)" : "");
  
 -      intel_dp->DP = (intel_dp->DP & ~mask) | signal_levels;
 -
 -      intel_de_write(dev_priv, intel_dp->output_reg, intel_dp->DP);
 -      intel_de_posting_read(dev_priv, intel_dp->output_reg);
 +      intel_dp->set_signal_levels(intel_dp);
  }
  
  void
  intel_dp_program_link_training_pattern(struct intel_dp *intel_dp,
                                       u8 dp_train_pat)
  {
 -      struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
 -      struct drm_i915_private *dev_priv =
 -              to_i915(intel_dig_port->base.base.dev);
 +      struct drm_i915_private *dev_priv = dp_to_i915(intel_dp);
 +      u8 train_pat_mask = drm_dp_training_pattern_mask(intel_dp->dpcd);
  
 -      _intel_dp_set_link_train(intel_dp, &intel_dp->DP, dp_train_pat);
 +      if (dp_train_pat & train_pat_mask)
 +              drm_dbg_kms(&dev_priv->drm,
 +                          "Using DP training pattern TPS%d\n",
 +                          dp_train_pat & train_pat_mask);
  
 -      intel_de_write(dev_priv, intel_dp->output_reg, intel_dp->DP);
 -      intel_de_posting_read(dev_priv, intel_dp->output_reg);
 +      intel_dp->set_link_train(intel_dp, dp_train_pat);
  }
  
  void intel_dp_set_idle_link_train(struct intel_dp *intel_dp)
  {
 -      struct drm_i915_private *dev_priv = dp_to_i915(intel_dp);
 -      struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
 -      enum port port = intel_dig_port->base.port;
 -      u32 val;
 -
 -      if (!HAS_DDI(dev_priv))
 -              return;
 -
 -      val = intel_de_read(dev_priv, intel_dp->regs.dp_tp_ctl);
 -      val &= ~DP_TP_CTL_LINK_TRAIN_MASK;
 -      val |= DP_TP_CTL_LINK_TRAIN_IDLE;
 -      intel_de_write(dev_priv, intel_dp->regs.dp_tp_ctl, val);
 -
 -      /*
 -       * Until TGL on PORT_A we can have only eDP in SST mode. There the only
 -       * reason we need to set idle transmission mode is to work around a HW
 -       * issue where we enable the pipe while not in idle link-training mode.
 -       * In this case there is requirement to wait for a minimum number of
 -       * idle patterns to be sent.
 -       */
 -      if (port == PORT_A && INTEL_GEN(dev_priv) < 12)
 -              return;
 -
 -      if (intel_de_wait_for_set(dev_priv, intel_dp->regs.dp_tp_status,
 -                                DP_TP_STATUS_IDLE_DONE, 1))
 -              drm_err(&dev_priv->drm,
 -                      "Timed out waiting for DP idle patterns\n");
 +      if (intel_dp->set_idle_link_train)
 +              intel_dp->set_idle_link_train(intel_dp);
  }
  
  static void
@@@ -4482,7 -4319,6 +4482,7 @@@ intel_dp_link_down(struct intel_encode
  static void
  intel_dp_extended_receiver_capabilities(struct intel_dp *intel_dp)
  {
 +      struct drm_i915_private *i915 = dp_to_i915(intel_dp);
        u8 dpcd_ext[6];
  
        /*
  
        if (drm_dp_dpcd_read(&intel_dp->aux, DP_DP13_DPCD_REV,
                             &dpcd_ext, sizeof(dpcd_ext)) != sizeof(dpcd_ext)) {
 -              DRM_ERROR("DPCD failed read at extended capabilities\n");
 +              drm_err(&i915->drm,
 +                      "DPCD failed read at extended capabilities\n");
                return;
        }
  
        if (intel_dp->dpcd[DP_DPCD_REV] > dpcd_ext[DP_DPCD_REV]) {
 -              DRM_DEBUG_KMS("DPCD extended DPCD rev less than base DPCD rev\n");
 +              drm_dbg_kms(&i915->drm,
 +                          "DPCD extended DPCD rev less than base DPCD rev\n");
                return;
        }
  
        if (!memcmp(intel_dp->dpcd, dpcd_ext, sizeof(dpcd_ext)))
                return;
  
 -      DRM_DEBUG_KMS("Base DPCD: %*ph\n",
 -                    (int)sizeof(intel_dp->dpcd), intel_dp->dpcd);
 +      drm_dbg_kms(&i915->drm, "Base DPCD: %*ph\n",
 +                  (int)sizeof(intel_dp->dpcd), intel_dp->dpcd);
  
        memcpy(intel_dp->dpcd, dpcd_ext, sizeof(dpcd_ext));
  }
  bool
  intel_dp_read_dpcd(struct intel_dp *intel_dp)
  {
 +      struct drm_i915_private *i915 = dp_to_i915(intel_dp);
 +
        if (drm_dp_dpcd_read(&intel_dp->aux, 0x000, intel_dp->dpcd,
                             sizeof(intel_dp->dpcd)) < 0)
                return false; /* aux transfer failed */
  
        intel_dp_extended_receiver_capabilities(intel_dp);
  
 -      DRM_DEBUG_KMS("DPCD: %*ph\n", (int) sizeof(intel_dp->dpcd), intel_dp->dpcd);
 +      drm_dbg_kms(&i915->drm, "DPCD: %*ph\n", (int)sizeof(intel_dp->dpcd),
 +                  intel_dp->dpcd);
  
        return intel_dp->dpcd[DP_DPCD_REV] != 0;
  }
@@@ -4547,8 -4378,6 +4547,8 @@@ bool intel_dp_get_colorimetry_status(st
  
  static void intel_dp_get_dsc_sink_cap(struct intel_dp *intel_dp)
  {
 +      struct drm_i915_private *i915 = dp_to_i915(intel_dp);
 +
        /*
         * Clear the cached register set to avoid using stale values
         * for the sinks that do not support DSC.
                if (drm_dp_dpcd_read(&intel_dp->aux, DP_DSC_SUPPORT,
                                     intel_dp->dsc_dpcd,
                                     sizeof(intel_dp->dsc_dpcd)) < 0)
 -                      DRM_ERROR("Failed to read DPCD register 0x%x\n",
 -                                DP_DSC_SUPPORT);
 +                      drm_err(&i915->drm,
 +                              "Failed to read DPCD register 0x%x\n",
 +                              DP_DSC_SUPPORT);
  
 -              DRM_DEBUG_KMS("DSC DPCD: %*ph\n",
 -                            (int)sizeof(intel_dp->dsc_dpcd),
 -                            intel_dp->dsc_dpcd);
 +              drm_dbg_kms(&i915->drm, "DSC DPCD: %*ph\n",
 +                          (int)sizeof(intel_dp->dsc_dpcd),
 +                          intel_dp->dsc_dpcd);
  
                /* FEC is supported only on DP 1.4 */
                if (!intel_dp_is_edp(intel_dp) &&
                    drm_dp_dpcd_readb(&intel_dp->aux, DP_FEC_CAPABILITY,
                                      &intel_dp->fec_capable) < 0)
 -                      DRM_ERROR("Failed to read FEC DPCD register\n");
 +                      drm_err(&i915->drm,
 +                              "Failed to read FEC DPCD register\n");
  
 -              DRM_DEBUG_KMS("FEC CAPABILITY: %x\n", intel_dp->fec_capable);
 +              drm_dbg_kms(&i915->drm, "FEC CAPABILITY: %x\n",
 +                          intel_dp->fec_capable);
        }
  }
  
@@@ -4754,16 -4580,14 +4754,16 @@@ intel_dp_can_mst(struct intel_dp *intel
  static void
  intel_dp_configure_mst(struct intel_dp *intel_dp)
  {
 +      struct drm_i915_private *i915 = dp_to_i915(intel_dp);
        struct intel_encoder *encoder =
                &dp_to_dig_port(intel_dp)->base;
        bool sink_can_mst = intel_dp_sink_can_mst(intel_dp);
  
 -      DRM_DEBUG_KMS("[ENCODER:%d:%s] MST support: port: %s, sink: %s, modparam: %s\n",
 -                    encoder->base.base.id, encoder->base.name,
 -                    yesno(intel_dp->can_mst), yesno(sink_can_mst),
 -                    yesno(i915_modparams.enable_dp_mst));
 +      drm_dbg_kms(&i915->drm,
 +                  "[ENCODER:%d:%s] MST support: port: %s, sink: %s, modparam: %s\n",
 +                  encoder->base.base.id, encoder->base.name,
 +                  yesno(intel_dp->can_mst), yesno(sink_can_mst),
 +                  yesno(i915_modparams.enable_dp_mst));
  
        if (!intel_dp->can_mst)
                return;
@@@ -4809,92 -4633,158 +4809,92 @@@ intel_dp_needs_vsc_sdp(const struct int
        return false;
  }
  
 -static void
 -intel_dp_setup_vsc_sdp(struct intel_dp *intel_dp,
 -                     const struct intel_crtc_state *crtc_state,
 -                     const struct drm_connector_state *conn_state)
 +static ssize_t intel_dp_vsc_sdp_pack(const struct drm_dp_vsc_sdp *vsc,
 +                                   struct dp_sdp *sdp, size_t size)
  {
 -      struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
 -      struct dp_sdp vsc_sdp = {};
 +      size_t length = sizeof(struct dp_sdp);
 +
 +      if (size < length)
 +              return -ENOSPC;
  
 -      /* Prepare VSC Header for SU as per DP 1.4a spec, Table 2-119 */
 -      vsc_sdp.sdp_header.HB0 = 0;
 -      vsc_sdp.sdp_header.HB1 = 0x7;
 +      memset(sdp, 0, size);
  
        /*
 -       * VSC SDP supporting 3D stereo, PSR2, and Pixel Encoding/
 -       * Colorimetry Format indication.
 +       * Prepare VSC Header for SU as per DP 1.4a spec, Table 2-119
 +       * VSC SDP Header Bytes
         */
 -      vsc_sdp.sdp_header.HB2 = 0x5;
 +      sdp->sdp_header.HB0 = 0; /* Secondary-Data Packet ID = 0 */
 +      sdp->sdp_header.HB1 = vsc->sdp_type; /* Secondary-data Packet Type */
 +      sdp->sdp_header.HB2 = vsc->revision; /* Revision Number */
 +      sdp->sdp_header.HB3 = vsc->length; /* Number of Valid Data Bytes */
  
        /*
 -       * VSC SDP supporting 3D stereo, + PSR2, + Pixel Encoding/
 -       * Colorimetry Format indication (HB2 = 05h).
 +       * Only revision 0x5 supports Pixel Encoding/Colorimetry Format as
 +       * per DP 1.4a spec.
         */
 -      vsc_sdp.sdp_header.HB3 = 0x13;
 -
 -      /* DP 1.4a spec, Table 2-120 */
 -      switch (crtc_state->output_format) {
 -      case INTEL_OUTPUT_FORMAT_YCBCR444:
 -              vsc_sdp.db[16] = 0x1 << 4; /* YCbCr 444 : DB16[7:4] = 1h */
 -              break;
 -      case INTEL_OUTPUT_FORMAT_YCBCR420:
 -              vsc_sdp.db[16] = 0x3 << 4; /* YCbCr 420 : DB16[7:4] = 3h */
 -              break;
 -      case INTEL_OUTPUT_FORMAT_RGB:
 -      default:
 -              /* RGB: DB16[7:4] = 0h */
 -              break;
 -      }
 +      if (vsc->revision != 0x5)
 +              goto out;
  
 -      switch (conn_state->colorspace) {
 -      case DRM_MODE_COLORIMETRY_BT709_YCC:
 -              vsc_sdp.db[16] |= 0x1;
 -              break;
 -      case DRM_MODE_COLORIMETRY_XVYCC_601:
 -              vsc_sdp.db[16] |= 0x2;
 -              break;
 -      case DRM_MODE_COLORIMETRY_XVYCC_709:
 -              vsc_sdp.db[16] |= 0x3;
 -              break;
 -      case DRM_MODE_COLORIMETRY_SYCC_601:
 -              vsc_sdp.db[16] |= 0x4;
 -              break;
 -      case DRM_MODE_COLORIMETRY_OPYCC_601:
 -              vsc_sdp.db[16] |= 0x5;
 -              break;
 -      case DRM_MODE_COLORIMETRY_BT2020_CYCC:
 -      case DRM_MODE_COLORIMETRY_BT2020_RGB:
 -              vsc_sdp.db[16] |= 0x6;
 -              break;
 -      case DRM_MODE_COLORIMETRY_BT2020_YCC:
 -              vsc_sdp.db[16] |= 0x7;
 -              break;
 -      case DRM_MODE_COLORIMETRY_DCI_P3_RGB_D65:
 -      case DRM_MODE_COLORIMETRY_DCI_P3_RGB_THEATER:
 -              vsc_sdp.db[16] |= 0x4; /* DCI-P3 (SMPTE RP 431-2) */
 -              break;
 -      default:
 -              /* sRGB (IEC 61966-2-1) / ITU-R BT.601: DB16[0:3] = 0h */
 +      /* VSC SDP Payload for DB16 through DB18 */
 +      /* Pixel Encoding and Colorimetry Formats  */
 +      sdp->db[16] = (vsc->pixelformat & 0xf) << 4; /* DB16[7:4] */
 +      sdp->db[16] |= vsc->colorimetry & 0xf; /* DB16[3:0] */
  
 -              /* RGB->YCBCR color conversion uses the BT.709 color space. */
 -              if (crtc_state->output_format == INTEL_OUTPUT_FORMAT_YCBCR420)
 -                      vsc_sdp.db[16] |= 0x1; /* 0x1, ITU-R BT.709 */
 +      switch (vsc->bpc) {
 +      case 6:
 +              /* 6bpc: 0x0 */
                break;
 -      }
 -
 -      /*
 -       * For pixel encoding formats YCbCr444, YCbCr422, YCbCr420, and Y Only,
 -       * the following Component Bit Depth values are defined:
 -       * 001b = 8bpc.
 -       * 010b = 10bpc.
 -       * 011b = 12bpc.
 -       * 100b = 16bpc.
 -       */
 -      switch (crtc_state->pipe_bpp) {
 -      case 24: /* 8bpc */
 -              vsc_sdp.db[17] = 0x1;
 +      case 8:
 +              sdp->db[17] = 0x1; /* DB17[3:0] */
                break;
 -      case 30: /* 10bpc */
 -              vsc_sdp.db[17] = 0x2;
 +      case 10:
 +              sdp->db[17] = 0x2;
                break;
 -      case 36: /* 12bpc */
 -              vsc_sdp.db[17] = 0x3;
 +      case 12:
 +              sdp->db[17] = 0x3;
                break;
 -      case 48: /* 16bpc */
 -              vsc_sdp.db[17] = 0x4;
 +      case 16:
 +              sdp->db[17] = 0x4;
                break;
        default:
 -              MISSING_CASE(crtc_state->pipe_bpp);
 +              MISSING_CASE(vsc->bpc);
                break;
        }
 +      /* Dynamic Range and Component Bit Depth */
 +      if (vsc->dynamic_range == DP_DYNAMIC_RANGE_CTA)
 +              sdp->db[17] |= 0x80;  /* DB17[7] */
  
 -      /*
 -       * Dynamic Range (Bit 7)
 -       * 0 = VESA range, 1 = CTA range.
 -       * all YCbCr are always limited range
 -       */
 -      vsc_sdp.db[17] |= 0x80;
 -
 -      /*
 -       * Content Type (Bits 2:0)
 -       * 000b = Not defined.
 -       * 001b = Graphics.
 -       * 010b = Photo.
 -       * 011b = Video.
 -       * 100b = Game
 -       * All other values are RESERVED.
 -       * Note: See CTA-861-G for the definition and expected
 -       * processing by a stream sink for the above contect types.
 -       */
 -      vsc_sdp.db[18] = 0;
 +      /* Content Type */
 +      sdp->db[18] = vsc->content_type & 0x7;
  
 -      intel_dig_port->write_infoframe(&intel_dig_port->base,
 -                      crtc_state, DP_SDP_VSC, &vsc_sdp, sizeof(vsc_sdp));
 +out:
 +      return length;
  }
  
 -static void
 -intel_dp_setup_hdr_metadata_infoframe_sdp(struct intel_dp *intel_dp,
 -                                        const struct intel_crtc_state *crtc_state,
 -                                        const struct drm_connector_state *conn_state)
 +static ssize_t
 +intel_dp_hdr_metadata_infoframe_sdp_pack(const struct hdmi_drm_infoframe *drm_infoframe,
 +                                       struct dp_sdp *sdp,
 +                                       size_t size)
  {
 -      struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
 -      struct dp_sdp infoframe_sdp = {};
 -      struct hdmi_drm_infoframe drm_infoframe = {};
 +      size_t length = sizeof(struct dp_sdp);
        const int infoframe_size = HDMI_INFOFRAME_HEADER_SIZE + HDMI_DRM_INFOFRAME_SIZE;
        unsigned char buf[HDMI_INFOFRAME_HEADER_SIZE + HDMI_DRM_INFOFRAME_SIZE];
        ssize_t len;
 -      int ret;
  
 -      ret = drm_hdmi_infoframe_set_hdr_metadata(&drm_infoframe, conn_state);
 -      if (ret) {
 -              DRM_DEBUG_KMS("couldn't set HDR metadata in infoframe\n");
 -              return;
 -      }
 +      if (size < length)
 +              return -ENOSPC;
  
 -      len = hdmi_drm_infoframe_pack_only(&drm_infoframe, buf, sizeof(buf));
 +      memset(sdp, 0, size);
 +
 +      len = hdmi_drm_infoframe_pack_only(drm_infoframe, buf, sizeof(buf));
        if (len < 0) {
                DRM_DEBUG_KMS("buffer size is smaller than hdr metadata infoframe\n");
 -              return;
 +              return -ENOSPC;
        }
  
        if (len != infoframe_size) {
                DRM_DEBUG_KMS("wrong static hdr metadata size\n");
 -              return;
 +              return -ENOSPC;
        }
  
        /*
         * Table 2-100 and Table 2-101
         */
  
 -      /* Packet ID, 00h for non-Audio INFOFRAME */
 -      infoframe_sdp.sdp_header.HB0 = 0;
 +      /* Secondary-Data Packet ID, 00h for non-Audio INFOFRAME */
 +      sdp->sdp_header.HB0 = 0;
        /*
         * Packet Type 80h + Non-audio INFOFRAME Type value
 -       * HDMI_INFOFRAME_TYPE_DRM: 0x87,
 +       * HDMI_INFOFRAME_TYPE_DRM: 0x87
 +       * - 80h + Non-audio INFOFRAME Type value
 +       * - InfoFrame Type: 0x07
 +       *    [CTA-861-G Table-42 Dynamic Range and Mastering InfoFrame]
         */
 -      infoframe_sdp.sdp_header.HB1 = drm_infoframe.type;
 +      sdp->sdp_header.HB1 = drm_infoframe->type;
        /*
         * Least Significant Eight Bits of (Data Byte Count â€“ 1)
 -       * infoframe_size - 1,
 +       * infoframe_size - 1
         */
 -      infoframe_sdp.sdp_header.HB2 = 0x1D;
 +      sdp->sdp_header.HB2 = 0x1D;
        /* INFOFRAME SDP Version Number */
 -      infoframe_sdp.sdp_header.HB3 = (0x13 << 2);
 +      sdp->sdp_header.HB3 = (0x13 << 2);
        /* CTA Header Byte 2 (INFOFRAME Version Number) */
 -      infoframe_sdp.db[0] = drm_infoframe.version;
 +      sdp->db[0] = drm_infoframe->version;
        /* CTA Header Byte 3 (Length of INFOFRAME): HDMI_DRM_INFOFRAME_SIZE */
 -      infoframe_sdp.db[1] = drm_infoframe.length;
 +      sdp->db[1] = drm_infoframe->length;
        /*
         * Copy HDMI_DRM_INFOFRAME_SIZE size from a buffer after
         * HDMI_INFOFRAME_HEADER_SIZE
         */
 -      BUILD_BUG_ON(sizeof(infoframe_sdp.db) < HDMI_DRM_INFOFRAME_SIZE + 2);
 -      memcpy(&infoframe_sdp.db[2], &buf[HDMI_INFOFRAME_HEADER_SIZE],
 +      BUILD_BUG_ON(sizeof(sdp->db) < HDMI_DRM_INFOFRAME_SIZE + 2);
 +      memcpy(&sdp->db[2], &buf[HDMI_INFOFRAME_HEADER_SIZE],
               HDMI_DRM_INFOFRAME_SIZE);
  
        /*
 -       * Size of DP infoframe sdp packet for HDR static metadata is consist of
 +       * Size of DP infoframe sdp packet for HDR static metadata consists of
         * - DP SDP Header(struct dp_sdp_header): 4 bytes
         * - Two Data Blocks: 2 bytes
         *    CTA Header Byte2 (INFOFRAME Version Number)
         * infoframe size. But GEN11+ has larger than that size, write_infoframe
         * will pad rest of the size.
         */
 -      intel_dig_port->write_infoframe(&intel_dig_port->base, crtc_state,
 -                                      HDMI_PACKET_TYPE_GAMUT_METADATA,
 -                                      &infoframe_sdp,
 -                                      sizeof(struct dp_sdp_header) + 2 + HDMI_DRM_INFOFRAME_SIZE);
 +      return sizeof(struct dp_sdp_header) + 2 + HDMI_DRM_INFOFRAME_SIZE;
  }
  
 -void intel_dp_vsc_enable(struct intel_dp *intel_dp,
 -                       const struct intel_crtc_state *crtc_state,
 -                       const struct drm_connector_state *conn_state)
 +static void intel_write_dp_sdp(struct intel_encoder *encoder,
 +                             const struct intel_crtc_state *crtc_state,
 +                             unsigned int type)
  {
 -      if (!intel_dp_needs_vsc_sdp(crtc_state, conn_state))
 +      struct intel_digital_port *intel_dig_port = enc_to_dig_port(encoder);
 +      struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
 +      struct dp_sdp sdp = {};
 +      ssize_t len;
 +
 +      if ((crtc_state->infoframes.enable &
 +           intel_hdmi_infoframe_enable(type)) == 0)
                return;
  
 -      intel_dp_setup_vsc_sdp(intel_dp, crtc_state, conn_state);
 +      switch (type) {
 +      case DP_SDP_VSC:
 +              len = intel_dp_vsc_sdp_pack(&crtc_state->infoframes.vsc, &sdp,
 +                                          sizeof(sdp));
 +              break;
 +      case HDMI_PACKET_TYPE_GAMUT_METADATA:
 +              len = intel_dp_hdr_metadata_infoframe_sdp_pack(&crtc_state->infoframes.drm.drm,
 +                                                             &sdp, sizeof(sdp));
 +              break;
 +      default:
 +              MISSING_CASE(type);
 +              return;
 +      }
 +
 +      if (drm_WARN_ON(&dev_priv->drm, len < 0))
 +              return;
 +
 +      intel_dig_port->write_infoframe(encoder, crtc_state, type, &sdp, len);
  }
  
 -void intel_dp_hdr_metadata_enable(struct intel_dp *intel_dp,
 -                                const struct intel_crtc_state *crtc_state,
 -                                const struct drm_connector_state *conn_state)
 +void intel_write_dp_vsc_sdp(struct intel_encoder *encoder,
 +                          const struct intel_crtc_state *crtc_state,
 +                          struct drm_dp_vsc_sdp *vsc)
  {
 -      if (!conn_state->hdr_output_metadata)
 +      struct intel_digital_port *intel_dig_port = enc_to_dig_port(encoder);
 +      struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
 +      struct dp_sdp sdp = {};
 +      ssize_t len;
 +
 +      len = intel_dp_vsc_sdp_pack(vsc, &sdp, sizeof(sdp));
 +
 +      if (drm_WARN_ON(&dev_priv->drm, len < 0))
                return;
  
 -      intel_dp_setup_hdr_metadata_infoframe_sdp(intel_dp,
 -                                                crtc_state,
 -                                                conn_state);
 +      intel_dig_port->write_infoframe(encoder, crtc_state, DP_SDP_VSC,
 +                                      &sdp, len);
 +}
 +
 +void intel_dp_set_infoframes(struct intel_encoder *encoder,
 +                           bool enable,
 +                           const struct intel_crtc_state *crtc_state,
 +                           const struct drm_connector_state *conn_state)
 +{
 +      struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
 +      struct intel_dp *intel_dp = enc_to_intel_dp(encoder);
 +      i915_reg_t reg = HSW_TVIDEO_DIP_CTL(crtc_state->cpu_transcoder);
 +      u32 dip_enable = VIDEO_DIP_ENABLE_AVI_HSW | VIDEO_DIP_ENABLE_GCP_HSW |
 +                       VIDEO_DIP_ENABLE_VS_HSW | VIDEO_DIP_ENABLE_GMP_HSW |
 +                       VIDEO_DIP_ENABLE_SPD_HSW | VIDEO_DIP_ENABLE_DRM_GLK;
 +      u32 val = intel_de_read(dev_priv, reg);
 +
 +      /* TODO: Add DSC case (DIP_ENABLE_PPS) */
 +      /* When PSR is enabled, this routine doesn't disable VSC DIP */
 +      if (intel_psr_enabled(intel_dp))
 +              val &= ~dip_enable;
 +      else
 +              val &= ~(dip_enable | VIDEO_DIP_ENABLE_VSC_HSW);
 +
 +      if (!enable) {
 +              intel_de_write(dev_priv, reg, val);
 +              intel_de_posting_read(dev_priv, reg);
 +              return;
 +      }
 +
 +      intel_de_write(dev_priv, reg, val);
 +      intel_de_posting_read(dev_priv, reg);
 +
 +      /* When PSR is enabled, VSC SDP is handled by PSR routine */
 +      if (!intel_psr_enabled(intel_dp))
 +              intel_write_dp_sdp(encoder, crtc_state, DP_SDP_VSC);
 +
 +      intel_write_dp_sdp(encoder, crtc_state, HDMI_PACKET_TYPE_GAMUT_METADATA);
 +}
 +
 +static int intel_dp_vsc_sdp_unpack(struct drm_dp_vsc_sdp *vsc,
 +                                 const void *buffer, size_t size)
 +{
 +      const struct dp_sdp *sdp = buffer;
 +
 +      if (size < sizeof(struct dp_sdp))
 +              return -EINVAL;
 +
 +      memset(vsc, 0, size);
 +
 +      if (sdp->sdp_header.HB0 != 0)
 +              return -EINVAL;
 +
 +      if (sdp->sdp_header.HB1 != DP_SDP_VSC)
 +              return -EINVAL;
 +
 +      vsc->sdp_type = sdp->sdp_header.HB1;
 +      vsc->revision = sdp->sdp_header.HB2;
 +      vsc->length = sdp->sdp_header.HB3;
 +
 +      if ((sdp->sdp_header.HB2 == 0x2 && sdp->sdp_header.HB3 == 0x8) ||
 +          (sdp->sdp_header.HB2 == 0x4 && sdp->sdp_header.HB3 == 0xe)) {
 +              /*
 +               * - HB2 = 0x2, HB3 = 0x8
 +               *   VSC SDP supporting 3D stereo + PSR
 +               * - HB2 = 0x4, HB3 = 0xe
 +               *   VSC SDP supporting 3D stereo + PSR2 with Y-coordinate of
 +               *   first scan line of the SU region (applies to eDP v1.4b
 +               *   and higher).
 +               */
 +              return 0;
 +      } else if (sdp->sdp_header.HB2 == 0x5 && sdp->sdp_header.HB3 == 0x13) {
 +              /*
 +               * - HB2 = 0x5, HB3 = 0x13
 +               *   VSC SDP supporting 3D stereo + PSR2 + Pixel Encoding/Colorimetry
 +               *   Format.
 +               */
 +              vsc->pixelformat = (sdp->db[16] >> 4) & 0xf;
 +              vsc->colorimetry = sdp->db[16] & 0xf;
 +              vsc->dynamic_range = (sdp->db[17] >> 7) & 0x1;
 +
 +              switch (sdp->db[17] & 0x7) {
 +              case 0x0:
 +                      vsc->bpc = 6;
 +                      break;
 +              case 0x1:
 +                      vsc->bpc = 8;
 +                      break;
 +              case 0x2:
 +                      vsc->bpc = 10;
 +                      break;
 +              case 0x3:
 +                      vsc->bpc = 12;
 +                      break;
 +              case 0x4:
 +                      vsc->bpc = 16;
 +                      break;
 +              default:
 +                      MISSING_CASE(sdp->db[17] & 0x7);
 +                      return -EINVAL;
 +              }
 +
 +              vsc->content_type = sdp->db[18] & 0x7;
 +      } else {
 +              return -EINVAL;
 +      }
 +
 +      return 0;
 +}
 +
 +static int
 +intel_dp_hdr_metadata_infoframe_sdp_unpack(struct hdmi_drm_infoframe *drm_infoframe,
 +                                         const void *buffer, size_t size)
 +{
 +      int ret;
 +
 +      const struct dp_sdp *sdp = buffer;
 +
 +      if (size < sizeof(struct dp_sdp))
 +              return -EINVAL;
 +
 +      if (sdp->sdp_header.HB0 != 0)
 +              return -EINVAL;
 +
 +      if (sdp->sdp_header.HB1 != HDMI_INFOFRAME_TYPE_DRM)
 +              return -EINVAL;
 +
 +      /*
 +       * Least Significant Eight Bits of (Data Byte Count â€“ 1)
 +       * 1Dh (i.e., Data Byte Count = 30 bytes).
 +       */
 +      if (sdp->sdp_header.HB2 != 0x1D)
 +              return -EINVAL;
 +
 +      /* Most Significant Two Bits of (Data Byte Count â€“ 1), Clear to 00b. */
 +      if ((sdp->sdp_header.HB3 & 0x3) != 0)
 +              return -EINVAL;
 +
 +      /* INFOFRAME SDP Version Number */
 +      if (((sdp->sdp_header.HB3 >> 2) & 0x3f) != 0x13)
 +              return -EINVAL;
 +
 +      /* CTA Header Byte 2 (INFOFRAME Version Number) */
 +      if (sdp->db[0] != 1)
 +              return -EINVAL;
 +
 +      /* CTA Header Byte 3 (Length of INFOFRAME): HDMI_DRM_INFOFRAME_SIZE */
 +      if (sdp->db[1] != HDMI_DRM_INFOFRAME_SIZE)
 +              return -EINVAL;
 +
 +      ret = hdmi_drm_infoframe_unpack_only(drm_infoframe, &sdp->db[2],
 +                                           HDMI_DRM_INFOFRAME_SIZE);
 +
 +      return ret;
 +}
 +
 +static void intel_read_dp_vsc_sdp(struct intel_encoder *encoder,
 +                                struct intel_crtc_state *crtc_state,
 +                                struct drm_dp_vsc_sdp *vsc)
 +{
 +      struct intel_digital_port *intel_dig_port = enc_to_dig_port(encoder);
 +      struct intel_dp *intel_dp = enc_to_intel_dp(encoder);
 +      struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
 +      unsigned int type = DP_SDP_VSC;
 +      struct dp_sdp sdp = {};
 +      int ret;
 +
 +      /* When PSR is enabled, VSC SDP is handled by PSR routine */
 +      if (intel_psr_enabled(intel_dp))
 +              return;
 +
 +      if ((crtc_state->infoframes.enable &
 +           intel_hdmi_infoframe_enable(type)) == 0)
 +              return;
 +
 +      intel_dig_port->read_infoframe(encoder, crtc_state, type, &sdp, sizeof(sdp));
 +
 +      ret = intel_dp_vsc_sdp_unpack(vsc, &sdp, sizeof(sdp));
 +
 +      if (ret)
 +              drm_dbg_kms(&dev_priv->drm, "Failed to unpack DP VSC SDP\n");
 +}
 +
 +static void intel_read_dp_hdr_metadata_infoframe_sdp(struct intel_encoder *encoder,
 +                                                   struct intel_crtc_state *crtc_state,
 +                                                   struct hdmi_drm_infoframe *drm_infoframe)
 +{
 +      struct intel_digital_port *intel_dig_port = enc_to_dig_port(encoder);
 +      struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
 +      unsigned int type = HDMI_PACKET_TYPE_GAMUT_METADATA;
 +      struct dp_sdp sdp = {};
 +      int ret;
 +
 +      if ((crtc_state->infoframes.enable &
 +          intel_hdmi_infoframe_enable(type)) == 0)
 +              return;
 +
 +      intel_dig_port->read_infoframe(encoder, crtc_state, type, &sdp,
 +                                     sizeof(sdp));
 +
 +      ret = intel_dp_hdr_metadata_infoframe_sdp_unpack(drm_infoframe, &sdp,
 +                                                       sizeof(sdp));
 +
 +      if (ret)
 +              drm_dbg_kms(&dev_priv->drm,
 +                          "Failed to unpack DP HDR Metadata Infoframe SDP\n");
 +}
 +
 +void intel_read_dp_sdp(struct intel_encoder *encoder,
 +                     struct intel_crtc_state *crtc_state,
 +                     unsigned int type)
 +{
 +      if (encoder->type != INTEL_OUTPUT_DDI)
 +              return;
 +
 +      switch (type) {
 +      case DP_SDP_VSC:
 +              intel_read_dp_vsc_sdp(encoder, crtc_state,
 +                                    &crtc_state->infoframes.vsc);
 +              break;
 +      case HDMI_PACKET_TYPE_GAMUT_METADATA:
 +              intel_read_dp_hdr_metadata_infoframe_sdp(encoder, crtc_state,
 +                                                       &crtc_state->infoframes.drm.drm);
 +              break;
 +      default:
 +              MISSING_CASE(type);
 +              break;
 +      }
  }
  
  static u8 intel_dp_autotest_link_training(struct intel_dp *intel_dp)
  {
 +      struct drm_i915_private *i915 = dp_to_i915(intel_dp);
        int status = 0;
        int test_link_rate;
        u8 test_lane_count, test_link_bw;
                                   &test_lane_count);
  
        if (status <= 0) {
 -              DRM_DEBUG_KMS("Lane count read failed\n");
 +              drm_dbg_kms(&i915->drm, "Lane count read failed\n");
                return DP_TEST_NAK;
        }
        test_lane_count &= DP_MAX_LANE_COUNT_MASK;
        status = drm_dp_dpcd_readb(&intel_dp->aux, DP_TEST_LINK_RATE,
                                   &test_link_bw);
        if (status <= 0) {
 -              DRM_DEBUG_KMS("Link Rate read failed\n");
 +              drm_dbg_kms(&i915->drm, "Link Rate read failed\n");
                return DP_TEST_NAK;
        }
        test_link_rate = drm_dp_bw_code_to_link_rate(test_link_bw);
  
  static u8 intel_dp_autotest_video_pattern(struct intel_dp *intel_dp)
  {
 +      struct drm_i915_private *i915 = dp_to_i915(intel_dp);
        u8 test_pattern;
        u8 test_misc;
        __be16 h_width, v_height;
        status = drm_dp_dpcd_readb(&intel_dp->aux, DP_TEST_PATTERN,
                                   &test_pattern);
        if (status <= 0) {
 -              DRM_DEBUG_KMS("Test pattern read failed\n");
 +              drm_dbg_kms(&i915->drm, "Test pattern read failed\n");
                return DP_TEST_NAK;
        }
        if (test_pattern != DP_COLOR_RAMP)
        status = drm_dp_dpcd_read(&intel_dp->aux, DP_TEST_H_WIDTH_HI,
                                  &h_width, 2);
        if (status <= 0) {
 -              DRM_DEBUG_KMS("H Width read failed\n");
 +              drm_dbg_kms(&i915->drm, "H Width read failed\n");
                return DP_TEST_NAK;
        }
  
        status = drm_dp_dpcd_read(&intel_dp->aux, DP_TEST_V_HEIGHT_HI,
                                  &v_height, 2);
        if (status <= 0) {
 -              DRM_DEBUG_KMS("V Height read failed\n");
 +              drm_dbg_kms(&i915->drm, "V Height read failed\n");
                return DP_TEST_NAK;
        }
  
        status = drm_dp_dpcd_readb(&intel_dp->aux, DP_TEST_MISC0,
                                   &test_misc);
        if (status <= 0) {
 -              DRM_DEBUG_KMS("TEST MISC read failed\n");
 +              drm_dbg_kms(&i915->drm, "TEST MISC read failed\n");
                return DP_TEST_NAK;
        }
        if ((test_misc & DP_TEST_COLOR_FORMAT_MASK) != DP_COLOR_FORMAT_RGB)
  
  static u8 intel_dp_autotest_edid(struct intel_dp *intel_dp)
  {
 +      struct drm_i915_private *i915 = dp_to_i915(intel_dp);
        u8 test_result = DP_TEST_ACK;
        struct intel_connector *intel_connector = intel_dp->attached_connector;
        struct drm_connector *connector = &intel_connector->base;
                 */
                if (intel_dp->aux.i2c_nack_count > 0 ||
                        intel_dp->aux.i2c_defer_count > 0)
 -                      DRM_DEBUG_KMS("EDID read had %d NACKs, %d DEFERs\n",
 -                                    intel_dp->aux.i2c_nack_count,
 -                                    intel_dp->aux.i2c_defer_count);
 +                      drm_dbg_kms(&i915->drm,
 +                                  "EDID read had %d NACKs, %d DEFERs\n",
 +                                  intel_dp->aux.i2c_nack_count,
 +                                  intel_dp->aux.i2c_defer_count);
                intel_dp->compliance.test_data.edid = INTEL_DP_RESOLUTION_FAILSAFE;
        } else {
                struct edid *block = intel_connector->detect_edid;
  
                if (drm_dp_dpcd_writeb(&intel_dp->aux, DP_TEST_EDID_CHECKSUM,
                                       block->checksum) <= 0)
 -                      DRM_DEBUG_KMS("Failed to write EDID checksum\n");
 +                      drm_dbg_kms(&i915->drm,
 +                                  "Failed to write EDID checksum\n");
  
                test_result = DP_TEST_ACK | DP_TEST_EDID_CHECKSUM_WRITE;
                intel_dp->compliance.test_data.edid = INTEL_DP_RESOLUTION_PREFERRED;
@@@ -5537,7 -5167,7 +5537,7 @@@ void intel_dp_process_phy_request(struc
  
  static u8 intel_dp_autotest_phy_pattern(struct intel_dp *intel_dp)
  {
 -      u8 test_result = DP_TEST_NAK;
 +      u8 test_result;
  
        test_result = intel_dp_prepare_phytest(intel_dp);
        if (test_result != DP_TEST_ACK)
  
  static void intel_dp_handle_test_request(struct intel_dp *intel_dp)
  {
 +      struct drm_i915_private *i915 = dp_to_i915(intel_dp);
        u8 response = DP_TEST_NAK;
        u8 request = 0;
        int status;
  
        status = drm_dp_dpcd_readb(&intel_dp->aux, DP_TEST_REQUEST, &request);
        if (status <= 0) {
 -              DRM_DEBUG_KMS("Could not read test request from sink\n");
 +              drm_dbg_kms(&i915->drm,
 +                          "Could not read test request from sink\n");
                goto update_status;
        }
  
        switch (request) {
        case DP_TEST_LINK_TRAINING:
 -              DRM_DEBUG_KMS("LINK_TRAINING test requested\n");
 +              drm_dbg_kms(&i915->drm, "LINK_TRAINING test requested\n");
                response = intel_dp_autotest_link_training(intel_dp);
                break;
        case DP_TEST_LINK_VIDEO_PATTERN:
 -              DRM_DEBUG_KMS("TEST_PATTERN test requested\n");
 +              drm_dbg_kms(&i915->drm, "TEST_PATTERN test requested\n");
                response = intel_dp_autotest_video_pattern(intel_dp);
                break;
        case DP_TEST_LINK_EDID_READ:
 -              DRM_DEBUG_KMS("EDID test requested\n");
 +              drm_dbg_kms(&i915->drm, "EDID test requested\n");
                response = intel_dp_autotest_edid(intel_dp);
                break;
        case DP_TEST_LINK_PHY_TEST_PATTERN:
 -              DRM_DEBUG_KMS("PHY_PATTERN test requested\n");
 +              drm_dbg_kms(&i915->drm, "PHY_PATTERN test requested\n");
                response = intel_dp_autotest_phy_pattern(intel_dp);
                break;
        default:
 -              DRM_DEBUG_KMS("Invalid test request '%02x'\n", request);
 +              drm_dbg_kms(&i915->drm, "Invalid test request '%02x'\n",
 +                          request);
                break;
        }
  
  update_status:
        status = drm_dp_dpcd_writeb(&intel_dp->aux, DP_TEST_RESPONSE, response);
        if (status <= 0)
 -              DRM_DEBUG_KMS("Could not write test response to sink\n");
 +              drm_dbg_kms(&i915->drm,
 +                          "Could not write test response to sink\n");
  }
  
  static int
  intel_dp_check_mst_status(struct intel_dp *intel_dp)
  {
 -      bool bret;
 +      struct drm_i915_private *i915 = dp_to_i915(intel_dp);
 +      bool need_retrain = false;
  
 -      if (intel_dp->is_mst) {
 -              u8 esi[DP_DPRX_ESI_LEN] = { 0 };
 -              int ret = 0;
 +      if (!intel_dp->is_mst)
 +              return -EINVAL;
 +
 +      WARN_ON_ONCE(intel_dp->active_mst_links < 0);
 +
 +      for (;;) {
 +              u8 esi[DP_DPRX_ESI_LEN] = {};
 +              bool bret, handled;
                int retry;
 -              bool handled;
  
 -              WARN_ON_ONCE(intel_dp->active_mst_links < 0);
                bret = intel_dp_get_sink_irq_esi(intel_dp, esi);
 -go_again:
 -              if (bret == true) {
 -
 -                      /* check link status - esi[10] = 0x200c */
 -                      if (intel_dp->active_mst_links > 0 &&
 -                          !drm_dp_channel_eq_ok(&esi[10], intel_dp->lane_count)) {
 -                              DRM_DEBUG_KMS("channel EQ not ok, retraining\n");
 -                              intel_dp_start_link_train(intel_dp);
 -                              intel_dp_stop_link_train(intel_dp);
 -                      }
 +              if (!bret) {
 +                      drm_dbg_kms(&i915->drm,
 +                                  "failed to get ESI - device may have failed\n");
 +                      return -EINVAL;
 +              }
  
 -                      DRM_DEBUG_KMS("got esi %3ph\n", esi);
 -                      ret = drm_dp_mst_hpd_irq(&intel_dp->mst_mgr, esi, &handled);
 -
 -                      if (handled) {
 -                              for (retry = 0; retry < 3; retry++) {
 -                                      int wret;
 -                                      wret = drm_dp_dpcd_write(&intel_dp->aux,
 -                                                               DP_SINK_COUNT_ESI+1,
 -                                                               &esi[1], 3);
 -                                      if (wret == 3) {
 -                                              break;
 -                                      }
 -                              }
 +              /* check link status - esi[10] = 0x200c */
 +              if (intel_dp->active_mst_links > 0 && !need_retrain &&
 +                  !drm_dp_channel_eq_ok(&esi[10], intel_dp->lane_count)) {
 +                      drm_dbg_kms(&i915->drm,
 +                                  "channel EQ not ok, retraining\n");
 +                      need_retrain = true;
 +              }
  
 -                              bret = intel_dp_get_sink_irq_esi(intel_dp, esi);
 -                              if (bret == true) {
 -                                      DRM_DEBUG_KMS("got esi2 %3ph\n", esi);
 -                                      goto go_again;
 -                              }
 -                      } else
 -                              ret = 0;
 +              drm_dbg_kms(&i915->drm, "got esi %3ph\n", esi);
  
 -                      return ret;
 -              } else {
 -                      DRM_DEBUG_KMS("failed to get ESI - device may have failed\n");
 -                      intel_dp->is_mst = false;
 -                      drm_dp_mst_topology_mgr_set_mst(&intel_dp->mst_mgr,
 -                                                      intel_dp->is_mst);
 +              drm_dp_mst_hpd_irq(&intel_dp->mst_mgr, esi, &handled);
 +              if (!handled)
 +                      break;
 +
 +              for (retry = 0; retry < 3; retry++) {
 +                      int wret;
 +
 +                      wret = drm_dp_dpcd_write(&intel_dp->aux,
 +                                               DP_SINK_COUNT_ESI+1,
 +                                               &esi[1], 3);
 +                      if (wret == 3)
 +                              break;
                }
        }
 -      return -EINVAL;
 +
 +      return need_retrain;
  }
  
  static bool
@@@ -5680,102 -5312,20 +5680,102 @@@ intel_dp_needs_link_retrain(struct inte
        return !drm_dp_channel_eq_ok(link_status, intel_dp->lane_count);
  }
  
 +static bool intel_dp_has_connector(struct intel_dp *intel_dp,
 +                                 const struct drm_connector_state *conn_state)
 +{
 +      struct drm_i915_private *i915 = dp_to_i915(intel_dp);
 +      struct intel_encoder *encoder;
 +      enum pipe pipe;
 +
 +      if (!conn_state->best_encoder)
 +              return false;
 +
 +      /* SST */
 +      encoder = &dp_to_dig_port(intel_dp)->base;
 +      if (conn_state->best_encoder == &encoder->base)
 +              return true;
 +
 +      /* MST */
 +      for_each_pipe(i915, pipe) {
 +              encoder = &intel_dp->mst_encoders[pipe]->base;
 +              if (conn_state->best_encoder == &encoder->base)
 +                      return true;
 +      }
 +
 +      return false;
 +}
 +
 +static int intel_dp_prep_link_retrain(struct intel_dp *intel_dp,
 +                                    struct drm_modeset_acquire_ctx *ctx,
 +                                    u32 *crtc_mask)
 +{
 +      struct drm_i915_private *i915 = dp_to_i915(intel_dp);
 +      struct drm_connector_list_iter conn_iter;
 +      struct intel_connector *connector;
 +      int ret = 0;
 +
 +      *crtc_mask = 0;
 +
 +      if (!intel_dp_needs_link_retrain(intel_dp))
 +              return 0;
 +
 +      drm_connector_list_iter_begin(&i915->drm, &conn_iter);
 +      for_each_intel_connector_iter(connector, &conn_iter) {
 +              struct drm_connector_state *conn_state =
 +                      connector->base.state;
 +              struct intel_crtc_state *crtc_state;
 +              struct intel_crtc *crtc;
 +
 +              if (!intel_dp_has_connector(intel_dp, conn_state))
 +                      continue;
 +
 +              crtc = to_intel_crtc(conn_state->crtc);
 +              if (!crtc)
 +                      continue;
 +
 +              ret = drm_modeset_lock(&crtc->base.mutex, ctx);
 +              if (ret)
 +                      break;
 +
 +              crtc_state = to_intel_crtc_state(crtc->base.state);
 +
 +              drm_WARN_ON(&i915->drm, !intel_crtc_has_dp_encoder(crtc_state));
 +
 +              if (!crtc_state->hw.active)
 +                      continue;
 +
 +              if (conn_state->commit &&
 +                  !try_wait_for_completion(&conn_state->commit->hw_done))
 +                      continue;
 +
 +              *crtc_mask |= drm_crtc_mask(&crtc->base);
 +      }
 +      drm_connector_list_iter_end(&conn_iter);
 +
 +      if (!intel_dp_needs_link_retrain(intel_dp))
 +              *crtc_mask = 0;
 +
 +      return ret;
 +}
 +
 +static bool intel_dp_is_connected(struct intel_dp *intel_dp)
 +{
 +      struct intel_connector *connector = intel_dp->attached_connector;
 +
 +      return connector->base.status == connector_status_connected ||
 +              intel_dp->is_mst;
 +}
 +
  int intel_dp_retrain_link(struct intel_encoder *encoder,
                          struct drm_modeset_acquire_ctx *ctx)
  {
        struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
        struct intel_dp *intel_dp = enc_to_intel_dp(encoder);
 -      struct intel_connector *connector = intel_dp->attached_connector;
 -      struct drm_connector_state *conn_state;
 -      struct intel_crtc_state *crtc_state;
        struct intel_crtc *crtc;
 +      u32 crtc_mask;
        int ret;
  
 -      /* FIXME handle the MST connectors as well */
 -
 -      if (!connector || connector->base.status != connector_status_connected)
 +      if (!intel_dp_is_connected(intel_dp))
                return 0;
  
        ret = drm_modeset_lock(&dev_priv->drm.mode_config.connection_mutex,
        if (ret)
                return ret;
  
 -      conn_state = connector->base.state;
 -
 -      crtc = to_intel_crtc(conn_state->crtc);
 -      if (!crtc)
 -              return 0;
 -
 -      ret = drm_modeset_lock(&crtc->base.mutex, ctx);
 +      ret = intel_dp_prep_link_retrain(intel_dp, ctx, &crtc_mask);
        if (ret)
                return ret;
  
 -      crtc_state = to_intel_crtc_state(crtc->base.state);
 -
 -      drm_WARN_ON(&dev_priv->drm, !intel_crtc_has_dp_encoder(crtc_state));
 -
 -      if (!crtc_state->hw.active)
 +      if (crtc_mask == 0)
                return 0;
  
 -      if (conn_state->commit &&
 -          !try_wait_for_completion(&conn_state->commit->hw_done))
 -              return 0;
 +      drm_dbg_kms(&dev_priv->drm, "[ENCODER:%d:%s] retraining link\n",
 +                  encoder->base.base.id, encoder->base.name);
  
 -      if (!intel_dp_needs_link_retrain(intel_dp))
 -              return 0;
 +      for_each_intel_crtc_mask(&dev_priv->drm, crtc, crtc_mask) {
 +              const struct intel_crtc_state *crtc_state =
 +                      to_intel_crtc_state(crtc->base.state);
  
 -      /* Suppress underruns caused by re-training */
 -      intel_set_cpu_fifo_underrun_reporting(dev_priv, crtc->pipe, false);
 -      if (crtc_state->has_pch_encoder)
 -              intel_set_pch_fifo_underrun_reporting(dev_priv,
 -                                                    intel_crtc_pch_transcoder(crtc), false);
 +              /* Suppress underruns caused by re-training */
 +              intel_set_cpu_fifo_underrun_reporting(dev_priv, crtc->pipe, false);
 +              if (crtc_state->has_pch_encoder)
 +                      intel_set_pch_fifo_underrun_reporting(dev_priv,
 +                                                            intel_crtc_pch_transcoder(crtc), false);
 +      }
  
        intel_dp_start_link_train(intel_dp);
        intel_dp_stop_link_train(intel_dp);
  
 -      /* Keep underrun reporting disabled until things are stable */
 -      intel_wait_for_vblank(dev_priv, crtc->pipe);
 +      for_each_intel_crtc_mask(&dev_priv->drm, crtc, crtc_mask) {
 +              const struct intel_crtc_state *crtc_state =
 +                      to_intel_crtc_state(crtc->base.state);
 +
 +              /* Keep underrun reporting disabled until things are stable */
 +              intel_wait_for_vblank(dev_priv, crtc->pipe);
  
 -      intel_set_cpu_fifo_underrun_reporting(dev_priv, crtc->pipe, true);
 -      if (crtc_state->has_pch_encoder)
 -              intel_set_pch_fifo_underrun_reporting(dev_priv,
 -                                                    intel_crtc_pch_transcoder(crtc), true);
 +              intel_set_cpu_fifo_underrun_reporting(dev_priv, crtc->pipe, true);
 +              if (crtc_state->has_pch_encoder)
 +                      intel_set_pch_fifo_underrun_reporting(dev_priv,
 +                                                            intel_crtc_pch_transcoder(crtc), true);
 +      }
  
        return 0;
  }
   */
  static enum intel_hotplug_state
  intel_dp_hotplug(struct intel_encoder *encoder,
 -               struct intel_connector *connector,
 -               bool irq_received)
 +               struct intel_connector *connector)
  {
        struct drm_modeset_acquire_ctx ctx;
        enum intel_hotplug_state state;
        int ret;
  
 -      state = intel_encoder_hotplug(encoder, connector, irq_received);
 +      state = intel_encoder_hotplug(encoder, connector);
  
        drm_modeset_acquire_init(&ctx, 0);
  
         * Keeping it consistent with intel_ddi_hotplug() and
         * intel_hdmi_hotplug().
         */
 -      if (state == INTEL_HOTPLUG_UNCHANGED && irq_received)
 +      if (state == INTEL_HOTPLUG_UNCHANGED && !connector->hotplug_retries)
                state = INTEL_HOTPLUG_RETRY;
  
        return state;
  
  static void intel_dp_check_service_irq(struct intel_dp *intel_dp)
  {
 +      struct drm_i915_private *i915 = dp_to_i915(intel_dp);
        u8 val;
  
        if (intel_dp->dpcd[DP_DPCD_REV] < 0x11)
                intel_hdcp_handle_cp_irq(intel_dp->attached_connector);
  
        if (val & DP_SINK_SPECIFIC_IRQ)
 -              DRM_DEBUG_DRIVER("Sink specific irq unhandled\n");
 +              drm_dbg_kms(&i915->drm, "Sink specific irq unhandled\n");
  }
  
  /*
@@@ -5961,7 -5515,6 +5961,7 @@@ intel_dp_short_pulse(struct intel_dp *i
  static enum drm_connector_status
  intel_dp_detect_dpcd(struct intel_dp *intel_dp)
  {
 +      struct drm_i915_private *i915 = dp_to_i915(intel_dp);
        struct intel_lspcon *lspcon = dp_to_lspcon(intel_dp);
        u8 *dpcd = intel_dp->dpcd;
        u8 type;
        }
  
        /* Anything else is out of spec, warn and ignore */
 -      DRM_DEBUG_KMS("Broken DP branch device, ignoring\n");
 +      drm_dbg_kms(&i915->drm, "Broken DP branch device, ignoring\n");
        return connector_status_disconnected;
  }
  
@@@ -6022,7 -5575,64 +6022,7 @@@ edp_detect(struct intel_dp *intel_dp
  static bool ibx_digital_port_connected(struct intel_encoder *encoder)
  {
        struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
 -      u32 bit;
 -
 -      switch (encoder->hpd_pin) {
 -      case HPD_PORT_B:
 -              bit = SDE_PORTB_HOTPLUG;
 -              break;
 -      case HPD_PORT_C:
 -              bit = SDE_PORTC_HOTPLUG;
 -              break;
 -      case HPD_PORT_D:
 -              bit = SDE_PORTD_HOTPLUG;
 -              break;
 -      default:
 -              MISSING_CASE(encoder->hpd_pin);
 -              return false;
 -      }
 -
 -      return intel_de_read(dev_priv, SDEISR) & bit;
 -}
 -
 -static bool cpt_digital_port_connected(struct intel_encoder *encoder)
 -{
 -      struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
 -      u32 bit;
 -
 -      switch (encoder->hpd_pin) {
 -      case HPD_PORT_B:
 -              bit = SDE_PORTB_HOTPLUG_CPT;
 -              break;
 -      case HPD_PORT_C:
 -              bit = SDE_PORTC_HOTPLUG_CPT;
 -              break;
 -      case HPD_PORT_D:
 -              bit = SDE_PORTD_HOTPLUG_CPT;
 -              break;
 -      default:
 -              MISSING_CASE(encoder->hpd_pin);
 -              return false;
 -      }
 -
 -      return intel_de_read(dev_priv, SDEISR) & bit;
 -}
 -
 -static bool spt_digital_port_connected(struct intel_encoder *encoder)
 -{
 -      struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
 -      u32 bit;
 -
 -      switch (encoder->hpd_pin) {
 -      case HPD_PORT_A:
 -              bit = SDE_PORTA_HOTPLUG_SPT;
 -              break;
 -      case HPD_PORT_E:
 -              bit = SDE_PORTE_HOTPLUG_SPT;
 -              break;
 -      default:
 -              return cpt_digital_port_connected(encoder);
 -      }
 +      u32 bit = dev_priv->hotplug.pch_hpd[encoder->hpd_pin];
  
        return intel_de_read(dev_priv, SDEISR) & bit;
  }
@@@ -6076,9 -5686,89 +6076,9 @@@ static bool gm45_digital_port_connected
  static bool ilk_digital_port_connected(struct intel_encoder *encoder)
  {
        struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
 +      u32 bit = dev_priv->hotplug.hpd[encoder->hpd_pin];
  
 -      if (encoder->hpd_pin == HPD_PORT_A)
 -              return intel_de_read(dev_priv, DEISR) & DE_DP_A_HOTPLUG;
 -      else
 -              return ibx_digital_port_connected(encoder);
 -}
 -
 -static bool snb_digital_port_connected(struct intel_encoder *encoder)
 -{
 -      struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
 -
 -      if (encoder->hpd_pin == HPD_PORT_A)
 -              return intel_de_read(dev_priv, DEISR) & DE_DP_A_HOTPLUG;
 -      else
 -              return cpt_digital_port_connected(encoder);
 -}
 -
 -static bool ivb_digital_port_connected(struct intel_encoder *encoder)
 -{
 -      struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
 -
 -      if (encoder->hpd_pin == HPD_PORT_A)
 -              return intel_de_read(dev_priv, DEISR) & DE_DP_A_HOTPLUG_IVB;
 -      else
 -              return cpt_digital_port_connected(encoder);
 -}
 -
 -static bool bdw_digital_port_connected(struct intel_encoder *encoder)
 -{
 -      struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
 -
 -      if (encoder->hpd_pin == HPD_PORT_A)
 -              return intel_de_read(dev_priv, GEN8_DE_PORT_ISR) & GEN8_PORT_DP_A_HOTPLUG;
 -      else
 -              return cpt_digital_port_connected(encoder);
 -}
 -
 -static bool bxt_digital_port_connected(struct intel_encoder *encoder)
 -{
 -      struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
 -      u32 bit;
 -
 -      switch (encoder->hpd_pin) {
 -      case HPD_PORT_A:
 -              bit = BXT_DE_PORT_HP_DDIA;
 -              break;
 -      case HPD_PORT_B:
 -              bit = BXT_DE_PORT_HP_DDIB;
 -              break;
 -      case HPD_PORT_C:
 -              bit = BXT_DE_PORT_HP_DDIC;
 -              break;
 -      default:
 -              MISSING_CASE(encoder->hpd_pin);
 -              return false;
 -      }
 -
 -      return intel_de_read(dev_priv, GEN8_DE_PORT_ISR) & bit;
 -}
 -
 -static bool intel_combo_phy_connected(struct drm_i915_private *dev_priv,
 -                                    enum phy phy)
 -{
 -      if (HAS_PCH_MCC(dev_priv) && phy == PHY_C)
 -              return intel_de_read(dev_priv, SDEISR) & SDE_TC_HOTPLUG_ICP(PORT_TC1);
 -
 -      return intel_de_read(dev_priv, SDEISR) & SDE_DDI_HOTPLUG_ICP(phy);
 -}
 -
 -static bool icp_digital_port_connected(struct intel_encoder *encoder)
 -{
 -      struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
 -      struct intel_digital_port *dig_port = enc_to_dig_port(encoder);
 -      enum phy phy = intel_port_to_phy(dev_priv, encoder->port);
 -
 -      if (intel_phy_is_combo(dev_priv, phy))
 -              return intel_combo_phy_connected(dev_priv, phy);
 -      else if (intel_phy_is_tc(dev_priv, phy))
 -              return intel_tc_port_connected(dig_port);
 -      else
 -              MISSING_CASE(encoder->hpd_pin);
 -
 -      return false;
 +      return intel_de_read(dev_priv, DEISR) & bit;
  }
  
  /*
   *
   * Return %true if port is connected, %false otherwise.
   */
 -static bool __intel_digital_port_connected(struct intel_encoder *encoder)
 -{
 -      struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
 -
 -      if (HAS_GMCH(dev_priv)) {
 -              if (IS_GM45(dev_priv))
 -                      return gm45_digital_port_connected(encoder);
 -              else
 -                      return g4x_digital_port_connected(encoder);
 -      }
 -
 -      if (INTEL_PCH_TYPE(dev_priv) >= PCH_ICP)
 -              return icp_digital_port_connected(encoder);
 -      else if (INTEL_PCH_TYPE(dev_priv) >= PCH_SPT)
 -              return spt_digital_port_connected(encoder);
 -      else if (IS_GEN9_LP(dev_priv))
 -              return bxt_digital_port_connected(encoder);
 -      else if (IS_GEN(dev_priv, 8))
 -              return bdw_digital_port_connected(encoder);
 -      else if (IS_GEN(dev_priv, 7))
 -              return ivb_digital_port_connected(encoder);
 -      else if (IS_GEN(dev_priv, 6))
 -              return snb_digital_port_connected(encoder);
 -      else if (IS_GEN(dev_priv, 5))
 -              return ilk_digital_port_connected(encoder);
 -
 -      MISSING_CASE(INTEL_GEN(dev_priv));
 -      return false;
 -}
 -
  bool intel_digital_port_connected(struct intel_encoder *encoder)
  {
        struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
 +      struct intel_digital_port *dig_port = enc_to_dig_port(encoder);
        bool is_connected = false;
        intel_wakeref_t wakeref;
  
        with_intel_display_power(dev_priv, POWER_DOMAIN_DISPLAY_CORE, wakeref)
 -              is_connected = __intel_digital_port_connected(encoder);
 +              is_connected = dig_port->connected(encoder);
  
        return is_connected;
  }
@@@ -6315,7 -6034,6 +6315,7 @@@ static int intel_dp_get_modes(struct dr
  static int
  intel_dp_connector_register(struct drm_connector *connector)
  {
 +      struct drm_i915_private *i915 = to_i915(connector->dev);
        struct intel_dp *intel_dp = intel_attached_dp(to_intel_connector(connector));
        int ret;
  
        if (ret)
                return ret;
  
 -      intel_connector_debugfs_add(connector);
 -
 -      DRM_DEBUG_KMS("registering %s bus for %s\n",
 -                    intel_dp->aux.name, connector->kdev->kobj.name);
 +      drm_dbg_kms(&i915->drm, "registering %s bus for %s\n",
 +                  intel_dp->aux.name, connector->kdev->kobj.name);
  
        intel_dp->aux.dev = connector->kdev;
        ret = drm_dp_aux_register(&intel_dp->aux);
@@@ -6410,7 -6130,6 +6410,7 @@@ stati
  int intel_dp_hdcp_write_an_aksv(struct intel_digital_port *intel_dig_port,
                                u8 *an)
  {
 +      struct drm_i915_private *i915 = to_i915(intel_dig_port->base.base.dev);
        struct intel_dp *intel_dp = enc_to_intel_dp(to_intel_encoder(&intel_dig_port->base.base));
        static const struct drm_dp_aux_msg msg = {
                .request = DP_AUX_NATIVE_WRITE,
        dpcd_ret = drm_dp_dpcd_write(&intel_dig_port->dp.aux, DP_AUX_HDCP_AN,
                                     an, DRM_HDCP_AN_LEN);
        if (dpcd_ret != DRM_HDCP_AN_LEN) {
 -              DRM_DEBUG_KMS("Failed to write An over DP/AUX (%zd)\n",
 -                            dpcd_ret);
 +              drm_dbg_kms(&i915->drm,
 +                          "Failed to write An over DP/AUX (%zd)\n",
 +                          dpcd_ret);
                return dpcd_ret >= 0 ? -EIO : dpcd_ret;
        }
  
                                rxbuf, sizeof(rxbuf),
                                DP_AUX_CH_CTL_AUX_AKSV_SELECT);
        if (ret < 0) {
 -              DRM_DEBUG_KMS("Write Aksv over DP/AUX failed (%d)\n", ret);
 +              drm_dbg_kms(&i915->drm,
 +                          "Write Aksv over DP/AUX failed (%d)\n", ret);
                return ret;
        } else if (ret == 0) {
 -              DRM_DEBUG_KMS("Aksv write over DP/AUX was empty\n");
 +              drm_dbg_kms(&i915->drm, "Aksv write over DP/AUX was empty\n");
                return -EIO;
        }
  
        reply = (rxbuf[0] >> 4) & DP_AUX_NATIVE_REPLY_MASK;
        if (reply != DP_AUX_NATIVE_REPLY_ACK) {
 -              DRM_DEBUG_KMS("Aksv write: no DP_AUX_NATIVE_REPLY_ACK %x\n",
 -                            reply);
 +              drm_dbg_kms(&i915->drm,
 +                          "Aksv write: no DP_AUX_NATIVE_REPLY_ACK %x\n",
 +                          reply);
                return -EIO;
        }
        return 0;
  static int intel_dp_hdcp_read_bksv(struct intel_digital_port *intel_dig_port,
                                   u8 *bksv)
  {
 +      struct drm_i915_private *i915 = to_i915(intel_dig_port->base.base.dev);
        ssize_t ret;
 +
        ret = drm_dp_dpcd_read(&intel_dig_port->dp.aux, DP_AUX_HDCP_BKSV, bksv,
                               DRM_HDCP_KSV_LEN);
        if (ret != DRM_HDCP_KSV_LEN) {
 -              DRM_DEBUG_KMS("Read Bksv from DP/AUX failed (%zd)\n", ret);
 +              drm_dbg_kms(&i915->drm,
 +                          "Read Bksv from DP/AUX failed (%zd)\n", ret);
                return ret >= 0 ? -EIO : ret;
        }
        return 0;
  static int intel_dp_hdcp_read_bstatus(struct intel_digital_port *intel_dig_port,
                                      u8 *bstatus)
  {
 +      struct drm_i915_private *i915 = to_i915(intel_dig_port->base.base.dev);
        ssize_t ret;
 +
        /*
         * For some reason the HDMI and DP HDCP specs call this register
         * definition by different names. In the HDMI spec, it's called BSTATUS,
        ret = drm_dp_dpcd_read(&intel_dig_port->dp.aux, DP_AUX_HDCP_BINFO,
                               bstatus, DRM_HDCP_BSTATUS_LEN);
        if (ret != DRM_HDCP_BSTATUS_LEN) {
 -              DRM_DEBUG_KMS("Read bstatus from DP/AUX failed (%zd)\n", ret);
 +              drm_dbg_kms(&i915->drm,
 +                          "Read bstatus from DP/AUX failed (%zd)\n", ret);
                return ret >= 0 ? -EIO : ret;
        }
        return 0;
@@@ -6502,14 -6212,12 +6502,14 @@@ stati
  int intel_dp_hdcp_read_bcaps(struct intel_digital_port *intel_dig_port,
                             u8 *bcaps)
  {
 +      struct drm_i915_private *i915 = to_i915(intel_dig_port->base.base.dev);
        ssize_t ret;
  
        ret = drm_dp_dpcd_read(&intel_dig_port->dp.aux, DP_AUX_HDCP_BCAPS,
                               bcaps, 1);
        if (ret != 1) {
 -              DRM_DEBUG_KMS("Read bcaps from DP/AUX failed (%zd)\n", ret);
 +              drm_dbg_kms(&i915->drm,
 +                          "Read bcaps from DP/AUX failed (%zd)\n", ret);
                return ret >= 0 ? -EIO : ret;
        }
  
@@@ -6535,14 -6243,11 +6535,14 @@@ stati
  int intel_dp_hdcp_read_ri_prime(struct intel_digital_port *intel_dig_port,
                                u8 *ri_prime)
  {
 +      struct drm_i915_private *i915 = to_i915(intel_dig_port->base.base.dev);
        ssize_t ret;
 +
        ret = drm_dp_dpcd_read(&intel_dig_port->dp.aux, DP_AUX_HDCP_RI_PRIME,
                               ri_prime, DRM_HDCP_RI_LEN);
        if (ret != DRM_HDCP_RI_LEN) {
 -              DRM_DEBUG_KMS("Read Ri' from DP/AUX failed (%zd)\n", ret);
 +              drm_dbg_kms(&i915->drm, "Read Ri' from DP/AUX failed (%zd)\n",
 +                          ret);
                return ret >= 0 ? -EIO : ret;
        }
        return 0;
@@@ -6552,15 -6257,12 +6552,15 @@@ stati
  int intel_dp_hdcp_read_ksv_ready(struct intel_digital_port *intel_dig_port,
                                 bool *ksv_ready)
  {
 +      struct drm_i915_private *i915 = to_i915(intel_dig_port->base.base.dev);
        ssize_t ret;
        u8 bstatus;
 +
        ret = drm_dp_dpcd_read(&intel_dig_port->dp.aux, DP_AUX_HDCP_BSTATUS,
                               &bstatus, 1);
        if (ret != 1) {
 -              DRM_DEBUG_KMS("Read bstatus from DP/AUX failed (%zd)\n", ret);
 +              drm_dbg_kms(&i915->drm,
 +                          "Read bstatus from DP/AUX failed (%zd)\n", ret);
                return ret >= 0 ? -EIO : ret;
        }
        *ksv_ready = bstatus & DP_BSTATUS_READY;
@@@ -6571,7 -6273,6 +6571,7 @@@ stati
  int intel_dp_hdcp_read_ksv_fifo(struct intel_digital_port *intel_dig_port,
                                int num_downstream, u8 *ksv_fifo)
  {
 +      struct drm_i915_private *i915 = to_i915(intel_dig_port->base.base.dev);
        ssize_t ret;
        int i;
  
                                       ksv_fifo + i * DRM_HDCP_KSV_LEN,
                                       len);
                if (ret != len) {
 -                      DRM_DEBUG_KMS("Read ksv[%d] from DP/AUX failed (%zd)\n",
 -                                    i, ret);
 +                      drm_dbg_kms(&i915->drm,
 +                                  "Read ksv[%d] from DP/AUX failed (%zd)\n",
 +                                  i, ret);
                        return ret >= 0 ? -EIO : ret;
                }
        }
@@@ -6596,7 -6296,6 +6596,7 @@@ stati
  int intel_dp_hdcp_read_v_prime_part(struct intel_digital_port *intel_dig_port,
                                    int i, u32 *part)
  {
 +      struct drm_i915_private *i915 = to_i915(intel_dig_port->base.base.dev);
        ssize_t ret;
  
        if (i >= DRM_HDCP_V_PRIME_NUM_PARTS)
                               DP_AUX_HDCP_V_PRIME(i), part,
                               DRM_HDCP_V_PRIME_PART_LEN);
        if (ret != DRM_HDCP_V_PRIME_PART_LEN) {
 -              DRM_DEBUG_KMS("Read v'[%d] from DP/AUX failed (%zd)\n", i, ret);
 +              drm_dbg_kms(&i915->drm,
 +                          "Read v'[%d] from DP/AUX failed (%zd)\n", i, ret);
                return ret >= 0 ? -EIO : ret;
        }
        return 0;
@@@ -6624,15 -6322,13 +6624,15 @@@ int intel_dp_hdcp_toggle_signalling(str
  static
  bool intel_dp_hdcp_check_link(struct intel_digital_port *intel_dig_port)
  {
 +      struct drm_i915_private *i915 = to_i915(intel_dig_port->base.base.dev);
        ssize_t ret;
        u8 bstatus;
  
        ret = drm_dp_dpcd_read(&intel_dig_port->dp.aux, DP_AUX_HDCP_BSTATUS,
                               &bstatus, 1);
        if (ret != 1) {
 -              DRM_DEBUG_KMS("Read bstatus from DP/AUX failed (%zd)\n", ret);
 +              drm_dbg_kms(&i915->drm,
 +                          "Read bstatus from DP/AUX failed (%zd)\n", ret);
                return false;
        }
  
@@@ -6703,19 -6399,17 +6703,19 @@@ static const struct hdcp2_dp_msg_data h
          0, 0 },
  };
  
 -static inline
 -int intel_dp_hdcp2_read_rx_status(struct intel_digital_port *intel_dig_port,
 -                                u8 *rx_status)
 +static int
 +intel_dp_hdcp2_read_rx_status(struct intel_digital_port *intel_dig_port,
 +                            u8 *rx_status)
  {
 +      struct drm_i915_private *i915 = to_i915(intel_dig_port->base.base.dev);
        ssize_t ret;
  
        ret = drm_dp_dpcd_read(&intel_dig_port->dp.aux,
                               DP_HDCP_2_2_REG_RXSTATUS_OFFSET, rx_status,
                               HDCP_2_2_DP_RXSTATUS_LEN);
        if (ret != HDCP_2_2_DP_RXSTATUS_LEN) {
 -              DRM_DEBUG_KMS("Read bstatus from DP/AUX failed (%zd)\n", ret);
 +              drm_dbg_kms(&i915->drm,
 +                          "Read bstatus from DP/AUX failed (%zd)\n", ret);
                return ret >= 0 ? -EIO : ret;
        }
  
@@@ -6759,7 -6453,6 +6759,7 @@@ static ssize_
  intel_dp_hdcp2_wait_for_msg(struct intel_digital_port *intel_dig_port,
                            const struct hdcp2_dp_msg_data *hdcp2_msg_data)
  {
 +      struct drm_i915_private *i915 = to_i915(intel_dig_port->base.base.dev);
        struct intel_dp *dp = &intel_dig_port->dp;
        struct intel_hdcp *hdcp = &dp->attached_connector->hdcp;
        u8 msg_id = hdcp2_msg_data->msg_id;
        }
  
        if (ret)
 -              DRM_DEBUG_KMS("msg_id %d, ret %d, timeout(mSec): %d\n",
 -                            hdcp2_msg_data->msg_id, ret, timeout);
 +              drm_dbg_kms(&i915->drm,
 +                          "msg_id %d, ret %d, timeout(mSec): %d\n",
 +                          hdcp2_msg_data->msg_id, ret, timeout);
  
        return ret;
  }
@@@ -6879,7 -6571,6 +6879,7 @@@ stati
  int intel_dp_hdcp2_read_msg(struct intel_digital_port *intel_dig_port,
                            u8 msg_id, void *buf, size_t size)
  {
 +      struct drm_i915_private *i915 = to_i915(intel_dig_port->base.base.dev);
        unsigned int offset;
        u8 *byte = buf;
        ssize_t ret, bytes_to_recv, len;
                ret = drm_dp_dpcd_read(&intel_dig_port->dp.aux, offset,
                                       (void *)byte, len);
                if (ret < 0) {
 -                      DRM_DEBUG_KMS("msg_id %d, ret %zd\n", msg_id, ret);
 +                      drm_dbg_kms(&i915->drm, "msg_id %d, ret %zd\n",
 +                                  msg_id, ret);
                        return ret;
                }
  
@@@ -7205,11 -6895,7 +7205,11 @@@ static int intel_dp_connector_atomic_ch
        if (ret)
                return ret;
  
 -      if (INTEL_GEN(dev_priv) < 11)
 +      /*
 +       * We don't enable port sync on BDW due to missing w/as and
 +       * due to not having adjusted the modeset sequence appropriately.
 +       */
 +      if (INTEL_GEN(dev_priv) < 9)
                return 0;
  
        if (!intel_connector_needs_modeset(state, conn))
@@@ -7248,45 -6934,28 +7248,45 @@@ static const struct drm_encoder_funcs i
        .destroy = intel_dp_encoder_destroy,
  };
  
 +static bool intel_edp_have_power(struct intel_dp *intel_dp)
 +{
 +      intel_wakeref_t wakeref;
 +      bool have_power = false;
 +
 +      with_pps_lock(intel_dp, wakeref) {
 +              have_power = edp_have_panel_power(intel_dp) &&
 +                                                edp_have_panel_vdd(intel_dp);
 +      }
 +
 +      return have_power;
 +}
 +
  enum irqreturn
  intel_dp_hpd_pulse(struct intel_digital_port *intel_dig_port, bool long_hpd)
  {
 +      struct drm_i915_private *i915 = to_i915(intel_dig_port->base.base.dev);
        struct intel_dp *intel_dp = &intel_dig_port->dp;
  
 -      if (long_hpd && intel_dig_port->base.type == INTEL_OUTPUT_EDP) {
 +      if (intel_dig_port->base.type == INTEL_OUTPUT_EDP &&
 +          (long_hpd || !intel_edp_have_power(intel_dp))) {
                /*
 -               * vdd off can generate a long pulse on eDP which
 +               * vdd off can generate a long/short pulse on eDP which
                 * would require vdd on to handle it, and thus we
                 * would end up in an endless cycle of
 -               * "vdd off -> long hpd -> vdd on -> detect -> vdd off -> ..."
 +               * "vdd off -> long/short hpd -> vdd on -> detect -> vdd off -> ..."
                 */
 -              DRM_DEBUG_KMS("ignoring long hpd on eDP [ENCODER:%d:%s]\n",
 -                            intel_dig_port->base.base.base.id,
 -                            intel_dig_port->base.base.name);
 +              drm_dbg_kms(&i915->drm,
 +                          "ignoring %s hpd on eDP [ENCODER:%d:%s]\n",
 +                          long_hpd ? "long" : "short",
 +                          intel_dig_port->base.base.base.id,
 +                          intel_dig_port->base.base.name);
                return IRQ_HANDLED;
        }
  
 -      DRM_DEBUG_KMS("got hpd irq on [ENCODER:%d:%s] - %s\n",
 -                    intel_dig_port->base.base.base.id,
 -                    intel_dig_port->base.base.name,
 -                    long_hpd ? "long" : "short");
 +      drm_dbg_kms(&i915->drm, "got hpd irq on [ENCODER:%d:%s] - %s\n",
 +                  intel_dig_port->base.base.base.id,
 +                  intel_dig_port->base.base.name,
 +                  long_hpd ? "long" : "short");
  
        if (long_hpd) {
                intel_dp->reset_link_params = true;
        }
  
        if (intel_dp->is_mst) {
 -              if (intel_dp_check_mst_status(intel_dp) == -EINVAL) {
 +              switch (intel_dp_check_mst_status(intel_dp)) {
 +              case -EINVAL:
                        /*
                         * If we were in MST mode, and device is not
                         * there, get out of MST mode
                         */
 -                      DRM_DEBUG_KMS("MST device may have disappeared %d vs %d\n",
 -                                    intel_dp->is_mst, intel_dp->mst_mgr.mst_state);
 +                      drm_dbg_kms(&i915->drm,
 +                                  "MST device may have disappeared %d vs %d\n",
 +                                  intel_dp->is_mst,
 +                                  intel_dp->mst_mgr.mst_state);
                        intel_dp->is_mst = false;
                        drm_dp_mst_topology_mgr_set_mst(&intel_dp->mst_mgr,
                                                        intel_dp->is_mst);
  
                        return IRQ_NONE;
 +              case 1:
 +                      return IRQ_NONE;
 +              default:
 +                      break;
                }
        }
  
@@@ -7694,7 -7356,7 +7694,7 @@@ static void intel_dp_set_drrs_state(str
                return;
        }
  
-       if (intel_dp->attached_connector->panel.downclock_mode->vrefresh ==
+       if (drm_mode_vrefresh(intel_dp->attached_connector->panel.downclock_mode) ==
                        refresh_rate)
                index = DRRS_LOW_RR;
  
@@@ -7807,7 -7469,7 +7807,7 @@@ void intel_edp_drrs_disable(struct inte
  
        if (dev_priv->drrs.refresh_rate_type == DRRS_LOW_RR)
                intel_dp_set_drrs_state(dev_priv, old_crtc_state,
-                       intel_dp->attached_connector->panel.fixed_mode->vrefresh);
+                       drm_mode_vrefresh(intel_dp->attached_connector->panel.fixed_mode));
  
        dev_priv->drrs.dp = NULL;
        mutex_unlock(&dev_priv->drrs.mutex);
@@@ -7840,7 -7502,7 +7840,7 @@@ static void intel_edp_drrs_downclock_wo
                struct drm_crtc *crtc = dp_to_dig_port(intel_dp)->base.base.crtc;
  
                intel_dp_set_drrs_state(dev_priv, to_intel_crtc(crtc)->config,
-                       intel_dp->attached_connector->panel.downclock_mode->vrefresh);
+                       drm_mode_vrefresh(intel_dp->attached_connector->panel.downclock_mode));
        }
  
  unlock:
  void intel_edp_drrs_invalidate(struct drm_i915_private *dev_priv,
                               unsigned int frontbuffer_bits)
  {
+       struct intel_dp *intel_dp;
        struct drm_crtc *crtc;
        enum pipe pipe;
  
        cancel_delayed_work(&dev_priv->drrs.work);
  
        mutex_lock(&dev_priv->drrs.mutex);
-       if (!dev_priv->drrs.dp) {
+       intel_dp = dev_priv->drrs.dp;
+       if (!intel_dp) {
                mutex_unlock(&dev_priv->drrs.mutex);
                return;
        }
  
-       crtc = dp_to_dig_port(dev_priv->drrs.dp)->base.base.crtc;
+       crtc = dp_to_dig_port(intel_dp)->base.base.crtc;
        pipe = to_intel_crtc(crtc)->pipe;
  
        frontbuffer_bits &= INTEL_FRONTBUFFER_ALL_MASK(pipe);
        /* invalidate means busy screen hence upclock */
        if (frontbuffer_bits && dev_priv->drrs.refresh_rate_type == DRRS_LOW_RR)
                intel_dp_set_drrs_state(dev_priv, to_intel_crtc(crtc)->config,
-                       dev_priv->drrs.dp->attached_connector->panel.fixed_mode->vrefresh);
+                                       drm_mode_vrefresh(intel_dp->attached_connector->panel.fixed_mode));
  
        mutex_unlock(&dev_priv->drrs.mutex);
  }
  void intel_edp_drrs_flush(struct drm_i915_private *dev_priv,
                          unsigned int frontbuffer_bits)
  {
+       struct intel_dp *intel_dp;
        struct drm_crtc *crtc;
        enum pipe pipe;
  
        cancel_delayed_work(&dev_priv->drrs.work);
  
        mutex_lock(&dev_priv->drrs.mutex);
-       if (!dev_priv->drrs.dp) {
+       intel_dp = dev_priv->drrs.dp;
+       if (!intel_dp) {
                mutex_unlock(&dev_priv->drrs.mutex);
                return;
        }
  
-       crtc = dp_to_dig_port(dev_priv->drrs.dp)->base.base.crtc;
+       crtc = dp_to_dig_port(intel_dp)->base.base.crtc;
        pipe = to_intel_crtc(crtc)->pipe;
  
        frontbuffer_bits &= INTEL_FRONTBUFFER_ALL_MASK(pipe);
        /* flush means busy screen hence upclock */
        if (frontbuffer_bits && dev_priv->drrs.refresh_rate_type == DRRS_LOW_RR)
                intel_dp_set_drrs_state(dev_priv, to_intel_crtc(crtc)->config,
-                               dev_priv->drrs.dp->attached_connector->panel.fixed_mode->vrefresh);
+                                       drm_mode_vrefresh(intel_dp->attached_connector->panel.fixed_mode));
  
        /*
         * flush also means no more activity hence schedule downclock, if all
@@@ -8343,27 -8011,8 +8349,27 @@@ bool intel_dp_init(struct drm_i915_priv
                intel_encoder->post_disable = g4x_post_disable_dp;
        }
  
 +      if ((IS_IVYBRIDGE(dev_priv) && port == PORT_A) ||
 +          (HAS_PCH_CPT(dev_priv) && port != PORT_A))
 +              intel_dig_port->dp.set_link_train = cpt_set_link_train;
 +      else
 +              intel_dig_port->dp.set_link_train = g4x_set_link_train;
 +
 +      if (IS_CHERRYVIEW(dev_priv))
 +              intel_dig_port->dp.set_signal_levels = chv_set_signal_levels;
 +      else if (IS_VALLEYVIEW(dev_priv))
 +              intel_dig_port->dp.set_signal_levels = vlv_set_signal_levels;
 +      else if (IS_IVYBRIDGE(dev_priv) && port == PORT_A)
 +              intel_dig_port->dp.set_signal_levels = ivb_cpu_edp_set_signal_levels;
 +      else if (IS_GEN(dev_priv, 6) && port == PORT_A)
 +              intel_dig_port->dp.set_signal_levels = snb_cpu_edp_set_signal_levels;
 +      else
 +              intel_dig_port->dp.set_signal_levels = g4x_set_signal_levels;
 +
        intel_dig_port->dp.output_reg = output_reg;
        intel_dig_port->max_lanes = 4;
 +      intel_dig_port->dp.regs.dp_tp_ctl = DP_TP_CTL(port);
 +      intel_dig_port->dp.regs.dp_tp_status = DP_TP_STATUS(port);
  
        intel_encoder->type = INTEL_OUTPUT_DP;
        intel_encoder->power_domain = intel_port_to_power_domain(port);
  
        intel_dig_port->hpd_pulse = intel_dp_hpd_pulse;
  
 +      if (HAS_GMCH(dev_priv)) {
 +              if (IS_GM45(dev_priv))
 +                      intel_dig_port->connected = gm45_digital_port_connected;
 +              else
 +                      intel_dig_port->connected = g4x_digital_port_connected;
 +      } else {
 +              if (port == PORT_A)
 +                      intel_dig_port->connected = ilk_digital_port_connected;
 +              else
 +                      intel_dig_port->connected = ibx_digital_port_connected;
 +      }
 +
        if (port != PORT_A)
                intel_infoframe_init(intel_dig_port);
  
@@@ -33,6 -33,7 +33,7 @@@
  #include "intel_connector.h"
  #include "intel_ddi.h"
  #include "intel_display_types.h"
+ #include "intel_hotplug.h"
  #include "intel_dp.h"
  #include "intel_dp_mst.h"
  #include "intel_dpio_phy.h"
@@@ -47,9 -48,9 +48,9 @@@ static int intel_dp_mst_compute_link_co
        struct intel_dp *intel_dp = &intel_mst->primary->dp;
        struct intel_connector *connector =
                to_intel_connector(conn_state->connector);
 +      struct drm_i915_private *i915 = to_i915(connector->base.dev);
        const struct drm_display_mode *adjusted_mode =
                &crtc_state->hw.adjusted_mode;
 -      void *port = connector->port;
        bool constant_n = drm_dp_has_quirk(&intel_dp->desc, 0,
                                           DP_DPCD_QUIRK_CONSTANT_N);
        int bpp, slots = -EINVAL;
@@@ -65,8 -66,7 +66,8 @@@
                                                       false);
  
                slots = drm_dp_atomic_find_vcpi_slots(state, &intel_dp->mst_mgr,
 -                                                    port, crtc_state->pbn, 0);
 +                                                    connector->port,
 +                                                    crtc_state->pbn, 0);
                if (slots == -EDEADLK)
                        return slots;
                if (slots >= 0)
@@@ -74,8 -74,7 +75,8 @@@
        }
  
        if (slots < 0) {
 -              DRM_DEBUG_KMS("failed finding vcpi slots:%d\n", slots);
 +              drm_dbg_kms(&i915->drm, "failed finding vcpi slots:%d\n",
 +                          slots);
                return slots;
        }
  
        return 0;
  }
  
 -/*
 - * Iterate over all connectors and return the smallest transcoder in the MST
 - * stream
 - */
 -static enum transcoder
 -intel_dp_mst_master_trans_compute(struct intel_atomic_state *state,
 -                                struct intel_dp *mst_port)
 -{
 -      struct drm_i915_private *dev_priv = to_i915(state->base.dev);
 -      struct intel_digital_connector_state *conn_state;
 -      struct intel_connector *connector;
 -      enum pipe ret = I915_MAX_PIPES;
 -      int i;
 -
 -      if (INTEL_GEN(dev_priv) < 12)
 -              return INVALID_TRANSCODER;
 -
 -      for_each_new_intel_connector_in_state(state, connector, conn_state, i) {
 -              struct intel_crtc_state *crtc_state;
 -              struct intel_crtc *crtc;
 -
 -              if (connector->mst_port != mst_port || !conn_state->base.crtc)
 -                      continue;
 -
 -              crtc = to_intel_crtc(conn_state->base.crtc);
 -              crtc_state = intel_atomic_get_new_crtc_state(state, crtc);
 -              if (!crtc_state->uapi.active)
 -                      continue;
 -
 -              /*
 -               * Using crtc->pipe because crtc_state->cpu_transcoder is
 -               * computed, so others CRTCs could have non-computed
 -               * cpu_transcoder
 -               */
 -              if (crtc->pipe < ret)
 -                      ret = crtc->pipe;
 -      }
 -
 -      if (ret == I915_MAX_PIPES)
 -              return INVALID_TRANSCODER;
 -
 -      /* Simple cast works because TGL don't have a eDP transcoder */
 -      return (enum transcoder)ret;
 -}
 -
  static int intel_dp_mst_compute_config(struct intel_encoder *encoder,
                                       struct intel_crtc_state *pipe_config,
                                       struct drm_connector_state *conn_state)
  {
 -      struct intel_atomic_state *state = to_intel_atomic_state(conn_state->state);
        struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
        struct intel_dp_mst_encoder *intel_mst = enc_to_mst(encoder);
        struct intel_dp *intel_dp = &intel_mst->primary->dp;
                to_intel_digital_connector_state(conn_state);
        const struct drm_display_mode *adjusted_mode =
                &pipe_config->hw.adjusted_mode;
 -      void *port = connector->port;
        struct link_config_limits limits;
        int ret;
  
  
        intel_ddi_compute_min_voltage_level(dev_priv, pipe_config);
  
 -      pipe_config->mst_master_transcoder = intel_dp_mst_master_trans_compute(state, intel_dp);
 +      return 0;
 +}
 +
 +/*
 + * Iterate over all connectors and return a mask of
 + * all CPU transcoders streaming over the same DP link.
 + */
 +static unsigned int
 +intel_dp_mst_transcoder_mask(struct intel_atomic_state *state,
 +                           struct intel_dp *mst_port)
 +{
 +      struct drm_i915_private *dev_priv = to_i915(state->base.dev);
 +      const struct intel_digital_connector_state *conn_state;
 +      struct intel_connector *connector;
 +      u8 transcoders = 0;
 +      int i;
 +
 +      if (INTEL_GEN(dev_priv) < 12)
 +              return 0;
 +
 +      for_each_new_intel_connector_in_state(state, connector, conn_state, i) {
 +              const struct intel_crtc_state *crtc_state;
 +              struct intel_crtc *crtc;
 +
 +              if (connector->mst_port != mst_port || !conn_state->base.crtc)
 +                      continue;
 +
 +              crtc = to_intel_crtc(conn_state->base.crtc);
 +              crtc_state = intel_atomic_get_new_crtc_state(state, crtc);
 +
 +              if (!crtc_state->hw.active)
 +                      continue;
 +
 +              transcoders |= BIT(crtc_state->cpu_transcoder);
 +      }
 +
 +      return transcoders;
 +}
 +
 +static int intel_dp_mst_compute_config_late(struct intel_encoder *encoder,
 +                                          struct intel_crtc_state *crtc_state,
 +                                          struct drm_connector_state *conn_state)
 +{
 +      struct intel_atomic_state *state = to_intel_atomic_state(conn_state->state);
 +      struct intel_dp_mst_encoder *intel_mst = enc_to_mst(encoder);
 +      struct intel_dp *intel_dp = &intel_mst->primary->dp;
 +
 +      /* lowest numbered transcoder will be designated master */
 +      crtc_state->mst_master_transcoder =
 +              ffs(intel_dp_mst_transcoder_mask(state, intel_dp)) - 1;
  
        return 0;
  }
@@@ -316,8 -313,7 +317,8 @@@ intel_dp_mst_atomic_check(struct drm_co
        return ret;
  }
  
 -static void intel_mst_disable_dp(struct intel_encoder *encoder,
 +static void intel_mst_disable_dp(struct intel_atomic_state *state,
 +                               struct intel_encoder *encoder,
                                 const struct intel_crtc_state *old_crtc_state,
                                 const struct drm_connector_state *old_conn_state)
  {
        struct intel_dp *intel_dp = &intel_dig_port->dp;
        struct intel_connector *connector =
                to_intel_connector(old_conn_state->connector);
 +      struct drm_i915_private *i915 = to_i915(connector->base.dev);
        int ret;
  
 -      DRM_DEBUG_KMS("active links %d\n", intel_dp->active_mst_links);
 +      drm_dbg_kms(&i915->drm, "active links %d\n",
 +                  intel_dp->active_mst_links);
  
        drm_dp_mst_reset_vcpi_slots(&intel_dp->mst_mgr, connector->port);
  
        ret = drm_dp_update_payload_part1(&intel_dp->mst_mgr);
        if (ret) {
 -              DRM_DEBUG_KMS("failed to update payload %d\n", ret);
 +              drm_dbg_kms(&i915->drm, "failed to update payload %d\n", ret);
        }
        if (old_crtc_state->has_audio)
                intel_audio_codec_disable(encoder,
                                          old_crtc_state, old_conn_state);
  }
  
 -static void intel_mst_post_disable_dp(struct intel_encoder *encoder,
 +static void intel_mst_post_disable_dp(struct intel_atomic_state *state,
 +                                    struct intel_encoder *encoder,
                                      const struct intel_crtc_state *old_crtc_state,
                                      const struct drm_connector_state *old_conn_state)
  {
  
        if (intel_de_wait_for_set(dev_priv, intel_dp->regs.dp_tp_status,
                                  DP_TP_STATUS_ACT_SENT, 1))
 -              DRM_ERROR("Timed out waiting for ACT sent when disabling\n");
 +              drm_err(&dev_priv->drm,
 +                      "Timed out waiting for ACT sent when disabling\n");
        drm_dp_check_act_status(&intel_dp->mst_mgr);
  
        drm_dp_mst_deallocate_vcpi(&intel_dp->mst_mgr, connector->port);
         */
        drm_dp_send_power_updown_phy(&intel_dp->mst_mgr, connector->port,
                                     false);
 +
 +      /*
 +       * BSpec 4287: disable DIP after the transcoder is disabled and before
 +       * the transcoder clock select is set to none.
 +       */
 +      if (last_mst_stream)
 +              intel_dp_set_infoframes(&intel_dig_port->base, false,
 +                                      old_crtc_state, NULL);
        /*
         * From TGL spec: "If multi-stream slave transcoder: Configure
         * Transcoder Clock Select to direct no clock to the transcoder"
  
        intel_mst->connector = NULL;
        if (last_mst_stream)
 -              intel_dig_port->base.post_disable(&intel_dig_port->base,
 +              intel_dig_port->base.post_disable(state, &intel_dig_port->base,
                                                  old_crtc_state, NULL);
  
 -      DRM_DEBUG_KMS("active links %d\n", intel_dp->active_mst_links);
 +      drm_dbg_kms(&dev_priv->drm, "active links %d\n",
 +                  intel_dp->active_mst_links);
  }
  
 -static void intel_mst_pre_pll_enable_dp(struct intel_encoder *encoder,
 +static void intel_mst_pre_pll_enable_dp(struct intel_atomic_state *state,
 +                                      struct intel_encoder *encoder,
                                        const struct intel_crtc_state *pipe_config,
                                        const struct drm_connector_state *conn_state)
  {
        struct intel_dp *intel_dp = &intel_dig_port->dp;
  
        if (intel_dp->active_mst_links == 0)
 -              intel_dig_port->base.pre_pll_enable(&intel_dig_port->base,
 +              intel_dig_port->base.pre_pll_enable(state, &intel_dig_port->base,
                                                    pipe_config, NULL);
  }
  
 -static void intel_mst_pre_enable_dp(struct intel_encoder *encoder,
 +static void intel_mst_pre_enable_dp(struct intel_atomic_state *state,
 +                                  struct intel_encoder *encoder,
                                    const struct intel_crtc_state *pipe_config,
                                    const struct drm_connector_state *conn_state)
  {
                    INTEL_GEN(dev_priv) >= 12 && first_mst_stream &&
                    !intel_dp_mst_is_master_trans(pipe_config));
  
 -      DRM_DEBUG_KMS("active links %d\n", intel_dp->active_mst_links);
 +      drm_dbg_kms(&dev_priv->drm, "active links %d\n",
 +                  intel_dp->active_mst_links);
  
        if (first_mst_stream)
                intel_dp_sink_dpms(intel_dp, DRM_MODE_DPMS_ON);
        drm_dp_send_power_updown_phy(&intel_dp->mst_mgr, connector->port, true);
  
        if (first_mst_stream)
 -              intel_dig_port->base.pre_enable(&intel_dig_port->base,
 +              intel_dig_port->base.pre_enable(state, &intel_dig_port->base,
                                                pipe_config, NULL);
  
        ret = drm_dp_mst_allocate_vcpi(&intel_dp->mst_mgr,
                                       pipe_config->pbn,
                                       pipe_config->dp_m_n.tu);
        if (!ret)
 -              DRM_ERROR("failed to allocate vcpi\n");
 +              drm_err(&dev_priv->drm, "failed to allocate vcpi\n");
  
        intel_dp->active_mst_links++;
        temp = intel_de_read(dev_priv, intel_dp->regs.dp_tp_status);
         * here for the following ones.
         */
        if (INTEL_GEN(dev_priv) < 12 || !first_mst_stream)
 -              intel_ddi_enable_pipe_clock(pipe_config);
 +              intel_ddi_enable_pipe_clock(encoder, pipe_config);
  
        intel_ddi_set_dp_msa(pipe_config, conn_state);
  
        intel_dp_set_m_n(pipe_config, M1_N1);
  }
  
 -static void intel_mst_enable_dp(struct intel_encoder *encoder,
 +static void intel_mst_enable_dp(struct intel_atomic_state *state,
 +                              struct intel_encoder *encoder,
                                const struct intel_crtc_state *pipe_config,
                                const struct drm_connector_state *conn_state)
  {
  
        drm_WARN_ON(&dev_priv->drm, pipe_config->has_pch_encoder);
  
 -      intel_enable_pipe(pipe_config);
 +      intel_ddi_enable_transcoder_func(encoder, pipe_config);
  
 -      intel_crtc_vblank_on(pipe_config);
 -
 -      DRM_DEBUG_KMS("active links %d\n", intel_dp->active_mst_links);
 +      drm_dbg_kms(&dev_priv->drm, "active links %d\n",
 +                  intel_dp->active_mst_links);
  
        if (intel_de_wait_for_set(dev_priv, intel_dp->regs.dp_tp_status,
                                  DP_TP_STATUS_ACT_SENT, 1))
 -              DRM_ERROR("Timed out waiting for ACT sent\n");
 +              drm_err(&dev_priv->drm, "Timed out waiting for ACT sent\n");
  
        drm_dp_check_act_status(&intel_dp->mst_mgr);
  
        drm_dp_update_payload_part2(&intel_dp->mst_mgr);
 +
 +      intel_enable_pipe(pipe_config);
 +
 +      intel_crtc_vblank_on(pipe_config);
 +
        if (pipe_config->has_audio)
                intel_audio_codec_enable(encoder, pipe_config, conn_state);
  }
@@@ -773,8 -748,17 +774,17 @@@ err
        return NULL;
  }
  
+ static void
+ intel_dp_mst_poll_hpd_irq(struct drm_dp_mst_topology_mgr *mgr)
+ {
+       struct intel_dp *intel_dp = container_of(mgr, struct intel_dp, mst_mgr);
+       intel_hpd_trigger_irq(dp_to_dig_port(intel_dp));
+ }
  static const struct drm_dp_mst_topology_cbs mst_cbs = {
        .add_connector = intel_dp_add_mst_connector,
+       .poll_hpd_irq = intel_dp_mst_poll_hpd_irq,
  };
  
  static struct intel_dp_mst_encoder *
@@@ -811,7 -795,6 +821,7 @@@ intel_dp_create_fake_mst_encoder(struc
        intel_encoder->pipe_mask = ~0;
  
        intel_encoder->compute_config = intel_dp_mst_compute_config;
 +      intel_encoder->compute_config_late = intel_dp_mst_compute_config_late;
        intel_encoder->disable = intel_mst_disable_dp;
        intel_encoder->post_disable = intel_mst_post_disable_dp;
        intel_encoder->pre_pll_enable = intel_mst_pre_pll_enable_dp;
@@@ -270,7 -270,8 +270,7 @@@ static void intel_hpd_irq_storm_reenabl
  
  enum intel_hotplug_state
  intel_encoder_hotplug(struct intel_encoder *encoder,
 -                    struct intel_connector *connector,
 -                    bool irq_received)
 +                    struct intel_connector *connector)
  {
        struct drm_device *dev = connector->base.dev;
        enum drm_connector_status old_status;
@@@ -347,6 -348,24 +347,24 @@@ static void i915_digport_work_func(stru
        }
  }
  
+ /**
+  * intel_hpd_trigger_irq - trigger an hpd irq event for a port
+  * @dig_port: digital port
+  *
+  * Trigger an HPD interrupt event for the given port, emulating a short pulse
+  * generated by the sink, and schedule the dig port work to handle it.
+  */
+ void intel_hpd_trigger_irq(struct intel_digital_port *dig_port)
+ {
+       struct drm_i915_private *i915 = to_i915(dig_port->base.base.dev);
+       spin_lock_irq(&i915->irq_lock);
+       i915->hotplug.short_port_mask |= BIT(dig_port->base.port);
+       spin_unlock_irq(&i915->irq_lock);
+       queue_work(i915->hotplug.dp_wq, &i915->hotplug.dig_port_work);
+ }
  /*
   * Handle hotplug events outside the interrupt handler proper.
   */
@@@ -391,17 -410,12 +409,17 @@@ static void i915_hotplug_work_func(stru
                        struct intel_encoder *encoder =
                                intel_attached_encoder(connector);
  
 +                      if (hpd_event_bits & hpd_bit)
 +                              connector->hotplug_retries = 0;
 +                      else
 +                              connector->hotplug_retries++;
 +
                        drm_dbg_kms(&dev_priv->drm,
 -                                  "Connector %s (pin %i) received hotplug event.\n",
 -                                  connector->base.name, pin);
 +                                  "Connector %s (pin %i) received hotplug event. (retry %d)\n",
 +                                  connector->base.name, pin,
 +                                  connector->hotplug_retries);
  
 -                      switch (encoder->hotplug(encoder, connector,
 -                                               hpd_event_bits & hpd_bit)) {
 +                      switch (encoder->hotplug(encoder, connector)) {
                        case INTEL_HOTPLUG_UNCHANGED:
                                break;
                        case INTEL_HOTPLUG_CHANGED:
  
  struct drm_i915_private;
  struct intel_connector;
+ struct intel_digital_port;
  struct intel_encoder;
  enum port;
  
  void intel_hpd_poll_init(struct drm_i915_private *dev_priv);
  enum intel_hotplug_state intel_encoder_hotplug(struct intel_encoder *encoder,
 -                                             struct intel_connector *connector,
 -                                             bool irq_received);
 +                                             struct intel_connector *connector);
  void intel_hpd_irq_handler(struct drm_i915_private *dev_priv,
                           u32 pin_mask, u32 long_mask);
+ void intel_hpd_trigger_irq(struct intel_digital_port *dig_port);
  void intel_hpd_init(struct drm_i915_private *dev_priv);
  void intel_hpd_init_work(struct drm_i915_private *dev_priv);
  void intel_hpd_cancel_work(struct drm_i915_private *dev_priv);
@@@ -914,8 -914,7 +914,8 @@@ intel_tv_get_hw_state(struct intel_enco
  }
  
  static void
 -intel_enable_tv(struct intel_encoder *encoder,
 +intel_enable_tv(struct intel_atomic_state *state,
 +              struct intel_encoder *encoder,
                const struct intel_crtc_state *pipe_config,
                const struct drm_connector_state *conn_state)
  {
  }
  
  static void
 -intel_disable_tv(struct intel_encoder *encoder,
 +intel_disable_tv(struct intel_atomic_state *state,
 +               struct intel_encoder *encoder,
                 const struct intel_crtc_state *old_crtc_state,
                 const struct drm_connector_state *old_conn_state)
  {
@@@ -1038,9 -1036,6 +1038,6 @@@ intel_tv_mode_to_mode(struct drm_displa
        /* TV has it's own notion of sync and other mode flags, so clear them. */
        mode->flags = 0;
  
-       mode->vrefresh = 0;
-       mode->vrefresh = drm_mode_vrefresh(mode);
        snprintf(mode->name, sizeof(mode->name),
                 "%dx%d%c (%s)",
                 mode->hdisplay, mode->vdisplay,
@@@ -1416,8 -1411,7 +1413,8 @@@ static void set_color_conversion(struc
                       (color_conversion->bv << 16) | color_conversion->av);
  }
  
 -static void intel_tv_pre_enable(struct intel_encoder *encoder,
 +static void intel_tv_pre_enable(struct intel_atomic_state *state,
 +                              struct intel_encoder *encoder,
                                const struct intel_crtc_state *pipe_config,
                                const struct drm_connector_state *conn_state)
  {
@@@ -1701,13 -1695,13 +1698,13 @@@ intel_tv_detect(struct drm_connector *c
                struct drm_modeset_acquire_ctx *ctx,
                bool force)
  {
 +      struct drm_i915_private *i915 = to_i915(connector->dev);
        struct intel_tv *intel_tv = intel_attached_tv(to_intel_connector(connector));
        enum drm_connector_status status;
        int type;
  
 -      DRM_DEBUG_KMS("[CONNECTOR:%d:%s] force=%d\n",
 -                    connector->base.id, connector->name,
 -                    force);
 +      drm_dbg_kms(&i915->drm, "[CONNECTOR:%d:%s] force=%d\n",
 +                  connector->base.id, connector->name, force);
  
        if (force) {
                struct intel_load_detect_pipe tmp;
@@@ -330,8 -330,8 +330,8 @@@ static int ingenic_drm_crtc_atomic_chec
        if (!drm_atomic_crtc_needs_modeset(state))
                return 0;
  
 -      if (state->mode.hdisplay > priv->soc_info->max_height ||
 -          state->mode.vdisplay > priv->soc_info->max_width)
 +      if (state->mode.hdisplay > priv->soc_info->max_width ||
 +          state->mode.vdisplay > priv->soc_info->max_height)
                return -EINVAL;
  
        rate = clk_round_rate(priv->pix_clk,
@@@ -476,7 -476,7 +476,7 @@@ static int ingenic_drm_encoder_atomic_c
  
  static irqreturn_t ingenic_drm_irq_handler(int irq, void *arg)
  {
 -      struct ingenic_drm *priv = arg;
 +      struct ingenic_drm *priv = drm_device_get_priv(arg);
        unsigned int state;
  
        regmap_read(priv->map, JZ_REG_LCD_STATE, &state);
@@@ -519,18 -519,7 +519,7 @@@ static struct drm_driver ingenic_drm_dr
        .patchlevel             = 0,
  
        .fops                   = &ingenic_drm_fops,
-       .dumb_create            = drm_gem_cma_dumb_create,
-       .gem_free_object_unlocked = drm_gem_cma_free_object,
-       .gem_vm_ops             = &drm_gem_cma_vm_ops,
-       .prime_handle_to_fd     = drm_gem_prime_handle_to_fd,
-       .prime_fd_to_handle     = drm_gem_prime_fd_to_handle,
-       .gem_prime_get_sg_table = drm_gem_cma_prime_get_sg_table,
-       .gem_prime_import_sg_table = drm_gem_cma_prime_import_sg_table,
-       .gem_prime_vmap         = drm_gem_cma_prime_vmap,
-       .gem_prime_vunmap       = drm_gem_cma_prime_vunmap,
-       .gem_prime_mmap         = drm_gem_cma_prime_mmap,
+       DRM_GEM_CMA_DRIVER_OPS,
  
        .irq_handler            = ingenic_drm_irq_handler,
  };
@@@ -824,7 -813,6 +813,7 @@@ static const struct of_device_id ingeni
        { .compatible = "ingenic,jz4770-lcd", .data = &jz4770_soc_info },
        { /* sentinel */ },
  };
 +MODULE_DEVICE_TABLE(of, ingenic_drm_of_match);
  
  static struct platform_driver ingenic_drm_driver = {
        .driver = {
@@@ -6,7 -6,6 +6,7 @@@
  #include <linux/clk.h>
  #include <linux/pm_runtime.h>
  #include <linux/soc/mediatek/mtk-cmdq.h>
 +#include <linux/soc/mediatek/mtk-mmsys.h>
  
  #include <asm/barrier.h>
  #include <soc/mediatek/smi.h>
@@@ -29,7 -28,7 +29,7 @@@
   * @enabled: records whether crtc_enable succeeded
   * @planes: array of 4 drm_plane structures, one for each overlay plane
   * @pending_planes: whether any plane has pending changes to be applied
 - * @config_regs: memory mapped mmsys configuration register space
 + * @mmsys_dev: pointer to the mmsys device for configuration registers
   * @mutex: handle to one of the ten disp_mutex streams
   * @ddp_comp_nr: number of components in ddp_comp
   * @ddp_comp: array of pointers the mtk_ddp_comp structures used by this crtc
@@@ -51,7 -50,7 +51,7 @@@ struct mtk_drm_crtc 
        u32                             cmdq_event;
  #endif
  
 -      void __iomem                    *config_regs;
 +      struct device                   *mmsys_dev;
        struct mtk_disp_mutex           *mutex;
        unsigned int                    ddp_comp_nr;
        struct mtk_ddp_comp             **ddp_comp;
@@@ -165,7 -164,7 +165,7 @@@ static void mtk_drm_crtc_mode_set_nofb(
  
        state->pending_width = crtc->mode.hdisplay;
        state->pending_height = crtc->mode.vdisplay;
-       state->pending_vrefresh = crtc->mode.vrefresh;
+       state->pending_vrefresh = drm_mode_vrefresh(&crtc->mode);
        wmb();  /* Make sure the above parameters are set before update */
        state->pending_config = true;
  }
@@@ -264,7 -263,7 +264,7 @@@ static int mtk_crtc_ddp_hw_init(struct 
  
        width = crtc->state->adjusted_mode.hdisplay;
        height = crtc->state->adjusted_mode.vdisplay;
-       vrefresh = crtc->state->adjusted_mode.vrefresh;
+       vrefresh = drm_mode_vrefresh(&crtc->state->adjusted_mode);
  
        drm_for_each_encoder(encoder, crtc->dev) {
                if (encoder->crtc != crtc)
  
        DRM_DEBUG_DRIVER("mediatek_ddp_ddp_path_setup\n");
        for (i = 0; i < mtk_crtc->ddp_comp_nr - 1; i++) {
 -              mtk_ddp_add_comp_to_path(mtk_crtc->config_regs,
 -                                       mtk_crtc->ddp_comp[i]->id,
 -                                       mtk_crtc->ddp_comp[i + 1]->id);
 +              mtk_mmsys_ddp_connect(mtk_crtc->mmsys_dev,
 +                                    mtk_crtc->ddp_comp[i]->id,
 +                                    mtk_crtc->ddp_comp[i + 1]->id);
                mtk_disp_mutex_add_comp(mtk_crtc->mutex,
                                        mtk_crtc->ddp_comp[i]->id);
        }
@@@ -361,9 -360,9 +361,9 @@@ static void mtk_crtc_ddp_hw_fini(struc
                                           mtk_crtc->ddp_comp[i]->id);
        mtk_disp_mutex_disable(mtk_crtc->mutex);
        for (i = 0; i < mtk_crtc->ddp_comp_nr - 1; i++) {
 -              mtk_ddp_remove_comp_from_path(mtk_crtc->config_regs,
 -                                            mtk_crtc->ddp_comp[i]->id,
 -                                            mtk_crtc->ddp_comp[i + 1]->id);
 +              mtk_mmsys_ddp_disconnect(mtk_crtc->mmsys_dev,
 +                                       mtk_crtc->ddp_comp[i]->id,
 +                                       mtk_crtc->ddp_comp[i + 1]->id);
                mtk_disp_mutex_remove_comp(mtk_crtc->mutex,
                                           mtk_crtc->ddp_comp[i]->id);
        }
@@@ -767,7 -766,7 +767,7 @@@ int mtk_drm_crtc_create(struct drm_devi
        if (!mtk_crtc)
                return -ENOMEM;
  
 -      mtk_crtc->config_regs = priv->config_regs;
 +      mtk_crtc->mmsys_dev = priv->mmsys_dev;
        mtk_crtc->ddp_comp_nr = path_len;
        mtk_crtc->ddp_comp = devm_kmalloc_array(dev, mtk_crtc->ddp_comp_nr,
                                                sizeof(*mtk_crtc->ddp_comp),
@@@ -117,7 -117,7 +117,7 @@@ int mtk_drm_gem_dumb_create(struct drm_
                goto err_handle_create;
  
        /* drop reference from allocate - handle holds it now. */
-       drm_gem_object_put_unlocked(&mtk_gem->base);
+       drm_gem_object_put(&mtk_gem->base);
  
        return 0;
  
@@@ -224,9 -224,6 +224,9 @@@ struct drm_gem_object *mtk_gem_prime_im
  
        expected = sg_dma_address(sg->sgl);
        for_each_sg(sg->sgl, s, sg->nents, i) {
 +              if (!sg_dma_len(s))
 +                      break;
 +
                if (sg_dma_address(s) != expected) {
                        DRM_ERROR("sg_table is not contiguous");
                        ret = -EINVAL;
@@@ -311,10 -311,14 +311,10 @@@ static void mtk_hdmi_hw_send_info_frame
        u8 checksum;
        int ctrl_frame_en = 0;
  
 -      frame_type = *buffer;
 -      buffer += 1;
 -      frame_ver = *buffer;
 -      buffer += 1;
 -      frame_len = *buffer;
 -      buffer += 1;
 -      checksum = *buffer;
 -      buffer += 1;
 +      frame_type = *buffer++;
 +      frame_ver = *buffer++;
 +      frame_len = *buffer++;
 +      checksum = *buffer++;
        frame_data = buffer;
  
        dev_dbg(hdmi->dev,
@@@ -978,7 -982,7 +978,7 @@@ static int mtk_hdmi_setup_avi_infoframe
                                        struct drm_display_mode *mode)
  {
        struct hdmi_avi_infoframe frame;
 -      u8 buffer[17];
 +      u8 buffer[HDMI_INFOFRAME_HEADER_SIZE + HDMI_AVI_INFOFRAME_SIZE];
        ssize_t err;
  
        err = drm_hdmi_avi_infoframe_from_display_mode(&frame,
@@@ -1004,7 -1008,7 +1004,7 @@@ static int mtk_hdmi_setup_spd_infoframe
                                        const char *product)
  {
        struct hdmi_spd_infoframe frame;
 -      u8 buffer[29];
 +      u8 buffer[HDMI_INFOFRAME_HEADER_SIZE + HDMI_SPD_INFOFRAME_SIZE];
        ssize_t err;
  
        err = hdmi_spd_infoframe_init(&frame, vendor, product);
  static int mtk_hdmi_setup_audio_infoframe(struct mtk_hdmi *hdmi)
  {
        struct hdmi_audio_infoframe frame;
 -      u8 buffer[14];
 +      u8 buffer[HDMI_INFOFRAME_HEADER_SIZE + HDMI_AUDIO_INFOFRAME_SIZE];
        ssize_t err;
  
        err = hdmi_audio_infoframe_init(&frame);
@@@ -1254,7 -1258,7 +1254,7 @@@ static int mtk_hdmi_conn_mode_valid(str
        struct drm_bridge *next_bridge;
  
        dev_dbg(hdmi->dev, "xres=%d, yres=%d, refresh=%d, intl=%d clock=%d\n",
-               mode->hdisplay, mode->vdisplay, mode->vrefresh,
+               mode->hdisplay, mode->vdisplay, drm_mode_vrefresh(mode),
                !!(mode->flags & DRM_MODE_FLAG_INTERLACE), mode->clock * 1000);
  
        next_bridge = drm_bridge_get_next_bridge(&hdmi->bridge);
@@@ -1470,9 -1474,7 +1470,9 @@@ static int mtk_hdmi_dt_parse_pdata(stru
  
        ret = mtk_hdmi_get_all_clk(hdmi, np);
        if (ret) {
 -              dev_err(dev, "Failed to get clocks: %d\n", ret);
 +              if (ret != -EPROBE_DEFER)
 +                      dev_err(dev, "Failed to get clocks: %d\n", ret);
 +
                return ret;
        }
  
@@@ -96,19 -96,8 +96,8 @@@ static struct drm_driver meson_driver 
        /* IRQ */
        .irq_handler            = meson_irq,
  
-       /* PRIME Ops */
-       .prime_handle_to_fd     = drm_gem_prime_handle_to_fd,
-       .prime_fd_to_handle     = drm_gem_prime_fd_to_handle,
-       .gem_prime_get_sg_table = drm_gem_cma_prime_get_sg_table,
-       .gem_prime_import_sg_table = drm_gem_cma_prime_import_sg_table,
-       .gem_prime_vmap         = drm_gem_cma_prime_vmap,
-       .gem_prime_vunmap       = drm_gem_cma_prime_vunmap,
-       .gem_prime_mmap         = drm_gem_cma_prime_mmap,
-       /* GEM Ops */
-       .dumb_create            = meson_dumb_create,
-       .gem_free_object_unlocked = drm_gem_cma_free_object,
-       .gem_vm_ops             = &drm_gem_cma_vm_ops,
+       /* CMA Ops */
+       DRM_GEM_CMA_DRIVER_OPS_WITH_DUMB_CREATE(meson_dumb_create),
  
        /* Misc */
        .fops                   = &fops,
@@@ -440,7 -429,9 +429,7 @@@ static int __maybe_unused meson_drv_pm_
        if (priv->afbcd.ops)
                priv->afbcd.ops->init(priv);
  
 -      drm_mode_config_helper_resume(priv->drm);
 -
 -      return 0;
 +      return drm_mode_config_helper_resume(priv->drm);
  }
  
  static int compare_of(struct device *dev, void *data)
@@@ -804,17 -804,17 +804,17 @@@ static void a5xx_destroy(struct msm_gp
  
        if (a5xx_gpu->pm4_bo) {
                msm_gem_unpin_iova(a5xx_gpu->pm4_bo, gpu->aspace);
-               drm_gem_object_put_unlocked(a5xx_gpu->pm4_bo);
+               drm_gem_object_put(a5xx_gpu->pm4_bo);
        }
  
        if (a5xx_gpu->pfp_bo) {
                msm_gem_unpin_iova(a5xx_gpu->pfp_bo, gpu->aspace);
-               drm_gem_object_put_unlocked(a5xx_gpu->pfp_bo);
+               drm_gem_object_put(a5xx_gpu->pfp_bo);
        }
  
        if (a5xx_gpu->gpmu_bo) {
                msm_gem_unpin_iova(a5xx_gpu->gpmu_bo, gpu->aspace);
-               drm_gem_object_put_unlocked(a5xx_gpu->gpmu_bo);
+               drm_gem_object_put(a5xx_gpu->gpmu_bo);
        }
  
        adreno_gpu_cleanup(adreno_gpu);
@@@ -1404,10 -1404,6 +1404,10 @@@ static unsigned long a5xx_gpu_busy(stru
  {
        u64 busy_cycles, busy_time;
  
 +      /* Only read the gpu busy if the hardware is already active */
 +      if (pm_runtime_get_if_in_use(&gpu->pdev->dev) == 0)
 +              return 0;
 +
        busy_cycles = gpu_read64(gpu, REG_A5XX_RBBM_PERFCTR_RBBM_0_LO,
                        REG_A5XX_RBBM_PERFCTR_RBBM_0_HI);
  
  
        gpu->devfreq.busy_cycles = busy_cycles;
  
 +      pm_runtime_put(&gpu->pdev->dev);
 +
        if (WARN_ON(busy_time > ~0LU))
                return ~0LU;
  
@@@ -1445,7 -1439,6 +1445,7 @@@ static const struct adreno_gpu_funcs fu
                .gpu_busy = a5xx_gpu_busy,
                .gpu_state_get = a5xx_gpu_state_get,
                .gpu_state_put = a5xx_gpu_state_put,
 +              .create_address_space = adreno_iommu_create_address_space,
        },
        .get_timestamp = a5xx_get_timestamp,
  };
@@@ -414,17 -414,7 +414,17 @@@ static int a6xx_hw_init(struct msm_gpu 
                a6xx_set_hwcg(gpu, true);
  
        /* VBIF/GBIF start*/
 -      gpu_write(gpu, REG_A6XX_RBBM_VBIF_CLIENT_QOS_CNTL, 0x3);
 +      if (adreno_is_a640(adreno_gpu) || adreno_is_a650(adreno_gpu)) {
 +              gpu_write(gpu, REG_A6XX_GBIF_QSB_SIDE0, 0x00071620);
 +              gpu_write(gpu, REG_A6XX_GBIF_QSB_SIDE1, 0x00071620);
 +              gpu_write(gpu, REG_A6XX_GBIF_QSB_SIDE2, 0x00071620);
 +              gpu_write(gpu, REG_A6XX_GBIF_QSB_SIDE3, 0x00071620);
 +              gpu_write(gpu, REG_A6XX_GBIF_QSB_SIDE3, 0x00071620);
 +              gpu_write(gpu, REG_A6XX_RBBM_GBIF_CLIENT_QOS_CNTL, 0x3);
 +      } else {
 +              gpu_write(gpu, REG_A6XX_RBBM_VBIF_CLIENT_QOS_CNTL, 0x3);
 +      }
 +
        if (adreno_is_a630(adreno_gpu))
                gpu_write(gpu, REG_A6XX_VBIF_GATE_OFF_WRREQ_EN, 0x00000009);
  
        gpu_write(gpu, REG_A6XX_UCHE_WRITE_THRU_BASE_LO, 0xfffff000);
        gpu_write(gpu, REG_A6XX_UCHE_WRITE_THRU_BASE_HI, 0x0001ffff);
  
 -      /* Set the GMEM VA range [0x100000:0x100000 + gpu->gmem - 1] */
 -      gpu_write64(gpu, REG_A6XX_UCHE_GMEM_RANGE_MIN_LO,
 -              REG_A6XX_UCHE_GMEM_RANGE_MIN_HI, 0x00100000);
 +      if (!adreno_is_a650(adreno_gpu)) {
 +              /* Set the GMEM VA range [0x100000:0x100000 + gpu->gmem - 1] */
 +              gpu_write64(gpu, REG_A6XX_UCHE_GMEM_RANGE_MIN_LO,
 +                      REG_A6XX_UCHE_GMEM_RANGE_MIN_HI, 0x00100000);
  
 -      gpu_write64(gpu, REG_A6XX_UCHE_GMEM_RANGE_MAX_LO,
 -              REG_A6XX_UCHE_GMEM_RANGE_MAX_HI,
 -              0x00100000 + adreno_gpu->gmem - 1);
 +              gpu_write64(gpu, REG_A6XX_UCHE_GMEM_RANGE_MAX_LO,
 +                      REG_A6XX_UCHE_GMEM_RANGE_MAX_HI,
 +                      0x00100000 + adreno_gpu->gmem - 1);
 +      }
  
        gpu_write(gpu, REG_A6XX_UCHE_FILTER_CNTL, 0x804);
        gpu_write(gpu, REG_A6XX_UCHE_CACHE_WAYS, 0x4);
  
 -      gpu_write(gpu, REG_A6XX_CP_ROQ_THRESHOLDS_2, 0x010000c0);
 +      if (adreno_is_a640(adreno_gpu) || adreno_is_a650(adreno_gpu))
 +              gpu_write(gpu, REG_A6XX_CP_ROQ_THRESHOLDS_2, 0x02000140);
 +      else
 +              gpu_write(gpu, REG_A6XX_CP_ROQ_THRESHOLDS_2, 0x010000c0);
        gpu_write(gpu, REG_A6XX_CP_ROQ_THRESHOLDS_1, 0x8040362c);
  
        /* Setting the mem pool size */
        gpu_write(gpu, REG_A6XX_CP_MEM_POOL_SIZE, 128);
  
        /* Setting the primFifo thresholds default values */
 -      gpu_write(gpu, REG_A6XX_PC_DBG_ECO_CNTL, (0x300 << 11));
 +      if (adreno_is_a650(adreno_gpu))
 +              gpu_write(gpu, REG_A6XX_PC_DBG_ECO_CNTL, 0x00300000);
 +      else if (adreno_is_a640(adreno_gpu))
 +              gpu_write(gpu, REG_A6XX_PC_DBG_ECO_CNTL, 0x00200000);
 +      else
 +              gpu_write(gpu, REG_A6XX_PC_DBG_ECO_CNTL, (0x300 << 11));
  
        /* Set the AHB default slave response to "ERROR" */
        gpu_write(gpu, REG_A6XX_CP_AHB_CNTL, 0x1);
  
        gpu_write(gpu, REG_A6XX_UCHE_CLIENT_PF, 1);
  
 +      /* Set weights for bicubic filtering */
 +      if (adreno_is_a650(adreno_gpu)) {
 +              gpu_write(gpu, REG_A6XX_TPL1_BICUBIC_WEIGHTS_TABLE_0, 0);
 +              gpu_write(gpu, REG_A6XX_TPL1_BICUBIC_WEIGHTS_TABLE_1,
 +                      0x3fe05ff4);
 +              gpu_write(gpu, REG_A6XX_TPL1_BICUBIC_WEIGHTS_TABLE_2,
 +                      0x3fa0ebee);
 +              gpu_write(gpu, REG_A6XX_TPL1_BICUBIC_WEIGHTS_TABLE_3,
 +                      0x3f5193ed);
 +              gpu_write(gpu, REG_A6XX_TPL1_BICUBIC_WEIGHTS_TABLE_4,
 +                      0x3f0243f0);
 +      }
 +
        /* Protect registers from the CP */
        gpu_write(gpu, REG_A6XX_CP_PROTECT_CNTL, 0x00000003);
  
                        A6XX_PROTECT_RDONLY(0x980, 0x4));
        gpu_write(gpu, REG_A6XX_CP_PROTECT(25), A6XX_PROTECT_RW(0xa630, 0x0));
  
 +      if (adreno_is_a650(adreno_gpu)) {
 +              gpu_write(gpu, REG_A6XX_CP_APRIV_CNTL,
 +                      (1 << 6) | (1 << 5) | (1 << 3) | (1 << 2) | (1 << 1));
 +      }
 +
        /* Enable interrupts */
        gpu_write(gpu, REG_A6XX_RBBM_INT_0_MASK, A6XX_INT_MASK);
  
@@@ -604,10 -566,8 +604,10 @@@ out
         */
        a6xx_gmu_clear_oob(&a6xx_gpu->gmu, GMU_OOB_GPU_SET);
  
 -      /* Take the GMU out of its special boot mode */
 -      a6xx_gmu_clear_oob(&a6xx_gpu->gmu, GMU_OOB_BOOT_SLUMBER);
 +      if (a6xx_gpu->gmu.legacy) {
 +              /* Take the GMU out of its special boot mode */
 +              a6xx_gmu_clear_oob(&a6xx_gpu->gmu, GMU_OOB_BOOT_SLUMBER);
 +      }
  
        return ret;
  }
@@@ -835,7 -795,7 +835,7 @@@ static void a6xx_destroy(struct msm_gp
  
        if (a6xx_gpu->sqe_bo) {
                msm_gem_unpin_iova(a6xx_gpu->sqe_bo, gpu->aspace);
-               drm_gem_object_put_unlocked(a6xx_gpu->sqe_bo);
+               drm_gem_object_put(a6xx_gpu->sqe_bo);
        }
  
        a6xx_gmu_remove(a6xx_gpu);
@@@ -850,11 -810,6 +850,11 @@@ static unsigned long a6xx_gpu_busy(stru
        struct a6xx_gpu *a6xx_gpu = to_a6xx_gpu(adreno_gpu);
        u64 busy_cycles, busy_time;
  
 +
 +      /* Only read the gpu busy if the hardware is already active */
 +      if (pm_runtime_get_if_in_use(a6xx_gpu->gmu.dev) == 0)
 +              return 0;
 +
        busy_cycles = gmu_read64(&a6xx_gpu->gmu,
                        REG_A6XX_GMU_CX_GMU_POWER_COUNTER_XOCLK_0_L,
                        REG_A6XX_GMU_CX_GMU_POWER_COUNTER_XOCLK_0_H);
  
        gpu->devfreq.busy_cycles = busy_cycles;
  
 +      pm_runtime_put(a6xx_gpu->gmu.dev);
 +
        if (WARN_ON(busy_time > ~0LU))
                return ~0LU;
  
@@@ -893,7 -846,6 +893,7 @@@ static const struct adreno_gpu_funcs fu
  #if defined(CONFIG_DRM_MSM_GPU_STATE)
                .gpu_state_get = a6xx_gpu_state_get,
                .gpu_state_put = a6xx_gpu_state_put,
 +              .create_address_space = adreno_iommu_create_address_space,
  #endif
        },
        .get_timestamp = a6xx_get_timestamp,
@@@ -20,7 -20,6 +20,7 @@@
  #include "dpu_hw_catalog.h"
  #include "dpu_hw_intf.h"
  #include "dpu_hw_ctl.h"
 +#include "dpu_hw_dspp.h"
  #include "dpu_formats.h"
  #include "dpu_encoder_phys.h"
  #include "dpu_crtc.h"
@@@ -499,23 -498,6 +499,6 @@@ void dpu_encoder_helper_split_config
        }
  }
  
- static void _dpu_encoder_adjust_mode(struct drm_connector *connector,
-               struct drm_display_mode *adj_mode)
- {
-       struct drm_display_mode *cur_mode;
-       if (!connector || !adj_mode)
-               return;
-       list_for_each_entry(cur_mode, &connector->modes, head) {
-               if (cur_mode->vdisplay == adj_mode->vdisplay &&
-                   cur_mode->hdisplay == adj_mode->hdisplay &&
-                   drm_mode_vrefresh(cur_mode) == drm_mode_vrefresh(adj_mode)) {
-                       adj_mode->private_flags |= cur_mode->private_flags;
-               }
-       }
- }
  static struct msm_display_topology dpu_encoder_get_topology(
                        struct dpu_encoder_virt *dpu_enc,
                        struct dpu_kms *dpu_kms,
         * 1 LM, 1 INTF
         * 2 LM, 1 INTF (stream merge to support high resolution interfaces)
         *
 +       * Adding color blocks only to primary interface
         */
        if (intf_count == 2)
                topology.num_lm = 2;
        else
                topology.num_lm = (mode->hdisplay > MAX_HDISPLAY_SPLIT) ? 2 : 1;
  
 +      if (dpu_enc->disp_info.intf_type == DRM_MODE_ENCODER_DSI)
 +              topology.num_dspp = topology.num_lm;
 +
        topology.num_enc = 0;
        topology.num_intf = intf_count;
  
@@@ -585,15 -563,6 +568,6 @@@ static int dpu_encoder_virt_atomic_chec
        global_state = dpu_kms_get_existing_global_state(dpu_kms);
        trace_dpu_enc_atomic_check(DRMID(drm_enc));
  
-       /*
-        * display drivers may populate private fields of the drm display mode
-        * structure while registering possible modes of a connector with DRM.
-        * These private fields are not populated back while DRM invokes
-        * the mode_set callbacks. This module retrieves and populates the
-        * private fields of the given mode.
-        */
-       _dpu_encoder_adjust_mode(conn_state->connector, adj_mode);
        /* perform atomic check on the first physical encoder (master) */
        for (i = 0; i < dpu_enc->num_phys_encs; i++) {
                struct dpu_encoder_phys *phys = dpu_enc->phys_encs[i];
                }
        }
  
-       trace_dpu_enc_atomic_check_flags(DRMID(drm_enc), adj_mode->flags,
-                       adj_mode->private_flags);
+       trace_dpu_enc_atomic_check_flags(DRMID(drm_enc), adj_mode->flags);
  
        return ret;
  }
@@@ -964,8 -932,7 +937,8 @@@ static void dpu_encoder_virt_mode_set(s
        struct dpu_hw_blk *hw_pp[MAX_CHANNELS_PER_ENC];
        struct dpu_hw_blk *hw_ctl[MAX_CHANNELS_PER_ENC];
        struct dpu_hw_blk *hw_lm[MAX_CHANNELS_PER_ENC];
 -      int num_lm, num_ctl, num_pp;
 +      struct dpu_hw_blk *hw_dspp[MAX_CHANNELS_PER_ENC] = { NULL };
 +      int num_lm, num_ctl, num_pp, num_dspp;
        int i, j;
  
        if (!drm_enc) {
                drm_enc->base.id, DPU_HW_BLK_CTL, hw_ctl, ARRAY_SIZE(hw_ctl));
        num_lm = dpu_rm_get_assigned_resources(&dpu_kms->rm, global_state,
                drm_enc->base.id, DPU_HW_BLK_LM, hw_lm, ARRAY_SIZE(hw_lm));
 +      num_dspp = dpu_rm_get_assigned_resources(&dpu_kms->rm, global_state,
 +              drm_enc->base.id, DPU_HW_BLK_DSPP, hw_dspp,
 +              ARRAY_SIZE(hw_dspp));
  
        for (i = 0; i < MAX_CHANNELS_PER_ENC; i++)
                dpu_enc->hw_pp[i] = i < num_pp ? to_dpu_hw_pingpong(hw_pp[i])
  
                cstate->mixers[i].hw_lm = to_dpu_hw_mixer(hw_lm[i]);
                cstate->mixers[i].lm_ctl = to_dpu_hw_ctl(hw_ctl[ctl_idx]);
 +              cstate->mixers[i].hw_dspp = to_dpu_hw_dspp(hw_dspp[i]);
        }
  
        cstate->num_mixers = num_lm;
@@@ -165,7 -165,7 +165,7 @@@ static void mdp4_destroy(struct msm_km
  
        if (mdp4_kms->blank_cursor_iova)
                msm_gem_unpin_iova(mdp4_kms->blank_cursor_bo, kms->aspace);
-       drm_gem_object_put_unlocked(mdp4_kms->blank_cursor_bo);
+       drm_gem_object_put(mdp4_kms->blank_cursor_bo);
  
        if (aspace) {
                aspace->mmu->funcs->detach(aspace->mmu);
@@@ -510,20 -510,18 +510,20 @@@ struct msm_kms *mdp4_kms_init(struct dr
        mdelay(16);
  
        if (config->iommu) {
 -              aspace = msm_gem_address_space_create(&pdev->dev,
 -                              config->iommu, "mdp4");
 +              struct msm_mmu *mmu = msm_iommu_new(&pdev->dev,
 +                      config->iommu);
 +
 +              aspace  = msm_gem_address_space_create(mmu,
 +                      "mdp4", 0x1000, 0xffffffff);
 +
                if (IS_ERR(aspace)) {
 +                      if (!IS_ERR(mmu))
 +                              mmu->funcs->destroy(mmu);
                        ret = PTR_ERR(aspace);
                        goto fail;
                }
  
                kms->aspace = aspace;
 -
 -              ret = aspace->mmu->funcs->attach(aspace->mmu);
 -              if (ret)
 -                      goto fail;
        } else {
                DRM_DEV_INFO(dev->dev, "no iommu, fallback to phys "
                                "contig buffers for scanout\n");
@@@ -571,6 -569,10 +571,6 @@@ static struct mdp4_platform_config *mdp
        /* TODO: Chips that aren't apq8064 have a 200 Mhz max_clk */
        config.max_clk = 266667000;
        config.iommu = iommu_domain_alloc(&platform_bus_type);
 -      if (config.iommu) {
 -              config.iommu->geometry.aperture_start = 0x1000;
 -              config.iommu->geometry.aperture_end = 0xffffffff;
 -      }
  
        return &config;
  }
@@@ -166,7 -166,7 +166,7 @@@ static void unref_cursor_worker(struct 
        struct msm_kms *kms = &mdp5_kms->base.base;
  
        msm_gem_unpin_iova(val, kms->aspace);
-       drm_gem_object_put_unlocked(val);
+       drm_gem_object_put(val);
  }
  
  static void mdp5_crtc_destroy(struct drm_crtc *crtc)
@@@ -959,7 -959,7 +959,7 @@@ static int mdp5_crtc_cursor_set(struct 
        if (!ctl)
                return -EINVAL;
  
 -      /* don't support LM cursors when we we have source split enabled */
 +      /* don't support LM cursors when we have source split enabled */
        if (mdp5_cstate->pipeline.r_mixer)
                return -EINVAL;
  
@@@ -1030,7 -1030,7 +1030,7 @@@ static int mdp5_crtc_cursor_move(struc
                return -EINVAL;
        }
  
 -      /* don't support LM cursors when we we have source split enabled */
 +      /* don't support LM cursors when we have source split enabled */
        if (mdp5_cstate->pipeline.r_mixer)
                return -EINVAL;
  
   * - 1.4.0 - softpin, MSM_RELOC_BO_DUMP, and GEM_INFO support to set/get
   *           GEM object's debug name
   * - 1.5.0 - Add SUBMITQUERY_QUERY ioctl
 + * - 1.6.0 - Syncobj support
   */
  #define MSM_VERSION_MAJOR     1
 -#define MSM_VERSION_MINOR     5
 +#define MSM_VERSION_MINOR     6
  #define MSM_VERSION_PATCHLEVEL        0
  
  static const struct drm_mode_config_funcs mode_config_funcs = {
@@@ -758,7 -757,7 +758,7 @@@ static int msm_ioctl_gem_cpu_prep(struc
  
        ret = msm_gem_cpu_prep(obj, args->op, &timeout);
  
-       drm_gem_object_put_unlocked(obj);
+       drm_gem_object_put(obj);
  
        return ret;
  }
@@@ -776,7 -775,7 +776,7 @@@ static int msm_ioctl_gem_cpu_fini(struc
  
        ret = msm_gem_cpu_fini(obj);
  
-       drm_gem_object_put_unlocked(obj);
+       drm_gem_object_put(obj);
  
        return ret;
  }
@@@ -868,7 -867,7 +868,7 @@@ static int msm_ioctl_gem_info(struct dr
                break;
        }
  
-       drm_gem_object_put_unlocked(obj);
+       drm_gem_object_put(obj);
  
        return ret;
  }
@@@ -933,7 -932,7 +933,7 @@@ static int msm_ioctl_gem_madvise(struc
                ret = 0;
        }
  
-       drm_gem_object_put(obj);
+       drm_gem_object_put_locked(obj);
  
  unlock:
        mutex_unlock(&dev->struct_mutex);
@@@ -1003,8 -1002,7 +1003,8 @@@ static struct drm_driver msm_driver = 
        .driver_features    = DRIVER_GEM |
                                DRIVER_RENDER |
                                DRIVER_ATOMIC |
 -                              DRIVER_MODESET,
 +                              DRIVER_MODESET |
 +                              DRIVER_SYNCOBJ,
        .open               = msm_open,
        .postclose           = msm_postclose,
        .lastclose          = drm_fb_helper_lastclose,
@@@ -389,8 -389,7 +389,8 @@@ put_iova(struct drm_gem_object *obj
  }
  
  static int msm_gem_get_iova_locked(struct drm_gem_object *obj,
 -              struct msm_gem_address_space *aspace, uint64_t *iova)
 +              struct msm_gem_address_space *aspace, uint64_t *iova,
 +              u64 range_start, u64 range_end)
  {
        struct msm_gem_object *msm_obj = to_msm_bo(obj);
        struct msm_gem_vma *vma;
                if (IS_ERR(vma))
                        return PTR_ERR(vma);
  
 -              ret = msm_gem_init_vma(aspace, vma, obj->size >> PAGE_SHIFT);
 +              ret = msm_gem_init_vma(aspace, vma, obj->size >> PAGE_SHIFT,
 +                      range_start, range_end);
                if (ret) {
                        del_vma(vma);
                        return ret;
@@@ -428,9 -426,6 +428,9 @@@ static int msm_gem_pin_iova(struct drm_
        if (!(msm_obj->flags & MSM_BO_GPU_READONLY))
                prot |= IOMMU_WRITE;
  
 +      if (msm_obj->flags & MSM_BO_MAP_PRIV)
 +              prot |= IOMMU_PRIV;
 +
        WARN_ON(!mutex_is_locked(&msm_obj->lock));
  
        if (WARN_ON(msm_obj->madv != MSM_MADV_WILLNEED))
                        msm_obj->sgt, obj->size >> PAGE_SHIFT);
  }
  
 -/* get iova and pin it. Should have a matching put */
 -int msm_gem_get_and_pin_iova(struct drm_gem_object *obj,
 -              struct msm_gem_address_space *aspace, uint64_t *iova)
 +/*
 + * get iova and pin it. Should have a matching put
 + * limits iova to specified range (in pages)
 + */
 +int msm_gem_get_and_pin_iova_range(struct drm_gem_object *obj,
 +              struct msm_gem_address_space *aspace, uint64_t *iova,
 +              u64 range_start, u64 range_end)
  {
        struct msm_gem_object *msm_obj = to_msm_bo(obj);
        u64 local;
  
        mutex_lock(&msm_obj->lock);
  
 -      ret = msm_gem_get_iova_locked(obj, aspace, &local);
 +      ret = msm_gem_get_iova_locked(obj, aspace, &local,
 +              range_start, range_end);
  
        if (!ret)
                ret = msm_gem_pin_iova(obj, aspace);
        return ret;
  }
  
 +/* get iova and pin it. Should have a matching put */
 +int msm_gem_get_and_pin_iova(struct drm_gem_object *obj,
 +              struct msm_gem_address_space *aspace, uint64_t *iova)
 +{
 +      return msm_gem_get_and_pin_iova_range(obj, aspace, iova, 0, U64_MAX);
 +}
 +
  /*
   * Get an iova but don't pin it. Doesn't need a put because iovas are currently
   * valid for the life of the object
@@@ -493,7 -476,7 +493,7 @@@ int msm_gem_get_iova(struct drm_gem_obj
        int ret;
  
        mutex_lock(&msm_obj->lock);
 -      ret = msm_gem_get_iova_locked(obj, aspace, iova);
 +      ret = msm_gem_get_iova_locked(obj, aspace, iova, 0, U64_MAX);
        mutex_unlock(&msm_obj->lock);
  
        return ret;
@@@ -560,7 -543,7 +560,7 @@@ int msm_gem_dumb_map_offset(struct drm_
  
        *offset = msm_gem_mmap_offset(obj);
  
-       drm_gem_object_put_unlocked(obj);
+       drm_gem_object_put(obj);
  
  fail:
        return ret;
@@@ -571,6 -554,9 +571,9 @@@ static void *get_vaddr(struct drm_gem_o
        struct msm_gem_object *msm_obj = to_msm_bo(obj);
        int ret = 0;
  
+       if (obj->import_attach)
+               return ERR_PTR(-ENODEV);
        mutex_lock(&msm_obj->lock);
  
        if (WARN_ON(msm_obj->madv > madv)) {
@@@ -896,7 -882,7 +899,7 @@@ void msm_gem_describe_objects(struct li
  }
  #endif
  
- /* don't call directly!  Use drm_gem_object_put() and friends */
+ /* don't call directly!  Use drm_gem_object_put_locked() and friends */
  void msm_gem_free_object(struct drm_gem_object *obj)
  {
        struct msm_gem_object *msm_obj = to_msm_bo(obj);
@@@ -924,8 -910,7 +927,7 @@@ static void free_object(struct msm_gem_
        put_iova(obj);
  
        if (obj->import_attach) {
-               if (msm_obj->vaddr)
-                       dma_buf_vunmap(obj->import_attach->dmabuf, msm_obj->vaddr);
+               WARN_ON(msm_obj->vaddr);
  
                /* Don't drop the pages for imported dmabuf, as they are not
                 * ours, just free the array we allocated:
@@@ -987,7 -972,7 +989,7 @@@ int msm_gem_new_handle(struct drm_devic
        ret = drm_gem_handle_create(file, obj, handle);
  
        /* drop reference from allocate - handle holds it now */
-       drm_gem_object_put_unlocked(obj);
+       drm_gem_object_put(obj);
  
        return ret;
  }
@@@ -1106,7 -1091,7 +1108,7 @@@ static struct drm_gem_object *_msm_gem_
        return obj;
  
  fail:
-       drm_gem_object_put_unlocked(obj);
+       drm_gem_object_put(obj);
        return ERR_PTR(ret);
  }
  
@@@ -1166,7 -1151,7 +1168,7 @@@ struct drm_gem_object *msm_gem_import(s
        return obj;
  
  fail:
-       drm_gem_object_put_unlocked(obj);
+       drm_gem_object_put(obj);
        return ERR_PTR(ret);
  }
  
@@@ -1200,9 -1185,9 +1202,9 @@@ static void *_msm_gem_kernel_new(struc
        return vaddr;
  err:
        if (locked)
-               drm_gem_object_put(obj);
+               drm_gem_object_put_locked(obj);
        else
-               drm_gem_object_put_unlocked(obj);
+               drm_gem_object_put(obj);
  
        return ERR_PTR(ret);
  
@@@ -1232,9 -1217,9 +1234,9 @@@ void msm_gem_kernel_put(struct drm_gem_
        msm_gem_unpin_iova(bo, aspace);
  
        if (locked)
-               drm_gem_object_put(bo);
+               drm_gem_object_put_locked(bo);
        else
-               drm_gem_object_put_unlocked(bo);
+               drm_gem_object_put(bo);
  }
  
  void msm_gem_object_set_name(struct drm_gem_object *bo, const char *fmt, ...)
@@@ -8,9 -8,7 +8,9 @@@
  #include <linux/sync_file.h>
  #include <linux/uaccess.h>
  
 +#include <drm/drm_drv.h>
  #include <drm/drm_file.h>
 +#include <drm/drm_syncobj.h>
  
  #include "msm_drv.h"
  #include "msm_gpu.h"
@@@ -389,190 -387,10 +389,190 @@@ static void submit_cleanup(struct msm_g
                struct msm_gem_object *msm_obj = submit->bos[i].obj;
                submit_unlock_unpin_bo(submit, i, false);
                list_del_init(&msm_obj->submit_entry);
-               drm_gem_object_put(&msm_obj->base);
+               drm_gem_object_put_locked(&msm_obj->base);
        }
  }
  
 +
 +struct msm_submit_post_dep {
 +      struct drm_syncobj *syncobj;
 +      uint64_t point;
 +      struct dma_fence_chain *chain;
 +};
 +
 +static struct drm_syncobj **msm_wait_deps(struct drm_device *dev,
 +                                          struct drm_file *file,
 +                                          uint64_t in_syncobjs_addr,
 +                                          uint32_t nr_in_syncobjs,
 +                                          size_t syncobj_stride,
 +                                          struct msm_ringbuffer *ring)
 +{
 +      struct drm_syncobj **syncobjs = NULL;
 +      struct drm_msm_gem_submit_syncobj syncobj_desc = {0};
 +      int ret = 0;
 +      uint32_t i, j;
 +
 +      syncobjs = kcalloc(nr_in_syncobjs, sizeof(*syncobjs),
 +                         GFP_KERNEL | __GFP_NOWARN | __GFP_NORETRY);
 +      if (!syncobjs)
 +              return ERR_PTR(-ENOMEM);
 +
 +      for (i = 0; i < nr_in_syncobjs; ++i) {
 +              uint64_t address = in_syncobjs_addr + i * syncobj_stride;
 +              struct dma_fence *fence;
 +
 +              if (copy_from_user(&syncobj_desc,
 +                                 u64_to_user_ptr(address),
 +                                 min(syncobj_stride, sizeof(syncobj_desc)))) {
 +                      ret = -EFAULT;
 +                      break;
 +              }
 +
 +              if (syncobj_desc.point &&
 +                  !drm_core_check_feature(dev, DRIVER_SYNCOBJ_TIMELINE)) {
 +                      ret = -EOPNOTSUPP;
 +                      break;
 +              }
 +
 +              if (syncobj_desc.flags & ~MSM_SUBMIT_SYNCOBJ_FLAGS) {
 +                      ret = -EINVAL;
 +                      break;
 +              }
 +
 +              ret = drm_syncobj_find_fence(file, syncobj_desc.handle,
 +                                           syncobj_desc.point, 0, &fence);
 +              if (ret)
 +                      break;
 +
 +              if (!dma_fence_match_context(fence, ring->fctx->context))
 +                      ret = dma_fence_wait(fence, true);
 +
 +              dma_fence_put(fence);
 +              if (ret)
 +                      break;
 +
 +              if (syncobj_desc.flags & MSM_SUBMIT_SYNCOBJ_RESET) {
 +                      syncobjs[i] =
 +                              drm_syncobj_find(file, syncobj_desc.handle);
 +                      if (!syncobjs[i]) {
 +                              ret = -EINVAL;
 +                              break;
 +                      }
 +              }
 +      }
 +
 +      if (ret) {
 +              for (j = 0; j <= i; ++j) {
 +                      if (syncobjs[j])
 +                              drm_syncobj_put(syncobjs[j]);
 +              }
 +              kfree(syncobjs);
 +              return ERR_PTR(ret);
 +      }
 +      return syncobjs;
 +}
 +
 +static void msm_reset_syncobjs(struct drm_syncobj **syncobjs,
 +                               uint32_t nr_syncobjs)
 +{
 +      uint32_t i;
 +
 +      for (i = 0; syncobjs && i < nr_syncobjs; ++i) {
 +              if (syncobjs[i])
 +                      drm_syncobj_replace_fence(syncobjs[i], NULL);
 +      }
 +}
 +
 +static struct msm_submit_post_dep *msm_parse_post_deps(struct drm_device *dev,
 +                                                       struct drm_file *file,
 +                                                       uint64_t syncobjs_addr,
 +                                                       uint32_t nr_syncobjs,
 +                                                       size_t syncobj_stride)
 +{
 +      struct msm_submit_post_dep *post_deps;
 +      struct drm_msm_gem_submit_syncobj syncobj_desc = {0};
 +      int ret = 0;
 +      uint32_t i, j;
 +
 +      post_deps = kmalloc_array(nr_syncobjs, sizeof(*post_deps),
 +                                GFP_KERNEL | __GFP_NOWARN | __GFP_NORETRY);
 +      if (!post_deps)
 +              return ERR_PTR(-ENOMEM);
 +
 +      for (i = 0; i < nr_syncobjs; ++i) {
 +              uint64_t address = syncobjs_addr + i * syncobj_stride;
 +
 +              if (copy_from_user(&syncobj_desc,
 +                                 u64_to_user_ptr(address),
 +                                 min(syncobj_stride, sizeof(syncobj_desc)))) {
 +                      ret = -EFAULT;
 +                      break;
 +              }
 +
 +              post_deps[i].point = syncobj_desc.point;
 +              post_deps[i].chain = NULL;
 +
 +              if (syncobj_desc.flags) {
 +                      ret = -EINVAL;
 +                      break;
 +              }
 +
 +              if (syncobj_desc.point) {
 +                      if (!drm_core_check_feature(dev,
 +                                                  DRIVER_SYNCOBJ_TIMELINE)) {
 +                              ret = -EOPNOTSUPP;
 +                              break;
 +                      }
 +
 +                      post_deps[i].chain =
 +                              kmalloc(sizeof(*post_deps[i].chain),
 +                                      GFP_KERNEL);
 +                      if (!post_deps[i].chain) {
 +                              ret = -ENOMEM;
 +                              break;
 +                      }
 +              }
 +
 +              post_deps[i].syncobj =
 +                      drm_syncobj_find(file, syncobj_desc.handle);
 +              if (!post_deps[i].syncobj) {
 +                      ret = -EINVAL;
 +                      break;
 +              }
 +      }
 +
 +      if (ret) {
 +              for (j = 0; j <= i; ++j) {
 +                      kfree(post_deps[j].chain);
 +                      if (post_deps[j].syncobj)
 +                              drm_syncobj_put(post_deps[j].syncobj);
 +              }
 +
 +              kfree(post_deps);
 +              return ERR_PTR(ret);
 +      }
 +
 +      return post_deps;
 +}
 +
 +static void msm_process_post_deps(struct msm_submit_post_dep *post_deps,
 +                                  uint32_t count, struct dma_fence *fence)
 +{
 +      uint32_t i;
 +
 +      for (i = 0; post_deps && i < count; ++i) {
 +              if (post_deps[i].chain) {
 +                      drm_syncobj_add_point(post_deps[i].syncobj,
 +                                            post_deps[i].chain,
 +                                            fence, post_deps[i].point);
 +                      post_deps[i].chain = NULL;
 +              } else {
 +                      drm_syncobj_replace_fence(post_deps[i].syncobj,
 +                                                fence);
 +              }
 +      }
 +}
 +
  int msm_ioctl_gem_submit(struct drm_device *dev, void *data,
                struct drm_file *file)
  {
        struct sync_file *sync_file = NULL;
        struct msm_gpu_submitqueue *queue;
        struct msm_ringbuffer *ring;
 +      struct msm_submit_post_dep *post_deps = NULL;
 +      struct drm_syncobj **syncobjs_to_reset = NULL;
        int out_fence_fd = -1;
        struct pid *pid = get_pid(task_pid(current));
        bool has_ww_ticket = false;
        if (!gpu)
                return -ENXIO;
  
 +      if (args->pad)
 +              return -EINVAL;
 +
        /* for now, we just have 3d pipe.. eventually this would need to
         * be more clever to dispatch to appropriate gpu module:
         */
                        return ret;
        }
  
 +      if (args->flags & MSM_SUBMIT_SYNCOBJ_IN) {
 +              syncobjs_to_reset = msm_wait_deps(dev, file,
 +                                                args->in_syncobjs,
 +                                                args->nr_in_syncobjs,
 +                                                args->syncobj_stride, ring);
 +              if (IS_ERR(syncobjs_to_reset))
 +                      return PTR_ERR(syncobjs_to_reset);
 +      }
 +
 +      if (args->flags & MSM_SUBMIT_SYNCOBJ_OUT) {
 +              post_deps = msm_parse_post_deps(dev, file,
 +                                              args->out_syncobjs,
 +                                              args->nr_out_syncobjs,
 +                                              args->syncobj_stride);
 +              if (IS_ERR(post_deps)) {
 +                      ret = PTR_ERR(post_deps);
 +                      goto out_post_unlock;
 +              }
 +      }
 +
        ret = mutex_lock_interruptible(&dev->struct_mutex);
        if (ret)
 -              return ret;
 +              goto out_post_unlock;
  
        if (args->flags & MSM_SUBMIT_FENCE_FD_OUT) {
                out_fence_fd = get_unused_fd_flags(O_CLOEXEC);
                args->fence_fd = out_fence_fd;
        }
  
 +      msm_reset_syncobjs(syncobjs_to_reset, args->nr_in_syncobjs);
 +      msm_process_post_deps(post_deps, args->nr_out_syncobjs,
 +                            submit->fence);
 +
 +
  out:
        submit_cleanup(submit);
        if (has_ww_ticket)
@@@ -809,23 -597,5 +809,23 @@@ out_unlock
        if (ret && (out_fence_fd >= 0))
                put_unused_fd(out_fence_fd);
        mutex_unlock(&dev->struct_mutex);
 +
 +out_post_unlock:
 +      if (!IS_ERR_OR_NULL(post_deps)) {
 +              for (i = 0; i < args->nr_out_syncobjs; ++i) {
 +                      kfree(post_deps[i].chain);
 +                      drm_syncobj_put(post_deps[i].syncobj);
 +              }
 +              kfree(post_deps);
 +      }
 +
 +      if (!IS_ERR_OR_NULL(syncobjs_to_reset)) {
 +              for (i = 0; i < args->nr_in_syncobjs; ++i) {
 +                      if (syncobjs_to_reset[i])
 +                              drm_syncobj_put(syncobjs_to_reset[i]);
 +              }
 +              kfree(syncobjs_to_reset);
 +      }
 +
        return ret;
  }
@@@ -694,7 -694,7 +694,7 @@@ static void retire_submit(struct msm_gp
                /* move to inactive: */
                msm_gem_move_to_inactive(&msm_obj->base);
                msm_gem_unpin_iova(&msm_obj->base, submit->aspace);
-               drm_gem_object_put(&msm_obj->base);
+               drm_gem_object_put_locked(&msm_obj->base);
        }
  
        pm_runtime_mark_last_busy(&gpu->pdev->dev);
@@@ -821,6 -821,51 +821,6 @@@ static int get_clocks(struct platform_d
        return 0;
  }
  
 -static struct msm_gem_address_space *
 -msm_gpu_create_address_space(struct msm_gpu *gpu, struct platform_device *pdev,
 -              uint64_t va_start, uint64_t va_end)
 -{
 -      struct msm_gem_address_space *aspace;
 -      int ret;
 -
 -      /*
 -       * Setup IOMMU.. eventually we will (I think) do this once per context
 -       * and have separate page tables per context.  For now, to keep things
 -       * simple and to get something working, just use a single address space:
 -       */
 -      if (!adreno_is_a2xx(to_adreno_gpu(gpu))) {
 -              struct iommu_domain *iommu = iommu_domain_alloc(&platform_bus_type);
 -              if (!iommu)
 -                      return NULL;
 -
 -              iommu->geometry.aperture_start = va_start;
 -              iommu->geometry.aperture_end = va_end;
 -
 -              DRM_DEV_INFO(gpu->dev->dev, "%s: using IOMMU\n", gpu->name);
 -
 -              aspace = msm_gem_address_space_create(&pdev->dev, iommu, "gpu");
 -              if (IS_ERR(aspace))
 -                      iommu_domain_free(iommu);
 -      } else {
 -              aspace = msm_gem_address_space_create_a2xx(&pdev->dev, gpu, "gpu",
 -                      va_start, va_end);
 -      }
 -
 -      if (IS_ERR(aspace)) {
 -              DRM_DEV_ERROR(gpu->dev->dev, "failed to init mmu: %ld\n",
 -                      PTR_ERR(aspace));
 -              return ERR_CAST(aspace);
 -      }
 -
 -      ret = aspace->mmu->funcs->attach(aspace->mmu);
 -      if (ret) {
 -              msm_gem_address_space_put(aspace);
 -              return ERR_PTR(ret);
 -      }
 -
 -      return aspace;
 -}
 -
  int msm_gpu_init(struct drm_device *drm, struct platform_device *pdev,
                struct msm_gpu *gpu, const struct msm_gpu_funcs *funcs,
                const char *name, struct msm_gpu_config *config)
  
        msm_devfreq_init(gpu);
  
 -      gpu->aspace = msm_gpu_create_address_space(gpu, pdev,
 -              config->va_start, config->va_end);
 +
 +      gpu->aspace = gpu->funcs->create_address_space(gpu, pdev);
  
        if (gpu->aspace == NULL)
                DRM_DEV_INFO(drm->dev, "%s: no IOMMU, fallback to VRAM carveout!\n", name);
@@@ -605,16 -605,15 +605,16 @@@ static in
  nv_crtc_swap_fbs(struct drm_crtc *crtc, struct drm_framebuffer *old_fb)
  {
        struct nv04_display *disp = nv04_display(crtc->dev);
 -      struct nouveau_framebuffer *nvfb = nouveau_framebuffer(crtc->primary->fb);
 +      struct drm_framebuffer *fb = crtc->primary->fb;
 +      struct nouveau_bo *nvbo = nouveau_gem_object(fb->obj[0]);
        struct nouveau_crtc *nv_crtc = nouveau_crtc(crtc);
        int ret;
  
 -      ret = nouveau_bo_pin(nvfb->nvbo, TTM_PL_FLAG_VRAM, false);
 +      ret = nouveau_bo_pin(nvbo, TTM_PL_FLAG_VRAM, false);
        if (ret == 0) {
                if (disp->image[nv_crtc->index])
                        nouveau_bo_unpin(disp->image[nv_crtc->index]);
 -              nouveau_bo_ref(nvfb->nvbo, &disp->image[nv_crtc->index]);
 +              nouveau_bo_ref(nvbo, &disp->image[nv_crtc->index]);
        }
  
        return ret;
@@@ -823,8 -822,8 +823,8 @@@ nv04_crtc_do_mode_set_base(struct drm_c
        struct drm_device *dev = crtc->dev;
        struct nouveau_drm *drm = nouveau_drm(dev);
        struct nv04_crtc_reg *regp = &nv04_display(dev)->mode_reg.crtc_reg[nv_crtc->index];
 +      struct nouveau_bo *nvbo;
        struct drm_framebuffer *drm_fb;
 -      struct nouveau_framebuffer *fb;
        int arb_burst, arb_lwm;
  
        NV_DEBUG(drm, "index %d\n", nv_crtc->index);
         */
        if (atomic) {
                drm_fb = passed_fb;
 -              fb = nouveau_framebuffer(passed_fb);
        } else {
                drm_fb = crtc->primary->fb;
 -              fb = nouveau_framebuffer(crtc->primary->fb);
        }
  
 -      nv_crtc->fb.offset = fb->nvbo->bo.offset;
 +      nvbo = nouveau_gem_object(drm_fb->obj[0]);
 +      nv_crtc->fb.offset = nvbo->bo.offset;
  
        if (nv_crtc->lut.depth != drm_fb->format->depth) {
                nv_crtc->lut.depth = drm_fb->format->depth;
@@@ -1017,7 -1017,7 +1017,7 @@@ nv04_crtc_cursor_set(struct drm_crtc *c
        nv_crtc->cursor.set_offset(nv_crtc, nv_crtc->cursor.offset);
        nv_crtc->cursor.show(nv_crtc, true);
  out:
-       drm_gem_object_put_unlocked(gem);
+       drm_gem_object_put(gem);
        return ret;
  }
  
@@@ -1143,9 -1143,8 +1143,9 @@@ nv04_crtc_page_flip(struct drm_crtc *cr
        const int swap_interval = (flags & DRM_MODE_PAGE_FLIP_ASYNC) ? 0 : 1;
        struct drm_device *dev = crtc->dev;
        struct nouveau_drm *drm = nouveau_drm(dev);
 -      struct nouveau_bo *old_bo = nouveau_framebuffer(crtc->primary->fb)->nvbo;
 -      struct nouveau_bo *new_bo = nouveau_framebuffer(fb)->nvbo;
 +      struct drm_framebuffer *old_fb = crtc->primary->fb;
 +      struct nouveau_bo *old_bo = nouveau_gem_object(old_fb->obj[0]);
 +      struct nouveau_bo *new_bo = nouveau_gem_object(fb->obj[0]);
        struct nv04_page_flip_state *s;
        struct nouveau_channel *chan;
        struct nouveau_cli *cli;
@@@ -38,7 -38,6 +38,7 @@@
  #include "nouveau_reg.h"
  #include "nouveau_drv.h"
  #include "dispnv04/hw.h"
 +#include "dispnv50/disp.h"
  #include "nouveau_acpi.h"
  
  #include "nouveau_display.h"
@@@ -60,7 -59,6 +60,6 @@@ nouveau_conn_native_mode(struct drm_con
        int high_w = 0, high_h = 0, high_v = 0;
  
        list_for_each_entry(mode, &connector->probed_modes, head) {
-               mode->vrefresh = drm_mode_vrefresh(mode);
                if (helper->mode_valid(connector, mode) != MODE_OK ||
                    (mode->flags & DRM_MODE_FLAG_INTERLACE))
                        continue;
                        continue;
  
                if (mode->hdisplay == high_w && mode->vdisplay == high_h &&
-                   mode->vrefresh < high_v)
+                   drm_mode_vrefresh(mode) < high_v)
                        continue;
  
                high_w = mode->hdisplay;
                high_h = mode->vdisplay;
-               high_v = mode->vrefresh;
+               high_v = drm_mode_vrefresh(mode);
                largest = mode;
        }
  
@@@ -510,11 -508,7 +509,11 @@@ nouveau_connector_set_encoder(struct dr
        nv_connector->detected_encoder = nv_encoder;
  
        if (drm->client.device.info.family >= NV_DEVICE_INFO_V0_TESLA) {
 -              connector->interlace_allowed = true;
 +              if (nv_encoder->dcb->type == DCB_OUTPUT_DP)
 +                      connector->interlace_allowed =
 +                              nv_encoder->caps.dp_interlace;
 +              else
 +                      connector->interlace_allowed = true;
                connector->doublescan_allowed = true;
        } else
        if (nv_encoder->dcb->type == DCB_OUTPUT_LVDS ||
@@@ -1034,29 -1028,6 +1033,29 @@@ get_tmds_link_bandwidth(struct drm_conn
                return 112000 * duallink_scale;
  }
  
 +enum drm_mode_status
 +nouveau_conn_mode_clock_valid(const struct drm_display_mode *mode,
 +                            const unsigned min_clock,
 +                            const unsigned max_clock,
 +                            unsigned int *clock_out)
 +{
 +      unsigned int clock = mode->clock;
 +
 +      if ((mode->flags & DRM_MODE_FLAG_3D_MASK) ==
 +          DRM_MODE_FLAG_3D_FRAME_PACKING)
 +              clock *= 2;
 +
 +      if (clock < min_clock)
 +              return MODE_CLOCK_LOW;
 +      if (clock > max_clock)
 +              return MODE_CLOCK_HIGH;
 +
 +      if (clock_out)
 +              *clock_out = clock;
 +
 +      return MODE_OK;
 +}
 +
  static enum drm_mode_status
  nouveau_connector_mode_valid(struct drm_connector *connector,
                             struct drm_display_mode *mode)
        struct nouveau_encoder *nv_encoder = nv_connector->detected_encoder;
        struct drm_encoder *encoder = to_drm_encoder(nv_encoder);
        unsigned min_clock = 25000, max_clock = min_clock;
 -      unsigned clock = mode->clock;
  
        switch (nv_encoder->dcb->type) {
        case DCB_OUTPUT_LVDS:
        case DCB_OUTPUT_TV:
                return get_slave_funcs(encoder)->mode_valid(encoder, mode);
        case DCB_OUTPUT_DP:
 -              max_clock  = nv_encoder->dp.link_nr;
 -              max_clock *= nv_encoder->dp.link_bw;
 -              clock = clock * (connector->display_info.bpc * 3) / 10;
 -              break;
 +              return nv50_dp_mode_valid(connector, nv_encoder, mode, NULL);
        default:
                BUG();
                return MODE_BAD;
        }
  
 -      if ((mode->flags & DRM_MODE_FLAG_3D_MASK) == DRM_MODE_FLAG_3D_FRAME_PACKING)
 -              clock *= 2;
 -
 -      if (clock < min_clock)
 -              return MODE_CLOCK_LOW;
 -
 -      if (clock > max_clock)
 -              return MODE_CLOCK_HIGH;
 -
 -      return MODE_OK;
 +      return nouveau_conn_mode_clock_valid(mode, min_clock, max_clock,
 +                                           NULL);
  }
  
  static struct drm_encoder *
@@@ -31,7 -31,6 +31,7 @@@
  #include <drm/drm_crtc_helper.h>
  #include <drm/drm_fb_helper.h>
  #include <drm/drm_fourcc.h>
 +#include <drm/drm_gem_framebuffer_helper.h>
  #include <drm/drm_probe_helper.h>
  #include <drm/drm_vblank.h>
  
@@@ -180,164 -179,41 +180,164 @@@ nouveau_display_vblank_init(struct drm_
        return 0;
  }
  
 +static const struct drm_framebuffer_funcs nouveau_framebuffer_funcs = {
 +      .destroy = drm_gem_fb_destroy,
 +      .create_handle = drm_gem_fb_create_handle,
 +};
 +
  static void
 -nouveau_user_framebuffer_destroy(struct drm_framebuffer *drm_fb)
 +nouveau_decode_mod(struct nouveau_drm *drm,
 +                 uint64_t modifier,
 +                 uint32_t *tile_mode,
 +                 uint8_t *kind)
  {
 -      struct nouveau_framebuffer *fb = nouveau_framebuffer(drm_fb);
 +      BUG_ON(!tile_mode || !kind);
  
 -      if (fb->nvbo)
 -              drm_gem_object_put(&fb->nvbo->bo.base);
 +      if (modifier == DRM_FORMAT_MOD_LINEAR) {
 +              /* tile_mode will not be used in this case */
 +              *tile_mode = 0;
 +              *kind = 0;
 +      } else {
 +              /*
 +               * Extract the block height and kind from the corresponding
 +               * modifier fields.  See drm_fourcc.h for details.
 +               */
 +              *tile_mode = (uint32_t)(modifier & 0xF);
 +              *kind = (uint8_t)((modifier >> 12) & 0xFF);
 +
 +              if (drm->client.device.info.chipset >= 0xc0)
 +                      *tile_mode <<= 4;
 +      }
 +}
  
 -      drm_framebuffer_cleanup(drm_fb);
 -      kfree(fb);
 +void
 +nouveau_framebuffer_get_layout(struct drm_framebuffer *fb,
 +                             uint32_t *tile_mode,
 +                             uint8_t *kind)
 +{
 +      if (fb->flags & DRM_MODE_FB_MODIFIERS) {
 +              struct nouveau_drm *drm = nouveau_drm(fb->dev);
 +
 +              nouveau_decode_mod(drm, fb->modifier, tile_mode, kind);
 +      } else {
 +              const struct nouveau_bo *nvbo = nouveau_gem_object(fb->obj[0]);
 +
 +              *tile_mode = nvbo->mode;
 +              *kind = nvbo->kind;
 +      }
  }
  
  static int
 -nouveau_user_framebuffer_create_handle(struct drm_framebuffer *drm_fb,
 -                                     struct drm_file *file_priv,
 -                                     unsigned int *handle)
 +nouveau_validate_decode_mod(struct nouveau_drm *drm,
 +                          uint64_t modifier,
 +                          uint32_t *tile_mode,
 +                          uint8_t *kind)
 +{
 +      struct nouveau_display *disp = nouveau_display(drm->dev);
 +      int mod;
 +
 +      if (drm->client.device.info.family < NV_DEVICE_INFO_V0_TESLA) {
 +              return -EINVAL;
 +      }
 +
 +      BUG_ON(!disp->format_modifiers);
 +
 +      for (mod = 0;
 +           (disp->format_modifiers[mod] != DRM_FORMAT_MOD_INVALID) &&
 +           (disp->format_modifiers[mod] != modifier);
 +           mod++);
 +
 +      if (disp->format_modifiers[mod] == DRM_FORMAT_MOD_INVALID)
 +              return -EINVAL;
 +
 +      nouveau_decode_mod(drm, modifier, tile_mode, kind);
 +
 +      return 0;
 +}
 +
 +static inline uint32_t
 +nouveau_get_width_in_blocks(uint32_t stride)
  {
 -      struct nouveau_framebuffer *fb = nouveau_framebuffer(drm_fb);
 +      /* GOBs per block in the x direction is always one, and GOBs are
 +       * 64 bytes wide
 +       */
 +      static const uint32_t log_block_width = 6;
  
 -      return drm_gem_handle_create(file_priv, &fb->nvbo->bo.base, handle);
 +      return (stride + (1 << log_block_width) - 1) >> log_block_width;
  }
  
 -static const struct drm_framebuffer_funcs nouveau_framebuffer_funcs = {
 -      .destroy = nouveau_user_framebuffer_destroy,
 -      .create_handle = nouveau_user_framebuffer_create_handle,
 -};
 +static inline uint32_t
 +nouveau_get_height_in_blocks(struct nouveau_drm *drm,
 +                           uint32_t height,
 +                           uint32_t log_block_height_in_gobs)
 +{
 +      uint32_t log_gob_height;
 +      uint32_t log_block_height;
 +
 +      BUG_ON(drm->client.device.info.family < NV_DEVICE_INFO_V0_TESLA);
 +
 +      if (drm->client.device.info.family < NV_DEVICE_INFO_V0_FERMI)
 +              log_gob_height = 2;
 +      else
 +              log_gob_height = 3;
 +
 +      log_block_height = log_block_height_in_gobs + log_gob_height;
 +
 +      return (height + (1 << log_block_height) - 1) >> log_block_height;
 +}
 +
 +static int
 +nouveau_check_bl_size(struct nouveau_drm *drm, struct nouveau_bo *nvbo,
 +                    uint32_t offset, uint32_t stride, uint32_t h,
 +                    uint32_t tile_mode)
 +{
 +      uint32_t gob_size, bw, bh;
 +      uint64_t bl_size;
 +
 +      BUG_ON(drm->client.device.info.family < NV_DEVICE_INFO_V0_TESLA);
 +
 +      if (drm->client.device.info.chipset >= 0xc0) {
 +              if (tile_mode & 0xF)
 +                      return -EINVAL;
 +              tile_mode >>= 4;
 +      }
 +
 +      if (tile_mode & 0xFFFFFFF0)
 +              return -EINVAL;
 +
 +      if (drm->client.device.info.family < NV_DEVICE_INFO_V0_FERMI)
 +              gob_size = 256;
 +      else
 +              gob_size = 512;
 +
 +      bw = nouveau_get_width_in_blocks(stride);
 +      bh = nouveau_get_height_in_blocks(drm, h, tile_mode);
 +
 +      bl_size = bw * bh * (1 << tile_mode) * gob_size;
 +
 +      DRM_DEBUG_KMS("offset=%u stride=%u h=%u tile_mode=0x%02x bw=%u bh=%u gob_size=%u bl_size=%llu size=%lu\n",
 +                    offset, stride, h, tile_mode, bw, bh, gob_size, bl_size,
 +                    nvbo->bo.mem.size);
 +
 +      if (bl_size + offset > nvbo->bo.mem.size)
 +              return -ERANGE;
 +
 +      return 0;
 +}
  
  int
  nouveau_framebuffer_new(struct drm_device *dev,
                        const struct drm_mode_fb_cmd2 *mode_cmd,
 -                      struct nouveau_bo *nvbo,
 -                      struct nouveau_framebuffer **pfb)
 +                      struct drm_gem_object *gem,
 +                      struct drm_framebuffer **pfb)
  {
        struct nouveau_drm *drm = nouveau_drm(dev);
 -      struct nouveau_framebuffer *fb;
 +      struct nouveau_bo *nvbo = nouveau_gem_object(gem);
 +      struct drm_framebuffer *fb;
 +      const struct drm_format_info *info;
 +      unsigned int width, height, i;
 +      uint32_t tile_mode;
 +      uint8_t kind;
        int ret;
  
          /* YUV overlays have special requirements pre-NV50 */
                return -EINVAL;
        }
  
 +      if (mode_cmd->flags & DRM_MODE_FB_MODIFIERS) {
 +              if (nouveau_validate_decode_mod(drm, mode_cmd->modifier[0],
 +                                              &tile_mode, &kind)) {
 +                      DRM_DEBUG_KMS("Unsupported modifier: 0x%llx\n",
 +                                    mode_cmd->modifier[0]);
 +                      return -EINVAL;
 +              }
 +      } else {
 +              tile_mode = nvbo->mode;
 +              kind = nvbo->kind;
 +      }
 +
 +      info = drm_get_format_info(dev, mode_cmd);
 +
 +      for (i = 0; i < info->num_planes; i++) {
 +              width = drm_format_info_plane_width(info,
 +                                                  mode_cmd->width,
 +                                                  i);
 +              height = drm_format_info_plane_height(info,
 +                                                    mode_cmd->height,
 +                                                    i);
 +
 +              if (kind) {
 +                      ret = nouveau_check_bl_size(drm, nvbo,
 +                                                  mode_cmd->offsets[i],
 +                                                  mode_cmd->pitches[i],
 +                                                  height, tile_mode);
 +                      if (ret)
 +                              return ret;
 +              } else {
 +                      uint32_t size = mode_cmd->pitches[i] * height;
 +
 +                      if (size + mode_cmd->offsets[i] > nvbo->bo.mem.size)
 +                              return -ERANGE;
 +              }
 +      }
 +
        if (!(fb = *pfb = kzalloc(sizeof(*fb), GFP_KERNEL)))
                return -ENOMEM;
  
 -      drm_helper_mode_fill_fb_struct(dev, &fb->base, mode_cmd);
 -      fb->nvbo = nvbo;
 +      drm_helper_mode_fill_fb_struct(dev, fb, mode_cmd);
 +      fb->obj[0] = gem;
  
 -      ret = drm_framebuffer_init(dev, &fb->base, &nouveau_framebuffer_funcs);
 +      ret = drm_framebuffer_init(dev, fb, &nouveau_framebuffer_funcs);
        if (ret)
                kfree(fb);
        return ret;
@@@ -414,19 -253,21 +414,19 @@@ nouveau_user_framebuffer_create(struct 
                                struct drm_file *file_priv,
                                const struct drm_mode_fb_cmd2 *mode_cmd)
  {
 -      struct nouveau_framebuffer *fb;
 -      struct nouveau_bo *nvbo;
 +      struct drm_framebuffer *fb;
        struct drm_gem_object *gem;
        int ret;
  
        gem = drm_gem_object_lookup(file_priv, mode_cmd->handles[0]);
        if (!gem)
                return ERR_PTR(-ENOENT);
 -      nvbo = nouveau_gem_object(gem);
  
 -      ret = nouveau_framebuffer_new(dev, mode_cmd, nvbo, &fb);
 +      ret = nouveau_framebuffer_new(dev, mode_cmd, gem, &fb);
        if (ret == 0)
 -              return &fb->base;
 +              return fb;
  
-       drm_gem_object_put_unlocked(gem);
+       drm_gem_object_put(gem);
        return ERR_PTR(ret);
  }
  
@@@ -676,7 -517,6 +676,7 @@@ nouveau_display_create(struct drm_devic
  
        dev->mode_config.preferred_depth = 24;
        dev->mode_config.prefer_shadow = 1;
 +      dev->mode_config.allow_fb_modifiers = true;
  
        if (drm->client.device.info.chipset < 0x11)
                dev->mode_config.async_page_flip = false;
@@@ -808,7 -648,7 +808,7 @@@ nouveau_display_dumb_create(struct drm_
                return ret;
  
        ret = drm_gem_handle_create(file_priv, &bo->bo.base, &args->handle);
-       drm_gem_object_put_unlocked(&bo->bo.base);
+       drm_gem_object_put(&bo->bo.base);
        return ret;
  }
  
@@@ -823,7 -663,7 +823,7 @@@ nouveau_display_dumb_map_offset(struct 
        if (gem) {
                struct nouveau_bo *bo = nouveau_gem_object(gem);
                *poffset = drm_vma_node_offset_addr(&bo->bo.base.vma_node);
-               drm_gem_object_put_unlocked(gem);
+               drm_gem_object_put(gem);
                return 0;
        }
  
@@@ -76,10 -76,8 +76,10 @@@ nouveau_gem_object_open(struct drm_gem_
                return ret;
  
        ret = pm_runtime_get_sync(dev);
 -      if (ret < 0 && ret != -EACCES)
 +      if (ret < 0 && ret != -EACCES) {
 +              pm_runtime_put_autosuspend(dev);
                goto out;
 +      }
  
        ret = nouveau_vma_new(nvbo, vmm, &vma);
        pm_runtime_mark_last_busy(dev);
@@@ -159,8 -157,8 +159,8 @@@ nouveau_gem_object_close(struct drm_gem
                        if (!WARN_ON(ret < 0 && ret != -EACCES)) {
                                nouveau_gem_object_unmap(nvbo, vma);
                                pm_runtime_mark_last_busy(dev);
 -                              pm_runtime_put_autosuspend(dev);
                        }
 +                      pm_runtime_put_autosuspend(dev);
                }
        }
        ttm_bo_unreserve(&nvbo->bo);
@@@ -281,7 -279,7 +281,7 @@@ nouveau_gem_ioctl_new(struct drm_devic
        }
  
        /* drop reference from allocate - handle holds it now */
-       drm_gem_object_put_unlocked(&nvbo->bo.base);
+       drm_gem_object_put(&nvbo->bo.base);
        return ret;
  }
  
@@@ -360,7 -358,7 +360,7 @@@ validate_fini_no_ticket(struct validate
                list_del(&nvbo->entry);
                nvbo->reserved_by = NULL;
                ttm_bo_unreserve(&nvbo->bo);
-               drm_gem_object_put_unlocked(&nvbo->bo.base);
+               drm_gem_object_put(&nvbo->bo.base);
        }
  }
  
@@@ -407,14 -405,14 +407,14 @@@ retry
                nvbo = nouveau_gem_object(gem);
                if (nvbo == res_bo) {
                        res_bo = NULL;
-                       drm_gem_object_put_unlocked(gem);
+                       drm_gem_object_put(gem);
                        continue;
                }
  
                if (nvbo->reserved_by && nvbo->reserved_by == file_priv) {
                        NV_PRINTK(err, cli, "multiple instances of buffer %d on "
                                      "validation list\n", b->handle);
-                       drm_gem_object_put_unlocked(gem);
+                       drm_gem_object_put(gem);
                        ret = -EINVAL;
                        break;
                }
@@@ -931,7 -929,7 +931,7 @@@ nouveau_gem_ioctl_cpu_prep(struct drm_d
                ret = lret;
  
        nouveau_bo_sync_for_cpu(nvbo);
-       drm_gem_object_put_unlocked(gem);
+       drm_gem_object_put(gem);
  
        return ret;
  }
@@@ -950,7 -948,7 +950,7 @@@ nouveau_gem_ioctl_cpu_fini(struct drm_d
        nvbo = nouveau_gem_object(gem);
  
        nouveau_bo_sync_for_device(nvbo);
-       drm_gem_object_put_unlocked(gem);
+       drm_gem_object_put(gem);
        return 0;
  }
  
@@@ -967,7 -965,7 +967,7 @@@ nouveau_gem_ioctl_info(struct drm_devic
                return -ENOENT;
  
        ret = nouveau_gem_info(file_priv, gem, req);
-       drm_gem_object_put_unlocked(gem);
+       drm_gem_object_put(gem);
        return ret;
  }
  
@@@ -377,7 -377,7 +377,7 @@@ void qxl_io_destroy_primary(struct qxl_
  {
        wait_for_io_cmd(qdev, 0, QXL_IO_DESTROY_PRIMARY_ASYNC);
        qdev->primary_bo->is_primary = false;
-       drm_gem_object_put_unlocked(&qdev->primary_bo->tbo.base);
+       drm_gem_object_put(&qdev->primary_bo->tbo.base);
        qdev->primary_bo = NULL;
  }
  
@@@ -480,10 -480,9 +480,10 @@@ int qxl_hw_surface_alloc(struct qxl_dev
                return ret;
  
        ret = qxl_release_reserve_list(release, true);
 -      if (ret)
 +      if (ret) {
 +              qxl_release_free(qdev, release);
                return ret;
 -
 +      }
        cmd = (struct qxl_surface_cmd *)qxl_release_map(qdev, release);
        cmd->type = QXL_SURFACE_CMD_CREATE;
        cmd->flags = QXL_SURF_FLAG_KEEP_DATA;
        /* no need to add a release to the fence for this surface bo,
           since it is only released when we ask to destroy the surface
           and it would never signal otherwise */
 -      qxl_push_command_ring_release(qdev, release, QXL_CMD_SURFACE, false);
        qxl_release_fence_buffer_objects(release);
 +      qxl_push_command_ring_release(qdev, release, QXL_CMD_SURFACE, false);
  
        surf->hw_surf_alloc = true;
        spin_lock(&qdev->surf_id_idr_lock);
@@@ -543,8 -542,9 +543,8 @@@ int qxl_hw_surface_dealloc(struct qxl_d
        cmd->surface_id = id;
        qxl_release_unmap(qdev, release, &cmd->release_info);
  
 -      qxl_push_command_ring_release(qdev, release, QXL_CMD_SURFACE, false);
 -
        qxl_release_fence_buffer_objects(release);
 +      qxl_push_command_ring_release(qdev, release, QXL_CMD_SURFACE, false);
  
        return 0;
  }
@@@ -510,8 -510,8 +510,8 @@@ static int qxl_primary_apply_cursor(str
        cmd->u.set.visible = 1;
        qxl_release_unmap(qdev, release, &cmd->release_info);
  
 -      qxl_push_cursor_ring_release(qdev, release, QXL_CMD_CURSOR, false);
        qxl_release_fence_buffer_objects(release);
 +      qxl_push_cursor_ring_release(qdev, release, QXL_CMD_CURSOR, false);
  
        return ret;
  
@@@ -652,8 -652,8 +652,8 @@@ static void qxl_cursor_atomic_update(st
        cmd->u.position.y = plane->state->crtc_y + fb->hot_y;
  
        qxl_release_unmap(qdev, release, &cmd->release_info);
 -      qxl_push_cursor_ring_release(qdev, release, QXL_CMD_CURSOR, false);
        qxl_release_fence_buffer_objects(release);
 +      qxl_push_cursor_ring_release(qdev, release, QXL_CMD_CURSOR, false);
  
        if (old_cursor_bo != NULL)
                qxl_bo_unpin(old_cursor_bo);
@@@ -700,8 -700,8 +700,8 @@@ static void qxl_cursor_atomic_disable(s
        cmd->type = QXL_CURSOR_HIDE;
        qxl_release_unmap(qdev, release, &cmd->release_info);
  
 -      qxl_push_cursor_ring_release(qdev, release, QXL_CMD_CURSOR, false);
        qxl_release_fence_buffer_objects(release);
 +      qxl_push_cursor_ring_release(qdev, release, QXL_CMD_CURSOR, false);
  }
  
  static void qxl_update_dumb_head(struct qxl_device *qdev,
@@@ -783,7 -783,7 +783,7 @@@ static int qxl_plane_prepare_fb(struct 
                    qdev->dumb_shadow_bo->surf.width  != surf.width ||
                    qdev->dumb_shadow_bo->surf.height != surf.height) {
                        if (qdev->dumb_shadow_bo) {
-                               drm_gem_object_put_unlocked
+                               drm_gem_object_put
                                        (&qdev->dumb_shadow_bo->tbo.base);
                                qdev->dumb_shadow_bo = NULL;
                        }
                }
                if (user_bo->shadow != qdev->dumb_shadow_bo) {
                        if (user_bo->shadow) {
-                               drm_gem_object_put_unlocked
+                               drm_gem_object_put
                                        (&user_bo->shadow->tbo.base);
                                user_bo->shadow = NULL;
                        }
@@@ -828,7 -828,7 +828,7 @@@ static void qxl_plane_cleanup_fb(struc
        qxl_bo_unpin(user_bo);
  
        if (old_state->fb != plane->state->fb && user_bo->shadow) {
-               drm_gem_object_put_unlocked(&user_bo->shadow->tbo.base);
+               drm_gem_object_put(&user_bo->shadow->tbo.base);
                user_bo->shadow = NULL;
        }
  }
@@@ -125,7 -125,7 +125,7 @@@ static int qxlhw_handle_to_bo(struct dr
        qobj = gem_to_qxl_bo(gobj);
  
        ret = qxl_release_list_add(release, qobj);
-       drm_gem_object_put_unlocked(gobj);
+       drm_gem_object_put(gobj);
        if (ret)
                return ret;
  
@@@ -261,8 -261,11 +261,8 @@@ static int qxl_process_single_command(s
                        apply_surf_reloc(qdev, &reloc_info[i]);
        }
  
 +      qxl_release_fence_buffer_objects(release);
        ret = qxl_push_command_ring_release(qdev, release, cmd->type, true);
 -      if (ret)
 -              qxl_release_backoff_reserve_list(release);
 -      else
 -              qxl_release_fence_buffer_objects(release);
  
  out_free_bos:
  out_free_release:
@@@ -344,7 -347,7 +344,7 @@@ out2
        qxl_bo_unreserve(qobj);
  
  out:
-       drm_gem_object_put_unlocked(gobj);
+       drm_gem_object_put(gobj);
        return ret;
  }
  
@@@ -196,12 -196,12 +196,12 @@@ static int radeon_cs_parser_relocs(stru
                p->vm_bos = radeon_vm_get_bos(p->rdev, p->ib.vm,
                                              &p->validated);
        if (need_mmap_lock)
 -              down_read(&current->mm->mmap_sem);
 +              mmap_read_lock(current->mm);
  
        r = radeon_bo_list_validate(p->rdev, &p->ticket, &p->validated, p->ring);
  
        if (need_mmap_lock)
 -              up_read(&current->mm->mmap_sem);
 +              mmap_read_unlock(current->mm);
  
        return r;
  }
@@@ -443,7 -443,7 +443,7 @@@ static void radeon_cs_parser_fini(struc
                        if (bo == NULL)
                                continue;
  
-                       drm_gem_object_put_unlocked(&bo->tbo.base);
+                       drm_gem_object_put(&bo->tbo.base);
                }
        }
        kfree(parser->track);
@@@ -275,7 -275,7 +275,7 @@@ int radeon_gem_create_ioctl(struct drm_
        }
        r = drm_gem_handle_create(filp, gobj, &handle);
        /* drop reference from allocate - handle holds it now */
-       drm_gem_object_put_unlocked(gobj);
+       drm_gem_object_put(gobj);
        if (r) {
                up_read(&rdev->exclusive_lock);
                r = radeon_gem_handle_lockup(rdev, r);
@@@ -342,24 -342,24 +342,24 @@@ int radeon_gem_userptr_ioctl(struct drm
        }
  
        if (args->flags & RADEON_GEM_USERPTR_VALIDATE) {
 -              down_read(&current->mm->mmap_sem);
 +              mmap_read_lock(current->mm);
                r = radeon_bo_reserve(bo, true);
                if (r) {
 -                      up_read(&current->mm->mmap_sem);
 +                      mmap_read_unlock(current->mm);
                        goto release_object;
                }
  
                radeon_ttm_placement_from_domain(bo, RADEON_GEM_DOMAIN_GTT);
                r = ttm_bo_validate(&bo->tbo, &bo->placement, &ctx);
                radeon_bo_unreserve(bo);
 -              up_read(&current->mm->mmap_sem);
 +              mmap_read_unlock(current->mm);
                if (r)
                        goto release_object;
        }
  
        r = drm_gem_handle_create(filp, gobj, &handle);
        /* drop reference from allocate - handle holds it now */
-       drm_gem_object_put_unlocked(gobj);
+       drm_gem_object_put(gobj);
        if (r)
                goto handle_lockup;
  
        return 0;
  
  release_object:
-       drm_gem_object_put_unlocked(gobj);
+       drm_gem_object_put(gobj);
  
  handle_lockup:
        up_read(&rdev->exclusive_lock);
@@@ -402,7 -402,7 +402,7 @@@ int radeon_gem_set_domain_ioctl(struct 
  
        r = radeon_gem_set_domain(gobj, args->read_domains, args->write_domain);
  
-       drm_gem_object_put_unlocked(gobj);
+       drm_gem_object_put(gobj);
        up_read(&rdev->exclusive_lock);
        r = radeon_gem_handle_lockup(robj->rdev, r);
        return r;
@@@ -421,11 -421,11 +421,11 @@@ int radeon_mode_dumb_mmap(struct drm_fi
        }
        robj = gem_to_radeon_bo(gobj);
        if (radeon_ttm_tt_has_userptr(robj->tbo.ttm)) {
-               drm_gem_object_put_unlocked(gobj);
+               drm_gem_object_put(gobj);
                return -EPERM;
        }
        *offset_p = radeon_bo_mmap_offset(robj);
-       drm_gem_object_put_unlocked(gobj);
+       drm_gem_object_put(gobj);
        return 0;
  }
  
@@@ -460,7 -460,7 +460,7 @@@ int radeon_gem_busy_ioctl(struct drm_de
  
        cur_placement = READ_ONCE(robj->tbo.mem.mem_type);
        args->domain = radeon_mem_type_to_domain(cur_placement);
-       drm_gem_object_put_unlocked(gobj);
+       drm_gem_object_put(gobj);
        return r;
  }
  
@@@ -492,7 -492,7 +492,7 @@@ int radeon_gem_wait_idle_ioctl(struct d
        if (rdev->asic->mmio_hdp_flush &&
            radeon_mem_type_to_domain(cur_placement) == RADEON_GEM_DOMAIN_VRAM)
                robj->rdev->asic->mmio_hdp_flush(rdev);
-       drm_gem_object_put_unlocked(gobj);
+       drm_gem_object_put(gobj);
        r = radeon_gem_handle_lockup(rdev, r);
        return r;
  }
@@@ -511,7 -511,7 +511,7 @@@ int radeon_gem_set_tiling_ioctl(struct 
                return -ENOENT;
        robj = gem_to_radeon_bo(gobj);
        r = radeon_bo_set_tiling_flags(robj, args->tiling_flags, args->pitch);
-       drm_gem_object_put_unlocked(gobj);
+       drm_gem_object_put(gobj);
        return r;
  }
  
@@@ -534,7 -534,7 +534,7 @@@ int radeon_gem_get_tiling_ioctl(struct 
        radeon_bo_get_tiling_flags(rbo, &args->tiling_flags, &args->pitch);
        radeon_bo_unreserve(rbo);
  out:
-       drm_gem_object_put_unlocked(gobj);
+       drm_gem_object_put(gobj);
        return r;
  }
  
@@@ -668,14 -668,14 +668,14 @@@ int radeon_gem_va_ioctl(struct drm_devi
        r = radeon_bo_reserve(rbo, false);
        if (r) {
                args->operation = RADEON_VA_RESULT_ERROR;
-               drm_gem_object_put_unlocked(gobj);
+               drm_gem_object_put(gobj);
                return r;
        }
        bo_va = radeon_vm_bo_find(&fpriv->vm, rbo);
        if (!bo_va) {
                args->operation = RADEON_VA_RESULT_ERROR;
                radeon_bo_unreserve(rbo);
-               drm_gem_object_put_unlocked(gobj);
+               drm_gem_object_put(gobj);
                return -ENOENT;
        }
  
                args->operation = RADEON_VA_RESULT_ERROR;
        }
  out:
-       drm_gem_object_put_unlocked(gobj);
+       drm_gem_object_put(gobj);
        return r;
  }
  
@@@ -743,7 -743,7 +743,7 @@@ int radeon_gem_op_ioctl(struct drm_devi
  
        radeon_bo_unreserve(robj);
  out:
-       drm_gem_object_put_unlocked(gobj);
+       drm_gem_object_put(gobj);
        return r;
  }
  
@@@ -769,7 -769,7 +769,7 @@@ int radeon_mode_dumb_create(struct drm_
  
        r = drm_gem_handle_create(file_priv, gobj, &handle);
        /* drop reference from allocate - handle holds it now */
-       drm_gem_object_put_unlocked(gobj);
+       drm_gem_object_put(gobj);
        if (r) {
                return r;
        }
@@@ -328,7 -328,7 +328,7 @@@ int tegra_drm_submit(struct tegra_drm_c
  
  fail:
        while (num_refs--)
-               drm_gem_object_put_unlocked(refs[num_refs]);
+               drm_gem_object_put(refs[num_refs]);
  
        kfree(refs);
  
@@@ -368,7 -368,7 +368,7 @@@ static int tegra_gem_mmap(struct drm_de
  
        args->offset = drm_vma_node_offset_addr(&bo->gem.vma_node);
  
-       drm_gem_object_put_unlocked(gem);
+       drm_gem_object_put(gem);
  
        return 0;
  }
@@@ -636,7 -636,7 +636,7 @@@ static int tegra_gem_set_tiling(struct 
        bo->tiling.mode = mode;
        bo->tiling.value = value;
  
-       drm_gem_object_put_unlocked(gem);
+       drm_gem_object_put(gem);
  
        return 0;
  }
@@@ -676,7 -676,7 +676,7 @@@ static int tegra_gem_get_tiling(struct 
                break;
        }
  
-       drm_gem_object_put_unlocked(gem);
+       drm_gem_object_put(gem);
  
        return err;
  }
@@@ -701,7 -701,7 +701,7 @@@ static int tegra_gem_set_flags(struct d
        if (args->flags & DRM_TEGRA_GEM_BOTTOM_UP)
                bo->flags |= TEGRA_BO_BOTTOM_UP;
  
-       drm_gem_object_put_unlocked(gem);
+       drm_gem_object_put(gem);
  
        return 0;
  }
@@@ -723,7 -723,7 +723,7 @@@ static int tegra_gem_get_flags(struct d
        if (bo->flags & TEGRA_BO_BOTTOM_UP)
                args->flags |= DRM_TEGRA_GEM_BOTTOM_UP;
  
-       drm_gem_object_put_unlocked(gem);
+       drm_gem_object_put(gem);
  
        return 0;
  }
@@@ -1039,7 -1039,6 +1039,7 @@@ void tegra_drm_free(struct tegra_drm *t
  
  static bool host1x_drm_wants_iommu(struct host1x_device *dev)
  {
 +      struct host1x *host1x = dev_get_drvdata(dev->dev.parent);
        struct iommu_domain *domain;
  
        /*
         * sufficient and whether or not the host1x is attached to an IOMMU
         * doesn't matter.
         */
 -      if (!domain && dma_get_mask(dev->dev.parent) <= DMA_BIT_MASK(32))
 +      if (!domain && host1x_get_dma_mask(host1x) <= DMA_BIT_MASK(32))
                return true;
  
        return domain != NULL;
@@@ -39,9 -39,6 +39,9 @@@ static int virtio_gpu_gem_create(struc
        int ret;
        u32 handle;
  
 +      if (vgdev->has_virgl_3d)
 +              virtio_gpu_create_context(dev, file);
 +
        ret = virtio_gpu_object_create(vgdev, params, &obj, NULL);
        if (ret < 0)
                return ret;
@@@ -55,7 -52,7 +55,7 @@@
        *obj_p = &obj->base.base;
  
        /* drop reference from allocate - handle holds it now */
-       drm_gem_object_put_unlocked(&obj->base.base);
+       drm_gem_object_put(&obj->base.base);
  
        *handle_p = handle;
        return 0;
@@@ -105,7 -102,7 +105,7 @@@ int virtio_gpu_mode_dumb_mmap(struct dr
        if (gobj == NULL)
                return -ENOENT;
        *offset_p = drm_vma_node_offset_addr(&gobj->vma_node);
-       drm_gem_object_put_unlocked(gobj);
+       drm_gem_object_put(gobj);
        return 0;
  }
  
@@@ -240,7 -237,7 +240,7 @@@ void virtio_gpu_array_put_free(struct v
        u32 i;
  
        for (i = 0; i < objs->nents; i++)
-               drm_gem_object_put_unlocked(objs->objs[i]);
+               drm_gem_object_put(objs->objs[i]);
        virtio_gpu_array_free(objs);
  }
  
  
  #include <linux/file.h>
  #include <linux/sync_file.h>
 +#include <linux/uaccess.h>
  
  #include <drm/drm_file.h>
  #include <drm/virtgpu_drm.h>
  
  #include "virtgpu_drv.h"
  
 -static void virtio_gpu_create_context(struct drm_device *dev,
 -                                    struct drm_file *file)
 +void virtio_gpu_create_context(struct drm_device *dev, struct drm_file *file)
  {
        struct virtio_gpu_device *vgdev = dev->dev_private;
        struct virtio_gpu_fpriv *vfpriv = file->driver_priv;
@@@ -278,7 -278,7 +278,7 @@@ static int virtio_gpu_resource_create_i
                drm_gem_object_release(obj);
                return ret;
        }
-       drm_gem_object_put_unlocked(obj);
+       drm_gem_object_put(obj);
  
        rc->res_handle = qobj->hw_res_handle; /* similiar to a VM address */
        rc->bo_handle = handle;
@@@ -300,7 -300,7 +300,7 @@@ static int virtio_gpu_resource_info_ioc
  
        ri->size = qobj->base.base.size;
        ri->res_handle = qobj->hw_res_handle;
-       drm_gem_object_put_unlocked(gobj);
+       drm_gem_object_put(gobj);
        return 0;
  }
  
@@@ -417,7 -417,7 +417,7 @@@ static int virtio_gpu_wait_ioctl(struc
        else if (ret > 0)
                ret = 0;
  
-       drm_gem_object_put_unlocked(obj);
+       drm_gem_object_put(obj);
        return ret;
  }
  
@@@ -24,6 -24,7 +24,6 @@@
  #include <asm/io.h>
  #include <linux/uaccess.h>
  #include <asm/page.h>
 -#include <asm/pgtable.h>
  #include <asm/gio_device.h>
  
  #include <video/newport.h>
@@@ -31,6 -32,8 +31,8 @@@
  #include <linux/linux_logo.h>
  #include <linux/font.h>
  
+ #define NEWPORT_LEN   0x10000
  #define FONT_DATA ((unsigned char *)font_vga_8x16.data)
  
  /* borrowed from fbcon.c */
@@@ -42,6 -45,7 +44,7 @@@
  static unsigned char *font_data[MAX_NR_CONSOLES];
  
  static struct newport_regs *npregs;
+ static unsigned long newport_addr;
  
  static int logo_active;
  static int topscan;
@@@ -701,7 -705,6 +704,6 @@@ const struct consw newport_con = 
  static int newport_probe(struct gio_device *dev,
                         const struct gio_device_id *id)
  {
-       unsigned long newport_addr;
        int err;
  
        if (!dev->resource.start)
                return -EBUSY; /* we only support one Newport as console */
  
        newport_addr = dev->resource.start + 0xF0000;
-       if (!request_mem_region(newport_addr, 0x10000, "Newport"))
+       if (!request_mem_region(newport_addr, NEWPORT_LEN, "Newport"))
                return -ENODEV;
  
        npregs = (struct newport_regs *)/* ioremap cannot fail */
        console_lock();
        err = do_take_over_console(&newport_con, 0, MAX_NR_CONSOLES - 1, 1);
        console_unlock();
+       if (err) {
+               iounmap((void *)npregs);
+               release_mem_region(newport_addr, NEWPORT_LEN);
+       }
        return err;
  }
  
@@@ -726,6 -734,7 +733,7 @@@ static void newport_remove(struct gio_d
  {
        give_up_console(&newport_con);
        iounmap((void *)npregs);
+       release_mem_region(newport_addr, NEWPORT_LEN);
  }
  
  static struct gio_device_id newport_ids[] = {
diff --combined drivers/video/hdmi.c
@@@ -495,7 -495,7 +495,7 @@@ int hdmi_vendor_infoframe_init(struct h
         * value
         */
        frame->s3d_struct = HDMI_3D_STRUCTURE_INVALID;
-       frame->length = 4;
+       frame->length = HDMI_VENDOR_INFOFRAME_SIZE;
  
        return 0;
  }
@@@ -1768,21 -1768,20 +1768,21 @@@ hdmi_vendor_any_infoframe_unpack(union 
  }
  
  /**
 - * hdmi_drm_infoframe_unpack() - unpack binary buffer to a HDMI DRM infoframe
 + * hdmi_drm_infoframe_unpack_only() - unpack binary buffer of CTA-861-G DRM
 + *                                    infoframe DataBytes to a HDMI DRM
 + *                                    infoframe
   * @frame: HDMI DRM infoframe
   * @buffer: source buffer
   * @size: size of buffer
   *
 - * Unpacks the information contained in binary @buffer into a structured
 - * @frame of the HDMI Dynamic Range and Mastering (DRM) information frame.
 - * Also verifies the checksum as required by section 5.3.5 of the HDMI 1.4
 - * specification.
 + * Unpacks CTA-861-G DRM infoframe DataBytes contained in the binary @buffer
 + * into a structured @frame of the HDMI Dynamic Range and Mastering (DRM)
 + * infoframe.
   *
   * Returns 0 on success or a negative error code on failure.
   */
 -static int hdmi_drm_infoframe_unpack(struct hdmi_drm_infoframe *frame,
 -                                   const void *buffer, size_t size)
 +int hdmi_drm_infoframe_unpack_only(struct hdmi_drm_infoframe *frame,
 +                                 const void *buffer, size_t size)
  {
        const u8 *ptr = buffer;
        const u8 *temp;
        int ret;
        int i;
  
 -      if (size < HDMI_INFOFRAME_SIZE(DRM))
 -              return -EINVAL;
 -
 -      if (ptr[0] != HDMI_INFOFRAME_TYPE_DRM ||
 -          ptr[1] != 1 ||
 -          ptr[2] != HDMI_DRM_INFOFRAME_SIZE)
 -              return -EINVAL;
 -
 -      if (hdmi_infoframe_checksum(buffer, HDMI_INFOFRAME_SIZE(DRM)) != 0)
 +      if (size < HDMI_DRM_INFOFRAME_SIZE)
                return -EINVAL;
  
        ret = hdmi_drm_infoframe_init(frame);
        if (ret)
                return ret;
  
 -      ptr += HDMI_INFOFRAME_HEADER_SIZE;
 -
        frame->eotf = ptr[0] & 0x7;
        frame->metadata_type = ptr[1] & 0x7;
  
        for (i = 0; i < 3; i++) {
                x_lsb = *temp++;
                x_msb = *temp++;
 -              frame->display_primaries[i].x =  (x_msb << 8) | x_lsb;
 +              frame->display_primaries[i].x = (x_msb << 8) | x_lsb;
                y_lsb = *temp++;
                y_msb = *temp++;
                frame->display_primaries[i].y = (y_msb << 8) | y_lsb;
  
        return 0;
  }
 +EXPORT_SYMBOL(hdmi_drm_infoframe_unpack_only);
 +
 +/**
 + * hdmi_drm_infoframe_unpack() - unpack binary buffer to a HDMI DRM infoframe
 + * @frame: HDMI DRM infoframe
 + * @buffer: source buffer
 + * @size: size of buffer
 + *
 + * Unpacks the CTA-861-G DRM infoframe contained in the binary @buffer into
 + * a structured @frame of the HDMI Dynamic Range and Mastering (DRM)
 + * infoframe. It also verifies the checksum as required by section 5.3.5 of
 + * the HDMI 1.4 specification.
 + *
 + * Returns 0 on success or a negative error code on failure.
 + */
 +static int hdmi_drm_infoframe_unpack(struct hdmi_drm_infoframe *frame,
 +                                   const void *buffer, size_t size)
 +{
 +      const u8 *ptr = buffer;
 +      int ret;
 +
 +      if (size < HDMI_INFOFRAME_SIZE(DRM))
 +              return -EINVAL;
 +
 +      if (ptr[0] != HDMI_INFOFRAME_TYPE_DRM ||
 +          ptr[1] != 1 ||
 +          ptr[2] != HDMI_DRM_INFOFRAME_SIZE)
 +              return -EINVAL;
 +
 +      if (hdmi_infoframe_checksum(buffer, HDMI_INFOFRAME_SIZE(DRM)) != 0)
 +              return -EINVAL;
 +
 +      ret = hdmi_drm_infoframe_unpack_only(frame, ptr + HDMI_INFOFRAME_HEADER_SIZE,
 +                                           size - HDMI_INFOFRAME_HEADER_SIZE);
 +      return ret;
 +}
  
  /**
   * hdmi_infoframe_unpack() - unpack binary buffer to a HDMI infoframe
@@@ -1218,139 -1218,6 +1218,139 @@@ struct dp_sdp 
  #define EDP_VSC_PSR_UPDATE_RFB                (1<<1)
  #define EDP_VSC_PSR_CRC_VALUES_VALID  (1<<2)
  
 +/**
 + * enum dp_pixelformat - drm DP Pixel encoding formats
 + *
 + * This enum is used to indicate DP VSC SDP Pixel encoding formats.
 + * It is based on DP 1.4 spec [Table 2-117: VSC SDP Payload for DB16 through
 + * DB18]
 + *
 + * @DP_PIXELFORMAT_RGB: RGB pixel encoding format
 + * @DP_PIXELFORMAT_YUV444: YCbCr 4:4:4 pixel encoding format
 + * @DP_PIXELFORMAT_YUV422: YCbCr 4:2:2 pixel encoding format
 + * @DP_PIXELFORMAT_YUV420: YCbCr 4:2:0 pixel encoding format
 + * @DP_PIXELFORMAT_Y_ONLY: Y Only pixel encoding format
 + * @DP_PIXELFORMAT_RAW: RAW pixel encoding format
 + * @DP_PIXELFORMAT_RESERVED: Reserved pixel encoding format
 + */
 +enum dp_pixelformat {
 +      DP_PIXELFORMAT_RGB = 0,
 +      DP_PIXELFORMAT_YUV444 = 0x1,
 +      DP_PIXELFORMAT_YUV422 = 0x2,
 +      DP_PIXELFORMAT_YUV420 = 0x3,
 +      DP_PIXELFORMAT_Y_ONLY = 0x4,
 +      DP_PIXELFORMAT_RAW = 0x5,
 +      DP_PIXELFORMAT_RESERVED = 0x6,
 +};
 +
 +/**
 + * enum dp_colorimetry - drm DP Colorimetry formats
 + *
 + * This enum is used to indicate DP VSC SDP Colorimetry formats.
 + * It is based on DP 1.4 spec [Table 2-117: VSC SDP Payload for DB16 through
 + * DB18] and a name of enum member follows DRM_MODE_COLORIMETRY definition.
 + *
 + * @DP_COLORIMETRY_DEFAULT: sRGB (IEC 61966-2-1) or
 + *                          ITU-R BT.601 colorimetry format
 + * @DP_COLORIMETRY_RGB_WIDE_FIXED: RGB wide gamut fixed point colorimetry format
 + * @DP_COLORIMETRY_BT709_YCC: ITU-R BT.709 colorimetry format
 + * @DP_COLORIMETRY_RGB_WIDE_FLOAT: RGB wide gamut floating point
 + *                                 (scRGB (IEC 61966-2-2)) colorimetry format
 + * @DP_COLORIMETRY_XVYCC_601: xvYCC601 colorimetry format
 + * @DP_COLORIMETRY_OPRGB: OpRGB colorimetry format
 + * @DP_COLORIMETRY_XVYCC_709: xvYCC709 colorimetry format
 + * @DP_COLORIMETRY_DCI_P3_RGB: DCI-P3 (SMPTE RP 431-2) colorimetry format
 + * @DP_COLORIMETRY_SYCC_601: sYCC601 colorimetry format
 + * @DP_COLORIMETRY_RGB_CUSTOM: RGB Custom Color Profile colorimetry format
 + * @DP_COLORIMETRY_OPYCC_601: opYCC601 colorimetry format
 + * @DP_COLORIMETRY_BT2020_RGB: ITU-R BT.2020 R' G' B' colorimetry format
 + * @DP_COLORIMETRY_BT2020_CYCC: ITU-R BT.2020 Y'c C'bc C'rc colorimetry format
 + * @DP_COLORIMETRY_BT2020_YCC: ITU-R BT.2020 Y' C'b C'r colorimetry format
 + */
 +enum dp_colorimetry {
 +      DP_COLORIMETRY_DEFAULT = 0,
 +      DP_COLORIMETRY_RGB_WIDE_FIXED = 0x1,
 +      DP_COLORIMETRY_BT709_YCC = 0x1,
 +      DP_COLORIMETRY_RGB_WIDE_FLOAT = 0x2,
 +      DP_COLORIMETRY_XVYCC_601 = 0x2,
 +      DP_COLORIMETRY_OPRGB = 0x3,
 +      DP_COLORIMETRY_XVYCC_709 = 0x3,
 +      DP_COLORIMETRY_DCI_P3_RGB = 0x4,
 +      DP_COLORIMETRY_SYCC_601 = 0x4,
 +      DP_COLORIMETRY_RGB_CUSTOM = 0x5,
 +      DP_COLORIMETRY_OPYCC_601 = 0x5,
 +      DP_COLORIMETRY_BT2020_RGB = 0x6,
 +      DP_COLORIMETRY_BT2020_CYCC = 0x6,
 +      DP_COLORIMETRY_BT2020_YCC = 0x7,
 +};
 +
 +/**
 + * enum dp_dynamic_range - drm DP Dynamic Range
 + *
 + * This enum is used to indicate DP VSC SDP Dynamic Range.
 + * It is based on DP 1.4 spec [Table 2-117: VSC SDP Payload for DB16 through
 + * DB18]
 + *
 + * @DP_DYNAMIC_RANGE_VESA: VESA range
 + * @DP_DYNAMIC_RANGE_CTA: CTA range
 + */
 +enum dp_dynamic_range {
 +      DP_DYNAMIC_RANGE_VESA = 0,
 +      DP_DYNAMIC_RANGE_CTA = 1,
 +};
 +
 +/**
 + * enum dp_content_type - drm DP Content Type
 + *
 + * This enum is used to indicate DP VSC SDP Content Types.
 + * It is based on DP 1.4 spec [Table 2-117: VSC SDP Payload for DB16 through
 + * DB18]
 + * CTA-861-G defines content types and expected processing by a sink device
 + *
 + * @DP_CONTENT_TYPE_NOT_DEFINED: Not defined type
 + * @DP_CONTENT_TYPE_GRAPHICS: Graphics type
 + * @DP_CONTENT_TYPE_PHOTO: Photo type
 + * @DP_CONTENT_TYPE_VIDEO: Video type
 + * @DP_CONTENT_TYPE_GAME: Game type
 + */
 +enum dp_content_type {
 +      DP_CONTENT_TYPE_NOT_DEFINED = 0x00,
 +      DP_CONTENT_TYPE_GRAPHICS = 0x01,
 +      DP_CONTENT_TYPE_PHOTO = 0x02,
 +      DP_CONTENT_TYPE_VIDEO = 0x03,
 +      DP_CONTENT_TYPE_GAME = 0x04,
 +};
 +
 +/**
 + * struct drm_dp_vsc_sdp - drm DP VSC SDP
 + *
 + * This structure represents a DP VSC SDP of drm
 + * It is based on DP 1.4 spec [Table 2-116: VSC SDP Header Bytes] and
 + * [Table 2-117: VSC SDP Payload for DB16 through DB18]
 + *
 + * @sdp_type: secondary-data packet type
 + * @revision: revision number
 + * @length: number of valid data bytes
 + * @pixelformat: pixel encoding format
 + * @colorimetry: colorimetry format
 + * @bpc: bit per color
 + * @dynamic_range: dynamic range information
 + * @content_type: CTA-861-G defines content types and expected processing by a sink device
 + */
 +struct drm_dp_vsc_sdp {
 +      unsigned char sdp_type;
 +      unsigned char revision;
 +      unsigned char length;
 +      enum dp_pixelformat pixelformat;
 +      enum dp_colorimetry colorimetry;
 +      int bpc;
 +      enum dp_dynamic_range dynamic_range;
 +      enum dp_content_type content_type;
 +};
 +
 +void drm_dp_vsc_sdp_log(const char *level, struct device *dev,
 +                      const struct drm_dp_vsc_sdp *vsc);
 +
  int drm_dp_psr_setup_time(const u8 psr_cap[EDP_PSR_RECEIVER_CAP_SIZE]);
  
  static inline int
@@@ -1690,18 -1557,11 +1690,18 @@@ enum drm_dp_quirk 
         * capabilities advertised.
         */
        DP_QUIRK_FORCE_DPCD_BACKLIGHT,
 +      /**
 +       * @DP_DPCD_QUIRK_CAN_DO_MAX_LINK_RATE_3_24_GBPS:
 +       *
 +       * The device supports a link rate of 3.24 Gbps (multiplier 0xc) despite
 +       * the DP_MAX_LINK_RATE register reporting a lower max multiplier.
 +       */
 +      DP_DPCD_QUIRK_CAN_DO_MAX_LINK_RATE_3_24_GBPS,
  };
  
  /**
   * drm_dp_has_quirk() - does the DP device have a specific quirk
-  * @desc: Device decriptor filled by drm_dp_read_desc()
+  * @desc: Device descriptor filled by drm_dp_read_desc()
   * @edid_quirks: Optional quirk bitmask filled by drm_dp_get_edid_quirks()
   * @quirk: Quirk to query for
   *
diff --combined include/drm/drm_modes.h
@@@ -48,7 -48,7 +48,7 @@@ struct videomode
   * @MODE_HSYNC: hsync out of range
   * @MODE_VSYNC: vsync out of range
   * @MODE_H_ILLEGAL: mode has illegal horizontal timings
 - * @MODE_V_ILLEGAL: mode has illegal horizontal timings
 + * @MODE_V_ILLEGAL: mode has illegal vertical timings
   * @MODE_BAD_WIDTH: requires an unsupported linepitch
   * @MODE_NOMODE: no mode with a matching name
   * @MODE_NO_INTERLACE: interlaced mode not supported
@@@ -222,72 -222,22 +222,22 @@@ enum drm_mode_status 
   * For printing you can use %DRM_MODE_FMT and DRM_MODE_ARG().
   */
  struct drm_display_mode {
-       /**
-        * @head:
-        *
-        * struct list_head for mode lists.
-        */
-       struct list_head head;
-       /**
-        * @name:
-        *
-        * Human-readable name of the mode, filled out with drm_mode_set_name().
-        */
-       char name[DRM_DISPLAY_MODE_LEN];
-       /**
-        * @status:
-        *
-        * Status of the mode, used to filter out modes not supported by the
-        * hardware. See enum &drm_mode_status.
-        */
-       enum drm_mode_status status;
-       /**
-        * @type:
-        *
-        * A bitmask of flags, mostly about the source of a mode. Possible flags
-        * are:
-        *
-        *  - DRM_MODE_TYPE_PREFERRED: Preferred mode, usually the native
-        *    resolution of an LCD panel. There should only be one preferred
-        *    mode per connector at any given time.
-        *  - DRM_MODE_TYPE_DRIVER: Mode created by the driver, which is all of
-        *    them really. Drivers must set this bit for all modes they create
-        *    and expose to userspace.
-        *  - DRM_MODE_TYPE_USERDEF: Mode defined via kernel command line
-        *
-        * Plus a big list of flags which shouldn't be used at all, but are
-        * still around since these flags are also used in the userspace ABI.
-        * We no longer accept modes with these types though:
-        *
-        *  - DRM_MODE_TYPE_BUILTIN: Meant for hard-coded modes, unused.
-        *    Use DRM_MODE_TYPE_DRIVER instead.
-        *  - DRM_MODE_TYPE_DEFAULT: Again a leftover, use
-        *    DRM_MODE_TYPE_PREFERRED instead.
-        *  - DRM_MODE_TYPE_CLOCK_C and DRM_MODE_TYPE_CRTC_C: Define leftovers
-        *    which are stuck around for hysterical raisins only. No one has an
-        *    idea what they were meant for. Don't use.
-        */
-       unsigned int type;
        /**
         * @clock:
         *
         * Pixel clock in kHz.
         */
        int clock;              /* in kHz */
-       int hdisplay;
-       int hsync_start;
-       int hsync_end;
-       int htotal;
-       int hskew;
-       int vdisplay;
-       int vsync_start;
-       int vsync_end;
-       int vtotal;
-       int vscan;
+       u16 hdisplay;
+       u16 hsync_start;
+       u16 hsync_end;
+       u16 htotal;
+       u16 hskew;
+       u16 vdisplay;
+       u16 vsync_start;
+       u16 vsync_end;
+       u16 vtotal;
+       u16 vscan;
        /**
         * @flags:
         *
         *  - DRM_MODE_FLAG_3D_SIDE_BY_SIDE_HALF: frame split into left and
         *    right parts.
         */
-       unsigned int flags;
+       u32 flags;
+       /**
+        * @crtc_clock:
+        *
+        * Actual pixel or dot clock in the hardware. This differs from the
+        * logical @clock when e.g. using interlacing, double-clocking, stereo
+        * modes or other fancy stuff that changes the timings and signals
+        * actually sent over the wire.
+        *
+        * This is again in kHz.
+        *
+        * Note that with digital outputs like HDMI or DP there's usually a
+        * massive confusion between the dot clock and the signal clock at the
+        * bit encoding level. Especially when a 8b/10b encoding is used and the
+        * difference is exactly a factor of 10.
+        */
+       int crtc_clock;
+       u16 crtc_hdisplay;
+       u16 crtc_hblank_start;
+       u16 crtc_hblank_end;
+       u16 crtc_hsync_start;
+       u16 crtc_hsync_end;
+       u16 crtc_htotal;
+       u16 crtc_hskew;
+       u16 crtc_vdisplay;
+       u16 crtc_vblank_start;
+       u16 crtc_vblank_end;
+       u16 crtc_vsync_start;
+       u16 crtc_vsync_end;
+       u16 crtc_vtotal;
  
        /**
         * @width_mm:
         * Addressable size of the output in mm, projectors should set this to
         * 0.
         */
-       int width_mm;
+       u16 width_mm;
  
        /**
         * @height_mm:
         * Addressable size of the output in mm, projectors should set this to
         * 0.
         */
-       int height_mm;
+       u16 height_mm;
  
        /**
-        * @crtc_clock:
+        * @type:
         *
-        * Actual pixel or dot clock in the hardware. This differs from the
-        * logical @clock when e.g. using interlacing, double-clocking, stereo
-        * modes or other fancy stuff that changes the timings and signals
-        * actually sent over the wire.
+        * A bitmask of flags, mostly about the source of a mode. Possible flags
+        * are:
         *
-        * This is again in kHz.
+        *  - DRM_MODE_TYPE_PREFERRED: Preferred mode, usually the native
+        *    resolution of an LCD panel. There should only be one preferred
+        *    mode per connector at any given time.
+        *  - DRM_MODE_TYPE_DRIVER: Mode created by the driver, which is all of
+        *    them really. Drivers must set this bit for all modes they create
+        *    and expose to userspace.
+        *  - DRM_MODE_TYPE_USERDEF: Mode defined or selected via the kernel
+        *    command line.
         *
-        * Note that with digital outputs like HDMI or DP there's usually a
-        * massive confusion between the dot clock and the signal clock at the
-        * bit encoding level. Especially when a 8b/10b encoding is used and the
-        * difference is exactly a factor of 10.
+        * Plus a big list of flags which shouldn't be used at all, but are
+        * still around since these flags are also used in the userspace ABI.
+        * We no longer accept modes with these types though:
+        *
+        *  - DRM_MODE_TYPE_BUILTIN: Meant for hard-coded modes, unused.
+        *    Use DRM_MODE_TYPE_DRIVER instead.
+        *  - DRM_MODE_TYPE_DEFAULT: Again a leftover, use
+        *    DRM_MODE_TYPE_PREFERRED instead.
+        *  - DRM_MODE_TYPE_CLOCK_C and DRM_MODE_TYPE_CRTC_C: Define leftovers
+        *    which are stuck around for hysterical raisins only. No one has an
+        *    idea what they were meant for. Don't use.
         */
-       int crtc_clock;
-       int crtc_hdisplay;
-       int crtc_hblank_start;
-       int crtc_hblank_end;
-       int crtc_hsync_start;
-       int crtc_hsync_end;
-       int crtc_htotal;
-       int crtc_hskew;
-       int crtc_vdisplay;
-       int crtc_vblank_start;
-       int crtc_vblank_end;
-       int crtc_vsync_start;
-       int crtc_vsync_end;
-       int crtc_vtotal;
+       u8 type;
  
        /**
         * @private_flags:
        int private_flags;
  
        /**
-        * @vrefresh:
-        *
-        * Vertical refresh rate, for debug output in human readable form. Not
-        * used in a functional way.
-        *
-        * This value is in Hz.
-        */
-       int vrefresh;
-       /**
-        * @picture_aspect_ratio:
+        * @head:
         *
-        * Field for setting the HDMI picture aspect ratio of a mode.
+        * struct list_head for mode lists.
         */
-       enum hdmi_picture_aspect picture_aspect_ratio;
+       struct list_head head;
  
        /**
         * @export_head:
         * avoid overhead of protecting it by mode_config.mutex.
         */
        struct list_head export_head;
+       /**
+        * @name:
+        *
+        * Human-readable name of the mode, filled out with drm_mode_set_name().
+        */
+       char name[DRM_DISPLAY_MODE_LEN];
+       /**
+        * @status:
+        *
+        * Status of the mode, used to filter out modes not supported by the
+        * hardware. See enum &drm_mode_status.
+        */
+       enum drm_mode_status status;
+       /**
+        * @picture_aspect_ratio:
+        *
+        * Field for setting the HDMI picture aspect ratio of a mode.
+        */
+       enum hdmi_picture_aspect picture_aspect_ratio;
  };
  
  /**
   * @m: display mode
   */
  #define DRM_MODE_ARG(m) \
-       (m)->name, (m)->vrefresh, (m)->clock, \
+       (m)->name, drm_mode_vrefresh(m), (m)->clock, \
        (m)->hdisplay, (m)->hsync_start, (m)->hsync_end, (m)->htotal, \
        (m)->vdisplay, (m)->vsync_start, (m)->vsync_end, (m)->vtotal, \
        (m)->type, (m)->flags
diff --combined include/linux/hdmi.h
@@@ -57,6 -57,7 +57,7 @@@ enum hdmi_infoframe_type 
  #define HDMI_SPD_INFOFRAME_SIZE    25
  #define HDMI_AUDIO_INFOFRAME_SIZE  10
  #define HDMI_DRM_INFOFRAME_SIZE    26
+ #define HDMI_VENDOR_INFOFRAME_SIZE  4
  
  #define HDMI_INFOFRAME_SIZE(type)     \
        (HDMI_INFOFRAME_HEADER_SIZE + HDMI_ ## type ## _INFOFRAME_SIZE)
@@@ -219,8 -220,6 +220,8 @@@ ssize_t hdmi_drm_infoframe_pack(struct 
  ssize_t hdmi_drm_infoframe_pack_only(const struct hdmi_drm_infoframe *frame,
                                     void *buffer, size_t size);
  int hdmi_drm_infoframe_check(struct hdmi_drm_infoframe *frame);
 +int hdmi_drm_infoframe_unpack_only(struct hdmi_drm_infoframe *frame,
 +                                 const void *buffer, size_t size);
  
  enum hdmi_spd_sdi {
        HDMI_SPD_SDI_UNKNOWN,