Merge tag 'drm-misc-next-2020-02-10' of git://anongit.freedesktop.org/drm/drm-misc...
authorDave Airlie <airlied@redhat.com>
Thu, 20 Feb 2020 05:21:02 +0000 (15:21 +1000)
committerDave Airlie <airlied@redhat.com>
Thu, 20 Feb 2020 19:44:40 +0000 (05:44 +1000)
drm-misc-next for 5.7:

UAPI Changes:
  - lima: Add support for heap buffers

Cross-subsystem Changes:

Core Changes:
  - Implement mode_config mode_valid for memory constrained drivers
  - Bus format negociation between bridges
  - Consolidate fake vblank events for drivers without vblank interrupts
  - drm/bufs: dma_alloc related cleanups
  - drm/dp_mst: Various fixes
  - drm/print: New drm_device based print helpers
  - Thomas is a drm-misc maintainer now!

Driver Changes:
  - DPMS cleanups for atomic drivers
  - Removal of owner field in SPI tinydrm drivers
  - Removal of explicit dependency on DT for tinydrm drivers
  - Conversion to YAML schemas for DT bindings
  - tidss: New driver
  - virtio: various reworks and fixes
  - Our usual dozen or so new panels or bridges

Signed-off-by: Dave Airlie <airlied@redhat.com>
From: Maxime Ripard <maxime@cerno.tech>
Link: https://patchwork.freedesktop.org/patch/msgid/20200210093421.xu4sofldm6wm6xq6@gilmour.lan
22 files changed:
1  2 
Documentation/devicetree/bindings/vendor-prefixes.yaml
MAINTAINERS
drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
drivers/gpu/drm/drm_dp_helper.c
drivers/gpu/drm/drm_dp_mst_topology.c
drivers/gpu/drm/i915/display/icl_dsi.c
drivers/gpu/drm/i915/display/intel_display_types.h
drivers/gpu/drm/i915/display/intel_dp.c
drivers/gpu/drm/i915/display/vlv_dsi.c
drivers/gpu/drm/i915/i915_drv.c
drivers/gpu/drm/lima/lima_sched.c
drivers/gpu/drm/nouveau/nouveau_bo.c
drivers/gpu/drm/panfrost/panfrost_job.c
drivers/gpu/drm/panfrost/panfrost_mmu.c
drivers/gpu/drm/radeon/radeon_ttm.c
drivers/video/console/Kconfig
drivers/video/fbdev/hyperv_fb.c
drivers/video/fbdev/pxa168fb.c
drivers/video/fbdev/s1d13xxxfb.c
include/drm/drm_dp_helper.h
include/drm/drm_dp_mst_helper.h

@@@ -109,8 -109,6 +109,8 @@@ patternProperties
      description: Artesyn Embedded Technologies Inc.
    "^asahi-kasei,.*":
      description: Asahi Kasei Corp.
 +  "^asc,.*":
 +    description: All Sensors Corporation
    "^aspeed,.*":
      description: ASPEED Technology Inc.
    "^asus,.*":
      description: Bosch Sensortec GmbH
    "^boundary,.*":
      description: Boundary Devices Inc.
 +  "^broadmobi,.*":
 +    description: Shanghai Broadmobi Communication Technology Co.,Ltd.
    "^brcm,.*":
      description: Broadcom Corporation
    "^buffalo,.*":
      description: B&R Industrial Automation GmbH
    "^bticino,.*":
      description: Bticino International
 +  "^calaosystems,.*":
 +    description: CALAO Systems SAS
    "^calxeda,.*":
      description: Calxeda
    "^capella,.*":
      description: Fastrax Oy
    "^fcs,.*":
      description: Fairchild Semiconductor
+   "^feixin,.*":
+     description: Shenzhen Feixin Photoelectic Co., Ltd
    "^feiyang,.*":
      description: Shenzhen Fly Young Technology Co.,LTD.
    "^firefly,.*":
      description: Firefly
    "^focaltech,.*":
      description: FocalTech Systems Co.,Ltd
+   "^frida,.*":
+     description: Shenzhen Frida LCD Co., Ltd.
    "^friendlyarm,.*":
      description: Guangzhou FriendlyARM Computer Tech Co., Ltd
    "^fsl,.*":
      description: Shenzhen Jesurun Electronics Business Dept.
    "^jianda,.*":
      description: Jiandangjing Technology Co., Ltd.
 +  "^kam,.*":
 +    description: Kamstrup A/S
    "^karo,.*":
      description: Ka-Ro electronics GmbH
    "^keithkoep,.*":
      description: Linear Technology Corporation
    "^logicpd,.*":
      description: Logic PD, Inc.
+   "^logictechno,.*":
+     description: Logic Technologies Limited
    "^longcheer,.*":
      description: Longcheer Technology (Shanghai) Co., Ltd.
 +  "^loongson,.*":
 +    description: Loongson Technology Corporation Limited
    "^lsi,.*":
      description: LSI Corp. (LSI Logic)
    "^lwn,.*":
      description: Moxa Inc.
    "^mpl,.*":
      description: MPL AG
 +  "^mps,.*":
 +    description: Monolithic Power Systems Inc.
    "^mqmaker,.*":
      description: mqmaker Inc.
    "^mscc,.*":
      description: Panasonic Corporation
    "^parade,.*":
      description: Parade Technologies Inc.
 +  "^parallax,.*":
 +    description: Parallax Inc.
    "^pda,.*":
      description: Precision Design Associates, Inc.
    "^pericom,.*":
      description: Startek
    "^ste,.*":
      description: ST-Ericsson
 +    deprecated: true
    "^stericsson,.*":
      description: ST-Ericsson
 +  "^st-ericsson,.*":
 +    description: ST-Ericsson
 +    deprecated: true
    "^summit,.*":
      description: Summit microelectronics
    "^sunchip,.*":
      description: Variscite Ltd.
    "^via,.*":
      description: VIA Technologies, Inc.
 +  "^videostrong,.*":
 +    description: Videostrong Technology Co., Ltd.
    "^virtio,.*":
      description: Virtual I/O Device Specification, developed by the OASIS consortium
    "^vishay,.*":
      description: Xilinx
    "^xunlong,.*":
      description: Shenzhen Xunlong Software CO.,Limited
 +  "^xylon,.*":
 +    description: Xylon
 +  "^yna,.*":
 +    description: YSH & ATIL
    "^yones-toptech,.*":
      description: Yones Toptech Co., Ltd.
    "^ysoft,.*":
diff --combined MAINTAINERS
@@@ -317,45 -317,45 +317,45 @@@ ACP
  M:    "Rafael J. Wysocki" <rjw@rjwysocki.net>
  M:    Len Brown <lenb@kernel.org>
  L:    linux-acpi@vger.kernel.org
 +S:    Supported
  W:    https://01.org/linux-acpi
 -Q:    https://patchwork.kernel.org/project/linux-acpi/list/
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm
 +Q:    https://patchwork.kernel.org/project/linux-acpi/list/
  B:    https://bugzilla.kernel.org
 -S:    Supported
 +F:    Documentation/ABI/testing/configfs-acpi
 +F:    Documentation/ABI/testing/sysfs-bus-acpi
 +F:    Documentation/firmware-guide/acpi/
  F:    drivers/acpi/
 +F:    drivers/pci/*/*acpi*
 +F:    drivers/pci/*acpi*
  F:    drivers/pnp/pnpacpi/
 +F:    include/acpi/
  F:    include/linux/acpi.h
  F:    include/linux/fwnode.h
 -F:    include/acpi/
 -F:    Documentation/firmware-guide/acpi/
 -F:    Documentation/ABI/testing/sysfs-bus-acpi
 -F:    Documentation/ABI/testing/configfs-acpi
 -F:    drivers/pci/*acpi*
 -F:    drivers/pci/*/*acpi*
  F:    tools/power/acpi/
  
  ACPI APEI
  M:    "Rafael J. Wysocki" <rjw@rjwysocki.net>
  M:    Len Brown <lenb@kernel.org>
 -L:    linux-acpi@vger.kernel.org
  R:    James Morse <james.morse@arm.com>
  R:    Tony Luck <tony.luck@intel.com>
  R:    Borislav Petkov <bp@alien8.de>
 +L:    linux-acpi@vger.kernel.org
  F:    drivers/acpi/apei/
  
  ACPI COMPONENT ARCHITECTURE (ACPICA)
  M:    Robert Moore <robert.moore@intel.com>
 -M:    Erik Schmauss <erik.schmauss@intel.com>
 +M:    Erik Kaneda <erik.kaneda@intel.com>
  M:    "Rafael J. Wysocki" <rafael.j.wysocki@intel.com>
  L:    linux-acpi@vger.kernel.org
  L:    devel@acpica.org
 +S:    Supported
  W:    https://acpica.org/
  W:    https://github.com/acpica/acpica/
 -Q:    https://patchwork.kernel.org/project/linux-acpi/list/
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm
 +Q:    https://patchwork.kernel.org/project/linux-acpi/list/
  B:    https://bugzilla.kernel.org
  B:    https://bugs.acpica.org
 -S:    Supported
  F:    drivers/acpi/acpica/
  F:    include/acpi/
  F:    tools/power/acpi/
  ACPI FAN DRIVER
  M:    Zhang Rui <rui.zhang@intel.com>
  L:    linux-acpi@vger.kernel.org
 +S:    Supported
  W:    https://01.org/linux-acpi
  B:    https://bugzilla.kernel.org
 -S:    Supported
  F:    drivers/acpi/fan.c
  
  ACPI FOR ARM64 (ACPI/arm64)
@@@ -389,26 -389,26 +389,26 @@@ M:      Len Brown <lenb@kernel.org
  R:    Andy Shevchenko <andriy.shevchenko@linux.intel.com>
  R:    Mika Westerberg <mika.westerberg@linux.intel.com>
  L:    linux-acpi@vger.kernel.org
 -Q:    https://patchwork.kernel.org/project/linux-acpi/list/
 +S:    Supported
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm
 +Q:    https://patchwork.kernel.org/project/linux-acpi/list/
  B:    https://bugzilla.kernel.org
 -S:    Supported
  F:    drivers/acpi/pmic/
  
  ACPI THERMAL DRIVER
  M:    Zhang Rui <rui.zhang@intel.com>
  L:    linux-acpi@vger.kernel.org
 +S:    Supported
  W:    https://01.org/linux-acpi
  B:    https://bugzilla.kernel.org
 -S:    Supported
  F:    drivers/acpi/*thermal*
  
  ACPI VIDEO DRIVER
  M:    Zhang Rui <rui.zhang@intel.com>
  L:    linux-acpi@vger.kernel.org
 +S:    Supported
  W:    https://01.org/linux-acpi
  B:    https://bugzilla.kernel.org
 -S:    Supported
  F:    drivers/acpi/acpi_video.c
  
  ACPI WMI DRIVER
@@@ -674,14 -674,6 +674,14 @@@ S:       Maintaine
  F:    Documentation/i2c/busses/i2c-ali1563.rst
  F:    drivers/i2c/busses/i2c-ali1563.c
  
 +ALL SENSORS DLH SERIES PRESSURE SENSORS DRIVER
 +M:    Tomislav Denis <tomislav.denis@avl.com>
 +W:    http://www.allsensors.com/
 +S:    Maintained
 +L:    linux-iio@vger.kernel.org
 +F:    drivers/iio/pressure/dlhl60d.c
 +F:    Documentation/devicetree/bindings/iio/pressure/asc,dlhl60d.yaml
 +
  ALLEGRO DVT VIDEO IP CORE DRIVER
  M:    Michael Tretter <m.tretter@pengutronix.de>
  R:    Pengutronix Kernel Team <kernel@pengutronix.de>
@@@ -702,14 -694,6 +702,14 @@@ L:       linux-crypto@vger.kernel.or
  S:    Maintained
  F:    drivers/crypto/allwinner/
  
 +ALLWINNER THERMAL DRIVER
 +M:    Vasily Khoruzhick <anarsoul@gmail.com>
 +M:    Yangtao Li <tiny.windzz@gmail.com>
 +L:    linux-pm@vger.kernel.org
 +S:    Maintained
 +F:    Documentation/devicetree/bindings/thermal/allwinner,sun8i-a83t-ths.yaml
 +F:    drivers/thermal/sun8i_thermal.c
 +
  ALLWINNER VPU DRIVER
  M:    Maxime Ripard <mripard@kernel.org>
  M:    Paul Kocialkowski <paul.kocialkowski@bootlin.com>
@@@ -736,13 -720,13 +736,13 @@@ F:      Documentation/devicetree/bindings/i2
  F:    drivers/i2c/busses/i2c-altera.c
  
  ALTERA MAILBOX DRIVER
 -M:    Ley Foon Tan <lftan@altera.com>
 +M:    Ley Foon Tan <ley.foon.tan@intel.com>
  L:    nios2-dev@lists.rocketboards.org (moderated for non-subscribers)
  S:    Maintained
  F:    drivers/mailbox/mailbox-altera.c
  
  ALTERA PIO DRIVER
 -M:    Tien Hock Loh <thloh@altera.com>
 +M:    Joyce Ooi <joyce.ooi@intel.com>
  L:    linux-gpio@vger.kernel.org
  S:    Maintained
  F:    drivers/gpio/gpio-altera.c
@@@ -787,8 -771,6 +787,8 @@@ F: drivers/thermal/thermal_mmio.
  
  AMAZON ETHERNET DRIVERS
  M:    Netanel Belgazal <netanel@amazon.com>
 +M:    Arthur Kiyanovski <akiyano@amazon.com>
 +R:    Guy Tzalik <gtzalik@amazon.com>
  R:    Saeed Bishara <saeedb@amazon.com>
  R:    Zorik Machulsky <zorik@amazon.com>
  L:    netdev@vger.kernel.org
@@@ -807,6 -789,7 +807,6 @@@ F: include/uapi/rdma/efa-abi.
  
  AMD CRYPTOGRAPHIC COPROCESSOR (CCP) DRIVER
  M:    Tom Lendacky <thomas.lendacky@amd.com>
 -M:    Gary Hook <gary.hook@amd.com>
  L:    linux-crypto@vger.kernel.org
  S:    Supported
  F:    drivers/crypto/ccp/
@@@ -915,14 -898,6 +915,14 @@@ S:       Supporte
  F:    drivers/iio/dac/ad5758.c
  F:    Documentation/devicetree/bindings/iio/dac/ad5758.txt
  
 +ANALOG DEVICES INC AD7091R5 DRIVER
 +M:    Beniamin Bia <beniamin.bia@analog.com>
 +L:    linux-iio@vger.kernel.org
 +W:    http://ez.analog.com/community/linux-device-drivers
 +S:    Supported
 +F:    drivers/iio/adc/ad7091r5.c
 +F:    Documentation/devicetree/bindings/iio/adc/adi,ad7091r5.yaml
 +
  ANALOG DEVICES INC AD7124 DRIVER
  M:    Stefan Popa <stefan.popa@analog.com>
  L:    linux-iio@vger.kernel.org
@@@ -1000,15 -975,6 +1000,15 @@@ W:     http://ez.analog.com/community/linux
  F:    drivers/iio/imu/adis16460.c
  F:    Documentation/devicetree/bindings/iio/imu/adi,adis16460.yaml
  
 +ANALOG DEVICES INC ADM1177 DRIVER
 +M:    Beniamin Bia <beniamin.bia@analog.com>
 +M:    Michael Hennerich <Michael.Hennerich@analog.com>
 +L:    linux-hwmon@vger.kernel.org
 +W:    http://ez.analog.com/community/linux-device-drivers
 +S:    Supported
 +F:    drivers/hwmon/adm1177.c
 +F:    Documentation/devicetree/bindings/hwmon/adi,adm1177.yaml
 +
  ANALOG DEVICES INC ADP5061 DRIVER
  M:    Stefan Popa <stefan.popa@analog.com>
  L:    linux-pm@vger.kernel.org
@@@ -1077,7 -1043,7 +1077,7 @@@ S:      Supporte
  F:    Documentation/ABI/testing/sysfs-bus-iio-frequency-ad9523
  F:    Documentation/ABI/testing/sysfs-bus-iio-frequency-adf4350
  F:    drivers/iio/*/ad*
 -F:    drivers/iio/adc/ltc2497*
 +F:    drivers/iio/adc/ltc249*
  X:    drivers/iio/*/adjd*
  F:    drivers/staging/iio/*/ad*
  
@@@ -1439,7 -1405,7 +1439,7 @@@ T:      git git://git.kernel.org/pub/scm/lin
  
  ARM/ACTIONS SEMI ARCHITECTURE
  M:    Andreas Färber <afaerber@suse.de>
 -R:    Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
 +M:    Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
  S:    Maintained
  N:    owl
@@@ -2092,7 -2058,6 +2092,7 @@@ F:      drivers/rtc/rtc-pl031.
  F:    drivers/watchdog/coh901327_wdt.c
  F:    Documentation/devicetree/bindings/arm/ste-*
  F:    Documentation/devicetree/bindings/arm/ux500/
 +F:    Documentation/devicetree/bindings/arm/ux500.yaml
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/linusw/linux-nomadik.git
  
  ARM/NUVOTON NPCM ARCHITECTURE
@@@ -2275,7 -2240,6 +2275,7 @@@ L:      linux-rockchip@lists.infradead.or
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/mmind/linux-rockchip.git
  S:    Maintained
  F:    Documentation/devicetree/bindings/i2c/i2c-rk3x.txt
 +F:    Documentation/devicetree/bindings/mmc/rockchip-dw-mshc.yaml
  F:    arch/arm/boot/dts/rk3*
  F:    arch/arm/boot/dts/rv1108*
  F:    arch/arm/mach-rockchip/
@@@ -2308,7 -2272,6 +2308,7 @@@ F:      drivers/*/*s3c64xx
  F:    drivers/*/*s5pv210*
  F:    drivers/memory/samsung/
  F:    drivers/soc/samsung/
 +F:    drivers/tty/serial/samsung*
  F:    include/linux/soc/samsung/
  F:    Documentation/arm/samsung/
  F:    Documentation/devicetree/bindings/arm/samsung/
@@@ -2728,14 -2691,6 +2728,14 @@@ S:    Maintaine
  F:    drivers/pinctrl/aspeed/
  F:    Documentation/devicetree/bindings/pinctrl/aspeed,*
  
 +ASPEED SCU INTERRUPT CONTROLLER DRIVER
 +M:    Eddie James <eajames@linux.ibm.com>
 +L:    linux-aspeed@lists.ozlabs.org (moderated for non-subscribers)
 +S:    Maintained
 +F:    Documentation/devicetree/bindings/interrupt-controller/aspeed,ast2xxx-scu-ic.txt
 +F:    drivers/irqchip/irq-aspeed-scu-ic.c
 +F:    include/dt-bindings/interrupt-controller/aspeed-scu-ic.h
 +
  ASPEED VIDEO ENGINE DRIVER
  M:    Eddie James <eajames@linux.ibm.com>
  L:    linux-media@vger.kernel.org
@@@ -2796,11 -2751,11 +2796,11 @@@ F:   drivers/block/aoe
  
  ATHEROS 71XX/9XXX GPIO DRIVER
  M:    Alban Bedel <albeu@free.fr>
 +S:    Maintained
  W:    https://github.com/AlbanBedel/linux
  T:    git git://github.com/AlbanBedel/linux
 -S:    Maintained
 -F:    drivers/gpio/gpio-ath79.c
  F:    Documentation/devicetree/bindings/gpio/gpio-ath79.txt
 +F:    drivers/gpio/gpio-ath79.c
  
  ATHEROS 71XX/9XXX USB PHY DRIVER
  M:    Alban Bedel <albeu@free.fr>
@@@ -3133,13 -3088,6 +3133,13 @@@ S:    Supporte
  F:    drivers/net/bonding/
  F:    include/uapi/linux/if_bonding.h
  
 +BOSCH SENSORTEC BMA400 ACCELEROMETER IIO DRIVER
 +M:    Dan Robertson <dan@dlrobertson.com>
 +L:    linux-iio@vger.kernel.org
 +S:    Maintained
 +F:    drivers/iio/accel/bma400*
 +F:    Documentation/devicetree/bindings/iio/accel/bosch,bma400.yaml
 +
  BPF (Safe dynamic programs and tools)
  M:    Alexei Starovoitov <ast@kernel.org>
  M:    Daniel Borkmann <daniel@iogearbox.net>
@@@ -3199,7 -3147,7 +3199,7 @@@ S:      Maintaine
  F:    arch/mips/net/
  
  BPF JIT for NFP NICs
 -M:    Jakub Kicinski <jakub.kicinski@netronome.com>
 +M:    Jakub Kicinski <kuba@kernel.org>
  L:    netdev@vger.kernel.org
  L:    bpf@vger.kernel.org
  S:    Supported
@@@ -3289,8 -3237,6 +3289,8 @@@ S:      Maintaine
  N:    bcm2711
  N:    bcm2835
  F:    drivers/staging/vc04_services
 +F:    Documentation/devicetree/bindings/pci/brcm,stb-pcie.yaml
 +F:    drivers/pci/controller/pcie-brcmstb.c
  
  BROADCOM BCM47XX MIPS ARCHITECTURE
  M:    Hauke Mehrtens <hauke@hauke-m.de>
@@@ -3346,8 -3292,6 +3346,8 @@@ F:      drivers/bus/brcmstb_gisb.
  F:    arch/arm/mm/cache-b15-rac.c
  F:    arch/arm/include/asm/hardware/cache-b15-rac.h
  N:    brcmstb
 +F:    Documentation/devicetree/bindings/pci/brcm,stb-pcie.yaml
 +F:    drivers/pci/controller/pcie-brcmstb.c
  
  BROADCOM BMIPS CPUFREQ DRIVER
  M:    Markus Mayer <mmayer@broadcom.com>
@@@ -3422,8 -3366,8 +3422,8 @@@ BROADCOM BRCMSTB GPIO DRIVE
  M:    Gregory Fong <gregory.0xf0@gmail.com>
  L:    bcm-kernel-feedback-list@broadcom.com
  S:    Supported
 -F:    drivers/gpio/gpio-brcmstb.c
  F:    Documentation/devicetree/bindings/gpio/brcm,brcmstb-gpio.txt
 +F:    drivers/gpio/gpio-brcmstb.c
  
  BROADCOM BRCMSTB I2C DRIVER
  M:    Kamal Dasu <kdasu.kdev@gmail.com>
@@@ -3481,8 -3425,8 +3481,8 @@@ BROADCOM KONA GPIO DRIVE
  M:    Ray Jui <rjui@broadcom.com>
  L:    bcm-kernel-feedback-list@broadcom.com
  S:    Supported
 -F:    drivers/gpio/gpio-bcm-kona.c
  F:    Documentation/devicetree/bindings/gpio/brcm,kona-gpio.txt
 +F:    drivers/gpio/gpio-bcm-kona.c
  
  BROADCOM NETXTREME-E ROCE DRIVER
  M:    Selvin Xavier <selvin.xavier@broadcom.com>
@@@ -3597,8 -3541,8 +3597,8 @@@ F:      sound/pci/bt87x.
  
  BT8XXGPIO DRIVER
  M:    Michael Buesch <m@bues.ch>
 -W:    http://bu3sch.de/btgpio.php
  S:    Maintained
 +W:    http://bu3sch.de/btgpio.php
  F:    drivers/gpio/gpio-bt8xx.c
  
  BTRFS FILE SYSTEM
@@@ -4483,10 -4427,13 +4483,10 @@@ F:   drivers/net/wireless/st/cw1200
  
  CX18 VIDEO4LINUX DRIVER
  M:    Andy Walls <awalls@md.metrocast.net>
 -L:    ivtv-devel@ivtvdriver.org (subscribers-only)
  L:    linux-media@vger.kernel.org
  T:    git git://linuxtv.org/media_tree.git
  W:    https://linuxtv.org
 -W:    http://www.ivtvdriver.org/index.php/Cx18
  S:    Maintained
 -F:    Documentation/media/v4l-drivers/cx18*
  F:    drivers/media/pci/cx18/
  F:    include/uapi/linux/ivtv*
  
@@@ -4898,7 -4845,6 +4898,7 @@@ S:      Supporte
  F:    net/core/devlink.c
  F:    include/net/devlink.h
  F:    include/uapi/linux/devlink.h
 +F:    Documentation/networking/devlink
  
  DIALOG SEMICONDUCTOR DRIVERS
  M:    Support Opensource <support.opensource@diasemi.com>
@@@ -5072,7 -5018,7 +5072,7 @@@ F:      include/linux/dma-mapping.
  F:    include/linux/dma-noncoherent.h
  
  DMC FREQUENCY DRIVER FOR SAMSUNG EXYNOS5422
 -M:    Lukasz Luba <l.luba@partner.samsung.com>
 +M:    Lukasz Luba <lukasz.luba@arm.com>
  L:    linux-pm@vger.kernel.org
  L:    linux-samsung-soc@vger.kernel.org
  S:    Maintained
@@@ -5262,6 -5208,12 +5262,12 @@@ T:    git git://anongit.freedesktop.org/dr
  S:    Maintained
  F:    drivers/gpu/drm/tve200/
  
+ DRM DRIVER FOR FEIXIN K101 IM2BA02 MIPI-DSI LCD PANELS
+ M:    Icenowy Zheng <icenowy@aosc.io>
+ S:    Maintained
+ F:    drivers/gpu/drm/panel/panel-feixin-k101-im2ba02.c
+ F:    Documentation/devicetree/bindings/display/panel/feixin,k101-im2ba02.yaml
  DRM DRIVER FOR FEIYANG FY07024DI26A30-D MIPI-DSI LCD PANELS
  M:    Jagan Teki <jagan@amarulasolutions.com>
  S:    Maintained
@@@ -5281,6 -5233,13 +5287,13 @@@ S:    Maintaine
  F:    drivers/gpu/drm/tiny/ili9225.c
  F:    Documentation/devicetree/bindings/display/ilitek,ili9225.txt
  
+ DRM DRIVER FOR ILITEK ILI9486 PANELS
+ M:    Kamlesh Gurudasani <kamlesh.gurudasani@gmail.com>
+ T:    git git://anongit.freedesktop.org/drm/drm-misc
+ S:    Maintained
+ F:    drivers/gpu/drm/tiny/ili9486.c
+ F:    Documentation/devicetree/bindings/display/ilitek,ili9486.yaml
  DRM DRIVER FOR HX8357D PANELS
  M:    Eric Anholt <eric@anholt.net>
  T:    git git://anongit.freedesktop.org/drm/drm-misc
@@@ -5409,7 -5368,7 +5422,7 @@@ M:      David Lechner <david@lechnology.com
  T:    git git://anongit.freedesktop.org/drm/drm-misc
  S:    Maintained
  F:    drivers/gpu/drm/tiny/st7735r.c
- F:    Documentation/devicetree/bindings/display/sitronix,st7735r.txt
+ F:    Documentation/devicetree/bindings/display/sitronix,st7735r.yaml
  
  DRM DRIVER FOR SONY ACX424AKP PANELS
  M:    Linus Walleij <linus.walleij@linaro.org>
@@@ -5489,6 -5448,7 +5502,7 @@@ F:      include/linux/vga
  DRM DRIVERS AND MISC GPU PATCHES
  M:    Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
  M:    Maxime Ripard <mripard@kernel.org>
+ M:    Thomas Zimmermann <tzimmermann@suse.de>
  W:    https://01.org/linuxgraphics/gfx-docs/maintainer-tools/drm-misc.html
  S:    Maintained
  T:    git git://anongit.freedesktop.org/drm/drm-misc
@@@ -5568,7 -5528,6 +5582,6 @@@ S:      Supporte
  F:    drivers/gpu/drm/fsl-dcu/
  F:    Documentation/devicetree/bindings/display/fsl,dcu.txt
  F:    Documentation/devicetree/bindings/display/fsl,tcon.txt
- F:    Documentation/devicetree/bindings/display/panel/nec,nl4827hc19-05b.txt
  T:    git git://anongit.freedesktop.org/drm/drm-misc
  
  DRM DRIVERS FOR FREESCALE IMX
@@@ -5684,6 -5643,17 +5697,17 @@@ S:    Maintaine
  F:    drivers/gpu/drm/omapdrm/
  F:    Documentation/devicetree/bindings/display/ti/
  
+ DRM DRIVERS FOR TI KEYSTONE
+ M:    Jyri Sarha <jsarha@ti.com>
+ M:    Tomi Valkeinen <tomi.valkeinen@ti.com>
+ L:    dri-devel@lists.freedesktop.org
+ S:    Maintained
+ F:    drivers/gpu/drm/tidss/
+ F:    Documentation/devicetree/bindings/display/ti/ti,k2g-dss.yaml
+ F:    Documentation/devicetree/bindings/display/ti/ti,am65x-dss.yaml
+ F:    Documentation/devicetree/bindings/display/ti/ti,j721e-dss.yaml
+ T:    git git://anongit.freedesktop.org/drm/drm-misc
  DRM DRIVERS FOR V3D
  M:    Eric Anholt <eric@anholt.net>
  S:    Supported
@@@ -6109,7 -6079,6 +6133,7 @@@ 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>
@@@ -6235,12 -6204,6 +6259,12 @@@ M:    Maxim Levitsky <maximlevitsky@gmail.
  S:    Maintained
  F:    drivers/media/rc/ene_ir.*
  
 +EPAPR HYPERVISOR BYTE CHANNEL DEVICE DRIVER
 +M:    Laurentiu Tudor <laurentiu.tudor@nxp.com>
 +L:    linuxppc-dev@lists.ozlabs.org
 +S:    Maintained
 +F:    drivers/tty/ehv_bytechan.c
 +
  EPSON S1D13XXX FRAMEBUFFER DRIVER
  M:    Kristoffer Ericson <kristoffer.ericson@gmail.com>
  S:    Maintained
@@@ -6283,7 -6246,6 +6307,7 @@@ ETHERNET PHY LIBRAR
  M:    Andrew Lunn <andrew@lunn.ch>
  M:    Florian Fainelli <f.fainelli@gmail.com>
  M:    Heiner Kallweit <hkallweit1@gmail.com>
 +R:    Russell King <linux@armlinux.org.uk>
  L:    netdev@vger.kernel.org
  S:    Maintained
  F:    Documentation/ABI/testing/sysfs-class-net-phydev
@@@ -6489,7 -6451,6 +6513,7 @@@ F:      fs/
  F:    include/linux/fs.h
  F:    include/linux/fs_types.h
  F:    include/uapi/linux/fs.h
 +F:    include/uapi/linux/openat2.h
  
  FINTEK F75375S HARDWARE MONITOR AND FAN CONTROLLER DRIVER
  M:    Riku Voipio <riku.voipio@iki.fi>
@@@ -6908,7 -6869,7 +6932,7 @@@ T:      git git://git.kernel.org/pub/scm/lin
  S:    Maintained
  F:    fs/fuse/
  F:    include/uapi/linux/fuse.h
 -F:    Documentation/filesystems/fuse.txt
 +F:    Documentation/filesystems/fuse.rst
  
  FUTEX SUBSYSTEM
  M:    Thomas Gleixner <tglx@linutronix.de>
@@@ -7124,7 -7085,6 +7148,7 @@@ L:      linux-acpi@vger.kernel.or
  S:    Maintained
  F:    Documentation/firmware-guide/acpi/gpio-properties.rst
  F:    drivers/gpio/gpiolib-acpi.c
 +F:    drivers/gpio/gpiolib-acpi.h
  
  GPIO IR Transmitter
  M:    Sean Young <sean@mess.org>
@@@ -7143,18 -7103,18 +7167,18 @@@ GPIO SUBSYSTE
  M:    Linus Walleij <linus.walleij@linaro.org>
  M:    Bartosz Golaszewski <bgolaszewski@baylibre.com>
  L:    linux-gpio@vger.kernel.org
 -T:    git git://git.kernel.org/pub/scm/linux/kernel/git/linusw/linux-gpio.git
  S:    Maintained
 +T:    git git://git.kernel.org/pub/scm/linux/kernel/git/linusw/linux-gpio.git
 +F:    Documentation/ABI/obsolete/sysfs-gpio
 +F:    Documentation/ABI/testing/gpio-cdev
 +F:    Documentation/admin-guide/gpio/
  F:    Documentation/devicetree/bindings/gpio/
  F:    Documentation/driver-api/gpio/
 -F:    Documentation/admin-guide/gpio/
 -F:    Documentation/ABI/testing/gpio-cdev
 -F:    Documentation/ABI/obsolete/sysfs-gpio
  F:    drivers/gpio/
 +F:    include/asm-generic/gpio.h
  F:    include/linux/gpio/
  F:    include/linux/gpio.h
  F:    include/linux/of_gpio.h
 -F:    include/asm-generic/gpio.h
  F:    include/uapi/linux/gpio.h
  F:    tools/gpio/
  
@@@ -7383,7 -7343,6 +7407,7 @@@ F:      drivers/hwtracing
  HARDWARE SPINLOCK CORE
  M:    Ohad Ben-Cohen <ohad@wizery.com>
  M:    Bjorn Andersson <bjorn.andersson@linaro.org>
 +R:    Baolin Wang <baolin.wang7@gmail.com>
  L:    linux-remoteproc@vger.kernel.org
  S:    Maintained
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/andersson/remoteproc.git hwspinlock-next
@@@ -7587,12 -7546,6 +7611,12 @@@ S:    Supporte
  F:    drivers/scsi/hisi_sas/
  F:    Documentation/devicetree/bindings/scsi/hisilicon-sas.txt
  
 +HISILICON V3XX SPI NOR FLASH Controller Driver
 +M:    John Garry <john.garry@huawei.com>
 +W:    http://www.hisilicon.com
 +S:    Maintained
 +F:    drivers/spi/spi-hisi-sfc-v3xx.c
 +
  HISILICON QM AND ZIP Controller DRIVER
  M:    Zhou Wang <wangzhou1@hisilicon.com>
  L:    linux-crypto@vger.kernel.org
@@@ -7663,8 -7616,9 +7687,8 @@@ S:      Orpha
  F:    drivers/net/usb/hso.c
  
  HSR NETWORK PROTOCOL
 -M:    Arvid Brodin <arvid.brodin@alten.se>
  L:    netdev@vger.kernel.org
 -S:    Maintained
 +S:    Orphan
  F:    net/hsr/
  
  HT16K33 LED CONTROLLER DRIVER
@@@ -7819,7 -7773,9 +7843,7 @@@ M:      Jean Delvare <jdelvare@suse.com
  L:    linux-i2c@vger.kernel.org
  S:    Maintained
  F:    Documentation/i2c/busses/i2c-parport.rst
 -F:    Documentation/i2c/busses/i2c-parport-light.rst
  F:    drivers/i2c/busses/i2c-parport.c
 -F:    drivers/i2c/busses/i2c-parport-light.c
  
  I2C SUBSYSTEM
  M:    Wolfram Sang <wsa@the-dreams.de>
@@@ -7933,10 -7889,10 +7957,10 @@@ F:   Documentation/devicetree/bindings/i3
  F:    drivers/i3c/master/dw*
  
  I3C DRIVER FOR CADENCE I3C MASTER IP
 -M:      Przemysław Gaj <pgaj@cadence.com>
 -S:      Maintained
 -F:      Documentation/devicetree/bindings/i3c/cdns,i3c-master.txt
 -F:      drivers/i3c/master/i3c-master-cdns.c
 +M:    Przemysław Gaj <pgaj@cadence.com>
 +S:    Maintained
 +F:    Documentation/devicetree/bindings/i3c/cdns,i3c-master.txt
 +F:    drivers/i3c/master/i3c-master-cdns.c
  
  IA64 (Itanium) PLATFORM
  M:    Tony Luck <tony.luck@intel.com>
@@@ -8055,8 -8011,8 +8079,8 @@@ F:      drivers/scsi/ips.
  ICH LPC AND GPIO DRIVER
  M:    Peter Tyser <ptyser@xes-inc.com>
  S:    Maintained
 -F:    drivers/mfd/lpc_ich.c
  F:    drivers/gpio/gpio-ich.c
 +F:    drivers/mfd/lpc_ich.c
  
  ICY I2C DRIVER
  M:    Max Staudt <max@enpas.org>
@@@ -8200,7 -8156,8 +8224,7 @@@ F:      Documentation/devicetree/bindings/au
  F:    drivers/auxdisplay/img-ascii-lcd.c
  
  IMGTEC IR DECODER DRIVER
 -M:    James Hogan <jhogan@kernel.org>
 -S:    Maintained
 +S:    Orphan
  F:    drivers/media/rc/img-ir/
  
  IMON SOUNDGRAPH USB IR RECEIVER
@@@ -8441,6 -8398,7 +8465,6 @@@ S:      Maintaine
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/andy/linux-gpio-intel.git
  F:    drivers/gpio/gpio-ich.c
  F:    drivers/gpio/gpio-intel-mid.c
 -F:    drivers/gpio/gpio-lynxpoint.c
  F:    drivers/gpio/gpio-merrifield.c
  F:    drivers/gpio/gpio-ml-ioh.c
  F:    drivers/gpio/gpio-pch.c
@@@ -8471,14 -8429,6 +8495,14 @@@ Q:    https://patchwork.kernel.org/project
  S:    Supported
  F:    drivers/dma/ioat*
  
 +INTEL IADX DRIVER
 +M:    Dave Jiang <dave.jiang@intel.com>
 +L:    dmaengine@vger.kernel.org
 +S:    Supported
 +F:    drivers/dma/idxd/*
 +F:    include/uapi/linux/idxd.h
 +F:    include/linux/idxd.h
 +
  INTEL IDLE DRIVER
  M:    Jacob Pan <jacob.jun.pan@linux.intel.com>
  M:    Len Brown <lenb@kernel.org>
@@@ -8660,12 -8610,6 +8684,12 @@@ S:    Maintaine
  F:    arch/x86/include/asm/intel_telemetry.h
  F:    drivers/platform/x86/intel_telemetry*
  
 +INTEL UNCORE FREQUENCY CONTROL
 +M:    Srinivas Pandruvada <srinivas.pandruvada@linux.intel.com>
 +L:    platform-driver-x86@vger.kernel.org
 +S:    Maintained
 +F:    drivers/platform/x86/intel-uncore-frequency.c
 +
  INTEL VIRTUAL BUTTON DRIVER
  M:    AceLan Kao <acelan.kao@canonical.com>
  L:    platform-driver-x86@vger.kernel.org
@@@ -8673,7 -8617,7 +8697,7 @@@ S:      Maintaine
  F:    drivers/platform/x86/intel-vbtn.c
  
  INTEL WIRELESS 3945ABG/BG, 4965AGN (iwlegacy)
 -M:    Stanislaw Gruszka <sgruszka@redhat.com>
 +M:    Stanislaw Gruszka <stf_xl@wp.pl>
  L:    linux-wireless@vger.kernel.org
  S:    Supported
  F:    drivers/net/wireless/intel/iwlegacy/
@@@ -8911,12 -8855,10 +8935,12 @@@ L:   isdn4linux@listserv.isdn4linux.de (s
  L:    netdev@vger.kernel.org
  W:    http://www.isdn4linux.de
  S:    Maintained
 -F:    drivers/isdn/mISDN
 -F:    drivers/isdn/hardware
 +F:    drivers/isdn/mISDN/
 +F:    drivers/isdn/hardware/
 +F:    drivers/isdn/Kconfig
 +F:    drivers/isdn/Makefile
  
 -ISDN/CAPI SUBSYSTEM
 +ISDN/CMTP OVER BLUETOOTH
  M:    Karsten Keil <isdn@linux-pingi.de>
  L:    isdn4linux@listserv.isdn4linux.de (subscribers-only)
  L:    netdev@vger.kernel.org
@@@ -8924,6 -8866,7 +8948,6 @@@ W:      http://www.isdn4linux.d
  S:    Odd Fixes
  F:    Documentation/isdn/
  F:    drivers/isdn/capi/
 -F:    drivers/staging/isdn/
  F:    net/bluetooth/cmtp/
  F:    include/linux/isdn/
  F:    include/uapi/linux/isdn/
@@@ -8947,9 -8890,10 +8971,9 @@@ F:     drivers/media/tuners/it913x
  
  IVTV VIDEO4LINUX DRIVER
  M:    Andy Walls <awalls@md.metrocast.net>
 -L:    ivtv-devel@ivtvdriver.org (subscribers-only)
  L:    linux-media@vger.kernel.org
  T:    git git://linuxtv.org/media_tree.git
 -W:    http://www.ivtvdriver.org
 +W:    https://linuxtv.org
  S:    Maintained
  F:    Documentation/media/v4l-drivers/ivtv*
  F:    drivers/media/pci/ivtv/
@@@ -9148,6 -9092,7 +9172,6 @@@ F:      include/linux/umh.
  
  KERNEL VIRTUAL MACHINE (KVM)
  M:    Paolo Bonzini <pbonzini@redhat.com>
 -M:    Radim Krčmář <rkrcmar@redhat.com>
  L:    kvm@vger.kernel.org
  W:    http://www.linux-kvm.org
  T:    git git://git.kernel.org/pub/scm/virt/kvm/kvm.git
@@@ -9182,9 -9127,9 +9206,9 @@@ F:      virt/kvm/arm
  F:    include/kvm/arm_*
  
  KERNEL VIRTUAL MACHINE FOR MIPS (KVM/mips)
 -M:    James Hogan <jhogan@kernel.org>
  L:    linux-mips@vger.kernel.org
 -S:    Supported
 +L:    kvm@vger.kernel.org
 +S:    Orphan
  F:    arch/mips/include/uapi/asm/kvm*
  F:    arch/mips/include/asm/kvm*
  F:    arch/mips/kvm/
@@@ -9219,6 -9164,7 +9243,6 @@@ F:      tools/testing/selftests/kvm/*/s390x
  
  KERNEL VIRTUAL MACHINE FOR X86 (KVM/x86)
  M:    Paolo Bonzini <pbonzini@redhat.com>
 -M:    Radim Krčmář <rkrcmar@redhat.com>
  R:    Sean Christopherson <sean.j.christopherson@intel.com>
  R:    Vitaly Kuznetsov <vkuznets@redhat.com>
  R:    Wanpeng Li <wanpengli@tencent.com>
@@@ -9236,7 -9182,7 +9260,7 @@@ F:      arch/x86/include/uapi/asm/svm.
  F:    arch/x86/include/asm/kvm*
  F:    arch/x86/include/asm/pvclock-abi.h
  F:    arch/x86/include/asm/svm.h
 -F:    arch/x86/include/asm/vmx.h
 +F:    arch/x86/include/asm/vmx*.h
  F:    arch/x86/kernel/kvm.c
  F:    arch/x86/kernel/kvmclock.c
  
@@@ -9685,7 -9631,6 +9709,7 @@@ LINUX KERNEL DUMP TEST MODULE (LKDTM
  M:    Kees Cook <keescook@chromium.org>
  S:    Maintained
  F:    drivers/misc/lkdtm/*
 +F:    tools/testing/selftests/lkdtm/*
  
  LINUX KERNEL MEMORY CONSISTENCY MODEL (LKMM)
  M:    Alan Stern <stern@rowland.harvard.edu>
@@@ -9994,7 -9939,7 +10018,7 @@@ S:     Maintaine
  F:    drivers/net/dsa/mv88e6xxx/
  F:    include/linux/platform_data/mv88e6xxx.h
  F:    Documentation/devicetree/bindings/net/dsa/marvell.txt
 -F:    Documentation/networking/devlink-params-mv88e6xxx.txt
 +F:    Documentation/networking/devlink/mv88e6xxx.rst
  
  MARVELL ARMADA DRM SUPPORT
  M:    Russell King <linux@armlinux.org.uk>
@@@ -10064,7 -10009,8 +10088,7 @@@ F:   drivers/net/ethernet/marvell/mvneta.
  
  MARVELL MWIFIEX WIRELESS DRIVER
  M:    Amitkumar Karwar <amitkarwar@gmail.com>
 -M:    Nishant Sarmukadam <nishants@marvell.com>
 -M:    Ganapathi Bhat <gbhat@marvell.com>
 +M:    Ganapathi Bhat <ganapathi.bhat@nxp.com>
  M:    Xinming Hu <huxinming820@gmail.com>
  L:    linux-wireless@vger.kernel.org
  S:    Maintained
@@@ -10103,16 -10049,6 +10127,16 @@@ M: Jerin Jacob <jerinj@marvell.com
  L:    netdev@vger.kernel.org
  S:    Supported
  F:    drivers/net/ethernet/marvell/octeontx2/af/
 +F:    Documentation/networking/device_drivers/marvell/octeontx2.rst
 +
 +MARVELL OCTEONTX2 PHYSICAL FUNCTION DRIVER
 +M:    Sunil Goutham <sgoutham@marvell.com>
 +M:    Geetha sowjanya <gakula@marvell.com>
 +M:    Subbaraya Sundeep <sbhatta@marvell.com>
 +M:    hariprasad <hkelam@marvell.com>
 +L:    netdev@vger.kernel.org
 +S:    Supported
 +F:    drivers/net/ethernet/marvell/octeontx2/nic/
  
  MATROX FRAMEBUFFER DRIVER
  L:    linux-fbdev@vger.kernel.org
@@@ -10226,7 -10162,6 +10250,7 @@@ S:   Maintaine
  F:    drivers/media/radio/radio-maxiradio*
  
  MCAN MMIO DEVICE DRIVER
 +M:    Dan Murphy <dmurphy@ti.com>
  M:    Sriram Dash <sriram.dash@samsung.com>
  L:    linux-can@vger.kernel.org
  S:    Maintained
@@@ -10395,7 -10330,7 +10419,7 @@@ L:   linux-media@vger.kernel.or
  L:    linux-renesas-soc@vger.kernel.org
  T:    git git://linuxtv.org/media_tree.git
  S:    Supported
 -F:    Documentation/devicetree/bindings/media/renesas,ceu.txt
 +F:    Documentation/devicetree/bindings/media/renesas,ceu.yaml
  F:    drivers/media/platform/renesas-ceu.c
  F:    include/media/drv-intf/renesas-ceu.h
  
@@@ -10433,7 -10368,7 +10457,7 @@@ L:   linux-media@vger.kernel.or
  L:    linux-renesas-soc@vger.kernel.org
  T:    git git://linuxtv.org/media_tree.git
  S:    Supported
 -F:    Documentation/devicetree/bindings/media/renesas,csi2.txt
 +F:    Documentation/devicetree/bindings/media/renesas,csi2.yaml
  F:    Documentation/devicetree/bindings/media/renesas,vin.txt
  F:    drivers/media/platform/rcar-vin/
  
@@@ -11116,6 -11051,7 +11140,6 @@@ F:   drivers/usb/image/microtek.
  MIPS
  M:    Ralf Baechle <ralf@linux-mips.org>
  M:    Paul Burton <paulburton@kernel.org>
 -M:    James Hogan <jhogan@kernel.org>
  L:    linux-mips@vger.kernel.org
  W:    http://www.linux-mips.org/
  T:    git git://git.linux-mips.org/pub/scm/ralf/linux.git
@@@ -11256,13 -11192,6 +11280,13 @@@ S: Maintaine
  F:    Documentation/driver-api/serial/moxa-smartio.rst
  F:    drivers/tty/mxser.*
  
 +MONOLITHIC POWER SYSTEM PMIC DRIVER
 +M:    Saravanan Sekar <sravanhome@gmail.com>
 +S:    Maintained
 +F:    Documentation/devicetree/bindings/regulator/mpq7920.yaml
 +F:    drivers/regulator/mpq7920.c
 +F:    drivers/regulator/mpq7920.h
 +
  MR800 AVERMEDIA USB FM RADIO DRIVER
  M:    Alexey Klimov <klimov.linux@gmail.com>
  L:    linux-media@vger.kernel.org
@@@ -11506,7 -11435,7 +11530,7 @@@ F:   Documentation/networking/net_failove
  
  NETEM NETWORK EMULATOR
  M:    Stephen Hemminger <stephen@networkplumber.org>
 -L:    netem@lists.linux-foundation.org (moderated for non-subscribers)
 +L:    netdev@vger.kernel.org
  S:    Maintained
  F:    net/sched/sch_netem.c
  
@@@ -11551,7 -11480,7 +11575,7 @@@ F:   include/uapi/linux/netrom.
  F:    net/netrom/
  
  NETRONOME ETHERNET DRIVERS
 -M:    Jakub Kicinski <jakub.kicinski@netronome.com>
 +M:    Jakub Kicinski <kuba@kernel.org>
  L:    oss-drivers@netronome.com
  S:    Maintained
  F:    drivers/net/ethernet/netronome/
@@@ -11580,8 -11509,8 +11604,8 @@@ M:   "David S. Miller" <davem@davemloft.n
  L:    netdev@vger.kernel.org
  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/davem/net.git
 -T:    git git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next.git
 +T:    git git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net.git
 +T:    git git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net-next.git
  S:    Odd Fixes
  F:    Documentation/devicetree/bindings/net/
  F:    drivers/net/
@@@ -11619,12 -11548,11 +11643,12 @@@ F:        drivers/net/dsa
  
  NETWORKING [GENERAL]
  M:    "David S. Miller" <davem@davemloft.net>
 +M:    Jakub Kicinski <kuba@kernel.org>
  L:    netdev@vger.kernel.org
  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/davem/net.git
 -T:    git git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next.git
 +T:    git git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net.git
 +T:    git git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net-next.git
  B:    mailto:netdev@vger.kernel.org
  S:    Maintained
  F:    net/
@@@ -11669,7 -11597,7 +11693,7 @@@ M:   "David S. Miller" <davem@davemloft.n
  M:    Alexey Kuznetsov <kuznet@ms2.inr.ac.ru>
  M:    Hideaki YOSHIFUJI <yoshfuji@linux-ipv6.org>
  L:    netdev@vger.kernel.org
 -T:    git git://git.kernel.org/pub/scm/linux/kernel/git/davem/net.git
 +T:    git git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net.git
  S:    Maintained
  F:    net/ipv4/
  F:    net/ipv6/
@@@ -11694,18 -11622,6 +11718,18 @@@ F: net/ipv6/calipso.
  F:    net/netfilter/xt_CONNSECMARK.c
  F:    net/netfilter/xt_SECMARK.c
  
 +NETWORKING [MPTCP]
 +M:    Mat Martineau <mathew.j.martineau@linux.intel.com>
 +M:    Matthieu Baerts <matthieu.baerts@tessares.net>
 +L:    netdev@vger.kernel.org
 +L:    mptcp@lists.01.org
 +W:    https://github.com/multipath-tcp/mptcp_net-next/wiki
 +B:    https://github.com/multipath-tcp/mptcp_net-next/issues
 +S:    Maintained
 +F:    include/net/mptcp.h
 +F:    net/mptcp/
 +F:    tools/testing/selftests/net/mptcp/
 +
  NETWORKING [TCP]
  M:    Eric Dumazet <edumazet@google.com>
  L:    netdev@vger.kernel.org
@@@ -11724,7 -11640,7 +11748,7 @@@ M:   Boris Pismenny <borisp@mellanox.com
  M:    Aviad Yehezkel <aviadye@mellanox.com>
  M:    John Fastabend <john.fastabend@gmail.com>
  M:    Daniel Borkmann <daniel@iogearbox.net>
 -M:    Jakub Kicinski <jakub.kicinski@netronome.com>
 +M:    Jakub Kicinski <kuba@kernel.org>
  L:    netdev@vger.kernel.org
  S:    Maintained
  F:    net/tls/*
@@@ -11736,7 -11652,7 +11760,7 @@@ L:   linux-wireless@vger.kernel.or
  Q:    http://patchwork.kernel.org/project/linux-wireless/list/
  
  NETDEVSIM
 -M:    Jakub Kicinski <jakub.kicinski@netronome.com>
 +M:    Jakub Kicinski <kuba@kernel.org>
  S:    Maintained
  F:    drivers/net/netdevsim/*
  
@@@ -11813,7 -11729,7 +11837,7 @@@ F:   Documentation/scsi/NinjaSCSI.tx
  F:    drivers/scsi/nsp32*
  
  NIOS2 ARCHITECTURE
 -M:    Ley Foon Tan <lftan@altera.com>
 +M:    Ley Foon Tan <ley.foon.tan@intel.com>
  L:    nios2-dev@lists.rocketboards.org (moderated for non-subscribers)
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/lftan/nios2.git
  S:    Maintained
@@@ -12564,7 -12480,7 +12588,7 @@@ L:   linux-crypto@vger.kernel.or
  S:    Maintained
  F:    kernel/padata.c
  F:    include/linux/padata.h
 -F:    Documentation/padata.txt
 +F:    Documentation/core-api/padata.rst
  
  PAGE POOL
  M:    Jesper Dangaard Brouer <hawk@kernel.org>
@@@ -12580,13 -12496,6 +12604,13 @@@ L: platform-driver-x86@vger.kernel.or
  S:    Maintained
  F:    drivers/platform/x86/panasonic-laptop.c
  
 +PARALLAX PING IIO SENSOR DRIVER
 +M:    Andreas Klinger <ak@it-klinger.de>
 +L:    linux-iio@vger.kernel.org
 +S:    Maintained
 +F:    Documentation/devicetree/bindings/iio/proximity/parallax-ping.yaml
 +F:    drivers/iio/proximity/ping.c
 +
  PARALLEL LCD/KEYPAD PANEL DRIVER
  M:    Willy Tarreau <willy@haproxy.com>
  M:    Ksenija Stanojevic <ksenija.stanojevic@gmail.com>
@@@ -12704,7 -12613,7 +12728,7 @@@ F:   Documentation/devicetree/bindings/pc
  F:    drivers/pci/controller/pci-aardvark.c
  
  PCI DRIVER FOR ALTERA PCIE IP
 -M:    Ley Foon Tan <lftan@altera.com>
 +M:    Ley Foon Tan <ley.foon.tan@intel.com>
  L:    rfi@lists.rocketboards.org (moderated for non-subscribers)
  L:    linux-pci@vger.kernel.org
  S:    Supported
@@@ -12724,7 -12633,7 +12748,7 @@@ M:   Rob Herring <robh@kernel.org
  L:    linux-pci@vger.kernel.org
  L:    linux-arm-kernel@lists.infradead.org
  S:    Maintained
 -F:    Documentation/devicetree/bindings/pci/versatile.txt
 +F:    Documentation/devicetree/bindings/pci/versatile.yaml
  F:    drivers/pci/controller/pci-versatile.c
  
  PCI DRIVER FOR ARMADA 8K
@@@ -12757,7 -12666,7 +12781,7 @@@ M:   Will Deacon <will@kernel.org
  L:    linux-pci@vger.kernel.org
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
  S:    Maintained
 -F:    Documentation/devicetree/bindings/pci/host-generic-pci.txt
 +F:    Documentation/devicetree/bindings/pci/host-generic-pci.yaml
  F:    drivers/pci/controller/pci-host-common.c
  F:    drivers/pci/controller/pci-host-generic.c
  
@@@ -12883,7 -12792,7 +12907,7 @@@ S:   Supporte
  F:    Documentation/PCI/pci-error-recovery.rst
  
  PCI MSI DRIVER FOR ALTERA MSI IP
 -M:    Ley Foon Tan <lftan@altera.com>
 +M:    Ley Foon Tan <ley.foon.tan@intel.com>
  L:    rfi@lists.rocketboards.org (moderated for non-subscribers)
  L:    linux-pci@vger.kernel.org
  S:    Supported
@@@ -12919,7 -12828,7 +12943,7 @@@ F:   arch/x86/kernel/early-quirks.
  
  PCI NATIVE HOST BRIDGE AND ENDPOINT DRIVERS
  M:    Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
 -R:    Andrew Murray <andrew.murray@arm.com>
 +R:    Andrew Murray <amurray@thegoodpenguin.co.uk>
  L:    linux-pci@vger.kernel.org
  Q:    http://patchwork.ozlabs.org/project/linux-pci/list/
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/lpieralisi/pci.git/
@@@ -13284,11 -13193,6 +13308,11 @@@ S: Maintaine
  F:    drivers/iio/chemical/pms7003.c
  F:    Documentation/devicetree/bindings/iio/chemical/plantower,pms7003.yaml
  
 +PLX DMA DRIVER
 +M:    Logan Gunthorpe <logang@deltatee.com>
 +S:    Maintained
 +F:    drivers/dma/plx_dma.c
 +
  PMBUS HARDWARE MONITORING DRIVERS
  M:    Guenter Roeck <linux@roeck-us.net>
  L:    linux-hwmon@vger.kernel.org
@@@ -13340,6 -13244,11 +13364,6 @@@ T:  git git://github.com/intel/pm-grap
  S:    Supported
  F:    tools/power/pm-graph
  
 -PNP SUPPORT
 -M:    "Rafael J. Wysocki" <rafael.j.wysocki@intel.com>
 -S:    Maintained
 -F:    drivers/pnp/
 -
  PNI RM3100 IIO DRIVER
  M:    Song Qiang <songqiang1304521@gmail.com>
  L:    linux-iio@vger.kernel.org
@@@ -13347,11 -13256,6 +13371,11 @@@ S: Maintaine
  F:    drivers/iio/magnetometer/rm3100*
  F:    Documentation/devicetree/bindings/iio/magnetometer/pni,rm3100.txt
  
 +PNP SUPPORT
 +M:    "Rafael J. Wysocki" <rafael.j.wysocki@intel.com>
 +S:    Maintained
 +F:    drivers/pnp/
 +
  POSIX CLOCKS and TIMERS
  M:    Thomas Gleixner <tglx@linutronix.de>
  L:    linux-kernel@vger.kernel.org
@@@ -13359,8 -13263,6 +13383,8 @@@ T:   git git://git.kernel.org/pub/scm/lin
  S:    Maintained
  F:    fs/timerfd.c
  F:    include/linux/timer*
 +F:    include/linux/time_namespace.h
 +F:    kernel/time/namespace.c
  F:    kernel/time/*timer*
  
  POWER MANAGEMENT CORE
@@@ -13796,13 -13698,6 +13820,13 @@@ T: git git://git.kernel.org/pub/scm/lin
  S:    Supported
  F:    drivers/net/wireless/ath/ath10k/
  
 +QUALCOMM ATHEROS ATH11K WIRELESS DRIVER
 +M:    Kalle Valo <kvalo@codeaurora.org>
 +L:    ath11k@lists.infradead.org
 +T:    git git://git.kernel.org/pub/scm/linux/kernel/git/kvalo/ath.git
 +S:    Supported
 +F:    drivers/net/wireless/ath/ath11k/
 +
  QUALCOMM ATHEROS ATH9K WIRELESS DRIVER
  M:    QCA ath9k Development <ath9k-devel@qca.qualcomm.com>
  L:    linux-wireless@vger.kernel.org
@@@ -13825,14 -13720,6 +13849,14 @@@ S: Maintaine
  F:    Documentation/devicetree/bindings/opp/qcom-nvmem-cpufreq.txt
  F:    drivers/cpufreq/qcom-cpufreq-nvmem.c
  
 +QUALCOMM CORE POWER REDUCTION (CPR) AVS DRIVER
 +M:    Niklas Cassel <nks@flawful.org>
 +L:    linux-pm@vger.kernel.org
 +L:    linux-arm-msm@vger.kernel.org
 +S:    Maintained
 +F:    Documentation/devicetree/bindings/power/avs/qcom,cpr.txt
 +F:    drivers/power/avs/qcom-cpr.c
 +
  QUALCOMM EMAC GIGABIT ETHERNET DRIVER
  M:    Timur Tabi <timur@kernel.org>
  L:    netdev@vger.kernel.org
@@@ -13841,6 -13728,7 +13865,6 @@@ F:   drivers/net/ethernet/qualcomm/emac
  
  QUALCOMM ETHQOS ETHERNET DRIVER
  M:    Vinod Koul <vkoul@kernel.org>
 -M:    Niklas Cassel <niklas.cassel@linaro.org>
  L:    netdev@vger.kernel.org
  S:    Maintained
  F:    drivers/net/ethernet/stmicro/stmmac/dwmac-qcom-ethqos.c
@@@ -13874,15 -13762,6 +13898,15 @@@ L: linux-arm-msm@vger.kernel.or
  S:    Maintained
  F:    drivers/iommu/qcom_iommu.c
  
 +QUALCOMM RMNET DRIVER
 +M:    Subash Abhinov Kasiviswanathan <subashab@codeaurora.org>
 +M:    Sean Tranchetti <stranche@codeaurora.org>
 +L:    netdev@vger.kernel.org
 +S:    Maintained
 +F:    drivers/net/ethernet/qualcomm/rmnet/
 +F:    Documentation/networking/device_drivers/qualcomm/rmnet.txt
 +F:    include/linux/if_rmnet.h
 +
  QUALCOMM TSENS THERMAL DRIVER
  M:    Amit Kucheria <amit.kucheria@linaro.org>
  L:    linux-pm@vger.kernel.org
@@@ -13982,7 -13861,7 +14006,7 @@@ S:   Maintaine
  F:    arch/mips/ralink
  
  RALINK RT2X00 WIRELESS LAN DRIVER
 -M:    Stanislaw Gruszka <sgruszka@redhat.com>
 +M:    Stanislaw Gruszka <stf_xl@wp.pl>
  M:    Helmut Schaa <helmut.schaa@googlemail.com>
  L:    linux-wireless@vger.kernel.org
  S:    Maintained
@@@ -14109,6 -13988,7 +14133,6 @@@ F:   include/linux/platform_data/rtc-
  F:    tools/testing/selftests/rtc/
  
  REALTEK AUDIO CODECS
 -M:    Bard Liao <bardliao@realtek.com>
  M:    Oder Chiou <oder_chiou@realtek.com>
  S:    Maintained
  F:    sound/soc/codecs/rt*
@@@ -14281,7 -14161,6 +14305,7 @@@ M:   Paul Walmsley <paul.walmsley@sifive.
  M:    Palmer Dabbelt <palmer@dabbelt.com>
  M:    Albert Ou <aou@eecs.berkeley.edu>
  L:    linux-riscv@lists.infradead.org
 +P:    Documentation/riscv/patch-acceptance.rst
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/riscv/linux.git
  S:    Supported
  F:    arch/riscv/
@@@ -14296,12 -14175,6 +14320,12 @@@ F: drivers/hid/hid-roccat
  F:    include/linux/hid-roccat*
  F:    Documentation/ABI/*/sysfs-driver-hid-roccat*
  
 +ROCKCHIP ISP V1 DRIVER
 +M:    Helen Koike <helen.koike@collabora.com>
 +L:    linux-media@vger.kernel.org
 +S:    Maintained
 +F:    drivers/staging/media/rkisp1/
 +
  ROCKCHIP RASTER 2D GRAPHIC ACCELERATION UNIT DRIVER
  M:    Jacob Chen <jacob-chen@iotwrt.com>
  M:    Ezequiel Garcia <ezequiel@collabora.com>
@@@ -14673,7 -14546,7 +14697,7 @@@ F:   drivers/media/i2c/s5k5baf.
  SAMSUNG S5P Security SubSystem (SSS) DRIVER
  M:    Krzysztof Kozlowski <krzk@kernel.org>
  M:    Vladimir Zapolskiy <vz@mleia.com>
 -M:    Kamil Konieczny <k.konieczny@partner.samsung.com>
 +M:    Kamil Konieczny <k.konieczny@samsung.com>
  L:    linux-crypto@vger.kernel.org
  L:    linux-samsung-soc@vger.kernel.org
  S:    Maintained
@@@ -14715,6 -14588,8 +14739,6 @@@ F:   include/linux/platform_data/spi-s3c6
  
  SAMSUNG SXGBE DRIVERS
  M:    Byungho An <bh74.an@samsung.com>
 -M:    Girish K S <ks.giri@samsung.com>
 -M:    Vipul Pandya <vipul.pandya@samsung.com>
  S:    Supported
  L:    netdev@vger.kernel.org
  F:    drivers/net/ethernet/samsung/sxgbe/
@@@ -14949,8 -14824,8 +14973,8 @@@ S:   Maintaine
  F:    drivers/mmc/host/sdhci-omap.c
  
  SECURE ENCRYPTING DEVICE (SED) OPAL DRIVER
 -M:    Scott Bauer <scott.bauer@intel.com>
  M:    Jonathan Derrick <jonathan.derrick@intel.com>
 +M:    Revanth Rajashekar <revanth.rajashekar@intel.com>
  L:    linux-block@vger.kernel.org
  S:    Supported
  F:    block/sed*
@@@ -14985,7 -14860,6 +15009,7 @@@ F:   include/uapi/linux/selinux_netlink.
  F:    security/selinux/
  F:    scripts/selinux/
  F:    Documentation/admin-guide/LSM/SELinux.rst
 +F:    Documentation/ABI/obsolete/sysfs-selinux-disable
  
  SENSABLE PHANTOM
  M:    Jiri Slaby <jirislaby@gmail.com>
@@@ -15212,8 -15086,11 +15236,8 @@@ F:  drivers/video/fbdev/sm712
  F:    Documentation/fb/sm712fb.rst
  
  SIMPLE FIRMWARE INTERFACE (SFI)
 -M:    Len Brown <lenb@kernel.org>
 -L:    sfi-devel@simplefirmware.org
  W:    http://simplefirmware.org/
 -T:    git git://git.kernel.org/pub/scm/linux/kernel/git/lenb/linux-sfi-2.6.git
 -S:    Supported
 +S:    Obsolete
  F:    arch/x86/platform/sfi/
  F:    drivers/sfi/
  F:    include/linux/sfi*.h
@@@ -15933,18 -15810,8 +15957,18 @@@ M: Jose Abreu <joabreu@synopsys.com
  L:    netdev@vger.kernel.org
  W:    http://www.stlinux.com
  S:    Supported
 +F:    Documentation/networking/device_drivers/stmicro/
  F:    drivers/net/ethernet/stmicro/stmmac/
  
 +EXTRA BOOT CONFIG
 +M:    Masami Hiramatsu <mhiramat@kernel.org>
 +S:    Maintained
 +F:    lib/bootconfig.c
 +F:    fs/proc/bootconfig.c
 +F:    include/linux/bootconfig.h
 +F:    tools/bootconfig/*
 +F:    Documentation/admin-guide/bootconfig.rst
 +
  SUN3/3X
  M:    Sam Creasey <sammy@sammy.net>
  W:    http://sammy.net/sun3/
@@@ -16075,8 -15942,8 +16099,8 @@@ F:   Documentation/devicetree/bindings/re
  SYNOPSYS CREG GPIO DRIVER
  M:    Eugeniy Paltsev <Eugeniy.Paltsev@synopsys.com>
  S:    Maintained
 -F:    drivers/gpio/gpio-creg-snps.c
  F:    Documentation/devicetree/bindings/gpio/snps,creg-gpio.txt
 +F:    drivers/gpio/gpio-creg-snps.c
  
  SYNOPSYS DESIGNWARE 8250 UART DRIVER
  R:    Andy Shevchenko <andriy.shevchenko@linux.intel.com>
@@@ -16087,8 -15954,8 +16111,8 @@@ SYNOPSYS DESIGNWARE APB GPIO DRIVE
  M:    Hoan Tran <hoan@os.amperecomputing.com>
  L:    linux-gpio@vger.kernel.org
  S:    Maintained
 -F:    drivers/gpio/gpio-dwapb.c
  F:    Documentation/devicetree/bindings/gpio/snps-dwapb-gpio.txt
 +F:    drivers/gpio/gpio-dwapb.c
  
  SYNOPSYS DESIGNWARE AXI DMAC DRIVER
  M:    Eugeniy Paltsev <Eugeniy.Paltsev@synopsys.com>
@@@ -16152,7 -16019,6 +16176,7 @@@ F:   drivers/firmware/arm_scpi.
  F:    drivers/firmware/arm_scmi/
  F:    drivers/reset/reset-scmi.c
  F:    include/linux/sc[mp]i_protocol.h
 +F:    include/trace/events/scmi.h
  
  SYSTEM RESET/SHUTDOWN DRIVERS
  M:    Sebastian Reichel <sre@kernel.org>
@@@ -16516,15 -16382,12 +16540,15 @@@ F:        Documentation/devicetree/bindings/th
  
  THERMAL/CPU_COOLING
  M:    Amit Daniel Kachhap <amit.kachhap@gmail.com>
 +M:    Daniel Lezcano <daniel.lezcano@linaro.org>
  M:    Viresh Kumar <viresh.kumar@linaro.org>
  M:    Javi Merino <javi.merino@kernel.org>
  L:    linux-pm@vger.kernel.org
  S:    Supported
  F:    Documentation/driver-api/thermal/cpu-cooling-api.rst
 -F:    drivers/thermal/cpu_cooling.c
 +F:    Documentation/driver-api/thermal/cpu-idle-cooling.rst
 +F:    drivers/thermal/cpufreq_cooling.c
 +F:    drivers/thermal/cpuidle_cooling.c
  F:    include/linux/cpu_cooling.h
  
  THERMAL DRIVER FOR AMLOGIC SOCS
@@@ -16551,7 -16414,6 +16575,7 @@@ M:   Andreas Noever <andreas.noever@gmail
  M:    Michael Jamet <michael.jamet@intel.com>
  M:    Mika Westerberg <mika.westerberg@linux.intel.com>
  M:    Yehezkel Bernat <YehezkelShB@gmail.com>
 +L:    linux-usb@vger.kernel.org
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/westeri/thunderbolt.git
  S:    Maintained
  F:    Documentation/admin-guide/thunderbolt.rst
@@@ -16723,13 -16585,6 +16747,13 @@@ L: alsa-devel@alsa-project.org (moderat
  S:    Odd Fixes
  F:    sound/soc/codecs/tas571x*
  
 +TI TCAN4X5X DEVICE DRIVER
 +M:    Dan Murphy <dmurphy@ti.com>
 +L:    linux-can@vger.kernel.org
 +S:    Maintained
 +F:    Documentation/devicetree/bindings/net/can/tcan4x5x.txt
 +F:    drivers/net/can/m_can/tcan4x5x.c
 +
  TI TRF7970A NFC DRIVER
  M:    Mark Greer <mgreer@animalcreek.com>
  L:    linux-wireless@vger.kernel.org
@@@ -16752,7 -16607,6 +16776,7 @@@ Q:   http://patchwork.linuxtv.org/project
  S:    Maintained
  F:    drivers/media/platform/ti-vpe/
  F:    Documentation/devicetree/bindings/media/ti,vpe.yaml
 +      Documentation/devicetree/bindings/media/ti,cal.yaml
  
  TI WILINK WIRELESS DRIVERS
  L:    linux-wireless@vger.kernel.org
@@@ -16782,7 -16636,7 +16806,7 @@@ F:   kernel/time/ntp.
  F:    tools/testing/selftests/timers/
  
  TIPC NETWORK LAYER
 -M:    Jon Maloy <jon.maloy@ericsson.com>
 +M:    Jon Maloy <jmaloy@redhat.com>
  M:    Ying Xue <ying.xue@windriver.com>
  L:    netdev@vger.kernel.org (core kernel code)
  L:    tipc-discussion@lists.sourceforge.net (user apps, general discussion)
@@@ -17138,6 -16992,7 +17162,6 @@@ F:   drivers/staging/unisys
  UNIVERSAL FLASH STORAGE HOST CONTROLLER DRIVER
  R:    Alim Akhtar <alim.akhtar@samsung.com>
  R:    Avri Altman <avri.altman@wdc.com>
 -R:    Pedro Sousa <pedrom.sousa@synopsys.com>
  L:    linux-scsi@vger.kernel.org
  S:    Supported
  F:    Documentation/scsi/ufs.txt
@@@ -17554,7 -17409,7 +17578,7 @@@ F:   drivers/mtd/nand/raw/vf610_nfc.
  VFAT/FAT/MSDOS FILESYSTEM
  M:    OGAWA Hirofumi <hirofumi@mail.parknet.co.jp>
  S:    Maintained
 -F:    Documentation/filesystems/vfat.txt
 +F:    Documentation/filesystems/vfat.rst
  F:    fs/fat/
  
  VFIO DRIVER
@@@ -17677,7 -17532,6 +17701,7 @@@ F:   net/vmw_vsock/diag.
  F:    net/vmw_vsock/af_vsock_tap.c
  F:    net/vmw_vsock/virtio_transport_common.c
  F:    net/vmw_vsock/virtio_transport.c
 +F:    net/vmw_vsock/vsock_loopback.c
  F:    drivers/net/vsockmon.c
  F:    drivers/vhost/vsock.c
  F:    tools/testing/vsock/
@@@ -17791,12 -17645,6 +17815,12 @@@ F: include/linux/vbox_utils.
  F:    include/uapi/linux/vbox*.h
  F:    drivers/virt/vboxguest/
  
 +VIRTUAL BOX SHARED FOLDER VFS DRIVER:
 +M:    Hans de Goede <hdegoede@redhat.com>
 +L:    linux-fsdevel@vger.kernel.org
 +S:    Maintained
 +F:    fs/vboxsf/*
 +
  VIRTUAL SERIO DEVICE DRIVER
  M:    Stephen Chandler Paul <thatslyude@gmail.com>
  S:    Maintained
@@@ -18054,14 -17902,6 +18078,14 @@@ L: linux-gpio@vger.kernel.or
  S:    Maintained
  F:    drivers/gpio/gpio-ws16c48.c
  
 +WIREGUARD SECURE NETWORK TUNNEL
 +M:    Jason A. Donenfeld <Jason@zx2c4.com>
 +S:    Maintained
 +F:    drivers/net/wireguard/
 +F:    tools/testing/selftests/wireguard/
 +L:    wireguard@lists.zx2c4.com
 +L:    netdev@vger.kernel.org
 +
  WISTRON LAPTOP BUTTON DRIVER
  M:    Miloslav Trmac <mitr@volny.cz>
  S:    Maintained
@@@ -18125,8 -17965,8 +18149,8 @@@ F:   Documentation/core-api/workqueue.rs
  X-POWERS AXP288 PMIC DRIVERS
  M:    Hans de Goede <hdegoede@redhat.com>
  S:    Maintained
 -N:    axp288
  F:    drivers/acpi/pmic/intel_pmic_xpower.c
 +N:    axp288
  
  X-POWERS MULTIFUNCTION PMIC DEVICE DRIVERS
  M:    Chen-Yu Tsai <wens@csie.org>
@@@ -18237,7 -18077,7 +18261,7 @@@ XDP (eXpress Data Path
  M:    Alexei Starovoitov <ast@kernel.org>
  M:    Daniel Borkmann <daniel@iogearbox.net>
  M:    David S. Miller <davem@davemloft.net>
 -M:    Jakub Kicinski <jakub.kicinski@netronome.com>
 +M:    Jakub Kicinski <kuba@kernel.org>
  M:    Jesper Dangaard Brouer <hawk@kernel.org>
  M:    John Fastabend <john.fastabend@gmail.com>
  L:    netdev@vger.kernel.org
@@@ -18414,8 -18254,8 +18438,8 @@@ M:   Nandor Han <nandor.han@ge.com
  M:    Semi Malinen <semi.malinen@ge.com>
  L:    linux-gpio@vger.kernel.org
  S:    Maintained
 -F:    drivers/gpio/gpio-xra1403.c
  F:    Documentation/devicetree/bindings/gpio/gpio-xra1403.txt
 +F:    drivers/gpio/gpio-xra1403.c
  
  XTENSA XTFPGA PLATFORM SUPPORT
  M:    Max Filippov <jcmvbkbc@gmail.com>
@@@ -18496,16 -18336,6 +18520,16 @@@ L: linux-kernel@vger.kernel.or
  S:    Maintained
  F:    arch/x86/kernel/cpu/zhaoxin.c
  
 +ZONEFS FILESYSTEM
 +M:    Damien Le Moal <damien.lemoal@wdc.com>
 +M:    Naohiro Aota <naohiro.aota@wdc.com>
 +R:    Johannes Thumshirn <jth@kernel.org>
 +L:    linux-fsdevel@vger.kernel.org
 +T:    git git://git.kernel.org/pub/scm/linux/kernel/git/dlemoal/zonefs.git
 +S:    Maintained
 +F:    fs/zonefs/
 +F:    Documentation/filesystems/zonefs.txt
 +
  ZPOOL COMPRESSED PAGE STORAGE API
  M:    Dan Streetman <ddstreet@ieee.org>
  L:    linux-mm@kvack.org
@@@ -66,7 -66,6 +66,7 @@@
  #include "amdgpu_pmu.h"
  
  #include <linux/suspend.h>
 +#include <drm/task_barrier.h>
  
  MODULE_FIRMWARE("amdgpu/vega10_gpu_info.bin");
  MODULE_FIRMWARE("amdgpu/vega12_gpu_info.bin");
@@@ -216,8 -215,8 +216,8 @@@ uint32_t amdgpu_mm_rreg(struct amdgpu_d
  {
        uint32_t ret;
  
 -      if (!(acc_flags & AMDGPU_REGS_NO_KIQ) && amdgpu_sriov_runtime(adev))
 -              return amdgpu_virt_kiq_rreg(adev, reg);
 +      if ((acc_flags & AMDGPU_REGS_KIQ) || (!(acc_flags & AMDGPU_REGS_NO_KIQ) && amdgpu_sriov_runtime(adev)))
 +              return amdgpu_kiq_rreg(adev, reg);
  
        if ((reg * 4) < adev->rmmio_size && !(acc_flags & AMDGPU_REGS_IDX))
                ret = readl(((void __iomem *)adev->rmmio) + (reg * 4));
@@@ -294,8 -293,8 +294,8 @@@ void amdgpu_mm_wreg(struct amdgpu_devic
                adev->last_mm_index = v;
        }
  
 -      if (!(acc_flags & AMDGPU_REGS_NO_KIQ) && amdgpu_sriov_runtime(adev))
 -              return amdgpu_virt_kiq_wreg(adev, reg, v);
 +      if ((acc_flags & AMDGPU_REGS_KIQ) || (!(acc_flags & AMDGPU_REGS_NO_KIQ) && amdgpu_sriov_runtime(adev)))
 +              return amdgpu_kiq_wreg(adev, reg, v);
  
        if ((reg * 4) < adev->rmmio_size && !(acc_flags & AMDGPU_REGS_IDX))
                writel(v, ((void __iomem *)adev->rmmio) + (reg * 4));
@@@ -985,7 -984,7 +985,7 @@@ static void amdgpu_device_check_vm_size
  static void amdgpu_device_check_smu_prv_buffer_size(struct amdgpu_device *adev)
  {
        struct sysinfo si;
 -      bool is_os_64 = (sizeof(void *) == 8) ? true : false;
 +      bool is_os_64 = (sizeof(void *) == 8);
        uint64_t total_memory;
        uint64_t dram_size_seven_GB = 0x1B8000000;
        uint64_t dram_size_three_GB = 0xB8000000;
@@@ -1032,6 -1031,8 +1032,6 @@@ def_value
   */
  static int amdgpu_device_check_arguments(struct amdgpu_device *adev)
  {
 -      int ret = 0;
 -
        if (amdgpu_sched_jobs < 4) {
                dev_warn(adev->dev, "sched jobs (%d) must be at least 4\n",
                         amdgpu_sched_jobs);
  
        adev->firmware.load_type = amdgpu_ucode_get_load_type(adev, amdgpu_fw_load_type);
  
 -      return ret;
 +      return 0;
  }
  
  /**
@@@ -1136,7 -1137,7 +1136,7 @@@ static bool amdgpu_switcheroo_can_switc
        * locking inversion with the driver load path. And the access here is
        * completely racy anyway. So don't bother with locking for now.
        */
-       return dev->open_count == 0;
+       return atomic_read(&dev->open_count) == 0;
  }
  
  static const struct vga_switcheroo_client_ops amdgpu_switcheroo_ops = {
@@@ -1809,8 -1810,7 +1809,8 @@@ static int amdgpu_device_fw_loading(str
                }
        }
  
 -      r = amdgpu_pm_load_smu_firmware(adev, &smu_version);
 +      if (!amdgpu_sriov_vf(adev) || adev->asic_type == CHIP_TONGA)
 +              r = amdgpu_pm_load_smu_firmware(adev, &smu_version);
  
        return r;
  }
@@@ -2345,7 -2345,14 +2345,7 @@@ static int amdgpu_device_ip_suspend_pha
                adev->ip_blocks[i].status.hw = false;
                /* handle putting the SMC in the appropriate state */
                if (adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_SMC) {
 -                      if (is_support_sw_smu(adev)) {
 -                              r = smu_set_mp1_state(&adev->smu, adev->mp1_state);
 -                      } else if (adev->powerplay.pp_funcs &&
 -                                         adev->powerplay.pp_funcs->set_mp1_state) {
 -                              r = adev->powerplay.pp_funcs->set_mp1_state(
 -                                      adev->powerplay.pp_handle,
 -                                      adev->mp1_state);
 -                      }
 +                      r = amdgpu_dpm_set_mp1_state(adev, adev->mp1_state);
                        if (r) {
                                DRM_ERROR("SMC failed to set mp1 state %d, %d\n",
                                          adev->mp1_state, r);
@@@ -2432,8 -2439,7 +2432,8 @@@ static int amdgpu_device_ip_reinit_late
                AMD_IP_BLOCK_TYPE_GFX,
                AMD_IP_BLOCK_TYPE_SDMA,
                AMD_IP_BLOCK_TYPE_UVD,
 -              AMD_IP_BLOCK_TYPE_VCE
 +              AMD_IP_BLOCK_TYPE_VCE,
 +              AMD_IP_BLOCK_TYPE_VCN
        };
  
        for (i = 0; i < ARRAY_SIZE(ip_order); i++) {
                                block->status.hw)
                                continue;
  
 -                      r = block->version->funcs->hw_init(adev);
 +                      if (block->version->type == AMD_IP_BLOCK_TYPE_SMC)
 +                              r = block->version->funcs->resume(adev);
 +                      else
 +                              r = block->version->funcs->hw_init(adev);
 +
                        DRM_INFO("RE-INIT-late: %s %s\n", block->version->funcs->name, r?"failed":"succeeded");
                        if (r)
                                return r;
@@@ -2661,38 -2663,14 +2661,38 @@@ static void amdgpu_device_xgmi_reset_fu
  {
        struct amdgpu_device *adev =
                container_of(__work, struct amdgpu_device, xgmi_reset_work);
 +      struct amdgpu_hive_info *hive = amdgpu_get_xgmi_hive(adev, 0);
  
 -      if (amdgpu_asic_reset_method(adev) == AMD_RESET_METHOD_BACO)
 -              adev->asic_reset_res = (adev->in_baco == false) ?
 -                              amdgpu_device_baco_enter(adev->ddev) :
 -                              amdgpu_device_baco_exit(adev->ddev);
 -      else
 -              adev->asic_reset_res = amdgpu_asic_reset(adev);
 +      /* It's a bug to not have a hive within this function */
 +      if (WARN_ON(!hive))
 +              return;
 +
 +      /*
 +       * Use task barrier to synchronize all xgmi reset works across the
 +       * hive. task_barrier_enter and task_barrier_exit will block
 +       * until all the threads running the xgmi reset works reach
 +       * those points. task_barrier_full will do both blocks.
 +       */
 +      if (amdgpu_asic_reset_method(adev) == AMD_RESET_METHOD_BACO) {
 +
 +              task_barrier_enter(&hive->tb);
 +              adev->asic_reset_res = amdgpu_device_baco_enter(adev->ddev);
 +
 +              if (adev->asic_reset_res)
 +                      goto fail;
 +
 +              task_barrier_exit(&hive->tb);
 +              adev->asic_reset_res = amdgpu_device_baco_exit(adev->ddev);
 +
 +              if (adev->asic_reset_res)
 +                      goto fail;
 +      } else {
  
 +              task_barrier_full(&hive->tb);
 +              adev->asic_reset_res =  amdgpu_asic_reset(adev);
 +      }
 +
 +fail:
        if (adev->asic_reset_res)
                DRM_WARN("ASIC reset failed with error, %d for drm dev, %s",
                         adev->asic_reset_res, adev->ddev->unique);
@@@ -2807,7 -2785,7 +2807,7 @@@ int amdgpu_device_init(struct amdgpu_de
        adev->mman.buffer_funcs = NULL;
        adev->mman.buffer_funcs_ring = NULL;
        adev->vm_manager.vm_pte_funcs = NULL;
 -      adev->vm_manager.vm_pte_num_rqs = 0;
 +      adev->vm_manager.vm_pte_num_scheds = 0;
        adev->gmc.gmc_funcs = NULL;
        adev->fence_context = dma_fence_context_alloc(AMDGPU_MAX_RINGS);
        bitmap_zero(adev->gfx.pipe_reserve_bitmap, AMDGPU_MAX_COMPUTE_QUEUES);
        hash_init(adev->mn_hash);
        mutex_init(&adev->lock_reset);
        mutex_init(&adev->psp.mutex);
 +      mutex_init(&adev->notifier_lock);
  
        r = amdgpu_device_check_arguments(adev);
        if (r)
@@@ -3052,14 -3029,6 +3052,14 @@@ fence_driver_init
                goto failed;
        }
  
 +      DRM_DEBUG("SE %d, SH per SE %d, CU per SH %d, active_cu_number %d\n",
 +                      adev->gfx.config.max_shader_engines,
 +                      adev->gfx.config.max_sh_per_se,
 +                      adev->gfx.config.max_cu_per_sh,
 +                      adev->gfx.cu_info.number);
 +
 +      amdgpu_ctx_init_sched(adev);
 +
        adev->accel_working = true;
  
        amdgpu_vm_check_compute_bug(adev);
@@@ -3691,6 -3660,8 +3691,6 @@@ static int amdgpu_device_reset_sriov(st
        if (r)
                return r;
  
 -      amdgpu_amdkfd_pre_reset(adev);
 -
        /* Resume IP prior to SMC */
        r = amdgpu_device_ip_reinit_early_sriov(adev);
        if (r)
@@@ -3759,11 -3730,6 +3759,11 @@@ bool amdgpu_device_should_recover_gpu(s
                case CHIP_VEGA10:
                case CHIP_VEGA12:
                case CHIP_RAVEN:
 +              case CHIP_ARCTURUS:
 +              case CHIP_RENOIR:
 +              case CHIP_NAVI10:
 +              case CHIP_NAVI14:
 +              case CHIP_NAVI12:
                        break;
                default:
                        goto disabled;
@@@ -3824,13 -3790,18 +3824,13 @@@ static int amdgpu_device_pre_asic_reset
        return r;
  }
  
 -static int amdgpu_do_asic_reset(struct amdgpu_device *adev,
 -                             struct amdgpu_hive_info *hive,
 +static int amdgpu_do_asic_reset(struct amdgpu_hive_info *hive,
                               struct list_head *device_list_handle,
                               bool *need_full_reset_arg)
  {
        struct amdgpu_device *tmp_adev = NULL;
        bool need_full_reset = *need_full_reset_arg, vram_lost = false;
        int r = 0;
 -      int cpu = smp_processor_id();
 -      bool use_baco =
 -              (amdgpu_asic_reset_method(adev) == AMD_RESET_METHOD_BACO) ?
 -              true : false;
  
        /*
         * ASIC reset has to be done on all HGMI hive nodes ASAP
         */
        if (need_full_reset) {
                list_for_each_entry(tmp_adev, device_list_handle, gmc.xgmi.head) {
 -                      /*
 -                       * For XGMI run all resets in parallel to speed up the
 -                       * process by scheduling the highpri wq on different
 -                       * cpus. For XGMI with baco reset, all nodes must enter
 -                       * baco within close proximity before anyone exit.
 -                       */
 +                      /* For XGMI run all resets in parallel to speed up the process */
                        if (tmp_adev->gmc.xgmi.num_physical_nodes > 1) {
 -                              if (!queue_work_on(cpu, system_highpri_wq,
 -                                                 &tmp_adev->xgmi_reset_work))
 +                              if (!queue_work(system_unbound_wq, &tmp_adev->xgmi_reset_work))
                                        r = -EALREADY;
 -                              cpu = cpumask_next(cpu, cpu_online_mask);
                        } else
                                r = amdgpu_asic_reset(tmp_adev);
 -                      if (r)
 -                              break;
 -              }
 -
 -              /* For XGMI wait for all work to complete before proceed */
 -              if (!r) {
 -                      list_for_each_entry(tmp_adev, device_list_handle,
 -                                          gmc.xgmi.head) {
 -                              if (tmp_adev->gmc.xgmi.num_physical_nodes > 1) {
 -                                      flush_work(&tmp_adev->xgmi_reset_work);
 -                                      r = tmp_adev->asic_reset_res;
 -                                      if (r)
 -                                              break;
 -                                      if (use_baco)
 -                                              tmp_adev->in_baco = true;
 -                              }
 -                      }
 -              }
 -
 -              /*
 -               * For XGMI with baco reset, need exit baco phase by scheduling
 -               * xgmi_reset_work one more time. PSP reset and sGPU skips this
 -               * phase. Not assume the situation that PSP reset and baco reset
 -               * coexist within an XGMI hive.
 -               */
  
 -              if (!r && use_baco) {
 -                      cpu = smp_processor_id();
 -                      list_for_each_entry(tmp_adev, device_list_handle,
 -                                          gmc.xgmi.head) {
 -                              if (tmp_adev->gmc.xgmi.num_physical_nodes > 1) {
 -                                      if (!queue_work_on(cpu,
 -                                              system_highpri_wq,
 -                                              &tmp_adev->xgmi_reset_work))
 -                                              r = -EALREADY;
 -                                      if (r)
 -                                              break;
 -                                      cpu = cpumask_next(cpu, cpu_online_mask);
 -                              }
 +                      if (r) {
 +                              DRM_ERROR("ASIC reset failed with error, %d for drm dev, %s",
 +                                       r, tmp_adev->ddev->unique);
 +                              break;
                        }
                }
  
 -              if (!r && use_baco) {
 +              /* For XGMI wait for all resets to complete before proceed */
 +              if (!r) {
                        list_for_each_entry(tmp_adev, device_list_handle,
                                            gmc.xgmi.head) {
                                if (tmp_adev->gmc.xgmi.num_physical_nodes > 1) {
                                        r = tmp_adev->asic_reset_res;
                                        if (r)
                                                break;
 -                                      tmp_adev->in_baco = false;
                                }
                        }
                }
 -
 -              if (r) {
 -                      DRM_ERROR("ASIC reset failed with error, %d for drm dev, %s",
 -                               r, tmp_adev->ddev->unique);
 -                      goto end;
 -              }
        }
  
        if (!r && amdgpu_ras_intr_triggered())
@@@ -3956,7 -3974,7 +3956,7 @@@ static bool amdgpu_device_lock_adev(str
                mutex_lock(&adev->lock_reset);
  
        atomic_inc(&adev->gpu_reset_counter);
 -      adev->in_gpu_reset = 1;
 +      adev->in_gpu_reset = true;
        switch (amdgpu_asic_reset_method(adev)) {
        case AMD_RESET_METHOD_MODE1:
                adev->mp1_state = PP_MP1_STATE_SHUTDOWN;
@@@ -3976,7 -3994,7 +3976,7 @@@ static void amdgpu_device_unlock_adev(s
  {
        amdgpu_vf_error_trans_all(adev);
        adev->mp1_state = PP_MP1_STATE_NONE;
 -      adev->in_gpu_reset = 0;
 +      adev->in_gpu_reset = false;
        mutex_unlock(&adev->lock_reset);
  }
  
@@@ -4157,7 -4175,8 +4157,7 @@@ retry:  /* Rest of adevs pre asic reset 
                if (r)
                        adev->asic_reset_res = r;
        } else {
 -              r  = amdgpu_do_asic_reset(adev, hive, device_list_handle,
 -                                        &need_full_reset);
 +              r  = amdgpu_do_asic_reset(hive, device_list_handle, &need_full_reset);
                if (r && r == -EAGAIN)
                        goto retry;
        }
@@@ -4358,21 -4377,55 +4358,21 @@@ int amdgpu_device_baco_enter(struct drm
        if (ras && ras->supported)
                adev->nbio.funcs->enable_doorbell_interrupt(adev, false);
  
 -      if (is_support_sw_smu(adev)) {
 -              struct smu_context *smu = &adev->smu;
 -              int ret;
 -
 -              ret = smu_baco_enter(smu);
 -              if (ret)
 -                      return ret;
 -      } else {
 -              void *pp_handle = adev->powerplay.pp_handle;
 -              const struct amd_pm_funcs *pp_funcs = adev->powerplay.pp_funcs;
 -
 -              if (!pp_funcs ||!pp_funcs->get_asic_baco_state ||!pp_funcs->set_asic_baco_state)
 -                      return -ENOENT;
 -
 -              /* enter BACO state */
 -              if (pp_funcs->set_asic_baco_state(pp_handle, 1))
 -                      return -EIO;
 -      }
 -
 -      return 0;
 +      return amdgpu_dpm_baco_enter(adev);
  }
  
  int amdgpu_device_baco_exit(struct drm_device *dev)
  {
        struct amdgpu_device *adev = dev->dev_private;
        struct amdgpu_ras *ras = amdgpu_ras_get_context(adev);
 +      int ret = 0;
  
        if (!amdgpu_device_supports_baco(adev->ddev))
                return -ENOTSUPP;
  
 -      if (is_support_sw_smu(adev)) {
 -              struct smu_context *smu = &adev->smu;
 -              int ret;
 -
 -              ret = smu_baco_exit(smu);
 -              if (ret)
 -                      return ret;
 -
 -      } else {
 -              void *pp_handle = adev->powerplay.pp_handle;
 -              const struct amd_pm_funcs *pp_funcs = adev->powerplay.pp_funcs;
 -
 -              if (!pp_funcs ||!pp_funcs->get_asic_baco_state ||!pp_funcs->set_asic_baco_state)
 -                      return -ENOENT;
 -
 -              /* exit BACO state */
 -              if (pp_funcs->set_asic_baco_state(pp_handle, 0))
 -                      return -EIO;
 -      }
 +      ret = amdgpu_dpm_baco_exit(adev);
 +      if (ret)
 +              return ret;
  
        if (ras && ras->supported)
                adev->nbio.funcs->enable_doorbell_interrupt(adev, true);
@@@ -41,7 -41,6 +41,7 @@@
  #include <linux/swap.h>
  #include <linux/swiotlb.h>
  #include <linux/dma-buf.h>
 +#include <linux/sizes.h>
  
  #include <drm/ttm/ttm_bo_api.h>
  #include <drm/ttm/ttm_bo_driver.h>
@@@ -69,11 -68,6 +69,6 @@@ static int amdgpu_map_buffer(struct ttm
  static int amdgpu_ttm_debugfs_init(struct amdgpu_device *adev);
  static void amdgpu_ttm_debugfs_fini(struct amdgpu_device *adev);
  
- static int amdgpu_invalidate_caches(struct ttm_bo_device *bdev, uint32_t flags)
- {
-       return 0;
- }
  /**
   * amdgpu_init_mem_type - Initialize a memory manager for a specific type of
   * memory request.
@@@ -1638,7 -1632,6 +1633,6 @@@ static struct ttm_bo_driver amdgpu_bo_d
        .ttm_tt_create = &amdgpu_ttm_tt_create,
        .ttm_tt_populate = &amdgpu_ttm_tt_populate,
        .ttm_tt_unpopulate = &amdgpu_ttm_tt_unpopulate,
-       .invalidate_caches = &amdgpu_invalidate_caches,
        .init_mem_type = &amdgpu_init_mem_type,
        .eviction_valuable = amdgpu_ttm_bo_eviction_valuable,
        .evict_flags = &amdgpu_evict_flags,
@@@ -1715,17 -1708,12 +1709,17 @@@ static int amdgpu_ttm_training_reserve_
        amdgpu_bo_free_kernel(&ctx->c2p_bo, NULL, NULL);
        ctx->c2p_bo = NULL;
  
 -      amdgpu_bo_free_kernel(&ctx->p2c_bo, NULL, NULL);
 -      ctx->p2c_bo = NULL;
 -
        return 0;
  }
  
 +static u64 amdgpu_ttm_training_get_c2p_offset(u64 vram_size)
 +{
 +       if ((vram_size & (SZ_1M - 1)) < (SZ_4K + 1) )
 +               vram_size -= SZ_1M;
 +
 +       return ALIGN(vram_size, SZ_1M);
 +}
 +
  /**
   * amdgpu_ttm_training_reserve_vram_init - create bo vram reservation from memory training
   *
@@@ -1744,7 -1732,7 +1738,7 @@@ static int amdgpu_ttm_training_reserve_
                return 0;
        }
  
 -      ctx->c2p_train_data_offset = adev->fw_vram_usage.mem_train_fb_loc;
 +      ctx->c2p_train_data_offset = amdgpu_ttm_training_get_c2p_offset(adev->gmc.mc_vram_size);
        ctx->p2c_train_data_offset = (adev->gmc.mc_vram_size - GDDR6_MEM_TRAINING_OFFSET);
        ctx->train_data_size = GDDR6_MEM_TRAINING_DATA_SIZE_IN_BYTES;
  
                  ctx->c2p_train_data_offset);
  
        ret = amdgpu_bo_create_kernel_at(adev,
 -                                       ctx->p2c_train_data_offset,
 -                                       ctx->train_data_size,
 -                                       AMDGPU_GEM_DOMAIN_VRAM,
 -                                       &ctx->p2c_bo,
 -                                       NULL);
 -      if (ret) {
 -              DRM_ERROR("alloc p2c_bo failed(%d)!\n", ret);
 -              goto Err_out;
 -      }
 -
 -      ret = amdgpu_bo_create_kernel_at(adev,
                                         ctx->c2p_train_data_offset,
                                         ctx->train_data_size,
                                         AMDGPU_GEM_DOMAIN_VRAM,
                                         NULL);
        if (ret) {
                DRM_ERROR("alloc c2p_bo failed(%d)!\n", ret);
 -              goto Err_out;
 +              amdgpu_ttm_training_reserve_vram_fini(adev);
 +              return ret;
        }
  
        ctx->init = PSP_MEM_TRAIN_RESERVE_SUCCESS;
        return 0;
 -
 -Err_out:
 -      amdgpu_ttm_training_reserve_vram_fini(adev);
 -      return ret;
  }
  
  /**
@@@ -1979,13 -1981,11 +1973,13 @@@ void amdgpu_ttm_set_buffer_funcs_status
  
        if (enable) {
                struct amdgpu_ring *ring;
 -              struct drm_sched_rq *rq;
 +              struct drm_gpu_scheduler *sched;
  
                ring = adev->mman.buffer_funcs_ring;
 -              rq = &ring->sched.sched_rq[DRM_SCHED_PRIORITY_KERNEL];
 -              r = drm_sched_entity_init(&adev->mman.entity, &rq, 1, NULL);
 +              sched = &ring->sched;
 +              r = drm_sched_entity_init(&adev->mman.entity,
 +                                        DRM_SCHED_PRIORITY_KERNEL, &sched,
 +                                        1, NULL);
                if (r) {
                        DRM_ERROR("Failed setting up TTM BO move entity (%d)\n",
                                  r);
@@@ -32,7 -32,6 +32,7 @@@
  #include <drm/drm_dp_helper.h>
  #include <drm/drm_print.h>
  #include <drm/drm_vblank.h>
 +#include <drm/drm_dp_mst_helper.h>
  
  #include "drm_crtc_helper_internal.h"
  
@@@ -267,7 -266,7 +267,7 @@@ unlock
  
  /**
   * drm_dp_dpcd_read() - read a series of bytes from the DPCD
 - * @aux: DisplayPort AUX channel
 + * @aux: DisplayPort AUX channel (SST or MST)
   * @offset: address of the (first) register to read
   * @buffer: buffer to store the register values
   * @size: number of bytes in @buffer
@@@ -296,18 -295,13 +296,18 @@@ ssize_t drm_dp_dpcd_read(struct drm_dp_
         * We just have to do it before any DPCD access and hope that the
         * monitor doesn't power down exactly after the throw away read.
         */
 -      ret = drm_dp_dpcd_access(aux, DP_AUX_NATIVE_READ, DP_DPCD_REV, buffer,
 -                               1);
 -      if (ret != 1)
 -              goto out;
 +      if (!aux->is_remote) {
 +              ret = drm_dp_dpcd_access(aux, DP_AUX_NATIVE_READ, DP_DPCD_REV,
 +                                       buffer, 1);
 +              if (ret != 1)
 +                      goto out;
 +      }
  
 -      ret = drm_dp_dpcd_access(aux, DP_AUX_NATIVE_READ, offset, buffer,
 -                               size);
 +      if (aux->is_remote)
 +              ret = drm_dp_mst_dpcd_read(aux, offset, buffer, size);
 +      else
 +              ret = drm_dp_dpcd_access(aux, DP_AUX_NATIVE_READ, offset,
 +                                       buffer, size);
  
  out:
        drm_dp_dump_access(aux, DP_AUX_NATIVE_READ, offset, buffer, ret);
@@@ -317,7 -311,7 +317,7 @@@ EXPORT_SYMBOL(drm_dp_dpcd_read)
  
  /**
   * drm_dp_dpcd_write() - write a series of bytes to the DPCD
 - * @aux: DisplayPort AUX channel
 + * @aux: DisplayPort AUX channel (SST or MST)
   * @offset: address of the (first) register to write
   * @buffer: buffer containing the values to write
   * @size: number of bytes in @buffer
@@@ -334,12 -328,8 +334,12 @@@ ssize_t drm_dp_dpcd_write(struct drm_dp
  {
        int ret;
  
 -      ret = drm_dp_dpcd_access(aux, DP_AUX_NATIVE_WRITE, offset, buffer,
 -                               size);
 +      if (aux->is_remote)
 +              ret = drm_dp_mst_dpcd_write(aux, offset, buffer, size);
 +      else
 +              ret = drm_dp_dpcd_access(aux, DP_AUX_NATIVE_WRITE, offset,
 +                                       buffer, size);
 +
        drm_dp_dump_access(aux, DP_AUX_NATIVE_WRITE, offset, buffer, ret);
        return ret;
  }
@@@ -470,8 -460,7 +470,7 @@@ void drm_dp_downstream_debug(struct seq
        int len;
        uint8_t rev[2];
        int type = port_cap[0] & DP_DS_PORT_TYPE_MASK;
-       bool branch_device = dpcd[DP_DOWNSTREAMPORT_PRESENT] &
-                            DP_DWN_STRM_PORT_PRESENT;
+       bool branch_device = drm_dp_is_branch(dpcd);
  
        seq_printf(m, "\tDP branch device present: %s\n",
                   branch_device ? "yes" : "no");
@@@ -979,19 -968,6 +978,19 @@@ static void drm_dp_aux_crc_work(struct 
  }
  
  /**
 + * drm_dp_remote_aux_init() - minimally initialise a remote aux channel
 + * @aux: DisplayPort AUX channel
 + *
 + * Used for remote aux channel in general. Merely initialize the crc work
 + * struct.
 + */
 +void drm_dp_remote_aux_init(struct drm_dp_aux *aux)
 +{
 +      INIT_WORK(&aux->crc_work, drm_dp_aux_crc_work);
 +}
 +EXPORT_SYMBOL(drm_dp_remote_aux_init);
 +
 +/**
   * drm_dp_aux_init() - minimally initialise an aux channel
   * @aux: DisplayPort AUX channel
   *
@@@ -1178,8 -1154,6 +1177,8 @@@ static const struct dpcd_quirk dpcd_qui
        { OUI(0x00, 0x10, 0xfa), DEVICE_ID_ANY, false, BIT(DP_DPCD_QUIRK_NO_PSR) },
        /* CH7511 seems to leave SINK_COUNT zeroed */
        { 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) },
  };
  
  #undef OUI
@@@ -398,7 -398,7 +398,7 @@@ drm_dp_encode_sideband_req(const struc
                        memcpy(&buf[idx], req->u.i2c_read.transactions[i].bytes, req->u.i2c_read.transactions[i].num_bytes);
                        idx += req->u.i2c_read.transactions[i].num_bytes;
  
 -                      buf[idx] = (req->u.i2c_read.transactions[i].no_stop_bit & 0x1) << 5;
 +                      buf[idx] = (req->u.i2c_read.transactions[i].no_stop_bit & 0x1) << 4;
                        buf[idx] |= (req->u.i2c_read.transactions[i].i2c_transaction_delay & 0xf);
                        idx++;
                }
@@@ -853,7 -853,6 +853,7 @@@ static bool drm_dp_sideband_parse_enum_
  {
        int idx = 1;
        repmsg->u.path_resources.port_number = (raw->msg[idx] >> 4) & 0xf;
 +      repmsg->u.path_resources.fec_capable = raw->msg[idx] & 0x1;
        idx++;
        if (idx > raw->curlen)
                goto fail_len;
@@@ -1209,8 -1208,6 +1209,8 @@@ static int drm_dp_mst_wait_tx_reply(str
                    txmsg->state == DRM_DP_SIDEBAND_TX_SENT) {
                        mstb->tx_slots[txmsg->seqno] = NULL;
                }
 +              mgr->is_waiting_for_dwn_reply = false;
 +
        }
  out:
        if (unlikely(ret == -EIO) && drm_debug_enabled(DRM_UT_DP)) {
        }
        mutex_unlock(&mgr->qlock);
  
 +      drm_dp_mst_kick_tx(mgr);
        return ret;
  }
  
@@@ -1935,90 -1931,73 +1935,90 @@@ static u8 drm_dp_calculate_rad(struct d
        return parent_lct + 1;
  }
  
 -static int drm_dp_port_set_pdt(struct drm_dp_mst_port *port, u8 new_pdt)
 +static bool drm_dp_mst_is_dp_mst_end_device(u8 pdt, bool mcs)
 +{
 +      switch (pdt) {
 +      case DP_PEER_DEVICE_DP_LEGACY_CONV:
 +      case DP_PEER_DEVICE_SST_SINK:
 +              return true;
 +      case DP_PEER_DEVICE_MST_BRANCHING:
 +              /* For sst branch device */
 +              if (!mcs)
 +                      return true;
 +
 +              return false;
 +      }
 +      return true;
 +}
 +
 +static int
 +drm_dp_port_set_pdt(struct drm_dp_mst_port *port, u8 new_pdt,
 +                  bool new_mcs)
  {
        struct drm_dp_mst_topology_mgr *mgr = port->mgr;
        struct drm_dp_mst_branch *mstb;
        u8 rad[8], lct;
        int ret = 0;
  
 -      if (port->pdt == new_pdt)
 +      if (port->pdt == new_pdt && port->mcs == new_mcs)
                return 0;
  
        /* Teardown the old pdt, if there is one */
 -      switch (port->pdt) {
 -      case DP_PEER_DEVICE_DP_LEGACY_CONV:
 -      case DP_PEER_DEVICE_SST_SINK:
 -              /*
 -               * If the new PDT would also have an i2c bus, don't bother
 -               * with reregistering it
 -               */
 -              if (new_pdt == DP_PEER_DEVICE_DP_LEGACY_CONV ||
 -                  new_pdt == DP_PEER_DEVICE_SST_SINK) {
 -                      port->pdt = new_pdt;
 -                      return 0;
 -              }
 +      if (port->pdt != DP_PEER_DEVICE_NONE) {
 +              if (drm_dp_mst_is_dp_mst_end_device(port->pdt, port->mcs)) {
 +                      /*
 +                       * If the new PDT would also have an i2c bus,
 +                       * don't bother with reregistering it
 +                       */
 +                      if (new_pdt != DP_PEER_DEVICE_NONE &&
 +                          drm_dp_mst_is_dp_mst_end_device(new_pdt, new_mcs)) {
 +                              port->pdt = new_pdt;
 +                              port->mcs = new_mcs;
 +                              return 0;
 +                      }
  
 -              /* remove i2c over sideband */
 -              drm_dp_mst_unregister_i2c_bus(&port->aux);
 -              break;
 -      case DP_PEER_DEVICE_MST_BRANCHING:
 -              mutex_lock(&mgr->lock);
 -              drm_dp_mst_topology_put_mstb(port->mstb);
 -              port->mstb = NULL;
 -              mutex_unlock(&mgr->lock);
 -              break;
 +                      /* remove i2c over sideband */
 +                      drm_dp_mst_unregister_i2c_bus(&port->aux);
 +              } else {
 +                      mutex_lock(&mgr->lock);
 +                      drm_dp_mst_topology_put_mstb(port->mstb);
 +                      port->mstb = NULL;
 +                      mutex_unlock(&mgr->lock);
 +              }
        }
  
        port->pdt = new_pdt;
 -      switch (port->pdt) {
 -      case DP_PEER_DEVICE_DP_LEGACY_CONV:
 -      case DP_PEER_DEVICE_SST_SINK:
 -              /* add i2c over sideband */
 -              ret = drm_dp_mst_register_i2c_bus(&port->aux);
 -              break;
 +      port->mcs = new_mcs;
  
 -      case DP_PEER_DEVICE_MST_BRANCHING:
 -              lct = drm_dp_calculate_rad(port, rad);
 -              mstb = drm_dp_add_mst_branch_device(lct, rad);
 -              if (!mstb) {
 -                      ret = -ENOMEM;
 -                      DRM_ERROR("Failed to create MSTB for port %p", port);
 -                      goto out;
 -              }
 +      if (port->pdt != DP_PEER_DEVICE_NONE) {
 +              if (drm_dp_mst_is_dp_mst_end_device(port->pdt, port->mcs)) {
 +                      /* add i2c over sideband */
 +                      ret = drm_dp_mst_register_i2c_bus(&port->aux);
 +              } else {
 +                      lct = drm_dp_calculate_rad(port, rad);
 +                      mstb = drm_dp_add_mst_branch_device(lct, rad);
 +                      if (!mstb) {
 +                              ret = -ENOMEM;
 +                              DRM_ERROR("Failed to create MSTB for port %p",
 +                                        port);
 +                              goto out;
 +                      }
  
 -              mutex_lock(&mgr->lock);
 -              port->mstb = mstb;
 -              mstb->mgr = port->mgr;
 -              mstb->port_parent = port;
 +                      mutex_lock(&mgr->lock);
 +                      port->mstb = mstb;
 +                      mstb->mgr = port->mgr;
 +                      mstb->port_parent = port;
  
 -              /*
 -               * Make sure this port's memory allocation stays
 -               * around until its child MSTB releases it
 -               */
 -              drm_dp_mst_get_port_malloc(port);
 -              mutex_unlock(&mgr->lock);
 +                      /*
 +                       * Make sure this port's memory allocation stays
 +                       * around until its child MSTB releases it
 +                       */
 +                      drm_dp_mst_get_port_malloc(port);
 +                      mutex_unlock(&mgr->lock);
  
 -              /* And make sure we send a link address for this */
 -              ret = 1;
 -              break;
 +                      /* And make sure we send a link address for this */
 +                      ret = 1;
 +              }
        }
  
  out:
@@@ -2171,8 -2150,9 +2171,8 @@@ drm_dp_mst_port_add_connector(struct dr
                goto error;
        }
  
 -      if ((port->pdt == DP_PEER_DEVICE_DP_LEGACY_CONV ||
 -           port->pdt == DP_PEER_DEVICE_SST_SINK) &&
 -          port->port_num >= DP_MST_LOGICAL_PORT_0) {
 +      if (port->pdt != DP_PEER_DEVICE_NONE &&
 +          drm_dp_mst_is_dp_mst_end_device(port->pdt, port->mcs)) {
                port->cached_edid = drm_get_edid(port->connector,
                                                 &port->aux.ddc);
                drm_connector_set_tile_property(port->connector);
@@@ -2194,7 -2174,6 +2194,7 @@@ drm_dp_mst_topology_unlink_port(struct 
                                struct drm_dp_mst_port *port)
  {
        mutex_lock(&mgr->lock);
 +      port->parent->num_ports--;
        list_del(&port->next);
        mutex_unlock(&mgr->lock);
        drm_dp_mst_topology_put_port(port);
@@@ -2219,9 -2198,6 +2219,9 @@@ drm_dp_mst_add_port(struct drm_device *
        port->aux.dev = dev->dev;
        port->aux.is_remote = true;
  
 +      /* initialize the MST downstream port's AUX crc work queue */
 +      drm_dp_remote_aux_init(&port->aux);
 +
        /*
         * Make sure the memory allocation for our parent branch stays
         * around until our own memory allocation is released
@@@ -2240,7 -2216,6 +2240,7 @@@ drm_dp_mst_handle_link_address_port(str
        struct drm_dp_mst_port *port;
        int old_ddps = 0, ret;
        u8 new_pdt = DP_PEER_DEVICE_NONE;
 +      bool new_mcs = 0;
        bool created = false, send_link_addr = false, changed = false;
  
        port = drm_dp_get_port(mstb, port_msg->port_number);
        port->input = port_msg->input_port;
        if (!port->input)
                new_pdt = port_msg->peer_device_type;
 -      port->mcs = port_msg->mcs;
 +      new_mcs = port_msg->mcs;
        port->ddps = port_msg->ddps;
        port->ldps = port_msg->legacy_device_plug_status;
        port->dpcd_rev = port_msg->dpcd_revision;
                mutex_lock(&mgr->lock);
                drm_dp_mst_topology_get_port(port);
                list_add(&port->next, &mstb->ports);
 +              mstb->num_ports++;
                mutex_unlock(&mgr->lock);
        }
  
                }
        }
  
 -      ret = drm_dp_port_set_pdt(port, new_pdt);
 +      ret = drm_dp_port_set_pdt(port, new_pdt, new_mcs);
        if (ret == 1) {
                send_link_addr = true;
        } else if (ret < 0) {
         * we're coming out of suspend. In this case, always resend the link
         * address if there's an MSTB on this port
         */
 -      if (!created && port->pdt == DP_PEER_DEVICE_MST_BRANCHING)
 +      if (!created && port->pdt == DP_PEER_DEVICE_MST_BRANCHING &&
 +          port->mcs)
                send_link_addr = true;
  
        if (port->connector)
@@@ -2363,9 -2336,8 +2363,9 @@@ drm_dp_mst_handle_conn_stat(struct drm_
  {
        struct drm_dp_mst_topology_mgr *mgr = mstb->mgr;
        struct drm_dp_mst_port *port;
 -      int old_ddps, ret;
 +      int old_ddps, old_input, ret, i;
        u8 new_pdt;
 +      bool new_mcs;
        bool dowork = false, create_connector = false;
  
        port = drm_dp_get_port(mstb, conn_stat->port_number);
        }
  
        old_ddps = port->ddps;
 +      old_input = port->input;
        port->input = conn_stat->input_port;
 -      port->mcs = conn_stat->message_capability_status;
        port->ldps = conn_stat->legacy_device_plug_status;
        port->ddps = conn_stat->displayport_device_plug_status;
  
        }
  
        new_pdt = port->input ? DP_PEER_DEVICE_NONE : conn_stat->peer_device_type;
 -
 -      ret = drm_dp_port_set_pdt(port, new_pdt);
 +      new_mcs = conn_stat->message_capability_status;
 +      ret = drm_dp_port_set_pdt(port, new_pdt, new_mcs);
        if (ret == 1) {
                dowork = true;
        } else if (ret < 0) {
                dowork = false;
        }
  
 +      if (!old_input && old_ddps != port->ddps && !port->ddps) {
 +              for (i = 0; i < mgr->max_payloads; i++) {
 +                      struct drm_dp_vcpi *vcpi = mgr->proposed_vcpis[i];
 +                      struct drm_dp_mst_port *port_validated;
 +
 +                      if (!vcpi)
 +                              continue;
 +
 +                      port_validated =
 +                              container_of(vcpi, struct drm_dp_mst_port, vcpi);
 +                      port_validated =
 +                              drm_dp_mst_topology_get_port_validated(mgr, port_validated);
 +                      if (!port_validated) {
 +                              mutex_lock(&mgr->payload_lock);
 +                              vcpi->num_slots = 0;
 +                              mutex_unlock(&mgr->payload_lock);
 +                      } else {
 +                              drm_dp_mst_topology_put_port(port_validated);
 +                      }
 +              }
 +      }
 +
        if (port->connector)
                drm_modeset_unlock(&mgr->base.lock);
        else if (create_connector)
@@@ -2803,11 -2753,9 +2803,11 @@@ static void process_single_down_tx_qloc
        ret = process_single_tx_qlock(mgr, txmsg, false);
        if (ret == 1) {
                /* txmsg is sent it should be in the slots now */
 +              mgr->is_waiting_for_dwn_reply = true;
                list_del(&txmsg->next);
        } else if (ret) {
                DRM_DEBUG_KMS("failed to send msg in q %d\n", ret);
 +              mgr->is_waiting_for_dwn_reply = false;
                list_del(&txmsg->next);
                if (txmsg->seqno != -1)
                        txmsg->dst->tx_slots[txmsg->seqno] = NULL;
@@@ -2847,8 -2795,7 +2847,8 @@@ static void drm_dp_queue_down_tx(struc
                drm_dp_mst_dump_sideband_msg_tx(&p, txmsg);
        }
  
 -      if (list_is_singular(&mgr->tx_msg_downq))
 +      if (list_is_singular(&mgr->tx_msg_downq) &&
 +          !mgr->is_waiting_for_dwn_reply)
                process_single_down_tx_qlock(mgr);
        mutex_unlock(&mgr->qlock);
  }
@@@ -3004,7 -2951,6 +3004,7 @@@ drm_dp_send_enum_path_resources(struct 
                                      path_res->avail_payload_bw_number);
                        port->available_pbn =
                                path_res->avail_payload_bw_number;
 +                      port->fec_capable = path_res->fec_capable;
                }
        }
  
@@@ -3499,9 -3445,9 +3499,9 @@@ static int drm_dp_get_vc_payload_bw(u8 
  int drm_dp_mst_topology_mgr_set_mst(struct drm_dp_mst_topology_mgr *mgr, bool mst_state)
  {
        int ret = 0;
-       int i = 0;
        struct drm_dp_mst_branch *mstb = NULL;
  
+       mutex_lock(&mgr->payload_lock);
        mutex_lock(&mgr->lock);
        if (mst_state == mgr->mst_state)
                goto out_unlock;
        mgr->mst_state = mst_state;
        /* set the device into MST mode */
        if (mst_state) {
+               struct drm_dp_payload reset_pay;
                WARN_ON(mgr->mst_primary);
  
                /* get dpcd info */
                drm_dp_mst_topology_get_mstb(mgr->mst_primary);
  
                ret = drm_dp_dpcd_writeb(mgr->aux, DP_MSTM_CTRL,
-                                                        DP_MST_EN | DP_UP_REQ_EN | DP_UPSTREAM_IS_SRC);
-               if (ret < 0) {
+                                        DP_MST_EN |
+                                        DP_UP_REQ_EN |
+                                        DP_UPSTREAM_IS_SRC);
+               if (ret < 0)
                        goto out_unlock;
-               }
  
-               {
-                       struct drm_dp_payload reset_pay;
-                       reset_pay.start_slot = 0;
-                       reset_pay.num_slots = 0x3f;
-                       drm_dp_dpcd_write_payload(mgr, 0, &reset_pay);
-               }
+               reset_pay.start_slot = 0;
+               reset_pay.num_slots = 0x3f;
+               drm_dp_dpcd_write_payload(mgr, 0, &reset_pay);
  
                queue_work(system_long_wq, &mgr->work);
  
                /* this can fail if the device is gone */
                drm_dp_dpcd_writeb(mgr->aux, DP_MSTM_CTRL, 0);
                ret = 0;
-               mutex_lock(&mgr->payload_lock);
-               memset(mgr->payloads, 0, mgr->max_payloads * sizeof(struct drm_dp_payload));
+               memset(mgr->payloads, 0,
+                      mgr->max_payloads * sizeof(mgr->payloads[0]));
+               memset(mgr->proposed_vcpis, 0,
+                      mgr->max_payloads * sizeof(mgr->proposed_vcpis[0]));
                mgr->payload_mask = 0;
                set_bit(0, &mgr->payload_mask);
-               for (i = 0; i < mgr->max_payloads; i++) {
-                       struct drm_dp_vcpi *vcpi = mgr->proposed_vcpis[i];
-                       if (vcpi) {
-                               vcpi->vcpi = 0;
-                               vcpi->num_slots = 0;
-                       }
-                       mgr->proposed_vcpis[i] = NULL;
-               }
                mgr->vcpi_mask = 0;
-               mutex_unlock(&mgr->payload_lock);
                mgr->payload_id_table_cleared = false;
        }
  
  out_unlock:
        mutex_unlock(&mgr->lock);
+       mutex_unlock(&mgr->payload_lock);
        if (mstb)
                drm_dp_mst_topology_put_mstb(mstb);
        return ret;
@@@ -3708,7 -3646,7 +3700,7 @@@ static bool drm_dp_get_one_sb_msg(struc
  {
        int len;
        u8 replyblock[32];
-       int replylen, origlen, curreply;
+       int replylen, curreply;
        int ret;
        struct drm_dp_sideband_msg_rx *msg;
        int basereg = up ? DP_SIDEBAND_MSG_UP_REQ_BASE : DP_SIDEBAND_MSG_DOWN_REP_BASE;
        }
        replylen = msg->curchunk_len + msg->curchunk_hdrlen;
  
-       origlen = replylen;
        replylen -= len;
        curreply = len;
        while (replylen > 0) {
@@@ -3803,7 -3740,6 +3794,7 @@@ static int drm_dp_mst_handle_down_rep(s
        mutex_lock(&mgr->qlock);
        txmsg->state = DRM_DP_SIDEBAND_TX_RX;
        mstb->tx_slots[slot] = NULL;
 +      mgr->is_waiting_for_dwn_reply = false;
        mutex_unlock(&mgr->qlock);
  
        wake_up_all(&mgr->tx_waitq);
  no_msg:
        drm_dp_mst_topology_put_mstb(mstb);
  clear_down_rep_recv:
 +      mutex_lock(&mgr->qlock);
 +      mgr->is_waiting_for_dwn_reply = false;
 +      mutex_unlock(&mgr->qlock);
        memset(&mgr->down_rep_recv, 0, sizeof(struct drm_dp_sideband_msg_rx));
  
        return 0;
@@@ -3838,8 -3771,7 +3829,8 @@@ drm_dp_mst_process_up_req(struct drm_dp
                else if (msg->req_type == DP_RESOURCE_STATUS_NOTIFY)
                        guid = msg->u.resource_stat.guid;
  
 -              mstb = drm_dp_get_mst_branch_device_by_guid(mgr, guid);
 +              if (guid)
 +                      mstb = drm_dp_get_mst_branch_device_by_guid(mgr, guid);
        } else {
                mstb = drm_dp_get_mst_branch_device(mgr, hdr->lct, hdr->rad);
        }
@@@ -4026,8 -3958,6 +4017,8 @@@ drm_dp_mst_detect_port(struct drm_conne
        switch (port->pdt) {
        case DP_PEER_DEVICE_NONE:
        case DP_PEER_DEVICE_MST_BRANCHING:
 +              if (!port->mcs)
 +                      ret = connector_status_connected;
                break;
  
        case DP_PEER_DEVICE_SST_SINK:
@@@ -4150,7 -4080,6 +4141,7 @@@ static int drm_dp_init_vcpi(struct drm_
   * @mgr: MST topology manager for the port
   * @port: port to find vcpi slots for
   * @pbn: bandwidth required for the mode in PBN
 + * @pbn_div: divider for DSC mode that takes FEC into account
   *
   * Allocates VCPI slots to @port, replacing any previous VCPI allocations it
   * may have had. Any atomic drivers which support MST must call this function
   */
  int drm_dp_atomic_find_vcpi_slots(struct drm_atomic_state *state,
                                  struct drm_dp_mst_topology_mgr *mgr,
 -                                struct drm_dp_mst_port *port, int pbn)
 +                                struct drm_dp_mst_port *port, int pbn,
 +                                int pbn_div)
  {
        struct drm_dp_mst_topology_state *topology_state;
        struct drm_dp_vcpi_allocation *pos, *vcpi = NULL;
 -      int prev_slots, req_slots;
 +      int prev_slots, prev_bw, req_slots;
  
        topology_state = drm_atomic_get_mst_topology_state(state, mgr);
        if (IS_ERR(topology_state))
                if (pos->port == port) {
                        vcpi = pos;
                        prev_slots = vcpi->vcpi;
 +                      prev_bw = vcpi->pbn;
  
                        /*
                         * This should never happen, unless the driver tries
                        break;
                }
        }
 -      if (!vcpi)
 +      if (!vcpi) {
                prev_slots = 0;
 +              prev_bw = 0;
 +      }
  
 -      req_slots = DIV_ROUND_UP(pbn, mgr->pbn_div);
 +      if (pbn_div <= 0)
 +              pbn_div = mgr->pbn_div;
 +
 +      req_slots = DIV_ROUND_UP(pbn, pbn_div);
  
        DRM_DEBUG_ATOMIC("[CONNECTOR:%d:%s] [MST PORT:%p] VCPI %d -> %d\n",
                         port->connector->base.id, port->connector->name,
                         port, prev_slots, req_slots);
 +      DRM_DEBUG_ATOMIC("[CONNECTOR:%d:%s] [MST PORT:%p] PBN %d -> %d\n",
 +                       port->connector->base.id, port->connector->name,
 +                       port, prev_bw, pbn);
  
        /* Add the new allocation to the state */
        if (!vcpi) {
                list_add(&vcpi->next, &topology_state->vcpis);
        }
        vcpi->vcpi = req_slots;
 +      vcpi->pbn = pbn;
  
        return req_slots;
  }
@@@ -4488,11 -4406,10 +4479,11 @@@ EXPORT_SYMBOL(drm_dp_check_act_status)
   * drm_dp_calc_pbn_mode() - Calculate the PBN for a mode.
   * @clock: dot clock for the mode
   * @bpp: bpp for the mode.
 + * @dsc: DSC mode. If true, bpp has units of 1/16 of a bit per pixel
   *
   * This uses the formula in the spec to calculate the PBN value for a mode.
   */
 -int drm_dp_calc_pbn_mode(int clock, int bpp)
 +int drm_dp_calc_pbn_mode(int clock, int bpp, bool dsc)
  {
        /*
         * margin 5300ppm + 300ppm ~ 0.6% as per spec, factor is 1.006
         * peak_kbps *= (1006/1000)
         * peak_kbps *= (64/54)
         * peak_kbps *= 8    convert to bytes
 +       *
 +       * If the bpp is in units of 1/16, further divide by 16. Put this
 +       * factor in the numerator rather than the denominator to avoid
 +       * integer overflow
         */
 +
 +      if (dsc)
 +              return DIV_ROUND_UP_ULL(mul_u32_u32(clock * (bpp / 16), 64 * 1006),
 +                                      8 * 54 * 1000 * 1000);
 +
        return DIV_ROUND_UP_ULL(mul_u32_u32(clock * bpp, 64 * 1006),
                                8 * 54 * 1000 * 1000);
  }
@@@ -4651,7 -4559,7 +4642,7 @@@ static void drm_dp_tx_work(struct work_
        struct drm_dp_mst_topology_mgr *mgr = container_of(work, struct drm_dp_mst_topology_mgr, tx_work);
  
        mutex_lock(&mgr->qlock);
 -      if (!list_empty(&mgr->tx_msg_downq))
 +      if (!list_empty(&mgr->tx_msg_downq) && !mgr->is_waiting_for_dwn_reply)
                process_single_down_tx_qlock(mgr);
        mutex_unlock(&mgr->qlock);
  }
@@@ -4662,7 -4570,7 +4653,7 @@@ drm_dp_delayed_destroy_port(struct drm_
        if (port->connector)
                port->mgr->cbs->destroy_connector(port->mgr, port->connector);
  
 -      drm_dp_port_set_pdt(port, DP_PEER_DEVICE_NONE);
 +      drm_dp_port_set_pdt(port, DP_PEER_DEVICE_NONE, port->mcs);
        drm_dp_mst_put_port_malloc(port);
  }
  
@@@ -4814,61 -4722,9 +4805,61 @@@ static void drm_dp_mst_destroy_state(st
        kfree(mst_state);
  }
  
 +static bool drm_dp_mst_port_downstream_of_branch(struct drm_dp_mst_port *port,
 +                                               struct drm_dp_mst_branch *branch)
 +{
 +      while (port->parent) {
 +              if (port->parent == branch)
 +                      return true;
 +
 +              if (port->parent->port_parent)
 +                      port = port->parent->port_parent;
 +              else
 +                      break;
 +      }
 +      return false;
 +}
 +
 +static inline
 +int drm_dp_mst_atomic_check_bw_limit(struct drm_dp_mst_branch *branch,
 +                                   struct drm_dp_mst_topology_state *mst_state)
 +{
 +      struct drm_dp_mst_port *port;
 +      struct drm_dp_vcpi_allocation *vcpi;
 +      int pbn_limit = 0, pbn_used = 0;
 +
 +      list_for_each_entry(port, &branch->ports, next) {
 +              if (port->mstb)
 +                      if (drm_dp_mst_atomic_check_bw_limit(port->mstb, mst_state))
 +                              return -ENOSPC;
 +
 +              if (port->available_pbn > 0)
 +                      pbn_limit = port->available_pbn;
 +      }
 +      DRM_DEBUG_ATOMIC("[MST BRANCH:%p] branch has %d PBN available\n",
 +                       branch, pbn_limit);
 +
 +      list_for_each_entry(vcpi, &mst_state->vcpis, next) {
 +              if (!vcpi->pbn)
 +                      continue;
 +
 +              if (drm_dp_mst_port_downstream_of_branch(vcpi->port, branch))
 +                      pbn_used += vcpi->pbn;
 +      }
 +      DRM_DEBUG_ATOMIC("[MST BRANCH:%p] branch used %d PBN\n",
 +                       branch, pbn_used);
 +
 +      if (pbn_used > pbn_limit) {
 +              DRM_DEBUG_ATOMIC("[MST BRANCH:%p] No available bandwidth\n",
 +                               branch);
 +              return -ENOSPC;
 +      }
 +      return 0;
 +}
 +
  static inline int
 -drm_dp_mst_atomic_check_topology_state(struct drm_dp_mst_topology_mgr *mgr,
 -                                     struct drm_dp_mst_topology_state *mst_state)
 +drm_dp_mst_atomic_check_vcpi_alloc_limit(struct drm_dp_mst_topology_mgr *mgr,
 +                                       struct drm_dp_mst_topology_state *mst_state)
  {
        struct drm_dp_vcpi_allocation *vcpi;
        int avail_slots = 63, payload_count = 0;
  }
  
  /**
 + * drm_dp_mst_add_affected_dsc_crtcs
 + * @state: Pointer to the new struct drm_dp_mst_topology_state
 + * @mgr: MST topology manager
 + *
 + * Whenever there is a change in mst topology
 + * DSC configuration would have to be recalculated
 + * therefore we need to trigger modeset on all affected
 + * CRTCs in that topology
 + *
 + * See also:
 + * drm_dp_mst_atomic_enable_dsc()
 + */
 +int drm_dp_mst_add_affected_dsc_crtcs(struct drm_atomic_state *state, struct drm_dp_mst_topology_mgr *mgr)
 +{
 +      struct drm_dp_mst_topology_state *mst_state;
 +      struct drm_dp_vcpi_allocation *pos;
 +      struct drm_connector *connector;
 +      struct drm_connector_state *conn_state;
 +      struct drm_crtc *crtc;
 +      struct drm_crtc_state *crtc_state;
 +
 +      mst_state = drm_atomic_get_mst_topology_state(state, mgr);
 +
 +      if (IS_ERR(mst_state))
 +              return -EINVAL;
 +
 +      list_for_each_entry(pos, &mst_state->vcpis, next) {
 +
 +              connector = pos->port->connector;
 +
 +              if (!connector)
 +                      return -EINVAL;
 +
 +              conn_state = drm_atomic_get_connector_state(state, connector);
 +
 +              if (IS_ERR(conn_state))
 +                      return PTR_ERR(conn_state);
 +
 +              crtc = conn_state->crtc;
 +
 +              if (WARN_ON(!crtc))
 +                      return -EINVAL;
 +
 +              if (!drm_dp_mst_dsc_aux_for_port(pos->port))
 +                      continue;
 +
 +              crtc_state = drm_atomic_get_crtc_state(mst_state->base.state, crtc);
 +
 +              if (IS_ERR(crtc_state))
 +                      return PTR_ERR(crtc_state);
 +
 +              DRM_DEBUG_ATOMIC("[MST MGR:%p] Setting mode_changed flag on CRTC %p\n",
 +                               mgr, crtc);
 +
 +              crtc_state->mode_changed = true;
 +      }
 +      return 0;
 +}
 +EXPORT_SYMBOL(drm_dp_mst_add_affected_dsc_crtcs);
 +
 +/**
 + * drm_dp_mst_atomic_enable_dsc - Set DSC Enable Flag to On/Off
 + * @state: Pointer to the new drm_atomic_state
 + * @port: Pointer to the affected MST Port
 + * @pbn: Newly recalculated bw required for link with DSC enabled
 + * @pbn_div: Divider to calculate correct number of pbn per slot
 + * @enable: Boolean flag to enable or disable DSC on the port
 + *
 + * This function enables DSC on the given Port
 + * by recalculating its vcpi from pbn provided
 + * and sets dsc_enable flag to keep track of which
 + * ports have DSC enabled
 + *
 + */
 +int drm_dp_mst_atomic_enable_dsc(struct drm_atomic_state *state,
 +                               struct drm_dp_mst_port *port,
 +                               int pbn, int pbn_div,
 +                               bool enable)
 +{
 +      struct drm_dp_mst_topology_state *mst_state;
 +      struct drm_dp_vcpi_allocation *pos;
 +      bool found = false;
 +      int vcpi = 0;
 +
 +      mst_state = drm_atomic_get_mst_topology_state(state, port->mgr);
 +
 +      if (IS_ERR(mst_state))
 +              return PTR_ERR(mst_state);
 +
 +      list_for_each_entry(pos, &mst_state->vcpis, next) {
 +              if (pos->port == port) {
 +                      found = true;
 +                      break;
 +              }
 +      }
 +
 +      if (!found) {
 +              DRM_DEBUG_ATOMIC("[MST PORT:%p] Couldn't find VCPI allocation in mst state %p\n",
 +                               port, mst_state);
 +              return -EINVAL;
 +      }
 +
 +      if (pos->dsc_enabled == enable) {
 +              DRM_DEBUG_ATOMIC("[MST PORT:%p] DSC flag is already set to %d, returning %d VCPI slots\n",
 +                               port, enable, pos->vcpi);
 +              vcpi = pos->vcpi;
 +      }
 +
 +      if (enable) {
 +              vcpi = drm_dp_atomic_find_vcpi_slots(state, port->mgr, port, pbn, pbn_div);
 +              DRM_DEBUG_ATOMIC("[MST PORT:%p] Enabling DSC flag, reallocating %d VCPI slots on the port\n",
 +                               port, vcpi);
 +              if (vcpi < 0)
 +                      return -EINVAL;
 +      }
 +
 +      pos->dsc_enabled = enable;
 +
 +      return vcpi;
 +}
 +EXPORT_SYMBOL(drm_dp_mst_atomic_enable_dsc);
 +/**
   * drm_dp_mst_atomic_check - Check that the new state of an MST topology in an
   * atomic update is valid
   * @state: Pointer to the new &struct drm_dp_mst_topology_state
@@@ -5055,13 -4789,7 +5046,13 @@@ int drm_dp_mst_atomic_check(struct drm_
        int i, ret = 0;
  
        for_each_new_mst_mgr_in_state(state, mgr, mst_state, i) {
 -              ret = drm_dp_mst_atomic_check_topology_state(mgr, mst_state);
 +              if (!mgr->mst_state)
 +                      continue;
 +
 +              ret = drm_dp_mst_atomic_check_vcpi_alloc_limit(mgr, mst_state);
 +              if (ret)
 +                      break;
 +              ret = drm_dp_mst_atomic_check_bw_limit(mgr->mst_primary, mst_state);
                if (ret)
                        break;
        }
@@@ -5325,173 -5053,3 +5316,173 @@@ static void drm_dp_mst_unregister_i2c_b
  {
        i2c_del_adapter(&aux->ddc);
  }
 +
 +/**
 + * drm_dp_mst_is_virtual_dpcd() - Is the given port a virtual DP Peer Device
 + * @port: The port to check
 + *
 + * A single physical MST hub object can be represented in the topology
 + * by multiple branches, with virtual ports between those branches.
 + *
 + * As of DP1.4, An MST hub with internal (virtual) ports must expose
 + * certain DPCD registers over those ports. See sections 2.6.1.1.1
 + * and 2.6.1.1.2 of Display Port specification v1.4 for details.
 + *
 + * May acquire mgr->lock
 + *
 + * Returns:
 + * true if the port is a virtual DP peer device, false otherwise
 + */
 +static bool drm_dp_mst_is_virtual_dpcd(struct drm_dp_mst_port *port)
 +{
 +      struct drm_dp_mst_port *downstream_port;
 +
 +      if (!port || port->dpcd_rev < DP_DPCD_REV_14)
 +              return false;
 +
 +      /* Virtual DP Sink (Internal Display Panel) */
 +      if (port->port_num >= 8)
 +              return true;
 +
 +      /* DP-to-HDMI Protocol Converter */
 +      if (port->pdt == DP_PEER_DEVICE_DP_LEGACY_CONV &&
 +          !port->mcs &&
 +          port->ldps)
 +              return true;
 +
 +      /* DP-to-DP */
 +      mutex_lock(&port->mgr->lock);
 +      if (port->pdt == DP_PEER_DEVICE_MST_BRANCHING &&
 +          port->mstb &&
 +          port->mstb->num_ports == 2) {
 +              list_for_each_entry(downstream_port, &port->mstb->ports, next) {
 +                      if (downstream_port->pdt == DP_PEER_DEVICE_SST_SINK &&
 +                          !downstream_port->input) {
 +                              mutex_unlock(&port->mgr->lock);
 +                              return true;
 +                      }
 +              }
 +      }
 +      mutex_unlock(&port->mgr->lock);
 +
 +      return false;
 +}
 +
 +/**
 + * drm_dp_mst_dsc_aux_for_port() - Find the correct aux for DSC
 + * @port: The port to check. A leaf of the MST tree with an attached display.
 + *
 + * Depending on the situation, DSC may be enabled via the endpoint aux,
 + * the immediately upstream aux, or the connector's physical aux.
 + *
 + * This is both the correct aux to read DSC_CAPABILITY and the
 + * correct aux to write DSC_ENABLED.
 + *
 + * This operation can be expensive (up to four aux reads), so
 + * the caller should cache the return.
 + *
 + * Returns:
 + * NULL if DSC cannot be enabled on this port, otherwise the aux device
 + */
 +struct drm_dp_aux *drm_dp_mst_dsc_aux_for_port(struct drm_dp_mst_port *port)
 +{
 +      struct drm_dp_mst_port *immediate_upstream_port;
 +      struct drm_dp_mst_port *fec_port;
 +      struct drm_dp_desc desc = { 0 };
 +      u8 endpoint_fec;
 +      u8 endpoint_dsc;
 +
 +      if (!port)
 +              return NULL;
 +
 +      if (port->parent->port_parent)
 +              immediate_upstream_port = port->parent->port_parent;
 +      else
 +              immediate_upstream_port = NULL;
 +
 +      fec_port = immediate_upstream_port;
 +      while (fec_port) {
 +              /*
 +               * Each physical link (i.e. not a virtual port) between the
 +               * output and the primary device must support FEC
 +               */
 +              if (!drm_dp_mst_is_virtual_dpcd(fec_port) &&
 +                  !fec_port->fec_capable)
 +                      return NULL;
 +
 +              fec_port = fec_port->parent->port_parent;
 +      }
 +
 +      /* DP-to-DP peer device */
 +      if (drm_dp_mst_is_virtual_dpcd(immediate_upstream_port)) {
 +              u8 upstream_dsc;
 +
 +              if (drm_dp_dpcd_read(&port->aux,
 +                                   DP_DSC_SUPPORT, &endpoint_dsc, 1) != 1)
 +                      return NULL;
 +              if (drm_dp_dpcd_read(&port->aux,
 +                                   DP_FEC_CAPABILITY, &endpoint_fec, 1) != 1)
 +                      return NULL;
 +              if (drm_dp_dpcd_read(&immediate_upstream_port->aux,
 +                                   DP_DSC_SUPPORT, &upstream_dsc, 1) != 1)
 +                      return NULL;
 +
 +              /* Enpoint decompression with DP-to-DP peer device */
 +              if ((endpoint_dsc & DP_DSC_DECOMPRESSION_IS_SUPPORTED) &&
 +                  (endpoint_fec & DP_FEC_CAPABLE) &&
 +                  (upstream_dsc & 0x2) /* DSC passthrough */)
 +                      return &port->aux;
 +
 +              /* Virtual DPCD decompression with DP-to-DP peer device */
 +              return &immediate_upstream_port->aux;
 +      }
 +
 +      /* Virtual DPCD decompression with DP-to-HDMI or Virtual DP Sink */
 +      if (drm_dp_mst_is_virtual_dpcd(port))
 +              return &port->aux;
 +
 +      /*
 +       * Synaptics quirk
 +       * Applies to ports for which:
 +       * - Physical aux has Synaptics OUI
 +       * - DPv1.4 or higher
 +       * - Port is on primary branch device
 +       * - Not a VGA adapter (DP_DWN_STRM_PORT_TYPE_ANALOG)
 +       */
 +      if (drm_dp_read_desc(port->mgr->aux, &desc, true))
 +              return NULL;
 +
 +      if (drm_dp_has_quirk(&desc, DP_DPCD_QUIRK_DSC_WITHOUT_VIRTUAL_DPCD) &&
 +          port->mgr->dpcd[DP_DPCD_REV] >= DP_DPCD_REV_14 &&
 +          port->parent == port->mgr->mst_primary) {
 +              u8 downstreamport;
 +
 +              if (drm_dp_dpcd_read(&port->aux, DP_DOWNSTREAMPORT_PRESENT,
 +                                   &downstreamport, 1) < 0)
 +                      return NULL;
 +
 +              if ((downstreamport & DP_DWN_STRM_PORT_PRESENT) &&
 +                 ((downstreamport & DP_DWN_STRM_PORT_TYPE_MASK)
 +                   != DP_DWN_STRM_PORT_TYPE_ANALOG))
 +                      return port->mgr->aux;
 +      }
 +
 +      /*
 +       * The check below verifies if the MST sink
 +       * connected to the GPU is capable of DSC -
 +       * therefore the endpoint needs to be
 +       * both DSC and FEC capable.
 +       */
 +      if (drm_dp_dpcd_read(&port->aux,
 +         DP_DSC_SUPPORT, &endpoint_dsc, 1) != 1)
 +              return NULL;
 +      if (drm_dp_dpcd_read(&port->aux,
 +         DP_FEC_CAPABILITY, &endpoint_fec, 1) != 1)
 +              return NULL;
 +      if ((endpoint_dsc & DP_DSC_DECOMPRESSION_IS_SUPPORTED) &&
 +         (endpoint_fec & DP_FEC_CAPABLE))
 +              return &port->aux;
 +
 +      return NULL;
 +}
 +EXPORT_SYMBOL(drm_dp_mst_dsc_aux_for_port);
@@@ -77,7 -77,7 +77,7 @@@ static enum transcoder dsi_port_to_tran
  static void wait_for_cmds_dispatched_to_panel(struct intel_encoder *encoder)
  {
        struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
 -      struct intel_dsi *intel_dsi = enc_to_intel_dsi(&encoder->base);
 +      struct intel_dsi *intel_dsi = enc_to_intel_dsi(encoder);
        struct mipi_dsi_device *dsi;
        enum port port;
        enum transcoder dsi_trans;
@@@ -202,7 -202,7 +202,7 @@@ static int dsi_send_pkt_payld(struct in
  static void dsi_program_swing_and_deemphasis(struct intel_encoder *encoder)
  {
        struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
 -      struct intel_dsi *intel_dsi = enc_to_intel_dsi(&encoder->base);
 +      struct intel_dsi *intel_dsi = enc_to_intel_dsi(encoder);
        enum phy phy;
        u32 tmp;
        int lane;
@@@ -267,7 -267,7 +267,7 @@@ static void configure_dual_link_mode(st
                                     const struct intel_crtc_state *pipe_config)
  {
        struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
 -      struct intel_dsi *intel_dsi = enc_to_intel_dsi(&encoder->base);
 +      struct intel_dsi *intel_dsi = enc_to_intel_dsi(encoder);
        u32 dss_ctl1;
  
        dss_ctl1 = I915_READ(DSS_CTL1);
  static int afe_clk(struct intel_encoder *encoder,
                   const struct intel_crtc_state *crtc_state)
  {
 -      struct intel_dsi *intel_dsi = enc_to_intel_dsi(&encoder->base);
 +      struct intel_dsi *intel_dsi = enc_to_intel_dsi(encoder);
        int bpp;
  
        if (crtc_state->dsc.compression_enable)
@@@ -321,7 -321,7 +321,7 @@@ static void gen11_dsi_program_esc_clk_d
                                          const struct intel_crtc_state *crtc_state)
  {
        struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
 -      struct intel_dsi *intel_dsi = enc_to_intel_dsi(&encoder->base);
 +      struct intel_dsi *intel_dsi = enc_to_intel_dsi(encoder);
        enum port port;
        int afe_clk_khz;
        u32 esc_clk_div_m;
@@@ -360,7 -360,7 +360,7 @@@ static void get_dsi_io_power_domains(st
  static void gen11_dsi_enable_io_power(struct intel_encoder *encoder)
  {
        struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
 -      struct intel_dsi *intel_dsi = enc_to_intel_dsi(&encoder->base);
 +      struct intel_dsi *intel_dsi = enc_to_intel_dsi(encoder);
        enum port port;
        u32 tmp;
  
  static void gen11_dsi_power_up_lanes(struct intel_encoder *encoder)
  {
        struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
 -      struct intel_dsi *intel_dsi = enc_to_intel_dsi(&encoder->base);
 +      struct intel_dsi *intel_dsi = enc_to_intel_dsi(encoder);
        enum phy phy;
  
        for_each_dsi_phy(phy, intel_dsi->phys)
  static void gen11_dsi_config_phy_lanes_sequence(struct intel_encoder *encoder)
  {
        struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
 -      struct intel_dsi *intel_dsi = enc_to_intel_dsi(&encoder->base);
 +      struct intel_dsi *intel_dsi = enc_to_intel_dsi(encoder);
        enum phy phy;
        u32 tmp;
        int lane;
  static void gen11_dsi_voltage_swing_program_seq(struct intel_encoder *encoder)
  {
        struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
 -      struct intel_dsi *intel_dsi = enc_to_intel_dsi(&encoder->base);
 +      struct intel_dsi *intel_dsi = enc_to_intel_dsi(encoder);
        u32 tmp;
        enum phy phy;
  
  static void gen11_dsi_enable_ddi_buffer(struct intel_encoder *encoder)
  {
        struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
 -      struct intel_dsi *intel_dsi = enc_to_intel_dsi(&encoder->base);
 +      struct intel_dsi *intel_dsi = enc_to_intel_dsi(encoder);
        u32 tmp;
        enum port port;
  
@@@ -509,7 -509,7 +509,7 @@@ gen11_dsi_setup_dphy_timings(struct int
                             const struct intel_crtc_state *crtc_state)
  {
        struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
 -      struct intel_dsi *intel_dsi = enc_to_intel_dsi(&encoder->base);
 +      struct intel_dsi *intel_dsi = enc_to_intel_dsi(encoder);
        u32 tmp;
        enum port port;
        enum phy phy;
  static void gen11_dsi_gate_clocks(struct intel_encoder *encoder)
  {
        struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
 -      struct intel_dsi *intel_dsi = enc_to_intel_dsi(&encoder->base);
 +      struct intel_dsi *intel_dsi = enc_to_intel_dsi(encoder);
        u32 tmp;
        enum phy phy;
  
  static void gen11_dsi_ungate_clocks(struct intel_encoder *encoder)
  {
        struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
 -      struct intel_dsi *intel_dsi = enc_to_intel_dsi(&encoder->base);
 +      struct intel_dsi *intel_dsi = enc_to_intel_dsi(encoder);
        u32 tmp;
        enum phy phy;
  
@@@ -608,7 -608,7 +608,7 @@@ static void gen11_dsi_map_pll(struct in
                              const struct intel_crtc_state *crtc_state)
  {
        struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
 -      struct intel_dsi *intel_dsi = enc_to_intel_dsi(&encoder->base);
 +      struct intel_dsi *intel_dsi = enc_to_intel_dsi(encoder);
        struct intel_shared_dpll *pll = crtc_state->shared_dpll;
        enum phy phy;
        u32 val;
@@@ -640,7 -640,7 +640,7 @@@ gen11_dsi_configure_transcoder(struct i
                               const struct intel_crtc_state *pipe_config)
  {
        struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
 -      struct intel_dsi *intel_dsi = enc_to_intel_dsi(&encoder->base);
 +      struct intel_dsi *intel_dsi = enc_to_intel_dsi(encoder);
        struct intel_crtc *intel_crtc = to_intel_crtc(pipe_config->uapi.crtc);
        enum pipe pipe = intel_crtc->pipe;
        u32 tmp;
@@@ -789,7 -789,7 +789,7 @@@ gen11_dsi_set_transcoder_timings(struc
                                 const struct intel_crtc_state *crtc_state)
  {
        struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
 -      struct intel_dsi *intel_dsi = enc_to_intel_dsi(&encoder->base);
 +      struct intel_dsi *intel_dsi = enc_to_intel_dsi(encoder);
        const struct drm_display_mode *adjusted_mode =
                &crtc_state->hw.adjusted_mode;
        enum port port;
  static void gen11_dsi_enable_transcoder(struct intel_encoder *encoder)
  {
        struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
 -      struct intel_dsi *intel_dsi = enc_to_intel_dsi(&encoder->base);
 +      struct intel_dsi *intel_dsi = enc_to_intel_dsi(encoder);
        enum port port;
        enum transcoder dsi_trans;
        u32 tmp;
@@@ -945,7 -945,7 +945,7 @@@ static void gen11_dsi_setup_timeouts(st
                                     const struct intel_crtc_state *crtc_state)
  {
        struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
 -      struct intel_dsi *intel_dsi = enc_to_intel_dsi(&encoder->base);
 +      struct intel_dsi *intel_dsi = enc_to_intel_dsi(encoder);
        enum port port;
        enum transcoder dsi_trans;
        u32 tmp, hs_tx_timeout, lp_rx_timeout, ta_timeout, divisor, mul;
@@@ -1026,7 -1026,7 +1026,7 @@@ gen11_dsi_enable_port_and_phy(struct in
  static void gen11_dsi_powerup_panel(struct intel_encoder *encoder)
  {
        struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
 -      struct intel_dsi *intel_dsi = enc_to_intel_dsi(&encoder->base);
 +      struct intel_dsi *intel_dsi = enc_to_intel_dsi(encoder);
        struct mipi_dsi_device *dsi;
        enum port port;
        enum transcoder dsi_trans;
@@@ -1077,7 -1077,7 +1077,7 @@@ static void gen11_dsi_pre_enable(struc
                                 const struct intel_crtc_state *pipe_config,
                                 const struct drm_connector_state *conn_state)
  {
 -      struct intel_dsi *intel_dsi = enc_to_intel_dsi(&encoder->base);
 +      struct intel_dsi *intel_dsi = enc_to_intel_dsi(encoder);
  
        /* step3b */
        gen11_dsi_map_pll(encoder, pipe_config);
  static void gen11_dsi_disable_transcoder(struct intel_encoder *encoder)
  {
        struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
 -      struct intel_dsi *intel_dsi = enc_to_intel_dsi(&encoder->base);
 +      struct intel_dsi *intel_dsi = enc_to_intel_dsi(encoder);
        enum port port;
        enum transcoder dsi_trans;
        u32 tmp;
  
  static void gen11_dsi_powerdown_panel(struct intel_encoder *encoder)
  {
 -      struct intel_dsi *intel_dsi = enc_to_intel_dsi(&encoder->base);
 +      struct intel_dsi *intel_dsi = enc_to_intel_dsi(encoder);
  
        intel_dsi_vbt_exec_sequence(intel_dsi, MIPI_SEQ_DISPLAY_OFF);
        intel_dsi_vbt_exec_sequence(intel_dsi, MIPI_SEQ_ASSERT_RESET);
  static void gen11_dsi_deconfigure_trancoder(struct intel_encoder *encoder)
  {
        struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
 -      struct intel_dsi *intel_dsi = enc_to_intel_dsi(&encoder->base);
 +      struct intel_dsi *intel_dsi = enc_to_intel_dsi(encoder);
        enum port port;
        enum transcoder dsi_trans;
        u32 tmp;
  static void gen11_dsi_disable_port(struct intel_encoder *encoder)
  {
        struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
 -      struct intel_dsi *intel_dsi = enc_to_intel_dsi(&encoder->base);
 +      struct intel_dsi *intel_dsi = enc_to_intel_dsi(encoder);
        u32 tmp;
        enum port port;
  
  static void gen11_dsi_disable_io_power(struct intel_encoder *encoder)
  {
        struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
 -      struct intel_dsi *intel_dsi = enc_to_intel_dsi(&encoder->base);
 +      struct intel_dsi *intel_dsi = enc_to_intel_dsi(encoder);
        enum port port;
        u32 tmp;
  
@@@ -1229,7 -1229,7 +1229,7 @@@ static void gen11_dsi_disable(struct in
                              const struct intel_crtc_state *old_crtc_state,
                              const struct drm_connector_state *old_conn_state)
  {
 -      struct intel_dsi *intel_dsi = enc_to_intel_dsi(&encoder->base);
 +      struct intel_dsi *intel_dsi = enc_to_intel_dsi(encoder);
  
        /* step1: turn off backlight */
        intel_dsi_vbt_exec_sequence(intel_dsi, MIPI_SEQ_BACKLIGHT_OFF);
@@@ -1259,7 -1259,7 +1259,7 @@@ static void gen11_dsi_post_disable(stru
  
        intel_dsc_disable(old_crtc_state);
  
 -      skylake_scaler_disable(old_crtc_state);
 +      skl_scaler_disable(old_crtc_state);
  }
  
  static enum drm_mode_status gen11_dsi_mode_valid(struct drm_connector *connector,
  static void gen11_dsi_get_timings(struct intel_encoder *encoder,
                                  struct intel_crtc_state *pipe_config)
  {
 -      struct intel_dsi *intel_dsi = enc_to_intel_dsi(&encoder->base);
 +      struct intel_dsi *intel_dsi = enc_to_intel_dsi(encoder);
        struct drm_display_mode *adjusted_mode =
                                        &pipe_config->hw.adjusted_mode;
  
@@@ -1313,7 -1313,7 +1313,7 @@@ static void gen11_dsi_get_config(struc
  {
        struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
        struct intel_crtc *crtc = to_intel_crtc(pipe_config->uapi.crtc);
 -      struct intel_dsi *intel_dsi = enc_to_intel_dsi(&encoder->base);
 +      struct intel_dsi *intel_dsi = enc_to_intel_dsi(encoder);
  
        intel_dsc_get_config(encoder, pipe_config);
  
@@@ -1417,8 -1417,7 +1417,8 @@@ static void gen11_dsi_get_power_domains
  {
        struct drm_i915_private *i915 = to_i915(encoder->base.dev);
  
 -      get_dsi_io_power_domains(i915, enc_to_intel_dsi(&encoder->base));
 +      get_dsi_io_power_domains(i915,
 +                               enc_to_intel_dsi(encoder));
  
        if (crtc_state->dsc.compression_enable)
                intel_display_power_get(i915,
@@@ -1429,7 -1428,7 +1429,7 @@@ static bool gen11_dsi_get_hw_state(stru
                                   enum pipe *pipe)
  {
        struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
 -      struct intel_dsi *intel_dsi = enc_to_intel_dsi(&encoder->base);
 +      struct intel_dsi *intel_dsi = enc_to_intel_dsi(encoder);
        enum transcoder dsi_trans;
        intel_wakeref_t wakeref;
        enum port port;
@@@ -1668,9 -1667,8 +1668,8 @@@ static void icl_dsi_add_properties(stru
  
        connector->base.state->scaling_mode = DRM_MODE_SCALE_ASPECT;
  
-       connector->base.display_info.panel_orientation =
-                       intel_dsi_get_panel_orientation(connector);
-       drm_connector_init_panel_orientation_property(&connector->base,
+       drm_connector_set_panel_orientation_with_quirk(&connector->base,
+                               intel_dsi_get_panel_orientation(connector),
                                connector->panel.fixed_mode->hdisplay,
                                connector->panel.fixed_mode->vdisplay);
  }
@@@ -90,8 -90,8 +90,8 @@@ struct intel_framebuffer 
        /* for each plane in the normal GTT view */
        struct {
                unsigned int x, y;
 -      } normal[2];
 -      /* for each plane in the rotated GTT view */
 +      } normal[4];
 +      /* for each plane in the rotated GTT view for no-CCS formats */
        struct {
                unsigned int x, y;
                unsigned int pitch; /* pixels */
@@@ -555,7 -555,7 +555,7 @@@ struct intel_plane_state 
                 */
                u32 stride;
                int x, y;
 -      } color_plane[2];
 +      } color_plane[4];
  
        /* plane control register */
        u32 ctl;
@@@ -1054,9 -1054,6 +1054,9 @@@ struct intel_crtc_state 
  
        /* Bitmask to indicate slaves attached */
        u8 sync_mode_slaves_mask;
 +
 +      /* Only valid on TGL+ */
 +      enum transcoder mst_master_transcoder;
  };
  
  struct intel_crtc {
@@@ -1181,8 -1178,6 +1181,6 @@@ struct intel_hdmi 
  };
  
  struct intel_dp_mst_encoder;
- #define DP_MAX_DOWNSTREAM_PORTS               0x10
  /*
   * enum link_m_n_set:
   *    When platform provides two set of M_N registers for dp, we can
@@@ -1438,9 -1433,9 +1436,9 @@@ struct intel_load_detect_pipe 
  };
  
  static inline struct intel_encoder *
 -intel_attached_encoder(struct drm_connector *connector)
 +intel_attached_encoder(struct intel_connector *connector)
  {
 -      return to_intel_connector(connector)->encoder;
 +      return connector->encoder;
  }
  
  static inline bool intel_encoder_is_dig_port(struct intel_encoder *encoder)
  }
  
  static inline struct intel_digital_port *
 -enc_to_dig_port(struct drm_encoder *encoder)
 +enc_to_dig_port(struct intel_encoder *encoder)
  {
 -      struct intel_encoder *intel_encoder = to_intel_encoder(encoder);
 +      struct intel_encoder *intel_encoder = encoder;
  
        if (intel_encoder_is_dig_port(intel_encoder))
 -              return container_of(encoder, struct intel_digital_port,
 +              return container_of(&encoder->base, struct intel_digital_port,
                                    base.base);
        else
                return NULL;
  static inline struct intel_digital_port *
  conn_to_dig_port(struct intel_connector *connector)
  {
 -      return enc_to_dig_port(&intel_attached_encoder(&connector->base)->base);
 +      return enc_to_dig_port(intel_attached_encoder(connector));
  }
  
  static inline struct intel_dp_mst_encoder *
 -enc_to_mst(struct drm_encoder *encoder)
 +enc_to_mst(struct intel_encoder *encoder)
  {
 -      return container_of(encoder, struct intel_dp_mst_encoder, base.base);
 +      return container_of(&encoder->base, struct intel_dp_mst_encoder,
 +                          base.base);
  }
  
 -static inline struct intel_dp *enc_to_intel_dp(struct drm_encoder *encoder)
 +static inline struct intel_dp *enc_to_intel_dp(struct intel_encoder *encoder)
  {
        return &enc_to_dig_port(encoder)->dp;
  }
@@@ -1494,14 -1488,14 +1492,14 @@@ static inline bool intel_encoder_is_dp(
                return true;
        case INTEL_OUTPUT_DDI:
                /* Skip pure HDMI/DVI DDI encoders */
 -              return i915_mmio_reg_valid(enc_to_intel_dp(&encoder->base)->output_reg);
 +              return i915_mmio_reg_valid(enc_to_intel_dp(encoder)->output_reg);
        default:
                return false;
        }
  }
  
  static inline struct intel_lspcon *
 -enc_to_intel_lspcon(struct drm_encoder *encoder)
 +enc_to_intel_lspcon(struct intel_encoder *encoder)
  {
        return &enc_to_dig_port(encoder)->lspcon;
  }
@@@ -146,9 -146,9 +146,9 @@@ bool intel_dp_is_edp(struct intel_dp *i
        return intel_dig_port->base.type == INTEL_OUTPUT_EDP;
  }
  
 -static struct intel_dp *intel_attached_dp(struct drm_connector *connector)
 +static struct intel_dp *intel_attached_dp(struct intel_connector *connector)
  {
 -      return enc_to_intel_dp(&intel_attached_encoder(connector)->base);
 +      return enc_to_intel_dp(intel_attached_encoder(connector));
  }
  
  static void intel_dp_link_down(struct intel_encoder *encoder,
@@@ -614,7 -614,7 +614,7 @@@ static enum drm_mode_statu
  intel_dp_mode_valid(struct drm_connector *connector,
                    struct drm_display_mode *mode)
  {
 -      struct intel_dp *intel_dp = intel_attached_dp(connector);
 +      struct intel_dp *intel_dp = intel_attached_dp(to_intel_connector(connector));
        struct intel_connector *intel_connector = to_intel_connector(connector);
        struct drm_display_mode *fixed_mode = intel_connector->panel.fixed_mode;
        struct drm_i915_private *dev_priv = to_i915(connector->dev);
@@@ -834,7 -834,7 +834,7 @@@ static enum pipe vlv_find_free_pps(stru
         * Pick one that's not used by other ports.
         */
        for_each_intel_dp(&dev_priv->drm, encoder) {
 -              struct intel_dp *intel_dp = enc_to_intel_dp(&encoder->base);
 +              struct intel_dp *intel_dp = enc_to_intel_dp(encoder);
  
                if (encoder->type == INTEL_OUTPUT_EDP) {
                        WARN_ON(intel_dp->active_pipe != INVALID_PIPE &&
@@@ -1031,7 -1031,7 +1031,7 @@@ void intel_power_sequencer_reset(struc
         */
  
        for_each_intel_dp(&dev_priv->drm, encoder) {
 -              struct intel_dp *intel_dp = enc_to_intel_dp(&encoder->base);
 +              struct intel_dp *intel_dp = enc_to_intel_dp(encoder);
  
                WARN_ON(intel_dp->active_pipe != INVALID_PIPE);
  
@@@ -2034,7 -2034,7 +2034,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 intel_dp *intel_dp = enc_to_intel_dp(&encoder->base);
 +      struct intel_dp *intel_dp = enc_to_intel_dp(encoder);
        struct drm_dsc_config *vdsc_cfg = &crtc_state->dsc.config;
        u8 line_buf_depth;
        int ret;
@@@ -2205,7 -2205,7 +2205,7 @@@ intel_dp_compute_link_config(struct int
                             struct drm_connector_state *conn_state)
  {
        struct drm_display_mode *adjusted_mode = &pipe_config->hw.adjusted_mode;
 -      struct intel_dp *intel_dp = enc_to_intel_dp(&encoder->base);
 +      struct intel_dp *intel_dp = enc_to_intel_dp(encoder);
        struct link_config_limits limits;
        int common_len;
        int ret;
@@@ -2366,8 -2366,8 +2366,8 @@@ intel_dp_compute_config(struct intel_en
  {
        struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
        struct drm_display_mode *adjusted_mode = &pipe_config->hw.adjusted_mode;
 -      struct intel_dp *intel_dp = enc_to_intel_dp(&encoder->base);
 -      struct intel_lspcon *lspcon = enc_to_intel_lspcon(&encoder->base);
 +      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;
@@@ -2482,7 -2482,7 +2482,7 @@@ static void intel_dp_prepare(struct int
                             const struct intel_crtc_state *pipe_config)
  {
        struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
 -      struct intel_dp *intel_dp = enc_to_intel_dp(&encoder->base);
 +      struct intel_dp *intel_dp = enc_to_intel_dp(encoder);
        enum port port = encoder->port;
        struct intel_crtc *crtc = to_intel_crtc(pipe_config->uapi.crtc);
        const struct drm_display_mode *adjusted_mode = &pipe_config->hw.adjusted_mode;
         *
         * CPT PCH is quite different, having many bits moved
         * to the TRANS_DP_CTL register instead. That
 -       * configuration happens (oddly) in ironlake_pch_enable
 +       * configuration happens (oddly) in ilk_pch_enable
         */
  
        /* Preserve the BIOS-computed detected bit. This is
@@@ -2653,7 -2653,7 +2653,7 @@@ static void edp_wait_backlight_off(stru
   * is locked
   */
  
 -static  u32 ironlake_get_pp_control(struct intel_dp *intel_dp)
 +static  u32 ilk_get_pp_control(struct intel_dp *intel_dp)
  {
        struct drm_i915_private *dev_priv = dp_to_i915(intel_dp);
        u32 control;
@@@ -2703,7 -2703,7 +2703,7 @@@ static bool edp_panel_vdd_on(struct int
        if (!edp_have_panel_power(intel_dp))
                wait_panel_power_cycle(intel_dp);
  
 -      pp = ironlake_get_pp_control(intel_dp);
 +      pp = ilk_get_pp_control(intel_dp);
        pp |= EDP_FORCE_VDD;
  
        pp_stat_reg = _pp_stat_reg(intel_dp);
@@@ -2768,7 -2768,7 +2768,7 @@@ static void edp_panel_vdd_off_sync(stru
                      intel_dig_port->base.base.base.id,
                      intel_dig_port->base.base.name);
  
 -      pp = ironlake_get_pp_control(intel_dp);
 +      pp = ilk_get_pp_control(intel_dp);
        pp &= ~EDP_FORCE_VDD;
  
        pp_ctrl_reg = _pp_ctrl_reg(intel_dp);
@@@ -2864,7 -2864,7 +2864,7 @@@ static void edp_panel_on(struct intel_d
        wait_panel_power_cycle(intel_dp);
  
        pp_ctrl_reg = _pp_ctrl_reg(intel_dp);
 -      pp = ironlake_get_pp_control(intel_dp);
 +      pp = ilk_get_pp_control(intel_dp);
        if (IS_GEN(dev_priv, 5)) {
                /* ILK workaround: disable reset around power sequence */
                pp &= ~PANEL_POWER_RESET;
@@@ -2919,7 -2919,7 +2919,7 @@@ static void edp_panel_off(struct intel_
        WARN(!intel_dp->want_panel_vdd, "Need [ENCODER:%d:%s] VDD to turn off panel\n",
             dig_port->base.base.base.id, dig_port->base.base.name);
  
 -      pp = ironlake_get_pp_control(intel_dp);
 +      pp = ilk_get_pp_control(intel_dp);
        /* We need to switch off panel power _and_ force vdd, for otherwise some
         * panels get very unhappy and cease to work. */
        pp &= ~(PANEL_POWER_ON | PANEL_POWER_RESET | EDP_FORCE_VDD |
@@@ -2968,7 -2968,7 +2968,7 @@@ static void _intel_edp_backlight_on(str
                i915_reg_t pp_ctrl_reg = _pp_ctrl_reg(intel_dp);
                u32 pp;
  
 -              pp = ironlake_get_pp_control(intel_dp);
 +              pp = ilk_get_pp_control(intel_dp);
                pp |= EDP_BLC_ENABLE;
  
                I915_WRITE(pp_ctrl_reg, pp);
  void intel_edp_backlight_on(const struct intel_crtc_state *crtc_state,
                            const struct drm_connector_state *conn_state)
  {
 -      struct intel_dp *intel_dp = enc_to_intel_dp(conn_state->best_encoder);
 +      struct intel_dp *intel_dp = enc_to_intel_dp(to_intel_encoder(conn_state->best_encoder));
  
        if (!intel_dp_is_edp(intel_dp))
                return;
@@@ -3004,7 -3004,7 +3004,7 @@@ static void _intel_edp_backlight_off(st
                i915_reg_t pp_ctrl_reg = _pp_ctrl_reg(intel_dp);
                u32 pp;
  
 -              pp = ironlake_get_pp_control(intel_dp);
 +              pp = ilk_get_pp_control(intel_dp);
                pp &= ~EDP_BLC_ENABLE;
  
                I915_WRITE(pp_ctrl_reg, pp);
  /* Disable backlight PP control and backlight PWM. */
  void intel_edp_backlight_off(const struct drm_connector_state *old_conn_state)
  {
 -      struct intel_dp *intel_dp = enc_to_intel_dp(old_conn_state->best_encoder);
 +      struct intel_dp *intel_dp = enc_to_intel_dp(to_intel_encoder(old_conn_state->best_encoder));
  
        if (!intel_dp_is_edp(intel_dp))
                return;
  static void intel_edp_backlight_power(struct intel_connector *connector,
                                      bool enable)
  {
 -      struct intel_dp *intel_dp = intel_attached_dp(&connector->base);
 +      struct intel_dp *intel_dp = intel_attached_dp(connector);
        intel_wakeref_t wakeref;
        bool is_enabled;
  
        is_enabled = false;
        with_pps_lock(intel_dp, wakeref)
 -              is_enabled = ironlake_get_pp_control(intel_dp) & EDP_BLC_ENABLE;
 +              is_enabled = ilk_get_pp_control(intel_dp) & EDP_BLC_ENABLE;
        if (is_enabled == enable)
                return;
  
@@@ -3079,13 -3079,13 +3079,13 @@@ static void assert_edp_pll(struct drm_i
  #define assert_edp_pll_enabled(d) assert_edp_pll((d), true)
  #define assert_edp_pll_disabled(d) assert_edp_pll((d), false)
  
 -static void ironlake_edp_pll_on(struct intel_dp *intel_dp,
 -                              const struct intel_crtc_state *pipe_config)
 +static void ilk_edp_pll_on(struct intel_dp *intel_dp,
 +                         const struct intel_crtc_state *pipe_config)
  {
        struct intel_crtc *crtc = to_intel_crtc(pipe_config->uapi.crtc);
        struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
  
 -      assert_pipe_disabled(dev_priv, crtc->pipe);
 +      assert_pipe_disabled(dev_priv, pipe_config->cpu_transcoder);
        assert_dp_port_disabled(intel_dp);
        assert_edp_pll_disabled(dev_priv);
  
        udelay(200);
  }
  
 -static void ironlake_edp_pll_off(struct intel_dp *intel_dp,
 -                               const struct intel_crtc_state *old_crtc_state)
 +static void ilk_edp_pll_off(struct intel_dp *intel_dp,
 +                          const struct intel_crtc_state *old_crtc_state)
  {
        struct intel_crtc *crtc = to_intel_crtc(old_crtc_state->uapi.crtc);
        struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
  
 -      assert_pipe_disabled(dev_priv, crtc->pipe);
 +      assert_pipe_disabled(dev_priv, old_crtc_state->cpu_transcoder);
        assert_dp_port_disabled(intel_dp);
        assert_edp_pll_enabled(dev_priv);
  
@@@ -3149,7 -3149,7 +3149,7 @@@ static bool downstream_hpd_needs_d0(str
         * FIXME should really check all downstream ports...
         */
        return intel_dp->dpcd[DP_DPCD_REV] == 0x11 &&
-               intel_dp->dpcd[DP_DOWNSTREAMPORT_PRESENT] & DP_DWN_STRM_PORT_PRESENT &&
+               drm_dp_is_branch(intel_dp->dpcd) &&
                intel_dp->downstream_ports[0] & DP_DS_PORT_HPD;
  }
  
@@@ -3258,7 -3258,7 +3258,7 @@@ static bool intel_dp_get_hw_state(struc
                                  enum pipe *pipe)
  {
        struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
 -      struct intel_dp *intel_dp = enc_to_intel_dp(&encoder->base);
 +      struct intel_dp *intel_dp = enc_to_intel_dp(encoder);
        intel_wakeref_t wakeref;
        bool ret;
  
@@@ -3279,7 -3279,7 +3279,7 @@@ static void intel_dp_get_config(struct 
                                struct intel_crtc_state *pipe_config)
  {
        struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
 -      struct intel_dp *intel_dp = enc_to_intel_dp(&encoder->base);
 +      struct intel_dp *intel_dp = enc_to_intel_dp(encoder);
        u32 tmp, flags = 0;
        enum port port = encoder->port;
        struct intel_crtc *crtc = to_intel_crtc(pipe_config->uapi.crtc);
@@@ -3363,7 -3363,7 +3363,7 @@@ static void intel_disable_dp(struct int
                             const struct intel_crtc_state *old_crtc_state,
                             const struct drm_connector_state *old_conn_state)
  {
 -      struct intel_dp *intel_dp = enc_to_intel_dp(&encoder->base);
 +      struct intel_dp *intel_dp = enc_to_intel_dp(encoder);
  
        intel_dp->link_trained = false;
  
@@@ -3397,7 -3397,7 +3397,7 @@@ static void g4x_post_disable_dp(struct 
                                const struct intel_crtc_state *old_crtc_state,
                                const struct drm_connector_state *old_conn_state)
  {
 -      struct intel_dp *intel_dp = enc_to_intel_dp(&encoder->base);
 +      struct intel_dp *intel_dp = enc_to_intel_dp(encoder);
        enum port port = encoder->port;
  
        /*
  
        /* Only ilk+ has port A */
        if (port == PORT_A)
 -              ironlake_edp_pll_off(intel_dp, old_crtc_state);
 +              ilk_edp_pll_off(intel_dp, old_crtc_state);
  }
  
  static void vlv_post_disable_dp(struct intel_encoder *encoder,
@@@ -3548,7 -3548,7 +3548,7 @@@ static void intel_enable_dp(struct inte
                            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->base);
 +      struct intel_dp *intel_dp = enc_to_intel_dp(encoder);
        struct intel_crtc *crtc = to_intel_crtc(pipe_config->uapi.crtc);
        u32 dp_reg = I915_READ(intel_dp->output_reg);
        enum pipe pipe = crtc->pipe;
@@@ -3608,14 -3608,14 +3608,14 @@@ static void g4x_pre_enable_dp(struct in
                              const struct intel_crtc_state *pipe_config,
                              const struct drm_connector_state *conn_state)
  {
 -      struct intel_dp *intel_dp = enc_to_intel_dp(&encoder->base);
 +      struct intel_dp *intel_dp = enc_to_intel_dp(encoder);
        enum port port = encoder->port;
  
        intel_dp_prepare(encoder, pipe_config);
  
        /* Only ilk+ has port A */
        if (port == PORT_A)
 -              ironlake_edp_pll_on(intel_dp, pipe_config);
 +              ilk_edp_pll_on(intel_dp, pipe_config);
  }
  
  static void vlv_detach_power_sequencer(struct intel_dp *intel_dp)
@@@ -3658,7 -3658,7 +3658,7 @@@ static void vlv_steal_power_sequencer(s
        lockdep_assert_held(&dev_priv->pps_mutex);
  
        for_each_intel_dp(&dev_priv->drm, encoder) {
 -              struct intel_dp *intel_dp = enc_to_intel_dp(&encoder->base);
 +              struct intel_dp *intel_dp = enc_to_intel_dp(encoder);
  
                WARN(intel_dp->active_pipe == pipe,
                     "stealing pipe %c power sequencer from active [ENCODER:%d:%s]\n",
@@@ -3681,7 -3681,7 +3681,7 @@@ static void vlv_init_panel_power_sequen
                                           const struct intel_crtc_state *crtc_state)
  {
        struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
 -      struct intel_dp *intel_dp = enc_to_intel_dp(&encoder->base);
 +      struct intel_dp *intel_dp = enc_to_intel_dp(encoder);
        struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
  
        lockdep_assert_held(&dev_priv->pps_mutex);
@@@ -4203,7 -4203,7 +4203,7 @@@ intel_dp_link_down(struct intel_encode
                   const struct intel_crtc_state *old_crtc_state)
  {
        struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
 -      struct intel_dp *intel_dp = enc_to_intel_dp(&encoder->base);
 +      struct intel_dp *intel_dp = enc_to_intel_dp(encoder);
        struct intel_crtc *crtc = to_intel_crtc(old_crtc_state->uapi.crtc);
        enum port port = encoder->port;
        u32 DP = intel_dp->DP;
@@@ -4903,7 -4903,7 +4903,7 @@@ static u8 intel_dp_autotest_video_patte
        intel_dp->compliance.test_data.hdisplay = be16_to_cpu(h_width);
        intel_dp->compliance.test_data.vdisplay = be16_to_cpu(v_height);
        /* Set test active flag here so userspace doesn't interrupt things */
 -      intel_dp->compliance.test_active = 1;
 +      intel_dp->compliance.test_active = true;
  
        return DP_TEST_ACK;
  }
@@@ -4947,7 -4947,7 +4947,7 @@@ static u8 intel_dp_autotest_edid(struc
        }
  
        /* Set test active flag here so userspace doesn't interrupt things */
 -      intel_dp->compliance.test_active = 1;
 +      intel_dp->compliance.test_active = true;
  
        return test_result;
  }
@@@ -5096,7 -5096,7 +5096,7 @@@ int intel_dp_retrain_link(struct intel_
                          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->base);
 +      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;
@@@ -5536,7 -5536,7 +5536,7 @@@ static bool intel_combo_phy_connected(s
  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->base);
 +      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))
@@@ -5651,7 -5651,7 +5651,7 @@@ intel_dp_detect(struct drm_connector *c
                bool force)
  {
        struct drm_i915_private *dev_priv = to_i915(connector->dev);
 -      struct intel_dp *intel_dp = intel_attached_dp(connector);
 +      struct intel_dp *intel_dp = intel_attached_dp(to_intel_connector(connector));
        struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp);
        struct intel_encoder *encoder = &dig_port->base;
        enum drm_connector_status status;
@@@ -5755,7 -5755,7 +5755,7 @@@ out
  static void
  intel_dp_force(struct drm_connector *connector)
  {
 -      struct intel_dp *intel_dp = intel_attached_dp(connector);
 +      struct intel_dp *intel_dp = intel_attached_dp(to_intel_connector(connector));
        struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp);
        struct intel_encoder *intel_encoder = &dig_port->base;
        struct drm_i915_private *dev_priv = to_i915(intel_encoder->base.dev);
@@@ -5790,7 -5790,7 +5790,7 @@@ static int intel_dp_get_modes(struct dr
        }
  
        /* if eDP has no EDID, fall back to fixed mode */
 -      if (intel_dp_is_edp(intel_attached_dp(connector)) &&
 +      if (intel_dp_is_edp(intel_attached_dp(to_intel_connector(connector))) &&
            intel_connector->panel.fixed_mode) {
                struct drm_display_mode *mode;
  
  static int
  intel_dp_connector_register(struct drm_connector *connector)
  {
 -      struct intel_dp *intel_dp = intel_attached_dp(connector);
 +      struct intel_dp *intel_dp = intel_attached_dp(to_intel_connector(connector));
        int ret;
  
        ret = intel_connector_register(connector);
  static void
  intel_dp_connector_unregister(struct drm_connector *connector)
  {
 -      struct intel_dp *intel_dp = intel_attached_dp(connector);
 +      struct intel_dp *intel_dp = intel_attached_dp(to_intel_connector(connector));
  
        drm_dp_cec_unregister_connector(&intel_dp->aux);
        drm_dp_aux_unregister(&intel_dp->aux);
  
  void intel_dp_encoder_flush_work(struct drm_encoder *encoder)
  {
 -      struct intel_digital_port *intel_dig_port = enc_to_dig_port(encoder);
 +      struct intel_digital_port *intel_dig_port = enc_to_dig_port(to_intel_encoder(encoder));
        struct intel_dp *intel_dp = &intel_dig_port->dp;
  
        intel_dp_mst_encoder_cleanup(intel_dig_port);
@@@ -5868,12 -5868,12 +5868,12 @@@ static void intel_dp_encoder_destroy(st
        intel_dp_encoder_flush_work(encoder);
  
        drm_encoder_cleanup(encoder);
 -      kfree(enc_to_dig_port(encoder));
 +      kfree(enc_to_dig_port(to_intel_encoder(encoder)));
  }
  
  void intel_dp_encoder_suspend(struct intel_encoder *intel_encoder)
  {
 -      struct intel_dp *intel_dp = enc_to_intel_dp(&intel_encoder->base);
 +      struct intel_dp *intel_dp = enc_to_intel_dp(intel_encoder);
        intel_wakeref_t wakeref;
  
        if (!intel_dp_is_edp(intel_dp))
@@@ -5904,7 -5904,7 +5904,7 @@@ stati
  int intel_dp_hdcp_write_an_aksv(struct intel_digital_port *intel_dig_port,
                                u8 *an)
  {
 -      struct intel_dp *intel_dp = enc_to_intel_dp(&intel_dig_port->base.base);
 +      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,
                .address = DP_AUX_HDCP_AKSV,
@@@ -6514,7 -6514,7 +6514,7 @@@ static enum pipe vlv_active_pipe(struc
  void intel_dp_encoder_reset(struct drm_encoder *encoder)
  {
        struct drm_i915_private *dev_priv = to_i915(encoder->dev);
 -      struct intel_dp *intel_dp = enc_to_intel_dp(encoder);
 +      struct intel_dp *intel_dp = enc_to_intel_dp(to_intel_encoder(encoder));
        struct intel_lspcon *lspcon = dp_to_lspcon(intel_dp);
        intel_wakeref_t wakeref;
  
@@@ -6693,7 -6693,7 +6693,7 @@@ intel_pps_readout_hw_state(struct intel
  
        intel_pps_get_registers(intel_dp, &regs);
  
 -      pp_ctl = ironlake_get_pp_control(intel_dp);
 +      pp_ctl = ilk_get_pp_control(intel_dp);
  
        /* Ensure PPS is unlocked */
        if (!HAS_DDI(dev_priv))
@@@ -6863,7 -6863,7 +6863,7 @@@ intel_dp_init_panel_power_sequencer_reg
         * soon as the new power sequencer gets initialized.
         */
        if (force_disable_vdd) {
 -              u32 pp = ironlake_get_pp_control(intel_dp);
 +              u32 pp = ilk_get_pp_control(intel_dp);
  
                WARN(pp & PANEL_POWER_ON, "Panel power already on\n");
  
@@@ -7401,9 -7401,12 +7401,12 @@@ static bool intel_edp_init_connector(st
        intel_connector->panel.backlight.power = intel_edp_backlight_power;
        intel_panel_setup_backlight(connector, pipe);
  
-       if (fixed_mode)
-               drm_connector_init_panel_orientation_property(
-                       connector, fixed_mode->hdisplay, fixed_mode->vdisplay);
+       if (fixed_mode) {
+               /* We do not know the orientation, but their might be a quirk */
+               drm_connector_set_panel_orientation_with_quirk(connector,
+                               DRM_MODE_PANEL_ORIENTATION_UNKNOWN,
+                               fixed_mode->hdisplay, fixed_mode->vdisplay);
+       }
  
        return true;
  
@@@ -7660,7 -7663,7 +7663,7 @@@ void intel_dp_mst_suspend(struct drm_i9
                if (encoder->type != INTEL_OUTPUT_DDI)
                        continue;
  
 -              intel_dp = enc_to_intel_dp(&encoder->base);
 +              intel_dp = enc_to_intel_dp(encoder);
  
                if (!intel_dp->can_mst)
                        continue;
@@@ -7681,7 -7684,7 +7684,7 @@@ void intel_dp_mst_resume(struct drm_i91
                if (encoder->type != INTEL_OUTPUT_DDI)
                        continue;
  
 -              intel_dp = enc_to_intel_dp(&encoder->base);
 +              intel_dp = enc_to_intel_dp(encoder);
  
                if (!intel_dp->can_mst)
                        continue;
@@@ -23,6 -23,7 +23,6 @@@
   * Author: Jani Nikula <jani.nikula@intel.com>
   */
  
 -#include <linux/gpio/consumer.h>
  #include <linux/slab.h>
  
  #include <drm/drm_atomic_helper.h>
@@@ -318,7 -319,7 +318,7 @@@ static int intel_dsi_compute_config(str
  static bool glk_dsi_enable_io(struct intel_encoder *encoder)
  {
        struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
 -      struct intel_dsi *intel_dsi = enc_to_intel_dsi(&encoder->base);
 +      struct intel_dsi *intel_dsi = enc_to_intel_dsi(encoder);
        enum port port;
        u32 tmp;
        bool cold_boot = false;
  static void glk_dsi_device_ready(struct intel_encoder *encoder)
  {
        struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
 -      struct intel_dsi *intel_dsi = enc_to_intel_dsi(&encoder->base);
 +      struct intel_dsi *intel_dsi = enc_to_intel_dsi(encoder);
        enum port port;
        u32 val;
  
  static void bxt_dsi_device_ready(struct intel_encoder *encoder)
  {
        struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
 -      struct intel_dsi *intel_dsi = enc_to_intel_dsi(&encoder->base);
 +      struct intel_dsi *intel_dsi = enc_to_intel_dsi(encoder);
        enum port port;
        u32 val;
  
  static void vlv_dsi_device_ready(struct intel_encoder *encoder)
  {
        struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
 -      struct intel_dsi *intel_dsi = enc_to_intel_dsi(&encoder->base);
 +      struct intel_dsi *intel_dsi = enc_to_intel_dsi(encoder);
        enum port port;
        u32 val;
  
@@@ -515,7 -516,7 +515,7 @@@ static void intel_dsi_device_ready(stru
  static void glk_dsi_enter_low_power_mode(struct intel_encoder *encoder)
  {
        struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
 -      struct intel_dsi *intel_dsi = enc_to_intel_dsi(&encoder->base);
 +      struct intel_dsi *intel_dsi = enc_to_intel_dsi(encoder);
        enum port port;
        u32 val;
  
  static void glk_dsi_disable_mipi_io(struct intel_encoder *encoder)
  {
        struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
 -      struct intel_dsi *intel_dsi = enc_to_intel_dsi(&encoder->base);
 +      struct intel_dsi *intel_dsi = enc_to_intel_dsi(encoder);
        enum port port;
        u32 tmp;
  
@@@ -578,7 -579,7 +578,7 @@@ static void glk_dsi_clear_device_ready(
  static void vlv_dsi_clear_device_ready(struct intel_encoder *encoder)
  {
        struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
 -      struct intel_dsi *intel_dsi = enc_to_intel_dsi(&encoder->base);
 +      struct intel_dsi *intel_dsi = enc_to_intel_dsi(encoder);
        enum port port;
  
        DRM_DEBUG_KMS("\n");
@@@ -624,7 -625,7 +624,7 @@@ static void intel_dsi_port_enable(struc
  {
        struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
        struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
 -      struct intel_dsi *intel_dsi = enc_to_intel_dsi(&encoder->base);
 +      struct intel_dsi *intel_dsi = enc_to_intel_dsi(encoder);
        enum port port;
  
        if (intel_dsi->dual_link == DSI_DUAL_LINK_FRONT_BACK) {
@@@ -680,7 -681,7 +680,7 @@@ static void intel_dsi_port_disable(stru
  {
        struct drm_device *dev = encoder->base.dev;
        struct drm_i915_private *dev_priv = to_i915(dev);
 -      struct intel_dsi *intel_dsi = enc_to_intel_dsi(&encoder->base);
 +      struct intel_dsi *intel_dsi = enc_to_intel_dsi(encoder);
        enum port port;
  
        for_each_dsi_port(port, intel_dsi->ports) {
@@@ -744,7 -745,7 +744,7 @@@ static void intel_dsi_pre_enable(struc
                                 const struct intel_crtc_state *pipe_config,
                                 const struct drm_connector_state *conn_state)
  {
 -      struct intel_dsi *intel_dsi = enc_to_intel_dsi(&encoder->base);
 +      struct intel_dsi *intel_dsi = enc_to_intel_dsi(encoder);
        struct drm_crtc *crtc = pipe_config->uapi.crtc;
        struct drm_i915_private *dev_priv = to_i915(crtc->dev);
        struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
        if (!IS_GEMINILAKE(dev_priv))
                intel_dsi_prepare(encoder, pipe_config);
  
 -      /* Power on, try both CRC pmic gpio and VBT */
 -      if (intel_dsi->gpio_panel)
 -              gpiod_set_value_cansleep(intel_dsi->gpio_panel, 1);
        intel_dsi_vbt_exec_sequence(intel_dsi, MIPI_SEQ_POWER_ON);
        intel_dsi_msleep(intel_dsi, intel_dsi->panel_on_delay);
  
@@@ -846,7 -850,7 +846,7 @@@ static void intel_dsi_disable(struct in
                              const struct intel_crtc_state *old_crtc_state,
                              const struct drm_connector_state *old_conn_state)
  {
 -      struct intel_dsi *intel_dsi = enc_to_intel_dsi(&encoder->base);
 +      struct intel_dsi *intel_dsi = enc_to_intel_dsi(encoder);
        enum port port;
  
        DRM_DEBUG_KMS("\n");
@@@ -882,7 -886,7 +882,7 @@@ static void intel_dsi_post_disable(stru
                                   const struct drm_connector_state *old_conn_state)
  {
        struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
 -      struct intel_dsi *intel_dsi = enc_to_intel_dsi(&encoder->base);
 +      struct intel_dsi *intel_dsi = enc_to_intel_dsi(encoder);
        enum port port;
        u32 val;
  
        if (IS_GEN9_LP(dev_priv)) {
                intel_crtc_vblank_off(old_crtc_state);
  
 -              skylake_scaler_disable(old_crtc_state);
 +              skl_scaler_disable(old_crtc_state);
        }
  
        if (is_vid_mode(intel_dsi)) {
        /* Assert reset */
        intel_dsi_vbt_exec_sequence(intel_dsi, MIPI_SEQ_ASSERT_RESET);
  
 -      /* Power off, try both CRC pmic gpio and VBT */
        intel_dsi_msleep(intel_dsi, intel_dsi->panel_off_delay);
        intel_dsi_vbt_exec_sequence(intel_dsi, MIPI_SEQ_POWER_OFF);
 -      if (intel_dsi->gpio_panel)
 -              gpiod_set_value_cansleep(intel_dsi->gpio_panel, 0);
  
        /*
         * FIXME As we do with eDP, just make a note of the time here
@@@ -955,7 -962,7 +955,7 @@@ static bool intel_dsi_get_hw_state(stru
                                   enum pipe *pipe)
  {
        struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
 -      struct intel_dsi *intel_dsi = enc_to_intel_dsi(&encoder->base);
 +      struct intel_dsi *intel_dsi = enc_to_intel_dsi(encoder);
        intel_wakeref_t wakeref;
        enum port port;
        bool active = false;
@@@ -1034,7 -1041,7 +1034,7 @@@ static void bxt_dsi_get_pipe_config(str
                                        &pipe_config->hw.adjusted_mode;
        struct drm_display_mode *adjusted_mode_sw;
        struct intel_crtc *crtc = to_intel_crtc(pipe_config->uapi.crtc);
 -      struct intel_dsi *intel_dsi = enc_to_intel_dsi(&encoder->base);
 +      struct intel_dsi *intel_dsi = enc_to_intel_dsi(encoder);
        unsigned int lane_count = intel_dsi->lane_count;
        unsigned int bpp, fmt;
        enum port port;
@@@ -1227,7 -1234,7 +1227,7 @@@ static void set_dsi_timings(struct drm_
  {
        struct drm_device *dev = encoder->dev;
        struct drm_i915_private *dev_priv = to_i915(dev);
 -      struct intel_dsi *intel_dsi = enc_to_intel_dsi(encoder);
 +      struct intel_dsi *intel_dsi = enc_to_intel_dsi(to_intel_encoder(encoder));
        enum port port;
        unsigned int bpp = mipi_dsi_pixel_format_to_bpp(intel_dsi->pixel_format);
        unsigned int lane_count = intel_dsi->lane_count;
@@@ -1315,7 -1322,7 +1315,7 @@@ static void intel_dsi_prepare(struct in
        struct drm_device *dev = encoder->dev;
        struct drm_i915_private *dev_priv = to_i915(dev);
        struct intel_crtc *intel_crtc = to_intel_crtc(pipe_config->uapi.crtc);
 -      struct intel_dsi *intel_dsi = enc_to_intel_dsi(encoder);
 +      struct intel_dsi *intel_dsi = enc_to_intel_dsi(to_intel_encoder(encoder));
        const struct drm_display_mode *adjusted_mode = &pipe_config->hw.adjusted_mode;
        enum port port;
        unsigned int bpp = mipi_dsi_pixel_format_to_bpp(intel_dsi->pixel_format);
  static void intel_dsi_unprepare(struct intel_encoder *encoder)
  {
        struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
 -      struct intel_dsi *intel_dsi = enc_to_intel_dsi(&encoder->base);
 +      struct intel_dsi *intel_dsi = enc_to_intel_dsi(encoder);
        enum port port;
        u32 val;
  
  
  static void intel_dsi_encoder_destroy(struct drm_encoder *encoder)
  {
 -      struct intel_dsi *intel_dsi = enc_to_intel_dsi(encoder);
 -
 -      /* dispose of the gpios */
 -      if (intel_dsi->gpio_panel)
 -              gpiod_put(intel_dsi->gpio_panel);
 +      struct intel_dsi *intel_dsi = enc_to_intel_dsi(to_intel_encoder(encoder));
  
 +      intel_dsi_vbt_gpio_cleanup(intel_dsi);
        intel_encoder_destroy(encoder);
  }
  
@@@ -1628,10 -1638,9 +1628,9 @@@ static void vlv_dsi_add_properties(stru
  
                connector->base.state->scaling_mode = DRM_MODE_SCALE_ASPECT;
  
-               connector->base.display_info.panel_orientation =
-                       vlv_dsi_get_panel_orientation(connector);
-               drm_connector_init_panel_orientation_property(
+               drm_connector_set_panel_orientation_with_quirk(
                                &connector->base,
+                               vlv_dsi_get_panel_orientation(connector),
                                connector->panel.fixed_mode->hdisplay,
                                connector->panel.fixed_mode->vdisplay);
        }
@@@ -1815,7 -1824,6 +1814,7 @@@ void vlv_dsi_init(struct drm_i915_priva
        struct drm_connector *connector;
        struct drm_display_mode *current_mode, *fixed_mode;
        enum port port;
 +      enum pipe pipe;
  
        DRM_DEBUG_KMS("\n");
  
  
        vlv_dphy_param_init(intel_dsi);
  
 -      /*
 -       * In case of BYT with CRC PMIC, we need to use GPIO for
 -       * Panel control.
 -       */
 -      if ((IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv)) &&
 -          (dev_priv->vbt.dsi.config->pwm_blc == PPS_BLC_PMIC)) {
 -              intel_dsi->gpio_panel =
 -                      gpiod_get(dev->dev, "panel", GPIOD_OUT_HIGH);
 -
 -              if (IS_ERR(intel_dsi->gpio_panel)) {
 -                      DRM_ERROR("Failed to own gpio for panel control\n");
 -                      intel_dsi->gpio_panel = NULL;
 -              }
 -      }
 +      intel_dsi_vbt_gpio_init(intel_dsi,
 +                              intel_dsi_get_hw_state(intel_encoder, &pipe));
  
        drm_connector_init(dev, connector, &intel_dsi_connector_funcs,
                           DRM_MODE_CONNECTOR_DSI);
@@@ -469,12 -469,6 +469,12 @@@ static void vlv_free_s0ix_state(struct 
        i915->vlv_s0ix_state = NULL;
  }
  
 +static void sanitize_gpu(struct drm_i915_private *i915)
 +{
 +      if (!INTEL_INFO(i915)->gpu_reset_clobbers_display)
 +              __intel_gt_reset(&i915->gt, ALL_ENGINES);
 +}
 +
  /**
   * i915_driver_early_probe - setup state not requiring device access
   * @dev_priv: device private
@@@ -608,9 -602,6 +608,9 @@@ static int i915_driver_mmio_probe(struc
        if (ret)
                goto err_uncore;
  
 +      /* As early as possible, scrub existing GPU state before clobbering */
 +      sanitize_gpu(dev_priv);
 +
        return 0;
  
  err_uncore:
@@@ -1826,7 -1817,7 +1826,7 @@@ static int i915_drm_resume(struct drm_d
  
        disable_rpm_wakeref_asserts(&dev_priv->runtime_pm);
  
 -      intel_gt_sanitize(&dev_priv->gt, true);
 +      sanitize_gpu(dev_priv);
  
        ret = i915_ggtt_enable_hw(dev_priv);
        if (ret)
@@@ -2672,7 -2663,7 +2672,7 @@@ const struct dev_pm_ops i915_pm_ops = 
  static const struct file_operations i915_driver_fops = {
        .owner = THIS_MODULE,
        .open = drm_open,
-       .release = drm_release,
+       .release = drm_release_noglobal,
        .unlocked_ioctl = drm_ioctl,
        .mmap = i915_gem_mmap,
        .poll = drm_poll,
@@@ -159,10 -159,9 +159,10 @@@ int lima_sched_context_init(struct lima
                            struct lima_sched_context *context,
                            atomic_t *guilty)
  {
 -      struct drm_sched_rq *rq = pipe->base.sched_rq + DRM_SCHED_PRIORITY_NORMAL;
 +      struct drm_gpu_scheduler *sched = &pipe->base;
  
 -      return drm_sched_entity_init(&context->base, &rq, 1, guilty);
 +      return drm_sched_entity_init(&context->base, DRM_SCHED_PRIORITY_NORMAL,
 +                                   &sched, 1, guilty);
  }
  
  void lima_sched_context_fini(struct lima_sched_pipe *pipe,
@@@ -313,6 -312,26 +313,26 @@@ static const struct drm_sched_backend_o
        .free_job = lima_sched_free_job,
  };
  
+ static void lima_sched_recover_work(struct work_struct *work)
+ {
+       struct lima_sched_pipe *pipe =
+               container_of(work, struct lima_sched_pipe, recover_work);
+       int i;
+       for (i = 0; i < pipe->num_l2_cache; i++)
+               lima_l2_cache_flush(pipe->l2_cache[i]);
+       if (pipe->bcast_mmu) {
+               lima_mmu_flush_tlb(pipe->bcast_mmu);
+       } else {
+               for (i = 0; i < pipe->num_mmu; i++)
+                       lima_mmu_flush_tlb(pipe->mmu[i]);
+       }
+       if (pipe->task_recover(pipe))
+               drm_sched_fault(&pipe->base);
+ }
  int lima_sched_pipe_init(struct lima_sched_pipe *pipe, const char *name)
  {
        unsigned int timeout = lima_sched_timeout_ms > 0 ?
        pipe->fence_context = dma_fence_context_alloc(1);
        spin_lock_init(&pipe->fence_lock);
  
+       INIT_WORK(&pipe->recover_work, lima_sched_recover_work);
        return drm_sched_init(&pipe->base, &lima_sched_ops, 1, 0,
                              msecs_to_jiffies(timeout), name);
  }
@@@ -332,11 -353,14 +354,14 @@@ void lima_sched_pipe_fini(struct lima_s
  
  void lima_sched_pipe_task_done(struct lima_sched_pipe *pipe)
  {
-       if (pipe->error)
-               drm_sched_fault(&pipe->base);
-       else {
-               struct lima_sched_task *task = pipe->current_task;
+       struct lima_sched_task *task = pipe->current_task;
+       if (pipe->error) {
+               if (task && task->recoverable)
+                       schedule_work(&pipe->recover_work);
+               else
+                       drm_sched_fault(&pipe->base);
+       } else {
                pipe->task_fini(pipe);
                dma_fence_signal(task->fence);
        }
@@@ -647,13 -647,6 +647,6 @@@ nouveau_ttm_tt_create(struct ttm_buffer
  }
  
  static int
- nouveau_bo_invalidate_caches(struct ttm_bo_device *bdev, uint32_t flags)
- {
-       /* We'll do this from user space. */
-       return 0;
- }
- static int
  nouveau_bo_init_mem_type(struct ttm_bo_device *bdev, uint32_t type,
                         struct ttm_mem_type_manager *man)
  {
@@@ -1162,7 -1155,7 +1155,7 @@@ nouveau_bo_move_m2mf(struct ttm_buffer_
  void
  nouveau_bo_move_init(struct nouveau_drm *drm)
  {
 -      static const struct {
 +      static const struct _method_table {
                const char *name;
                int engine;
                s32 oclass;
                {  "M2MF", 0, 0x0039, nv04_bo_move_m2mf, nv04_bo_move_init },
                {},
                { "CRYPT", 0, 0x88b4, nv98_bo_move_exec, nv50_bo_move_init },
 -      }, *mthd = _methods;
 +      };
 +      const struct _method_table *mthd = _methods;
        const char *name = "CPU";
        int ret;
  
@@@ -1697,7 -1689,6 +1690,6 @@@ struct ttm_bo_driver nouveau_bo_driver 
        .ttm_tt_create = &nouveau_ttm_tt_create,
        .ttm_tt_populate = &nouveau_ttm_tt_populate,
        .ttm_tt_unpopulate = &nouveau_ttm_tt_unpopulate,
-       .invalidate_caches = nouveau_bo_invalidate_caches,
        .init_mem_type = nouveau_bo_init_mem_type,
        .eviction_valuable = ttm_bo_eviction_valuable,
        .evict_flags = nouveau_bo_evict_flags,
@@@ -268,25 -268,9 +268,25 @@@ static void panfrost_job_cleanup(struc
        dma_fence_put(job->done_fence);
        dma_fence_put(job->render_done_fence);
  
 +      if (job->mappings) {
 +              for (i = 0; i < job->bo_count; i++) {
 +                      if (!job->mappings[i])
 +                              break;
 +
 +                      atomic_dec(&job->mappings[i]->obj->gpu_usecount);
 +                      panfrost_gem_mapping_put(job->mappings[i]);
 +              }
 +              kvfree(job->mappings);
 +      }
 +
        if (job->bos) {
 -              for (i = 0; i < job->bo_count; i++)
 +              struct panfrost_gem_object *bo;
 +
 +              for (i = 0; i < job->bo_count; i++) {
 +                      bo = to_panfrost_bo(job->bos[i]);
                        drm_gem_object_put_unlocked(job->bos[i]);
 +              }
 +
                kvfree(job->bos);
        }
  
@@@ -512,7 -496,7 +512,7 @@@ int panfrost_job_init(struct panfrost_d
                return -ENODEV;
  
        ret = devm_request_irq(pfdev->dev, irq, panfrost_job_irq_handler,
-                              IRQF_SHARED, "job", pfdev);
+                              IRQF_SHARED, KBUILD_MODNAME "-job", pfdev);
        if (ret) {
                dev_err(pfdev->dev, "failed to request job irq");
                return ret;
@@@ -558,14 -542,12 +558,14 @@@ int panfrost_job_open(struct panfrost_f
  {
        struct panfrost_device *pfdev = panfrost_priv->pfdev;
        struct panfrost_job_slot *js = pfdev->js;
 -      struct drm_sched_rq *rq;
 +      struct drm_gpu_scheduler *sched;
        int ret, i;
  
        for (i = 0; i < NUM_JOB_SLOTS; i++) {
 -              rq = &js->queue[i].sched.sched_rq[DRM_SCHED_PRIORITY_NORMAL];
 -              ret = drm_sched_entity_init(&panfrost_priv->sched_entity[i], &rq, 1, NULL);
 +              sched = &js->queue[i].sched;
 +              ret = drm_sched_entity_init(&panfrost_priv->sched_entity[i],
 +                                          DRM_SCHED_PRIORITY_NORMAL, &sched,
 +                                          1, NULL);
                if (WARN_ON(ret))
                        return ret;
        }
@@@ -269,15 -269,14 +269,15 @@@ static int mmu_map_sg(struct panfrost_d
        return 0;
  }
  
 -int panfrost_mmu_map(struct panfrost_gem_object *bo)
 +int panfrost_mmu_map(struct panfrost_gem_mapping *mapping)
  {
 +      struct panfrost_gem_object *bo = mapping->obj;
        struct drm_gem_object *obj = &bo->base.base;
        struct panfrost_device *pfdev = to_panfrost_device(obj->dev);
        struct sg_table *sgt;
        int prot = IOMMU_READ | IOMMU_WRITE;
  
 -      if (WARN_ON(bo->is_mapped))
 +      if (WARN_ON(mapping->active))
                return 0;
  
        if (bo->noexec)
        if (WARN_ON(IS_ERR(sgt)))
                return PTR_ERR(sgt);
  
 -      mmu_map_sg(pfdev, bo->mmu, bo->node.start << PAGE_SHIFT, prot, sgt);
 -      bo->is_mapped = true;
 +      mmu_map_sg(pfdev, mapping->mmu, mapping->mmnode.start << PAGE_SHIFT,
 +                 prot, sgt);
 +      mapping->active = true;
  
        return 0;
  }
  
 -void panfrost_mmu_unmap(struct panfrost_gem_object *bo)
 +void panfrost_mmu_unmap(struct panfrost_gem_mapping *mapping)
  {
 +      struct panfrost_gem_object *bo = mapping->obj;
        struct drm_gem_object *obj = &bo->base.base;
        struct panfrost_device *pfdev = to_panfrost_device(obj->dev);
 -      struct io_pgtable_ops *ops = bo->mmu->pgtbl_ops;
 -      u64 iova = bo->node.start << PAGE_SHIFT;
 -      size_t len = bo->node.size << PAGE_SHIFT;
 +      struct io_pgtable_ops *ops = mapping->mmu->pgtbl_ops;
 +      u64 iova = mapping->mmnode.start << PAGE_SHIFT;
 +      size_t len = mapping->mmnode.size << PAGE_SHIFT;
        size_t unmapped_len = 0;
  
 -      if (WARN_ON(!bo->is_mapped))
 +      if (WARN_ON(!mapping->active))
                return;
  
 -      dev_dbg(pfdev->dev, "unmap: as=%d, iova=%llx, len=%zx", bo->mmu->as, iova, len);
 +      dev_dbg(pfdev->dev, "unmap: as=%d, iova=%llx, len=%zx",
 +              mapping->mmu->as, iova, len);
  
        while (unmapped_len < len) {
                size_t unmapped_page;
                unmapped_len += pgsize;
        }
  
 -      panfrost_mmu_flush_range(pfdev, bo->mmu, bo->node.start << PAGE_SHIFT, len);
 -      bo->is_mapped = false;
 +      panfrost_mmu_flush_range(pfdev, mapping->mmu,
 +                               mapping->mmnode.start << PAGE_SHIFT, len);
 +      mapping->active = false;
  }
  
  static void mmu_tlb_inv_context_s1(void *cookie)
@@@ -399,10 -394,10 +399,10 @@@ void panfrost_mmu_pgtable_free(struct p
        free_io_pgtable_ops(mmu->pgtbl_ops);
  }
  
 -static struct panfrost_gem_object *
 -addr_to_drm_mm_node(struct panfrost_device *pfdev, int as, u64 addr)
 +static struct panfrost_gem_mapping *
 +addr_to_mapping(struct panfrost_device *pfdev, int as, u64 addr)
  {
 -      struct panfrost_gem_object *bo = NULL;
 +      struct panfrost_gem_mapping *mapping = NULL;
        struct panfrost_file_priv *priv;
        struct drm_mm_node *node;
        u64 offset = addr >> PAGE_SHIFT;
@@@ -423,9 -418,8 +423,9 @@@ found_mmu
        drm_mm_for_each_node(node, &priv->mm) {
                if (offset >= node->start &&
                    offset < (node->start + node->size)) {
 -                      bo = drm_mm_node_to_panfrost_bo(node);
 -                      drm_gem_object_get(&bo->base.base);
 +                      mapping = drm_mm_node_to_panfrost_mapping(node);
 +
 +                      kref_get(&mapping->refcount);
                        break;
                }
        }
        spin_unlock(&priv->mm_lock);
  out:
        spin_unlock(&pfdev->as_lock);
 -      return bo;
 +      return mapping;
  }
  
  #define NUM_FAULT_PAGES (SZ_2M / PAGE_SIZE)
@@@ -442,30 -436,28 +442,30 @@@ static int panfrost_mmu_map_fault_addr(
                                       u64 addr)
  {
        int ret, i;
 +      struct panfrost_gem_mapping *bomapping;
        struct panfrost_gem_object *bo;
        struct address_space *mapping;
        pgoff_t page_offset;
        struct sg_table *sgt;
        struct page **pages;
  
 -      bo = addr_to_drm_mm_node(pfdev, as, addr);
 -      if (!bo)
 +      bomapping = addr_to_mapping(pfdev, as, addr);
 +      if (!bomapping)
                return -ENOENT;
  
 +      bo = bomapping->obj;
        if (!bo->is_heap) {
                dev_WARN(pfdev->dev, "matching BO is not heap type (GPU VA = %llx)",
 -                       bo->node.start << PAGE_SHIFT);
 +                       bomapping->mmnode.start << PAGE_SHIFT);
                ret = -EINVAL;
                goto err_bo;
        }
 -      WARN_ON(bo->mmu->as != as);
 +      WARN_ON(bomapping->mmu->as != as);
  
        /* Assume 2MB alignment and size multiple */
        addr &= ~((u64)SZ_2M - 1);
        page_offset = addr >> PAGE_SHIFT;
 -      page_offset -= bo->node.start;
 +      page_offset -= bomapping->mmnode.start;
  
        mutex_lock(&bo->base.pages_lock);
  
                goto err_map;
        }
  
 -      mmu_map_sg(pfdev, bo->mmu, addr, IOMMU_WRITE | IOMMU_READ | IOMMU_NOEXEC, sgt);
 +      mmu_map_sg(pfdev, bomapping->mmu, addr,
 +                 IOMMU_WRITE | IOMMU_READ | IOMMU_NOEXEC, sgt);
  
 -      bo->is_mapped = true;
 +      bomapping->active = true;
  
        dev_dbg(pfdev->dev, "mapped page fault @ AS%d %llx", as, addr);
  
 -      drm_gem_object_put_unlocked(&bo->base.base);
 +      panfrost_gem_mapping_put(bomapping);
  
        return 0;
  
@@@ -641,9 -632,11 +641,11 @@@ int panfrost_mmu_init(struct panfrost_d
        if (irq <= 0)
                return -ENODEV;
  
-       err = devm_request_threaded_irq(pfdev->dev, irq, panfrost_mmu_irq_handler,
+       err = devm_request_threaded_irq(pfdev->dev, irq,
+                                       panfrost_mmu_irq_handler,
                                        panfrost_mmu_irq_handler_thread,
-                                       IRQF_SHARED, "mmu", pfdev);
+                                       IRQF_SHARED, KBUILD_MODNAME "-mmu",
+                                       pfdev);
  
        if (err) {
                dev_err(pfdev->dev, "failed to request mmu irq");
@@@ -66,11 -66,6 +66,6 @@@ static struct radeon_device *radeon_get
        return rdev;
  }
  
- static int radeon_invalidate_caches(struct ttm_bo_device *bdev, uint32_t flags)
- {
-       return 0;
- }
  static int radeon_init_mem_type(struct ttm_bo_device *bdev, uint32_t type,
                                struct ttm_mem_type_manager *man)
  {
@@@ -443,7 -438,7 +438,7 @@@ static int radeon_ttm_io_mem_reserve(st
                                           mem->bus.size);
                else
                        mem->bus.addr =
 -                              ioremap_nocache(mem->bus.base + mem->bus.offset,
 +                              ioremap(mem->bus.base + mem->bus.offset,
                                                mem->bus.size);
                if (!mem->bus.addr)
                        return -ENOMEM;
@@@ -774,7 -769,6 +769,6 @@@ static struct ttm_bo_driver radeon_bo_d
        .ttm_tt_create = &radeon_ttm_tt_create,
        .ttm_tt_populate = &radeon_ttm_tt_populate,
        .ttm_tt_unpopulate = &radeon_ttm_tt_unpopulate,
-       .invalidate_caches = &radeon_invalidate_caches,
        .init_mem_type = &radeon_init_mem_type,
        .eviction_valuable = ttm_bo_eviction_valuable,
        .evict_flags = &radeon_evict_flags,
@@@ -27,7 -27,7 +27,7 @@@ config VGACON_SOFT_SCROLLBAC
         depends on VGA_CONSOLE
         default n
         help
-          The scrollback buffer of the standard VGA console is located in
+        The scrollback buffer of the standard VGA console is located in
         the VGA RAM.  The size of this RAM is fixed and is quite small.
         If you require a larger scrollback buffer, this can be placed in
         System RAM which is dynamically allocated during initialization.
@@@ -84,36 -84,37 +84,36 @@@ config MDA_CONSOL
          If unsure, say N.
  
  config SGI_NEWPORT_CONSOLE
-         tristate "SGI Newport Console support"
+       tristate "SGI Newport Console support"
        depends on SGI_IP22 && HAS_IOMEM
-         select FONT_SUPPORT
-         help
-           Say Y here if you want the console on the Newport aka XL graphics
-           card of your Indy.  Most people say Y here.
+       select FONT_SUPPORT
+       help
+         Say Y here if you want the console on the Newport aka XL graphics
+         card of your Indy.  Most people say Y here.
  
  config DUMMY_CONSOLE
        bool
 -      depends on VGA_CONSOLE!=y || SGI_NEWPORT_CONSOLE!=y 
        default y
  
  config DUMMY_CONSOLE_COLUMNS
-         int "Initial number of console screen columns"
-         depends on DUMMY_CONSOLE && !ARM
-         default 160 if PARISC
-         default 80
-         help
-           On PA-RISC, the default value is 160, which should fit a 1280x1024
-           monitor.
-           Select 80 if you use a 640x480 resolution by default.
+       int "Initial number of console screen columns"
+       depends on DUMMY_CONSOLE && !ARM
+       default 160 if PARISC
+       default 80
+       help
+         On PA-RISC, the default value is 160, which should fit a 1280x1024
+         monitor.
+         Select 80 if you use a 640x480 resolution by default.
  
  config DUMMY_CONSOLE_ROWS
-         int "Initial number of console screen rows"
-         depends on DUMMY_CONSOLE && !ARM
-         default 64 if PARISC
-         default 25
-         help
-           On PA-RISC, the default value is 64, which should fit a 1280x1024
-           monitor.
-           Select 25 if you use a 640x480 resolution by default.
+       int "Initial number of console screen rows"
+       depends on DUMMY_CONSOLE && !ARM
+       default 64 if PARISC
+       default 25
+       help
+         On PA-RISC, the default value is 64, which should fit a 1280x1024
+         monitor.
+         Select 25 if you use a 640x480 resolution by default.
  
  config FRAMEBUFFER_CONSOLE
        bool "Framebuffer Console support"
@@@ -129,11 -130,11 +129,11 @@@ config FRAMEBUFFER_CONSOLE_DETECT_PRIMA
         depends on FRAMEBUFFER_CONSOLE
         default n
         ---help---
-          If this option is selected, the framebuffer console will
-          automatically select the primary display device (if the architecture
+        If this option is selected, the framebuffer console will
+        automatically select the primary display device (if the architecture
         supports this feature).  Otherwise, the framebuffer console will
-          always select the first framebuffer driver that is loaded. The latter
-          is the default behavior.
+        always select the first framebuffer driver that is loaded. The latter
+        is the default behavior.
  
         You can always override the automatic selection of the primary device
         by using the fbcon=map: boot option.
@@@ -144,11 -145,11 +144,11 @@@ config FRAMEBUFFER_CONSOLE_ROTATIO
         bool "Framebuffer Console Rotation"
         depends on FRAMEBUFFER_CONSOLE
         help
-          Enable display rotation for the framebuffer console.  This is done
-          in software and may be significantly slower than a normally oriented
-          display.  Note that the rotation is done at the console level only
-          such that other users of the framebuffer will remain normally
-          oriented.
+        Enable display rotation for the framebuffer console.  This is done
+        in software and may be significantly slower than a normally oriented
+        display.  Note that the rotation is done at the console level only
+        such that other users of the framebuffer will remain normally
+        oriented.
  
  config FRAMEBUFFER_CONSOLE_DEFERRED_TAKEOVER
        bool "Framebuffer Console Deferred Takeover"
          black screen as soon as fbcon loads.
  
  config STI_CONSOLE
-         bool "STI text console"
+       bool "STI text console"
        depends on PARISC && HAS_IOMEM
-         select FONT_SUPPORT
-         default y
-         help
-           The STI console is the builtin display/keyboard on HP-PARISC
-           machines.  Say Y here to build support for it into your kernel.
-           The alternative is to use your primary serial port as a console.
+       select FONT_SUPPORT
+       default y
+       help
+         The STI console is the builtin display/keyboard on HP-PARISC
+         machines.  Say Y here to build support for it into your kernel.
+         The alternative is to use your primary serial port as a console.
  
  endmenu
  
   * "set-vmvideo" command. For example
   *     set-vmvideo -vmname name -horizontalresolution:1920 \
   * -verticalresolution:1200 -resolutiontype single
 + *
 + * Gen 1 VMs also support direct using VM's physical memory for framebuffer.
 + * It could improve the efficiency and performance for framebuffer and VM.
 + * This requires to allocate contiguous physical memory from Linux kernel's
 + * CMA memory allocator. To enable this, supply a kernel parameter to give
 + * enough memory space to CMA allocator for framebuffer. For example:
 + *    cma=130m
 + * This gives 130MB memory to CMA allocator that can be allocated to
 + * framebuffer. For reference, 8K resolution (7680x4320) takes about
 + * 127MB memory.
   */
  
  #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
@@@ -238,6 -228,7 +238,6 @@@ struct synthvid_msg 
  } __packed;
  
  
 -
  /* FB driver definitions and structures */
  #define HVFB_WIDTH 1152 /* default screen width */
  #define HVFB_HEIGHT 864 /* default screen height */
@@@ -267,15 -258,12 +267,15 @@@ struct hvfb_par 
        /* If true, the VSC notifies the VSP on every framebuffer change */
        bool synchronous_fb;
  
 +      /* If true, need to copy from deferred IO mem to framebuffer mem */
 +      bool need_docopy;
 +
        struct notifier_block hvfb_panic_nb;
  
        /* Memory for deferred IO and frame buffer itself */
        unsigned char *dio_vp;
        unsigned char *mmio_vp;
 -      unsigned long mmio_pp;
 +      phys_addr_t mmio_pp;
  
        /* Dirty rectangle, protected by delayed_refresh_lock */
        int x1, y1, x2, y2;
@@@ -446,7 -434,7 +446,7 @@@ static void synthvid_deferred_io(struc
                maxy = max_t(int, maxy, y2);
  
                /* Copy from dio space to mmio address */
 -              if (par->fb_ready)
 +              if (par->fb_ready && par->need_docopy)
                        hvfb_docopy(par, start, PAGE_SIZE);
        }
  
@@@ -594,8 -582,8 +594,8 @@@ static int synthvid_get_supported_resol
        t = wait_for_completion_timeout(&par->wait, VSP_TIMEOUT);
        if (!t) {
                pr_err("Time out on waiting resolution response\n");
-                       ret = -ETIMEDOUT;
-                       goto out;
+               ret = -ETIMEDOUT;
+               goto out;
        }
  
        if (msg->resolution_resp.resolution_count == 0) {
@@@ -763,12 -751,12 +763,12 @@@ static void hvfb_update_work(struct wor
                return;
  
        /* Copy the dirty rectangle to frame buffer memory */
 -      for (j = y1; j < y2; j++) {
 -              hvfb_docopy(par,
 -                          j * info->fix.line_length +
 -                          (x1 * screen_depth / 8),
 -                          (x2 - x1) * screen_depth / 8);
 -      }
 +      if (par->need_docopy)
 +              for (j = y1; j < y2; j++)
 +                      hvfb_docopy(par,
 +                                  j * info->fix.line_length +
 +                                  (x1 * screen_depth / 8),
 +                                  (x2 - x1) * screen_depth / 8);
  
        /* Refresh */
        if (par->fb_ready && par->update)
@@@ -813,8 -801,7 +813,8 @@@ static int hvfb_on_panic(struct notifie
        par = container_of(nb, struct hvfb_par, hvfb_panic_nb);
        par->synchronous_fb = true;
        info = par->info;
 -      hvfb_docopy(par, 0, dio_fb_size);
 +      if (par->need_docopy)
 +              hvfb_docopy(par, 0, dio_fb_size);
        synthvid_update(info, 0, 0, INT_MAX, INT_MAX);
  
        return NOTIFY_DONE;
@@@ -953,62 -940,6 +953,62 @@@ static void hvfb_get_option(struct fb_i
        return;
  }
  
 +/*
 + * Allocate enough contiguous physical memory.
 + * Return physical address if succeeded or -1 if failed.
 + */
 +static phys_addr_t hvfb_get_phymem(struct hv_device *hdev,
 +                                 unsigned int request_size)
 +{
 +      struct page *page = NULL;
 +      dma_addr_t dma_handle;
 +      void *vmem;
 +      phys_addr_t paddr = 0;
 +      unsigned int order = get_order(request_size);
 +
 +      if (request_size == 0)
 +              return -1;
 +
 +      if (order < MAX_ORDER) {
 +              /* Call alloc_pages if the size is less than 2^MAX_ORDER */
 +              page = alloc_pages(GFP_KERNEL | __GFP_ZERO, order);
 +              if (!page)
 +                      return -1;
 +
 +              paddr = (page_to_pfn(page) << PAGE_SHIFT);
 +      } else {
 +              /* Allocate from CMA */
 +              hdev->device.coherent_dma_mask = DMA_BIT_MASK(64);
 +
 +              vmem = dma_alloc_coherent(&hdev->device,
 +                                        round_up(request_size, PAGE_SIZE),
 +                                        &dma_handle,
 +                                        GFP_KERNEL | __GFP_NOWARN);
 +
 +              if (!vmem)
 +                      return -1;
 +
 +              paddr = virt_to_phys(vmem);
 +      }
 +
 +      return paddr;
 +}
 +
 +/* Release contiguous physical memory */
 +static void hvfb_release_phymem(struct hv_device *hdev,
 +                              phys_addr_t paddr, unsigned int size)
 +{
 +      unsigned int order = get_order(size);
 +
 +      if (order < MAX_ORDER)
 +              __free_pages(pfn_to_page(paddr >> PAGE_SHIFT), order);
 +      else
 +              dma_free_coherent(&hdev->device,
 +                                round_up(size, PAGE_SIZE),
 +                                phys_to_virt(paddr),
 +                                paddr);
 +}
 +
  
  /* Get framebuffer memory from Hyper-V video pci space */
  static int hvfb_getmem(struct hv_device *hdev, struct fb_info *info)
        void __iomem *fb_virt;
        int gen2vm = efi_enabled(EFI_BOOT);
        resource_size_t pot_start, pot_end;
 +      phys_addr_t paddr;
        int ret;
  
 -      dio_fb_size =
 -              screen_width * screen_height * screen_depth / 8;
 +      info->apertures = alloc_apertures(1);
 +      if (!info->apertures)
 +              return -ENOMEM;
  
 -      if (gen2vm) {
 -              pot_start = 0;
 -              pot_end = -1;
 -      } else {
 +      if (!gen2vm) {
                pdev = pci_get_device(PCI_VENDOR_ID_MICROSOFT,
 -                            PCI_DEVICE_ID_HYPERV_VIDEO, NULL);
 +                      PCI_DEVICE_ID_HYPERV_VIDEO, NULL);
                if (!pdev) {
                        pr_err("Unable to find PCI Hyper-V video\n");
 +                      kfree(info->apertures);
                        return -ENODEV;
                }
  
 +              info->apertures->ranges[0].base = pci_resource_start(pdev, 0);
 +              info->apertures->ranges[0].size = pci_resource_len(pdev, 0);
 +
 +              /*
 +               * For Gen 1 VM, we can directly use the contiguous memory
 +               * from VM. If we succeed, deferred IO happens directly
 +               * on this allocated framebuffer memory, avoiding extra
 +               * memory copy.
 +               */
 +              paddr = hvfb_get_phymem(hdev, screen_fb_size);
 +              if (paddr != (phys_addr_t) -1) {
 +                      par->mmio_pp = paddr;
 +                      par->mmio_vp = par->dio_vp = __va(paddr);
 +
 +                      info->fix.smem_start = paddr;
 +                      info->fix.smem_len = screen_fb_size;
 +                      info->screen_base = par->mmio_vp;
 +                      info->screen_size = screen_fb_size;
 +
 +                      par->need_docopy = false;
 +                      goto getmem_done;
 +              }
 +              pr_info("Unable to allocate enough contiguous physical memory on Gen 1 VM. Using MMIO instead.\n");
 +      } else {
 +              info->apertures->ranges[0].base = screen_info.lfb_base;
 +              info->apertures->ranges[0].size = screen_info.lfb_size;
 +      }
 +
 +      /*
 +       * Cannot use the contiguous physical memory.
 +       * Allocate mmio space for framebuffer.
 +       */
 +      dio_fb_size =
 +              screen_width * screen_height * screen_depth / 8;
 +
 +      if (gen2vm) {
 +              pot_start = 0;
 +              pot_end = -1;
 +      } else {
                if (!(pci_resource_flags(pdev, 0) & IORESOURCE_MEM) ||
                    pci_resource_len(pdev, 0) < screen_fb_size) {
                        pr_err("Resource not available or (0x%lx < 0x%lx)\n",
        if (par->dio_vp == NULL)
                goto err3;
  
 -      info->apertures = alloc_apertures(1);
 -      if (!info->apertures)
 -              goto err4;
 -
 -      if (gen2vm) {
 -              info->apertures->ranges[0].base = screen_info.lfb_base;
 -              info->apertures->ranges[0].size = screen_info.lfb_size;
 -              remove_conflicting_framebuffers(info->apertures,
 -                                              KBUILD_MODNAME, false);
 -      } else {
 -              info->apertures->ranges[0].base = pci_resource_start(pdev, 0);
 -              info->apertures->ranges[0].size = pci_resource_len(pdev, 0);
 -      }
 -
        /* Physical address of FB device */
        par->mmio_pp = par->mem->start;
        /* Virtual address of FB device */
        info->screen_base = par->dio_vp;
        info->screen_size = dio_fb_size;
  
 +getmem_done:
 +      remove_conflicting_framebuffers(info->apertures,
 +                                      KBUILD_MODNAME, false);
        if (!gen2vm)
                pci_dev_put(pdev);
 +      kfree(info->apertures);
  
        return 0;
  
 -err4:
 -      vfree(par->dio_vp);
  err3:
        iounmap(fb_virt);
  err2:
  err1:
        if (!gen2vm)
                pci_dev_put(pdev);
 +      kfree(info->apertures);
  
        return -ENOMEM;
  }
  
  /* Release the framebuffer */
 -static void hvfb_putmem(struct fb_info *info)
 +static void hvfb_putmem(struct hv_device *hdev, struct fb_info *info)
  {
        struct hvfb_par *par = info->par;
  
 -      vfree(par->dio_vp);
 -      iounmap(info->screen_base);
 -      vmbus_free_mmio(par->mem->start, screen_fb_size);
 +      if (par->need_docopy) {
 +              vfree(par->dio_vp);
 +              iounmap(info->screen_base);
 +              vmbus_free_mmio(par->mem->start, screen_fb_size);
 +      } else {
 +              hvfb_release_phymem(hdev, info->fix.smem_start,
 +                                  screen_fb_size);
 +      }
 +
        par->mem = NULL;
  }
  
@@@ -1165,7 -1062,6 +1165,7 @@@ static int hvfb_probe(struct hv_device 
        par = info->par;
        par->info = info;
        par->fb_ready = false;
 +      par->need_docopy = true;
        init_completion(&par->wait);
        INIT_DELAYED_WORK(&par->dwork, hvfb_update_work);
  
  
  error:
        fb_deferred_io_cleanup(info);
 -      hvfb_putmem(info);
 +      hvfb_putmem(hdev, info);
  error2:
        vmbus_close(hdev->channel);
  error1:
@@@ -1281,7 -1177,7 +1281,7 @@@ static int hvfb_remove(struct hv_devic
        vmbus_close(hdev->channel);
        hv_set_drvdata(hdev, NULL);
  
 -      hvfb_putmem(info);
 +      hvfb_putmem(hdev, info);
        framebuffer_release(info);
  
        return 0;
@@@ -1298,7 -1194,6 +1298,7 @@@ static int hvfb_suspend(struct hv_devic
        fb_set_suspend(info, 1);
  
        cancel_delayed_work_sync(&par->dwork);
 +      cancel_delayed_work_sync(&info->deferred_work);
  
        par->update_saved = par->update;
        par->update = false;
@@@ -1332,7 -1227,6 +1332,7 @@@ static int hvfb_resume(struct hv_devic
        par->fb_ready = true;
        par->update = par->update_saved;
  
 +      schedule_delayed_work(&info->deferred_work, info->fbdefio->delay);
        schedule_delayed_work(&par->dwork, HVFB_UPDATE_DELAY);
  
        /* 0 means do resume */
@@@ -665,7 -665,7 +665,7 @@@ static int pxa168fb_probe(struct platfo
        /*
         * Map LCD controller registers.
         */
 -      fbi->reg_base = devm_ioremap_nocache(&pdev->dev, res->start,
 +      fbi->reg_base = devm_ioremap(&pdev->dev, res->start,
                                             resource_size(res));
        if (fbi->reg_base == NULL) {
                ret = -ENOMEM;
@@@ -769,7 -769,7 +769,7 @@@ failed_free_fbmem
        dma_free_wc(fbi->dev, info->fix.smem_len,
                    info->screen_base, fbi->fb_start_dma);
  failed_free_info:
-       kfree(info);
+       framebuffer_release(info);
  
        dev_err(&pdev->dev, "frame buffer device init failed with %d\n", ret);
        return ret;
@@@ -746,9 -746,9 +746,9 @@@ s1d13xxxfb_remove(struct platform_devic
        }
  
        release_mem_region(pdev->resource[0].start,
-                       pdev->resource[0].end - pdev->resource[0].start +1);
+                          resource_size(&pdev->resource[0]));
        release_mem_region(pdev->resource[1].start,
-                       pdev->resource[1].end - pdev->resource[1].start +1);
+                          resource_size(&pdev->resource[1]));
        return 0;
  }
  
@@@ -788,14 -788,14 +788,14 @@@ static int s1d13xxxfb_probe(struct plat
        }
  
        if (!request_mem_region(pdev->resource[0].start,
-               pdev->resource[0].end - pdev->resource[0].start +1, "s1d13xxxfb mem")) {
+               resource_size(&pdev->resource[0]), "s1d13xxxfb mem")) {
                dev_dbg(&pdev->dev, "request_mem_region failed\n");
                ret = -EBUSY;
                goto bail;
        }
  
        if (!request_mem_region(pdev->resource[1].start,
-               pdev->resource[1].end - pdev->resource[1].start +1, "s1d13xxxfb regs")) {
+               resource_size(&pdev->resource[1]), "s1d13xxxfb regs")) {
                dev_dbg(&pdev->dev, "request_mem_region failed\n");
                ret = -EBUSY;
                goto bail;
  
        platform_set_drvdata(pdev, info);
        default_par = info->par;
 -      default_par->regs = ioremap_nocache(pdev->resource[1].start,
 -                                          resource_size(&pdev->resource[1]));
 +      default_par->regs = ioremap(pdev->resource[1].start,
-                       pdev->resource[1].end - pdev->resource[1].start +1);
++                                  resource_size(&pdev->resource[1]));
        if (!default_par->regs) {
                printk(KERN_ERR PFX "unable to map registers\n");
                ret = -ENOMEM;
        }
        info->pseudo_palette = default_par->pseudo_palette;
  
 -      info->screen_base = ioremap_nocache(pdev->resource[0].start,
 -                                          resource_size(&pdev->resource[0]));
 +      info->screen_base = ioremap(pdev->resource[0].start,
-                       pdev->resource[0].end - pdev->resource[0].start +1);
++                                  resource_size(&pdev->resource[0]));
 +
        if (!info->screen_base) {
                printk(KERN_ERR PFX "unable to map framebuffer\n");
                ret = -ENOMEM;
  
        info->fix = s1d13xxxfb_fix;
        info->fix.mmio_start = pdev->resource[1].start;
-       info->fix.mmio_len = pdev->resource[1].end - pdev->resource[1].start + 1;
+       info->fix.mmio_len = resource_size(&pdev->resource[1]);
        info->fix.smem_start = pdev->resource[0].start;
-       info->fix.smem_len = pdev->resource[0].end - pdev->resource[0].start + 1;
+       info->fix.smem_len = resource_size(&pdev->resource[0]);
  
        printk(KERN_INFO PFX "regs mapped at 0x%p, fb %d KiB mapped at 0x%p\n",
               default_par->regs, info->fix.smem_len / 1024, info->screen_base);
  # define DP_DS_12BPC                      2
  # define DP_DS_16BPC                      3
  
+ #define DP_MAX_DOWNSTREAM_PORTS                   0x10
  /* DP Forward error Correction Registers */
  #define DP_FEC_CAPABILITY                 0x090    /* 1.4 */
  # define DP_FEC_CAPABLE                           (1 << 0)
@@@ -1465,7 -1467,6 +1467,7 @@@ int drm_dp_downstream_id(struct drm_dp_
  void drm_dp_downstream_debug(struct seq_file *m, const u8 dpcd[DP_RECEIVER_CAP_SIZE],
                             const u8 port_cap[4], struct drm_dp_aux *aux);
  
 +void drm_dp_remote_aux_init(struct drm_dp_aux *aux);
  void drm_dp_aux_init(struct drm_dp_aux *aux);
  int drm_dp_aux_register(struct drm_dp_aux *aux);
  void drm_dp_aux_unregister(struct drm_dp_aux *aux);
@@@ -1523,13 -1524,6 +1525,13 @@@ enum drm_dp_quirk 
         * The driver should ignore SINK_COUNT during detection.
         */
        DP_DPCD_QUIRK_NO_SINK_COUNT,
 +      /**
 +       * @DP_DPCD_QUIRK_DSC_WITHOUT_VIRTUAL_DPCD:
 +       *
 +       * The device supports MST DSC despite not supporting Virtual DPCD.
 +       * The DSC caps can be read from the physical aux instead.
 +       */
 +      DP_DPCD_QUIRK_DSC_WITHOUT_VIRTUAL_DPCD,
  };
  
  /**
@@@ -156,8 -156,6 +156,8 @@@ struct drm_dp_mst_port 
         * audio-capable.
         */
        bool has_audio;
 +
 +      bool fec_capable;
  };
  
  /**
@@@ -385,7 -383,6 +385,7 @@@ struct drm_dp_port_number_req 
  
  struct drm_dp_enum_path_resources_ack_reply {
        u8 port_number;
 +      bool fec_capable;
        u16 full_payload_bw_number;
        u16 avail_payload_bw_number;
  };
@@@ -502,8 -499,6 +502,8 @@@ struct drm_dp_payload 
  struct drm_dp_vcpi_allocation {
        struct drm_dp_mst_port *port;
        int vcpi;
 +      int pbn;
 +      bool dsc_enabled;
        struct list_head next;
  };
  
@@@ -618,12 -613,6 +618,12 @@@ struct drm_dp_mst_topology_mgr 
         * &drm_dp_sideband_msg_tx.state once they are queued
         */
        struct mutex qlock;
 +
 +      /**
 +       * @is_waiting_for_dwn_reply: indicate whether is waiting for down reply
 +       */
 +      bool is_waiting_for_dwn_reply;
 +
        /**
         * @tx_msg_downq: List of pending down replies.
         */
        struct mutex payload_lock;
        /**
         * @proposed_vcpis: Array of pointers for the new VCPI allocation. The
-        * VCPI structure itself is &drm_dp_mst_port.vcpi.
+        * VCPI structure itself is &drm_dp_mst_port.vcpi, and the size of
+        * this array is determined by @max_payloads.
         */
        struct drm_dp_vcpi **proposed_vcpis;
        /**
-        * @payloads: Array of payloads.
+        * @payloads: Array of payloads. The size of this array is determined
+        * by @max_payloads.
         */
        struct drm_dp_payload *payloads;
        /**
@@@ -738,7 -729,8 +740,7 @@@ bool drm_dp_mst_port_has_audio(struct d
  struct edid *drm_dp_mst_get_edid(struct drm_connector *connector, struct drm_dp_mst_topology_mgr *mgr, struct drm_dp_mst_port *port);
  
  
 -int drm_dp_calc_pbn_mode(int clock, int bpp);
 -
 +int drm_dp_calc_pbn_mode(int clock, int bpp, bool dsc);
  
  bool drm_dp_mst_allocate_vcpi(struct drm_dp_mst_topology_mgr *mgr,
                              struct drm_dp_mst_port *port, int pbn, int slots);
@@@ -787,15 -779,7 +789,15 @@@ struct drm_dp_mst_topology_state *drm_a
  int __must_check
  drm_dp_atomic_find_vcpi_slots(struct drm_atomic_state *state,
                              struct drm_dp_mst_topology_mgr *mgr,
 -                            struct drm_dp_mst_port *port, int pbn);
 +                            struct drm_dp_mst_port *port, int pbn,
 +                            int pbn_div);
 +int drm_dp_mst_atomic_enable_dsc(struct drm_atomic_state *state,
 +                               struct drm_dp_mst_port *port,
 +                               int pbn, int pbn_div,
 +                               bool enable);
 +int __must_check
 +drm_dp_mst_add_affected_dsc_crtcs(struct drm_atomic_state *state,
 +                                struct drm_dp_mst_topology_mgr *mgr);
  int __must_check
  drm_dp_atomic_release_vcpi_slots(struct drm_atomic_state *state,
                                 struct drm_dp_mst_topology_mgr *mgr,
@@@ -807,8 -791,6 +809,8 @@@ int __must_check drm_dp_mst_atomic_chec
  void drm_dp_mst_get_port_malloc(struct drm_dp_mst_port *port);
  void drm_dp_mst_put_port_malloc(struct drm_dp_mst_port *port);
  
 +struct drm_dp_aux *drm_dp_mst_dsc_aux_for_port(struct drm_dp_mst_port *port);
 +
  extern const struct drm_private_state_funcs drm_dp_mst_topology_state_funcs;
  
  /**