]> git.proxmox.com Git - mirror_ubuntu-hirsute-kernel.git/commitdiff
Merge drm/drm-next into drm-misc-next
authorMaxime Ripard <maxime@cerno.tech>
Mon, 14 Sep 2020 16:11:40 +0000 (18:11 +0200)
committerMaxime Ripard <maxime@cerno.tech>
Mon, 14 Sep 2020 16:11:40 +0000 (18:11 +0200)
Paul Cercueil needs some patches in -rc5 to apply new patches for ingenic
properly.

Signed-off-by: Maxime Ripard <maxime@cerno.tech>
12 files changed:
1  2 
MAINTAINERS
drivers/gpu/drm/amd/amdgpu/amdgpu_dma_buf.c
drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h
drivers/gpu/drm/drm_dp_mst_topology.c
drivers/gpu/drm/nouveau/dispnv04/disp.c
drivers/gpu/drm/nouveau/dispnv50/disp.c
drivers/gpu/drm/nouveau/nouveau_drv.h
drivers/gpu/drm/ttm/ttm_bo_vm.c
drivers/gpu/drm/xen/xen_drm_front_gem.c
drivers/video/fbdev/vga16fb.c

diff --combined MAINTAINERS
index 557d79a5b9f139fdcab6a15fa943b26cf3fe6ce6,2611c18dec98c83fc8e72dccb6118d9dc2e3f44c..c4e8bd1ab7616868959983435148a93e6bd33026
@@@ -1694,7 -1694,6 +1694,6 @@@ F:      arch/arm/mach-cns3xxx
  
  ARM/CAVIUM THUNDER NETWORK DRIVER
  M:    Sunil Goutham <sgoutham@marvell.com>
- M:    Robert Richter <rrichter@marvell.com>
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
  S:    Supported
  F:    drivers/net/ethernet/cavium/thunder/
@@@ -3205,6 -3204,7 +3204,7 @@@ S:      Maintaine
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/axboe/linux-block.git
  F:    block/
  F:    drivers/block/
+ F:    include/linux/blk*
  F:    kernel/trace/blktrace.c
  F:    lib/sbitmap.c
  
@@@ -3388,6 -3388,7 +3388,7 @@@ M:      Florian Fainelli <f.fainelli@gmail.c
  L:    netdev@vger.kernel.org
  L:    openwrt-devel@lists.openwrt.org (subscribers-only)
  S:    Supported
+ F:    Documentation/devicetree/bindings/net/dsa/b53.txt
  F:    drivers/net/dsa/b53/*
  F:    include/linux/platform_data/b53.h
  
@@@ -3573,13 -3574,28 +3574,28 @@@ L:   bcm-kernel-feedback-list@broadcom.co
  S:    Maintained
  F:    drivers/phy/broadcom/phy-brcm-usb*
  
+ BROADCOM ETHERNET PHY DRIVERS
+ M:    Florian Fainelli <f.fainelli@gmail.com>
+ L:    bcm-kernel-feedback-list@broadcom.com
+ L:    netdev@vger.kernel.org
+ S:    Supported
+ F:    Documentation/devicetree/bindings/net/broadcom-bcm87xx.txt
+ F:    drivers/net/phy/bcm*.[ch]
+ F:    drivers/net/phy/broadcom.c
+ F:    include/linux/brcmphy.h
  BROADCOM GENET ETHERNET DRIVER
  M:    Doug Berger <opendmb@gmail.com>
  M:    Florian Fainelli <f.fainelli@gmail.com>
  L:    bcm-kernel-feedback-list@broadcom.com
  L:    netdev@vger.kernel.org
  S:    Supported
+ F:    Documentation/devicetree/bindings/net/brcm,bcmgenet.txt
+ F:    Documentation/devicetree/bindings/net/brcm,unimac-mdio.txt
  F:    drivers/net/ethernet/broadcom/genet/
+ F:    drivers/net/mdio/mdio-bcm-unimac.c
+ F:    include/linux/platform_data/bcmgenet.h
+ F:    include/linux/platform_data/mdio-bcm-unimac.h
  
  BROADCOM IPROC ARM ARCHITECTURE
  M:    Ray Jui <rjui@broadcom.com>
@@@ -3931,8 -3947,8 +3947,8 @@@ W:      https://wireless.wiki.kernel.org/en/
  F:    drivers/net/wireless/ath/carl9170/
  
  CAVIUM I2C DRIVER
- M:    Robert Richter <rrichter@marvell.com>
- S:    Supported
+ M:    Robert Richter <rric@kernel.org>
+ S:    Odd Fixes
  W:    http://www.marvell.com
  F:    drivers/i2c/busses/i2c-octeon*
  F:    drivers/i2c/busses/i2c-thunderx*
@@@ -3947,8 -3963,8 +3963,8 @@@ W:      http://www.marvell.co
  F:    drivers/net/ethernet/cavium/liquidio/
  
  CAVIUM MMC DRIVER
- M:    Robert Richter <rrichter@marvell.com>
- S:    Supported
+ M:    Robert Richter <rric@kernel.org>
+ S:    Odd Fixes
  W:    http://www.marvell.com
  F:    drivers/mmc/host/cavium*
  
@@@ -3960,9 -3976,9 +3976,9 @@@ W:      http://www.marvell.co
  F:    drivers/crypto/cavium/cpt/
  
  CAVIUM THUNDERX2 ARM64 SOC
- M:    Robert Richter <rrichter@marvell.com>
+ M:    Robert Richter <rric@kernel.org>
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
- S:    Maintained
+ S:    Odd Fixes
  F:    Documentation/devicetree/bindings/arm/cavium-thunder2.txt
  F:    arch/arm64/boot/dts/cavium/thunder2-99xx*
  
@@@ -4241,6 -4257,8 +4257,8 @@@ S:      Maintaine
  F:    .clang-format
  
  CLANG/LLVM BUILD SUPPORT
+ M:    Nathan Chancellor <natechancellor@gmail.com>
+ M:    Nick Desaulniers <ndesaulniers@google.com>
  L:    clang-built-linux@googlegroups.com
  S:    Supported
  W:    https://clangbuiltlinux.github.io/
@@@ -5050,7 -5068,7 +5068,7 @@@ F:      include/linux/dm-*.
  F:    include/uapi/linux/dm-*.h
  
  DEVLINK
- M:    Jiri Pirko <jiri@mellanox.com>
+ M:    Jiri Pirko <jiri@nvidia.com>
  L:    netdev@vger.kernel.org
  S:    Supported
  F:    Documentation/networking/devlink
@@@ -5239,6 -5257,7 +5257,7 @@@ DOCUMENTATIO
  M:    Jonathan Corbet <corbet@lwn.net>
  L:    linux-doc@vger.kernel.org
  S:    Maintained
+ P:    Documentation/doc-guide/maintainer-profile.rst
  T:    git git://git.lwn.net/linux.git docs-next
  F:    Documentation/
  F:    scripts/documentation-file-ref-check
@@@ -5640,7 -5659,6 +5659,7 @@@ F:      drivers/gpu/drm/udl
  
  DRM DRIVER FOR VIRTUAL KERNEL MODESETTING (VKMS)
  M:    Rodrigo Siqueira <rodrigosiqueiramelo@gmail.com>
 +M:    Melissa Wen <melissa.srw@gmail.com>
  R:    Haneen Mohammed <hamohammed.sa@gmail.com>
  R:    Daniel Vetter <daniel@ffwll.ch>
  L:    dri-devel@lists.freedesktop.org
@@@ -6089,7 -6107,7 +6108,7 @@@ F:      include/linux/dynamic_debug.
  F:    lib/dynamic_debug.c
  
  DYNAMIC INTERRUPT MODERATION
- M:    Tal Gilboa <talgi@mellanox.com>
+ M:    Tal Gilboa <talgi@nvidia.com>
  S:    Maintained
  F:    Documentation/networking/net_dim.rst
  F:    include/linux/dim.h
@@@ -6169,7 -6187,7 +6188,7 @@@ F:      Documentation/devicetree/bindings/ed
  F:    drivers/edac/aspeed_edac.c
  
  EDAC-BLUEFIELD
- M:    Shravan Kumar Ramani <sramani@mellanox.com>
+ M:    Shravan Kumar Ramani <sramani@nvidia.com>
  S:    Supported
  F:    drivers/edac/bluefield_edac.c
  
@@@ -6181,16 -6199,15 +6200,15 @@@ F:   drivers/edac/highbank
  
  EDAC-CAVIUM OCTEON
  M:    Ralf Baechle <ralf@linux-mips.org>
- M:    Robert Richter <rrichter@marvell.com>
  L:    linux-edac@vger.kernel.org
  L:    linux-mips@vger.kernel.org
  S:    Supported
  F:    drivers/edac/octeon_edac*
  
  EDAC-CAVIUM THUNDERX
- M:    Robert Richter <rrichter@marvell.com>
+ M:    Robert Richter <rric@kernel.org>
  L:    linux-edac@vger.kernel.org
- S:    Supported
+ S:    Odd Fixes
  F:    drivers/edac/thunderx_edac*
  
  EDAC-CORE
@@@ -6198,7 -6215,7 +6216,7 @@@ M:      Borislav Petkov <bp@alien8.de
  M:    Mauro Carvalho Chehab <mchehab@kernel.org>
  M:    Tony Luck <tony.luck@intel.com>
  R:    James Morse <james.morse@arm.com>
- R:    Robert Richter <rrichter@marvell.com>
+ R:    Robert Richter <rric@kernel.org>
  L:    linux-edac@vger.kernel.org
  S:    Supported
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/ras/ras.git edac-for-next
@@@ -6491,8 -6508,8 +6509,8 @@@ S:      Odd Fixe
  F:    drivers/net/ethernet/agere/
  
  ETHERNET BRIDGE
- M:    Roopa Prabhu <roopa@cumulusnetworks.com>
- M:    Nikolay Aleksandrov <nikolay@cumulusnetworks.com>
+ M:    Roopa Prabhu <roopa@nvidia.com>
+ M:    Nikolay Aleksandrov <nikolay@nvidia.com>
  L:    bridge@lists.linux-foundation.org (moderated for non-subscribers)
  L:    netdev@vger.kernel.org
  S:    Maintained
@@@ -6502,7 -6519,6 +6520,6 @@@ F:      net/bridge
  
  ETHERNET PHY LIBRARY
  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
@@@ -6607,7 -6623,7 +6624,7 @@@ F:      drivers/iommu/exynos-iommu.
  
  EZchip NPS platform support
  M:    Vineet Gupta <vgupta@synopsys.com>
- M:    Ofer Levi <oferle@mellanox.com>
+ M:    Ofer Levi <oferle@nvidia.com>
  S:    Supported
  F:    arch/arc/boot/dts/eznps.dts
  F:    arch/arc/plat-eznps
@@@ -6892,6 -6908,14 +6909,14 @@@ L:    linuxppc-dev@lists.ozlabs.or
  S:    Maintained
  F:    drivers/dma/fsldma.*
  
+ FREESCALE DSPI DRIVER
+ M:    Vladimir Oltean <olteanv@gmail.com>
+ L:    linux-spi@vger.kernel.org
+ S:    Maintained
+ F:    Documentation/devicetree/bindings/spi/spi-fsl-dspi.txt
+ F:    drivers/spi/spi-fsl-dspi.c
+ F:    include/linux/spi/spi-fsl-dspi.h
  FREESCALE ENETC ETHERNET DRIVERS
  M:    Claudiu Manoil <claudiu.manoil@nxp.com>
  L:    netdev@vger.kernel.org
@@@ -8263,7 -8287,7 +8288,7 @@@ IA64 (Itanium) PLATFOR
  M:    Tony Luck <tony.luck@intel.com>
  M:    Fenghua Yu <fenghua.yu@intel.com>
  L:    linux-ia64@vger.kernel.org
- S:    Maintained
+ S:    Odd Fixes
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/aegl/linux.git
  F:    Documentation/ia64/
  F:    arch/ia64/
@@@ -8571,7 -8595,7 +8596,7 @@@ F:      drivers/iio/pressure/dps310.
  
  INFINIBAND SUBSYSTEM
  M:    Doug Ledford <dledford@redhat.com>
- M:    Jason Gunthorpe <jgg@mellanox.com>
+ M:    Jason Gunthorpe <jgg@nvidia.com>
  L:    linux-rdma@vger.kernel.org
  S:    Supported
  W:    https://github.com/linux-rdma/rdma-core
@@@ -9234,7 -9258,7 +9259,7 @@@ F:      drivers/firmware/iscsi_ibft
  
  ISCSI EXTENSIONS FOR RDMA (ISER) INITIATOR
  M:    Sagi Grimberg <sagi@grimberg.me>
- M:    Max Gurtovoy <maxg@mellanox.com>
+ M:    Max Gurtovoy <maxg@nvidia.com>
  L:    linux-rdma@vger.kernel.org
  S:    Supported
  W:    http://www.openfabrics.org
@@@ -9783,7 -9807,7 +9808,7 @@@ F:      drivers/scsi/53c700
  
  LEAKING_ADDRESSES
  M:    Tobin C. Harding <me@tobin.cc>
- M:    Tycho Andersen <tycho@tycho.ws>
+ M:    Tycho Andersen <tycho@tycho.pizza>
  L:    kernel-hardening@lists.openwall.com
  S:    Maintained
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/tobin/leaks.git
@@@ -11080,7 -11104,7 +11105,7 @@@ F:   Documentation/devicetree/bindings/in
  F:    drivers/input/touchscreen/melfas_mip4.c
  
  MELLANOX ETHERNET DRIVER (mlx4_en)
- M:    Tariq Toukan <tariqt@mellanox.com>
+ M:    Tariq Toukan <tariqt@nvidia.com>
  L:    netdev@vger.kernel.org
  S:    Supported
  W:    http://www.mellanox.com
@@@ -11088,7 -11112,7 +11113,7 @@@ Q:   http://patchwork.ozlabs.org/project/
  F:    drivers/net/ethernet/mellanox/mlx4/en_*
  
  MELLANOX ETHERNET DRIVER (mlx5e)
- M:    Saeed Mahameed <saeedm@mellanox.com>
+ M:    Saeed Mahameed <saeedm@nvidia.com>
  L:    netdev@vger.kernel.org
  S:    Supported
  W:    http://www.mellanox.com
@@@ -11096,7 -11120,7 +11121,7 @@@ Q:   http://patchwork.ozlabs.org/project/
  F:    drivers/net/ethernet/mellanox/mlx5/core/en_*
  
  MELLANOX ETHERNET INNOVA DRIVERS
- R:    Boris Pismenny <borisp@mellanox.com>
+ R:    Boris Pismenny <borisp@nvidia.com>
  L:    netdev@vger.kernel.org
  S:    Supported
  W:    http://www.mellanox.com
@@@ -11107,8 -11131,8 +11132,8 @@@ F:   drivers/net/ethernet/mellanox/mlx5/c
  F:    include/linux/mlx5/mlx5_ifc_fpga.h
  
  MELLANOX ETHERNET SWITCH DRIVERS
- M:    Jiri Pirko <jiri@mellanox.com>
- M:    Ido Schimmel <idosch@mellanox.com>
+ M:    Jiri Pirko <jiri@nvidia.com>
+ M:    Ido Schimmel <idosch@nvidia.com>
  L:    netdev@vger.kernel.org
  S:    Supported
  W:    http://www.mellanox.com
@@@ -11117,7 -11141,7 +11142,7 @@@ F:   drivers/net/ethernet/mellanox/mlxsw
  F:    tools/testing/selftests/drivers/net/mlxsw/
  
  MELLANOX FIRMWARE FLASH LIBRARY (mlxfw)
- M:    mlxsw@mellanox.com
+ M:    mlxsw@nvidia.com
  L:    netdev@vger.kernel.org
  S:    Supported
  W:    http://www.mellanox.com
@@@ -11127,7 -11151,7 +11152,7 @@@ F:   drivers/net/ethernet/mellanox/mlxfw
  MELLANOX HARDWARE PLATFORM SUPPORT
  M:    Andy Shevchenko <andy@infradead.org>
  M:    Darren Hart <dvhart@infradead.org>
- M:    Vadim Pasternak <vadimp@mellanox.com>
+ M:    Vadim Pasternak <vadimp@nvidia.com>
  L:    platform-driver-x86@vger.kernel.org
  S:    Supported
  F:    Documentation/ABI/testing/sysfs-platform-mellanox-bootctl
@@@ -11135,7 -11159,7 +11160,7 @@@ F:   drivers/platform/mellanox
  F:    include/linux/platform_data/mlxreg.h
  
  MELLANOX MLX4 core VPI driver
- M:    Tariq Toukan <tariqt@mellanox.com>
+ M:    Tariq Toukan <tariqt@nvidia.com>
  L:    netdev@vger.kernel.org
  L:    linux-rdma@vger.kernel.org
  S:    Supported
@@@ -11145,7 -11169,7 +11170,7 @@@ F:   drivers/net/ethernet/mellanox/mlx4
  F:    include/linux/mlx4/
  
  MELLANOX MLX4 IB driver
- M:    Yishai Hadas <yishaih@mellanox.com>
+ M:    Yishai Hadas <yishaih@nvidia.com>
  L:    linux-rdma@vger.kernel.org
  S:    Supported
  W:    http://www.mellanox.com
@@@ -11155,8 -11179,8 +11180,8 @@@ F:   include/linux/mlx4
  F:    include/uapi/rdma/mlx4-abi.h
  
  MELLANOX MLX5 core VPI driver
- M:    Saeed Mahameed <saeedm@mellanox.com>
- M:    Leon Romanovsky <leonro@mellanox.com>
+ M:    Saeed Mahameed <saeedm@nvidia.com>
+ M:    Leon Romanovsky <leonro@nvidia.com>
  L:    netdev@vger.kernel.org
  L:    linux-rdma@vger.kernel.org
  S:    Supported
@@@ -11167,7 -11191,7 +11192,7 @@@ F:   drivers/net/ethernet/mellanox/mlx5/c
  F:    include/linux/mlx5/
  
  MELLANOX MLX5 IB driver
- M:    Leon Romanovsky <leonro@mellanox.com>
+ M:    Leon Romanovsky <leonro@nvidia.com>
  L:    linux-rdma@vger.kernel.org
  S:    Supported
  W:    http://www.mellanox.com
@@@ -11177,8 -11201,8 +11202,8 @@@ F:   include/linux/mlx5
  F:    include/uapi/rdma/mlx5-abi.h
  
  MELLANOX MLXCPLD I2C AND MUX DRIVER
- M:    Vadim Pasternak <vadimp@mellanox.com>
- M:    Michael Shych <michaelsh@mellanox.com>
+ M:    Vadim Pasternak <vadimp@nvidia.com>
+ M:    Michael Shych <michaelsh@nvidia.com>
  L:    linux-i2c@vger.kernel.org
  S:    Supported
  F:    Documentation/i2c/busses/i2c-mlxcpld.rst
@@@ -11186,7 -11210,7 +11211,7 @@@ F:   drivers/i2c/busses/i2c-mlxcpld.
  F:    drivers/i2c/muxes/i2c-mux-mlxcpld.c
  
  MELLANOX MLXCPLD LED DRIVER
- M:    Vadim Pasternak <vadimp@mellanox.com>
+ M:    Vadim Pasternak <vadimp@nvidia.com>
  L:    linux-leds@vger.kernel.org
  S:    Supported
  F:    Documentation/leds/leds-mlxcpld.rst
@@@ -11194,7 -11218,7 +11219,7 @@@ F:   drivers/leds/leds-mlxcpld.
  F:    drivers/leds/leds-mlxreg.c
  
  MELLANOX PLATFORM DRIVER
- M:    Vadim Pasternak <vadimp@mellanox.com>
+ M:    Vadim Pasternak <vadimp@nvidia.com>
  L:    platform-driver-x86@vger.kernel.org
  S:    Supported
  F:    drivers/platform/x86/mlx-platform.c
@@@ -12175,8 -12199,8 +12200,8 @@@ F:   net/ipv6/syncookies.
  F:    net/ipv6/tcp*.c
  
  NETWORKING [TLS]
- M:    Boris Pismenny <borisp@mellanox.com>
- M:    Aviad Yehezkel <aviadye@mellanox.com>
+ M:    Boris Pismenny <borisp@nvidia.com>
+ M:    Aviad Yehezkel <aviadye@nvidia.com>
  M:    John Fastabend <john.fastabend@gmail.com>
  M:    Daniel Borkmann <daniel@iogearbox.net>
  M:    Jakub Kicinski <kuba@kernel.org>
@@@ -12438,14 -12462,6 +12463,14 @@@ F: drivers/iio/gyro/fxas21002c_core.
  F:    drivers/iio/gyro/fxas21002c_i2c.c
  F:    drivers/iio/gyro/fxas21002c_spi.c
  
 +NXP i.MX 8MQ DCSS DRIVER
 +M:    Laurentiu Palcu <laurentiu.palcu@oss.nxp.com>
 +R:    Lucas Stach <l.stach@pengutronix.de>
 +L:    dri-devel@lists.freedesktop.org
 +S:    Maintained
 +F:    Documentation/devicetree/bindings/display/imx/nxp,imx8mq-dcss.yaml
 +F:    drivers/gpu/drm/imx/dcss/
 +
  NXP SGTL5000 DRIVER
  M:    Fabio Estevam <festevam@gmail.com>
  L:    alsa-devel@alsa-project.org (moderated for non-subscribers)
@@@ -12484,7 -12500,7 +12509,7 @@@ S:   Supporte
  F:    drivers/nfc/nxp-nci
  
  OBJAGG
- M:    Jiri Pirko <jiri@mellanox.com>
+ M:    Jiri Pirko <jiri@nvidia.com>
  L:    netdev@vger.kernel.org
  S:    Supported
  F:    include/linux/objagg.h
@@@ -13126,7 -13142,7 +13151,7 @@@ F:   drivers/video/logo/logo_parisc
  F:    include/linux/hp_sdc.h
  
  PARMAN
- M:    Jiri Pirko <jiri@mellanox.com>
+ M:    Jiri Pirko <jiri@nvidia.com>
  L:    netdev@vger.kernel.org
  S:    Supported
  F:    include/linux/parman.h
@@@ -13445,10 -13461,10 +13470,10 @@@ F:        Documentation/devicetree/bindings/pc
  F:    drivers/pci/controller/dwc/*artpec*
  
  PCIE DRIVER FOR CAVIUM THUNDERX
- M:    Robert Richter <rrichter@marvell.com>
+ M:    Robert Richter <rric@kernel.org>
  L:    linux-pci@vger.kernel.org
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
- S:    Supported
+ S:    Odd Fixes
  F:    drivers/pci/controller/pci-thunder-*
  
  PCIE DRIVER FOR HISILICON
@@@ -13585,12 -13601,18 +13610,18 @@@ F:        kernel/events/
  F:    tools/lib/perf/
  F:    tools/perf/
  
- PERFORMANCE EVENTS SUBSYSTEM ARM64 PMU EVENTS
+ PERFORMANCE EVENTS TOOLING ARM64
  R:    John Garry <john.garry@huawei.com>
  R:    Will Deacon <will@kernel.org>
+ R:    Mathieu Poirier <mathieu.poirier@linaro.org>
+ R:    Leo Yan <leo.yan@linaro.org>
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
  S:    Supported
+ F:    tools/build/feature/test-libopencsd.c
+ F:    tools/perf/arch/arm*/
  F:    tools/perf/pmu-events/arch/arm64/
+ F:    tools/perf/util/arm-spe*
+ F:    tools/perf/util/cs-etm*
  
  PERSONALITY HANDLING
  M:    Christoph Hellwig <hch@infradead.org>
@@@ -14381,7 -14403,7 +14412,7 @@@ M:   Rob Clark <robdclark@gmail.com
  L:    iommu@lists.linux-foundation.org
  L:    linux-arm-msm@vger.kernel.org
  S:    Maintained
- F:    drivers/iommu/qcom_iommu.c
+ F:    drivers/iommu/arm/arm-smmu/qcom_iommu.c
  
  QUALCOMM IPCC MAILBOX DRIVER
  M:    Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
@@@ -15562,6 -15584,7 +15593,7 @@@ F:   include/uapi/linux/sed
  SECURITY CONTACT
  M:    Security Officers <security@kernel.org>
  S:    Supported
+ F:    Documentation/admin-guide/security-bugs.rst
  
  SECURITY SUBSYSTEM
  M:    James Morris <jmorris@namei.org>
@@@ -16050,7 -16073,7 +16082,7 @@@ F:   drivers/infiniband/sw/siw
  F:    include/uapi/rdma/siw-abi.h
  
  SOFT-ROCE DRIVER (rxe)
- M:    Zhu Yanjun <yanjunz@mellanox.com>
+ M:    Zhu Yanjun <yanjunz@nvidia.com>
  L:    linux-rdma@vger.kernel.org
  S:    Supported
  F:    drivers/infiniband/sw/rxe/
@@@ -17132,8 -17155,8 +17164,8 @@@ S:   Maintaine
  F:    Documentation/devicetree/bindings/arm/keystone/ti,k3-sci-common.yaml
  F:    Documentation/devicetree/bindings/arm/keystone/ti,sci.txt
  F:    Documentation/devicetree/bindings/clock/ti,sci-clk.txt
- F:    Documentation/devicetree/bindings/interrupt-controller/ti,sci-inta.txt
- F:    Documentation/devicetree/bindings/interrupt-controller/ti,sci-intr.txt
+ F:    Documentation/devicetree/bindings/interrupt-controller/ti,sci-inta.yaml
+ F:    Documentation/devicetree/bindings/interrupt-controller/ti,sci-intr.yaml
  F:    Documentation/devicetree/bindings/reset/ti,sci-reset.txt
  F:    Documentation/devicetree/bindings/soc/ti/sci-pm-domain.txt
  F:    drivers/clk/keystone/sci-clk.c
@@@ -17230,8 -17253,8 +17262,8 @@@ S:   Maintaine
  F:    drivers/net/thunderbolt.c
  
  THUNDERX GPIO DRIVER
- M:    Robert Richter <rrichter@marvell.com>
- S:    Maintained
+ M:    Robert Richter <rric@kernel.org>
+ S:    Odd Fixes
  F:    drivers/gpio/gpio-thunderx.c
  
  TI AM437X VPFE DRIVER
@@@ -18890,6 -18913,15 +18922,15 @@@ S: Maintaine
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git x86/core
  F:    arch/x86/platform
  
+ X86 PLATFORM UV HPE SUPERDOME FLEX
+ M:    Steve Wahl <steve.wahl@hpe.com>
+ R:    Dimitri Sivanich <dimitri.sivanich@hpe.com>
+ R:    Russ Anderson <russ.anderson@hpe.com>
+ S:    Supported
+ F:    arch/x86/include/asm/uv/
+ F:    arch/x86/kernel/apic/x2apic_uv_x.c
+ F:    arch/x86/platform/uv/
  X86 VDSO
  M:    Andy Lutomirski <luto@kernel.org>
  L:    linux-kernel@vger.kernel.org
index d7050ab95946c842f9dfe7101090fe280df9c9ec,427a7c5ba93de4c29498262cf02b08dcf1d13b63..957934926b24529341b3b0a4c13468d7e012afee
@@@ -35,6 -35,7 +35,7 @@@
  #include "amdgpu_display.h"
  #include "amdgpu_gem.h"
  #include "amdgpu_dma_buf.h"
+ #include "amdgpu_xgmi.h"
  #include <drm/amdgpu_drm.h>
  #include <linux/dma-buf.h>
  #include <linux/dma-fence-array.h>
@@@ -302,8 -303,7 +303,8 @@@ static struct sg_table *amdgpu_dma_buf_
  
        switch (bo->tbo.mem.mem_type) {
        case TTM_PL_TT:
 -              sgt = drm_prime_pages_to_sg(bo->tbo.ttm->pages,
 +              sgt = drm_prime_pages_to_sg(obj->dev,
 +                                          bo->tbo.ttm->pages,
                                            bo->tbo.num_pages);
                if (IS_ERR(sgt))
                        return sgt;
@@@ -455,7 -455,7 +456,7 @@@ static struct drm_gem_object 
  amdgpu_dma_buf_create_obj(struct drm_device *dev, struct dma_buf *dma_buf)
  {
        struct dma_resv *resv = dma_buf->resv;
-       struct amdgpu_device *adev = dev->dev_private;
+       struct amdgpu_device *adev = drm_to_adev(dev);
        struct amdgpu_bo *bo;
        struct amdgpu_bo_param bp;
        int ret;
@@@ -596,3 -596,36 +597,36 @@@ struct drm_gem_object *amdgpu_gem_prime
        obj->import_attach = attach;
        return obj;
  }
+ /**
+  * amdgpu_dmabuf_is_xgmi_accessible - Check if xgmi available for P2P transfer
+  *
+  * @adev: amdgpu_device pointer of the importer
+  * @bo: amdgpu buffer object
+  *
+  * Returns:
+  * True if dmabuf accessible over xgmi, false otherwise.
+  */
+ bool amdgpu_dmabuf_is_xgmi_accessible(struct amdgpu_device *adev,
+                                     struct amdgpu_bo *bo)
+ {
+       struct drm_gem_object *obj = &bo->tbo.base;
+       struct drm_gem_object *gobj;
+       if (obj->import_attach) {
+               struct dma_buf *dma_buf = obj->import_attach->dmabuf;
+               if (dma_buf->ops != &amdgpu_dmabuf_ops)
+                       /* No XGMI with non AMD GPUs */
+                       return false;
+               gobj = dma_buf->priv;
+               bo = gem_to_amdgpu_bo(gobj);
+       }
+       if (amdgpu_xgmi_same_hive(adev, amdgpu_ttm_adev(bo->tbo.bdev)) &&
+                       (bo->preferred_domains & AMDGPU_GEM_DOMAIN_VRAM))
+               return true;
+       return false;
+ }
index eaff4c4506ebd8216a803735d487f0ecd5321541,887a4da5eefc6175ef72059ce729478871374f2d..ac043baac05d6d234ee726794176cf624ccccb5e
@@@ -136,8 -136,8 +136,8 @@@ void amdgpu_bo_placement_from_domain(st
  
                places[c].fpfn = 0;
                places[c].lpfn = 0;
 -              places[c].flags = TTM_PL_FLAG_WC | TTM_PL_FLAG_UNCACHED |
 -                      TTM_PL_FLAG_VRAM;
 +              places[c].mem_type = TTM_PL_VRAM;
 +              places[c].flags = TTM_PL_FLAG_WC | TTM_PL_FLAG_UNCACHED;
  
                if (flags & AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED)
                        places[c].lpfn = visible_pfn;
        if (domain & AMDGPU_GEM_DOMAIN_GTT) {
                places[c].fpfn = 0;
                places[c].lpfn = 0;
 -              places[c].flags = TTM_PL_FLAG_TT;
 +              places[c].mem_type = TTM_PL_TT;
 +              places[c].flags = 0;
                if (flags & AMDGPU_GEM_CREATE_CPU_GTT_USWC)
                        places[c].flags |= TTM_PL_FLAG_WC |
                                TTM_PL_FLAG_UNCACHED;
        if (domain & AMDGPU_GEM_DOMAIN_CPU) {
                places[c].fpfn = 0;
                places[c].lpfn = 0;
 -              places[c].flags = TTM_PL_FLAG_SYSTEM;
 +              places[c].mem_type = TTM_PL_SYSTEM;
 +              places[c].flags = 0;
                if (flags & AMDGPU_GEM_CREATE_CPU_GTT_USWC)
                        places[c].flags |= TTM_PL_FLAG_WC |
                                TTM_PL_FLAG_UNCACHED;
        if (domain & AMDGPU_GEM_DOMAIN_GDS) {
                places[c].fpfn = 0;
                places[c].lpfn = 0;
 -              places[c].flags = TTM_PL_FLAG_UNCACHED | AMDGPU_PL_FLAG_GDS;
 +              places[c].mem_type = AMDGPU_PL_GDS;
 +              places[c].flags = TTM_PL_FLAG_UNCACHED;
                c++;
        }
  
        if (domain & AMDGPU_GEM_DOMAIN_GWS) {
                places[c].fpfn = 0;
                places[c].lpfn = 0;
 -              places[c].flags = TTM_PL_FLAG_UNCACHED | AMDGPU_PL_FLAG_GWS;
 +              places[c].mem_type = AMDGPU_PL_GWS;
 +              places[c].flags = TTM_PL_FLAG_UNCACHED;
                c++;
        }
  
        if (domain & AMDGPU_GEM_DOMAIN_OA) {
                places[c].fpfn = 0;
                places[c].lpfn = 0;
 -              places[c].flags = TTM_PL_FLAG_UNCACHED | AMDGPU_PL_FLAG_OA;
 +              places[c].mem_type = AMDGPU_PL_OA;
 +              places[c].flags = TTM_PL_FLAG_UNCACHED;
                c++;
        }
  
        if (!c) {
                places[c].fpfn = 0;
                places[c].lpfn = 0;
 -              places[c].flags = TTM_PL_MASK_CACHING | TTM_PL_FLAG_SYSTEM;
 +              places[c].mem_type = TTM_PL_SYSTEM;
 +              places[c].flags = TTM_PL_MASK_CACHING;
                c++;
        }
  
@@@ -380,6 -374,9 +380,9 @@@ int amdgpu_bo_create_kernel_at(struct a
        if (r)
                return r;
  
+       if ((*bo_ptr) == NULL)
+               return 0;
        /*
         * Remove the original mem node and create a new one at the request
         * position.
@@@ -558,7 -555,7 +561,7 @@@ static int amdgpu_bo_do_create(struct a
        bo = kzalloc(sizeof(struct amdgpu_bo), GFP_KERNEL);
        if (bo == NULL)
                return -ENOMEM;
-       drm_gem_private_object_init(adev->ddev, &bo->tbo.base, size);
+       drm_gem_private_object_init(adev_to_drm(adev), &bo->tbo.base, size);
        INIT_LIST_HEAD(&bo->shadow_list);
        bo->vm_bo = NULL;
        bo->preferred_domains = bp->preferred_domain ? bp->preferred_domain :
                amdgpu_cs_report_moved_bytes(adev, ctx.bytes_moved, 0);
  
        if (bp->flags & AMDGPU_GEM_CREATE_VRAM_CLEARED &&
 -          bo->tbo.mem.placement & TTM_PL_FLAG_VRAM) {
 +          bo->tbo.mem.mem_type == TTM_PL_VRAM) {
                struct dma_fence *fence;
  
                r = amdgpu_fill_buffer(bo, 0, bo->tbo.base.resv, &fence);
@@@ -1305,7 -1302,7 +1308,7 @@@ void amdgpu_bo_move_notify(struct ttm_b
  }
  
  /**
-  * amdgpu_bo_move_notify - notification about a BO being released
+  * amdgpu_bo_release_notify - notification about a BO being released
   * @bo: pointer to a buffer object
   *
   * Wipes VRAM buffers whose contents should not be leaked before the
index 651365183e75f5fd61c7591f46c870e72e9932cb,a18dc878339ab033391550f466d99a88bf76cd88..6fc3af082f6fdd2e4fd3b0c8e2b1d1ec27ceb12d
@@@ -88,8 -88,7 +88,8 @@@ static void amdgpu_evict_flags(struct t
        static const struct ttm_place placements = {
                .fpfn = 0,
                .lpfn = 0,
 -              .flags = TTM_PL_MASK_CACHING | TTM_PL_FLAG_SYSTEM
 +              .mem_type = TTM_PL_SYSTEM,
 +              .flags = TTM_PL_MASK_CACHING
        };
  
        /* Don't handle scatter gather BOs */
@@@ -175,6 -174,24 +175,6 @@@ static int amdgpu_verify_access(struct 
                                          filp->private_data);
  }
  
 -/**
 - * amdgpu_move_null - Register memory for a buffer object
 - *
 - * @bo: The bo to assign the memory to
 - * @new_mem: The memory to be assigned.
 - *
 - * Assign the memory from new_mem to the memory of the buffer object bo.
 - */
 -static void amdgpu_move_null(struct ttm_buffer_object *bo,
 -                           struct ttm_resource *new_mem)
 -{
 -      struct ttm_resource *old_mem = &bo->mem;
 -
 -      BUG_ON(old_mem->mm_node != NULL);
 -      *old_mem = *new_mem;
 -      new_mem->mm_node = NULL;
 -}
 -
  /**
   * amdgpu_mm_node_addr - Compute the GPU relative offset of a GTT buffer.
   *
@@@ -534,8 -551,7 +534,8 @@@ static int amdgpu_move_vram_ram(struct 
        placement.busy_placement = &placements;
        placements.fpfn = 0;
        placements.lpfn = 0;
 -      placements.flags = TTM_PL_MASK_CACHING | TTM_PL_FLAG_TT;
 +      placements.mem_type = TTM_PL_TT;
 +      placements.flags = TTM_PL_MASK_CACHING;
        r = ttm_bo_mem_space(bo, &placement, &tmp_mem, ctx);
        if (unlikely(r)) {
                pr_err("Failed to find GTT space for blit from VRAM\n");
        }
  
        /* Bind the memory to the GTT space */
 -      r = ttm_tt_bind(bo->ttm, &tmp_mem, ctx);
 +      r = ttm_tt_bind(bo->bdev, bo->ttm, &tmp_mem, ctx);
        if (unlikely(r)) {
                goto out_cleanup;
        }
@@@ -591,8 -607,7 +591,8 @@@ static int amdgpu_move_ram_vram(struct 
        placement.busy_placement = &placements;
        placements.fpfn = 0;
        placements.lpfn = 0;
 -      placements.flags = TTM_PL_MASK_CACHING | TTM_PL_FLAG_TT;
 +      placements.mem_type = TTM_PL_TT;
 +      placements.flags = TTM_PL_MASK_CACHING;
        r = ttm_bo_mem_space(bo, &placement, &tmp_mem, ctx);
        if (unlikely(r)) {
                pr_err("Failed to find GTT space for blit to VRAM\n");
@@@ -661,7 -676,7 +661,7 @@@ static int amdgpu_bo_move(struct ttm_bu
        adev = amdgpu_ttm_adev(bo->bdev);
  
        if (old_mem->mem_type == TTM_PL_SYSTEM && bo->ttm == NULL) {
 -              amdgpu_move_null(bo, new_mem);
 +              ttm_bo_move_null(bo, new_mem);
                return 0;
        }
        if ((old_mem->mem_type == TTM_PL_TT &&
            (old_mem->mem_type == TTM_PL_SYSTEM &&
             new_mem->mem_type == TTM_PL_TT)) {
                /* bind is enough */
 -              amdgpu_move_null(bo, new_mem);
 +              ttm_bo_move_null(bo, new_mem);
                return 0;
        }
        if (old_mem->mem_type == AMDGPU_PL_GDS ||
            new_mem->mem_type == AMDGPU_PL_GWS ||
            new_mem->mem_type == AMDGPU_PL_OA) {
                /* Nothing to save here */
 -              amdgpu_move_null(bo, new_mem);
 +              ttm_bo_move_null(bo, new_mem);
                return 0;
        }
  
@@@ -758,7 -773,7 +758,7 @@@ static int amdgpu_ttm_io_mem_reserve(st
                        mem->bus.addr = (u8 *)adev->mman.aper_base_kaddr +
                                        mem->bus.offset;
  
 -              mem->bus.base = adev->gmc.aper_base;
 +              mem->bus.offset += adev->gmc.aper_base;
                mem->bus.is_iomem = true;
                break;
        default:
  static unsigned long amdgpu_ttm_io_mem_pfn(struct ttm_buffer_object *bo,
                                           unsigned long page_offset)
  {
 +      struct amdgpu_device *adev = amdgpu_ttm_adev(bo->bdev);
        uint64_t offset = (page_offset << PAGE_SHIFT);
        struct drm_mm_node *mm;
  
        mm = amdgpu_find_mm_node(&bo->mem, &offset);
 -      return (bo->mem.bus.base >> PAGE_SHIFT) + mm->start +
 -              (offset >> PAGE_SHIFT);
 +      offset += adev->gmc.aper_base;
 +      return mm->start + (offset >> PAGE_SHIFT);
  }
  
  /**
@@@ -977,10 -991,9 +977,10 @@@ void amdgpu_ttm_tt_set_user_pages(struc
   *
   * Called by amdgpu_ttm_backend_bind()
   **/
 -static int amdgpu_ttm_tt_pin_userptr(struct ttm_tt *ttm)
 +static int amdgpu_ttm_tt_pin_userptr(struct ttm_bo_device *bdev,
 +                                   struct ttm_tt *ttm)
  {
 -      struct amdgpu_device *adev = amdgpu_ttm_adev(ttm->bdev);
 +      struct amdgpu_device *adev = amdgpu_ttm_adev(bdev);
        struct amdgpu_ttm_tt *gtt = (void *)ttm;
        int r;
  
@@@ -1014,10 -1027,9 +1014,10 @@@ release_sg
  /**
   * amdgpu_ttm_tt_unpin_userptr - Unpin and unmap userptr pages
   */
 -static void amdgpu_ttm_tt_unpin_userptr(struct ttm_tt *ttm)
 +static void amdgpu_ttm_tt_unpin_userptr(struct ttm_bo_device *bdev,
 +                                      struct ttm_tt *ttm)
  {
 -      struct amdgpu_device *adev = amdgpu_ttm_adev(ttm->bdev);
 +      struct amdgpu_device *adev = amdgpu_ttm_adev(bdev);
        struct amdgpu_ttm_tt *gtt = (void *)ttm;
  
        int write = !(gtt->userflags & AMDGPU_GEM_USERPTR_READONLY);
@@@ -1098,17 -1110,16 +1098,17 @@@ gart_bind_fail
   * Called by ttm_tt_bind() on behalf of ttm_bo_handle_move_mem().
   * This handles binding GTT memory to the device address space.
   */
 -static int amdgpu_ttm_backend_bind(struct ttm_tt *ttm,
 +static int amdgpu_ttm_backend_bind(struct ttm_bo_device *bdev,
 +                                 struct ttm_tt *ttm,
                                   struct ttm_resource *bo_mem)
  {
 -      struct amdgpu_device *adev = amdgpu_ttm_adev(ttm->bdev);
 +      struct amdgpu_device *adev = amdgpu_ttm_adev(bdev);
        struct amdgpu_ttm_tt *gtt = (void*)ttm;
        uint64_t flags;
        int r = 0;
  
        if (gtt->userptr) {
 -              r = amdgpu_ttm_tt_pin_userptr(ttm);
 +              r = amdgpu_ttm_tt_pin_userptr(bdev, ttm);
                if (r) {
                        DRM_ERROR("failed to pin userptr\n");
                        return r;
@@@ -1174,8 -1185,8 +1174,8 @@@ int amdgpu_ttm_alloc_gart(struct ttm_bu
                placement.busy_placement = &placements;
                placements.fpfn = 0;
                placements.lpfn = adev->gmc.gart_size >> PAGE_SHIFT;
 -              placements.flags = (bo->mem.placement & ~TTM_PL_MASK_MEM) |
 -                      TTM_PL_FLAG_TT;
 +              placements.mem_type = TTM_PL_TT;
 +              placements.flags = bo->mem.placement;
  
                r = ttm_bo_mem_space(bo, &placement, &tmp, &ctx);
                if (unlikely(r))
@@@ -1226,16 -1237,15 +1226,16 @@@ int amdgpu_ttm_recover_gart(struct ttm_
   * Called by ttm_tt_unbind() on behalf of ttm_bo_move_ttm() and
   * ttm_tt_destroy().
   */
 -static void amdgpu_ttm_backend_unbind(struct ttm_tt *ttm)
 +static void amdgpu_ttm_backend_unbind(struct ttm_bo_device *bdev,
 +                                    struct ttm_tt *ttm)
  {
 -      struct amdgpu_device *adev = amdgpu_ttm_adev(ttm->bdev);
 +      struct amdgpu_device *adev = amdgpu_ttm_adev(bdev);
        struct amdgpu_ttm_tt *gtt = (void *)ttm;
        int r;
  
        /* if the pages have userptr pinning then clear that first */
        if (gtt->userptr)
 -              amdgpu_ttm_tt_unpin_userptr(ttm);
 +              amdgpu_ttm_tt_unpin_userptr(bdev, ttm);
  
        if (gtt->offset == AMDGPU_BO_INVALID_OFFSET)
                return;
                          gtt->ttm.ttm.num_pages, gtt->offset);
  }
  
 -static void amdgpu_ttm_backend_destroy(struct ttm_tt *ttm)
 +static void amdgpu_ttm_backend_destroy(struct ttm_bo_device *bdev,
 +                                     struct ttm_tt *ttm)
  {
        struct amdgpu_ttm_tt *gtt = (void *)ttm;
  
        kfree(gtt);
  }
  
 -static struct ttm_backend_func amdgpu_backend_func = {
 -      .bind = &amdgpu_ttm_backend_bind,
 -      .unbind = &amdgpu_ttm_backend_unbind,
 -      .destroy = &amdgpu_ttm_backend_destroy,
 -};
 -
  /**
   * amdgpu_ttm_tt_create - Create a ttm_tt object for a given BO
   *
@@@ -1275,6 -1290,7 +1275,6 @@@ static struct ttm_tt *amdgpu_ttm_tt_cre
        if (gtt == NULL) {
                return NULL;
        }
 -      gtt->ttm.ttm.func = &amdgpu_backend_func;
        gtt->gobj = &bo->base;
  
        /* allocate space for the uninitialized page entries */
   * Map the pages of a ttm_tt object to an address space visible
   * to the underlying device.
   */
 -static int amdgpu_ttm_tt_populate(struct ttm_tt *ttm,
 -                      struct ttm_operation_ctx *ctx)
 +static int amdgpu_ttm_tt_populate(struct ttm_bo_device *bdev,
 +                                struct ttm_tt *ttm,
 +                                struct ttm_operation_ctx *ctx)
  {
 -      struct amdgpu_device *adev = amdgpu_ttm_adev(ttm->bdev);
 +      struct amdgpu_device *adev = amdgpu_ttm_adev(bdev);
        struct amdgpu_ttm_tt *gtt = (void *)ttm;
  
        /* user pages are bound by amdgpu_ttm_tt_pin_userptr() */
   * Unmaps pages of a ttm_tt object from the device address space and
   * unpopulates the page array backing it.
   */
 -static void amdgpu_ttm_tt_unpopulate(struct ttm_tt *ttm)
 +static void amdgpu_ttm_tt_unpopulate(struct ttm_bo_device *bdev, struct ttm_tt *ttm)
  {
        struct amdgpu_ttm_tt *gtt = (void *)ttm;
        struct amdgpu_device *adev;
        if (ttm->page_flags & TTM_PAGE_FLAG_SG)
                return;
  
 -      adev = amdgpu_ttm_adev(ttm->bdev);
 +      adev = amdgpu_ttm_adev(bdev);
  
  #ifdef CONFIG_SWIOTLB
        if (adev->need_swiotlb && swiotlb_nr_tbl()) {
@@@ -1676,9 -1691,6 +1676,9 @@@ 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,
 +      .ttm_tt_bind = &amdgpu_ttm_backend_bind,
 +      .ttm_tt_unbind = &amdgpu_ttm_backend_unbind,
 +      .ttm_tt_destroy = &amdgpu_ttm_backend_destroy,
        .eviction_valuable = amdgpu_ttm_bo_eviction_valuable,
        .evict_flags = &amdgpu_evict_flags,
        .move = &amdgpu_bo_move,
   */
  static void amdgpu_ttm_fw_reserve_vram_fini(struct amdgpu_device *adev)
  {
-       amdgpu_bo_free_kernel(&adev->fw_vram_usage.reserved_bo,
-               NULL, &adev->fw_vram_usage.va);
+       amdgpu_bo_free_kernel(&adev->mman.fw_vram_usage_reserved_bo,
+               NULL, &adev->mman.fw_vram_usage_va);
  }
  
  /**
@@@ -1719,19 -1731,19 +1719,19 @@@ static int amdgpu_ttm_fw_reserve_vram_i
  {
        uint64_t vram_size = adev->gmc.visible_vram_size;
  
-       adev->fw_vram_usage.va = NULL;
-       adev->fw_vram_usage.reserved_bo = NULL;
+       adev->mman.fw_vram_usage_va = NULL;
+       adev->mman.fw_vram_usage_reserved_bo = NULL;
  
-       if (adev->fw_vram_usage.size == 0 ||
-           adev->fw_vram_usage.size > vram_size)
+       if (adev->mman.fw_vram_usage_size == 0 ||
+           adev->mman.fw_vram_usage_size > vram_size)
                return 0;
  
        return amdgpu_bo_create_kernel_at(adev,
-                                         adev->fw_vram_usage.start_offset,
-                                         adev->fw_vram_usage.size,
+                                         adev->mman.fw_vram_usage_start_offset,
+                                         adev->mman.fw_vram_usage_size,
                                          AMDGPU_GEM_DOMAIN_VRAM,
-                                         &adev->fw_vram_usage.reserved_bo,
-                                         &adev->fw_vram_usage.va);
+                                         &adev->mman.fw_vram_usage_reserved_bo,
+                                         &adev->mman.fw_vram_usage_va);
  }
  
  /*
@@@ -1763,7 -1775,7 +1763,7 @@@ static void amdgpu_ttm_training_data_bl
        memset(ctx, 0, sizeof(*ctx));
  
        ctx->c2p_train_data_offset =
-               ALIGN((adev->gmc.mc_vram_size - adev->discovery_tmr_size - SZ_1M), SZ_1M);
+               ALIGN((adev->gmc.mc_vram_size - adev->mman.discovery_tmr_size - SZ_1M), SZ_1M);
        ctx->p2c_train_data_offset =
                (adev->gmc.mc_vram_size - GDDR6_MEM_TRAINING_OFFSET);
        ctx->train_data_size =
@@@ -1802,10 -1814,10 +1802,10 @@@ static int amdgpu_ttm_reserve_tmr(struc
         * Otherwise, fallback to legacy approach to check and reserve tmr block for ip
         * discovery data and G6 memory training data respectively
         */
-       adev->discovery_tmr_size =
+       adev->mman.discovery_tmr_size =
                amdgpu_atomfirmware_get_fw_reserved_fb_size(adev);
-       if (!adev->discovery_tmr_size)
-               adev->discovery_tmr_size = DISCOVERY_TMR_OFFSET;
+       if (!adev->mman.discovery_tmr_size)
+               adev->mman.discovery_tmr_size = DISCOVERY_TMR_OFFSET;
  
        if (mem_train_support) {
                /* reserve vram for mem train according to TMR location */
        }
  
        ret = amdgpu_bo_create_kernel_at(adev,
-                               adev->gmc.real_vram_size - adev->discovery_tmr_size,
-                               adev->discovery_tmr_size,
+                               adev->gmc.real_vram_size - adev->mman.discovery_tmr_size,
+                               adev->mman.discovery_tmr_size,
                                AMDGPU_GEM_DOMAIN_VRAM,
-                               &adev->discovery_memory,
+                               &adev->mman.discovery_memory,
                                NULL);
        if (ret) {
                DRM_ERROR("alloc tmr failed(%d)!\n", ret);
-               amdgpu_bo_free_kernel(&adev->discovery_memory, NULL, NULL);
+               amdgpu_bo_free_kernel(&adev->mman.discovery_memory, NULL, NULL);
                return ret;
        }
  
@@@ -1853,15 -1865,14 +1853,14 @@@ int amdgpu_ttm_init(struct amdgpu_devic
        uint64_t gtt_size;
        int r;
        u64 vis_vram_limit;
-       void *stolen_vga_buf;
  
        mutex_init(&adev->mman.gtt_window_lock);
  
        /* No others user of address space so set it to 0 */
        r = ttm_bo_device_init(&adev->mman.bdev,
                               &amdgpu_bo_driver,
-                              adev->ddev->anon_inode->i_mapping,
-                              adev->ddev->vma_offset_manager,
+                              adev_to_drm(adev)->anon_inode->i_mapping,
+                              adev_to_drm(adev)->vma_offset_manager,
                               dma_addressing_limited(adev->dev));
        if (r) {
                DRM_ERROR("failed initializing buffer object driver(%d).\n", r);
         * If IP discovery enabled, a block of memory should be
         * reserved for IP discovey.
         */
-       if (adev->discovery_bin) {
+       if (adev->mman.discovery_bin) {
                r = amdgpu_ttm_reserve_tmr(adev);
                if (r)
                        return r;
         * This is used for VGA emulation and pre-OS scanout buffers to
         * avoid display artifacts while transitioning between pre-OS
         * and driver.  */
-       r = amdgpu_bo_create_kernel(adev, adev->gmc.stolen_size, PAGE_SIZE,
-                                   AMDGPU_GEM_DOMAIN_VRAM,
-                                   &adev->stolen_vga_memory,
-                                   NULL, &stolen_vga_buf);
+       r = amdgpu_bo_create_kernel_at(adev, 0, adev->mman.stolen_vga_size,
+                                      AMDGPU_GEM_DOMAIN_VRAM,
+                                      &adev->mman.stolen_vga_memory,
+                                      NULL);
+       if (r)
+               return r;
+       r = amdgpu_bo_create_kernel_at(adev, adev->mman.stolen_vga_size,
+                                      adev->mman.stolen_extended_size,
+                                      AMDGPU_GEM_DOMAIN_VRAM,
+                                      &adev->mman.stolen_extended_memory,
+                                      NULL);
        if (r)
                return r;
  
   */
  void amdgpu_ttm_late_init(struct amdgpu_device *adev)
  {
-       void *stolen_vga_buf;
        /* return the VGA stolen memory (if any) back to VRAM */
-       amdgpu_bo_free_kernel(&adev->stolen_vga_memory, NULL, &stolen_vga_buf);
+       if (!adev->mman.keep_stolen_vga_memory)
+               amdgpu_bo_free_kernel(&adev->mman.stolen_vga_memory, NULL, NULL);
+       amdgpu_bo_free_kernel(&adev->mman.stolen_extended_memory, NULL, NULL);
  }
  
  /**
@@@ -1989,8 -2008,11 +1996,11 @@@ void amdgpu_ttm_fini(struct amdgpu_devi
                return;
  
        amdgpu_ttm_training_reserve_vram_fini(adev);
+       /* return the stolen vga memory back to VRAM */
+       if (adev->mman.keep_stolen_vga_memory)
+               amdgpu_bo_free_kernel(&adev->mman.stolen_vga_memory, NULL, NULL);
        /* return the IP Discovery TMR memory back to VRAM */
-       amdgpu_bo_free_kernel(&adev->discovery_memory, NULL, NULL);
+       amdgpu_bo_free_kernel(&adev->mman.discovery_memory, NULL, NULL);
        amdgpu_ttm_fw_reserve_vram_fini(adev);
  
        if (adev->mman.aper_base_kaddr)
@@@ -2022,7 -2044,7 +2032,7 @@@ void amdgpu_ttm_set_buffer_funcs_status
        uint64_t size;
        int r;
  
-       if (!adev->mman.initialized || adev->in_gpu_reset ||
+       if (!adev->mman.initialized || amdgpu_in_reset(adev) ||
            adev->mman.buffer_funcs_enabled == enable)
                return;
  
                ring = adev->mman.buffer_funcs_ring;
                sched = &ring->sched;
                r = drm_sched_entity_init(&adev->mman.entity,
-                                         DRM_SCHED_PRIORITY_KERNEL, &sched,
+                                         DRM_SCHED_PRIORITY_KERNEL, &sched,
                                          1, NULL);
                if (r) {
                        DRM_ERROR("Failed setting up TTM BO move entity (%d)\n",
  int amdgpu_mmap(struct file *filp, struct vm_area_struct *vma)
  {
        struct drm_file *file_priv = filp->private_data;
-       struct amdgpu_device *adev = file_priv->minor->dev->dev_private;
+       struct amdgpu_device *adev = drm_to_adev(file_priv->minor->dev);
  
        if (adev == NULL)
                return -EINVAL;
@@@ -2239,7 -2261,7 +2249,7 @@@ static int amdgpu_mm_dump_table(struct 
        struct drm_info_node *node = (struct drm_info_node *)m->private;
        unsigned ttm_pl = (uintptr_t)node->info_ent->data;
        struct drm_device *dev = node->minor->dev;
-       struct amdgpu_device *adev = dev->dev_private;
+       struct amdgpu_device *adev = drm_to_adev(dev);
        struct ttm_resource_manager *man = ttm_manager_type(&adev->mman.bdev, ttm_pl);
        struct drm_printer p = drm_seq_file_printer(m);
  
@@@ -2530,7 -2552,7 +2540,7 @@@ int amdgpu_ttm_debugfs_init(struct amdg
  #if defined(CONFIG_DEBUG_FS)
        unsigned count;
  
-       struct drm_minor *minor = adev->ddev->primary;
+       struct drm_minor *minor = adev_to_drm(adev)->primary;
        struct dentry *ent, *root = minor->debugfs_root;
  
        for (count = 0; count < ARRAY_SIZE(ttm_debugfs_entries); count++) {
index 4f9426ecf0391d4e0b5a6ab1604f7e190b8289c6,68c5e3662b871065489ea9854088492c6432d8db..a87951b2f06dd159ecb5e2b860e925d6e1c2a21a
  #define AMDGPU_PL_GWS         (TTM_PL_PRIV + 1)
  #define AMDGPU_PL_OA          (TTM_PL_PRIV + 2)
  
 -#define AMDGPU_PL_FLAG_GDS            (TTM_PL_FLAG_PRIV << 0)
 -#define AMDGPU_PL_FLAG_GWS            (TTM_PL_FLAG_PRIV << 1)
 -#define AMDGPU_PL_FLAG_OA             (TTM_PL_FLAG_PRIV << 2)
 -
  #define AMDGPU_GTT_MAX_TRANSFER_SIZE  512
  #define AMDGPU_GTT_NUM_TRANSFER_WINDOWS       2
  
@@@ -73,6 -77,23 +73,23 @@@ struct amdgpu_mman 
  
        struct amdgpu_vram_mgr vram_mgr;
        struct amdgpu_gtt_mgr gtt_mgr;
+       uint64_t                stolen_vga_size;
+       struct amdgpu_bo        *stolen_vga_memory;
+       uint64_t                stolen_extended_size;
+       struct amdgpu_bo        *stolen_extended_memory;
+       bool                    keep_stolen_vga_memory;
+       /* discovery */
+       uint8_t                         *discovery_bin;
+       uint32_t                        discovery_tmr_size;
+       struct amdgpu_bo                *discovery_memory;
+       /* firmware VRAM reservation */
+       u64             fw_vram_usage_start_offset;
+       u64             fw_vram_usage_size;
+       struct amdgpu_bo        *fw_vram_usage_reserved_bo;
+       void            *fw_vram_usage_va;
  };
  
  struct amdgpu_copy_mem {
index 166405d4c536ea24c779def5500359e217f8bf7b,17dbed0a9800dcff491a570af9142160d504c522..b9c5a98c5c9ce38e43d098067df50c379e705ab2
@@@ -961,8 -961,6 +961,8 @@@ static bool drm_dp_sideband_parse_reply
                return drm_dp_sideband_parse_remote_dpcd_write(raw, msg);
        case DP_REMOTE_I2C_READ:
                return drm_dp_sideband_parse_remote_i2c_read_ack(raw, msg);
 +      case DP_REMOTE_I2C_WRITE:
 +              return true; /* since there's nothing to parse */
        case DP_ENUM_PATH_RESOURCES:
                return drm_dp_sideband_parse_enum_path_resources_ack(raw, msg);
        case DP_ALLOCATE_PAYLOAD:
@@@ -3488,6 -3486,28 +3488,28 @@@ static int drm_dp_get_vc_payload_bw(u8 
        return dp_link_bw * dp_link_count / 2;
  }
  
+ /**
+  * drm_dp_read_mst_cap() - check whether or not a sink supports MST
+  * @aux: The DP AUX channel to use
+  * @dpcd: A cached copy of the DPCD capabilities for this sink
+  *
+  * Returns: %True if the sink supports MST, %false otherwise
+  */
+ bool drm_dp_read_mst_cap(struct drm_dp_aux *aux,
+                        const u8 dpcd[DP_RECEIVER_CAP_SIZE])
+ {
+       u8 mstm_cap;
+       if (dpcd[DP_DPCD_REV] < DP_DPCD_REV_12)
+               return false;
+       if (drm_dp_dpcd_readb(aux, DP_MSTM_CAP, &mstm_cap) != 1)
+               return false;
+       return mstm_cap & DP_MST_CAP;
+ }
+ EXPORT_SYMBOL(drm_dp_read_mst_cap);
  /**
   * drm_dp_mst_topology_mgr_set_mst() - Set the MST state for a topology manager
   * @mgr: manager to set state for
@@@ -5042,8 -5062,8 +5064,8 @@@ int drm_dp_mst_add_affected_dsc_crtcs(s
  
                crtc = conn_state->crtc;
  
-               if (WARN_ON(!crtc))
-                       return -EINVAL;
+               if (!crtc)
+                       continue;
  
                if (!drm_dp_mst_dsc_aux_for_port(pos->port))
                        continue;
@@@ -5329,29 -5349,29 +5351,29 @@@ static bool remote_i2c_read_ok(const st
                msgs[num - 1].len <= 0xff;
  }
  
 -/* I2C device */
 -static int drm_dp_mst_i2c_xfer(struct i2c_adapter *adapter, struct i2c_msg *msgs,
 -                             int num)
 +static bool remote_i2c_write_ok(const struct i2c_msg msgs[], int num)
 +{
 +      int i;
 +
 +      for (i = 0; i < num - 1; i++) {
 +              if (msgs[i].flags & I2C_M_RD || !(msgs[i].flags & I2C_M_STOP) ||
 +                  msgs[i].len > 0xff)
 +                      return false;
 +      }
 +
 +      return !(msgs[num - 1].flags & I2C_M_RD) && msgs[num - 1].len <= 0xff;
 +}
 +
 +static int drm_dp_mst_i2c_read(struct drm_dp_mst_branch *mstb,
 +                             struct drm_dp_mst_port *port,
 +                             struct i2c_msg *msgs, int num)
  {
 -      struct drm_dp_aux *aux = adapter->algo_data;
 -      struct drm_dp_mst_port *port = container_of(aux, struct drm_dp_mst_port, aux);
 -      struct drm_dp_mst_branch *mstb;
        struct drm_dp_mst_topology_mgr *mgr = port->mgr;
        unsigned int i;
        struct drm_dp_sideband_msg_req_body msg;
        struct drm_dp_sideband_msg_tx *txmsg = NULL;
        int ret;
  
 -      mstb = drm_dp_mst_topology_get_mstb_validated(mgr, port->parent);
 -      if (!mstb)
 -              return -EREMOTEIO;
 -
 -      if (!remote_i2c_read_ok(msgs, num)) {
 -              DRM_DEBUG_KMS("Unsupported I2C transaction for MST device\n");
 -              ret = -EIO;
 -              goto out;
 -      }
 -
        memset(&msg, 0, sizeof(msg));
        msg.req_type = DP_REMOTE_I2C_READ;
        msg.u.i2c_read.num_transactions = num - 1;
        }
  out:
        kfree(txmsg);
 +      return ret;
 +}
 +
 +static int drm_dp_mst_i2c_write(struct drm_dp_mst_branch *mstb,
 +                              struct drm_dp_mst_port *port,
 +                              struct i2c_msg *msgs, int num)
 +{
 +      struct drm_dp_mst_topology_mgr *mgr = port->mgr;
 +      unsigned int i;
 +      struct drm_dp_sideband_msg_req_body msg;
 +      struct drm_dp_sideband_msg_tx *txmsg = NULL;
 +      int ret;
 +
 +      txmsg = kzalloc(sizeof(*txmsg), GFP_KERNEL);
 +      if (!txmsg) {
 +              ret = -ENOMEM;
 +              goto out;
 +      }
 +      for (i = 0; i < num; i++) {
 +              memset(&msg, 0, sizeof(msg));
 +              msg.req_type = DP_REMOTE_I2C_WRITE;
 +              msg.u.i2c_write.port_number = port->port_num;
 +              msg.u.i2c_write.write_i2c_device_id = msgs[i].addr;
 +              msg.u.i2c_write.num_bytes = msgs[i].len;
 +              msg.u.i2c_write.bytes = msgs[i].buf;
 +
 +              memset(txmsg, 0, sizeof(*txmsg));
 +              txmsg->dst = mstb;
 +
 +              drm_dp_encode_sideband_req(&msg, txmsg);
 +              drm_dp_queue_down_tx(mgr, txmsg);
 +
 +              ret = drm_dp_mst_wait_tx_reply(mstb, txmsg);
 +              if (ret > 0) {
 +                      if (txmsg->reply.reply_type == DP_SIDEBAND_REPLY_NAK) {
 +                              ret = -EREMOTEIO;
 +                              goto out;
 +                      }
 +              } else {
 +                      goto out;
 +              }
 +      }
 +      ret = num;
 +out:
 +      kfree(txmsg);
 +      return ret;
 +}
 +
 +/* I2C device */
 +static int drm_dp_mst_i2c_xfer(struct i2c_adapter *adapter,
 +                             struct i2c_msg *msgs, int num)
 +{
 +      struct drm_dp_aux *aux = adapter->algo_data;
 +      struct drm_dp_mst_port *port =
 +              container_of(aux, struct drm_dp_mst_port, aux);
 +      struct drm_dp_mst_branch *mstb;
 +      struct drm_dp_mst_topology_mgr *mgr = port->mgr;
 +      int ret;
 +
 +      mstb = drm_dp_mst_topology_get_mstb_validated(mgr, port->parent);
 +      if (!mstb)
 +              return -EREMOTEIO;
 +
 +      if (remote_i2c_read_ok(msgs, num)) {
 +              ret = drm_dp_mst_i2c_read(mstb, port, msgs, num);
 +      } else if (remote_i2c_write_ok(msgs, num)) {
 +              ret = drm_dp_mst_i2c_write(mstb, port, msgs, num);
 +      } else {
 +              DRM_DEBUG_KMS("Unsupported I2C transaction for MST device\n");
 +              ret = -EIO;
 +      }
 +
        drm_dp_mst_topology_put_mstb(mstb);
        return ret;
  }
index 41d990cca6850e36e8ff4ac86e144d50263751e6,3ee836dc5058f5799997a1836c7a9855ab270a9c..7739f46470d3e1215402e541f55194d6764d34a9
  
  #include <nvif/if0004.h>
  
+ struct nouveau_connector *
+ nv04_encoder_get_connector(struct nouveau_encoder *encoder)
+ {
+       struct drm_device *dev = to_drm_encoder(encoder)->dev;
+       struct drm_connector *connector;
+       struct drm_connector_list_iter conn_iter;
+       struct nouveau_connector *nv_connector = NULL;
+       drm_connector_list_iter_begin(dev, &conn_iter);
+       drm_for_each_connector_iter(connector, &conn_iter) {
+               if (connector->encoder == to_drm_encoder(encoder))
+                       nv_connector = nouveau_connector(connector);
+       }
+       drm_connector_list_iter_end(&conn_iter);
+       return nv_connector;
+ }
  static void
- nv04_display_fini(struct drm_device *dev, bool suspend)
+ nv04_display_fini(struct drm_device *dev, bool runtime, bool suspend)
  {
+       struct nouveau_drm *drm = nouveau_drm(dev);
        struct nv04_display *disp = nv04_display(dev);
        struct drm_crtc *crtc;
  
@@@ -49,6 -68,9 +68,9 @@@
        if (nv_two_heads(dev))
                NVWriteCRTC(dev, 1, NV_PCRTC_INTR_EN_0, 0);
  
+       if (!runtime)
+               cancel_work_sync(&drm->hpd_work);
        if (!suspend)
                return;
  
@@@ -112,7 -134,7 +134,7 @@@ nv04_display_init(struct drm_device *de
                if (!fb || !fb->obj[0])
                        continue;
                nvbo = nouveau_gem_object(fb->obj[0]);
 -              ret = nouveau_bo_pin(nvbo, TTM_PL_FLAG_VRAM, true);
 +              ret = nouveau_bo_pin(nvbo, NOUVEAU_GEM_DOMAIN_VRAM, true);
                if (ret)
                        NV_ERROR(drm, "Could not pin framebuffer\n");
        }
                if (!nv_crtc->cursor.nvbo)
                        continue;
  
 -              ret = nouveau_bo_pin(nv_crtc->cursor.nvbo, TTM_PL_FLAG_VRAM, true);
 +              ret = nouveau_bo_pin(nv_crtc->cursor.nvbo,
 +                                   NOUVEAU_GEM_DOMAIN_VRAM, true);
                if (!ret && nv_crtc->cursor.set_offset)
                        ret = nouveau_bo_map(nv_crtc->cursor.nvbo);
                if (ret)
index 9dfb577f148a7da626137a8624d8f6b908ca7917,7799530e07c1f6f4cc477aff02acacf7d03ef6ae..852e1b56f3a7cbd7f806982a3aa9057a2bb51f0a
@@@ -257,6 -257,12 +257,12 @@@ nv50_dmac_create(struct nvif_device *de
        dmac->push->end = dmac->push->bgn;
        dmac->max = 0x1000/4 - 1;
  
+       /* EVO channels are affected by a HW bug where the last 12 DWORDs
+        * of the push buffer aren't able to be used safely.
+        */
+       if (disp->oclass < GV100_DISP)
+               dmac->max -= 12;
        args->pushbuf = nvif_handle(&dmac->_push.mem.object);
  
        ret = nv50_chan_create(device, disp, oclass, head, data, size,
@@@ -411,6 -417,40 +417,40 @@@ nv50_outp_atomic_check(struct drm_encod
        return 0;
  }
  
+ struct nouveau_connector *
+ nv50_outp_get_new_connector(struct nouveau_encoder *outp,
+                           struct drm_atomic_state *state)
+ {
+       struct drm_connector *connector;
+       struct drm_connector_state *connector_state;
+       struct drm_encoder *encoder = to_drm_encoder(outp);
+       int i;
+       for_each_new_connector_in_state(state, connector, connector_state, i) {
+               if (connector_state->best_encoder == encoder)
+                       return nouveau_connector(connector);
+       }
+       return NULL;
+ }
+ struct nouveau_connector *
+ nv50_outp_get_old_connector(struct nouveau_encoder *outp,
+                           struct drm_atomic_state *state)
+ {
+       struct drm_connector *connector;
+       struct drm_connector_state *connector_state;
+       struct drm_encoder *encoder = to_drm_encoder(outp);
+       int i;
+       for_each_old_connector_in_state(state, connector, connector_state, i) {
+               if (connector_state->best_encoder == encoder)
+                       return nouveau_connector(connector);
+       }
+       return NULL;
+ }
  /******************************************************************************
   * DAC
   *****************************************************************************/
@@@ -552,16 -592,31 +592,31 @@@ nv50_audio_component_get_eld(struct dev
        struct nouveau_drm *drm = nouveau_drm(drm_dev);
        struct drm_encoder *encoder;
        struct nouveau_encoder *nv_encoder;
-       struct nouveau_connector *nv_connector;
+       struct drm_connector *connector;
        struct nouveau_crtc *nv_crtc;
+       struct drm_connector_list_iter conn_iter;
        int ret = 0;
  
        *enabled = false;
        drm_for_each_encoder(encoder, drm->dev) {
+               struct nouveau_connector *nv_connector = NULL;
                nv_encoder = nouveau_encoder(encoder);
-               nv_connector = nouveau_encoder_connector_get(nv_encoder);
+               drm_connector_list_iter_begin(drm_dev, &conn_iter);
+               drm_for_each_connector_iter(connector, &conn_iter) {
+                       if (connector->state->best_encoder == encoder) {
+                               nv_connector = nouveau_connector(connector);
+                               break;
+                       }
+               }
+               drm_connector_list_iter_end(&conn_iter);
+               if (!nv_connector)
+                       continue;
                nv_crtc = nouveau_crtc(encoder->crtc);
-               if (!nv_connector || !nv_crtc || nv_encoder->or != port ||
+               if (!nv_crtc || nv_encoder->or != port ||
                    nv_crtc->index != dev_id)
                        continue;
                *enabled = nv_encoder->audio;
                }
                break;
        }
        return ret;
  }
  
@@@ -665,7 -721,8 +721,8 @@@ nv50_audio_disable(struct drm_encoder *
  }
  
  static void
- nv50_audio_enable(struct drm_encoder *encoder, struct drm_display_mode *mode)
+ nv50_audio_enable(struct drm_encoder *encoder, struct drm_atomic_state *state,
+                 struct drm_display_mode *mode)
  {
        struct nouveau_drm *drm = nouveau_drm(encoder->dev);
        struct nouveau_encoder *nv_encoder = nouveau_encoder(encoder);
                                     (0x0100 << nv_crtc->index),
        };
  
-       nv_connector = nouveau_encoder_connector_get(nv_encoder);
+       nv_connector = nv50_outp_get_new_connector(nv_encoder, state);
        if (!drm_detect_monitor_audio(nv_connector->edid))
                return;
  
@@@ -723,7 -780,8 +780,8 @@@ nv50_hdmi_disable(struct drm_encoder *e
  }
  
  static void
- nv50_hdmi_enable(struct drm_encoder *encoder, struct drm_display_mode *mode)
+ nv50_hdmi_enable(struct drm_encoder *encoder, struct drm_atomic_state *state,
+                struct drm_display_mode *mode)
  {
        struct nouveau_drm *drm = nouveau_drm(encoder->dev);
        struct nouveau_encoder *nv_encoder = nouveau_encoder(encoder);
        int ret;
        int size;
  
-       nv_connector = nouveau_encoder_connector_get(nv_encoder);
+       nv_connector = nv50_outp_get_new_connector(nv_encoder, state);
        if (!drm_detect_hdmi_monitor(nv_connector->edid))
                return;
  
                + args.pwr.vendor_infoframe_length;
        nvif_mthd(&disp->disp->object, 0, &args, size);
  
-       nv50_audio_enable(encoder, mode);
+       nv50_audio_enable(encoder, state, mode);
  
        /* If SCDC is supported by the downstream monitor, update
         * divider / scrambling settings to what we programmed above.
  #define nv50_mstc(p) container_of((p), struct nv50_mstc, connector)
  #define nv50_msto(p) container_of((p), struct nv50_msto, encoder)
  
- struct nv50_mstm {
-       struct nouveau_encoder *outp;
-       struct drm_dp_mst_topology_mgr mgr;
-       bool modified;
-       bool disabled;
-       int links;
- };
  struct nv50_mstc {
        struct nv50_mstm *mstm;
        struct drm_dp_mst_port *port;
@@@ -1216,7 -1264,10 +1264,10 @@@ nv50_mstc_detect(struct drm_connector *
  
        ret = drm_dp_mst_detect_port(connector, ctx, mstc->port->mgr,
                                     mstc->port);
+       if (ret != connector_status_connected)
+               goto out;
  
+ out:
        pm_runtime_mark_last_busy(connector->dev->dev);
        pm_runtime_put_autosuspend(connector->dev->dev);
        return ret;
@@@ -1365,41 -1416,51 +1416,51 @@@ nv50_mstm = 
        .add_connector = nv50_mstm_add_connector,
  };
  
- void
- nv50_mstm_service(struct nv50_mstm *mstm)
+ bool
+ nv50_mstm_service(struct nouveau_drm *drm,
+                 struct nouveau_connector *nv_connector,
+                 struct nv50_mstm *mstm)
  {
-       struct drm_dp_aux *aux = mstm ? mstm->mgr.aux : NULL;
-       bool handled = true;
-       int ret;
+       struct drm_dp_aux *aux = &nv_connector->aux;
+       bool handled = true, ret = true;
+       int rc;
        u8 esi[8] = {};
  
-       if (!aux)
-               return;
        while (handled) {
-               ret = drm_dp_dpcd_read(aux, DP_SINK_COUNT_ESI, esi, 8);
-               if (ret != 8) {
-                       drm_dp_mst_topology_mgr_set_mst(&mstm->mgr, false);
-                       return;
+               rc = drm_dp_dpcd_read(aux, DP_SINK_COUNT_ESI, esi, 8);
+               if (rc != 8) {
+                       ret = false;
+                       break;
                }
  
                drm_dp_mst_hpd_irq(&mstm->mgr, esi, &handled);
                if (!handled)
                        break;
  
-               drm_dp_dpcd_write(aux, DP_SINK_COUNT_ESI + 1, &esi[1], 3);
+               rc = drm_dp_dpcd_write(aux, DP_SINK_COUNT_ESI + 1, &esi[1],
+                                      3);
+               if (rc != 3) {
+                       ret = false;
+                       break;
+               }
        }
+       if (!ret)
+               NV_DEBUG(drm, "Failed to handle ESI on %s: %d\n",
+                        nv_connector->base.name, rc);
+       return ret;
  }
  
  void
  nv50_mstm_remove(struct nv50_mstm *mstm)
  {
-       if (mstm)
-               drm_dp_mst_topology_mgr_set_mst(&mstm->mgr, false);
+       mstm->is_mst = false;
+       drm_dp_mst_topology_mgr_set_mst(&mstm->mgr, false);
  }
  
  static int
- nv50_mstm_enable(struct nv50_mstm *mstm, u8 dpcd, int state)
+ nv50_mstm_enable(struct nv50_mstm *mstm, int state)
  {
        struct nouveau_encoder *outp = mstm->outp;
        struct {
        };
        struct nouveau_drm *drm = nouveau_drm(outp->base.base.dev);
        struct nvif_object *disp = &drm->display->disp.object;
-       int ret;
-       if (dpcd >= 0x12) {
-               /* Even if we're enabling MST, start with disabling the
-                * branching unit to clear any sink-side MST topology state
-                * that wasn't set by us
-                */
-               ret = drm_dp_dpcd_writeb(mstm->mgr.aux, DP_MSTM_CTRL, 0);
-               if (ret < 0)
-                       return ret;
-               if (state) {
-                       /* Now, start initializing */
-                       ret = drm_dp_dpcd_writeb(mstm->mgr.aux, DP_MSTM_CTRL,
-                                                DP_MST_EN);
-                       if (ret < 0)
-                               return ret;
-               }
-       }
  
        return nvif_mthd(disp, 0, &args, sizeof(args));
  }
  
  int
- nv50_mstm_detect(struct nv50_mstm *mstm, u8 dpcd[8], int allow)
+ nv50_mstm_detect(struct nouveau_encoder *outp)
  {
+       struct nv50_mstm *mstm = outp->dp.mstm;
        struct drm_dp_aux *aux;
        int ret;
-       bool old_state, new_state;
-       u8 mstm_ctrl;
  
-       if (!mstm)
+       if (!mstm || !mstm->can_mst)
                return 0;
  
-       mutex_lock(&mstm->mgr.lock);
-       old_state = mstm->mgr.mst_state;
-       new_state = old_state;
        aux = mstm->mgr.aux;
  
-       if (old_state) {
-               /* Just check that the MST hub is still as we expect it */
-               ret = drm_dp_dpcd_readb(aux, DP_MSTM_CTRL, &mstm_ctrl);
-               if (ret < 0 || !(mstm_ctrl & DP_MST_EN)) {
-                       DRM_DEBUG_KMS("Hub gone, disabling MST topology\n");
-                       new_state = false;
-               }
-       } else if (dpcd[0] >= 0x12) {
-               ret = drm_dp_dpcd_readb(aux, DP_MSTM_CAP, &dpcd[1]);
-               if (ret < 0)
-                       goto probe_error;
-               if (!(dpcd[1] & DP_MST_CAP))
-                       dpcd[0] = 0x11;
-               else
-                       new_state = allow;
-       }
-       if (new_state == old_state) {
-               mutex_unlock(&mstm->mgr.lock);
-               return new_state;
-       }
-       ret = nv50_mstm_enable(mstm, dpcd[0], new_state);
-       if (ret)
-               goto probe_error;
-       mutex_unlock(&mstm->mgr.lock);
+       /* Clear any leftover MST state we didn't set ourselves by first
+        * disabling MST if it was already enabled
+        */
+       ret = drm_dp_dpcd_writeb(aux, DP_MSTM_CTRL, 0);
+       if (ret < 0)
+               return ret;
  
-       ret = drm_dp_mst_topology_mgr_set_mst(&mstm->mgr, new_state);
+       /* And start enabling */
+       ret = nv50_mstm_enable(mstm, true);
        if (ret)
-               return nv50_mstm_enable(mstm, dpcd[0], 0);
+               return ret;
  
-       return new_state;
+       ret = drm_dp_mst_topology_mgr_set_mst(&mstm->mgr, true);
+       if (ret) {
+               nv50_mstm_enable(mstm, false);
+               return ret;
+       }
  
- probe_error:
-       mutex_unlock(&mstm->mgr.lock);
-       return ret;
+       mstm->is_mst = true;
+       return 1;
  }
  
  static void
- nv50_mstm_fini(struct nv50_mstm *mstm)
+ nv50_mstm_fini(struct nouveau_encoder *outp)
  {
-       if (mstm && mstm->mgr.mst_state)
+       struct nv50_mstm *mstm = outp->dp.mstm;
+       if (!mstm)
+               return;
+       /* Don't change the MST state of this connector until we've finished
+        * resuming, since we can't safely grab hpd_irq_lock in our resume
+        * path to protect mstm->is_mst without potentially deadlocking
+        */
+       mutex_lock(&outp->dp.hpd_irq_lock);
+       mstm->suspended = true;
+       mutex_unlock(&outp->dp.hpd_irq_lock);
+       if (mstm->is_mst)
                drm_dp_mst_topology_mgr_suspend(&mstm->mgr);
  }
  
  static void
- nv50_mstm_init(struct nv50_mstm *mstm, bool runtime)
+ nv50_mstm_init(struct nouveau_encoder *outp, bool runtime)
  {
-       int ret;
+       struct nv50_mstm *mstm = outp->dp.mstm;
+       int ret = 0;
  
-       if (!mstm || !mstm->mgr.mst_state)
+       if (!mstm)
                return;
  
-       ret = drm_dp_mst_topology_mgr_resume(&mstm->mgr, !runtime);
-       if (ret == -1) {
-               drm_dp_mst_topology_mgr_set_mst(&mstm->mgr, false);
-               drm_kms_helper_hotplug_event(mstm->mgr.dev);
+       if (mstm->is_mst) {
+               ret = drm_dp_mst_topology_mgr_resume(&mstm->mgr, !runtime);
+               if (ret == -1)
+                       nv50_mstm_remove(mstm);
        }
+       mutex_lock(&outp->dp.hpd_irq_lock);
+       mstm->suspended = false;
+       mutex_unlock(&outp->dp.hpd_irq_lock);
+       if (ret == -1)
+               drm_kms_helper_hotplug_event(mstm->mgr.dev);
  }
  
  static void
@@@ -1535,17 -1575,6 +1575,6 @@@ nv50_mstm_new(struct nouveau_encoder *o
        struct drm_device *dev = outp->base.base.dev;
        struct nv50_mstm *mstm;
        int ret;
-       u8 dpcd;
-       /* This is a workaround for some monitors not functioning
-        * correctly in MST mode on initial module load.  I think
-        * some bad interaction with the VBIOS may be responsible.
-        *
-        * A good ol' off and on again seems to work here ;)
-        */
-       ret = drm_dp_dpcd_readb(aux, DP_DPCD_REV, &dpcd);
-       if (ret >= 0 && dpcd >= 0x12)
-               drm_dp_dpcd_writeb(aux, DP_MSTM_CTRL, 0);
  
        if (!(mstm = *pmstm = kzalloc(sizeof(*mstm), GFP_KERNEL)))
                return -ENOMEM;
@@@ -1584,23 -1613,27 +1613,27 @@@ nv50_sor_update(struct nouveau_encoder 
  }
  
  static void
- nv50_sor_disable(struct drm_encoder *encoder)
+ nv50_sor_disable(struct drm_encoder *encoder,
+                struct drm_atomic_state *state)
  {
        struct nouveau_encoder *nv_encoder = nouveau_encoder(encoder);
        struct nouveau_crtc *nv_crtc = nouveau_crtc(nv_encoder->crtc);
+       struct nouveau_connector *nv_connector =
+               nv50_outp_get_old_connector(nv_encoder, state);
  
        nv_encoder->crtc = NULL;
  
        if (nv_crtc) {
-               struct nvkm_i2c_aux *aux = nv_encoder->aux;
+               struct drm_dp_aux *aux = &nv_connector->aux;
                u8 pwr;
  
-               if (aux) {
-                       int ret = nvkm_rdaux(aux, DP_SET_POWER, &pwr, 1);
+               if (nv_encoder->dcb->type == DCB_OUTPUT_DP) {
+                       int ret = drm_dp_dpcd_readb(aux, DP_SET_POWER, &pwr);
                        if (ret == 0) {
                                pwr &= ~DP_SET_POWER_MASK;
                                pwr |=  DP_SET_POWER_D3;
-                               nvkm_wraux(aux, DP_SET_POWER, &pwr, 1);
+                               drm_dp_dpcd_writeb(aux, DP_SET_POWER, pwr);
                        }
                }
  
  }
  
  static void
- nv50_sor_enable(struct drm_encoder *encoder)
+ nv50_sor_enable(struct drm_encoder *encoder,
+               struct drm_atomic_state *state)
  {
        struct nouveau_encoder *nv_encoder = nouveau_encoder(encoder);
        struct nouveau_crtc *nv_crtc = nouveau_crtc(encoder->crtc);
        u8 proto = NV507D_SOR_SET_CONTROL_PROTOCOL_CUSTOM;
        u8 depth = NV837D_SOR_SET_CONTROL_PIXEL_DEPTH_DEFAULT;
  
-       nv_connector = nouveau_encoder_connector_get(nv_encoder);
+       nv_connector = nv50_outp_get_new_connector(nv_encoder, state);
        nv_encoder->crtc = encoder->crtc;
  
        if ((disp->disp->object.oclass == GT214_DISP ||
                        proto = NV507D_SOR_SET_CONTROL_PROTOCOL_SINGLE_TMDS_B;
                }
  
-               nv50_hdmi_enable(&nv_encoder->base.base, mode);
+               nv50_hdmi_enable(&nv_encoder->base.base, state, mode);
                break;
        case DCB_OUTPUT_LVDS:
                proto = NV507D_SOR_SET_CONTROL_PROTOCOL_LVDS_CUSTOM;
                else
                        proto = NV887D_SOR_SET_CONTROL_PROTOCOL_DP_B;
  
-               nv50_audio_enable(encoder, mode);
+               nv50_audio_enable(encoder, state, mode);
                break;
        default:
                BUG();
  static const struct drm_encoder_helper_funcs
  nv50_sor_help = {
        .atomic_check = nv50_outp_atomic_check,
-       .enable = nv50_sor_enable,
-       .disable = nv50_sor_disable,
+       .atomic_enable = nv50_sor_enable,
+       .atomic_disable = nv50_sor_disable,
  };
  
  static void
@@@ -1727,6 -1761,10 +1761,10 @@@ nv50_sor_destroy(struct drm_encoder *en
        struct nouveau_encoder *nv_encoder = nouveau_encoder(encoder);
        nv50_mstm_del(&nv_encoder->dp.mstm);
        drm_encoder_cleanup(encoder);
+       if (nv_encoder->dcb->type == DCB_OUTPUT_DP)
+               mutex_destroy(&nv_encoder->dp.hpd_irq_lock);
        kfree(encoder);
  }
  
@@@ -1786,6 -1824,8 +1824,8 @@@ nv50_sor_create(struct drm_connector *c
                struct nvkm_i2c_aux *aux =
                        nvkm_i2c_aux_find(i2c, dcbe->i2c_index);
  
+               mutex_init(&nv_encoder->dp.hpd_irq_lock);
                if (aux) {
                        if (disp->disp->object.oclass < GF110_DISP) {
                                /* HW has no support for address-only
@@@ -2077,7 -2117,7 +2117,7 @@@ nv50_disp_atomic_commit_tail(struct drm
                          outp->clr.mask, outp->set.mask);
  
                if (outp->clr.mask) {
-                       help->disable(encoder);
+                       help->atomic_disable(encoder, state);
                        interlock[NV50_DISP_INTERLOCK_CORE] |= 1;
                        if (outp->flush_disable) {
                                nv50_disp_atomic_commit_wndw(state, interlock);
                          outp->set.mask, outp->clr.mask);
  
                if (outp->set.mask) {
-                       help->enable(encoder);
+                       help->atomic_enable(encoder, state);
                        interlock[NV50_DISP_INTERLOCK_CORE] = 1;
                }
  
@@@ -2484,9 -2524,9 +2524,9 @@@ nv50_disp_func = 
   *****************************************************************************/
  
  static void
- nv50_display_fini(struct drm_device *dev, bool suspend)
+ nv50_display_fini(struct drm_device *dev, bool runtime, bool suspend)
  {
-       struct nouveau_encoder *nv_encoder;
+       struct nouveau_drm *drm = nouveau_drm(dev);
        struct drm_encoder *encoder;
        struct drm_plane *plane;
  
        }
  
        list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) {
-               if (encoder->encoder_type != DRM_MODE_ENCODER_DPMST) {
-                       nv_encoder = nouveau_encoder(encoder);
-                       nv50_mstm_fini(nv_encoder->dp.mstm);
-               }
+               if (encoder->encoder_type != DRM_MODE_ENCODER_DPMST)
+                       nv50_mstm_fini(nouveau_encoder(encoder));
        }
+       if (!runtime)
+               cancel_work_sync(&drm->hpd_work);
  }
  
  static int
@@@ -2519,7 -2560,7 +2560,7 @@@ nv50_display_init(struct drm_device *de
                if (encoder->encoder_type != DRM_MODE_ENCODER_DPMST) {
                        struct nouveau_encoder *nv_encoder =
                                nouveau_encoder(encoder);
-                       nv50_mstm_init(nv_encoder->dp.mstm, runtime);
+                       nv50_mstm_init(nv_encoder, runtime);
                }
        }
  
@@@ -2581,11 -2622,10 +2622,11 @@@ nv50_display_create(struct drm_device *
        dev->mode_config.normalize_zpos = true;
  
        /* small shared memory area we use for notifiers and semaphores */
 -      ret = nouveau_bo_new(&drm->client, 4096, 0x1000, TTM_PL_FLAG_VRAM,
 +      ret = nouveau_bo_new(&drm->client, 4096, 0x1000,
 +                           NOUVEAU_GEM_DOMAIN_VRAM,
                             0, 0x0000, NULL, NULL, &disp->sync);
        if (!ret) {
 -              ret = nouveau_bo_pin(disp->sync, TTM_PL_FLAG_VRAM, true);
 +              ret = nouveau_bo_pin(disp->sync, NOUVEAU_GEM_DOMAIN_VRAM, true);
                if (!ret) {
                        ret = nouveau_bo_map(disp->sync);
                        if (ret)
index 26a2c1090045e50875060fdb4f5b1ec709b68d04,73ebf5fba2fcd7990bb9f2fe36f2e1d730761a3d..b8025507a9e4c9de9331979cf7f8a7a7bbed675a
@@@ -164,8 -164,6 +164,8 @@@ struct nouveau_drm 
                int type_vram;
                int type_host[2];
                int type_ncoh[2];
 +              struct mutex io_reserve_mutex;
 +              struct list_head io_reserve_lru;
        } ttm;
  
        /* GEM interface support */
        struct nvbios vbios;
        struct nouveau_display *display;
        struct work_struct hpd_work;
+       struct mutex hpd_lock;
+       u32 hpd_pending;
        struct work_struct fbcon_work;
        int fbcon_new_state;
  #ifdef CONFIG_ACPI
index 0e5497d80686309e7cf4e1e74b0fe680b5812e24,01693e8f24b73890e5d3cbc5fe80a3a3b90d61a0..98a006fc30a58db3b1e097ca309af1d8556a6765
@@@ -101,7 -101,8 +101,7 @@@ static unsigned long ttm_bo_io_mem_pfn(
        if (bdev->driver->io_mem_pfn)
                return bdev->driver->io_mem_pfn(bo, page_offset);
  
 -      return ((bo->mem.bus.base + bo->mem.bus.offset) >> PAGE_SHIFT)
 -              + page_offset;
 +      return (bo->mem.bus.offset >> PAGE_SHIFT) + page_offset;
  }
  
  /**
@@@ -280,6 -281,8 +280,6 @@@ vm_fault_t ttm_bo_vm_fault_reserved(str
        pgoff_t i;
        vm_fault_t ret = VM_FAULT_NOPAGE;
        unsigned long address = vmf->address;
 -      struct ttm_resource_manager *man =
 -              ttm_manager_type(bdev, bo->mem.mem_type);
  
        /*
         * Refuse to fault imported pages. This should be handled
        if (unlikely(ret != 0))
                return ret;
  
 -      err = ttm_mem_io_lock(man, true);
 +      err = ttm_mem_io_reserve(bdev, &bo->mem);
        if (unlikely(err != 0))
 -              return VM_FAULT_NOPAGE;
 -      err = ttm_mem_io_reserve_vm(bo);
 -      if (unlikely(err != 0)) {
 -              ret = VM_FAULT_SIGBUS;
 -              goto out_io_unlock;
 -      }
 +              return VM_FAULT_SIGBUS;
  
        page_offset = ((address - vma->vm_start) >> PAGE_SHIFT) +
                vma->vm_pgoff - drm_vma_node_start(&bo->base.vma_node);
        page_last = vma_pages(vma) + vma->vm_pgoff -
                drm_vma_node_start(&bo->base.vma_node);
  
 -      if (unlikely(page_offset >= bo->num_pages)) {
 -              ret = VM_FAULT_SIGBUS;
 -              goto out_io_unlock;
 -      }
 +      if (unlikely(page_offset >= bo->num_pages))
 +              return VM_FAULT_SIGBUS;
  
        prot = ttm_io_prot(bo->mem.placement, prot);
        if (!bo->mem.bus.is_iomem) {
                };
  
                ttm = bo->ttm;
 -              if (ttm_tt_populate(bo->ttm, &ctx)) {
 -                      ret = VM_FAULT_OOM;
 -                      goto out_io_unlock;
 -              }
 +              if (ttm_tt_populate(bdev, bo->ttm, &ctx))
 +                      return VM_FAULT_OOM;
        } else {
                /* Iomem should not be marked encrypted */
                prot = pgprot_decrypted(prot);
        }
  
        /* We don't prefault on huge faults. Yet. */
 -      if (IS_ENABLED(CONFIG_TRANSPARENT_HUGEPAGE) && fault_page_size != 1) {
 -              ret = ttm_bo_vm_insert_huge(vmf, bo, page_offset,
 -                                          fault_page_size, prot);
 -              goto out_io_unlock;
 -      }
 +      if (IS_ENABLED(CONFIG_TRANSPARENT_HUGEPAGE) && fault_page_size != 1)
 +              return ttm_bo_vm_insert_huge(vmf, bo, page_offset,
 +                                           fault_page_size, prot);
  
        /*
         * Speculatively prefault a number of pages. Only error on
                } else {
                        page = ttm->pages[page_offset];
                        if (unlikely(!page && i == 0)) {
 -                              ret = VM_FAULT_OOM;
 -                              goto out_io_unlock;
 +                              return VM_FAULT_OOM;
                        } else if (unlikely(!page)) {
                                break;
                        }
                /* Never error on prefaulted PTEs */
                if (unlikely((ret & VM_FAULT_ERROR))) {
                        if (i == 0)
 -                              goto out_io_unlock;
 +                              return VM_FAULT_NOPAGE;
                        else
                                break;
                }
                if (unlikely(++page_offset >= page_last))
                        break;
        }
 -      ret = VM_FAULT_NOPAGE;
 -out_io_unlock:
 -      ttm_mem_io_unlock(man);
        return ret;
  }
  EXPORT_SYMBOL(ttm_bo_vm_fault_reserved);
@@@ -505,7 -523,7 +505,7 @@@ int ttm_bo_vm_access(struct vm_area_str
                        if (unlikely(ret != 0))
                                return ret;
                }
-               /* fall through */
+               fallthrough;
        case TTM_PL_TT:
                ret = ttm_bo_vm_access_kmap(bo, offset, buf, len, write);
                break;
index aed7510e271083fe869f73b7943fd9da67b90c2c,534daf37c97ed8bbb133b13f27a91908c83001bc..a8aefaa38bd360c3969212b93be11a8b072666ff
@@@ -18,6 -18,7 +18,7 @@@
  #include <drm/drm_probe_helper.h>
  
  #include <xen/balloon.h>
+ #include <xen/xen.h>
  
  #include "xen_drm_front.h"
  #include "xen_drm_front_gem.h"
@@@ -99,8 -100,8 +100,8 @@@ static struct xen_gem_object *gem_creat
                 * allocate ballooned pages which will be used to map
                 * grant references provided by the backend
                 */
-               ret = alloc_xenballooned_pages(xen_obj->num_pages,
-                                              xen_obj->pages);
+               ret = xen_alloc_unpopulated_pages(xen_obj->num_pages,
+                                                 xen_obj->pages);
                if (ret < 0) {
                        DRM_ERROR("Cannot allocate %zu ballooned pages: %d\n",
                                  xen_obj->num_pages, ret);
@@@ -152,8 -153,8 +153,8 @@@ void xen_drm_front_gem_free_object_unlo
        } else {
                if (xen_obj->pages) {
                        if (xen_obj->be_alloc) {
-                               free_xenballooned_pages(xen_obj->num_pages,
-                                                       xen_obj->pages);
+                               xen_free_unpopulated_pages(xen_obj->num_pages,
+                                                          xen_obj->pages);
                                gem_free_pages_array(xen_obj);
                        } else {
                                drm_gem_put_pages(&xen_obj->base,
@@@ -179,8 -180,7 +180,8 @@@ struct sg_table *xen_drm_front_gem_get_
        if (!xen_obj->pages)
                return ERR_PTR(-ENOMEM);
  
 -      return drm_prime_pages_to_sg(xen_obj->pages, xen_obj->num_pages);
 +      return drm_prime_pages_to_sg(gem_obj->dev,
 +                                   xen_obj->pages, xen_obj->num_pages);
  }
  
  struct drm_gem_object *
index 52f273af6caeec5122db95dfbfdf135c1d7203fa,578d3541e3d6f802d9930036d54a71e0e6362293..1e8a38a7967d890a9e44fb245e2c6ce11f7b0f5c
@@@ -243,7 -243,7 +243,7 @@@ static void vga16fb_update_fix(struct f
  }
  
  static void vga16fb_clock_chip(struct vga16fb_par *par,
 -                             unsigned int pixclock,
 +                             unsigned int *pixclock,
                               const struct fb_info *info,
                               int mul, int div)
  {
                {     0 /* bad */,    0x00, 0x00}};
        int err;
  
 -      pixclock = (pixclock * mul) / div;
 +      *pixclock = (*pixclock * mul) / div;
        best = vgaclocks;
 -      err = pixclock - best->pixclock;
 +      err = *pixclock - best->pixclock;
        if (err < 0) err = -err;
        for (ptr = vgaclocks + 1; ptr->pixclock; ptr++) {
                int tmp;
  
 -              tmp = pixclock - ptr->pixclock;
 +              tmp = *pixclock - ptr->pixclock;
                if (tmp < 0) tmp = -tmp;
                if (tmp < err) {
                        err = tmp;
        }
        par->misc |= best->misc;
        par->clkdiv = best->seq_clock_mode;
 -      pixclock = (best->pixclock * div) / mul;                
 +      *pixclock = (best->pixclock * div) / mul;
  }
                               
  #define FAIL(X) return -EINVAL
@@@ -497,10 -497,10 +497,10 @@@ static int vga16fb_check_var(struct fb_
  
        if (mode & MODE_8BPP)
                /* pixel clock == vga clock / 2 */
 -              vga16fb_clock_chip(par, var->pixclock, info, 1, 2);
 +              vga16fb_clock_chip(par, &var->pixclock, info, 1, 2);
        else
                /* pixel clock == vga clock */
 -              vga16fb_clock_chip(par, var->pixclock, info, 1, 1);
 +              vga16fb_clock_chip(par, &var->pixclock, info, 1, 1);
        
        var->red.offset = var->green.offset = var->blue.offset = 
        var->transp.offset = 0;
@@@ -1121,7 -1121,7 +1121,7 @@@ static void vga_8planes_imageblit(struc
          char oldop = setop(0);
          char oldsr = setsr(0);
          char oldmask = selectmask();
-         const char *cdat = image->data;
+       const unsigned char *cdat = image->data;
        u32 dx = image->dx;
          char __iomem *where;
          int y;