Merge tag 'drm-misc-next-2016-12-30' of git://anongit.freedesktop.org/git/drm-misc...
authorDaniel Vetter <daniel.vetter@ffwll.ch>
Wed, 4 Jan 2017 10:41:10 +0000 (11:41 +0100)
committerDaniel Vetter <daniel.vetter@ffwll.ch>
Wed, 4 Jan 2017 10:41:10 +0000 (11:41 +0100)
Directly merge drm-misc into drm-intel since Dave is on vacation and
we need the various drm-misc patches (fb format rework, drm mm fixes,
selftest framework and others). Also pulled back -rc2 in first to
resync with drm-intel-fixes and make sure I can reuse the exact rerere
solutions from drm-tip for safety, and because I'm lazy.

Signed-off-by: Daniel Vetter <daniel.vetter@intel.com>
20 files changed:
1  2 
MAINTAINERS
drivers/gpu/drm/amd/amdgpu/dce_v6_0.c
drivers/gpu/drm/amd/amdgpu/dce_v8_0.c
drivers/gpu/drm/ast/ast_main.c
drivers/gpu/drm/gma500/framebuffer.c
drivers/gpu/drm/i915/i915_debugfs.c
drivers/gpu/drm/i915/i915_drv.h
drivers/gpu/drm/i915/i915_gem_evict.c
drivers/gpu/drm/i915/i915_gem_gtt.c
drivers/gpu/drm/i915/i915_vma.c
drivers/gpu/drm/i915/intel_display.c
drivers/gpu/drm/i915/intel_drv.h
drivers/gpu/drm/i915/intel_fbc.c
drivers/gpu/drm/i915/intel_fbdev.c
drivers/gpu/drm/i915/intel_overlay.c
drivers/gpu/drm/i915/intel_pm.c
drivers/gpu/drm/i915/intel_sprite.c
drivers/gpu/drm/tilcdc/tilcdc_crtc.c
include/drm/drmP.h
lib/Makefile

diff --combined MAINTAINERS
@@@ -74,10 -74,6 +74,10 @@@ Descriptions of section entries
           These reviewers should be CCed on patches.
        L: Mailing list that is relevant to this area
        W: Web-page with status/info
 +      B: URI for where to file bugs. A web-page with detailed bug
 +         filing info, a direct bug tracker link, or a mailto: URI.
 +      C: URI for chat protocol, server and channel where developers
 +         usually hang out, for example irc://server/channel.
        Q: Patchwork web based patch tracking system site
        T: SCM tree type and location.
           Type is one of: git, hg, quilt, stgit, topgit
@@@ -143,7 -139,7 +143,7 @@@ S: Maintaine
  F:    drivers/net/ethernet/3com/typhoon*
  
  3WARE SAS/SATA-RAID SCSI DRIVERS (3W-XXXX, 3W-9XXX, 3W-SAS)
 -M:    Adam Radford <linuxraid@lsi.com>
 +M:    Adam Radford <aradford@gmail.com>
  L:    linux-scsi@vger.kernel.org
  W:    http://www.lsi.com
  S:    Supported
@@@ -260,12 -256,6 +260,12 @@@ L:       linux-gpio@vger.kernel.or
  S:    Maintained
  F:    drivers/gpio/gpio-104-idio-16.c
  
 +ACCES 104-QUAD-8 IIO DRIVER
 +M:    William Breathitt Gray <vilhelm.gray@gmail.com>
 +L:    linux-iio@vger.kernel.org
 +S:    Maintained
 +F:    drivers/iio/counter/104-quad-8.c
 +
  ACENIC DRIVER
  M:    Jes Sorensen <jes@trained-monkey.org>
  L:    linux-acenic@sunsite.dk
@@@ -540,7 -530,6 +540,7 @@@ S: Supporte
  F:    fs/afs/
  F:    include/net/af_rxrpc.h
  F:    net/rxrpc/af_rxrpc.c
 +W:    https://www.infradead.org/~dhowells/kafs/
  
  AGPGART DRIVER
  M:    David Airlie <airlied@linux.ie>
@@@ -588,11 -577,6 +588,11 @@@ T:       git git://linuxtv.org/anttip/media_t
  S:    Maintained
  F:    drivers/media/usb/airspy/
  
 +ALACRITECH GIGABIT ETHERNET DRIVER
 +M:    Lino Sanfilippo <LinoSanfilippo@gmx.de>
 +S:    Maintained
 +F:    drivers/net/ethernet/alacritech/*
 +
  ALCATEL SPEEDTOUCH USB DRIVER
  M:    Duncan Sands <duncan.sands@free.fr>
  L:    linux-usb@vger.kernel.org
@@@ -810,7 -794,7 +810,7 @@@ S: Supporte
  F:    drivers/iio/*/ad*
  X:    drivers/iio/*/adjd*
  F:    drivers/staging/iio/*/ad*
 -F:    staging/iio/trigger/iio-trig-bfin-timer.c
 +F:    drivers/staging/iio/trigger/iio-trig-bfin-timer.c
  
  ANALOG DEVICES INC DMA DRIVERS
  M:    Lars-Peter Clausen <lars@metafoo.de>
@@@ -1042,7 -1026,6 +1042,7 @@@ L:      linux-arm-kernel@lists.infradead.or
  S:    Maintained
  N:    sun[x456789]i
  F:    arch/arm/boot/dts/ntc-gr8*
 +F:    arch/arm64/boot/dts/allwinner/
  
  ARM/Allwinner SoC Clock Support
  M:    Emilio López <emilio@elopez.com.ar>
@@@ -1060,7 -1043,6 +1060,7 @@@ F:      arch/arm/mach-meson
  F:    arch/arm/boot/dts/meson*
  F:    arch/arm64/boot/dts/amlogic/
  F:    drivers/pinctrl/meson/
 +F:    drivers/mmc/host/meson*
  N:    meson
  
  ARM/Annapurna Labs ALPINE ARCHITECTURE
@@@ -1504,9 -1486,8 +1504,9 @@@ L:      linux-arm-kernel@lists.infradead.or
  L:    linux-oxnas@lists.tuxfamily.org (moderated for non-subscribers)
  S:    Maintained
  F:    arch/arm/mach-oxnas/
 -F:    arch/arm/boot/dts/oxnas*
 +F:    arch/arm/boot/dts/ox8*.dtsi
  F:    arch/arm/boot/dts/wd-mbwe.dts
 +F:    arch/arm/boot/dts/cloudengines-pogoplug-series-3.dts
  N:    oxnas
  
  ARM/Mediatek RTC DRIVER
@@@ -1627,7 -1608,6 +1627,7 @@@ F:      arch/arm/mach-qcom
  F:    arch/arm64/boot/dts/qcom/*
  F:    drivers/i2c/busses/i2c-qup.c
  F:    drivers/clk/qcom/
 +F:    drivers/pinctrl/qcom/
  F:    drivers/soc/qcom/
  F:    drivers/spi/spi-qup.c
  F:    drivers/tty/serial/msm_serial.h
@@@ -1747,7 -1727,7 +1747,7 @@@ F:      drivers/staging/media/platform/s5p-c
  
  ARM/SAMSUNG S5P SERIES JPEG CODEC SUPPORT
  M:    Andrzej Pietrasiewicz <andrzej.p@samsung.com>
 -M:    Jacek Anaszewski <j.anaszewski@samsung.com>
 +M:    Jacek Anaszewski <jacek.anaszewski@gmail.com>
  L:    linux-arm-kernel@lists.infradead.org
  L:    linux-media@vger.kernel.org
  S:    Maintained
@@@ -1802,16 -1782,16 +1802,16 @@@ F:   drivers/char/hw_random/st-rng.
  F:    drivers/clocksource/arm_global_timer.c
  F:    drivers/clocksource/clksrc_st_lpc.c
  F:    drivers/cpufreq/sti-cpufreq.c
 +F:    drivers/dma/st_fdma*
  F:    drivers/i2c/busses/i2c-st.c
  F:    drivers/media/rc/st_rc.c
  F:    drivers/media/platform/sti/c8sectpfe/
  F:    drivers/mmc/host/sdhci-st.c
  F:    drivers/phy/phy-miphy28lp.c
 -F:    drivers/phy/phy-miphy365x.c
  F:    drivers/phy/phy-stih407-usb.c
 -F:    drivers/phy/phy-stih41x-usb.c
  F:    drivers/pinctrl/pinctrl-st.c
  F:    drivers/remoteproc/st_remoteproc.c
 +F:    drivers/remoteproc/st_slim_rproc.c
  F:    drivers/reset/sti/
  F:    drivers/rtc/rtc-st-lpc.c
  F:    drivers/tty/serial/st-asc.c
@@@ -1820,7 -1800,6 +1820,7 @@@ F:      drivers/usb/host/ehci-st.
  F:    drivers/usb/host/ohci-st.c
  F:    drivers/watchdog/st_lpc_wdt.c
  F:    drivers/ata/ahci_st.c
 +F:    include/linux/remoteproc/st_slim_rproc.h
  
  ARM/STM32 ARCHITECTURE
  M:    Maxime Coquelin <mcoquelin.stm32@gmail.com>
@@@ -2346,13 -2325,6 +2346,13 @@@ F:    include/uapi/linux/ax25.
  F:    include/net/ax25.h
  F:    net/ax25/
  
 +AXENTIA ASOC DRIVERS
 +M:    Peter Rosin <peda@axentia.se>
 +L:    alsa-devel@alsa-project.org (moderated for non-subscribers)
 +S:    Maintained
 +F:    Documentation/devicetree/bindings/sound/axentia,*
 +F:    sound/soc/atmel/tse850-pcm5142.c
 +
  AZ6007 DVB DRIVER
  M:    Mauro Carvalho Chehab <mchehab@s-opensource.com>
  M:    Mauro Carvalho Chehab <mchehab@kernel.org>
@@@ -2565,8 -2537,6 +2565,8 @@@ L:      netdev@vger.kernel.or
  L:    linux-kernel@vger.kernel.org
  S:    Supported
  F:    kernel/bpf/
 +F:    tools/testing/selftests/bpf/
 +F:    lib/test_bpf.c
  
  BROADCOM B44 10/100 ETHERNET DRIVER
  M:    Michael Chan <michael.chan@broadcom.com>
@@@ -2627,7 -2597,6 +2627,7 @@@ L:      linux-arm-kernel@lists.infradead.or
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/rpi/linux-rpi.git
  S:    Maintained
  N:    bcm2835
 +F:    drivers/staging/vc04_services
  
  BROADCOM BCM47XX MIPS ARCHITECTURE
  M:    Hauke Mehrtens <hauke@hauke-m.de>
@@@ -2780,14 -2749,6 +2780,14 @@@ L:    bcm-kernel-feedback-list@broadcom.co
  S:    Maintained
  F:    drivers/mtd/nand/brcmnand/
  
 +BROADCOM STB AVS CPUFREQ DRIVER
 +M:    Markus Mayer <mmayer@broadcom.com>
 +M:    bcm-kernel-feedback-list@broadcom.com
 +L:    linux-pm@vger.kernel.org
 +S:    Maintained
 +F:    Documentation/devicetree/bindings/cpufreq/brcm,stb-avs-cpu-freq.txt
 +F:    drivers/cpufreq/brcmstb*
 +
  BROADCOM SPECIFIC AMBA DRIVER (BCMA)
  M:    Rafał Miłecki <zajec5@gmail.com>
  L:    linux-wireless@vger.kernel.org
@@@ -2802,7 -2763,7 +2802,7 @@@ S:      Supporte
  F:    drivers/net/ethernet/broadcom/bcmsysport.*
  
  BROADCOM VULCAN ARM64 SOC
 -M:    Jayachandran C. <jchandra@broadcom.com>
 +M:    Jayachandran C. <c.jayachandran@gmail.com>
  M:    bcm-kernel-feedback-list@broadcom.com
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
  S:    Maintained
@@@ -3010,15 -2971,15 +3010,15 @@@ L:   linux-media@vger.kernel.or
  T:    git git://linuxtv.org/media_tree.git
  W:    http://linuxtv.org
  S:    Supported
 -F:    Documentation/cec.txt
 +F:    Documentation/media/kapi/cec-core.rst
  F:    Documentation/media/uapi/cec
 -F:    drivers/staging/media/cec/
 +F:    drivers/media/cec/
  F:    drivers/media/cec-edid.c
  F:    drivers/media/rc/keymaps/rc-cec.c
  F:    include/media/cec.h
  F:    include/media/cec-edid.h
 -F:    include/linux/cec.h
 -F:    include/linux/cec-funcs.h
 +F:    include/uapi/linux/cec.h
 +F:    include/uapi/linux/cec-funcs.h
  
  CELL BROADBAND ENGINE ARCHITECTURE
  M:    Arnd Bergmann <arnd@arndb.de>
@@@ -3076,12 -3037,6 +3076,12 @@@ F:    drivers/usb/host/whci
  F:    drivers/usb/wusbcore/
  F:    include/linux/usb/wusb*
  
 +HT16K33 LED CONTROLLER DRIVER
 +M:    Robin van der Gracht <robin@protonic.nl>
 +S:    Maintained
 +F:    drivers/auxdisplay/ht16k33.c
 +F:    Documentation/devicetree/bindings/display/ht16k33.txt
 +
  CFAG12864B LCD DRIVER
  M:    Miguel Ojeda Sandonis <miguel.ojeda.sandonis@gmail.com>
  W:    http://miguelojeda.es/auxdisplay.htm
@@@ -3201,15 -3156,15 +3201,15 @@@ S:   Supporte
  F:    drivers/clocksource
  
  CISCO FCOE HBA DRIVER
 -M:    Hiral Patel <hiralpat@cisco.com>
 -M:    Suma Ramars <sramars@cisco.com>
 -M:    Brian Uchino <buchino@cisco.com>
 +M:    Satish Kharat <satishkh@cisco.com>
 +M:    Sesidhar Baddela <sebaddel@cisco.com>
 +M:    Karan Tilak Kumar <kartilak@cisco.com>
  L:    linux-scsi@vger.kernel.org
  S:    Supported
  F:    drivers/scsi/fnic/
  
  CISCO SCSI HBA DRIVER
 -M:    Narsimhulu Musini <nmusini@cisco.com>
 +M:    Karan Tilak Kumar <kartilak@cisco.com>
  M:    Sesidhar Baddela <sebaddel@cisco.com>
  L:    linux-scsi@vger.kernel.org
  S:    Supported
@@@ -3386,7 -3341,6 +3386,7 @@@ L:      linux-pm@vger.kernel.or
  S:    Maintained
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm.git
  T:    git git://git.linaro.org/people/vireshk/linux.git (For ARM Updates)
 +B:    https://bugzilla.kernel.org
  F:    Documentation/cpu-freq/
  F:    drivers/cpufreq/
  F:    include/linux/cpufreq.h
@@@ -3426,7 -3380,6 +3426,7 @@@ M:      Daniel Lezcano <daniel.lezcano@linar
  L:    linux-pm@vger.kernel.org
  S:    Maintained
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm.git
 +B:    https://bugzilla.kernel.org
  F:    drivers/cpuidle/*
  F:    include/linux/cpuidle.h
  
@@@ -3472,7 -3425,6 +3472,7 @@@ F:      arch/*/crypto
  F:    crypto/
  F:    drivers/crypto/
  F:    include/crypto/
 +F:    include/linux/crypto*
  
  CRYPTOGRAPHIC RANDOM NUMBER GENERATOR
  M:    Neil Horman <nhorman@tuxdriver.com>
@@@ -3965,7 -3917,7 +3965,7 @@@ F:      drivers/dma-buf
  F:    include/linux/dma-buf*
  F:    include/linux/reservation.h
  F:    include/linux/*fence.h
- F:    Documentation/dma-buf-sharing.txt
+ F:    Documentation/driver-api/dma-buf.rst
  T:    git git://anongit.freedesktop.org/drm/drm-misc
  
  SYNC FILE FRAMEWORK
@@@ -4067,8 -4019,6 +4067,8 @@@ DRM DRIVER
  M:    David Airlie <airlied@linux.ie>
  L:    dri-devel@lists.freedesktop.org
  T:    git git://people.freedesktop.org/~airlied/linux
 +B:    https://bugs.freedesktop.org/
 +C:    irc://chat.freenode.net/dri-devel
  S:    Maintained
  F:    drivers/gpu/drm/
  F:    drivers/gpu/vga/
@@@ -4139,8 -4089,6 +4139,8 @@@ M:      Daniel Vetter <daniel.vetter@intel.c
  M:    Jani Nikula <jani.nikula@linux.intel.com>
  L:    intel-gfx@lists.freedesktop.org
  W:    https://01.org/linuxgraphics/
 +B:    https://01.org/linuxgraphics/documentation/how-report-bugs
 +C:    irc://chat.freenode.net/intel-gfx
  Q:    http://patchwork.freedesktop.org/project/intel-gfx/
  T:    git git://anongit.freedesktop.org/drm-intel
  S:    Supported
@@@ -4588,8 -4536,7 +4588,8 @@@ L:      linux-edac@vger.kernel.or
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/bp/bp.git for-next
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-edac.git linux_next
  S:    Supported
 -F:    Documentation/edac.txt
 +F:    Documentation/admin-guide/ras.rst
 +F:    Documentation/driver-api/edac.rst
  F:    drivers/edac/
  F:    include/linux/edac.h
  
@@@ -4739,14 -4686,12 +4739,14 @@@ L:   linux-efi@vger.kernel.or
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/efi/efi.git
  S:    Maintained
  F:    Documentation/efi-stub.txt
 -F:    arch/ia64/kernel/efi.c
 +F:    arch/*/kernel/efi.c
  F:    arch/x86/boot/compressed/eboot.[ch]
 -F:    arch/x86/include/asm/efi.h
 +F:    arch/*/include/asm/efi.h
  F:    arch/x86/platform/efi/
  F:    drivers/firmware/efi/
  F:    include/linux/efi*.h
 +F:    arch/arm/boot/compressed/efi-header.S
 +F:    arch/arm64/kernel/efi-entry.S
  
  EFI VARIABLE FILESYSTEM
  M:    Matthew Garrett <matthew.garrett@nebula.com>
@@@ -4798,11 -4743,11 +4798,11 @@@ M:   David Woodhouse <dwmw2@infradead.org
  L:    linux-embedded@vger.kernel.org
  S:    Maintained
  
 -EMULEX/AVAGO LPFC FC/FCOE SCSI DRIVER
 -M:    James Smart <james.smart@avagotech.com>
 -M:    Dick Kennedy <dick.kennedy@avagotech.com>
 +EMULEX/BROADCOM LPFC FC/FCOE SCSI DRIVER
 +M:    James Smart <james.smart@broadcom.com>
 +M:    Dick Kennedy <dick.kennedy@broadcom.com>
  L:    linux-scsi@vger.kernel.org
 -W:    http://www.avagotech.com
 +W:    http://www.broadcom.com
  S:    Supported
  F:    drivers/scsi/lpfc/
  
@@@ -5060,9 -5005,7 +5060,9 @@@ K:      fmc_d.*registe
  FPGA MANAGER FRAMEWORK
  M:    Alan Tull <atull@opensource.altera.com>
  R:    Moritz Fischer <moritz.fischer@ettus.com>
 +L:    linux-fpga@vger.kernel.org
  S:    Maintained
 +T:    git git://git.kernel.org/pub/scm/linux/kernel/git/atull/linux-fpga.git
  F:    drivers/fpga/
  F:    include/linux/fpga/fpga-mgr.h
  W:    http://www.rocketboards.org
@@@ -5080,9 -5023,10 +5080,9 @@@ F:     drivers/net/wan/dlci.
  F:    drivers/net/wan/sdla.c
  
  FRAMEBUFFER LAYER
 -M:    Tomi Valkeinen <tomi.valkeinen@ti.com>
  L:    linux-fbdev@vger.kernel.org
  Q:    http://patchwork.kernel.org/project/linux-fbdev/list/
 -S:    Maintained
 +S:    Orphan
  F:    Documentation/fb/
  F:    drivers/video/
  F:    include/video/
@@@ -5090,14 -5034,6 +5090,14 @@@ F:    include/linux/fb.
  F:    include/uapi/video/
  F:    include/uapi/linux/fb.h
  
 +FREESCALE CAAM (Cryptographic Acceleration and Assurance Module) DRIVER
 +M:    Horia Geantă <horia.geanta@nxp.com>
 +M:    Dan Douglass <dan.douglass@nxp.com>
 +L:    linux-crypto@vger.kernel.org
 +S:    Maintained
 +F:    drivers/crypto/caam/
 +F:    Documentation/devicetree/bindings/crypto/fsl-sec4.txt
 +
  FREESCALE DIU FRAMEBUFFER DRIVER
  M:    Timur Tabi <timur@tabi.org>
  L:    linux-fbdev@vger.kernel.org
@@@ -5163,24 -5099,9 +5163,24 @@@ S:    Maintaine
  F:    drivers/net/ethernet/freescale/fman
  F:    Documentation/devicetree/bindings/powerpc/fsl/fman.txt
  
 +FREESCALE QORIQ DPAA ETHERNET DRIVER
 +M:    Madalin Bucur <madalin.bucur@nxp.com>
 +L:    netdev@vger.kernel.org
 +S:    Maintained
 +F:    drivers/net/ethernet/freescale/dpaa
 +
 +FREESCALE SOC DRIVERS
 +M:    Scott Wood <oss@buserror.net>
 +L:    linuxppc-dev@lists.ozlabs.org
 +L:    linux-arm-kernel@lists.infradead.org
 +S:    Maintained
 +F:    drivers/soc/fsl/
 +F:    include/linux/fsl/
 +
  FREESCALE QUICC ENGINE LIBRARY
 +M:    Qiang Zhao <qiang.zhao@nxp.com>
  L:    linuxppc-dev@lists.ozlabs.org
 -S:    Orphan
 +S:    Maintained
  F:    drivers/soc/fsl/qe/
  F:    include/soc/fsl/*qe*.h
  F:    include/soc/fsl/*ucc*.h
@@@ -5232,6 -5153,13 +5232,6 @@@ F:     sound/soc/fsl/fsl
  F:    sound/soc/fsl/imx*
  F:    sound/soc/fsl/mpc8610_hpcd.c
  
 -FREESCALE QORIQ MANAGEMENT COMPLEX DRIVER
 -M:    "J. German Rivera" <German.Rivera@freescale.com>
 -M:    Stuart Yoder <stuart.yoder@nxp.com>
 -L:    linux-kernel@vger.kernel.org
 -S:    Maintained
 -F:    drivers/staging/fsl-mc/
 -
  FREEVXFS FILESYSTEM
  M:    Christoph Hellwig <hch@infradead.org>
  W:    ftp://ftp.openlinux.org/pub/people/hch/vxfs
@@@ -5265,7 -5193,6 +5265,7 @@@ F:      include/linux/fscache*.
  FS-CRYPTO: FILE SYSTEM LEVEL ENCRYPTION SUPPORT
  M:    Theodore Y. Ts'o <tytso@mit.edu>
  M:    Jaegeuk Kim <jaegeuk@kernel.org>
 +L:    linux-fsdevel@vger.kernel.org
  S:    Supported
  F:    fs/crypto/
  F:    include/linux/fscrypto.h
@@@ -5330,7 -5257,6 +5330,7 @@@ L:      kernel-hardening@lists.openwall.co
  S:    Maintained
  F:    scripts/gcc-plugins/
  F:    scripts/gcc-plugin.sh
 +F:    scripts/Makefile.gcc-plugins
  F:    Documentation/gcc-plugins.txt
  
  GCOV BASED KERNEL PROFILING
@@@ -5735,13 -5661,14 +5735,13 @@@ S:   Maintaine
  F:    drivers/media/dvb-frontends/hd29l2*
  
  HEWLETT PACKARD ENTERPRISE ILO NMI WATCHDOG DRIVER
 -M:    Brian Boylston <brian.boylston@hpe.com>
 +M:    Jimmy Vance <jimmy.vance@hpe.com>
  S:    Supported
  F:    Documentation/watchdog/hpwdt.txt
  F:    drivers/watchdog/hpwdt.c
  
  HEWLETT-PACKARD SMART ARRAY RAID DRIVER (hpsa)
  M:    Don Brace <don.brace@microsemi.com>
 -L:    iss_storagedev@hp.com
  L:    esc.storagedev@microsemi.com
  L:    linux-scsi@vger.kernel.org
  S:    Supported
@@@ -5752,6 -5679,7 +5752,6 @@@ F:      include/uapi/linux/cciss*.
  
  HEWLETT-PACKARD SMART CISS RAID DRIVER (cciss)
  M:    Don Brace <don.brace@microsemi.com>
 -L:    iss_storagedev@hp.com
  L:    esc.storagedev@microsemi.com
  L:    linux-scsi@vger.kernel.org
  S:    Supported
@@@ -5972,7 -5900,6 +5972,7 @@@ F:      drivers/input/serio/hyperv-keyboard.
  F:    drivers/pci/host/pci-hyperv.c
  F:    drivers/net/hyperv/
  F:    drivers/scsi/storvsc_drv.c
 +F:    drivers/uio/uio_hv_generic.c
  F:    drivers/video/fbdev/hyperv_fb.c
  F:    include/linux/hyperv.h
  F:    tools/hv/
@@@ -6216,9 -6143,14 +6216,9 @@@ S:     Maintaine
  F:    Documentation/cdrom/ide-cd
  F:    drivers/ide/ide-cd*
  
 -IDLE-I7300
 -M:    Andy Henroid <andrew.d.henroid@intel.com>
 -L:    linux-pm@vger.kernel.org
 -S:    Supported
 -F:    drivers/idle/i7300_idle.c
 -
  IEEE 802.15.4 SUBSYSTEM
  M:    Alexander Aring <aar@pengutronix.de>
 +M:    Stefan Schmidt <stefan@osg.samsung.com>
  L:    linux-wpan@vger.kernel.org
  W:    http://wpan.cakelab.org/
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/bluetooth/bluetooth.git
@@@ -6248,22 -6180,6 +6248,22 @@@ L:    linux-media@vger.kernel.or
  S:    Maintained
  F:    drivers/media/rc/iguanair.c
  
 +IIO DIGITAL POTENTIOMETER DAC
 +M:    Peter Rosin <peda@axentia.se>
 +L:    linux-iio@vger.kernel.org
 +S:    Maintained
 +F:    Documentation/ABI/testing/sysfs-bus-iio-dac-dpot-dac
 +F:    Documentation/devicetree/bindings/iio/dac/dpot-dac.txt
 +F:    drivers/iio/dac/dpot-dac.c
 +
 +IIO ENVELOPE DETECTOR
 +M:    Peter Rosin <peda@axentia.se>
 +L:    linux-iio@vger.kernel.org
 +S:    Maintained
 +F:    Documentation/ABI/testing/sysfs-bus-iio-adc-envelope-detector
 +F:    Documentation/devicetree/bindings/iio/adc/envelope-detector.txt
 +F:    drivers/iio/adc/envelope-detector.c
 +
  IIO SUBSYSTEM AND DRIVERS
  M:    Jonathan Cameron <jic23@kernel.org>
  R:    Hartmut Knaack <knaack.h@gmx.de>
@@@ -6421,11 -6337,9 +6421,11 @@@ S:    Maintaine
  F:    drivers/platform/x86/intel-vbtn.c
  
  INTEL IDLE DRIVER
 +M:    Jacob Pan <jacob.jun.pan@linux.intel.com>
  M:    Len Brown <lenb@kernel.org>
  L:    linux-pm@vger.kernel.org
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/lenb/linux.git
 +B:    https://bugzilla.kernel.org
  S:    Supported
  F:    drivers/idle/intel_idle.c
  
@@@ -6523,7 -6437,10 +6523,7 @@@ F:     drivers/net/ethernet/intel/*
  
  INTEL RDMA RNIC DRIVER
  M:     Faisal Latif <faisal.latif@intel.com>
 -R:     Chien Tin Tung <chien.tin.tung@intel.com>
 -R:     Mustafa Ismail <mustafa.ismail@intel.com>
 -R:     Shiraz Saleem <shiraz.saleem@intel.com>
 -R:     Tatyana Nikolova <tatyana.e.nikolova@intel.com>
 +M:     Shiraz Saleem <shiraz.saleem@intel.com>
  L:     linux-rdma@vger.kernel.org
  S:     Supported
  F:     drivers/infiniband/hw/i40iw/
@@@ -6642,13 -6559,6 +6642,13 @@@ S:    Maintaine
  F:    arch/x86/include/asm/pmc_core.h
  F:    drivers/platform/x86/intel_pmc_core*
  
 +INVENSENSE MPU-3050 GYROSCOPE DRIVER
 +M:    Linus Walleij <linus.walleij@linaro.org>
 +L:    linux-iio@vger.kernel.org
 +S:    Maintained
 +F:    drivers/iio/gyro/mpu3050*
 +F:    Documentation/devicetree/bindings/iio/gyroscope/inv,mpu3050.txt
 +
  IOC3 ETHERNET DRIVER
  M:    Ralf Baechle <ralf@linux-mips.org>
  L:    linux-mips@linux-mips.org
@@@ -7229,7 -7139,7 +7229,7 @@@ F:      drivers/scsi/53c700
  
  LED SUBSYSTEM
  M:    Richard Purdie <rpurdie@rpsys.net>
 -M:    Jacek Anaszewski <j.anaszewski@samsung.com>
 +M:    Jacek Anaszewski <jacek.anaszewski@gmail.com>
  M:    Pavel Machek <pavel@ucw.cz>
  L:    linux-leds@vger.kernel.org
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/j.anaszewski/linux-leds.git
@@@ -7570,6 -7480,14 +7570,6 @@@ S:     Maintaine
  F:    Documentation/ldm.txt
  F:    block/partitions/ldm.*
  
 -LogFS
 -M:    Joern Engel <joern@logfs.org>
 -M:    Prasad Joshi <prasadjoshi.linux@gmail.com>
 -L:    logfs@logfs.org
 -W:    logfs.org
 -S:    Maintained
 -F:    fs/logfs/
 -
  LSILOGIC MPT FUSION DRIVERS (FC/SAS/SPI)
  M:    Sathya Prakash <sathya.prakash@broadcom.com>
  M:    Chaitra P B <chaitra.basappa@broadcom.com>
@@@ -7695,10 -7613,8 +7695,10 @@@ S:    Maintaine
  MARVELL 88E6XXX ETHERNET SWITCH FABRIC DRIVER
  M:    Andrew Lunn <andrew@lunn.ch>
  M:    Vivien Didelot <vivien.didelot@savoirfairelinux.com>
 +L:    netdev@vger.kernel.org
  S:    Maintained
  F:    drivers/net/dsa/mv88e6xxx/
 +F:    Documentation/devicetree/bindings/net/dsa/marvell.txt
  
  MARVELL ARMADA DRM SUPPORT
  M:    Russell King <rmk+kernel@armlinux.org.uk>
@@@ -7848,7 -7764,6 +7848,7 @@@ MCP4531 MICROCHIP DIGITAL POTENTIOMETE
  M:    Peter Rosin <peda@axentia.se>
  L:    linux-iio@vger.kernel.org
  S:    Maintained
 +F:    Documentation/ABI/testing/sysfs-bus-iio-potentiometer-mcp4531
  F:    drivers/iio/potentiometer/mcp4531.c
  
  MEASUREMENT COMPUTING CIO-DAC IIO DRIVER
@@@ -7867,15 -7782,6 +7867,15 @@@ F:    Documentation/devicetree/bindings/me
  F:    drivers/media/platform/rcar-fcp.c
  F:    include/media/rcar-fcp.h
  
 +MEDIA DRIVERS FOR RENESAS - FDP1
 +M:    Kieran Bingham <kieran@bingham.xyz>
 +L:    linux-media@vger.kernel.org
 +L:    linux-renesas-soc@vger.kernel.org
 +T:    git git://linuxtv.org/media_tree.git
 +S:    Supported
 +F:    Documentation/devicetree/bindings/media/renesas,fdp1.txt
 +F:    drivers/media/platform/rcar_fdp1.c
 +
  MEDIA DRIVERS FOR RENESAS - VIN
  M:    Niklas Söderlund <niklas.soderlund@ragnatech.se>
  L:    linux-media@vger.kernel.org
@@@ -7982,24 -7888,6 +7982,24 @@@ L:    netdev@vger.kernel.or
  S:    Maintained
  F:    drivers/net/ethernet/mediatek/
  
 +MEDIATEK MEDIA DRIVER
 +M:    Tiffany Lin <tiffany.lin@mediatek.com>
 +M:    Andrew-CT Chen <andrew-ct.chen@mediatek.com>
 +S:    Supported
 +F:    drivers/media/platform/mtk-vcodec/
 +F:    drivers/media/platform/mtk-vpu/
 +F:    Documentation/devicetree/bindings/media/mediatek-vcodec.txt
 +F:    Documentation/devicetree/bindings/media/mediatek-vpu.txt
 +
 +MEDIATEK MDP DRIVER
 +M:    Minghsiu Tsai <minghsiu.tsai@mediatek.com>
 +M:    Houlong Wei <houlong.wei@mediatek.com>
 +M:    Andrew-CT Chen <andrew-ct.chen@mediatek.com>
 +S:    Supported
 +F:    drivers/media/platform/mtk-mdp/
 +F:    drivers/media/platform/mtk-vpu/
 +F:    Documentation/devicetree/bindings/media/mediatek-mdp.txt
 +
  MEDIATEK MT7601U WIRELESS LAN DRIVER
  M:    Jakub Kicinski <kubakici@wp.pl>
  L:    linux-wireless@vger.kernel.org
@@@ -8007,12 -7895,12 +8007,12 @@@ S:   Maintaine
  F:    drivers/net/wireless/mediatek/mt7601u/
  
  MEGARAID SCSI/SAS DRIVERS
 -M:    Kashyap Desai <kashyap.desai@avagotech.com>
 -M:    Sumit Saxena <sumit.saxena@avagotech.com>
 -M:    Uday Lingala <uday.lingala@avagotech.com>
 -L:    megaraidlinux.pdl@avagotech.com
 +M:    Kashyap Desai <kashyap.desai@broadcom.com>
 +M:    Sumit Saxena <sumit.saxena@broadcom.com>
 +M:    Shivasharan S <shivasharan.srikanteshwara@broadcom.com>
 +L:    megaraidlinux.pdl@broadcom.com
  L:    linux-scsi@vger.kernel.org
 -W:    http://www.lsi.com
 +W:    http://www.avagotech.com/support/
  S:    Maintained
  F:    Documentation/scsi/megaraid.txt
  F:    drivers/scsi/megaraid.*
@@@ -8050,15 -7938,6 +8050,15 @@@ W:    http://www.mellanox.co
  Q:    http://patchwork.ozlabs.org/project/netdev/list/
  F:    drivers/net/ethernet/mellanox/mlxsw/
  
 +MELLANOX MLXCPLD I2C AND MUX DRIVER
 +M:    Vadim Pasternak <vadimp@mellanox.com>
 +M:    Michael Shych <michaelsh@mellanox.com>
 +L:    linux-i2c@vger.kernel.org
 +S:    Supported
 +F:    drivers/i2c/busses/i2c-mlxcpld.c
 +F:    drivers/i2c/muxes/i2c-mux-mlxcpld.c
 +F:    Documentation/i2c/busses/i2c-mlxcpld
 +
  MELLANOX MLXCPLD LED DRIVER
  M:    Vadim Pasternak <vadimp@mellanox.com>
  L:    linux-leds@vger.kernel.org
@@@ -8070,14 -7949,7 +8070,14 @@@ MELLANOX PLATFORM DRIVE
  M:      Vadim Pasternak <vadimp@mellanox.com>
  L:      platform-driver-x86@vger.kernel.org
  S:      Supported
 -F:      arch/x86/platform/mellanox/mlx-platform.c
 +F:      drivers/platform/x86/mlx-platform.c
 +
 +MELLANOX MLX CPLD HOTPLUG DRIVER
 +M:    Vadim Pasternak <vadimp@mellanox.com>
 +L:    platform-driver-x86@vger.kernel.org
 +S:    Supported
 +F:    drivers/platform/x86/mlxcpld-hotplug.c
 +F:    include/linux/platform_data/mlxcpld-hotplug.h
  
  SOFT-ROCE DRIVER (rxe)
  M:    Moni Shoua <monis@mellanox.com>
@@@ -8508,6 -8380,7 +8508,6 @@@ F:      drivers/scsi/arm/oak.
  F:    drivers/scsi/atari_scsi.*
  F:    drivers/scsi/dmx3191d.c
  F:    drivers/scsi/g_NCR5380.*
 -F:    drivers/scsi/g_NCR5380_mmio.c
  F:    drivers/scsi/mac_scsi.*
  F:    drivers/scsi/sun3_scsi.*
  F:    drivers/scsi/sun3_scsi_vme.c
@@@ -8638,6 -8511,7 +8638,6 @@@ F:      include/uapi/linux/net_namespace.
  F:    tools/net/
  F:    tools/testing/selftests/net/
  F:    lib/random32.c
 -F:    lib/test_bpf.c
  
  NETWORKING [IPv4/IPv6]
  M:    "David S. Miller" <davem@davemloft.net>
@@@ -8828,7 -8702,7 +8828,7 @@@ T:      git git://github.com/jonmason/ntb.gi
  F:    drivers/ntb/hw/intel/
  
  NTB AMD DRIVER
 -M:    Xiangliang Yu <Xiangliang.Yu@amd.com>
 +M:    Shyam Sundar S K <Shyam-sundar.S-k@amd.com>
  L:    linux-ntb@googlegroups.com
  S:    Supported
  F:    drivers/ntb/hw/amd/
@@@ -8866,16 -8740,6 +8866,16 @@@ L:    linux-nvme@lists.infradead.or
  S:    Supported
  F:    drivers/nvme/target/
  
 +NVM EXPRESS FC TRANSPORT DRIVERS
 +M:    James Smart <james.smart@broadcom.com>
 +L:    linux-nvme@lists.infradead.org
 +S:    Supported
 +F:    include/linux/nvme-fc.h
 +F:    include/linux/nvme-fc-driver.h
 +F:    drivers/nvme/host/fc.c
 +F:    drivers/nvme/target/fc.c
 +F:    drivers/nvme/target/fcloop.c
 +
  NVMEM FRAMEWORK
  M:    Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
  M:    Maxime Ripard <maxime.ripard@free-electrons.com>
@@@ -8938,7 -8802,6 +8938,7 @@@ F:      drivers/regulator/tps65217-regulator
  F:    drivers/regulator/tps65218-regulator.c
  F:    drivers/regulator/tps65910-regulator.c
  F:    drivers/regulator/twl-regulator.c
 +F:    drivers/regulator/twl6030-regulator.c
  F:    include/linux/i2c-omap.h
  
  OMAP DEVICE TREE SUPPORT
@@@ -9159,11 -9022,9 +9159,11 @@@ F:    drivers/of/resolver.
  
  OPENRISC ARCHITECTURE
  M:    Jonas Bonn <jonas@southpole.se>
 -W:    http://openrisc.net
 +M:    Stefan Kristiansson <stefan.kristiansson@saunalahti.fi>
 +M:    Stafford Horne <shorne@gmail.com>
 +L:    openrisc@lists.librecores.org
 +W:    http://openrisc.io
  S:    Maintained
 -T:    git git://openrisc.net/~jonas/linux
  F:    arch/openrisc/
  
  OPENVSWITCH
@@@ -9295,7 -9156,7 +9295,7 @@@ F:      drivers/misc/panel.
  
  PARALLEL PORT SUBSYSTEM
  M:    Sudip Mukherjee <sudipm.mukherjee@gmail.com>
 -M:    Sudip Mukherjee <sudip@vectorindia.org>
 +M:    Sudip Mukherjee <sudip.mukherjee@codethink.co.uk>
  L:    linux-parport@lists.infradead.org (subscribers-only)
  S:    Maintained
  F:    drivers/parport/
@@@ -9766,8 -9627,8 +9766,8 @@@ F:      arch/mips/boot/dts/pistachio
  F:      arch/mips/configs/pistachio*_defconfig
  
  PKTCDVD DRIVER
 -M:    Jiri Kosina <jikos@kernel.org>
 -S:    Maintained
 +S:    Orphan
 +M:    linux-block@vger.kernel.org
  F:    drivers/block/pktcdvd.c
  F:    include/linux/pktcdvd.h
  F:    include/uapi/linux/pktcdvd.h
@@@ -9981,7 -9842,7 +9981,7 @@@ M:      Hans Verkuil <hverkuil@xs4all.nl
  L:    linux-media@vger.kernel.org
  T:    git git://linuxtv.org/media_tree.git
  S:    Maintained
 -F:    drivers/staging/media/pulse8-cec
 +F:    drivers/media/usb/pulse8-cec/*
  
  PVRUSB2 VIDEO4LINUX DRIVER
  M:    Mike Isely <isely@pobox.com>
@@@ -10002,7 -9863,7 +10002,7 @@@ F:    drivers/media/usb/pwc/
  
  PWM FAN DRIVER
  M:    Kamil Debski <kamil@wypas.org>
 -M:    Lukasz Majewski <l.majewski@samsung.com>
 +M:    Bartlomiej Zolnierkiewicz <b.zolnierkie@samsung.com>
  L:    linux-hwmon@vger.kernel.org
  S:    Supported
  F:    Documentation/devicetree/bindings/hwmon/pwm-fan.txt
@@@ -10136,12 -9997,6 +10136,12 @@@ F:  drivers/net/ethernet/qlogic/qed
  F:    include/linux/qed/
  F:    drivers/net/ethernet/qlogic/qede/
  
 +QLOGIC QL41xxx ISCSI DRIVER
 +M:    QLogic-Storage-Upstream@cavium.com
 +L:    linux-scsi@vger.kernel.org
 +S:    Supported
 +F:    drivers/scsi/qedi/
 +
  QNX4 FILESYSTEM
  M:    Anders Larsen <al@alarsen.net>
  W:    http://www.alarsen.net/linux/qnx4fs/
@@@ -10150,12 -10005,6 +10150,12 @@@ F: fs/qnx4
  F:    include/uapi/linux/qnx4_fs.h
  F:    include/uapi/linux/qnxtypes.h
  
 +QORIQ DPAA2 FSL-MC BUS DRIVER
 +M:    Stuart Yoder <stuart.yoder@nxp.com>
 +L:    linux-kernel@vger.kernel.org
 +S:    Maintained
 +F:    drivers/staging/fsl-mc/
 +
  QT1010 MEDIA DRIVER
  M:    Antti Palosaari <crope@iki.fi>
  L:    linux-media@vger.kernel.org
@@@ -10333,14 -10182,6 +10333,14 @@@ L: linux-rdma@vger.kernel.or
  S:    Supported
  F:    drivers/infiniband/sw/rdmavt
  
 +RDT - RESOURCE ALLOCATION
 +M:    Fenghua Yu <fenghua.yu@intel.com>
 +L:    linux-kernel@vger.kernel.org
 +S:    Supported
 +F:    arch/x86/kernel/cpu/intel_rdt*
 +F:    arch/x86/include/asm/intel_rdt*
 +F:    Documentation/x86/intel_rdt*
 +
  READ-COPY UPDATE (RCU)
  M:    "Paul E. McKenney" <paulmck@linux.vnet.ibm.com>
  M:    Josh Triplett <josh@joshtriplett.org>
@@@ -10626,7 -10467,7 +10626,7 @@@ F:   arch/s390/pci
  F:    drivers/pci/hotplug/s390_pci_hpc.c
  
  S390 ZCRYPT DRIVER
 -M:    Ingo Tuchscherer <ingo.tuchscherer@de.ibm.com>
 +M:    Harald Freudenberger <freude@de.ibm.com>
  L:    linux-s390@vger.kernel.org
  W:    http://www.ibm.com/developerworks/linux/linux390/
  S:    Supported
@@@ -10793,7 -10634,7 +10793,7 @@@ L:   netdev@vger.kernel.or
  F:    drivers/net/ethernet/samsung/sxgbe/
  
  SAMSUNG THERMAL DRIVER
 -M:    Lukasz Majewski <l.majewski@samsung.com>
 +M:    Bartlomiej Zolnierkiewicz <b.zolnierkie@samsung.com>
  L:    linux-pm@vger.kernel.org
  L:    linux-samsung-soc@vger.kernel.org
  S:    Supported
@@@ -10821,12 -10662,6 +10821,12 @@@ S: Maintaine
  F:    Documentation/devicetree/bindings/serial/
  F:    drivers/tty/serial/
  
 +SERIAL IR RECEIVER
 +M:    Sean Young <sean@mess.org>
 +L:    linux-media@vger.kernel.org
 +S:    Maintained
 +F:    drivers/media/rc/serial_ir.c
 +
  STI CEC DRIVER
  M:    Benjamin Gaignard <benjamin.gaignard@linaro.org>
  L:    kernel@stlinux.com
@@@ -10925,11 -10760,6 +10925,11 @@@ W: http://www.sunplus.co
  S:    Supported
  F:    arch/score/
  
 +SCR24X CHIP CARD INTERFACE DRIVER
 +M:    Lubomir Rintel <lkundrak@v3.sk>
 +S:    Supported
 +F:    drivers/char/pcmcia/scr24x_cs.c
 +
  SYSTEM CONTROL & POWER INTERFACE (SCPI) Message Protocol drivers
  M:    Sudeep Holla <sudeep.holla@arm.com>
  L:    linux-arm-kernel@lists.infradead.org
@@@ -11138,6 -10968,7 +11138,6 @@@ F:   drivers/net/ethernet/emulex/benet
  EMULEX ONECONNECT ROCE DRIVER
  M:    Selvin Xavier <selvin.xavier@avagotech.com>
  M:    Devesh Sharma <devesh.sharma@avagotech.com>
 -M:    Mitesh Ahuja <mitesh.ahuja@avagotech.com>
  L:    linux-rdma@vger.kernel.org
  W:    http://www.emulex.com
  S:    Supported
@@@ -11332,7 -11163,7 +11332,7 @@@ F:   include/media/i2c/ov2659.
  SILICON MOTION SM712 FRAME BUFFER DRIVER
  M:    Sudip Mukherjee <sudipm.mukherjee@gmail.com>
  M:    Teddy Wang <teddy.wang@siliconmotion.com>
 -M:    Sudip Mukherjee <sudip@vectorindia.org>
 +M:    Sudip Mukherjee <sudip.mukherjee@codethink.co.uk>
  L:    linux-fbdev@vger.kernel.org
  S:    Maintained
  F:    drivers/video/fbdev/sm712*
@@@ -11760,11 -11591,17 +11760,11 @@@ F:        drivers/staging/rtl8712
  STAGING - SILICON MOTION SM750 FRAME BUFFER DRIVER
  M:    Sudip Mukherjee <sudipm.mukherjee@gmail.com>
  M:    Teddy Wang <teddy.wang@siliconmotion.com>
 -M:    Sudip Mukherjee <sudip@vectorindia.org>
 +M:    Sudip Mukherjee <sudip.mukherjee@codethink.co.uk>
  L:    linux-fbdev@vger.kernel.org
  S:    Maintained
  F:    drivers/staging/sm750fb/
  
 -STAGING - SLICOSS
 -M:    Lior Dotan <liodot@gmail.com>
 -M:    Christopher Harrer <charrer@alacritech.com>
 -S:    Odd Fixes
 -F:    drivers/staging/slicoss/
 -
  STAGING - SPEAKUP CONSOLE SPEECH DRIVER
  M:    William Hubbs <w.d.hubbs@gmail.com>
  M:    Chris Brannon <chris@the-brannons.com>
@@@ -11874,7 -11711,6 +11874,7 @@@ S:   Supporte
  F:    arch/arc/
  F:    Documentation/devicetree/bindings/arc/*
  F:    Documentation/devicetree/bindings/interrupt-controller/snps,arc*
 +F:    drivers/clocksource/arc_timer.c
  F:    drivers/tty/serial/arc_uart.c
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/vgupta/arc.git
  
@@@ -12135,16 -11971,6 +12135,16 @@@ S: Maintaine
  F:    arch/xtensa/
  F:    drivers/irqchip/irq-xtensa-*
  
 +Texas Instruments' System Control Interface (TISCI) Protocol Driver
 +M:    Nishanth Menon <nm@ti.com>
 +M:    Tero Kristo <t-kristo@ti.com>
 +M:    Santosh Shilimkar <ssantosh@kernel.org>
 +L:    linux-arm-kernel@lists.infradead.org
 +S:    Maintained
 +F:    Documentation/devicetree/bindings/arm/keystone/ti,sci.txt
 +F:    drivers/firmware/ti_sci*
 +F:    include/linux/soc/ti/ti_sci_protocol.h
 +
  THANKO'S RAREMONO AM/FM/SW RADIO RECEIVER USB DRIVER
  M:    Hans Verkuil <hverkuil@xs4all.nl>
  L:    linux-media@vger.kernel.org
@@@ -12575,12 -12401,6 +12575,12 @@@ S: Maintaine
  F:    Documentation/filesystems/udf.txt
  F:    fs/udf/
  
 +UDRAW TABLET
 +M:    Bastien Nocera <hadess@hadess.net>
 +L:    linux-input@vger.kernel.org
 +S:    Maintained
 +F:    drivers/hid/hid-udraw.c
 +
  UFS FILESYSTEM
  M:    Evgeniy Dushistov <dushistov@mail.ru>
  S:    Maintained
@@@ -12637,8 -12457,7 +12637,8 @@@ F:   Documentation/scsi/ufs.tx
  F:    drivers/scsi/ufs/
  
  UNIVERSAL FLASH STORAGE HOST CONTROLLER DRIVER DWC HOOKS
 -M:    Joao Pinto <Joao.Pinto@synopsys.com>
 +M:    Manjunath M Bettegowda <manjumb@synopsys.com>
 +M:    Prabu Thangamuthu <prabut@synopsys.com>
  L:    linux-scsi@vger.kernel.org
  S:    Supported
  F:    drivers/scsi/ufs/*dwc*
@@@ -12996,15 -12815,6 +12996,15 @@@ F: drivers/vfio
  F:    include/linux/vfio.h
  F:    include/uapi/linux/vfio.h
  
 +VFIO MEDIATED DEVICE DRIVERS
 +M:    Kirti Wankhede <kwankhede@nvidia.com>
 +L:    kvm@vger.kernel.org
 +S:    Maintained
 +F:    Documentation/vfio-mediated-device.txt
 +F:    drivers/vfio/mdev/
 +F:    include/linux/mdev.h
 +F:    samples/vfio-mdev/
 +
  VFIO PLATFORM DRIVER
  M:    Baptiste Reynal <b.reynal@virtualopensystems.com>
  L:    kvm@vger.kernel.org
@@@ -13059,7 -12869,6 +13059,7 @@@ F:   drivers/net/virtio_net.
  F:    drivers/block/virtio_blk.c
  F:    include/linux/virtio_*.h
  F:    include/uapi/linux/virtio_*.h
 +F:    drivers/crypto/virtio/
  
  VIRTIO DRIVERS FOR S390
  M:    Christian Borntraeger <borntraeger@de.ibm.com>
@@@ -13096,14 -12905,6 +13096,14 @@@ S: Maintaine
  F:    drivers/virtio/virtio_input.c
  F:    include/uapi/linux/virtio_input.h
  
 +VIRTIO CRYPTO DRIVER
 +M:  Gonglei <arei.gonglei@huawei.com>
 +L:  virtualization@lists.linux-foundation.org
 +L:  linux-crypto@vger.kernel.org
 +S:  Maintained
 +F:  drivers/crypto/virtio/
 +F:  include/uapi/linux/virtio_crypto.h
 +
  VIA RHINE NETWORK DRIVER
  S:    Orphan
  F:    drivers/net/ethernet/via/via-rhine.c
@@@ -13208,13 -13009,6 +13208,13 @@@ S: Maintaine
  F:    drivers/scsi/vmw_pvscsi.c
  F:    drivers/scsi/vmw_pvscsi.h
  
 +VMWARE PVRDMA DRIVER
 +M:    Adit Ranadive <aditr@vmware.com>
 +M:    VMware PV-Drivers <pv-drivers@vmware.com>
 +L:    linux-rdma@vger.kernel.org
 +S:    Maintained
 +F:    drivers/infiniband/hw/vmw_pvrdma/
 +
  VOLTAGE AND CURRENT REGULATOR FRAMEWORK
  M:    Liam Girdwood <lgirdwood@gmail.com>
  M:    Mark Brown <broonie@kernel.org>
@@@ -13462,6 -13256,7 +13462,6 @@@ F:   drivers/media/tuners/tuner-xc2028.
  
  XEN HYPERVISOR INTERFACE
  M:    Boris Ostrovsky <boris.ostrovsky@oracle.com>
 -M:    David Vrabel <david.vrabel@citrix.com>
  M:    Juergen Gross <jgross@suse.com>
  L:    xen-devel@lists.xenproject.org (moderated for non-subscribers)
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/xen/tip.git
@@@ -1501,7 -1501,7 +1501,7 @@@ static int dce_v6_0_crtc_do_set_base(st
        amdgpu_bo_get_tiling_flags(abo, &tiling_flags);
        amdgpu_bo_unreserve(abo);
  
-       switch (target_fb->pixel_format) {
+       switch (target_fb->format->format) {
        case DRM_FORMAT_C8:
                fb_format = (GRPH_DEPTH(GRPH_DEPTH_8BPP) |
                             GRPH_FORMAT(GRPH_FORMAT_INDEXED));
                break;
        default:
                DRM_ERROR("Unsupported screen format %s\n",
-                         drm_get_format_name(target_fb->pixel_format, &format_name));
+                         drm_get_format_name(target_fb->format->format, &format_name));
                return -EINVAL;
        }
  
        WREG32(mmGRPH_X_END + amdgpu_crtc->crtc_offset, target_fb->width);
        WREG32(mmGRPH_Y_END + amdgpu_crtc->crtc_offset, target_fb->height);
  
-       fb_pitch_pixels = target_fb->pitches[0] / (target_fb->bits_per_pixel / 8);
+       fb_pitch_pixels = target_fb->pitches[0] / target_fb->format->cpp[0];
        WREG32(mmGRPH_PITCH + amdgpu_crtc->crtc_offset, fb_pitch_pixels);
  
        dce_v6_0_grph_enable(crtc, true);
@@@ -1944,7 -1944,9 +1944,7 @@@ static int dce_v6_0_crtc_cursor_set2(st
  
        dce_v6_0_lock_cursor(crtc, true);
  
 -      if (width != amdgpu_crtc->cursor_width ||
 -          height != amdgpu_crtc->cursor_height ||
 -          hot_x != amdgpu_crtc->cursor_hot_x ||
 +      if (hot_x != amdgpu_crtc->cursor_hot_x ||
            hot_y != amdgpu_crtc->cursor_hot_y) {
                int x, y;
  
  
                dce_v6_0_cursor_move_locked(crtc, x, y);
  
 -              amdgpu_crtc->cursor_width = width;
 -              amdgpu_crtc->cursor_height = height;
                amdgpu_crtc->cursor_hot_x = hot_x;
                amdgpu_crtc->cursor_hot_y = hot_y;
        }
@@@ -1950,7 -1950,7 +1950,7 @@@ static int dce_v8_0_crtc_do_set_base(st
  
        pipe_config = AMDGPU_TILING_GET(tiling_flags, PIPE_CONFIG);
  
-       switch (target_fb->pixel_format) {
+       switch (target_fb->format->format) {
        case DRM_FORMAT_C8:
                fb_format = ((GRPH_DEPTH_8BPP << GRPH_CONTROL__GRPH_DEPTH__SHIFT) |
                             (GRPH_FORMAT_INDEXED << GRPH_CONTROL__GRPH_FORMAT__SHIFT));
                break;
        default:
                DRM_ERROR("Unsupported screen format %s\n",
-                         drm_get_format_name(target_fb->pixel_format, &format_name));
+                         drm_get_format_name(target_fb->format->format, &format_name));
                return -EINVAL;
        }
  
        WREG32(mmGRPH_X_END + amdgpu_crtc->crtc_offset, target_fb->width);
        WREG32(mmGRPH_Y_END + amdgpu_crtc->crtc_offset, target_fb->height);
  
-       fb_pitch_pixels = target_fb->pitches[0] / (target_fb->bits_per_pixel / 8);
+       fb_pitch_pixels = target_fb->pitches[0] / target_fb->format->cpp[0];
        WREG32(mmGRPH_PITCH + amdgpu_crtc->crtc_offset, fb_pitch_pixels);
  
        dce_v8_0_grph_enable(crtc, true);
@@@ -2438,6 -2438,8 +2438,6 @@@ static int dce_v8_0_crtc_cursor_set2(st
  
                dce_v8_0_cursor_move_locked(crtc, x, y);
  
 -              amdgpu_crtc->cursor_width = width;
 -              amdgpu_crtc->cursor_height = height;
                amdgpu_crtc->cursor_hot_x = hot_x;
                amdgpu_crtc->cursor_hot_y = hot_y;
        }
@@@ -223,8 -223,7 +223,8 @@@ static int ast_get_dram_info(struct drm
        ast_write32(ast, 0x10000, 0xfc600309);
  
        do {
 -              ;
 +              if (pci_channel_offline(dev->pdev))
 +                      return -EIO;
        } while (ast_read32(ast, 0x10000) != 0x01);
        data = ast_read32(ast, 0x10004);
  
@@@ -314,7 -313,7 +314,7 @@@ int ast_framebuffer_init(struct drm_dev
  {
        int ret;
  
-       drm_helper_mode_fill_fb_struct(&ast_fb->base, mode_cmd);
+       drm_helper_mode_fill_fb_struct(dev, &ast_fb->base, mode_cmd);
        ast_fb->obj = obj;
        ret = drm_framebuffer_init(dev, &ast_fb->base, &ast_fb_funcs);
        if (ret) {
@@@ -429,9 -428,7 +429,9 @@@ int ast_driver_load(struct drm_device *
        ast_detect_chip(dev, &need_post);
  
        if (ast->chip != AST1180) {
 -              ast_get_dram_info(dev);
 +              ret = ast_get_dram_info(dev);
 +              if (ret)
 +                      goto out_free;
                ast->vram_size = ast_get_vram_info(dev);
                DRM_INFO("dram %d %d %d %08x\n", ast->mclk, ast->dram_type, ast->dram_bus_width, ast->vram_size);
        }
@@@ -77,7 -77,7 +77,7 @@@ static int psbfb_setcolreg(unsigned reg
            (transp << info->var.transp.offset);
  
        if (regno < 16) {
-               switch (fb->bits_per_pixel) {
+               switch (fb->format->cpp[0] * 8) {
                case 16:
                        ((uint32_t *) info->pseudo_palette)[regno] = v;
                        break;
@@@ -125,7 -125,7 +125,7 @@@ static int psbfb_vm_fault(struct vm_are
                                  psbfb->gtt->offset;
  
        page_num = vma_pages(vma);
 -      address = (unsigned long)vmf->virtual_address - (vmf->pgoff << PAGE_SHIFT);
 +      address = vmf->address - (vmf->pgoff << PAGE_SHIFT);
  
        vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot);
  
@@@ -244,7 -244,7 +244,7 @@@ static int psb_framebuffer_init(struct 
        if (mode_cmd->pitches[0] & 63)
                return -EINVAL;
  
-       drm_helper_mode_fill_fb_struct(&fb->base, mode_cmd);
+       drm_helper_mode_fill_fb_struct(dev, &fb->base, mode_cmd);
        fb->gtt = gt;
        ret = drm_framebuffer_init(dev, &fb->base, &psb_fb_funcs);
        if (ret) {
@@@ -407,7 -407,7 +407,7 @@@ static int psbfb_create(struct psb_fbde
  
        fbdev->psb_fb_helper.fb = fb;
  
-       drm_fb_helper_fill_fix(info, fb->pitches[0], fb->depth);
+       drm_fb_helper_fill_fix(info, fb->pitches[0], fb->format->depth);
        strcpy(info->fix.id, "psbdrmfb");
  
        info->flags = FBINFO_DEFAULT;
   *
   */
  
 -#include <linux/seq_file.h>
 -#include <linux/circ_buf.h>
 -#include <linux/ctype.h>
  #include <linux/debugfs.h>
 -#include <linux/slab.h>
 -#include <linux/export.h>
  #include <linux/list_sort.h>
 -#include <asm/msr-index.h>
 -#include <drm/drmP.h>
  #include "intel_drv.h"
 -#include "intel_ringbuffer.h"
 -#include <drm/i915_drm.h>
 -#include "i915_drv.h"
  
  static inline struct drm_i915_private *node_to_i915(struct drm_info_node *node)
  {
@@@ -67,7 -77,6 +67,7 @@@ static int i915_capabilities(struct seq
        const struct intel_device_info *info = INTEL_INFO(dev_priv);
  
        seq_printf(m, "gen: %d\n", INTEL_GEN(dev_priv));
 +      seq_printf(m, "platform: %s\n", intel_platform_name(info->platform));
        seq_printf(m, "pch: %d\n", INTEL_PCH_TYPE(dev_priv));
  #define PRINT_FLAG(x)  seq_printf(m, #x ": %s\n", yesno(info->x))
        DEV_INFO_FOR_EACH_FLAG(PRINT_FLAG);
@@@ -540,10 -549,10 +540,10 @@@ static int i915_gem_pageflip_info(struc
                        if (work->flip_queued_req) {
                                struct intel_engine_cs *engine = work->flip_queued_req->engine;
  
 -                              seq_printf(m, "Flip queued on %s at seqno %x, next seqno %x [current breadcrumb %x], completed? %d\n",
 +                              seq_printf(m, "Flip queued on %s at seqno %x, last submitted seqno %x [current breadcrumb %x], completed? %d\n",
                                           engine->name,
                                           work->flip_queued_req->global_seqno,
 -                                         atomic_read(&dev_priv->gt.global_timeline.next_seqno),
 +                                         intel_engine_last_submit(engine),
                                           intel_engine_get_seqno(engine),
                                           i915_gem_request_completed(work->flip_queued_req));
                        } else
@@@ -677,7 -686,7 +677,7 @@@ static void i915_ring_seqno_info(struc
  
        spin_lock_irq(&b->lock);
        for (rb = rb_first(&b->waiters); rb; rb = rb_next(rb)) {
 -              struct intel_wait *w = container_of(rb, typeof(*w), node);
 +              struct intel_wait *w = rb_entry(rb, typeof(*w), node);
  
                seq_printf(m, "Waiting (%s): %s [%d] on %x\n",
                           engine->name, w->tsk->comm, w->tsk->pid, w->seqno);
@@@ -937,7 -946,7 +937,7 @@@ i915_error_state_write(struct file *fil
        struct i915_error_state_file_priv *error_priv = filp->private_data;
  
        DRM_DEBUG_DRIVER("Resetting error state\n");
 -      i915_destroy_error_state(error_priv->dev);
 +      i915_destroy_error_state(error_priv->i915);
  
        return cnt;
  }
@@@ -951,7 -960,7 +951,7 @@@ static int i915_error_state_open(struc
        if (!error_priv)
                return -ENOMEM;
  
 -      error_priv->dev = &dev_priv->drm;
 +      error_priv->i915 = dev_priv;
  
        i915_error_state_get(&dev_priv->drm, error_priv);
  
@@@ -979,8 -988,8 +979,8 @@@ static ssize_t i915_error_state_read(st
        ssize_t ret_count = 0;
        int ret;
  
 -      ret = i915_error_state_buf_init(&error_str,
 -                                      to_i915(error_priv->dev), count, *pos);
 +      ret = i915_error_state_buf_init(&error_str, error_priv->i915,
 +                                      count, *pos);
        if (ret)
                return ret;
  
@@@ -1017,7 -1026,7 +1017,7 @@@ i915_next_seqno_get(void *data, u64 *va
  {
        struct drm_i915_private *dev_priv = data;
  
 -      *val = 1 + atomic_read(&dev_priv->gt.global_timeline.next_seqno);
 +      *val = 1 + atomic_read(&dev_priv->gt.global_timeline.seqno);
        return 0;
  }
  
@@@ -1099,7 -1108,7 +1099,7 @@@ static int i915_frequency_info(struct s
                int max_freq;
  
                rp_state_limits = I915_READ(GEN6_RP_STATE_LIMITS);
 -              if (IS_BROXTON(dev_priv)) {
 +              if (IS_GEN9_LP(dev_priv)) {
                        rp_state_cap = I915_READ(BXT_RP_STATE_CAP);
                        gt_perf_status = I915_READ(BXT_GT_PERF_STATUS);
                } else {
                seq_printf(m, "Down threshold: %d%%\n",
                           dev_priv->rps.down_threshold);
  
 -              max_freq = (IS_BROXTON(dev_priv) ? rp_state_cap >> 0 :
 +              max_freq = (IS_GEN9_LP(dev_priv) ? rp_state_cap >> 0 :
                            rp_state_cap >> 16) & 0xff;
                max_freq *= (IS_SKYLAKE(dev_priv) || IS_KABYLAKE(dev_priv) ?
                             GEN9_FREQ_SCALER : 1);
                seq_printf(m, "Nominal (RP1) frequency: %dMHz\n",
                           intel_gpu_freq(dev_priv, max_freq));
  
 -              max_freq = (IS_BROXTON(dev_priv) ? rp_state_cap >> 16 :
 +              max_freq = (IS_GEN9_LP(dev_priv) ? rp_state_cap >> 16 :
                            rp_state_cap >> 0) & 0xff;
                max_freq *= (IS_SKYLAKE(dev_priv) || IS_KABYLAKE(dev_priv) ?
                             GEN9_FREQ_SCALER : 1);
@@@ -1321,15 -1330,13 +1321,15 @@@ static int i915_hangcheck_info(struct s
                seq_printf(m, "\tseqno = %x [current %x, last %x]\n",
                           engine->hangcheck.seqno, seqno[id],
                           intel_engine_last_submit(engine));
 -              seq_printf(m, "\twaiters? %s, fake irq active? %s\n",
 +              seq_printf(m, "\twaiters? %s, fake irq active? %s, stalled? %s\n",
                           yesno(intel_engine_has_waiter(engine)),
                           yesno(test_bit(engine->id,
 -                                        &dev_priv->gpu_error.missed_irq_rings)));
 +                                        &dev_priv->gpu_error.missed_irq_rings)),
 +                         yesno(engine->hangcheck.stalled));
 +
                spin_lock_irq(&b->lock);
                for (rb = rb_first(&b->waiters); rb; rb = rb_next(rb)) {
 -                      struct intel_wait *w = container_of(rb, typeof(*w), node);
 +                      struct intel_wait *w = rb_entry(rb, typeof(*w), node);
  
                        seq_printf(m, "\t%s [%d] waiting for %x\n",
                                   w->tsk->comm, w->tsk->pid, w->seqno);
                seq_printf(m, "\tACTHD = 0x%08llx [current 0x%08llx]\n",
                           (long long)engine->hangcheck.acthd,
                           (long long)acthd[id]);
 -              seq_printf(m, "\tscore = %d\n", engine->hangcheck.score);
 -              seq_printf(m, "\taction = %d\n", engine->hangcheck.action);
 +              seq_printf(m, "\taction = %s(%d) %d ms ago\n",
 +                         hangcheck_action_to_str(engine->hangcheck.action),
 +                         engine->hangcheck.action,
 +                         jiffies_to_msecs(jiffies -
 +                                          engine->hangcheck.action_timestamp));
  
                if (engine->id == RCS) {
                        seq_puts(m, "\tinstdone read =\n");
@@@ -1724,7 -1728,7 +1724,7 @@@ static int i915_sr_status(struct seq_fi
  
        if (HAS_PCH_SPLIT(dev_priv))
                sr_enabled = I915_READ(WM1_LP_ILK) & WM1_LP_SR_EN;
 -      else if (IS_CRESTLINE(dev_priv) || IS_G4X(dev_priv) ||
 +      else if (IS_I965GM(dev_priv) || IS_G4X(dev_priv) ||
                 IS_I945G(dev_priv) || IS_I945GM(dev_priv))
                sr_enabled = I915_READ(FW_BLC_SELF) & FW_BLC_SELF_EN;
        else if (IS_I915GM(dev_priv))
@@@ -1869,8 -1873,8 +1869,8 @@@ static int i915_gem_framebuffer_info(st
                seq_printf(m, "fbcon size: %d x %d, depth %d, %d bpp, modifier 0x%llx, refcount %d, obj ",
                           fbdev_fb->base.width,
                           fbdev_fb->base.height,
-                          fbdev_fb->base.depth,
-                          fbdev_fb->base.bits_per_pixel,
+                          fbdev_fb->base.format->depth,
+                          fbdev_fb->base.format->cpp[0] * 8,
                           fbdev_fb->base.modifier,
                           drm_framebuffer_read_refcount(&fbdev_fb->base));
                describe_obj(m, fbdev_fb->obj);
                seq_printf(m, "user size: %d x %d, depth %d, %d bpp, modifier 0x%llx, refcount %d, obj ",
                           fb->base.width,
                           fb->base.height,
-                          fb->base.depth,
-                          fb->base.bits_per_pixel,
+                          fb->base.format->depth,
+                          fb->base.format->cpp[0] * 8,
                           fb->base.modifier,
                           drm_framebuffer_read_refcount(&fb->base));
                describe_obj(m, fb->obj);
@@@ -2405,7 -2409,7 +2405,7 @@@ static void i915_guc_client_info(struc
        seq_printf(m, "\tPriority %d, GuC ctx index: %u, PD offset 0x%x\n",
                client->priority, client->ctx_index, client->proc_desc_offset);
        seq_printf(m, "\tDoorbell id %d, offset: 0x%x, cookie 0x%x\n",
 -              client->doorbell_id, client->doorbell_offset, client->cookie);
 +              client->doorbell_id, client->doorbell_offset, client->doorbell_cookie);
        seq_printf(m, "\tWQ size %d, offset: 0x%x, tail %d\n",
                client->wq_size, client->wq_offset, client->wq_tail);
  
  static int i915_guc_info(struct seq_file *m, void *data)
  {
        struct drm_i915_private *dev_priv = node_to_i915(m->private);
 -      struct drm_device *dev = &dev_priv->drm;
 -      struct intel_guc guc;
 -      struct i915_guc_client client = {};
 +      const struct intel_guc *guc = &dev_priv->guc;
        struct intel_engine_cs *engine;
        enum intel_engine_id id;
 -      u64 total = 0;
 -
 -      if (!HAS_GUC_SCHED(dev_priv))
 -              return 0;
 +      u64 total;
  
 -      if (mutex_lock_interruptible(&dev->struct_mutex))
 +      if (!guc->execbuf_client) {
 +              seq_printf(m, "GuC submission %s\n",
 +                         HAS_GUC_SCHED(dev_priv) ?
 +                         "disabled" :
 +                         "not supported");
                return 0;
 -
 -      /* Take a local copy of the GuC data, so we can dump it at leisure */
 -      guc = dev_priv->guc;
 -      if (guc.execbuf_client)
 -              client = *guc.execbuf_client;
 -
 -      mutex_unlock(&dev->struct_mutex);
 +      }
  
        seq_printf(m, "Doorbell map:\n");
 -      seq_printf(m, "\t%*pb\n", GUC_MAX_DOORBELLS, guc.doorbell_bitmap);
 -      seq_printf(m, "Doorbell next cacheline: 0x%x\n\n", guc.db_cacheline);
 +      seq_printf(m, "\t%*pb\n", GUC_MAX_DOORBELLS, guc->doorbell_bitmap);
 +      seq_printf(m, "Doorbell next cacheline: 0x%x\n\n", guc->db_cacheline);
  
 -      seq_printf(m, "GuC total action count: %llu\n", guc.action_count);
 -      seq_printf(m, "GuC action failure count: %u\n", guc.action_fail);
 -      seq_printf(m, "GuC last action command: 0x%x\n", guc.action_cmd);
 -      seq_printf(m, "GuC last action status: 0x%x\n", guc.action_status);
 -      seq_printf(m, "GuC last action error code: %d\n", guc.action_err);
 +      seq_printf(m, "GuC total action count: %llu\n", guc->action_count);
 +      seq_printf(m, "GuC action failure count: %u\n", guc->action_fail);
 +      seq_printf(m, "GuC last action command: 0x%x\n", guc->action_cmd);
 +      seq_printf(m, "GuC last action status: 0x%x\n", guc->action_status);
 +      seq_printf(m, "GuC last action error code: %d\n", guc->action_err);
  
 +      total = 0;
        seq_printf(m, "\nGuC submissions:\n");
        for_each_engine(engine, dev_priv, id) {
 -              u64 submissions = guc.submissions[id];
 +              u64 submissions = guc->submissions[id];
                total += submissions;
                seq_printf(m, "\t%-24s: %10llu, last seqno 0x%08x\n",
 -                      engine->name, submissions, guc.last_seqno[id]);
 +                      engine->name, submissions, guc->last_seqno[id]);
        }
        seq_printf(m, "\t%s: %llu\n", "Total", total);
  
 -      seq_printf(m, "\nGuC execbuf client @ %p:\n", guc.execbuf_client);
 -      i915_guc_client_info(m, dev_priv, &client);
 +      seq_printf(m, "\nGuC execbuf client @ %p:\n", guc->execbuf_client);
 +      i915_guc_client_info(m, dev_priv, guc->execbuf_client);
  
        i915_guc_log_info(m, dev_priv);
  
@@@ -2557,12 -2567,9 +2557,12 @@@ static int i915_edp_psr_status(struct s
        seq_printf(m, "Re-enable work scheduled: %s\n",
                   yesno(work_busy(&dev_priv->psr.work.work)));
  
 -      if (HAS_DDI(dev_priv))
 -              enabled = I915_READ(EDP_PSR_CTL) & EDP_PSR_ENABLE;
 -      else {
 +      if (HAS_DDI(dev_priv)) {
 +              if (dev_priv->psr.psr2_support)
 +                      enabled = I915_READ(EDP_PSR2_CTL) & EDP_PSR2_ENABLE;
 +              else
 +                      enabled = I915_READ(EDP_PSR_CTL) & EDP_PSR_ENABLE;
 +      } else {
                for_each_pipe(dev_priv, pipe) {
                        enum transcoder cpu_transcoder =
                                intel_pipe_to_cpu_transcoder(dev_priv, pipe);
@@@ -2865,20 -2872,6 +2865,20 @@@ static void intel_dp_info(struct seq_fi
                                &intel_dp->aux);
  }
  
 +static void intel_dp_mst_info(struct seq_file *m,
 +                        struct intel_connector *intel_connector)
 +{
 +      struct intel_encoder *intel_encoder = intel_connector->encoder;
 +      struct intel_dp_mst_encoder *intel_mst =
 +              enc_to_mst(&intel_encoder->base);
 +      struct intel_digital_port *intel_dig_port = intel_mst->primary;
 +      struct intel_dp *intel_dp = &intel_dig_port->dp;
 +      bool has_audio = drm_dp_mst_port_has_audio(&intel_dp->mst_mgr,
 +                                      intel_connector->port);
 +
 +      seq_printf(m, "\taudio support: %s\n", yesno(has_audio));
 +}
 +
  static void intel_hdmi_info(struct seq_file *m,
                            struct intel_connector *intel_connector)
  {
@@@ -2921,10 -2914,7 +2921,10 @@@ static void intel_connector_info(struc
        switch (connector->connector_type) {
        case DRM_MODE_CONNECTOR_DisplayPort:
        case DRM_MODE_CONNECTOR_eDP:
 -              intel_dp_info(m, intel_connector);
 +              if (intel_encoder->type == INTEL_OUTPUT_DP_MST)
 +                      intel_dp_mst_info(m, intel_connector);
 +              else
 +                      intel_dp_info(m, intel_connector);
                break;
        case DRM_MODE_CONNECTOR_LVDS:
                if (intel_encoder->type == INTEL_OUTPUT_LVDS)
@@@ -2948,7 -2938,7 +2948,7 @@@ static bool cursor_active(struct drm_i9
  {
        u32 state;
  
 -      if (IS_845G(dev_priv) || IS_I865G(dev_priv))
 +      if (IS_I845G(dev_priv) || IS_I865G(dev_priv))
                state = I915_READ(CURCNTR(PIPE_A)) & CURSOR_ENABLE;
        else
                state = I915_READ(CURCNTR(pipe)) & CURSOR_MODE;
@@@ -3031,7 -3021,8 +3031,8 @@@ static void intel_plane_info(struct seq
                state = plane->state;
  
                if (state->fb) {
-                       drm_get_format_name(state->fb->pixel_format, &format_name);
+                       drm_get_format_name(state->fb->format->format,
+                                           &format_name);
                } else {
                        sprintf(format_name.str, "N/A");
                }
@@@ -3069,7 -3060,7 +3070,7 @@@ static void intel_scaler_info(struct se
                           pipe_config->scaler_state.scaler_users,
                           pipe_config->scaler_state.scaler_id);
  
 -              for (i = 0; i < SKL_NUM_SCALERS; i++) {
 +              for (i = 0; i < num_scalers; i++) {
                        struct intel_scaler *sc =
                                        &pipe_config->scaler_state.scalers[i];
  
@@@ -3151,11 -3142,11 +3152,11 @@@ static int i915_engine_info(struct seq_
                u64 addr;
  
                seq_printf(m, "%s\n", engine->name);
 -              seq_printf(m, "\tcurrent seqno %x, last %x, hangcheck %x [score %d]\n",
 +              seq_printf(m, "\tcurrent seqno %x, last %x, hangcheck %x [%d ms]\n",
                           intel_engine_get_seqno(engine),
                           intel_engine_last_submit(engine),
                           engine->hangcheck.seqno,
 -                         engine->hangcheck.score);
 +                         jiffies_to_msecs(jiffies - engine->hangcheck.action_timestamp));
  
                rcu_read_lock();
  
  
                spin_lock_irq(&b->lock);
                for (rb = rb_first(&b->waiters); rb; rb = rb_next(rb)) {
 -                      struct intel_wait *w = container_of(rb, typeof(*w), node);
 +                      struct intel_wait *w = rb_entry(rb, typeof(*w), node);
  
                        seq_printf(m, "\t%s [%d] waiting for %x\n",
                                   w->tsk->comm, w->tsk->pid, w->seqno);
@@@ -3351,14 -3342,14 +3352,14 @@@ static int i915_shared_dplls_info(struc
  
                seq_printf(m, "DPLL%i: %s, id: %i\n", i, pll->name, pll->id);
                seq_printf(m, " crtc_mask: 0x%08x, active: 0x%x, on: %s\n",
 -                         pll->config.crtc_mask, pll->active_mask, yesno(pll->on));
 +                         pll->state.crtc_mask, pll->active_mask, yesno(pll->on));
                seq_printf(m, " tracked hardware state:\n");
 -              seq_printf(m, " dpll:    0x%08x\n", pll->config.hw_state.dpll);
 +              seq_printf(m, " dpll:    0x%08x\n", pll->state.hw_state.dpll);
                seq_printf(m, " dpll_md: 0x%08x\n",
 -                         pll->config.hw_state.dpll_md);
 -              seq_printf(m, " fp0:     0x%08x\n", pll->config.hw_state.fp0);
 -              seq_printf(m, " fp1:     0x%08x\n", pll->config.hw_state.fp1);
 -              seq_printf(m, " wrpll:   0x%08x\n", pll->config.hw_state.wrpll);
 +                         pll->state.hw_state.dpll_md);
 +              seq_printf(m, " fp0:     0x%08x\n", pll->state.hw_state.fp0);
 +              seq_printf(m, " fp1:     0x%08x\n", pll->state.hw_state.fp1);
 +              seq_printf(m, " wrpll:   0x%08x\n", pll->state.hw_state.wrpll);
        }
        drm_modeset_unlock_all(dev);
  
@@@ -3536,6 -3527,12 +3537,6 @@@ static int i915_drrs_status(struct seq_
        return 0;
  }
  
 -struct pipe_crc_info {
 -      const char *name;
 -      struct drm_i915_private *dev_priv;
 -      enum pipe pipe;
 -};
 -
  static int i915_dp_mst_info(struct seq_file *m, void *unused)
  {
        struct drm_i915_private *dev_priv = node_to_i915(m->private);
        return 0;
  }
  
 -static int i915_pipe_crc_open(struct inode *inode, struct file *filep)
 -{
 -      struct pipe_crc_info *info = inode->i_private;
 -      struct drm_i915_private *dev_priv = info->dev_priv;
 -      struct intel_pipe_crc *pipe_crc = &dev_priv->pipe_crc[info->pipe];
 -
 -      if (info->pipe >= INTEL_INFO(dev_priv)->num_pipes)
 -              return -ENODEV;
 -
 -      spin_lock_irq(&pipe_crc->lock);
 -
 -      if (pipe_crc->opened) {
 -              spin_unlock_irq(&pipe_crc->lock);
 -              return -EBUSY; /* already open */
 -      }
 -
 -      pipe_crc->opened = true;
 -      filep->private_data = inode->i_private;
 -
 -      spin_unlock_irq(&pipe_crc->lock);
 -
 -      return 0;
 -}
 -
 -static int i915_pipe_crc_release(struct inode *inode, struct file *filep)
 -{
 -      struct pipe_crc_info *info = inode->i_private;
 -      struct drm_i915_private *dev_priv = info->dev_priv;
 -      struct intel_pipe_crc *pipe_crc = &dev_priv->pipe_crc[info->pipe];
 -
 -      spin_lock_irq(&pipe_crc->lock);
 -      pipe_crc->opened = false;
 -      spin_unlock_irq(&pipe_crc->lock);
 -
 -      return 0;
 -}
 -
 -/* (6 fields, 8 chars each, space separated (5) + '\n') */
 -#define PIPE_CRC_LINE_LEN     (6 * 8 + 5 + 1)
 -/* account for \'0' */
 -#define PIPE_CRC_BUFFER_LEN   (PIPE_CRC_LINE_LEN + 1)
 -
 -static int pipe_crc_data_count(struct intel_pipe_crc *pipe_crc)
 -{
 -      assert_spin_locked(&pipe_crc->lock);
 -      return CIRC_CNT(pipe_crc->head, pipe_crc->tail,
 -                      INTEL_PIPE_CRC_ENTRIES_NR);
 -}
 -
 -static ssize_t
 -i915_pipe_crc_read(struct file *filep, char __user *user_buf, size_t count,
 -                 loff_t *pos)
 -{
 -      struct pipe_crc_info *info = filep->private_data;
 -      struct drm_i915_private *dev_priv = info->dev_priv;
 -      struct intel_pipe_crc *pipe_crc = &dev_priv->pipe_crc[info->pipe];
 -      char buf[PIPE_CRC_BUFFER_LEN];
 -      int n_entries;
 -      ssize_t bytes_read;
 -
 -      /*
 -       * Don't allow user space to provide buffers not big enough to hold
 -       * a line of data.
 -       */
 -      if (count < PIPE_CRC_LINE_LEN)
 -              return -EINVAL;
 -
 -      if (pipe_crc->source == INTEL_PIPE_CRC_SOURCE_NONE)
 -              return 0;
 -
 -      /* nothing to read */
 -      spin_lock_irq(&pipe_crc->lock);
 -      while (pipe_crc_data_count(pipe_crc) == 0) {
 -              int ret;
 -
 -              if (filep->f_flags & O_NONBLOCK) {
 -                      spin_unlock_irq(&pipe_crc->lock);
 -                      return -EAGAIN;
 -              }
 -
 -              ret = wait_event_interruptible_lock_irq(pipe_crc->wq,
 -                              pipe_crc_data_count(pipe_crc), pipe_crc->lock);
 -              if (ret) {
 -                      spin_unlock_irq(&pipe_crc->lock);
 -                      return ret;
 -              }
 -      }
 -
 -      /* We now have one or more entries to read */
 -      n_entries = count / PIPE_CRC_LINE_LEN;
 -
 -      bytes_read = 0;
 -      while (n_entries > 0) {
 -              struct intel_pipe_crc_entry *entry =
 -                      &pipe_crc->entries[pipe_crc->tail];
 -
 -              if (CIRC_CNT(pipe_crc->head, pipe_crc->tail,
 -                           INTEL_PIPE_CRC_ENTRIES_NR) < 1)
 -                      break;
 -
 -              BUILD_BUG_ON_NOT_POWER_OF_2(INTEL_PIPE_CRC_ENTRIES_NR);
 -              pipe_crc->tail = (pipe_crc->tail + 1) & (INTEL_PIPE_CRC_ENTRIES_NR - 1);
 -
 -              bytes_read += snprintf(buf, PIPE_CRC_BUFFER_LEN,
 -                                     "%8u %8x %8x %8x %8x %8x\n",
 -                                     entry->frame, entry->crc[0],
 -                                     entry->crc[1], entry->crc[2],
 -                                     entry->crc[3], entry->crc[4]);
 -
 -              spin_unlock_irq(&pipe_crc->lock);
 -
 -              if (copy_to_user(user_buf, buf, PIPE_CRC_LINE_LEN))
 -                      return -EFAULT;
 -
 -              user_buf += PIPE_CRC_LINE_LEN;
 -              n_entries--;
 -
 -              spin_lock_irq(&pipe_crc->lock);
 -      }
 -
 -      spin_unlock_irq(&pipe_crc->lock);
 -
 -      return bytes_read;
 -}
 -
 -static const struct file_operations i915_pipe_crc_fops = {
 -      .owner = THIS_MODULE,
 -      .open = i915_pipe_crc_open,
 -      .read = i915_pipe_crc_read,
 -      .release = i915_pipe_crc_release,
 -};
 -
 -static struct pipe_crc_info i915_pipe_crc_data[I915_MAX_PIPES] = {
 -      {
 -              .name = "i915_pipe_A_crc",
 -              .pipe = PIPE_A,
 -      },
 -      {
 -              .name = "i915_pipe_B_crc",
 -              .pipe = PIPE_B,
 -      },
 -      {
 -              .name = "i915_pipe_C_crc",
 -              .pipe = PIPE_C,
 -      },
 -};
 -
 -static int i915_pipe_crc_create(struct dentry *root, struct drm_minor *minor,
 -                              enum pipe pipe)
 -{
 -      struct drm_i915_private *dev_priv = to_i915(minor->dev);
 -      struct dentry *ent;
 -      struct pipe_crc_info *info = &i915_pipe_crc_data[pipe];
 -
 -      info->dev_priv = dev_priv;
 -      ent = debugfs_create_file(info->name, S_IRUGO, root, info,
 -                                &i915_pipe_crc_fops);
 -      if (!ent)
 -              return -ENOMEM;
 -
 -      return drm_add_fake_info_node(minor, ent, info);
 -}
 -
 -static const char * const pipe_crc_sources[] = {
 -      "none",
 -      "plane1",
 -      "plane2",
 -      "pf",
 -      "pipe",
 -      "TV",
 -      "DP-B",
 -      "DP-C",
 -      "DP-D",
 -      "auto",
 -};
 -
 -static const char *pipe_crc_source_name(enum intel_pipe_crc_source source)
 -{
 -      BUILD_BUG_ON(ARRAY_SIZE(pipe_crc_sources) != INTEL_PIPE_CRC_SOURCE_MAX);
 -      return pipe_crc_sources[source];
 -}
 -
 -static int display_crc_ctl_show(struct seq_file *m, void *data)
 -{
 -      struct drm_i915_private *dev_priv = m->private;
 -      int i;
 -
 -      for (i = 0; i < I915_MAX_PIPES; i++)
 -              seq_printf(m, "%c %s\n", pipe_name(i),
 -                         pipe_crc_source_name(dev_priv->pipe_crc[i].source));
 -
 -      return 0;
 -}
 -
 -static int display_crc_ctl_open(struct inode *inode, struct file *file)
 -{
 -      return single_open(file, display_crc_ctl_show, inode->i_private);
 -}
 -
 -static int i8xx_pipe_crc_ctl_reg(enum intel_pipe_crc_source *source,
 -                               uint32_t *val)
 -{
 -      if (*source == INTEL_PIPE_CRC_SOURCE_AUTO)
 -              *source = INTEL_PIPE_CRC_SOURCE_PIPE;
 -
 -      switch (*source) {
 -      case INTEL_PIPE_CRC_SOURCE_PIPE:
 -              *val = PIPE_CRC_ENABLE | PIPE_CRC_INCLUDE_BORDER_I8XX;
 -              break;
 -      case INTEL_PIPE_CRC_SOURCE_NONE:
 -              *val = 0;
 -              break;
 -      default:
 -              return -EINVAL;
 -      }
 -
 -      return 0;
 -}
 -
 -static int i9xx_pipe_crc_auto_source(struct drm_i915_private *dev_priv,
 -                                   enum pipe pipe,
 -                                   enum intel_pipe_crc_source *source)
 -{
 -      struct drm_device *dev = &dev_priv->drm;
 -      struct intel_encoder *encoder;
 -      struct intel_crtc *crtc;
 -      struct intel_digital_port *dig_port;
 -      int ret = 0;
 -
 -      *source = INTEL_PIPE_CRC_SOURCE_PIPE;
 -
 -      drm_modeset_lock_all(dev);
 -      for_each_intel_encoder(dev, encoder) {
 -              if (!encoder->base.crtc)
 -                      continue;
 -
 -              crtc = to_intel_crtc(encoder->base.crtc);
 -
 -              if (crtc->pipe != pipe)
 -                      continue;
 -
 -              switch (encoder->type) {
 -              case INTEL_OUTPUT_TVOUT:
 -                      *source = INTEL_PIPE_CRC_SOURCE_TV;
 -                      break;
 -              case INTEL_OUTPUT_DP:
 -              case INTEL_OUTPUT_EDP:
 -                      dig_port = enc_to_dig_port(&encoder->base);
 -                      switch (dig_port->port) {
 -                      case PORT_B:
 -                              *source = INTEL_PIPE_CRC_SOURCE_DP_B;
 -                              break;
 -                      case PORT_C:
 -                              *source = INTEL_PIPE_CRC_SOURCE_DP_C;
 -                              break;
 -                      case PORT_D:
 -                              *source = INTEL_PIPE_CRC_SOURCE_DP_D;
 -                              break;
 -                      default:
 -                              WARN(1, "nonexisting DP port %c\n",
 -                                   port_name(dig_port->port));
 -                              break;
 -                      }
 -                      break;
 -              default:
 -                      break;
 -              }
 -      }
 -      drm_modeset_unlock_all(dev);
 -
 -      return ret;
 -}
 -
 -static int vlv_pipe_crc_ctl_reg(struct drm_i915_private *dev_priv,
 -                              enum pipe pipe,
 -                              enum intel_pipe_crc_source *source,
 -                              uint32_t *val)
 -{
 -      bool need_stable_symbols = false;
 -
 -      if (*source == INTEL_PIPE_CRC_SOURCE_AUTO) {
 -              int ret = i9xx_pipe_crc_auto_source(dev_priv, pipe, source);
 -              if (ret)
 -                      return ret;
 -      }
 -
 -      switch (*source) {
 -      case INTEL_PIPE_CRC_SOURCE_PIPE:
 -              *val = PIPE_CRC_ENABLE | PIPE_CRC_SOURCE_PIPE_VLV;
 -              break;
 -      case INTEL_PIPE_CRC_SOURCE_DP_B:
 -              *val = PIPE_CRC_ENABLE | PIPE_CRC_SOURCE_DP_B_VLV;
 -              need_stable_symbols = true;
 -              break;
 -      case INTEL_PIPE_CRC_SOURCE_DP_C:
 -              *val = PIPE_CRC_ENABLE | PIPE_CRC_SOURCE_DP_C_VLV;
 -              need_stable_symbols = true;
 -              break;
 -      case INTEL_PIPE_CRC_SOURCE_DP_D:
 -              if (!IS_CHERRYVIEW(dev_priv))
 -                      return -EINVAL;
 -              *val = PIPE_CRC_ENABLE | PIPE_CRC_SOURCE_DP_D_VLV;
 -              need_stable_symbols = true;
 -              break;
 -      case INTEL_PIPE_CRC_SOURCE_NONE:
 -              *val = 0;
 -              break;
 -      default:
 -              return -EINVAL;
 -      }
 -
 -      /*
 -       * When the pipe CRC tap point is after the transcoders we need
 -       * to tweak symbol-level features to produce a deterministic series of
 -       * symbols for a given frame. We need to reset those features only once
 -       * a frame (instead of every nth symbol):
 -       *   - DC-balance: used to ensure a better clock recovery from the data
 -       *     link (SDVO)
 -       *   - DisplayPort scrambling: used for EMI reduction
 -       */
 -      if (need_stable_symbols) {
 -              uint32_t tmp = I915_READ(PORT_DFT2_G4X);
 -
 -              tmp |= DC_BALANCE_RESET_VLV;
 -              switch (pipe) {
 -              case PIPE_A:
 -                      tmp |= PIPE_A_SCRAMBLE_RESET;
 -                      break;
 -              case PIPE_B:
 -                      tmp |= PIPE_B_SCRAMBLE_RESET;
 -                      break;
 -              case PIPE_C:
 -                      tmp |= PIPE_C_SCRAMBLE_RESET;
 -                      break;
 -              default:
 -                      return -EINVAL;
 -              }
 -              I915_WRITE(PORT_DFT2_G4X, tmp);
 -      }
 -
 -      return 0;
 -}
 -
 -static int i9xx_pipe_crc_ctl_reg(struct drm_i915_private *dev_priv,
 -                               enum pipe pipe,
 -                               enum intel_pipe_crc_source *source,
 -                               uint32_t *val)
 -{
 -      bool need_stable_symbols = false;
 -
 -      if (*source == INTEL_PIPE_CRC_SOURCE_AUTO) {
 -              int ret = i9xx_pipe_crc_auto_source(dev_priv, pipe, source);
 -              if (ret)
 -                      return ret;
 -      }
 -
 -      switch (*source) {
 -      case INTEL_PIPE_CRC_SOURCE_PIPE:
 -              *val = PIPE_CRC_ENABLE | PIPE_CRC_SOURCE_PIPE_I9XX;
 -              break;
 -      case INTEL_PIPE_CRC_SOURCE_TV:
 -              if (!SUPPORTS_TV(dev_priv))
 -                      return -EINVAL;
 -              *val = PIPE_CRC_ENABLE | PIPE_CRC_SOURCE_TV_PRE;
 -              break;
 -      case INTEL_PIPE_CRC_SOURCE_DP_B:
 -              if (!IS_G4X(dev_priv))
 -                      return -EINVAL;
 -              *val = PIPE_CRC_ENABLE | PIPE_CRC_SOURCE_DP_B_G4X;
 -              need_stable_symbols = true;
 -              break;
 -      case INTEL_PIPE_CRC_SOURCE_DP_C:
 -              if (!IS_G4X(dev_priv))
 -                      return -EINVAL;
 -              *val = PIPE_CRC_ENABLE | PIPE_CRC_SOURCE_DP_C_G4X;
 -              need_stable_symbols = true;
 -              break;
 -      case INTEL_PIPE_CRC_SOURCE_DP_D:
 -              if (!IS_G4X(dev_priv))
 -                      return -EINVAL;
 -              *val = PIPE_CRC_ENABLE | PIPE_CRC_SOURCE_DP_D_G4X;
 -              need_stable_symbols = true;
 -              break;
 -      case INTEL_PIPE_CRC_SOURCE_NONE:
 -              *val = 0;
 -              break;
 -      default:
 -              return -EINVAL;
 -      }
 -
 -      /*
 -       * When the pipe CRC tap point is after the transcoders we need
 -       * to tweak symbol-level features to produce a deterministic series of
 -       * symbols for a given frame. We need to reset those features only once
 -       * a frame (instead of every nth symbol):
 -       *   - DC-balance: used to ensure a better clock recovery from the data
 -       *     link (SDVO)
 -       *   - DisplayPort scrambling: used for EMI reduction
 -       */
 -      if (need_stable_symbols) {
 -              uint32_t tmp = I915_READ(PORT_DFT2_G4X);
 -
 -              WARN_ON(!IS_G4X(dev_priv));
 -
 -              I915_WRITE(PORT_DFT_I9XX,
 -                         I915_READ(PORT_DFT_I9XX) | DC_BALANCE_RESET);
 -
 -              if (pipe == PIPE_A)
 -                      tmp |= PIPE_A_SCRAMBLE_RESET;
 -              else
 -                      tmp |= PIPE_B_SCRAMBLE_RESET;
 -
 -              I915_WRITE(PORT_DFT2_G4X, tmp);
 -      }
 -
 -      return 0;
 -}
 -
 -static void vlv_undo_pipe_scramble_reset(struct drm_i915_private *dev_priv,
 -                                       enum pipe pipe)
 -{
 -      uint32_t tmp = I915_READ(PORT_DFT2_G4X);
 -
 -      switch (pipe) {
 -      case PIPE_A:
 -              tmp &= ~PIPE_A_SCRAMBLE_RESET;
 -              break;
 -      case PIPE_B:
 -              tmp &= ~PIPE_B_SCRAMBLE_RESET;
 -              break;
 -      case PIPE_C:
 -              tmp &= ~PIPE_C_SCRAMBLE_RESET;
 -              break;
 -      default:
 -              return;
 -      }
 -      if (!(tmp & PIPE_SCRAMBLE_RESET_MASK))
 -              tmp &= ~DC_BALANCE_RESET_VLV;
 -      I915_WRITE(PORT_DFT2_G4X, tmp);
 -
 -}
 -
 -static void g4x_undo_pipe_scramble_reset(struct drm_i915_private *dev_priv,
 -                                       enum pipe pipe)
 -{
 -      uint32_t tmp = I915_READ(PORT_DFT2_G4X);
 -
 -      if (pipe == PIPE_A)
 -              tmp &= ~PIPE_A_SCRAMBLE_RESET;
 -      else
 -              tmp &= ~PIPE_B_SCRAMBLE_RESET;
 -      I915_WRITE(PORT_DFT2_G4X, tmp);
 -
 -      if (!(tmp & PIPE_SCRAMBLE_RESET_MASK)) {
 -              I915_WRITE(PORT_DFT_I9XX,
 -                         I915_READ(PORT_DFT_I9XX) & ~DC_BALANCE_RESET);
 -      }
 -}
 -
 -static int ilk_pipe_crc_ctl_reg(enum intel_pipe_crc_source *source,
 -                              uint32_t *val)
 -{
 -      if (*source == INTEL_PIPE_CRC_SOURCE_AUTO)
 -              *source = INTEL_PIPE_CRC_SOURCE_PIPE;
 -
 -      switch (*source) {
 -      case INTEL_PIPE_CRC_SOURCE_PLANE1:
 -              *val = PIPE_CRC_ENABLE | PIPE_CRC_SOURCE_PRIMARY_ILK;
 -              break;
 -      case INTEL_PIPE_CRC_SOURCE_PLANE2:
 -              *val = PIPE_CRC_ENABLE | PIPE_CRC_SOURCE_SPRITE_ILK;
 -              break;
 -      case INTEL_PIPE_CRC_SOURCE_PIPE:
 -              *val = PIPE_CRC_ENABLE | PIPE_CRC_SOURCE_PIPE_ILK;
 -              break;
 -      case INTEL_PIPE_CRC_SOURCE_NONE:
 -              *val = 0;
 -              break;
 -      default:
 -              return -EINVAL;
 -      }
 -
 -      return 0;
 -}
 -
 -static void hsw_trans_edp_pipe_A_crc_wa(struct drm_i915_private *dev_priv,
 -                                      bool enable)
 -{
 -      struct drm_device *dev = &dev_priv->drm;
 -      struct intel_crtc *crtc = intel_get_crtc_for_pipe(dev_priv, PIPE_A);
 -      struct intel_crtc_state *pipe_config;
 -      struct drm_atomic_state *state;
 -      int ret = 0;
 -
 -      drm_modeset_lock_all(dev);
 -      state = drm_atomic_state_alloc(dev);
 -      if (!state) {
 -              ret = -ENOMEM;
 -              goto out;
 -      }
 -
 -      state->acquire_ctx = drm_modeset_legacy_acquire_ctx(&crtc->base);
 -      pipe_config = intel_atomic_get_crtc_state(state, crtc);
 -      if (IS_ERR(pipe_config)) {
 -              ret = PTR_ERR(pipe_config);
 -              goto out;
 -      }
 -
 -      pipe_config->pch_pfit.force_thru = enable;
 -      if (pipe_config->cpu_transcoder == TRANSCODER_EDP &&
 -          pipe_config->pch_pfit.enabled != enable)
 -              pipe_config->base.connectors_changed = true;
 -
 -      ret = drm_atomic_commit(state);
 -out:
 -      WARN(ret, "Toggling workaround to %i returns %i\n", enable, ret);
 -      drm_modeset_unlock_all(dev);
 -      drm_atomic_state_put(state);
 -}
 -
 -static int ivb_pipe_crc_ctl_reg(struct drm_i915_private *dev_priv,
 -                              enum pipe pipe,
 -                              enum intel_pipe_crc_source *source,
 -                              uint32_t *val)
 -{
 -      if (*source == INTEL_PIPE_CRC_SOURCE_AUTO)
 -              *source = INTEL_PIPE_CRC_SOURCE_PF;
 -
 -      switch (*source) {
 -      case INTEL_PIPE_CRC_SOURCE_PLANE1:
 -              *val = PIPE_CRC_ENABLE | PIPE_CRC_SOURCE_PRIMARY_IVB;
 -              break;
 -      case INTEL_PIPE_CRC_SOURCE_PLANE2:
 -              *val = PIPE_CRC_ENABLE | PIPE_CRC_SOURCE_SPRITE_IVB;
 -              break;
 -      case INTEL_PIPE_CRC_SOURCE_PF:
 -              if (IS_HASWELL(dev_priv) && pipe == PIPE_A)
 -                      hsw_trans_edp_pipe_A_crc_wa(dev_priv, true);
 -
 -              *val = PIPE_CRC_ENABLE | PIPE_CRC_SOURCE_PF_IVB;
 -              break;
 -      case INTEL_PIPE_CRC_SOURCE_NONE:
 -              *val = 0;
 -              break;
 -      default:
 -              return -EINVAL;
 -      }
 -
 -      return 0;
 -}
 -
 -static int pipe_crc_set_source(struct drm_i915_private *dev_priv,
 -                             enum pipe pipe,
 -                             enum intel_pipe_crc_source source)
 -{
 -      struct intel_pipe_crc *pipe_crc = &dev_priv->pipe_crc[pipe];
 -      struct intel_crtc *crtc = intel_get_crtc_for_pipe(dev_priv, pipe);
 -      enum intel_display_power_domain power_domain;
 -      u32 val = 0; /* shut up gcc */
 -      int ret;
 -
 -      if (pipe_crc->source == source)
 -              return 0;
 -
 -      /* forbid changing the source without going back to 'none' */
 -      if (pipe_crc->source && source)
 -              return -EINVAL;
 -
 -      power_domain = POWER_DOMAIN_PIPE(pipe);
 -      if (!intel_display_power_get_if_enabled(dev_priv, power_domain)) {
 -              DRM_DEBUG_KMS("Trying to capture CRC while pipe is off\n");
 -              return -EIO;
 -      }
 -
 -      if (IS_GEN2(dev_priv))
 -              ret = i8xx_pipe_crc_ctl_reg(&source, &val);
 -      else if (INTEL_GEN(dev_priv) < 5)
 -              ret = i9xx_pipe_crc_ctl_reg(dev_priv, pipe, &source, &val);
 -      else if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv))
 -              ret = vlv_pipe_crc_ctl_reg(dev_priv, pipe, &source, &val);
 -      else if (IS_GEN5(dev_priv) || IS_GEN6(dev_priv))
 -              ret = ilk_pipe_crc_ctl_reg(&source, &val);
 -      else
 -              ret = ivb_pipe_crc_ctl_reg(dev_priv, pipe, &source, &val);
 -
 -      if (ret != 0)
 -              goto out;
 -
 -      /* none -> real source transition */
 -      if (source) {
 -              struct intel_pipe_crc_entry *entries;
 -
 -              DRM_DEBUG_DRIVER("collecting CRCs for pipe %c, %s\n",
 -                               pipe_name(pipe), pipe_crc_source_name(source));
 -
 -              entries = kcalloc(INTEL_PIPE_CRC_ENTRIES_NR,
 -                                sizeof(pipe_crc->entries[0]),
 -                                GFP_KERNEL);
 -              if (!entries) {
 -                      ret = -ENOMEM;
 -                      goto out;
 -              }
 -
 -              /*
 -               * When IPS gets enabled, the pipe CRC changes. Since IPS gets
 -               * enabled and disabled dynamically based on package C states,
 -               * user space can't make reliable use of the CRCs, so let's just
 -               * completely disable it.
 -               */
 -              hsw_disable_ips(crtc);
 -
 -              spin_lock_irq(&pipe_crc->lock);
 -              kfree(pipe_crc->entries);
 -              pipe_crc->entries = entries;
 -              pipe_crc->head = 0;
 -              pipe_crc->tail = 0;
 -              spin_unlock_irq(&pipe_crc->lock);
 -      }
 -
 -      pipe_crc->source = source;
 -
 -      I915_WRITE(PIPE_CRC_CTL(pipe), val);
 -      POSTING_READ(PIPE_CRC_CTL(pipe));
 -
 -      /* real source -> none transition */
 -      if (source == INTEL_PIPE_CRC_SOURCE_NONE) {
 -              struct intel_pipe_crc_entry *entries;
 -              struct intel_crtc *crtc = intel_get_crtc_for_pipe(dev_priv,
 -                                                                pipe);
 -
 -              DRM_DEBUG_DRIVER("stopping CRCs for pipe %c\n",
 -                               pipe_name(pipe));
 -
 -              drm_modeset_lock(&crtc->base.mutex, NULL);
 -              if (crtc->base.state->active)
 -                      intel_wait_for_vblank(dev_priv, pipe);
 -              drm_modeset_unlock(&crtc->base.mutex);
 -
 -              spin_lock_irq(&pipe_crc->lock);
 -              entries = pipe_crc->entries;
 -              pipe_crc->entries = NULL;
 -              pipe_crc->head = 0;
 -              pipe_crc->tail = 0;
 -              spin_unlock_irq(&pipe_crc->lock);
 -
 -              kfree(entries);
 -
 -              if (IS_G4X(dev_priv))
 -                      g4x_undo_pipe_scramble_reset(dev_priv, pipe);
 -              else if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv))
 -                      vlv_undo_pipe_scramble_reset(dev_priv, pipe);
 -              else if (IS_HASWELL(dev_priv) && pipe == PIPE_A)
 -                      hsw_trans_edp_pipe_A_crc_wa(dev_priv, false);
 -
 -              hsw_enable_ips(crtc);
 -      }
 -
 -      ret = 0;
 -
 -out:
 -      intel_display_power_put(dev_priv, power_domain);
 -
 -      return ret;
 -}
 -
 -/*
 - * Parse pipe CRC command strings:
 - *   command: wsp* object wsp+ name wsp+ source wsp*
 - *   object: 'pipe'
 - *   name: (A | B | C)
 - *   source: (none | plane1 | plane2 | pf)
 - *   wsp: (#0x20 | #0x9 | #0xA)+
 - *
 - * eg.:
 - *  "pipe A plane1"  ->  Start CRC computations on plane1 of pipe A
 - *  "pipe A none"    ->  Stop CRC
 - */
 -static int display_crc_ctl_tokenize(char *buf, char *words[], int max_words)
 -{
 -      int n_words = 0;
 -
 -      while (*buf) {
 -              char *end;
 -
 -              /* skip leading white space */
 -              buf = skip_spaces(buf);
 -              if (!*buf)
 -                      break;  /* end of buffer */
 -
 -              /* find end of word */
 -              for (end = buf; *end && !isspace(*end); end++)
 -                      ;
 -
 -              if (n_words == max_words) {
 -                      DRM_DEBUG_DRIVER("too many words, allowed <= %d\n",
 -                                       max_words);
 -                      return -EINVAL; /* ran out of words[] before bytes */
 -              }
 -
 -              if (*end)
 -                      *end++ = '\0';
 -              words[n_words++] = buf;
 -              buf = end;
 -      }
 -
 -      return n_words;
 -}
 -
 -enum intel_pipe_crc_object {
 -      PIPE_CRC_OBJECT_PIPE,
 -};
 -
 -static const char * const pipe_crc_objects[] = {
 -      "pipe",
 -};
 -
 -static int
 -display_crc_ctl_parse_object(const char *buf, enum intel_pipe_crc_object *o)
 -{
 -      int i;
 -
 -      for (i = 0; i < ARRAY_SIZE(pipe_crc_objects); i++)
 -              if (!strcmp(buf, pipe_crc_objects[i])) {
 -                      *o = i;
 -                      return 0;
 -                  }
 -
 -      return -EINVAL;
 -}
 -
 -static int display_crc_ctl_parse_pipe(const char *buf, enum pipe *pipe)
 -{
 -      const char name = buf[0];
 -
 -      if (name < 'A' || name >= pipe_name(I915_MAX_PIPES))
 -              return -EINVAL;
 -
 -      *pipe = name - 'A';
 -
 -      return 0;
 -}
 -
 -static int
 -display_crc_ctl_parse_source(const char *buf, enum intel_pipe_crc_source *s)
 -{
 -      int i;
 -
 -      for (i = 0; i < ARRAY_SIZE(pipe_crc_sources); i++)
 -              if (!strcmp(buf, pipe_crc_sources[i])) {
 -                      *s = i;
 -                      return 0;
 -                  }
 -
 -      return -EINVAL;
 -}
 -
 -static int display_crc_ctl_parse(struct drm_i915_private *dev_priv,
 -                               char *buf, size_t len)
 -{
 -#define N_WORDS 3
 -      int n_words;
 -      char *words[N_WORDS];
 -      enum pipe pipe;
 -      enum intel_pipe_crc_object object;
 -      enum intel_pipe_crc_source source;
 -
 -      n_words = display_crc_ctl_tokenize(buf, words, N_WORDS);
 -      if (n_words != N_WORDS) {
 -              DRM_DEBUG_DRIVER("tokenize failed, a command is %d words\n",
 -                               N_WORDS);
 -              return -EINVAL;
 -      }
 -
 -      if (display_crc_ctl_parse_object(words[0], &object) < 0) {
 -              DRM_DEBUG_DRIVER("unknown object %s\n", words[0]);
 -              return -EINVAL;
 -      }
 -
 -      if (display_crc_ctl_parse_pipe(words[1], &pipe) < 0) {
 -              DRM_DEBUG_DRIVER("unknown pipe %s\n", words[1]);
 -              return -EINVAL;
 -      }
 -
 -      if (display_crc_ctl_parse_source(words[2], &source) < 0) {
 -              DRM_DEBUG_DRIVER("unknown source %s\n", words[2]);
 -              return -EINVAL;
 -      }
 -
 -      return pipe_crc_set_source(dev_priv, pipe, source);
 -}
 -
 -static ssize_t display_crc_ctl_write(struct file *file, const char __user *ubuf,
 -                                   size_t len, loff_t *offp)
 -{
 -      struct seq_file *m = file->private_data;
 -      struct drm_i915_private *dev_priv = m->private;
 -      char *tmpbuf;
 -      int ret;
 -
 -      if (len == 0)
 -              return 0;
 -
 -      if (len > PAGE_SIZE - 1) {
 -              DRM_DEBUG_DRIVER("expected <%lu bytes into pipe crc control\n",
 -                               PAGE_SIZE);
 -              return -E2BIG;
 -      }
 -
 -      tmpbuf = kmalloc(len + 1, GFP_KERNEL);
 -      if (!tmpbuf)
 -              return -ENOMEM;
 -
 -      if (copy_from_user(tmpbuf, ubuf, len)) {
 -              ret = -EFAULT;
 -              goto out;
 -      }
 -      tmpbuf[len] = '\0';
 -
 -      ret = display_crc_ctl_parse(dev_priv, tmpbuf, len);
 -
 -out:
 -      kfree(tmpbuf);
 -      if (ret < 0)
 -              return ret;
 -
 -      *offp += len;
 -      return len;
 -}
 -
 -static const struct file_operations i915_display_crc_ctl_fops = {
 -      .owner = THIS_MODULE,
 -      .open = display_crc_ctl_open,
 -      .read = seq_read,
 -      .llseek = seq_lseek,
 -      .release = single_release,
 -      .write = display_crc_ctl_write
 -};
 -
  static ssize_t i915_displayport_test_active_write(struct file *file,
                                                  const char __user *ubuf,
                                                  size_t len, loff_t *offp)
                         * testing code, only accept an actual value of 1 here
                         */
                        if (val == 1)
 -                              intel_dp->compliance_test_active = 1;
 +                              intel_dp->compliance.test_active = 1;
                        else
 -                              intel_dp->compliance_test_active = 0;
 +                              intel_dp->compliance.test_active = 0;
                }
        }
  out:
@@@ -3641,7 -4476,7 +3642,7 @@@ static int i915_displayport_test_active
                if (connector->status == connector_status_connected &&
                    connector->encoder != NULL) {
                        intel_dp = enc_to_intel_dp(connector->encoder);
 -                      if (intel_dp->compliance_test_active)
 +                      if (intel_dp->compliance.test_active)
                                seq_puts(m, "1");
                        else
                                seq_puts(m, "0");
@@@ -3685,7 -4520,7 +3686,7 @@@ static int i915_displayport_test_data_s
                if (connector->status == connector_status_connected &&
                    connector->encoder != NULL) {
                        intel_dp = enc_to_intel_dp(connector->encoder);
 -                      seq_printf(m, "%lx", intel_dp->compliance_test_data);
 +                      seq_printf(m, "%lx", intel_dp->compliance.test_data.edid);
                } else
                        seq_puts(m, "0");
        }
@@@ -3724,7 -4559,7 +3725,7 @@@ static int i915_displayport_test_type_s
                if (connector->status == connector_status_connected &&
                    connector->encoder != NULL) {
                        intel_dp = enc_to_intel_dp(connector->encoder);
 -                      seq_printf(m, "%02lx", intel_dp->compliance_test_type);
 +                      seq_printf(m, "%02lx", intel_dp->compliance.test_type);
                } else
                        seq_puts(m, "0");
        }
@@@ -4123,7 -4958,7 +4124,7 @@@ unlock
  
        if (val & DROP_FREED) {
                synchronize_rcu();
 -              flush_work(&dev_priv->mm.free_work);
 +              i915_gem_drain_freed_objects(dev_priv);
        }
  
        return ret;
@@@ -4330,7 -5165,7 +4331,7 @@@ static void gen9_sseu_device_status(str
        u32 s_reg[s_max], eu_reg[2*s_max], eu_mask[2];
  
        /* BXT has a single slice and at most 3 subslices. */
 -      if (IS_BROXTON(dev_priv)) {
 +      if (IS_GEN9_LP(dev_priv)) {
                s_max = 1;
                ss_max = 3;
        }
                for (ss = 0; ss < ss_max; ss++) {
                        unsigned int eu_cnt;
  
 -                      if (IS_BROXTON(dev_priv)) {
 +                      if (IS_GEN9_LP(dev_priv)) {
                                if (!(s_reg[s] & (GEN9_PGCTL_SS_ACK(ss))))
                                        /* skip disabled subslice */
                                        continue;
@@@ -4615,6 -5450,19 +4616,6 @@@ static const struct i915_debugfs_files 
        {"i915_guc_log_control", &i915_guc_log_control_fops}
  };
  
 -void intel_display_crc_init(struct drm_i915_private *dev_priv)
 -{
 -      enum pipe pipe;
 -
 -      for_each_pipe(dev_priv, pipe) {
 -              struct intel_pipe_crc *pipe_crc = &dev_priv->pipe_crc[pipe];
 -
 -              pipe_crc->opened = false;
 -              spin_lock_init(&pipe_crc->lock);
 -              init_waitqueue_head(&pipe_crc->wq);
 -      }
 -}
 -
  int i915_debugfs_register(struct drm_i915_private *dev_priv)
  {
        struct drm_minor *minor = dev_priv->drm.primary;
        if (ret)
                return ret;
  
 -      for (i = 0; i < ARRAY_SIZE(i915_pipe_crc_data); i++) {
 -              ret = i915_pipe_crc_create(minor->debugfs_root, minor, i);
 -              if (ret)
 -                      return ret;
 -      }
 +      ret = intel_pipe_crc_create(minor);
 +      if (ret)
 +              return ret;
  
        for (i = 0; i < ARRAY_SIZE(i915_debugfs_files); i++) {
                ret = i915_debugfs_create(minor->debugfs_root, minor,
@@@ -4652,7 -5502,12 +4653,7 @@@ void i915_debugfs_unregister(struct drm
        drm_debugfs_remove_files((struct drm_info_list *)&i915_forcewake_fops,
                                 1, minor);
  
 -      for (i = 0; i < ARRAY_SIZE(i915_pipe_crc_data); i++) {
 -              struct drm_info_list *info_list =
 -                      (struct drm_info_list *)&i915_pipe_crc_data[i];
 -
 -              drm_debugfs_remove_files(info_list, 1, minor);
 -      }
 +      intel_pipe_crc_cleanup(minor);
  
        for (i = 0; i < ARRAY_SIZE(i915_debugfs_files); i++) {
                struct drm_info_list *info_list =
  
  #include "intel_bios.h"
  #include "intel_dpll_mgr.h"
 -#include "intel_guc.h"
 +#include "intel_uc.h"
  #include "intel_lrc.h"
  #include "intel_ringbuffer.h"
  
  #include "i915_gem.h"
 +#include "i915_gem_context.h"
  #include "i915_gem_fence_reg.h"
  #include "i915_gem_object.h"
  #include "i915_gem_gtt.h"
@@@ -77,8 -76,8 +77,8 @@@
  
  #define DRIVER_NAME           "i915"
  #define DRIVER_DESC           "Intel Graphics"
 -#define DRIVER_DATE           "20161121"
 -#define DRIVER_TIMESTAMP      1479717903
 +#define DRIVER_DATE           "20161226"
 +#define DRIVER_TIMESTAMP      1482767304
  
  #undef WARN_ON
  /* Many gcc seem to no see through this and fall over :( */
@@@ -120,90 -119,6 +120,90 @@@ bool __i915_inject_load_failure(const c
  #define i915_inject_load_failure() \
        __i915_inject_load_failure(__func__, __LINE__)
  
 +typedef struct {
 +      uint32_t val;
 +} uint_fixed_16_16_t;
 +
 +#define FP_16_16_MAX ({ \
 +      uint_fixed_16_16_t fp; \
 +      fp.val = UINT_MAX; \
 +      fp; \
 +})
 +
 +static inline uint_fixed_16_16_t u32_to_fixed_16_16(uint32_t val)
 +{
 +      uint_fixed_16_16_t fp;
 +
 +      WARN_ON(val >> 16);
 +
 +      fp.val = val << 16;
 +      return fp;
 +}
 +
 +static inline uint32_t fixed_16_16_to_u32_round_up(uint_fixed_16_16_t fp)
 +{
 +      return DIV_ROUND_UP(fp.val, 1 << 16);
 +}
 +
 +static inline uint32_t fixed_16_16_to_u32(uint_fixed_16_16_t fp)
 +{
 +      return fp.val >> 16;
 +}
 +
 +static inline uint_fixed_16_16_t min_fixed_16_16(uint_fixed_16_16_t min1,
 +                                               uint_fixed_16_16_t min2)
 +{
 +      uint_fixed_16_16_t min;
 +
 +      min.val = min(min1.val, min2.val);
 +      return min;
 +}
 +
 +static inline uint_fixed_16_16_t max_fixed_16_16(uint_fixed_16_16_t max1,
 +                                               uint_fixed_16_16_t max2)
 +{
 +      uint_fixed_16_16_t max;
 +
 +      max.val = max(max1.val, max2.val);
 +      return max;
 +}
 +
 +static inline uint_fixed_16_16_t fixed_16_16_div_round_up(uint32_t val,
 +                                                        uint32_t d)
 +{
 +      uint_fixed_16_16_t fp, res;
 +
 +      fp = u32_to_fixed_16_16(val);
 +      res.val = DIV_ROUND_UP(fp.val, d);
 +      return res;
 +}
 +
 +static inline uint_fixed_16_16_t fixed_16_16_div_round_up_u64(uint32_t val,
 +                                                            uint32_t d)
 +{
 +      uint_fixed_16_16_t res;
 +      uint64_t interm_val;
 +
 +      interm_val = (uint64_t)val << 16;
 +      interm_val = DIV_ROUND_UP_ULL(interm_val, d);
 +      WARN_ON(interm_val >> 32);
 +      res.val = (uint32_t) interm_val;
 +
 +      return res;
 +}
 +
 +static inline uint_fixed_16_16_t mul_u32_fixed_16_16(uint32_t val,
 +                                                   uint_fixed_16_16_t mul)
 +{
 +      uint64_t intermediate_val;
 +      uint_fixed_16_16_t fp;
 +
 +      intermediate_val = (uint64_t) val * mul.val;
 +      WARN_ON(intermediate_val >> 32);
 +      fp.val = (uint32_t) intermediate_val;
 +      return fp;
 +}
 +
  static inline const char *yesno(bool v)
  {
        return v ? "yes" : "no";
@@@ -219,18 -134,6 +219,18 @@@ static inline const char *enableddisabl
        return v ? "enabled" : "disabled";
  }
  
 +#define range_overflows(start, size, max) ({ \
 +      typeof(start) start__ = (start); \
 +      typeof(size) size__ = (size); \
 +      typeof(max) max__ = (max); \
 +      (void)(&start__ == &size__); \
 +      (void)(&start__ == &max__); \
 +      start__ > max__ || size__ > max__ - start__; \
 +})
 +
 +#define range_overflows_t(type, start, size, max) \
 +      range_overflows((type)(start), (type)(size), (type)(max))
 +
  enum pipe {
        INVALID_PIPE = -1,
        PIPE_A = 0,
@@@ -277,39 -180,21 +277,39 @@@ static inline bool transcoder_is_dsi(en
  }
  
  /*
 + * Global legacy plane identifier. Valid only for primary/sprite
 + * planes on pre-g4x, and only for primary planes on g4x+.
 + */
 +enum plane {
 +      PLANE_A,
 +      PLANE_B,
 +      PLANE_C,
 +};
 +#define plane_name(p) ((p) + 'A')
 +
 +#define sprite_name(p, s) ((p) * INTEL_INFO(dev_priv)->num_sprites[(p)] + (s) + 'A')
 +
 +/*
 + * Per-pipe plane identifier.
   * I915_MAX_PLANES in the enum below is the maximum (across all platforms)
   * number of planes per CRTC.  Not all platforms really have this many planes,
   * which means some arrays of size I915_MAX_PLANES may have unused entries
   * between the topmost sprite plane and the cursor plane.
 + *
 + * This is expected to be passed to various register macros
 + * (eg. PLANE_CTL(), PS_PLANE_SEL(), etc.) so adjust with care.
   */
 -enum plane {
 -      PLANE_A = 0,
 -      PLANE_B,
 -      PLANE_C,
 +enum plane_id {
 +      PLANE_PRIMARY,
 +      PLANE_SPRITE0,
 +      PLANE_SPRITE1,
        PLANE_CURSOR,
        I915_MAX_PLANES,
  };
 -#define plane_name(p) ((p) + 'A')
  
 -#define sprite_name(p, s) ((p) * INTEL_INFO(dev_priv)->num_sprites[(p)] + (s) + 'A')
 +#define for_each_plane_id_on_crtc(__crtc, __p) \
 +      for ((__p) = PLANE_PRIMARY; (__p) < I915_MAX_PLANES; (__p)++) \
 +              for_each_if ((__crtc)->plane_ids_mask & BIT(__p))
  
  enum port {
        PORT_NONE = -1,
@@@ -331,8 -216,7 +331,8 @@@ enum dpio_channel 
  
  enum dpio_phy {
        DPIO_PHY0,
 -      DPIO_PHY1
 +      DPIO_PHY1,
 +      DPIO_PHY2,
  };
  
  enum intel_display_power_domain {
@@@ -532,15 -416,6 +532,15 @@@ struct drm_i915_file_private 
        } rps;
  
        unsigned int bsd_engine;
 +
 +/* Client can have a maximum of 3 contexts banned before
 + * it is denied of creating new contexts. As one context
 + * ban needs 4 consecutive hangs, and more if there is
 + * progress in between, this is a last resort stop gap measure
 + * to limit the badly behaving clients access to gpu.
 + */
 +#define I915_MAX_CLIENT_CONTEXT_BANS 3
 +      int context_bans;
  };
  
  /* Used by dp and fdi links */
@@@ -784,20 -659,32 +784,20 @@@ struct intel_csr 
  };
  
  #define DEV_INFO_FOR_EACH_FLAG(func) \
 -      /* Keep is_* in chronological order */ \
        func(is_mobile); \
 -      func(is_i85x); \
 -      func(is_i915g); \
 -      func(is_i945gm); \
 -      func(is_g33); \
 -      func(is_g4x); \
 -      func(is_pineview); \
 -      func(is_broadwater); \
 -      func(is_crestline); \
 -      func(is_ivybridge); \
 -      func(is_valleyview); \
 -      func(is_cherryview); \
 -      func(is_haswell); \
 -      func(is_broadwell); \
 -      func(is_skylake); \
 -      func(is_broxton); \
 -      func(is_kabylake); \
 +      func(is_lp); \
        func(is_alpha_support); \
        /* Keep has_* in alphabetical order */ \
        func(has_64bit_reloc); \
 +      func(has_aliasing_ppgtt); \
        func(has_csr); \
        func(has_ddi); \
 +      func(has_decoupled_mmio); \
        func(has_dp_mst); \
        func(has_fbc); \
        func(has_fpga_dbg); \
 +      func(has_full_ppgtt); \
 +      func(has_full_48bit_ppgtt); \
        func(has_gmbus_irq); \
        func(has_gmch_display); \
        func(has_guc); \
        func(cursor_needs_physical); \
        func(hws_needs_physical); \
        func(overlay_needs_physical); \
 -      func(supports_tv); \
 -      func(has_decoupled_mmio)
 +      func(supports_tv);
  
  struct sseu_dev_info {
        u8 slice_mask;
@@@ -838,45 -726,13 +838,45 @@@ static inline unsigned int sseu_subslic
        return hweight8(sseu->slice_mask) * hweight8(sseu->subslice_mask);
  }
  
 +/* Keep in gen based order, and chronological order within a gen */
 +enum intel_platform {
 +      INTEL_PLATFORM_UNINITIALIZED = 0,
 +      INTEL_I830,
 +      INTEL_I845G,
 +      INTEL_I85X,
 +      INTEL_I865G,
 +      INTEL_I915G,
 +      INTEL_I915GM,
 +      INTEL_I945G,
 +      INTEL_I945GM,
 +      INTEL_G33,
 +      INTEL_PINEVIEW,
 +      INTEL_I965G,
 +      INTEL_I965GM,
 +      INTEL_G45,
 +      INTEL_GM45,
 +      INTEL_IRONLAKE,
 +      INTEL_SANDYBRIDGE,
 +      INTEL_IVYBRIDGE,
 +      INTEL_VALLEYVIEW,
 +      INTEL_HASWELL,
 +      INTEL_BROADWELL,
 +      INTEL_CHERRYVIEW,
 +      INTEL_SKYLAKE,
 +      INTEL_BROXTON,
 +      INTEL_KABYLAKE,
 +      INTEL_GEMINILAKE,
 +};
 +
  struct intel_device_info {
        u32 display_mmio_offset;
        u16 device_id;
        u8 num_pipes;
        u8 num_sprites[I915_MAX_PIPES];
 +      u8 num_scalers[I915_MAX_PIPES];
        u8 gen;
        u16 gen_mask;
 +      enum intel_platform platform;
        u8 ring_mask; /* Rings supported by the HW */
        u8 num_rings;
  #define DEFINE_FLAG(name) u8 name:1
@@@ -944,8 -800,7 +944,8 @@@ struct drm_i915_error_state 
                /* Software tracked state */
                bool waiting;
                int num_waiters;
 -              int hangcheck_score;
 +              unsigned long hangcheck_timestamp;
 +              bool hangcheck_stalled;
                enum intel_engine_hangcheck_action hangcheck_action;
                struct i915_address_space *vm;
                int num_requests;
                        long jiffies;
                        pid_t pid;
                        u32 context;
 +                      int ban_score;
                        u32 seqno;
                        u32 head;
                        u32 tail;
  
                pid_t pid;
                char comm[TASK_COMM_LEN];
 +              int context_bans;
        } engine[I915_NUM_ENGINES];
  
        struct drm_i915_error_buffer {
@@@ -1048,7 -901,86 +1048,7 @@@ enum i915_cache_level 
        I915_CACHE_WT, /* hsw:gt3e WriteThrough for scanouts */
  };
  
 -struct i915_ctx_hang_stats {
 -      /* This context had batch pending when hang was declared */
 -      unsigned batch_pending;
 -
 -      /* This context had batch active when hang was declared */
 -      unsigned batch_active;
 -
 -      /* Time when this context was last blamed for a GPU reset */
 -      unsigned long guilty_ts;
 -
 -      /* If the contexts causes a second GPU hang within this time,
 -       * it is permanently banned from submitting any more work.
 -       */
 -      unsigned long ban_period_seconds;
 -
 -      /* This context is banned to submit more work */
 -      bool banned;
 -};
 -
 -/* This must match up with the value previously used for execbuf2.rsvd1. */
 -#define DEFAULT_CONTEXT_HANDLE 0
 -
 -/**
 - * struct i915_gem_context - as the name implies, represents a context.
 - * @ref: reference count.
 - * @user_handle: userspace tracking identity for this context.
 - * @remap_slice: l3 row remapping information.
 - * @flags: context specific flags:
 - *         CONTEXT_NO_ZEROMAP: do not allow mapping things to page 0.
 - * @file_priv: filp associated with this context (NULL for global default
 - *           context).
 - * @hang_stats: information about the role of this context in possible GPU
 - *            hangs.
 - * @ppgtt: virtual memory space used by this context.
 - * @legacy_hw_ctx: render context backing object and whether it is correctly
 - *                initialized (legacy ring submission mechanism only).
 - * @link: link in the global list of contexts.
 - *
 - * Contexts are memory images used by the hardware to store copies of their
 - * internal state.
 - */
 -struct i915_gem_context {
 -      struct kref ref;
 -      struct drm_i915_private *i915;
 -      struct drm_i915_file_private *file_priv;
 -      struct i915_hw_ppgtt *ppgtt;
 -      struct pid *pid;
 -      const char *name;
 -
 -      struct i915_ctx_hang_stats hang_stats;
 -
 -      unsigned long flags;
 -#define CONTEXT_NO_ZEROMAP            BIT(0)
 -#define CONTEXT_NO_ERROR_CAPTURE      BIT(1)
 -
 -      /* Unique identifier for this context, used by the hw for tracking */
 -      unsigned int hw_id;
 -      u32 user_handle;
 -      int priority; /* greater priorities are serviced first */
 -
 -      u32 ggtt_alignment;
 -
 -      struct intel_context {
 -              struct i915_vma *state;
 -              struct intel_ring *ring;
 -              uint32_t *lrc_reg_state;
 -              u64 lrc_desc;
 -              int pin_count;
 -              bool initialised;
 -      } engine[I915_NUM_ENGINES];
 -      u32 ring_size;
 -      u32 desc_template;
 -      struct atomic_notifier_head status_notifier;
 -      bool execlists_force_single_submission;
 -
 -      struct list_head link;
 -
 -      u8 remap_slice;
 -      bool closed:1;
 -};
 +#define I915_COLOR_UNEVICTABLE (-1) /* a non-vma sharing the address space */
  
  enum fb_op_origin {
        ORIGIN_GTT,
@@@ -1094,7 -1026,7 +1094,7 @@@ struct intel_fbc 
  
                struct {
                        u64 ilk_ggtt_offset;
-                       uint32_t pixel_format;
+                       const struct drm_format_info *format;
                        unsigned int stride;
                        int fence_reg;
                        unsigned int tiling_mode;
  
                struct {
                        u64 ggtt_offset;
-                       uint32_t pixel_format;
+                       const struct drm_format_info *format;
                        unsigned int stride;
                        int fence_reg;
                } fb;
        const char *no_fbc_reason;
  };
  
 -/**
 +/*
   * HIGH_RR is the highest eDP panel refresh rate read from EDID
   * LOW_RR is the lowest eDP panel refresh rate found from EDID
   * parsing for same resolution.
@@@ -1507,20 -1439,19 +1507,20 @@@ struct drm_i915_error_state_buf 
  };
  
  struct i915_error_state_file_priv {
 -      struct drm_device *dev;
 +      struct drm_i915_private *i915;
        struct drm_i915_error_state *error;
  };
  
  #define I915_RESET_TIMEOUT (10 * HZ) /* 10s */
  #define I915_FENCE_TIMEOUT (10 * HZ) /* 10s */
  
 +#define I915_ENGINE_DEAD_TIMEOUT  (4 * HZ)  /* Seqno, head and subunits dead */
 +#define I915_SEQNO_DEAD_TIMEOUT   (12 * HZ) /* Seqno dead with active head */
 +
  struct i915_gpu_error {
        /* For hangcheck timer */
  #define DRM_I915_HANGCHECK_PERIOD 1500 /* in ms */
  #define DRM_I915_HANGCHECK_JIFFIES msecs_to_jiffies(DRM_I915_HANGCHECK_PERIOD)
 -      /* Hang gpu twice in this window and your context gets banned */
 -#define DRM_I915_CTX_BAN_PERIOD DIV_ROUND_UP(8*DRM_I915_HANGCHECK_PERIOD, 1000)
  
        struct delayed_work hangcheck_work;
  
@@@ -1602,7 -1533,6 +1602,7 @@@ struct ddi_vbt_port_info 
        uint8_t supports_dvi:1;
        uint8_t supports_hdmi:1;
        uint8_t supports_dp:1;
 +      uint8_t supports_edp:1;
  
        uint8_t alternate_aux_channel;
        uint8_t alternate_ddc_pin;
@@@ -1662,7 -1592,6 +1662,7 @@@ struct intel_vbt_data 
                bool present;
                bool active_low_pwm;
                u8 min_brightness;      /* min_brightness/255 of max */
 +              u8 controller;          /* brightness controller number */
                enum intel_backlight_type type;
        } backlight;
  
@@@ -1709,22 -1638,24 +1709,22 @@@ struct ilk_wm_values 
  };
  
  struct vlv_pipe_wm {
 -      uint16_t primary;
 -      uint16_t sprite[2];
 -      uint8_t cursor;
 +      uint16_t plane[I915_MAX_PLANES];
  };
  
  struct vlv_sr_wm {
        uint16_t plane;
 -      uint8_t cursor;
 +      uint16_t cursor;
 +};
 +
 +struct vlv_wm_ddl_values {
 +      uint8_t plane[I915_MAX_PLANES];
  };
  
  struct vlv_wm_values {
        struct vlv_pipe_wm pipe[3];
        struct vlv_sr_wm sr;
 -      struct {
 -              uint8_t cursor;
 -              uint8_t sprite[2];
 -              uint8_t primary;
 -      } ddl[3];
 +      struct vlv_wm_ddl_values ddl[3];
        uint8_t level;
        bool cxsr;
  };
@@@ -1865,201 -1796,6 +1865,201 @@@ struct intel_wm_config 
        bool sprites_scaled;
  };
  
 +struct i915_oa_format {
 +      u32 format;
 +      int size;
 +};
 +
 +struct i915_oa_reg {
 +      i915_reg_t addr;
 +      u32 value;
 +};
 +
 +struct i915_perf_stream;
 +
 +/**
 + * struct i915_perf_stream_ops - the OPs to support a specific stream type
 + */
 +struct i915_perf_stream_ops {
 +      /**
 +       * @enable: Enables the collection of HW samples, either in response to
 +       * `I915_PERF_IOCTL_ENABLE` or implicitly called when stream is opened
 +       * without `I915_PERF_FLAG_DISABLED`.
 +       */
 +      void (*enable)(struct i915_perf_stream *stream);
 +
 +      /**
 +       * @disable: Disables the collection of HW samples, either in response
 +       * to `I915_PERF_IOCTL_DISABLE` or implicitly called before destroying
 +       * the stream.
 +       */
 +      void (*disable)(struct i915_perf_stream *stream);
 +
 +      /**
 +       * @poll_wait: Call poll_wait, passing a wait queue that will be woken
 +       * once there is something ready to read() for the stream
 +       */
 +      void (*poll_wait)(struct i915_perf_stream *stream,
 +                        struct file *file,
 +                        poll_table *wait);
 +
 +      /**
 +       * @wait_unlocked: For handling a blocking read, wait until there is
 +       * something to ready to read() for the stream. E.g. wait on the same
 +       * wait queue that would be passed to poll_wait().
 +       */
 +      int (*wait_unlocked)(struct i915_perf_stream *stream);
 +
 +      /**
 +       * @read: Copy buffered metrics as records to userspace
 +       * **buf**: the userspace, destination buffer
 +       * **count**: the number of bytes to copy, requested by userspace
 +       * **offset**: zero at the start of the read, updated as the read
 +       * proceeds, it represents how many bytes have been copied so far and
 +       * the buffer offset for copying the next record.
 +       *
 +       * Copy as many buffered i915 perf samples and records for this stream
 +       * to userspace as will fit in the given buffer.
 +       *
 +       * Only write complete records; returning -%ENOSPC if there isn't room
 +       * for a complete record.
 +       *
 +       * Return any error condition that results in a short read such as
 +       * -%ENOSPC or -%EFAULT, even though these may be squashed before
 +       * returning to userspace.
 +       */
 +      int (*read)(struct i915_perf_stream *stream,
 +                  char __user *buf,
 +                  size_t count,
 +                  size_t *offset);
 +
 +      /**
 +       * @destroy: Cleanup any stream specific resources.
 +       *
 +       * The stream will always be disabled before this is called.
 +       */
 +      void (*destroy)(struct i915_perf_stream *stream);
 +};
 +
 +/**
 + * struct i915_perf_stream - state for a single open stream FD
 + */
 +struct i915_perf_stream {
 +      /**
 +       * @dev_priv: i915 drm device
 +       */
 +      struct drm_i915_private *dev_priv;
 +
 +      /**
 +       * @link: Links the stream into ``&drm_i915_private->streams``
 +       */
 +      struct list_head link;
 +
 +      /**
 +       * @sample_flags: Flags representing the `DRM_I915_PERF_PROP_SAMPLE_*`
 +       * properties given when opening a stream, representing the contents
 +       * of a single sample as read() by userspace.
 +       */
 +      u32 sample_flags;
 +
 +      /**
 +       * @sample_size: Considering the configured contents of a sample
 +       * combined with the required header size, this is the total size
 +       * of a single sample record.
 +       */
 +      int sample_size;
 +
 +      /**
 +       * @ctx: %NULL if measuring system-wide across all contexts or a
 +       * specific context that is being monitored.
 +       */
 +      struct i915_gem_context *ctx;
 +
 +      /**
 +       * @enabled: Whether the stream is currently enabled, considering
 +       * whether the stream was opened in a disabled state and based
 +       * on `I915_PERF_IOCTL_ENABLE` and `I915_PERF_IOCTL_DISABLE` calls.
 +       */
 +      bool enabled;
 +
 +      /**
 +       * @ops: The callbacks providing the implementation of this specific
 +       * type of configured stream.
 +       */
 +      const struct i915_perf_stream_ops *ops;
 +};
 +
 +/**
 + * struct i915_oa_ops - Gen specific implementation of an OA unit stream
 + */
 +struct i915_oa_ops {
 +      /**
 +       * @init_oa_buffer: Resets the head and tail pointers of the
 +       * circular buffer for periodic OA reports.
 +       *
 +       * Called when first opening a stream for OA metrics, but also may be
 +       * called in response to an OA buffer overflow or other error
 +       * condition.
 +       *
 +       * Note it may be necessary to clear the full OA buffer here as part of
 +       * maintaining the invariable that new reports must be written to
 +       * zeroed memory for us to be able to reliable detect if an expected
 +       * report has not yet landed in memory.  (At least on Haswell the OA
 +       * buffer tail pointer is not synchronized with reports being visible
 +       * to the CPU)
 +       */
 +      void (*init_oa_buffer)(struct drm_i915_private *dev_priv);
 +
 +      /**
 +       * @enable_metric_set: Applies any MUX configuration to set up the
 +       * Boolean and Custom (B/C) counters that are part of the counter
 +       * reports being sampled. May apply system constraints such as
 +       * disabling EU clock gating as required.
 +       */
 +      int (*enable_metric_set)(struct drm_i915_private *dev_priv);
 +
 +      /**
 +       * @disable_metric_set: Remove system constraints associated with using
 +       * the OA unit.
 +       */
 +      void (*disable_metric_set)(struct drm_i915_private *dev_priv);
 +
 +      /**
 +       * @oa_enable: Enable periodic sampling
 +       */
 +      void (*oa_enable)(struct drm_i915_private *dev_priv);
 +
 +      /**
 +       * @oa_disable: Disable periodic sampling
 +       */
 +      void (*oa_disable)(struct drm_i915_private *dev_priv);
 +
 +      /**
 +       * @read: Copy data from the circular OA buffer into a given userspace
 +       * buffer.
 +       */
 +      int (*read)(struct i915_perf_stream *stream,
 +                  char __user *buf,
 +                  size_t count,
 +                  size_t *offset);
 +
 +      /**
 +       * @oa_buffer_is_empty: Check if OA buffer empty (false positives OK)
 +       *
 +       * This is either called via fops or the poll check hrtimer (atomic
 +       * ctx) without any locks taken.
 +       *
 +       * It's safe to read OA config state here unlocked, assuming that this
 +       * is only called while the stream is enabled, while the global OA
 +       * configuration can't be modified.
 +       *
 +       * Efficiency is more important than avoiding some false positives
 +       * here, which will be handled gracefully - likely resulting in an
 +       * %EAGAIN error for userspace.
 +       */
 +      bool (*oa_buffer_is_empty)(struct drm_i915_private *dev_priv);
 +};
 +
  struct drm_i915_private {
        struct drm_device drm;
  
  
        unsigned int fsb_freq, mem_freq, is_ddr3;
        unsigned int skl_preferred_vco_freq;
 -      unsigned int cdclk_freq, max_cdclk_freq, atomic_cdclk_freq;
 +      unsigned int cdclk_freq, max_cdclk_freq;
 +
 +      /*
 +       * For reading holding any crtc lock is sufficient,
 +       * for writing must hold all of them.
 +       */
 +      unsigned int atomic_cdclk_freq;
 +
        unsigned int max_dotclk_freq;
        unsigned int rawclk_freq;
        unsigned int hpll_freq;
        } sagv_status;
  
        struct {
 +              /* protects DSPARB registers on pre-g4x/vlv/chv */
 +              spinlock_t dsparb_lock;
 +
                /*
                 * Raw watermark latency values:
                 * in 0.1us units for WM0,
  
        struct i915_runtime_pm pm;
  
 +      struct {
 +              bool initialized;
 +
 +              struct kobject *metrics_kobj;
 +              struct ctl_table_header *sysctl_header;
 +
 +              struct mutex lock;
 +              struct list_head streams;
 +
 +              spinlock_t hook_lock;
 +
 +              struct {
 +                      struct i915_perf_stream *exclusive_stream;
 +
 +                      u32 specific_ctx_id;
 +
 +                      struct hrtimer poll_check_timer;
 +                      wait_queue_head_t poll_wq;
 +                      bool pollin;
 +
 +                      bool periodic;
 +                      int period_exponent;
 +                      int timestamp_frequency;
 +
 +                      int tail_margin;
 +
 +                      int metrics_set;
 +
 +                      const struct i915_oa_reg *mux_regs;
 +                      int mux_regs_len;
 +                      const struct i915_oa_reg *b_counter_regs;
 +                      int b_counter_regs_len;
 +
 +                      struct {
 +                              struct i915_vma *vma;
 +                              u8 *vaddr;
 +                              int format;
 +                              int format_size;
 +                      } oa_buffer;
 +
 +                      u32 gen7_latched_oastatus1;
 +
 +                      struct i915_oa_ops ops;
 +                      const struct i915_oa_format *oa_formats;
 +                      int n_builtin_sets;
 +              } oa;
 +      } perf;
 +
        /* Abstract the submission mechanism (legacy ringbuffer or execlists) away */
        struct {
                void (*resume)(struct drm_i915_private *);
        /* perform PHY state sanity checks? */
        bool chv_phy_assert[2];
  
 +      bool ipc_enabled;
 +
        /* Used to save the pipe-to-encoder mapping for audio */
        struct intel_encoder *av_enc_map[I915_MAX_PIPES];
  
@@@ -2605,6 -2281,102 +2605,6 @@@ static inline struct scatterlist *__sg_
             (((__iter).curr += PAGE_SIZE) < (__iter).max) ||           \
             ((__iter) = __sgt_iter(__sg_next((__iter).sgp), false), 0))
  
 -/*
 - * A command that requires special handling by the command parser.
 - */
 -struct drm_i915_cmd_descriptor {
 -      /*
 -       * Flags describing how the command parser processes the command.
 -       *
 -       * CMD_DESC_FIXED: The command has a fixed length if this is set,
 -       *                 a length mask if not set
 -       * CMD_DESC_SKIP: The command is allowed but does not follow the
 -       *                standard length encoding for the opcode range in
 -       *                which it falls
 -       * CMD_DESC_REJECT: The command is never allowed
 -       * CMD_DESC_REGISTER: The command should be checked against the
 -       *                    register whitelist for the appropriate ring
 -       * CMD_DESC_MASTER: The command is allowed if the submitting process
 -       *                  is the DRM master
 -       */
 -      u32 flags;
 -#define CMD_DESC_FIXED    (1<<0)
 -#define CMD_DESC_SKIP     (1<<1)
 -#define CMD_DESC_REJECT   (1<<2)
 -#define CMD_DESC_REGISTER (1<<3)
 -#define CMD_DESC_BITMASK  (1<<4)
 -#define CMD_DESC_MASTER   (1<<5)
 -
 -      /*
 -       * The command's unique identification bits and the bitmask to get them.
 -       * This isn't strictly the opcode field as defined in the spec and may
 -       * also include type, subtype, and/or subop fields.
 -       */
 -      struct {
 -              u32 value;
 -              u32 mask;
 -      } cmd;
 -
 -      /*
 -       * The command's length. The command is either fixed length (i.e. does
 -       * not include a length field) or has a length field mask. The flag
 -       * CMD_DESC_FIXED indicates a fixed length. Otherwise, the command has
 -       * a length mask. All command entries in a command table must include
 -       * length information.
 -       */
 -      union {
 -              u32 fixed;
 -              u32 mask;
 -      } length;
 -
 -      /*
 -       * Describes where to find a register address in the command to check
 -       * against the ring's register whitelist. Only valid if flags has the
 -       * CMD_DESC_REGISTER bit set.
 -       *
 -       * A non-zero step value implies that the command may access multiple
 -       * registers in sequence (e.g. LRI), in that case step gives the
 -       * distance in dwords between individual offset fields.
 -       */
 -      struct {
 -              u32 offset;
 -              u32 mask;
 -              u32 step;
 -      } reg;
 -
 -#define MAX_CMD_DESC_BITMASKS 3
 -      /*
 -       * Describes command checks where a particular dword is masked and
 -       * compared against an expected value. If the command does not match
 -       * the expected value, the parser rejects it. Only valid if flags has
 -       * the CMD_DESC_BITMASK bit set. Only entries where mask is non-zero
 -       * are valid.
 -       *
 -       * If the check specifies a non-zero condition_mask then the parser
 -       * only performs the check when the bits specified by condition_mask
 -       * are non-zero.
 -       */
 -      struct {
 -              u32 offset;
 -              u32 mask;
 -              u32 expected;
 -              u32 condition_offset;
 -              u32 condition_mask;
 -      } bits[MAX_CMD_DESC_BITMASKS];
 -};
 -
 -/*
 - * A table of commands requiring special handling by the command parser.
 - *
 - * Each engine has an array of tables. Each table consists of an array of
 - * command descriptors, which must be sorted with command opcodes in
 - * ascending order.
 - */
 -struct drm_i915_cmd_table {
 -      const struct drm_i915_cmd_descriptor *table;
 -      int count;
 -};
 -
  static inline const struct intel_device_info *
  intel_info(const struct drm_i915_private *dev_priv)
  {
  #define IS_REVID(p, since, until) \
        (INTEL_REVID(p) >= (since) && INTEL_REVID(p) <= (until))
  
 -#define IS_I830(dev_priv)     (INTEL_DEVID(dev_priv) == 0x3577)
 -#define IS_845G(dev_priv)     (INTEL_DEVID(dev_priv) == 0x2562)
 -#define IS_I85X(dev_priv)     ((dev_priv)->info.is_i85x)
 -#define IS_I865G(dev_priv)    (INTEL_DEVID(dev_priv) == 0x2572)
 -#define IS_I915G(dev_priv)    ((dev_priv)->info.is_i915g)
 -#define IS_I915GM(dev_priv)   (INTEL_DEVID(dev_priv) == 0x2592)
 -#define IS_I945G(dev_priv)    (INTEL_DEVID(dev_priv) == 0x2772)
 -#define IS_I945GM(dev_priv)   ((dev_priv)->info.is_i945gm)
 -#define IS_BROADWATER(dev_priv)       ((dev_priv)->info.is_broadwater)
 -#define IS_CRESTLINE(dev_priv)        ((dev_priv)->info.is_crestline)
 -#define IS_GM45(dev_priv)     (INTEL_DEVID(dev_priv) == 0x2A42)
 -#define IS_G4X(dev_priv)      ((dev_priv)->info.is_g4x)
 +#define IS_I830(dev_priv)     ((dev_priv)->info.platform == INTEL_I830)
 +#define IS_I845G(dev_priv)    ((dev_priv)->info.platform == INTEL_I845G)
 +#define IS_I85X(dev_priv)     ((dev_priv)->info.platform == INTEL_I85X)
 +#define IS_I865G(dev_priv)    ((dev_priv)->info.platform == INTEL_I865G)
 +#define IS_I915G(dev_priv)    ((dev_priv)->info.platform == INTEL_I915G)
 +#define IS_I915GM(dev_priv)   ((dev_priv)->info.platform == INTEL_I915GM)
 +#define IS_I945G(dev_priv)    ((dev_priv)->info.platform == INTEL_I945G)
 +#define IS_I945GM(dev_priv)   ((dev_priv)->info.platform == INTEL_I945GM)
 +#define IS_I965G(dev_priv)    ((dev_priv)->info.platform == INTEL_I965G)
 +#define IS_I965GM(dev_priv)   ((dev_priv)->info.platform == INTEL_I965GM)
 +#define IS_G45(dev_priv)      ((dev_priv)->info.platform == INTEL_G45)
 +#define IS_GM45(dev_priv)     ((dev_priv)->info.platform == INTEL_GM45)
 +#define IS_G4X(dev_priv)      (IS_G45(dev_priv) || IS_GM45(dev_priv))
  #define IS_PINEVIEW_G(dev_priv)       (INTEL_DEVID(dev_priv) == 0xa001)
  #define IS_PINEVIEW_M(dev_priv)       (INTEL_DEVID(dev_priv) == 0xa011)
 -#define IS_PINEVIEW(dev_priv) ((dev_priv)->info.is_pineview)
 -#define IS_G33(dev_priv)      ((dev_priv)->info.is_g33)
 +#define IS_PINEVIEW(dev_priv) ((dev_priv)->info.platform == INTEL_PINEVIEW)
 +#define IS_G33(dev_priv)      ((dev_priv)->info.platform == INTEL_G33)
  #define IS_IRONLAKE_M(dev_priv)       (INTEL_DEVID(dev_priv) == 0x0046)
 -#define IS_IVYBRIDGE(dev_priv)        ((dev_priv)->info.is_ivybridge)
 +#define IS_IVYBRIDGE(dev_priv)        ((dev_priv)->info.platform == INTEL_IVYBRIDGE)
  #define IS_IVB_GT1(dev_priv)  (INTEL_DEVID(dev_priv) == 0x0156 || \
                                 INTEL_DEVID(dev_priv) == 0x0152 || \
                                 INTEL_DEVID(dev_priv) == 0x015a)
 -#define IS_VALLEYVIEW(dev_priv)       ((dev_priv)->info.is_valleyview)
 -#define IS_CHERRYVIEW(dev_priv)       ((dev_priv)->info.is_cherryview)
 -#define IS_HASWELL(dev_priv)  ((dev_priv)->info.is_haswell)
 -#define IS_BROADWELL(dev_priv)        ((dev_priv)->info.is_broadwell)
 -#define IS_SKYLAKE(dev_priv)  ((dev_priv)->info.is_skylake)
 -#define IS_BROXTON(dev_priv)  ((dev_priv)->info.is_broxton)
 -#define IS_KABYLAKE(dev_priv) ((dev_priv)->info.is_kabylake)
 +#define IS_VALLEYVIEW(dev_priv)       ((dev_priv)->info.platform == INTEL_VALLEYVIEW)
 +#define IS_CHERRYVIEW(dev_priv)       ((dev_priv)->info.platform == INTEL_CHERRYVIEW)
 +#define IS_HASWELL(dev_priv)  ((dev_priv)->info.platform == INTEL_HASWELL)
 +#define IS_BROADWELL(dev_priv)        ((dev_priv)->info.platform == INTEL_BROADWELL)
 +#define IS_SKYLAKE(dev_priv)  ((dev_priv)->info.platform == INTEL_SKYLAKE)
 +#define IS_BROXTON(dev_priv)  ((dev_priv)->info.platform == INTEL_BROXTON)
 +#define IS_KABYLAKE(dev_priv) ((dev_priv)->info.platform == INTEL_KABYLAKE)
 +#define IS_GEMINILAKE(dev_priv)       ((dev_priv)->info.platform == INTEL_GEMINILAKE)
  #define IS_MOBILE(dev_priv)   ((dev_priv)->info.is_mobile)
  #define IS_HSW_EARLY_SDV(dev_priv) (IS_HASWELL(dev_priv) && \
                                    (INTEL_DEVID(dev_priv) & 0xFF00) == 0x0C00)
  #define BXT_REVID_A0          0x0
  #define BXT_REVID_A1          0x1
  #define BXT_REVID_B0          0x3
 +#define BXT_REVID_B_LAST      0x8
  #define BXT_REVID_C0          0x9
  
  #define IS_BXT_REVID(dev_priv, since, until) \
  #define IS_GEN8(dev_priv)     (!!((dev_priv)->info.gen_mask & BIT(7)))
  #define IS_GEN9(dev_priv)     (!!((dev_priv)->info.gen_mask & BIT(8)))
  
 +#define IS_GEN9_LP(dev_priv)  (IS_GEN9(dev_priv) && INTEL_INFO(dev_priv)->is_lp)
 +#define IS_LP(dev_priv)       (INTEL_INFO(dev_priv)->is_lp)
 +
  #define ENGINE_MASK(id)       BIT(id)
  #define RENDER_RING   ENGINE_MASK(RCS)
  #define BSD_RING      ENGINE_MASK(VCS)
                ((dev_priv)->info.overlay_needs_physical)
  
  /* Early gen2 have a totally busted CS tlb and require pinned batches. */
 -#define HAS_BROKEN_CS_TLB(dev_priv)   (IS_I830(dev_priv) || IS_845G(dev_priv))
 +#define HAS_BROKEN_CS_TLB(dev_priv)   (IS_I830(dev_priv) || IS_I845G(dev_priv))
  
  /* WaRsDisableCoarsePowerGating:skl,bxt */
  #define NEEDS_WaRsDisableCoarsePowerGating(dev_priv) \
@@@ -2910,6 -2676,9 +2910,6 @@@ static inline bool intel_scanout_needs_
        return false;
  }
  
 -extern int i915_suspend_switcheroo(struct drm_device *dev, pm_message_t state);
 -extern int i915_resume_switcheroo(struct drm_device *dev);
 -
  int intel_sanitize_enable_ppgtt(struct drm_i915_private *dev_priv,
                                int enable_ppgtt);
  
@@@ -3123,37 -2892,23 +3123,37 @@@ int i915_gem_get_aperture_ioctl(struct 
                                struct drm_file *file_priv);
  int i915_gem_wait_ioctl(struct drm_device *dev, void *data,
                        struct drm_file *file_priv);
 -int i915_gem_load_init(struct drm_device *dev);
 -void i915_gem_load_cleanup(struct drm_device *dev);
 +int i915_gem_load_init(struct drm_i915_private *dev_priv);
 +void i915_gem_load_cleanup(struct drm_i915_private *dev_priv);
  void i915_gem_load_init_fences(struct drm_i915_private *dev_priv);
  int i915_gem_freeze(struct drm_i915_private *dev_priv);
  int i915_gem_freeze_late(struct drm_i915_private *dev_priv);
  
 -void *i915_gem_object_alloc(struct drm_device *dev);
 +void *i915_gem_object_alloc(struct drm_i915_private *dev_priv);
  void i915_gem_object_free(struct drm_i915_gem_object *obj);
  void i915_gem_object_init(struct drm_i915_gem_object *obj,
                         const struct drm_i915_gem_object_ops *ops);
 -struct drm_i915_gem_object *i915_gem_object_create(struct drm_device *dev,
 -                                                 u64 size);
 -struct drm_i915_gem_object *i915_gem_object_create_from_data(
 -              struct drm_device *dev, const void *data, size_t size);
 +struct drm_i915_gem_object *
 +i915_gem_object_create(struct drm_i915_private *dev_priv, u64 size);
 +struct drm_i915_gem_object *
 +i915_gem_object_create_from_data(struct drm_i915_private *dev_priv,
 +                               const void *data, size_t size);
  void i915_gem_close_object(struct drm_gem_object *gem, struct drm_file *file);
  void i915_gem_free_object(struct drm_gem_object *obj);
  
 +static inline void i915_gem_drain_freed_objects(struct drm_i915_private *i915)
 +{
 +      /* A single pass should suffice to release all the freed objects (along
 +       * most call paths) , but be a little more paranoid in that freeing
 +       * the objects does take a little amount of time, during which the rcu
 +       * callbacks could have added new objects into the freed list, and
 +       * armed the work again.
 +       */
 +      do {
 +              rcu_barrier();
 +      } while (flush_work(&i915->mm.free_work));
 +}
 +
  struct i915_vma * __must_check
  i915_gem_object_ggtt_pin(struct drm_i915_gem_object *obj,
                         const struct i915_ggtt_view *view,
@@@ -3223,6 -2978,7 +3223,6 @@@ __i915_gem_object_unpin_pages(struct dr
        GEM_BUG_ON(!obj->mm.pages);
  
        atomic_dec(&obj->mm.pages_pin_count);
 -      GEM_BUG_ON(atomic_read(&obj->mm.pages_pin_count) < obj->bind_count);
  }
  
  static inline void
@@@ -3247,8 -3003,8 +3247,8 @@@ enum i915_map_type 
  
  /**
   * i915_gem_object_pin_map - return a contiguous mapping of the entire object
 - * @obj - the object to map into kernel address space
 - * @type - the type of mapping, used to select pgprot_t
 + * @obj: the object to map into kernel address space
 + * @type: the type of mapping, used to select pgprot_t
   *
   * Calls i915_gem_object_pin_pages() to prevent reaping of the object's
   * pages and then returns a contiguous mapping of the backing storage into
@@@ -3266,7 -3022,7 +3266,7 @@@ void *__must_check i915_gem_object_pin_
  
  /**
   * i915_gem_object_unpin_map - releases an earlier mapping
 - * @obj - the object to unmap
 + * @obj: the object to unmap
   *
   * After pinning the object and mapping its pages, once you are finished
   * with your access, call i915_gem_object_unpin_map() to release the pin
@@@ -3337,14 -3093,14 +3337,14 @@@ static inline u32 i915_reset_count(stru
  void i915_gem_reset(struct drm_i915_private *dev_priv);
  void i915_gem_set_wedged(struct drm_i915_private *dev_priv);
  void i915_gem_clflush_object(struct drm_i915_gem_object *obj, bool force);
 -int __must_check i915_gem_init(struct drm_device *dev);
 -int __must_check i915_gem_init_hw(struct drm_device *dev);
 +int __must_check i915_gem_init(struct drm_i915_private *dev_priv);
 +int __must_check i915_gem_init_hw(struct drm_i915_private *dev_priv);
  void i915_gem_init_swizzling(struct drm_i915_private *dev_priv);
 -void i915_gem_cleanup_engines(struct drm_device *dev);
 +void i915_gem_cleanup_engines(struct drm_i915_private *dev_priv);
  int __must_check i915_gem_wait_for_idle(struct drm_i915_private *dev_priv,
                                        unsigned int flags);
 -int __must_check i915_gem_suspend(struct drm_device *dev);
 -void i915_gem_resume(struct drm_device *dev);
 +int __must_check i915_gem_suspend(struct drm_i915_private *dev_priv);
 +void i915_gem_resume(struct drm_i915_private *dev_priv);
  int i915_gem_fault(struct vm_area_struct *vma, struct vm_fault *vmf);
  int i915_gem_object_wait(struct drm_i915_gem_object *obj,
                         unsigned int flags,
@@@ -3426,6 -3182,23 +3426,6 @@@ void i915_gem_object_do_bit_17_swizzle(
  void i915_gem_object_save_bit_17_swizzle(struct drm_i915_gem_object *obj,
                                         struct sg_table *pages);
  
 -/* i915_gem_context.c */
 -int __must_check i915_gem_context_init(struct drm_device *dev);
 -void i915_gem_context_lost(struct drm_i915_private *dev_priv);
 -void i915_gem_context_fini(struct drm_device *dev);
 -int i915_gem_context_open(struct drm_device *dev, struct drm_file *file);
 -void i915_gem_context_close(struct drm_device *dev, struct drm_file *file);
 -int i915_switch_context(struct drm_i915_gem_request *req);
 -int i915_gem_switch_to_kernel_context(struct drm_i915_private *dev_priv);
 -struct i915_vma *
 -i915_gem_context_pin_legacy(struct i915_gem_context *ctx,
 -                          unsigned int flags);
 -void i915_gem_context_free(struct kref *ctx_ref);
 -struct drm_i915_gem_object *
 -i915_gem_alloc_context_obj(struct drm_device *dev, size_t size);
 -struct i915_gem_context *
 -i915_gem_context_create_gvt(struct drm_device *dev);
 -
  static inline struct i915_gem_context *
  i915_gem_context_lookup(struct drm_i915_file_private *file_priv, u32 id)
  {
@@@ -3453,14 -3226,6 +3453,14 @@@ static inline void i915_gem_context_put
        kref_put(&ctx->ref, i915_gem_context_free);
  }
  
 +static inline void i915_gem_context_put_unlocked(struct i915_gem_context *ctx)
 +{
 +      struct mutex *lock = &ctx->i915->drm.struct_mutex;
 +
 +      if (kref_put_mutex(&ctx->ref, i915_gem_context_free, lock))
 +              mutex_unlock(lock);
 +}
 +
  static inline struct intel_timeline *
  i915_gem_context_lookup_timeline(struct i915_gem_context *ctx,
                                 struct intel_engine_cs *engine)
        return &vm->timeline.engine[engine->id];
  }
  
 -static inline bool i915_gem_context_is_default(const struct i915_gem_context *c)
 -{
 -      return c->user_handle == DEFAULT_CONTEXT_HANDLE;
 -}
 -
 -int i915_gem_context_create_ioctl(struct drm_device *dev, void *data,
 -                                struct drm_file *file);
 -int i915_gem_context_destroy_ioctl(struct drm_device *dev, void *data,
 -                                 struct drm_file *file);
 -int i915_gem_context_getparam_ioctl(struct drm_device *dev, void *data,
 -                                  struct drm_file *file_priv);
 -int i915_gem_context_setparam_ioctl(struct drm_device *dev, void *data,
 -                                  struct drm_file *file_priv);
 -int i915_gem_context_reset_stats_ioctl(struct drm_device *dev, void *data,
 -                                     struct drm_file *file);
 +int i915_perf_open_ioctl(struct drm_device *dev, void *data,
 +                       struct drm_file *file);
  
  /* i915_gem_evict.c */
  int __must_check i915_gem_evict_something(struct i915_address_space *vm,
                                          unsigned cache_level,
                                          u64 start, u64 end,
                                          unsigned flags);
 -int __must_check i915_gem_evict_for_vma(struct i915_vma *target);
 +int __must_check i915_gem_evict_for_vma(struct i915_vma *vma,
 +                                      unsigned int flags);
  int i915_gem_evict_vm(struct i915_address_space *vm, bool do_idle);
  
  /* belongs in i915_gem_gtt.h */
@@@ -3505,9 -3282,9 +3505,9 @@@ void i915_gem_stolen_remove_node(struc
  int i915_gem_init_stolen(struct drm_i915_private *dev_priv);
  void i915_gem_cleanup_stolen(struct drm_device *dev);
  struct drm_i915_gem_object *
 -i915_gem_object_create_stolen(struct drm_device *dev, u32 size);
 +i915_gem_object_create_stolen(struct drm_i915_private *dev_priv, u32 size);
  struct drm_i915_gem_object *
 -i915_gem_object_create_stolen_for_preallocated(struct drm_device *dev,
 +i915_gem_object_create_stolen_for_preallocated(struct drm_i915_private *dev_priv,
                                               u32 stolen_offset,
                                               u32 gtt_offset,
                                               u32 size);
@@@ -3575,7 -3352,7 +3575,7 @@@ void i915_capture_error_state(struct dr
  void i915_error_state_get(struct drm_device *dev,
                          struct i915_error_state_file_priv *error_priv);
  void i915_error_state_put(struct i915_error_state_file_priv *error_priv);
 -void i915_destroy_error_state(struct drm_device *dev);
 +void i915_destroy_error_state(struct drm_i915_private *dev_priv);
  
  #else
  
@@@ -3585,7 -3362,7 +3585,7 @@@ static inline void i915_capture_error_s
  {
  }
  
 -static inline void i915_destroy_error_state(struct drm_device *dev)
 +static inline void i915_destroy_error_state(struct drm_i915_private *dev_priv)
  {
  }
  
@@@ -3597,6 -3374,7 +3597,6 @@@ const char *i915_cache_level_str(struc
  int i915_cmd_parser_get_version(struct drm_i915_private *dev_priv);
  void intel_engine_init_cmd_parser(struct intel_engine_cs *engine);
  void intel_engine_cleanup_cmd_parser(struct intel_engine_cs *engine);
 -bool intel_engine_needs_cmd_parser(struct intel_engine_cs *engine);
  int intel_engine_cmd_parser(struct intel_engine_cs *engine,
                            struct drm_i915_gem_object *batch_obj,
                            struct drm_i915_gem_object *shadow_batch_obj,
                            u32 batch_len,
                            bool is_master);
  
 +/* i915_perf.c */
 +extern void i915_perf_init(struct drm_i915_private *dev_priv);
 +extern void i915_perf_fini(struct drm_i915_private *dev_priv);
 +extern void i915_perf_register(struct drm_i915_private *dev_priv);
 +extern void i915_perf_unregister(struct drm_i915_private *dev_priv);
 +
  /* i915_suspend.c */
 -extern int i915_save_state(struct drm_device *dev);
 -extern int i915_restore_state(struct drm_device *dev);
 +extern int i915_save_state(struct drm_i915_private *dev_priv);
 +extern int i915_restore_state(struct drm_i915_private *dev_priv);
  
  /* i915_sysfs.c */
  void i915_setup_sysfs(struct drm_i915_private *dev_priv);
  void i915_teardown_sysfs(struct drm_i915_private *dev_priv);
  
  /* intel_i2c.c */
 -extern int intel_setup_gmbus(struct drm_device *dev);
 -extern void intel_teardown_gmbus(struct drm_device *dev);
 +extern int intel_setup_gmbus(struct drm_i915_private *dev_priv);
 +extern void intel_teardown_gmbus(struct drm_i915_private *dev_priv);
  extern bool intel_gmbus_is_valid_pin(struct drm_i915_private *dev_priv,
                                     unsigned int pin);
  
@@@ -3632,7 -3404,7 +3632,7 @@@ static inline bool intel_gmbus_is_force
  {
        return container_of(adapter, struct intel_gmbus, adapter)->force_bit;
  }
 -extern void intel_i2c_reset(struct drm_device *dev);
 +extern void intel_i2c_reset(struct drm_i915_private *dev_priv);
  
  /* intel_bios.c */
  int intel_bios_init(struct drm_i915_private *dev_priv);
@@@ -3699,7 -3471,6 +3699,7 @@@ mkwrite_device_info(struct drm_i915_pri
        return (struct intel_device_info *)&dev_priv->info;
  }
  
 +const char *intel_platform_name(enum intel_platform platform);
  void intel_device_info_runtime_init(struct drm_i915_private *dev_priv);
  void intel_device_info_dump(struct drm_i915_private *dev_priv);
  
@@@ -3716,9 -3487,9 +3716,9 @@@ extern void intel_display_resume(struc
  extern void i915_redisable_vga(struct drm_i915_private *dev_priv);
  extern void i915_redisable_vga_power_on(struct drm_i915_private *dev_priv);
  extern bool ironlake_set_drps(struct drm_i915_private *dev_priv, u8 val);
 -extern void intel_init_pch_refclk(struct drm_device *dev);
 +extern void intel_init_pch_refclk(struct drm_i915_private *dev_priv);
  extern void intel_set_rps(struct drm_i915_private *dev_priv, u8 val);
 -extern void intel_set_memory_cxsr(struct drm_i915_private *dev_priv,
 +extern bool intel_set_memory_cxsr(struct drm_i915_private *dev_priv,
                                  bool enable);
  
  int i915_reg_read_ioctl(struct drm_device *dev, void *data,
@@@ -3738,8 -3509,6 +3738,8 @@@ extern void intel_display_print_error_s
  
  int sandybridge_pcode_read(struct drm_i915_private *dev_priv, u32 mbox, u32 *val);
  int sandybridge_pcode_write(struct drm_i915_private *dev_priv, u32 mbox, u32 val);
 +int skl_pcode_request(struct drm_i915_private *dev_priv, u32 mbox, u32 request,
 +                    u32 reply_mask, u32 reply, int timeout_base_ms);
  
  /* intel_sideband.c */
  u32 vlv_punit_read(struct drm_i915_private *dev_priv, u32 addr);
@@@ -3763,7 -3532,7 +3763,7 @@@ u32 vlv_flisdsi_read(struct drm_i915_pr
  void vlv_flisdsi_write(struct drm_i915_private *dev_priv, u32 reg, u32 val);
  
  /* intel_dpio_phy.c */
 -void bxt_port_to_phy_channel(enum port port,
 +void bxt_port_to_phy_channel(struct drm_i915_private *dev_priv, enum port port,
                             enum dpio_phy *phy, enum dpio_channel *ch);
  void bxt_ddi_phy_set_signal_level(struct drm_i915_private *dev_priv,
                                  enum port port, u32 margin, u32 scale,
@@@ -51,7 -51,10 +51,10 @@@ static bool ggtt_is_idle(struct drm_i91
  }
  
  static bool
- mark_free(struct i915_vma *vma, unsigned int flags, struct list_head *unwind)
+ mark_free(struct drm_mm_scan *scan,
+         struct i915_vma *vma,
+         unsigned int flags,
+         struct list_head *unwind)
  {
        if (i915_vma_is_pinned(vma))
                return false;
@@@ -63,7 -66,7 +66,7 @@@
                return false;
  
        list_add(&vma->exec_list, unwind);
-       return drm_mm_scan_add_block(&vma->node);
+       return drm_mm_scan_add_block(scan, &vma->node);
  }
  
  /**
@@@ -96,7 -99,8 +99,8 @@@ i915_gem_evict_something(struct i915_ad
                         u64 start, u64 end,
                         unsigned flags)
  {
 -      struct drm_i915_private *dev_priv = to_i915(vm->dev);
 +      struct drm_i915_private *dev_priv = vm->i915;
+       struct drm_mm_scan scan;
        struct list_head eviction_list;
        struct list_head *phases[] = {
                &vm->inactive_list,
                NULL,
        }, **phase;
        struct i915_vma *vma, *next;
+       struct drm_mm_node *node;
        int ret;
  
 -      lockdep_assert_held(&vm->dev->struct_mutex);
 +      lockdep_assert_held(&vm->i915->drm.struct_mutex);
        trace_i915_gem_evict(vm, min_size, alignment, flags);
  
        /*
         * On each list, the oldest objects lie at the HEAD with the freshest
         * object on the TAIL.
         */
-       if (start != 0 || end != vm->total) {
-               drm_mm_init_scan_with_range(&vm->mm, min_size,
-                                           alignment, cache_level,
-                                           start, end);
-       } else
-               drm_mm_init_scan(&vm->mm, min_size, alignment, cache_level);
+       drm_mm_scan_init_with_range(&scan, &vm->mm,
+                                   min_size, alignment, cache_level,
+                                   start, end,
+                                   flags & PIN_HIGH ? DRM_MM_CREATE_TOP : 0);
  
 -      if (flags & PIN_NONBLOCK)
 +      /* Retire before we search the active list. Although we have
 +       * reasonable accuracy in our retirement lists, we may have
 +       * a stray pin (preventing eviction) that can only be resolved by
 +       * retiring.
 +       */
 +      if (!(flags & PIN_NONBLOCK))
 +              i915_gem_retire_requests(dev_priv);
 +      else
                phases[1] = NULL;
  
  search_again:
        phase = phases;
        do {
                list_for_each_entry(vma, *phase, vm_link)
-                       if (mark_free(vma, flags, &eviction_list))
+                       if (mark_free(&scan, vma, flags, &eviction_list))
                                goto found;
        } while (*++phase);
  
        /* Nothing found, clean up and bail out! */
        list_for_each_entry_safe(vma, next, &eviction_list, exec_list) {
-               ret = drm_mm_scan_remove_block(&vma->node);
+               ret = drm_mm_scan_remove_block(&scan, &vma->node);
                BUG_ON(ret);
  
                INIT_LIST_HEAD(&vma->exec_list);
                 * back to userspace to give our workqueues time to
                 * acquire our locks and unpin the old scanouts.
                 */
 -              return intel_has_pending_fb_unpin(vm->dev) ? -EAGAIN : -ENOSPC;
 +              return intel_has_pending_fb_unpin(dev_priv) ? -EAGAIN : -ENOSPC;
        }
  
        /* Not everything in the GGTT is tracked via vma (otherwise we
@@@ -199,7 -195,7 +202,7 @@@ found
         * of any of our objects, thus corrupting the list).
         */
        list_for_each_entry_safe(vma, next, &eviction_list, exec_list) {
-               if (drm_mm_scan_remove_block(&vma->node))
+               if (drm_mm_scan_remove_block(&scan, &vma->node))
                        __i915_vma_pin(vma);
                else
                        list_del_init(&vma->exec_list);
                if (ret == 0)
                        ret = i915_vma_unbind(vma);
        }
+       while (ret == 0 && (node = drm_mm_scan_color_evict(&scan))) {
+               vma = container_of(node, struct i915_vma, node);
+               ret = i915_vma_unbind(vma);
+       }
        return ret;
  }
  
 -int
 -i915_gem_evict_for_vma(struct i915_vma *target)
 +/**
 + * i915_gem_evict_for_vma - Evict vmas to make room for binding a new one
 + * @target: address space and range to evict for
 + * @flags: additional flags to control the eviction algorithm
 + *
 + * This function will try to evict vmas that overlap the target node.
 + *
 + * To clarify: This is for freeing up virtual address space, not for freeing
 + * memory in e.g. the shrinker.
 + */
 +int i915_gem_evict_for_vma(struct i915_vma *target, unsigned int flags)
  {
 -      struct drm_mm_node *node, *next;
 +      LIST_HEAD(eviction_list);
 +      struct drm_mm_node *node;
 +      u64 start = target->node.start;
 +      u64 end = start + target->node.size;
 +      struct i915_vma *vma, *next;
 +      bool check_color;
 +      int ret = 0;
  
 -      lockdep_assert_held(&target->vm->dev->struct_mutex);
 +      lockdep_assert_held(&target->vm->i915->drm.struct_mutex);
 +      trace_i915_gem_evict_vma(target, flags);
  
 -      list_for_each_entry_safe(node, next,
 -                      &target->vm->mm.head_node.node_list,
 -                      node_list) {
 -              struct i915_vma *vma;
 -              int ret;
 +      /* Retire before we search the active list. Although we have
 +       * reasonable accuracy in our retirement lists, we may have
 +       * a stray pin (preventing eviction) that can only be resolved by
 +       * retiring.
 +       */
 +      if (!(flags & PIN_NONBLOCK))
 +              i915_gem_retire_requests(target->vm->i915);
 +
 +      check_color = target->vm->mm.color_adjust;
 +      if (check_color) {
 +              /* Expand search to cover neighbouring guard pages (or lack!) */
 +              if (start > target->vm->start)
 +                      start -= 4096;
 +              if (end < target->vm->start + target->vm->total)
 +                      end += 4096;
 +      }
  
 -              if (node->start + node->size <= target->node.start)
 -                      continue;
 -              if (node->start >= target->node.start + target->node.size)
 +      drm_mm_for_each_node_in_range(node, &target->vm->mm, start, end) {
 +              /* If we find any non-objects (!vma), we cannot evict them */
 +              if (node->color == I915_COLOR_UNEVICTABLE) {
 +                      ret = -ENOSPC;
                        break;
 +              }
  
                vma = container_of(node, typeof(*vma), node);
  
 -              if (i915_vma_is_pinned(vma)) {
 -                      if (!vma->exec_entry || i915_vma_pin_count(vma) > 1)
 -                              /* Object is pinned for some other use */
 -                              return -EBUSY;
 +              /* If we are using coloring to insert guard pages between
 +               * different cache domains within the address space, we have
 +               * to check whether the objects on either side of our range
 +               * abutt and conflict. If they are in conflict, then we evict
 +               * those as well to make room for our guard pages.
 +               */
 +              if (check_color) {
 +                      if (vma->node.start + vma->node.size == target->node.start) {
 +                              if (vma->node.color == target->node.color)
 +                                      continue;
 +                      }
 +                      if (vma->node.start == target->node.start + target->node.size) {
 +                              if (vma->node.color == target->node.color)
 +                                      continue;
 +                      }
 +              }
  
 -                      /* We need to evict a buffer in the same batch */
 -                      if (vma->exec_entry->flags & EXEC_OBJECT_PINNED)
 -                              /* Overlapping fixed objects in the same batch */
 -                              return -EINVAL;
 +              if (flags & PIN_NONBLOCK &&
 +                  (i915_vma_is_pinned(vma) || i915_vma_is_active(vma))) {
 +                      ret = -ENOSPC;
 +                      break;
 +              }
  
 -                      return -ENOSPC;
 +              /* Overlap of objects in the same batch? */
 +              if (i915_vma_is_pinned(vma)) {
 +                      ret = -ENOSPC;
 +                      if (vma->exec_entry &&
 +                          vma->exec_entry->flags & EXEC_OBJECT_PINNED)
 +                              ret = -EINVAL;
 +                      break;
                }
  
 -              ret = i915_vma_unbind(vma);
 -              if (ret)
 -                      return ret;
 +              /* Never show fear in the face of dragons!
 +               *
 +               * We cannot directly remove this node from within this
 +               * iterator and as with i915_gem_evict_something() we employ
 +               * the vma pin_count in order to prevent the action of
 +               * unbinding one vma from freeing (by dropping its active
 +               * reference) another in our eviction list.
 +               */
 +              __i915_vma_pin(vma);
 +              list_add(&vma->exec_list, &eviction_list);
        }
  
 -      return 0;
 +      list_for_each_entry_safe(vma, next, &eviction_list, exec_list) {
 +              list_del_init(&vma->exec_list);
 +              __i915_vma_unpin(vma);
 +              if (ret == 0)
 +                      ret = i915_vma_unbind(vma);
 +      }
 +
 +      return ret;
  }
  
  /**
@@@ -341,11 -281,11 +350,11 @@@ int i915_gem_evict_vm(struct i915_addre
        struct i915_vma *vma, *next;
        int ret;
  
 -      lockdep_assert_held(&vm->dev->struct_mutex);
 +      lockdep_assert_held(&vm->i915->drm.struct_mutex);
        trace_i915_gem_evict_vm(vm);
  
        if (do_idle) {
 -              struct drm_i915_private *dev_priv = to_i915(vm->dev);
 +              struct drm_i915_private *dev_priv = vm->i915;
  
                if (i915_is_ggtt(vm)) {
                        ret = i915_gem_switch_to_kernel_context(dev_priv);
@@@ -113,9 -113,10 +113,9 @@@ int intel_sanitize_enable_ppgtt(struct 
        bool has_full_ppgtt;
        bool has_full_48bit_ppgtt;
  
 -      has_aliasing_ppgtt = INTEL_GEN(dev_priv) >= 6;
 -      has_full_ppgtt = INTEL_GEN(dev_priv) >= 7;
 -      has_full_48bit_ppgtt =
 -              IS_BROADWELL(dev_priv) || INTEL_GEN(dev_priv) >= 9;
 +      has_aliasing_ppgtt = dev_priv->info.has_aliasing_ppgtt;
 +      has_full_ppgtt = dev_priv->info.has_full_ppgtt;
 +      has_full_48bit_ppgtt = dev_priv->info.has_full_48bit_ppgtt;
  
        if (intel_vgpu_active(dev_priv)) {
                /* emulation is too hard */
@@@ -371,7 -372,7 +371,7 @@@ static void kunmap_page_dma(struct drm_
        /* There are only few exceptions for gen >=6. chv and bxt.
         * And we are not sure about the latter so play safe for now.
         */
 -      if (IS_CHERRYVIEW(dev_priv) || IS_BROXTON(dev_priv))
 +      if (IS_CHERRYVIEW(dev_priv) || IS_GEN9_LP(dev_priv))
                drm_clflush_virt_range(vaddr, PAGE_SIZE);
  
        kunmap_atomic(vaddr);
  
  #define kmap_px(px) kmap_page_dma(px_base(px))
  #define kunmap_px(ppgtt, vaddr) \
 -              kunmap_page_dma(to_i915((ppgtt)->base.dev), (vaddr))
 +              kunmap_page_dma((ppgtt)->base.i915, (vaddr))
  
  #define setup_px(dev_priv, px) setup_page_dma((dev_priv), px_base(px))
  #define cleanup_px(dev_priv, px) cleanup_page_dma((dev_priv), px_base(px))
@@@ -469,7 -470,7 +469,7 @@@ static void gen8_initialize_pt(struct i
        scratch_pte = gen8_pte_encode(vm->scratch_page.daddr,
                                      I915_CACHE_LLC);
  
 -      fill_px(to_i915(vm->dev), pt, scratch_pte);
 +      fill_px(vm->i915, pt, scratch_pte);
  }
  
  static void gen6_initialize_pt(struct i915_address_space *vm,
        scratch_pte = vm->pte_encode(vm->scratch_page.daddr,
                                     I915_CACHE_LLC, 0);
  
 -      fill32_px(to_i915(vm->dev), pt, scratch_pte);
 +      fill32_px(vm->i915, pt, scratch_pte);
  }
  
  static struct i915_page_directory *alloc_pd(struct drm_i915_private *dev_priv)
@@@ -530,7 -531,7 +530,7 @@@ static void gen8_initialize_pd(struct i
  
        scratch_pde = gen8_pde_encode(px_dma(vm->scratch_pt), I915_CACHE_LLC);
  
 -      fill_px(to_i915(vm->dev), pd, scratch_pde);
 +      fill_px(vm->i915, pd, scratch_pde);
  }
  
  static int __pdp_init(struct drm_i915_private *dev_priv,
@@@ -611,7 -612,7 +611,7 @@@ static void gen8_initialize_pdp(struct 
  
        scratch_pdpe = gen8_pdpe_encode(px_dma(vm->scratch_pd), I915_CACHE_LLC);
  
 -      fill_px(to_i915(vm->dev), pdp, scratch_pdpe);
 +      fill_px(vm->i915, pdp, scratch_pdpe);
  }
  
  static void gen8_initialize_pml4(struct i915_address_space *vm,
        scratch_pml4e = gen8_pml4e_encode(px_dma(vm->scratch_pdp),
                                          I915_CACHE_LLC);
  
 -      fill_px(to_i915(vm->dev), pml4, scratch_pml4e);
 +      fill_px(vm->i915, pml4, scratch_pml4e);
  }
  
  static void
@@@ -709,7 -710,7 +709,7 @@@ static int gen8_48b_mm_switch(struct i9
   */
  static void mark_tlbs_dirty(struct i915_hw_ppgtt *ppgtt)
  {
 -      ppgtt->pd_dirty_rings = INTEL_INFO(to_i915(ppgtt->base.dev))->ring_mask;
 +      ppgtt->pd_dirty_rings = INTEL_INFO(ppgtt->base.i915)->ring_mask;
  }
  
  /* Removes entries from a single page table, releasing it if it's empty.
@@@ -735,8 -736,10 +735,8 @@@ static bool gen8_ppgtt_clear_pt(struct 
  
        bitmap_clear(pt->used_ptes, pte, num_entries);
  
 -      if (bitmap_empty(pt->used_ptes, GEN8_PTES)) {
 -              free_pt(to_i915(vm->dev), pt);
 +      if (bitmap_empty(pt->used_ptes, GEN8_PTES))
                return true;
 -      }
  
        pt_vaddr = kmap_px(pt);
  
@@@ -772,12 -775,13 +772,12 @@@ static bool gen8_ppgtt_clear_pd(struct 
                        pde_vaddr = kmap_px(pd);
                        pde_vaddr[pde] = scratch_pde;
                        kunmap_px(ppgtt, pde_vaddr);
 +                      free_pt(vm->i915, pt);
                }
        }
  
 -      if (bitmap_empty(pd->used_pdes, I915_PDES)) {
 -              free_pd(to_i915(vm->dev), pd);
 +      if (bitmap_empty(pd->used_pdes, I915_PDES))
                return true;
 -      }
  
        return false;
  }
@@@ -791,6 -795,7 +791,6 @@@ static bool gen8_ppgtt_clear_pdp(struc
                                 uint64_t length)
  {
        struct i915_hw_ppgtt *ppgtt = i915_vm_to_ppgtt(vm);
 -      struct drm_i915_private *dev_priv = to_i915(vm->dev);
        struct i915_page_directory *pd;
        uint64_t pdpe;
        gen8_ppgtt_pdpe_t *pdpe_vaddr;
                                pdpe_vaddr[pdpe] = scratch_pdpe;
                                kunmap_px(ppgtt, pdpe_vaddr);
                        }
 +                      free_pd(vm->i915, pd);
                }
        }
  
        mark_tlbs_dirty(ppgtt);
  
 -      if (USES_FULL_48BIT_PPGTT(dev_priv) &&
 -          bitmap_empty(pdp->used_pdpes, I915_PDPES_PER_PDP(dev_priv))) {
 -              free_pdp(dev_priv, pdp);
 +      if (bitmap_empty(pdp->used_pdpes, I915_PDPES_PER_PDP(dev_priv)))
                return true;
 -      }
  
        return false;
  }
@@@ -836,7 -843,7 +836,7 @@@ static void gen8_ppgtt_clear_pml4(struc
        gen8_ppgtt_pml4e_t scratch_pml4e =
                gen8_pml4e_encode(px_dma(vm->scratch_pdp), I915_CACHE_LLC);
  
 -      GEM_BUG_ON(!USES_FULL_48BIT_PPGTT(to_i915(vm->dev)));
 +      GEM_BUG_ON(!USES_FULL_48BIT_PPGTT(vm->i915));
  
        gen8_for_each_pml4e(pdp, pml4, start, length, pml4e) {
                if (WARN_ON(!pml4->pdps[pml4e]))
                        pml4e_vaddr = kmap_px(pml4);
                        pml4e_vaddr[pml4e] = scratch_pml4e;
                        kunmap_px(ppgtt, pml4e_vaddr);
 +                      free_pdp(vm->i915, pdp);
                }
        }
  }
@@@ -857,7 -863,7 +857,7 @@@ static void gen8_ppgtt_clear_range(stru
  {
        struct i915_hw_ppgtt *ppgtt = i915_vm_to_ppgtt(vm);
  
 -      if (USES_FULL_48BIT_PPGTT(to_i915(vm->dev)))
 +      if (USES_FULL_48BIT_PPGTT(vm->i915))
                gen8_ppgtt_clear_pml4(vm, &ppgtt->pml4, start, length);
        else
                gen8_ppgtt_clear_pdp(vm, &ppgtt->pdp, start, length);
@@@ -892,7 -898,7 +892,7 @@@ gen8_ppgtt_insert_pte_entries(struct i9
                        kunmap_px(ppgtt, pt_vaddr);
                        pt_vaddr = NULL;
                        if (++pde == I915_PDES) {
 -                              if (++pdpe == I915_PDPES_PER_PDP(to_i915(vm->dev)))
 +                              if (++pdpe == I915_PDPES_PER_PDP(vm->i915))
                                        break;
                                pde = 0;
                        }
@@@ -915,7 -921,7 +915,7 @@@ static void gen8_ppgtt_insert_entries(s
  
        __sg_page_iter_start(&sg_iter, pages->sgl, sg_nents(pages->sgl), 0);
  
 -      if (!USES_FULL_48BIT_PPGTT(to_i915(vm->dev))) {
 +      if (!USES_FULL_48BIT_PPGTT(vm->i915)) {
                gen8_ppgtt_insert_pte_entries(vm, &ppgtt->pdp, &sg_iter, start,
                                              cache_level);
        } else {
@@@ -949,7 -955,7 +949,7 @@@ static void gen8_free_page_tables(struc
  
  static int gen8_init_scratch(struct i915_address_space *vm)
  {
 -      struct drm_i915_private *dev_priv = to_i915(vm->dev);
 +      struct drm_i915_private *dev_priv = vm->i915;
        int ret;
  
        ret = setup_scratch_page(dev_priv, &vm->scratch_page, I915_GFP_DMA);
@@@ -996,7 -1002,7 +996,7 @@@ free_scratch_page
  static int gen8_ppgtt_notify_vgt(struct i915_hw_ppgtt *ppgtt, bool create)
  {
        enum vgt_g2v_type msg;
 -      struct drm_i915_private *dev_priv = to_i915(ppgtt->base.dev);
 +      struct drm_i915_private *dev_priv = ppgtt->base.i915;
        int i;
  
        if (USES_FULL_48BIT_PPGTT(dev_priv)) {
  
  static void gen8_free_scratch(struct i915_address_space *vm)
  {
 -      struct drm_i915_private *dev_priv = to_i915(vm->dev);
 +      struct drm_i915_private *dev_priv = vm->i915;
  
        if (USES_FULL_48BIT_PPGTT(dev_priv))
                free_pdp(dev_priv, vm->scratch_pdp);
@@@ -1053,7 -1059,7 +1053,7 @@@ static void gen8_ppgtt_cleanup_3lvl(str
  
  static void gen8_ppgtt_cleanup_4lvl(struct i915_hw_ppgtt *ppgtt)
  {
 -      struct drm_i915_private *dev_priv = to_i915(ppgtt->base.dev);
 +      struct drm_i915_private *dev_priv = ppgtt->base.i915;
        int i;
  
        for_each_set_bit(i, ppgtt->pml4.used_pml4es, GEN8_PML4ES_PER_PML4) {
  
  static void gen8_ppgtt_cleanup(struct i915_address_space *vm)
  {
 -      struct drm_i915_private *dev_priv = to_i915(vm->dev);
 +      struct drm_i915_private *dev_priv = vm->i915;
        struct i915_hw_ppgtt *ppgtt = i915_vm_to_ppgtt(vm);
  
        if (intel_vgpu_active(dev_priv))
@@@ -1106,7 -1112,7 +1106,7 @@@ static int gen8_ppgtt_alloc_pagetabs(st
                                     uint64_t length,
                                     unsigned long *new_pts)
  {
 -      struct drm_i915_private *dev_priv = to_i915(vm->dev);
 +      struct drm_i915_private *dev_priv = vm->i915;
        struct i915_page_table *pt;
        uint32_t pde;
  
@@@ -1167,7 -1173,7 +1167,7 @@@ gen8_ppgtt_alloc_page_directories(struc
                                  uint64_t length,
                                  unsigned long *new_pds)
  {
 -      struct drm_i915_private *dev_priv = to_i915(vm->dev);
 +      struct drm_i915_private *dev_priv = vm->i915;
        struct i915_page_directory *pd;
        uint32_t pdpe;
        uint32_t pdpes = I915_PDPES_PER_PDP(dev_priv);
@@@ -1220,7 -1226,7 +1220,7 @@@ gen8_ppgtt_alloc_page_dirpointers(struc
                                  uint64_t length,
                                  unsigned long *new_pdps)
  {
 -      struct drm_i915_private *dev_priv = to_i915(vm->dev);
 +      struct drm_i915_private *dev_priv = vm->i915;
        struct i915_page_directory_pointer *pdp;
        uint32_t pml4e;
  
@@@ -1295,7 -1301,7 +1295,7 @@@ static int gen8_alloc_va_range_3lvl(str
  {
        struct i915_hw_ppgtt *ppgtt = i915_vm_to_ppgtt(vm);
        unsigned long *new_page_dirs, *new_page_tables;
 -      struct drm_i915_private *dev_priv = to_i915(vm->dev);
 +      struct drm_i915_private *dev_priv = vm->i915;
        struct i915_page_directory *pd;
        const uint64_t orig_start = start;
        const uint64_t orig_length = length;
        uint32_t pdpes = I915_PDPES_PER_PDP(dev_priv);
        int ret;
  
 -      /* Wrap is never okay since we can only represent 48b, and we don't
 -       * actually use the other side of the canonical address space.
 -       */
 -      if (WARN_ON(start + length < start))
 -              return -ENODEV;
 -
 -      if (WARN_ON(start + length > vm->total))
 -              return -ENODEV;
 -
        ret = alloc_gen8_temp_bitmaps(&new_page_dirs, &new_page_tables, pdpes);
        if (ret)
                return ret;
@@@ -1435,7 -1450,7 +1435,7 @@@ static int gen8_alloc_va_range_4lvl(str
  
  err_out:
        for_each_set_bit(pml4e, new_pdps, GEN8_PML4ES_PER_PML4)
 -              gen8_ppgtt_cleanup_3lvl(to_i915(vm->dev), pml4->pdps[pml4e]);
 +              gen8_ppgtt_cleanup_3lvl(vm->i915, pml4->pdps[pml4e]);
  
        return ret;
  }
@@@ -1445,7 -1460,7 +1445,7 @@@ static int gen8_alloc_va_range(struct i
  {
        struct i915_hw_ppgtt *ppgtt = i915_vm_to_ppgtt(vm);
  
 -      if (USES_FULL_48BIT_PPGTT(to_i915(vm->dev)))
 +      if (USES_FULL_48BIT_PPGTT(vm->i915))
                return gen8_alloc_va_range_4lvl(vm, &ppgtt->pml4, start, length);
        else
                return gen8_alloc_va_range_3lvl(vm, &ppgtt->pdp, start, length);
@@@ -1516,7 -1531,7 +1516,7 @@@ static void gen8_dump_ppgtt(struct i915
        gen8_pte_t scratch_pte = gen8_pte_encode(vm->scratch_page.daddr,
                                                 I915_CACHE_LLC);
  
 -      if (!USES_FULL_48BIT_PPGTT(to_i915(vm->dev))) {
 +      if (!USES_FULL_48BIT_PPGTT(vm->i915)) {
                gen8_dump_pdp(&ppgtt->pdp, start, length, scratch_pte, m);
        } else {
                uint64_t pml4e;
@@@ -1569,7 -1584,7 +1569,7 @@@ static int gen8_preallocate_top_level_p
   */
  static int gen8_ppgtt_init(struct i915_hw_ppgtt *ppgtt)
  {
 -      struct drm_i915_private *dev_priv = to_i915(ppgtt->base.dev);
 +      struct drm_i915_private *dev_priv = ppgtt->base.i915;
        int ret;
  
        ret = gen8_init_scratch(&ppgtt->base);
@@@ -1912,7 -1927,7 +1912,7 @@@ static int gen6_alloc_va_range(struct i
                               uint64_t start_in, uint64_t length_in)
  {
        DECLARE_BITMAP(new_page_tables, I915_PDES);
 -      struct drm_i915_private *dev_priv = to_i915(vm->dev);
 +      struct drm_i915_private *dev_priv = vm->i915;
        struct i915_ggtt *ggtt = &dev_priv->ggtt;
        struct i915_hw_ppgtt *ppgtt = i915_vm_to_ppgtt(vm);
        struct i915_page_table *pt;
        uint32_t pde;
        int ret;
  
 -      if (WARN_ON(start_in + length_in > ppgtt->base.total))
 -              return -ENODEV;
 -
        start = start_save = start_in;
        length = length_save = length_in;
  
@@@ -1996,7 -2014,7 +1996,7 @@@ unwind_out
  
  static int gen6_init_scratch(struct i915_address_space *vm)
  {
 -      struct drm_i915_private *dev_priv = to_i915(vm->dev);
 +      struct drm_i915_private *dev_priv = vm->i915;
        int ret;
  
        ret = setup_scratch_page(dev_priv, &vm->scratch_page, I915_GFP_DMA);
  
  static void gen6_free_scratch(struct i915_address_space *vm)
  {
 -      struct drm_i915_private *dev_priv = to_i915(vm->dev);
 +      struct drm_i915_private *dev_priv = vm->i915;
  
        free_pt(dev_priv, vm->scratch_pt);
        cleanup_scratch_page(dev_priv, &vm->scratch_page);
@@@ -2026,7 -2044,7 +2026,7 @@@ static void gen6_ppgtt_cleanup(struct i
  {
        struct i915_hw_ppgtt *ppgtt = i915_vm_to_ppgtt(vm);
        struct i915_page_directory *pd = &ppgtt->pd;
 -      struct drm_i915_private *dev_priv = to_i915(vm->dev);
 +      struct drm_i915_private *dev_priv = vm->i915;
        struct i915_page_table *pt;
        uint32_t pde;
  
  static int gen6_ppgtt_allocate_page_directories(struct i915_hw_ppgtt *ppgtt)
  {
        struct i915_address_space *vm = &ppgtt->base;
 -      struct drm_i915_private *dev_priv = to_i915(ppgtt->base.dev);
 +      struct drm_i915_private *dev_priv = ppgtt->base.i915;
        struct i915_ggtt *ggtt = &dev_priv->ggtt;
        bool retried = false;
        int ret;
                return ret;
  
  alloc:
 -      ret = drm_mm_insert_node_in_range_generic(&ggtt->base.mm,
 -                                                &ppgtt->node, GEN6_PD_SIZE,
 -                                                GEN6_PD_ALIGN, 0,
 +      ret = drm_mm_insert_node_in_range_generic(&ggtt->base.mm, &ppgtt->node,
 +                                                GEN6_PD_SIZE, GEN6_PD_ALIGN,
 +                                                I915_COLOR_UNEVICTABLE,
                                                  0, ggtt->base.total,
                                                  DRM_MM_TOPDOWN);
        if (ret == -ENOSPC && !retried) {
                ret = i915_gem_evict_something(&ggtt->base,
                                               GEN6_PD_SIZE, GEN6_PD_ALIGN,
 -                                             I915_CACHE_NONE,
 +                                             I915_COLOR_UNEVICTABLE,
                                               0, ggtt->base.total,
                                               0);
                if (ret)
@@@ -2107,7 -2125,7 +2107,7 @@@ static void gen6_scratch_va_range(struc
  
  static int gen6_ppgtt_init(struct i915_hw_ppgtt *ppgtt)
  {
 -      struct drm_i915_private *dev_priv = to_i915(ppgtt->base.dev);
 +      struct drm_i915_private *dev_priv = ppgtt->base.i915;
        struct i915_ggtt *ggtt = &dev_priv->ggtt;
        int ret;
  
  static int __hw_ppgtt_init(struct i915_hw_ppgtt *ppgtt,
                           struct drm_i915_private *dev_priv)
  {
 -      ppgtt->base.dev = &dev_priv->drm;
 +      ppgtt->base.i915 = dev_priv;
  
        if (INTEL_INFO(dev_priv)->gen < 8)
                return gen6_ppgtt_init(ppgtt);
@@@ -2380,7 -2398,7 +2380,7 @@@ static void gen8_ggtt_insert_page(struc
                                  enum i915_cache_level level,
                                  u32 unused)
  {
 -      struct drm_i915_private *dev_priv = to_i915(vm->dev);
 +      struct drm_i915_private *dev_priv = vm->i915;
        gen8_pte_t __iomem *pte =
                (gen8_pte_t __iomem *)dev_priv->ggtt.gsm +
                (offset >> PAGE_SHIFT);
@@@ -2396,7 -2414,7 +2396,7 @@@ static void gen8_ggtt_insert_entries(st
                                     uint64_t start,
                                     enum i915_cache_level level, u32 unused)
  {
 -      struct drm_i915_private *dev_priv = to_i915(vm->dev);
 +      struct drm_i915_private *dev_priv = vm->i915;
        struct i915_ggtt *ggtt = i915_vm_to_ggtt(vm);
        struct sgt_iter sgt_iter;
        gen8_pte_t __iomem *gtt_entries;
@@@ -2461,7 -2479,7 +2461,7 @@@ static void gen6_ggtt_insert_page(struc
                                  enum i915_cache_level level,
                                  u32 flags)
  {
 -      struct drm_i915_private *dev_priv = to_i915(vm->dev);
 +      struct drm_i915_private *dev_priv = vm->i915;
        gen6_pte_t __iomem *pte =
                (gen6_pte_t __iomem *)dev_priv->ggtt.gsm +
                (offset >> PAGE_SHIFT);
@@@ -2483,7 -2501,7 +2483,7 @@@ static void gen6_ggtt_insert_entries(st
                                     uint64_t start,
                                     enum i915_cache_level level, u32 flags)
  {
 -      struct drm_i915_private *dev_priv = to_i915(vm->dev);
 +      struct drm_i915_private *dev_priv = vm->i915;
        struct i915_ggtt *ggtt = i915_vm_to_ggtt(vm);
        struct sgt_iter sgt_iter;
        gen6_pte_t __iomem *gtt_entries;
@@@ -2603,7 -2621,7 +2603,7 @@@ static int ggtt_bind_vma(struct i915_vm
                         enum i915_cache_level cache_level,
                         u32 flags)
  {
 -      struct drm_i915_private *i915 = to_i915(vma->vm->dev);
 +      struct drm_i915_private *i915 = vma->vm->i915;
        struct drm_i915_gem_object *obj = vma->obj;
        u32 pte_flags = 0;
        int ret;
@@@ -2635,7 -2653,7 +2635,7 @@@ static int aliasing_gtt_bind_vma(struc
                                 enum i915_cache_level cache_level,
                                 u32 flags)
  {
 -      struct drm_i915_private *i915 = to_i915(vma->vm->dev);
 +      struct drm_i915_private *i915 = vma->vm->i915;
        u32 pte_flags;
        int ret;
  
  
  static void ggtt_unbind_vma(struct i915_vma *vma)
  {
 -      struct drm_i915_private *i915 = to_i915(vma->vm->dev);
 +      struct drm_i915_private *i915 = vma->vm->i915;
        struct i915_hw_ppgtt *appgtt = i915->mm.aliasing_ppgtt;
        const u64 size = min(vma->size, vma->node.size);
  
@@@ -2703,7 -2721,7 +2703,7 @@@ void i915_gem_gtt_finish_pages(struct d
        dma_unmap_sg(kdev, pages->sgl, pages->nents, PCI_DMA_BIDIRECTIONAL);
  }
  
- static void i915_gtt_color_adjust(struct drm_mm_node *node,
+ static void i915_gtt_color_adjust(const struct drm_mm_node *node,
                                  unsigned long color,
                                  u64 *start,
                                  u64 *end)
        if (node->color != color)
                *start += 4096;
  
-       node = list_first_entry_or_null(&node->node_list,
-                                       struct drm_mm_node,
-                                       node_list);
-       if (node && node->allocated && node->color != color)
+       node = list_next_entry(node, node_list);
+       if (node->allocated && node->color != color)
                *end -= 4096;
  }
  
@@@ -2742,8 -2758,7 +2740,8 @@@ int i915_gem_init_ggtt(struct drm_i915_
        /* Reserve a mappable slot for our lockless error capture */
        ret = drm_mm_insert_node_in_range_generic(&ggtt->base.mm,
                                                  &ggtt->error_capture,
 -                                                4096, 0, -1,
 +                                                4096, 0,
 +                                                I915_COLOR_UNEVICTABLE,
                                                  0, ggtt->mappable_end,
                                                  0, 0);
        if (ret)
@@@ -2912,8 -2927,8 +2910,8 @@@ static size_t gen9_get_stolen_size(u16 
  
  static int ggtt_probe_common(struct i915_ggtt *ggtt, u64 size)
  {
 -      struct drm_i915_private *dev_priv = to_i915(ggtt->base.dev);
 -      struct pci_dev *pdev = ggtt->base.dev->pdev;
 +      struct drm_i915_private *dev_priv = ggtt->base.i915;
 +      struct pci_dev *pdev = dev_priv->drm.pdev;
        phys_addr_t phys_addr;
        int ret;
  
         * resort to an uncached mapping. The WC issue is easily caught by the
         * readback check when writing GTT PTE entries.
         */
 -      if (IS_BROXTON(dev_priv))
 +      if (IS_GEN9_LP(dev_priv))
                ggtt->gsm = ioremap_nocache(phys_addr, size);
        else
                ggtt->gsm = ioremap_wc(phys_addr, size);
@@@ -3025,12 -3040,12 +3023,12 @@@ static void gen6_gmch_remove(struct i91
        struct i915_ggtt *ggtt = i915_vm_to_ggtt(vm);
  
        iounmap(ggtt->gsm);
 -      cleanup_scratch_page(to_i915(vm->dev), &vm->scratch_page);
 +      cleanup_scratch_page(vm->i915, &vm->scratch_page);
  }
  
  static int gen8_gmch_probe(struct i915_ggtt *ggtt)
  {
 -      struct drm_i915_private *dev_priv = to_i915(ggtt->base.dev);
 +      struct drm_i915_private *dev_priv = ggtt->base.i915;
        struct pci_dev *pdev = dev_priv->drm.pdev;
        unsigned int size;
        u16 snb_gmch_ctl;
  
        ggtt->base.total = (size / sizeof(gen8_pte_t)) << PAGE_SHIFT;
  
 -      if (IS_CHERRYVIEW(dev_priv) || IS_BROXTON(dev_priv))
 +      if (IS_CHERRYVIEW(dev_priv) || IS_GEN9_LP(dev_priv))
                chv_setup_private_ppat(dev_priv);
        else
                bdw_setup_private_ppat(dev_priv);
  
  static int gen6_gmch_probe(struct i915_ggtt *ggtt)
  {
 -      struct drm_i915_private *dev_priv = to_i915(ggtt->base.dev);
 +      struct drm_i915_private *dev_priv = ggtt->base.i915;
        struct pci_dev *pdev = dev_priv->drm.pdev;
        unsigned int size;
        u16 snb_gmch_ctl;
@@@ -3132,7 -3147,7 +3130,7 @@@ static void i915_gmch_remove(struct i91
  
  static int i915_gmch_probe(struct i915_ggtt *ggtt)
  {
 -      struct drm_i915_private *dev_priv = to_i915(ggtt->base.dev);
 +      struct drm_i915_private *dev_priv = ggtt->base.i915;
        int ret;
  
        ret = intel_gmch_probe(dev_priv->bridge_dev, dev_priv->drm.pdev, NULL);
@@@ -3167,7 -3182,7 +3165,7 @@@ int i915_ggtt_probe_hw(struct drm_i915_
        struct i915_ggtt *ggtt = &dev_priv->ggtt;
        int ret;
  
 -      ggtt->base.dev = &dev_priv->drm;
 +      ggtt->base.i915 = dev_priv;
  
        if (INTEL_GEN(dev_priv) <= 5)
                ret = i915_gmch_probe(ggtt);
@@@ -3297,7 -3312,7 +3295,7 @@@ void i915_gem_restore_gtt_mappings(stru
        ggtt->base.closed = false;
  
        if (INTEL_GEN(dev_priv) >= 8) {
 -              if (IS_CHERRYVIEW(dev_priv) || IS_BROXTON(dev_priv))
 +              if (IS_CHERRYVIEW(dev_priv) || IS_GEN9_LP(dev_priv))
                        chv_setup_private_ppat(dev_priv);
                else
                        bdw_setup_private_ppat(dev_priv);
@@@ -95,13 -95,8 +95,13 @@@ __i915_vma_create(struct drm_i915_gem_o
        if (view) {
                vma->ggtt_view = *view;
                if (view->type == I915_GGTT_VIEW_PARTIAL) {
 +                      GEM_BUG_ON(range_overflows_t(u64,
 +                                                   view->params.partial.offset,
 +                                                   view->params.partial.size,
 +                                                   obj->base.size >> PAGE_SHIFT));
                        vma->size = view->params.partial.size;
                        vma->size <<= PAGE_SHIFT;
 +                      GEM_BUG_ON(vma->size >= obj->base.size);
                } else if (view->type == I915_GGTT_VIEW_ROTATED) {
                        vma->size =
                                intel_rotation_info_size(&view->params.rotated);
@@@ -181,11 -176,6 +181,11 @@@ int i915_vma_bind(struct i915_vma *vma
        if (bind_flags == 0)
                return 0;
  
 +      if (GEM_WARN_ON(range_overflows(vma->node.start,
 +                                      vma->node.size,
 +                                      vma->vm->total)))
 +              return -ENODEV;
 +
        if (vma_flags == 0 && vma->vm->allocate_va_range) {
                trace_i915_va_alloc(vma);
                ret = vma->vm->allocate_va_range(vma->vm,
@@@ -208,9 -198,9 +208,9 @@@ void __iomem *i915_vma_pin_iomap(struc
        void __iomem *ptr;
  
        /* Access through the GTT requires the device to be awake. */
 -      assert_rpm_wakelock_held(to_i915(vma->vm->dev));
 +      assert_rpm_wakelock_held(vma->vm->i915);
  
 -      lockdep_assert_held(&vma->vm->dev->struct_mutex);
 +      lockdep_assert_held(&vma->vm->i915->drm.struct_mutex);
        if (WARN_ON(!i915_vma_is_map_and_fenceable(vma)))
                return IO_ERR_PTR(-ENODEV);
  
@@@ -307,14 -297,10 +307,14 @@@ void __i915_vma_set_map_and_fenceable(s
                vma->flags &= ~I915_VMA_CAN_FENCE;
  }
  
 -bool i915_gem_valid_gtt_space(struct i915_vma *vma,
 -                            unsigned long cache_level)
 +static bool color_differs(struct drm_mm_node *node, unsigned long color)
 +{
 +      return node->allocated && node->color != color;
 +}
 +
 +bool i915_gem_valid_gtt_space(struct i915_vma *vma, unsigned long cache_level)
  {
 -      struct drm_mm_node *gtt_space = &vma->node;
 +      struct drm_mm_node *node = &vma->node;
        struct drm_mm_node *other;
  
        /*
        if (vma->vm->mm.color_adjust == NULL)
                return true;
  
 -      if (!drm_mm_node_allocated(gtt_space))
 -              return true;
 -
 -      if (list_empty(&gtt_space->node_list))
 -              return true;
 +      /* Only valid to be called on an already inserted vma */
 +      GEM_BUG_ON(!drm_mm_node_allocated(node));
 +      GEM_BUG_ON(list_empty(&node->node_list));
  
 -      other = list_entry(gtt_space->node_list.prev, struct drm_mm_node, node_list);
 -      if (other->allocated && !drm_mm_hole_follows(other) && other->color != cache_level)
 +      other = list_prev_entry(node, node_list);
-       if (color_differs(other, cache_level) && !other->hole_follows)
++      if (color_differs(other, cache_level) && !drm_mm_hole_follows(other))
                return false;
  
 -      other = list_entry(gtt_space->node_list.next, struct drm_mm_node, node_list);
 -      if (other->allocated && !drm_mm_hole_follows(gtt_space) && other->color != cache_level)
 +      other = list_next_entry(node, node_list);
-       if (color_differs(other, cache_level) && !node->hole_follows)
++      if (color_differs(other, cache_level) && !drm_mm_hole_follows(node))
                return false;
  
        return true;
  static int
  i915_vma_insert(struct i915_vma *vma, u64 size, u64 alignment, u64 flags)
  {
 -      struct drm_i915_private *dev_priv = to_i915(vma->vm->dev);
 +      struct drm_i915_private *dev_priv = vma->vm->i915;
        struct drm_i915_gem_object *obj = vma->obj;
        u64 start, end;
        int ret;
                vma->node.color = obj->cache_level;
                ret = drm_mm_reserve_node(&vma->vm->mm, &vma->node);
                if (ret) {
 -                      ret = i915_gem_evict_for_vma(vma);
 +                      ret = i915_gem_evict_for_vma(vma, flags);
                        if (ret == 0)
                                ret = drm_mm_reserve_node(&vma->vm->mm, &vma->node);
                        if (ret)
@@@ -481,7 -469,7 +481,7 @@@ int __i915_vma_do_pin(struct i915_vma *
        unsigned int bound = vma->flags;
        int ret;
  
 -      lockdep_assert_held(&vma->vm->dev->struct_mutex);
 +      lockdep_assert_held(&vma->vm->i915->drm.struct_mutex);
        GEM_BUG_ON((flags & (PIN_GLOBAL | PIN_USER)) == 0);
        GEM_BUG_ON((flags & PIN_GLOBAL) && !i915_vma_is_ggtt(vma));
  
@@@ -579,7 -567,7 +579,7 @@@ int i915_vma_unbind(struct i915_vma *vm
  
                for_each_active(active, idx) {
                        ret = i915_gem_active_retire(&vma->last_read[idx],
 -                                                 &vma->vm->dev->struct_mutex);
 +                                                   &vma->vm->i915->drm.struct_mutex);
                        if (ret)
                                break;
                }
         * reaped by the shrinker.
         */
        i915_gem_object_unpin_pages(obj);
 +      GEM_BUG_ON(atomic_read(&obj->mm.pages_pin_count) < obj->bind_count);
  
  destroy:
        if (unlikely(i915_vma_is_closed(vma)))
@@@ -115,15 -115,15 +115,15 @@@ static void chv_prepare_pll(struct inte
                            const struct intel_crtc_state *pipe_config);
  static void intel_begin_crtc_commit(struct drm_crtc *, struct drm_crtc_state *);
  static void intel_finish_crtc_commit(struct drm_crtc *, struct drm_crtc_state *);
 -static void skl_init_scalers(struct drm_i915_private *dev_priv,
 -                           struct intel_crtc *crtc,
 -                           struct intel_crtc_state *crtc_state);
 +static void intel_crtc_init_scalers(struct intel_crtc *crtc,
 +                                  struct intel_crtc_state *crtc_state);
  static void skylake_pfit_enable(struct intel_crtc *crtc);
  static void ironlake_pfit_disable(struct intel_crtc *crtc, bool force);
  static void ironlake_pfit_enable(struct intel_crtc *crtc);
  static void intel_modeset_setup_hw_state(struct drm_device *dev);
  static void intel_pre_disable_primary_noatomic(struct drm_crtc *crtc);
  static int ilk_max_pixel_rate(struct drm_atomic_state *state);
 +static int glk_calc_cdclk(int max_pixclk);
  static int bxt_calc_cdclk(int max_pixclk);
  
  struct intel_limit {
@@@ -614,12 -614,12 +614,12 @@@ static bool intel_PLL_is_valid(struct d
                INTELPllInvalid("m1 out of range\n");
  
        if (!IS_PINEVIEW(dev_priv) && !IS_VALLEYVIEW(dev_priv) &&
 -          !IS_CHERRYVIEW(dev_priv) && !IS_BROXTON(dev_priv))
 +          !IS_CHERRYVIEW(dev_priv) && !IS_GEN9_LP(dev_priv))
                if (clock->m1 <= clock->m2)
                        INTELPllInvalid("m1 <= m2\n");
  
        if (!IS_VALLEYVIEW(dev_priv) && !IS_CHERRYVIEW(dev_priv) &&
 -          !IS_BROXTON(dev_priv)) {
 +          !IS_GEN9_LP(dev_priv)) {
                if (clock->p < limit->p.min || limit->p.max < clock->p)
                        INTELPllInvalid("p out of range\n");
                if (clock->m < limit->m.min || limit->m.max < clock->m)
@@@ -1232,7 -1232,7 +1232,7 @@@ static void assert_cursor(struct drm_i9
  {
        bool cur_state;
  
 -      if (IS_845G(dev_priv) || IS_I865G(dev_priv))
 +      if (IS_I845G(dev_priv) || IS_I865G(dev_priv))
                cur_state = I915_READ(CURCNTR(PIPE_A)) & CURSOR_ENABLE;
        else
                cur_state = I915_READ(CURCNTR(pipe)) & CURSOR_MODE;
@@@ -1327,7 -1327,7 +1327,7 @@@ static void assert_sprites_disabled(str
                }
        } else if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv)) {
                for_each_sprite(dev_priv, pipe, sprite) {
 -                      u32 val = I915_READ(SPCNTR(pipe, sprite));
 +                      u32 val = I915_READ(SPCNTR(pipe, PLANE_SPRITE0 + sprite));
                        I915_STATE_WARN(val & SP_ENABLE,
                             "sprite %c assertion failure, should be off on pipe %c but is still active\n",
                             sprite_name(pipe, sprite), pipe_name(pipe));
@@@ -2149,7 -2149,7 +2149,7 @@@ static unsigned int intel_linear_alignm
  {
        if (INTEL_INFO(dev_priv)->gen >= 9)
                return 256 * 1024;
 -      else if (IS_BROADWATER(dev_priv) || IS_CRESTLINE(dev_priv) ||
 +      else if (IS_I965G(dev_priv) || IS_I965GM(dev_priv) ||
                 IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv))
                return 128 * 1024;
        else if (INTEL_INFO(dev_priv)->gen >= 4)
@@@ -2275,7 -2275,7 +2275,7 @@@ u32 intel_fb_xy_to_linear(int x, int y
                          int plane)
  {
        const struct drm_framebuffer *fb = state->base.fb;
-       unsigned int cpp = drm_format_plane_cpp(fb->pixel_format, plane);
+       unsigned int cpp = fb->format->cpp[plane];
        unsigned int pitch = fb->pitches[plane];
  
        return y * pitch + x * cpp;
@@@ -2344,7 -2344,7 +2344,7 @@@ static u32 intel_adjust_tile_offset(in
  {
        const struct drm_i915_private *dev_priv = to_i915(state->base.plane->dev);
        const struct drm_framebuffer *fb = state->base.fb;
-       unsigned int cpp = drm_format_plane_cpp(fb->pixel_format, plane);
+       unsigned int cpp = fb->format->cpp[plane];
        unsigned int rotation = state->base.rotation;
        unsigned int pitch = intel_fb_pitch(fb, plane, rotation);
  
@@@ -2400,7 -2400,7 +2400,7 @@@ static u32 _intel_compute_tile_offset(c
                                      u32 alignment)
  {
        uint64_t fb_modifier = fb->modifier;
-       unsigned int cpp = drm_format_plane_cpp(fb->pixel_format, plane);
+       unsigned int cpp = fb->format->cpp[plane];
        u32 offset, offset_aligned;
  
        if (alignment)
@@@ -2455,7 -2455,7 +2455,7 @@@ u32 intel_compute_tile_offset(int *x, i
        u32 alignment;
  
        /* AUX_DIST needs only 4K alignment */
-       if (fb->pixel_format == DRM_FORMAT_NV12 && plane == 1)
+       if (fb->format->format == DRM_FORMAT_NV12 && plane == 1)
                alignment = 4096;
        else
                alignment = intel_surf_alignment(dev_priv, fb->modifier);
  static void intel_fb_offset_to_xy(int *x, int *y,
                                  const struct drm_framebuffer *fb, int plane)
  {
-       unsigned int cpp = drm_format_plane_cpp(fb->pixel_format, plane);
+       unsigned int cpp = fb->format->cpp[plane];
        unsigned int pitch = fb->pitches[plane];
        u32 linear_offset = fb->offsets[plane];
  
@@@ -2496,8 -2496,7 +2496,7 @@@ intel_fill_fb_info(struct drm_i915_priv
        struct intel_rotation_info *rot_info = &intel_fb->rot_info;
        u32 gtt_offset_rotated = 0;
        unsigned int max_size = 0;
-       uint32_t format = fb->pixel_format;
-       int i, num_planes = drm_format_num_planes(format);
+       int i, num_planes = fb->format->num_planes;
        unsigned int tile_size = intel_tile_size(dev_priv);
  
        for (i = 0; i < num_planes; i++) {
                u32 offset;
                int x, y;
  
-               cpp = drm_format_plane_cpp(format, i);
-               width = drm_format_plane_width(fb->width, format, i);
-               height = drm_format_plane_height(fb->height, format, i);
+               cpp = fb->format->cpp[i];
+               width = drm_framebuffer_plane_width(fb->width, fb, i);
+               height = drm_framebuffer_plane_height(fb->height, fb, i);
  
                intel_fb_offset_to_xy(&x, &y, fb, i);
  
@@@ -2689,7 -2688,7 +2688,7 @@@ intel_alloc_initial_plane_obj(struct in
  
        mutex_lock(&dev->struct_mutex);
  
 -      obj = i915_gem_object_create_stolen_for_preallocated(dev,
 +      obj = i915_gem_object_create_stolen_for_preallocated(dev_priv,
                                                             base_aligned,
                                                             base_aligned,
                                                             size_aligned);
        if (plane_config->tiling == I915_TILING_X)
                obj->tiling_and_stride = fb->pitches[0] | I915_TILING_X;
  
-       mode_cmd.pixel_format = fb->pixel_format;
+       mode_cmd.pixel_format = fb->format->format;
        mode_cmd.width = fb->width;
        mode_cmd.height = fb->height;
        mode_cmd.pitches[0] = fb->pitches[0];
@@@ -2833,7 -2832,7 +2832,7 @@@ valid_fb
  static int skl_max_plane_width(const struct drm_framebuffer *fb, int plane,
                               unsigned int rotation)
  {
-       int cpp = drm_format_plane_cpp(fb->pixel_format, plane);
+       int cpp = fb->format->cpp[plane];
  
        switch (fb->modifier) {
        case DRM_FORMAT_MOD_NONE:
@@@ -2912,7 -2911,7 +2911,7 @@@ static int skl_check_main_surface(struc
         * TODO: linear and Y-tiled seem fine, Yf untested,
         */
        if (fb->modifier == I915_FORMAT_MOD_X_TILED) {
-               int cpp = drm_format_plane_cpp(fb->pixel_format, 0);
+               int cpp = fb->format->cpp[0];
  
                while ((x + w) * cpp > fb->pitches[0]) {
                        if (offset == 0) {
@@@ -2977,7 -2976,7 +2976,7 @@@ int skl_check_plane_surface(struct inte
         * Handle the AUX surface first since
         * the main surface setup depends on it.
         */
-       if (fb->pixel_format == DRM_FORMAT_NV12) {
+       if (fb->format->format == DRM_FORMAT_NV12) {
                ret = skl_check_nv12_aux_surface(plane_state);
                if (ret)
                        return ret;
@@@ -3032,7 -3031,7 +3031,7 @@@ static void i9xx_update_primary_plane(s
                I915_WRITE(PRIMCNSTALPHA(plane), 0);
        }
  
-       switch (fb->pixel_format) {
+       switch (fb->format->format) {
        case DRM_FORMAT_C8:
                dspcntr |= DISPPLANE_8BPP;
                break;
@@@ -3147,7 -3146,7 +3146,7 @@@ static void ironlake_update_primary_pla
        if (IS_HASWELL(dev_priv) || IS_BROADWELL(dev_priv))
                dspcntr |= DISPPLANE_PIPE_CSC_ENABLE;
  
-       switch (fb->pixel_format) {
+       switch (fb->format->format) {
        case DRM_FORMAT_C8:
                dspcntr |= DISPPLANE_8BPP;
                break;
@@@ -3278,12 -3277,12 +3277,12 @@@ u32 skl_plane_stride(const struct drm_f
         * linear buffers or in number of tiles for tiled buffers.
         */
        if (drm_rotation_90_or_270(rotation)) {
-               int cpp = drm_format_plane_cpp(fb->pixel_format, plane);
+               int cpp = fb->format->cpp[plane];
  
                stride /= intel_tile_height(dev_priv, fb->modifier, cpp);
        } else {
                stride /= intel_fb_stride_alignment(dev_priv, fb->modifier,
-                                                   fb->pixel_format);
+                                                   fb->format->format);
        }
  
        return stride;
@@@ -3378,8 -3377,7 +3377,8 @@@ static void skylake_update_primary_plan
        struct drm_i915_private *dev_priv = to_i915(dev);
        struct intel_crtc *intel_crtc = to_intel_crtc(crtc_state->base.crtc);
        struct drm_framebuffer *fb = plane_state->base.fb;
 -      int pipe = intel_crtc->pipe;
 +      enum plane_id plane_id = to_intel_plane(plane)->id;
 +      enum pipe pipe = to_intel_plane(plane)->pipe;
        u32 plane_ctl;
        unsigned int rotation = plane_state->base.rotation;
        u32 stride = skl_plane_stride(fb, 0, rotation);
                    PLANE_CTL_PIPE_GAMMA_ENABLE |
                    PLANE_CTL_PIPE_CSC_ENABLE;
  
-       plane_ctl |= skl_plane_ctl_format(fb->pixel_format);
+       plane_ctl |= skl_plane_ctl_format(fb->format->format);
        plane_ctl |= skl_plane_ctl_tiling(fb->modifier);
        plane_ctl |= PLANE_CTL_PLANE_GAMMA_DISABLE;
        plane_ctl |= skl_plane_ctl_rotation(rotation);
        intel_crtc->adjusted_x = src_x;
        intel_crtc->adjusted_y = src_y;
  
 -      I915_WRITE(PLANE_CTL(pipe, 0), plane_ctl);
 -      I915_WRITE(PLANE_OFFSET(pipe, 0), (src_y << 16) | src_x);
 -      I915_WRITE(PLANE_STRIDE(pipe, 0), stride);
 -      I915_WRITE(PLANE_SIZE(pipe, 0), (src_h << 16) | src_w);
 +      I915_WRITE(PLANE_CTL(pipe, plane_id), plane_ctl);
 +      I915_WRITE(PLANE_OFFSET(pipe, plane_id), (src_y << 16) | src_x);
 +      I915_WRITE(PLANE_STRIDE(pipe, plane_id), stride);
 +      I915_WRITE(PLANE_SIZE(pipe, plane_id), (src_h << 16) | src_w);
  
        if (scaler_id >= 0) {
                uint32_t ps_ctrl = 0;
  
                WARN_ON(!dst_w || !dst_h);
 -              ps_ctrl = PS_SCALER_EN | PS_PLANE_SEL(0) |
 +              ps_ctrl = PS_SCALER_EN | PS_PLANE_SEL(plane_id) |
                        crtc_state->scaler_state.scalers[scaler_id].mode;
                I915_WRITE(SKL_PS_CTRL(pipe, scaler_id), ps_ctrl);
                I915_WRITE(SKL_PS_PWR_GATE(pipe, scaler_id), 0);
                I915_WRITE(SKL_PS_WIN_POS(pipe, scaler_id), (dst_x << 16) | dst_y);
                I915_WRITE(SKL_PS_WIN_SZ(pipe, scaler_id), (dst_w << 16) | dst_h);
 -              I915_WRITE(PLANE_POS(pipe, 0), 0);
 +              I915_WRITE(PLANE_POS(pipe, plane_id), 0);
        } else {
 -              I915_WRITE(PLANE_POS(pipe, 0), (dst_y << 16) | dst_x);
 +              I915_WRITE(PLANE_POS(pipe, plane_id), (dst_y << 16) | dst_x);
        }
  
 -      I915_WRITE(PLANE_SURF(pipe, 0),
 +      I915_WRITE(PLANE_SURF(pipe, plane_id),
                   intel_fb_gtt_offset(fb, rotation) + surf_addr);
  
 -      POSTING_READ(PLANE_SURF(pipe, 0));
 +      POSTING_READ(PLANE_SURF(pipe, plane_id));
  }
  
  static void skylake_disable_primary_plane(struct drm_plane *primary,
  {
        struct drm_device *dev = crtc->dev;
        struct drm_i915_private *dev_priv = to_i915(dev);
 -      struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
 -      int pipe = intel_crtc->pipe;
 +      enum plane_id plane_id = to_intel_plane(primary)->id;
 +      enum pipe pipe = to_intel_plane(primary)->pipe;
  
 -      I915_WRITE(PLANE_CTL(pipe, 0), 0);
 -      I915_WRITE(PLANE_SURF(pipe, 0), 0);
 -      POSTING_READ(PLANE_SURF(pipe, 0));
 +      I915_WRITE(PLANE_CTL(pipe, plane_id), 0);
 +      I915_WRITE(PLANE_SURF(pipe, plane_id), 0);
 +      POSTING_READ(PLANE_SURF(pipe, plane_id));
  }
  
  /* Assume fb object is pinned & idle & fenced and just update base pointers */
@@@ -4228,8 -4226,9 +4227,8 @@@ static void ironlake_fdi_disable(struc
        udelay(100);
  }
  
 -bool intel_has_pending_fb_unpin(struct drm_device *dev)
 +bool intel_has_pending_fb_unpin(struct drm_i915_private *dev_priv)
  {
 -      struct drm_i915_private *dev_priv = to_i915(dev);
        struct intel_crtc *crtc;
  
        /* Note that we don't need to be called with mode_config.lock here
         * cannot claim and pin a new fb without at least acquring the
         * struct_mutex and so serialising with us.
         */
 -      for_each_intel_crtc(dev, crtc) {
 +      for_each_intel_crtc(&dev_priv->drm, crtc) {
                if (atomic_read(&crtc->unpin_work_count) == 0)
                        continue;
  
@@@ -4769,7 -4768,7 +4768,7 @@@ static int skl_update_scaler_plane(stru
        }
  
        /* Check src format */
-       switch (fb->pixel_format) {
+       switch (fb->format->format) {
        case DRM_FORMAT_RGB565:
        case DRM_FORMAT_XBGR8888:
        case DRM_FORMAT_XRGB8888:
        default:
                DRM_DEBUG_KMS("[PLANE:%d:%s] FB:%d unsupported scaling format 0x%x\n",
                              intel_plane->base.base.id, intel_plane->base.name,
-                             fb->base.id, fb->pixel_format);
+                             fb->base.id, fb->format->format);
                return -EINVAL;
        }
  
@@@ -5020,9 -5019,11 +5019,9 @@@ intel_pre_disable_primary_noatomic(stru
         * event which is after the vblank start event, so we need to have a
         * wait-for-vblank between disabling the plane and the pipe.
         */
 -      if (HAS_GMCH_DISPLAY(dev_priv)) {
 -              intel_set_memory_cxsr(dev_priv, false);
 -              dev_priv->wm.vlv.cxsr = false;
 +      if (HAS_GMCH_DISPLAY(dev_priv) &&
 +          intel_set_memory_cxsr(dev_priv, false))
                intel_wait_for_vblank(dev_priv, pipe);
 -      }
  }
  
  static void intel_post_plane_update(struct intel_crtc_state *old_crtc_state)
@@@ -5097,9 -5098,11 +5096,9 @@@ static void intel_pre_plane_update(stru
                 * event which is after the vblank start event, so we need to have a
                 * wait-for-vblank between disabling the plane and the pipe.
                 */
 -              if (old_crtc_state->base.active) {
 -                      intel_set_memory_cxsr(dev_priv, false);
 -                      dev_priv->wm.vlv.cxsr = false;
 +              if (old_crtc_state->base.active &&
 +                  intel_set_memory_cxsr(dev_priv, false))
                        intel_wait_for_vblank(dev_priv, crtc->pipe);
 -              }
        }
  
        /*
         *
         * WaCxSRDisabledForSpriteScaling:ivb
         */
 -      if (pipe_config->disable_lp_wm) {
 -              ilk_disable_lp_wm(dev);
 +      if (pipe_config->disable_lp_wm && ilk_disable_lp_wm(dev))
                intel_wait_for_vblank(dev_priv, crtc->pipe);
 -      }
  
        /*
         * If we're doing a modeset, we're done.  No need to do any pre-vblank
@@@ -5458,7 -5463,10 +5457,7 @@@ static void haswell_crtc_enable(struct 
                intel_ddi_enable_transcoder_func(crtc);
  
        if (dev_priv->display.initial_watermarks != NULL)
 -              dev_priv->display.initial_watermarks(old_intel_state,
 -                                                   pipe_config);
 -      else
 -              intel_update_watermarks(intel_crtc);
 +              dev_priv->display.initial_watermarks(old_intel_state, pipe_config);
  
        /* XXX: Do the pipe assertions at the right place for BXT DSI. */
        if (!transcoder_is_dsi(cpu_transcoder))
@@@ -5795,10 -5803,8 +5794,10 @@@ static int intel_compute_max_dotclk(str
  {
        int max_cdclk_freq = dev_priv->max_cdclk_freq;
  
 -      if (INTEL_INFO(dev_priv)->gen >= 9 ||
 -          IS_HASWELL(dev_priv) || IS_BROADWELL(dev_priv))
 +      if (IS_GEMINILAKE(dev_priv))
 +              return 2 * max_cdclk_freq;
 +      else if (INTEL_INFO(dev_priv)->gen >= 9 ||
 +               IS_HASWELL(dev_priv) || IS_BROADWELL(dev_priv))
                return max_cdclk_freq;
        else if (IS_CHERRYVIEW(dev_priv))
                return max_cdclk_freq*95/100;
@@@ -5834,8 -5840,6 +5833,8 @@@ static void intel_update_max_cdclk(stru
                        max_cdclk = 308571;
  
                dev_priv->max_cdclk_freq = skl_calc_cdclk(max_cdclk, vco);
 +      } else if (IS_GEMINILAKE(dev_priv)) {
 +              dev_priv->max_cdclk_freq = 316800;
        } else if (IS_BROXTON(dev_priv)) {
                dev_priv->max_cdclk_freq = 624000;
        } else if (IS_BROADWELL(dev_priv))  {
@@@ -5923,26 -5927,6 +5922,26 @@@ static int bxt_de_pll_vco(struct drm_i9
        return dev_priv->cdclk_pll.ref * ratio;
  }
  
 +static int glk_de_pll_vco(struct drm_i915_private *dev_priv, int cdclk)
 +{
 +      int ratio;
 +
 +      if (cdclk == dev_priv->cdclk_pll.ref)
 +              return 0;
 +
 +      switch (cdclk) {
 +      default:
 +              MISSING_CASE(cdclk);
 +      case  79200:
 +      case 158400:
 +      case 316800:
 +              ratio = 33;
 +              break;
 +      }
 +
 +      return dev_priv->cdclk_pll.ref * ratio;
 +}
 +
  static void bxt_de_pll_disable(struct drm_i915_private *dev_priv)
  {
        I915_WRITE(BXT_DE_PLL_ENABLE, 0);
@@@ -5984,10 -5968,7 +5983,10 @@@ static void bxt_set_cdclk(struct drm_i9
        u32 val, divider;
        int vco, ret;
  
 -      vco = bxt_de_pll_vco(dev_priv, cdclk);
 +      if (IS_GEMINILAKE(dev_priv))
 +              vco = glk_de_pll_vco(dev_priv, cdclk);
 +      else
 +              vco = bxt_de_pll_vco(dev_priv, cdclk);
  
        DRM_DEBUG_DRIVER("Changing CDCLK to %d kHz (VCO %d kHz)\n", cdclk, vco);
  
                divider = BXT_CDCLK_CD2X_DIV_SEL_2;
                break;
        case 3:
 +              WARN(IS_GEMINILAKE(dev_priv), "Unsupported divider\n");
                divider = BXT_CDCLK_CD2X_DIV_SEL_1_5;
                break;
        case 2:
@@@ -6110,8 -6090,6 +6109,8 @@@ sanitize
  
  void bxt_init_cdclk(struct drm_i915_private *dev_priv)
  {
 +      int cdclk;
 +
        bxt_sanitize_cdclk(dev_priv);
  
        if (dev_priv->cdclk_freq != 0 && dev_priv->cdclk_pll.vco != 0)
         * - The initial CDCLK needs to be read from VBT.
         *   Need to make this change after VBT has changes for BXT.
         */
 -      bxt_set_cdclk(dev_priv, bxt_calc_cdclk(0));
 +      if (IS_GEMINILAKE(dev_priv))
 +              cdclk = glk_calc_cdclk(0);
 +      else
 +              cdclk = bxt_calc_cdclk(0);
 +
 +      bxt_set_cdclk(dev_priv, cdclk);
  }
  
  void bxt_uninit_cdclk(struct drm_i915_private *dev_priv)
@@@ -6270,24 -6243,35 +6269,24 @@@ skl_dpll0_disable(struct drm_i915_priva
        dev_priv->cdclk_pll.vco = 0;
  }
  
 -static bool skl_cdclk_pcu_ready(struct drm_i915_private *dev_priv)
 -{
 -      int ret;
 -      u32 val;
 -
 -      /* inform PCU we want to change CDCLK */
 -      val = SKL_CDCLK_PREPARE_FOR_CHANGE;
 -      mutex_lock(&dev_priv->rps.hw_lock);
 -      ret = sandybridge_pcode_read(dev_priv, SKL_PCODE_CDCLK_CONTROL, &val);
 -      mutex_unlock(&dev_priv->rps.hw_lock);
 -
 -      return ret == 0 && (val & SKL_CDCLK_READY_FOR_CHANGE);
 -}
 -
 -static bool skl_cdclk_wait_for_pcu_ready(struct drm_i915_private *dev_priv)
 -{
 -      return _wait_for(skl_cdclk_pcu_ready(dev_priv), 3000, 10) == 0;
 -}
 -
  static void skl_set_cdclk(struct drm_i915_private *dev_priv, int cdclk, int vco)
  {
        u32 freq_select, pcu_ack;
 +      int ret;
  
        WARN_ON((cdclk == 24000) != (vco == 0));
  
        DRM_DEBUG_DRIVER("Changing CDCLK to %d kHz (VCO %d kHz)\n", cdclk, vco);
  
 -      if (!skl_cdclk_wait_for_pcu_ready(dev_priv)) {
 -              DRM_ERROR("failed to inform PCU about cdclk change\n");
 +      mutex_lock(&dev_priv->rps.hw_lock);
 +      ret = skl_pcode_request(dev_priv, SKL_PCODE_CDCLK_CONTROL,
 +                              SKL_CDCLK_PREPARE_FOR_CHANGE,
 +                              SKL_CDCLK_READY_FOR_CHANGE,
 +                              SKL_CDCLK_READY_FOR_CHANGE, 3);
 +      mutex_unlock(&dev_priv->rps.hw_lock);
 +      if (ret) {
 +              DRM_ERROR("Failed to inform PCU about cdclk change (%d)\n",
 +                        ret);
                return;
        }
  
@@@ -6542,16 -6526,6 +6541,16 @@@ static int valleyview_calc_cdclk(struc
                return 200000;
  }
  
 +static int glk_calc_cdclk(int max_pixclk)
 +{
 +      if (max_pixclk > 2 * 158400)
 +              return 316800;
 +      else if (max_pixclk > 2 * 79200)
 +              return 158400;
 +      else
 +              return 79200;
 +}
 +
  static int bxt_calc_cdclk(int max_pixclk)
  {
        if (max_pixclk > 576000)
@@@ -6614,27 -6588,15 +6613,27 @@@ static int valleyview_modeset_calc_cdcl
  
  static int bxt_modeset_calc_cdclk(struct drm_atomic_state *state)
  {
 +      struct drm_i915_private *dev_priv = to_i915(state->dev);
        int max_pixclk = ilk_max_pixel_rate(state);
        struct intel_atomic_state *intel_state =
                to_intel_atomic_state(state);
 +      int cdclk;
  
 -      intel_state->cdclk = intel_state->dev_cdclk =
 -              bxt_calc_cdclk(max_pixclk);
 +      if (IS_GEMINILAKE(dev_priv))
 +              cdclk = glk_calc_cdclk(max_pixclk);
 +      else
 +              cdclk = bxt_calc_cdclk(max_pixclk);
  
 -      if (!intel_state->active_crtcs)
 -              intel_state->dev_cdclk = bxt_calc_cdclk(0);
 +      intel_state->cdclk = intel_state->dev_cdclk = cdclk;
 +
 +      if (!intel_state->active_crtcs) {
 +              if (IS_GEMINILAKE(dev_priv))
 +                      cdclk = glk_calc_cdclk(0);
 +              else
 +                      cdclk = bxt_calc_cdclk(0);
 +
 +              intel_state->dev_cdclk = cdclk;
 +      }
  
        return 0;
  }
@@@ -7336,7 -7298,6 +7335,7 @@@ static int broxton_get_display_clock_sp
                div = 2;
                break;
        case BXT_CDCLK_CD2X_DIV_SEL_1_5:
 +              WARN(IS_GEMINILAKE(dev_priv), "Unsupported divider\n");
                div = 3;
                break;
        case BXT_CDCLK_CD2X_DIV_SEL_2:
@@@ -7556,7 -7517,7 +7555,7 @@@ static unsigned int intel_hpll_vco(stru
                vco_table = ctg_vco;
        else if (IS_G4X(dev_priv))
                vco_table = elk_vco;
 -      else if (IS_CRESTLINE(dev_priv))
 +      else if (IS_I965GM(dev_priv))
                vco_table = cl_vco;
        else if (IS_PINEVIEW(dev_priv))
                vco_table = pnv_vco;
@@@ -8168,8 -8129,7 +8167,8 @@@ static void i9xx_compute_dpll(struct in
        else
                dpll |= DPLLB_MODE_DAC_SERIAL;
  
 -      if (IS_I945G(dev_priv) || IS_I945GM(dev_priv) || IS_G33(dev_priv)) {
 +      if (IS_I945G(dev_priv) || IS_I945GM(dev_priv) ||
 +          IS_G33(dev_priv) || IS_PINEVIEW(dev_priv)) {
                dpll |= (crtc_state->pixel_multiplier - 1)
                        << SDVO_MULTIPLIER_SHIFT_HIRES;
        }
@@@ -8743,6 -8703,8 +8742,8 @@@ i9xx_get_initial_plane_config(struct in
  
        fb = &intel_fb->base;
  
+       fb->dev = dev;
        if (INTEL_GEN(dev_priv) >= 4) {
                if (val & DISPPLANE_TILED) {
                        plane_config->tiling = I915_TILING_X;
  
        pixel_format = val & DISPPLANE_PIXFORMAT_MASK;
        fourcc = i9xx_format_to_fourcc(pixel_format);
-       fb->pixel_format = fourcc;
-       fb->bits_per_pixel = drm_format_plane_cpp(fourcc, 0) * 8;
+       fb->format = drm_format_info(fourcc);
  
        if (INTEL_GEN(dev_priv) >= 4) {
                if (plane_config->tiling)
        fb->pitches[0] = val & 0xffffffc0;
  
        aligned_height = intel_fb_align_height(dev, fb->height,
-                                              fb->pixel_format,
+                                              fb->format->format,
                                               fb->modifier);
  
        plane_config->size = fb->pitches[0] * aligned_height;
  
        DRM_DEBUG_KMS("pipe/plane %c/%d with fb: size=%dx%d@%d, offset=%x, pitch %d, size 0x%x\n",
                      pipe_name(pipe), plane, fb->width, fb->height,
-                     fb->bits_per_pixel, base, fb->pitches[0],
+                     fb->format->cpp[0] * 8, base, fb->pitches[0],
                      plane_config->size);
  
        plane_config->fb = intel_fb;
@@@ -8882,7 -8843,7 +8882,7 @@@ static bool i9xx_get_pipe_config(struc
                         >> DPLL_MD_UDI_MULTIPLIER_SHIFT) + 1;
                pipe_config->dpll_hw_state.dpll_md = tmp;
        } else if (IS_I945G(dev_priv) || IS_I945GM(dev_priv) ||
 -                 IS_G33(dev_priv)) {
 +                 IS_G33(dev_priv) || IS_PINEVIEW(dev_priv)) {
                tmp = I915_READ(DPLL(crtc->pipe));
                pipe_config->pixel_multiplier =
                        ((tmp & SDVO_MULTIPLIER_MASK)
@@@ -8935,8 -8896,9 +8935,8 @@@ out
        return ret;
  }
  
 -static void ironlake_init_pch_refclk(struct drm_device *dev)
 +static void ironlake_init_pch_refclk(struct drm_i915_private *dev_priv)
  {
 -      struct drm_i915_private *dev_priv = to_i915(dev);
        struct intel_encoder *encoder;
        int i;
        u32 val, final;
        bool using_ssc_source = false;
  
        /* We need to take the global config into account */
 -      for_each_intel_encoder(dev, encoder) {
 +      for_each_intel_encoder(&dev_priv->drm, encoder) {
                switch (encoder->type) {
                case INTEL_OUTPUT_LVDS:
                        has_panel = true;
@@@ -9204,9 -9166,10 +9204,9 @@@ static void lpt_program_fdi_mphy(struc
   * - Sequence to enable CLKOUT_DP without spread
   * - Sequence to enable CLKOUT_DP for FDI usage and configure PCH FDI I/O
   */
 -static void lpt_enable_clkout_dp(struct drm_device *dev, bool with_spread,
 -                               bool with_fdi)
 +static void lpt_enable_clkout_dp(struct drm_i915_private *dev_priv,
 +                               bool with_spread, bool with_fdi)
  {
 -      struct drm_i915_private *dev_priv = to_i915(dev);
        uint32_t reg, tmp;
  
        if (WARN(with_fdi && !with_spread, "FDI requires downspread\n"))
  }
  
  /* Sequence to disable CLKOUT_DP */
 -static void lpt_disable_clkout_dp(struct drm_device *dev)
 +static void lpt_disable_clkout_dp(struct drm_i915_private *dev_priv)
  {
 -      struct drm_i915_private *dev_priv = to_i915(dev);
        uint32_t reg, tmp;
  
        mutex_lock(&dev_priv->sb_lock);
@@@ -9330,12 -9294,12 +9330,12 @@@ static void lpt_bend_clkout_dp(struct d
  
  #undef BEND_IDX
  
 -static void lpt_init_pch_refclk(struct drm_device *dev)
 +static void lpt_init_pch_refclk(struct drm_i915_private *dev_priv)
  {
        struct intel_encoder *encoder;
        bool has_vga = false;
  
 -      for_each_intel_encoder(dev, encoder) {
 +      for_each_intel_encoder(&dev_priv->drm, encoder) {
                switch (encoder->type) {
                case INTEL_OUTPUT_ANALOG:
                        has_vga = true;
        }
  
        if (has_vga) {
 -              lpt_bend_clkout_dp(to_i915(dev), 0);
 -              lpt_enable_clkout_dp(dev, true, true);
 +              lpt_bend_clkout_dp(dev_priv, 0);
 +              lpt_enable_clkout_dp(dev_priv, true, true);
        } else {
 -              lpt_disable_clkout_dp(dev);
 +              lpt_disable_clkout_dp(dev_priv);
        }
  }
  
  /*
   * Initialize reference clocks when the driver loads
   */
 -void intel_init_pch_refclk(struct drm_device *dev)
 +void intel_init_pch_refclk(struct drm_i915_private *dev_priv)
  {
 -      struct drm_i915_private *dev_priv = to_i915(dev);
 -
        if (HAS_PCH_IBX(dev_priv) || HAS_PCH_CPT(dev_priv))
 -              ironlake_init_pch_refclk(dev);
 +              ironlake_init_pch_refclk(dev_priv);
        else if (HAS_PCH_LPT(dev_priv))
 -              lpt_init_pch_refclk(dev);
 +              lpt_init_pch_refclk(dev_priv);
  }
  
  static void ironlake_set_pipeconf(struct drm_crtc *crtc)
@@@ -9768,6 -9734,8 +9768,8 @@@ skylake_get_initial_plane_config(struc
  
        fb = &intel_fb->base;
  
+       fb->dev = dev;
        val = I915_READ(PLANE_CTL(pipe, 0));
        if (!(val & PLANE_CTL_ENABLE))
                goto error;
        fourcc = skl_format_to_fourcc(pixel_format,
                                      val & PLANE_CTL_ORDER_RGBX,
                                      val & PLANE_CTL_ALPHA_MASK);
-       fb->pixel_format = fourcc;
-       fb->bits_per_pixel = drm_format_plane_cpp(fourcc, 0) * 8;
+       fb->format = drm_format_info(fourcc);
  
        tiling = val & PLANE_CTL_TILED_MASK;
        switch (tiling) {
  
        val = I915_READ(PLANE_STRIDE(pipe, 0));
        stride_mult = intel_fb_stride_alignment(dev_priv, fb->modifier,
-                                               fb->pixel_format);
+                                               fb->format->format);
        fb->pitches[0] = (val & 0x3ff) * stride_mult;
  
        aligned_height = intel_fb_align_height(dev, fb->height,
-                                              fb->pixel_format,
+                                              fb->format->format,
                                               fb->modifier);
  
        plane_config->size = fb->pitches[0] * aligned_height;
  
        DRM_DEBUG_KMS("pipe %c with fb: size=%dx%d@%d, offset=%x, pitch %d, size 0x%x\n",
                      pipe_name(pipe), fb->width, fb->height,
-                     fb->bits_per_pixel, base, fb->pitches[0],
+                     fb->format->cpp[0] * 8, base, fb->pitches[0],
                      plane_config->size);
  
        plane_config->fb = intel_fb;
@@@ -9880,6 -9847,8 +9881,8 @@@ ironlake_get_initial_plane_config(struc
  
        fb = &intel_fb->base;
  
+       fb->dev = dev;
        if (INTEL_GEN(dev_priv) >= 4) {
                if (val & DISPPLANE_TILED) {
                        plane_config->tiling = I915_TILING_X;
  
        pixel_format = val & DISPPLANE_PIXFORMAT_MASK;
        fourcc = i9xx_format_to_fourcc(pixel_format);
-       fb->pixel_format = fourcc;
-       fb->bits_per_pixel = drm_format_plane_cpp(fourcc, 0) * 8;
+       fb->format = drm_format_info(fourcc);
  
        base = I915_READ(DSPSURF(pipe)) & 0xfffff000;
        if (IS_HASWELL(dev_priv) || IS_BROADWELL(dev_priv)) {
        fb->pitches[0] = val & 0xffffffc0;
  
        aligned_height = intel_fb_align_height(dev, fb->height,
-                                              fb->pixel_format,
+                                              fb->format->format,
                                               fb->modifier);
  
        plane_config->size = fb->pitches[0] * aligned_height;
  
        DRM_DEBUG_KMS("pipe %c with fb: size=%dx%d@%d, offset=%x, pitch %d, size 0x%x\n",
                      pipe_name(pipe), fb->width, fb->height,
-                     fb->bits_per_pixel, base, fb->pitches[0],
+                     fb->format->cpp[0] * 8, base, fb->pitches[0],
                      plane_config->size);
  
        plane_config->fb = intel_fb;
@@@ -10208,6 -10176,7 +10210,6 @@@ static void hsw_restore_lcpll(struct dr
   */
  void hsw_enable_pc8(struct drm_i915_private *dev_priv)
  {
 -      struct drm_device *dev = &dev_priv->drm;
        uint32_t val;
  
        DRM_DEBUG_KMS("Enabling package C8+\n");
                I915_WRITE(SOUTH_DSPCLK_GATE_D, val);
        }
  
 -      lpt_disable_clkout_dp(dev);
 +      lpt_disable_clkout_dp(dev_priv);
        hsw_disable_lcpll(dev_priv, true, true);
  }
  
  void hsw_disable_pc8(struct drm_i915_private *dev_priv)
  {
 -      struct drm_device *dev = &dev_priv->drm;
        uint32_t val;
  
        DRM_DEBUG_KMS("Disabling package C8+\n");
  
        hsw_restore_lcpll(dev_priv);
 -      lpt_init_pch_refclk(dev);
 +      lpt_init_pch_refclk(dev_priv);
  
        if (HAS_PCH_LPT_LP(dev_priv)) {
                val = I915_READ(SOUTH_DSPCLK_GATE_D);
@@@ -10679,7 -10649,7 +10681,7 @@@ static void haswell_get_ddi_port_state(
  
        if (IS_SKYLAKE(dev_priv) || IS_KABYLAKE(dev_priv))
                skylake_get_ddi_pll(dev_priv, port, pipe_config);
 -      else if (IS_BROXTON(dev_priv))
 +      else if (IS_GEN9_LP(dev_priv))
                bxt_get_ddi_pll(dev_priv, port, pipe_config);
        else
                haswell_get_ddi_pll(dev_priv, port, pipe_config);
@@@ -10724,7 -10694,7 +10726,7 @@@ static bool haswell_get_pipe_config(str
  
        active = hsw_get_transcoder_state(crtc, pipe_config, &power_domain_mask);
  
 -      if (IS_BROXTON(dev_priv) &&
 +      if (IS_GEN9_LP(dev_priv) &&
            bxt_get_dsi_transcoder_state(crtc, pipe_config, &power_domain_mask)) {
                WARN_ON(active);
                active = true;
                I915_READ(GAMMA_MODE(crtc->pipe)) & GAMMA_MODE_MODE_MASK;
  
        if (INTEL_GEN(dev_priv) >= 9) {
 -              skl_init_scalers(dev_priv, crtc, pipe_config);
 +              intel_crtc_init_scalers(crtc, pipe_config);
  
                pipe_config->scaler_state.scaler_id = -1;
                pipe_config->scaler_state.scaler_users &= ~(1 << SKL_CRTC_INDEX);
@@@ -10925,7 -10895,7 +10927,7 @@@ static void intel_crtc_update_cursor(st
  
        I915_WRITE(CURPOS(pipe), pos);
  
 -      if (IS_845G(dev_priv) || IS_I865G(dev_priv))
 +      if (IS_I845G(dev_priv) || IS_I865G(dev_priv))
                i845_update_cursor(crtc, base, plane_state);
        else
                i9xx_update_cursor(crtc, base, plane_state);
@@@ -10943,11 -10913,11 +10945,11 @@@ static bool cursor_size_ok(struct drm_i
         * the precision of the register. Everything else requires
         * square cursors, limited to a few power-of-two sizes.
         */
 -      if (IS_845G(dev_priv) || IS_I865G(dev_priv)) {
 +      if (IS_I845G(dev_priv) || IS_I865G(dev_priv)) {
                if ((width & 63) != 0)
                        return false;
  
 -              if (width > (IS_845G(dev_priv) ? 64 : 512))
 +              if (width > (IS_I845G(dev_priv) ? 64 : 512))
                        return false;
  
                if (height > 1023)
@@@ -11037,7 -11007,7 +11039,7 @@@ intel_framebuffer_create_for_mode(struc
        struct drm_i915_gem_object *obj;
        struct drm_mode_fb_cmd2 mode_cmd = { 0 };
  
 -      obj = i915_gem_object_create(dev,
 +      obj = i915_gem_object_create(to_i915(dev),
                                    intel_framebuffer_size_for_mode(mode, bpp));
        if (IS_ERR(obj))
                return ERR_CAST(obj);
@@@ -11075,7 -11045,7 +11077,7 @@@ mode_fits_in_fbdev(struct drm_device *d
  
        fb = &dev_priv->fbdev->fb->base;
        if (fb->pitches[0] < intel_framebuffer_pitch_for_width(mode->hdisplay,
-                                                              fb->bits_per_pixel))
+                                                              fb->format->cpp[0] * 8))
                return NULL;
  
        if (obj->base.size < mode->vdisplay * fb->pitches[0])
@@@ -12177,7 -12147,7 +12179,7 @@@ static int intel_crtc_page_flip(struct 
                return -EBUSY;
  
        /* Can't change pixel format via MI display flips. */
-       if (fb->pixel_format != crtc->primary->fb->pixel_format)
+       if (fb->format != crtc->primary->fb->format)
                return -EINVAL;
  
        /*
                INIT_WORK(&work->mmio_work, intel_mmio_flip_work_func);
                queue_work(system_unbound_wq, &work->mmio_work);
        } else {
 -              request = i915_gem_request_alloc(engine, engine->last_context);
 +              request = i915_gem_request_alloc(engine,
 +                                               dev_priv->kernel_context);
                if (IS_ERR(request)) {
                        ret = PTR_ERR(request);
                        goto cleanup_unpin;
@@@ -12823,7 -12792,39 +12825,7 @@@ static void intel_dump_pipe_config(stru
        DRM_DEBUG_KMS("ips: %i, double wide: %i\n",
                      pipe_config->ips_enabled, pipe_config->double_wide);
  
 -      if (IS_BROXTON(dev_priv)) {
 -              DRM_DEBUG_KMS("dpll_hw_state: ebb0: 0x%x, ebb4: 0x%x,"
 -                            "pll0: 0x%x, pll1: 0x%x, pll2: 0x%x, pll3: 0x%x, "
 -                            "pll6: 0x%x, pll8: 0x%x, pll9: 0x%x, pll10: 0x%x, pcsdw12: 0x%x\n",
 -                            pipe_config->dpll_hw_state.ebb0,
 -                            pipe_config->dpll_hw_state.ebb4,
 -                            pipe_config->dpll_hw_state.pll0,
 -                            pipe_config->dpll_hw_state.pll1,
 -                            pipe_config->dpll_hw_state.pll2,
 -                            pipe_config->dpll_hw_state.pll3,
 -                            pipe_config->dpll_hw_state.pll6,
 -                            pipe_config->dpll_hw_state.pll8,
 -                            pipe_config->dpll_hw_state.pll9,
 -                            pipe_config->dpll_hw_state.pll10,
 -                            pipe_config->dpll_hw_state.pcsdw12);
 -      } else if (IS_SKYLAKE(dev_priv) || IS_KABYLAKE(dev_priv)) {
 -              DRM_DEBUG_KMS("dpll_hw_state: "
 -                            "ctrl1: 0x%x, cfgcr1: 0x%x, cfgcr2: 0x%x\n",
 -                            pipe_config->dpll_hw_state.ctrl1,
 -                            pipe_config->dpll_hw_state.cfgcr1,
 -                            pipe_config->dpll_hw_state.cfgcr2);
 -      } else if (HAS_DDI(dev_priv)) {
 -              DRM_DEBUG_KMS("dpll_hw_state: wrpll: 0x%x spll: 0x%x\n",
 -                            pipe_config->dpll_hw_state.wrpll,
 -                            pipe_config->dpll_hw_state.spll);
 -      } else {
 -              DRM_DEBUG_KMS("dpll_hw_state: dpll: 0x%x, dpll_md: 0x%x, "
 -                            "fp0: 0x%x, fp1: 0x%x\n",
 -                            pipe_config->dpll_hw_state.dpll,
 -                            pipe_config->dpll_hw_state.dpll_md,
 -                            pipe_config->dpll_hw_state.fp0,
 -                            pipe_config->dpll_hw_state.fp1);
 -      }
 +      intel_dpll_dump_hw_state(dev_priv, &pipe_config->dpll_hw_state);
  
        DRM_DEBUG_KMS("planes on this crtc\n");
        list_for_each_entry(plane, &dev->mode_config.plane_list, head) {
                DRM_DEBUG_KMS("[PLANE:%d:%s] FB:%d, fb = %ux%u format = %s\n",
                              plane->base.id, plane->name,
                              fb->base.id, fb->width, fb->height,
-                             drm_get_format_name(fb->pixel_format, &format_name));
+                             drm_get_format_name(fb->format->format, &format_name));
                if (INTEL_GEN(dev_priv) >= 9)
                        DRM_DEBUG_KMS("\tscaler:%d src %dx%d+%d+%d dst %dx%d+%d+%d\n",
                                      state->scaler_id,
@@@ -13167,31 -13168,6 +13169,31 @@@ intel_compare_link_m_n(const struct int
        return false;
  }
  
 +static void __printf(3, 4)
 +pipe_config_err(bool adjust, const char *name, const char *format, ...)
 +{
 +      char *level;
 +      unsigned int category;
 +      struct va_format vaf;
 +      va_list args;
 +
 +      if (adjust) {
 +              level = KERN_DEBUG;
 +              category = DRM_UT_KMS;
 +      } else {
 +              level = KERN_ERR;
 +              category = DRM_UT_NONE;
 +      }
 +
 +      va_start(args, format);
 +      vaf.fmt = format;
 +      vaf.va = &args;
 +
 +      drm_printk(level, category, "mismatch in %s %pV", name, &vaf);
 +
 +      va_end(args);
 +}
 +
  static bool
  intel_pipe_config_compare(struct drm_i915_private *dev_priv,
                          struct intel_crtc_state *current_config,
  {
        bool ret = true;
  
 -#define INTEL_ERR_OR_DBG_KMS(fmt, ...) \
 -      do { \
 -              if (!adjust) \
 -                      DRM_ERROR(fmt, ##__VA_ARGS__); \
 -              else \
 -                      DRM_DEBUG_KMS(fmt, ##__VA_ARGS__); \
 -      } while (0)
 -
  #define PIPE_CONF_CHECK_X(name)       \
        if (current_config->name != pipe_config->name) { \
 -              INTEL_ERR_OR_DBG_KMS("mismatch in " #name " " \
 +              pipe_config_err(adjust, __stringify(name), \
                          "(expected 0x%08x, found 0x%08x)\n", \
                          current_config->name, \
                          pipe_config->name); \
  
  #define PIPE_CONF_CHECK_I(name)       \
        if (current_config->name != pipe_config->name) { \
 -              INTEL_ERR_OR_DBG_KMS("mismatch in " #name " " \
 +              pipe_config_err(adjust, __stringify(name), \
                          "(expected %i, found %i)\n", \
                          current_config->name, \
                          pipe_config->name); \
  
  #define PIPE_CONF_CHECK_P(name)       \
        if (current_config->name != pipe_config->name) { \
 -              INTEL_ERR_OR_DBG_KMS("mismatch in " #name " " \
 +              pipe_config_err(adjust, __stringify(name), \
                          "(expected %p, found %p)\n", \
                          current_config->name, \
                          pipe_config->name); \
        if (!intel_compare_link_m_n(&current_config->name, \
                                    &pipe_config->name,\
                                    adjust)) { \
 -              INTEL_ERR_OR_DBG_KMS("mismatch in " #name " " \
 +              pipe_config_err(adjust, __stringify(name), \
                          "(expected tu %i gmch %i/%i link %i/%i, " \
                          "found tu %i, gmch %i/%i link %i/%i)\n", \
                          current_config->name.tu, \
                                    &pipe_config->name, adjust) && \
            !intel_compare_link_m_n(&current_config->alt_name, \
                                    &pipe_config->name, adjust)) { \
 -              INTEL_ERR_OR_DBG_KMS("mismatch in " #name " " \
 +              pipe_config_err(adjust, __stringify(name), \
                          "(expected tu %i gmch %i/%i link %i/%i, " \
                          "or tu %i gmch %i/%i link %i/%i, " \
                          "found tu %i, gmch %i/%i link %i/%i)\n", \
  
  #define PIPE_CONF_CHECK_FLAGS(name, mask)     \
        if ((current_config->name ^ pipe_config->name) & (mask)) { \
 -              INTEL_ERR_OR_DBG_KMS("mismatch in " #name "(" #mask ") " \
 -                        "(expected %i, found %i)\n", \
 +              pipe_config_err(adjust, __stringify(name), \
 +                        "(%x) (expected %i, found %i)\n", \
 +                        (mask), \
                          current_config->name & (mask), \
                          pipe_config->name & (mask)); \
                ret = false; \
  
  #define PIPE_CONF_CHECK_CLOCK_FUZZY(name) \
        if (!intel_fuzzy_clock_check(current_config->name, pipe_config->name)) { \
 -              INTEL_ERR_OR_DBG_KMS("mismatch in " #name " " \
 +              pipe_config_err(adjust, __stringify(name), \
                          "(expected %i, found %i)\n", \
                          current_config->name, \
                          pipe_config->name); \
  #undef PIPE_CONF_CHECK_FLAGS
  #undef PIPE_CONF_CHECK_CLOCK_FUZZY
  #undef PIPE_CONF_QUIRK
 -#undef INTEL_ERR_OR_DBG_KMS
  
        return ret;
  }
@@@ -13708,9 -13692,9 +13710,9 @@@ verify_single_dpll_state(struct drm_i91
        }
  
        if (!crtc) {
 -              I915_STATE_WARN(pll->active_mask & ~pll->config.crtc_mask,
 +              I915_STATE_WARN(pll->active_mask & ~pll->state.crtc_mask,
                                "more active pll users than references: %x vs %x\n",
 -                              pll->active_mask, pll->config.crtc_mask);
 +                              pll->active_mask, pll->state.crtc_mask);
  
                return;
        }
                                "pll active mismatch (didn't expect pipe %c in active mask 0x%02x)\n",
                                pipe_name(drm_crtc_index(crtc)), pll->active_mask);
  
 -      I915_STATE_WARN(!(pll->config.crtc_mask & crtc_mask),
 +      I915_STATE_WARN(!(pll->state.crtc_mask & crtc_mask),
                        "pll enabled crtcs mismatch (expected 0x%x in 0x%02x)\n",
 -                      crtc_mask, pll->config.crtc_mask);
 +                      crtc_mask, pll->state.crtc_mask);
  
 -      I915_STATE_WARN(pll->on && memcmp(&pll->config.hw_state,
 +      I915_STATE_WARN(pll->on && memcmp(&pll->state.hw_state,
                                          &dpll_hw_state,
                                          sizeof(dpll_hw_state)),
                        "pll hw state mismatch\n");
@@@ -13756,7 -13740,7 +13758,7 @@@ verify_shared_dpll_state(struct drm_dev
                I915_STATE_WARN(pll->active_mask & crtc_mask,
                                "pll active mismatch (didn't expect pipe %c in active mask)\n",
                                pipe_name(drm_crtc_index(crtc)));
 -              I915_STATE_WARN(pll->config.crtc_mask & crtc_mask,
 +              I915_STATE_WARN(pll->state.crtc_mask & crtc_mask,
                                "pll enabled crtcs mismatch (found %x in enabled mask)\n",
                                pipe_name(drm_crtc_index(crtc)));
        }
@@@ -13839,6 -13823,7 +13841,6 @@@ static void intel_modeset_clear_plls(st
  {
        struct drm_device *dev = state->dev;
        struct drm_i915_private *dev_priv = to_i915(dev);
 -      struct intel_shared_dpll_config *shared_dpll = NULL;
        struct drm_crtc *crtc;
        struct drm_crtc_state *crtc_state;
        int i;
                if (!old_dpll)
                        continue;
  
 -              if (!shared_dpll)
 -                      shared_dpll = intel_atomic_get_shared_dpll_state(state);
 -
 -              intel_shared_dpll_config_put(shared_dpll, old_dpll, intel_crtc);
 +              intel_release_shared_dpll(old_dpll, intel_crtc, state);
        }
  }
  
@@@ -13928,34 -13916,14 +13930,34 @@@ static int haswell_mode_set_planes_work
        return 0;
  }
  
 +static int intel_lock_all_pipes(struct drm_atomic_state *state)
 +{
 +      struct drm_crtc *crtc;
 +
 +      /* Add all pipes to the state */
 +      for_each_crtc(state->dev, crtc) {
 +              struct drm_crtc_state *crtc_state;
 +
 +              crtc_state = drm_atomic_get_crtc_state(state, crtc);
 +              if (IS_ERR(crtc_state))
 +                      return PTR_ERR(crtc_state);
 +      }
 +
 +      return 0;
 +}
 +
  static int intel_modeset_all_pipes(struct drm_atomic_state *state)
  {
        struct drm_crtc *crtc;
 -      struct drm_crtc_state *crtc_state;
 -      int ret = 0;
  
 -      /* add all active pipes to the state */
 +      /*
 +       * Add all pipes to the state, and force
 +       * a modeset on all the active ones.
 +       */
        for_each_crtc(state->dev, crtc) {
 +              struct drm_crtc_state *crtc_state;
 +              int ret;
 +
                crtc_state = drm_atomic_get_crtc_state(state, crtc);
                if (IS_ERR(crtc_state))
                        return PTR_ERR(crtc_state);
  
                ret = drm_atomic_add_affected_connectors(state, crtc);
                if (ret)
 -                      break;
 +                      return ret;
  
                ret = drm_atomic_add_affected_planes(state, crtc);
                if (ret)
 -                      break;
 +                      return ret;
        }
  
 -      return ret;
 +      return 0;
  }
  
  static int intel_modeset_checks(struct drm_atomic_state *state)
                if (ret < 0)
                        return ret;
  
 +              /*
 +               * Writes to dev_priv->atomic_cdclk_freq must protected by
 +               * holding all the crtc locks, even if we don't end up
 +               * touching the hardware
 +               */
 +              if (intel_state->cdclk != dev_priv->atomic_cdclk_freq) {
 +                      ret = intel_lock_all_pipes(state);
 +                      if (ret < 0)
 +                              return ret;
 +              }
 +
 +              /* All pipes must be switched off while we change the cdclk. */
                if (intel_state->dev_cdclk != dev_priv->cdclk_freq ||
 -                  intel_state->cdclk_pll_vco != dev_priv->cdclk_pll.vco)
 +                  intel_state->cdclk_pll_vco != dev_priv->cdclk_pll.vco) {
                        ret = intel_modeset_all_pipes(state);
 -
 -              if (ret < 0)
 -                      return ret;
 +                      if (ret < 0)
 +                              return ret;
 +              }
  
                DRM_DEBUG_KMS("New cdclk calculated to be atomic %u, actual %u\n",
                              intel_state->cdclk, intel_state->dev_cdclk);
@@@ -14625,7 -14581,7 +14627,7 @@@ static int intel_atomic_commit(struct d
  
        drm_atomic_helper_swap_state(state, true);
        dev_priv->wm.distrust_bios_wm = false;
 -      intel_shared_dpll_commit(state);
 +      intel_shared_dpll_swap_state(state);
        intel_atomic_track_fbs(state);
  
        if (intel_state->modeset) {
@@@ -14998,6 -14954,136 +15000,136 @@@ const struct drm_plane_funcs intel_plan
        .atomic_destroy_state = intel_plane_destroy_state,
  };
  
+ static int
+ intel_legacy_cursor_update(struct drm_plane *plane,
+                          struct drm_crtc *crtc,
+                          struct drm_framebuffer *fb,
+                          int crtc_x, int crtc_y,
+                          unsigned int crtc_w, unsigned int crtc_h,
+                          uint32_t src_x, uint32_t src_y,
+                          uint32_t src_w, uint32_t src_h)
+ {
+       struct drm_i915_private *dev_priv = to_i915(crtc->dev);
+       int ret;
+       struct drm_plane_state *old_plane_state, *new_plane_state;
+       struct intel_plane *intel_plane = to_intel_plane(plane);
+       struct drm_framebuffer *old_fb;
+       struct drm_crtc_state *crtc_state = crtc->state;
+       /*
+        * When crtc is inactive or there is a modeset pending,
+        * wait for it to complete in the slowpath
+        */
+       if (!crtc_state->active || needs_modeset(crtc_state) ||
+           to_intel_crtc_state(crtc_state)->update_pipe)
+               goto slow;
+       old_plane_state = plane->state;
+       /*
+        * If any parameters change that may affect watermarks,
+        * take the slowpath. Only changing fb or position should be
+        * in the fastpath.
+        */
+       if (old_plane_state->crtc != crtc ||
+           old_plane_state->src_w != src_w ||
+           old_plane_state->src_h != src_h ||
+           old_plane_state->crtc_w != crtc_w ||
+           old_plane_state->crtc_h != crtc_h ||
+           !old_plane_state->visible ||
+           old_plane_state->fb->modifier != fb->modifier)
+               goto slow;
+       new_plane_state = intel_plane_duplicate_state(plane);
+       if (!new_plane_state)
+               return -ENOMEM;
+       drm_atomic_set_fb_for_plane(new_plane_state, fb);
+       new_plane_state->src_x = src_x;
+       new_plane_state->src_y = src_y;
+       new_plane_state->src_w = src_w;
+       new_plane_state->src_h = src_h;
+       new_plane_state->crtc_x = crtc_x;
+       new_plane_state->crtc_y = crtc_y;
+       new_plane_state->crtc_w = crtc_w;
+       new_plane_state->crtc_h = crtc_h;
+       ret = intel_plane_atomic_check_with_state(to_intel_crtc_state(crtc->state),
+                                                 to_intel_plane_state(new_plane_state));
+       if (ret)
+               goto out_free;
+       /* Visibility changed, must take slowpath. */
+       if (!new_plane_state->visible)
+               goto slow_free;
+       ret = mutex_lock_interruptible(&dev_priv->drm.struct_mutex);
+       if (ret)
+               goto out_free;
+       if (INTEL_INFO(dev_priv)->cursor_needs_physical) {
+               int align = IS_I830(dev_priv) ? 16 * 1024 : 256;
+               ret = i915_gem_object_attach_phys(intel_fb_obj(fb), align);
+               if (ret) {
+                       DRM_DEBUG_KMS("failed to attach phys object\n");
+                       goto out_unlock;
+               }
+       } else {
+               struct i915_vma *vma;
+               vma = intel_pin_and_fence_fb_obj(fb, new_plane_state->rotation);
+               if (IS_ERR(vma)) {
+                       DRM_DEBUG_KMS("failed to pin object\n");
+                       ret = PTR_ERR(vma);
+                       goto out_unlock;
+               }
+       }
+       old_fb = old_plane_state->fb;
+       i915_gem_track_fb(intel_fb_obj(old_fb), intel_fb_obj(fb),
+                         intel_plane->frontbuffer_bit);
+       /* Swap plane state */
+       new_plane_state->fence = old_plane_state->fence;
+       *to_intel_plane_state(old_plane_state) = *to_intel_plane_state(new_plane_state);
+       new_plane_state->fence = NULL;
+       new_plane_state->fb = old_fb;
+       intel_plane->update_plane(plane,
+                                 to_intel_crtc_state(crtc->state),
+                                 to_intel_plane_state(plane->state));
+       intel_cleanup_plane_fb(plane, new_plane_state);
+ out_unlock:
+       mutex_unlock(&dev_priv->drm.struct_mutex);
+ out_free:
+       intel_plane_destroy_state(plane, new_plane_state);
+       return ret;
+ slow_free:
+       intel_plane_destroy_state(plane, new_plane_state);
+ slow:
+       return drm_atomic_helper_update_plane(plane, crtc, fb,
+                                             crtc_x, crtc_y, crtc_w, crtc_h,
+                                             src_x, src_y, src_w, src_h);
+ }
+ static const struct drm_plane_funcs intel_cursor_plane_funcs = {
+       .update_plane = intel_legacy_cursor_update,
+       .disable_plane = drm_atomic_helper_disable_plane,
+       .destroy = intel_plane_destroy,
+       .set_property = drm_atomic_helper_plane_set_property,
+       .atomic_get_property = intel_plane_atomic_get_property,
+       .atomic_set_property = intel_plane_atomic_set_property,
+       .atomic_duplicate_state = intel_plane_duplicate_state,
+       .atomic_destroy_state = intel_plane_destroy_state,
+ };
  static struct intel_plane *
  intel_primary_plane_create(struct drm_i915_private *dev_priv, enum pipe pipe)
  {
                primary->plane = (enum plane) !pipe;
        else
                primary->plane = (enum plane) pipe;
 +      primary->id = PLANE_PRIMARY;
        primary->frontbuffer_bit = INTEL_FRONTBUFFER_PRIMARY(pipe);
        primary->check_plane = intel_check_primary_plane;
  
@@@ -15237,14 -15322,13 +15369,14 @@@ intel_cursor_plane_create(struct drm_i9
        cursor->max_downscale = 1;
        cursor->pipe = pipe;
        cursor->plane = pipe;
 +      cursor->id = PLANE_CURSOR;
        cursor->frontbuffer_bit = INTEL_FRONTBUFFER_CURSOR(pipe);
        cursor->check_plane = intel_check_cursor_plane;
        cursor->update_plane = intel_update_cursor_plane;
        cursor->disable_plane = intel_disable_cursor_plane;
  
        ret = drm_universal_plane_init(&dev_priv->drm, &cursor->base,
-                                      0, &intel_plane_funcs,
+                                      0, &intel_cursor_plane_funcs,
                                       intel_cursor_formats,
                                       ARRAY_SIZE(intel_cursor_formats),
                                       DRM_PLANE_TYPE_CURSOR,
        return ERR_PTR(ret);
  }
  
 -static void skl_init_scalers(struct drm_i915_private *dev_priv,
 -                           struct intel_crtc *crtc,
 -                           struct intel_crtc_state *crtc_state)
 +static void intel_crtc_init_scalers(struct intel_crtc *crtc,
 +                                  struct intel_crtc_state *crtc_state)
  {
        struct intel_crtc_scaler_state *scaler_state =
                &crtc_state->scaler_state;
 +      struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
        int i;
  
 +      crtc->num_scalers = dev_priv->info.num_scalers[crtc->pipe];
 +      if (!crtc->num_scalers)
 +              return;
 +
        for (i = 0; i < crtc->num_scalers; i++) {
                struct intel_scaler *scaler = &scaler_state->scalers[i];
  
@@@ -15315,12 -15395,21 +15447,12 @@@ static int intel_crtc_init(struct drm_i
        intel_crtc->base.state = &crtc_state->base;
        crtc_state->base.crtc = &intel_crtc->base;
  
 -      /* initialize shared scalers */
 -      if (INTEL_GEN(dev_priv) >= 9) {
 -              if (pipe == PIPE_C)
 -                      intel_crtc->num_scalers = 1;
 -              else
 -                      intel_crtc->num_scalers = SKL_NUM_SCALERS;
 -
 -              skl_init_scalers(dev_priv, intel_crtc, crtc_state);
 -      }
 -
        primary = intel_primary_plane_create(dev_priv, pipe);
        if (IS_ERR(primary)) {
                ret = PTR_ERR(primary);
                goto fail;
        }
 +      intel_crtc->plane_ids_mask |= BIT(primary->id);
  
        for_each_sprite(dev_priv, pipe, sprite) {
                struct intel_plane *plane;
                        ret = PTR_ERR(plane);
                        goto fail;
                }
 +              intel_crtc->plane_ids_mask |= BIT(plane->id);
        }
  
        cursor = intel_cursor_plane_create(dev_priv, pipe);
                ret = PTR_ERR(cursor);
                goto fail;
        }
 +      intel_crtc->plane_ids_mask |= BIT(cursor->id);
  
        ret = drm_crtc_init_with_planes(&dev_priv->drm, &intel_crtc->base,
                                        &primary->base, &cursor->base,
  
        intel_crtc->wm.cxsr_allowed = true;
  
 +      /* initialize shared scalers */
 +      intel_crtc_init_scalers(intel_crtc, crtc_state);
 +
        BUG_ON(pipe >= ARRAY_SIZE(dev_priv->plane_to_crtc_mapping) ||
               dev_priv->plane_to_crtc_mapping[intel_crtc->plane] != NULL);
        dev_priv->plane_to_crtc_mapping[intel_crtc->plane] = intel_crtc;
@@@ -15495,7 -15579,7 +15627,7 @@@ void intel_pps_unlock_regs_wa(struct dr
  
  static void intel_pps_init(struct drm_i915_private *dev_priv)
  {
 -      if (HAS_PCH_SPLIT(dev_priv) || IS_BROXTON(dev_priv))
 +      if (HAS_PCH_SPLIT(dev_priv) || IS_GEN9_LP(dev_priv))
                dev_priv->pps_mmio_base = PCH_PPS_BASE;
        else if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv))
                dev_priv->pps_mmio_base = VLV_PPS_BASE;
        intel_pps_unlock_regs_wa(dev_priv);
  }
  
 -static void intel_setup_outputs(struct drm_device *dev)
 +static void intel_setup_outputs(struct drm_i915_private *dev_priv)
  {
 -      struct drm_i915_private *dev_priv = to_i915(dev);
        struct intel_encoder *encoder;
        bool dpd_is_edp = false;
  
         * prevent the registeration of both eDP and LVDS and the incorrect
         * sharing of the PPS.
         */
 -      intel_lvds_init(dev);
 +      intel_lvds_init(dev_priv);
  
        if (intel_crt_present(dev_priv))
 -              intel_crt_init(dev);
 +              intel_crt_init(dev_priv);
  
 -      if (IS_BROXTON(dev_priv)) {
 +      if (IS_GEN9_LP(dev_priv)) {
                /*
                 * FIXME: Broxton doesn't support port detection via the
                 * DDI_BUF_CTL_A or SFUSE_STRAP registers, find another way to
                 * detect the ports.
                 */
 -              intel_ddi_init(dev, PORT_A);
 -              intel_ddi_init(dev, PORT_B);
 -              intel_ddi_init(dev, PORT_C);
 +              intel_ddi_init(dev_priv, PORT_A);
 +              intel_ddi_init(dev_priv, PORT_B);
 +              intel_ddi_init(dev_priv, PORT_C);
  
 -              intel_dsi_init(dev);
 +              intel_dsi_init(dev_priv);
        } else if (HAS_DDI(dev_priv)) {
                int found;
  
                found = I915_READ(DDI_BUF_CTL(PORT_A)) & DDI_INIT_DISPLAY_DETECTED;
                /* WaIgnoreDDIAStrap: skl */
                if (found || IS_SKYLAKE(dev_priv) || IS_KABYLAKE(dev_priv))
 -                      intel_ddi_init(dev, PORT_A);
 +                      intel_ddi_init(dev_priv, PORT_A);
  
                /* DDI B, C and D detection is indicated by the SFUSE_STRAP
                 * register */
                found = I915_READ(SFUSE_STRAP);
  
                if (found & SFUSE_STRAP_DDIB_DETECTED)
 -                      intel_ddi_init(dev, PORT_B);
 +                      intel_ddi_init(dev_priv, PORT_B);
                if (found & SFUSE_STRAP_DDIC_DETECTED)
 -                      intel_ddi_init(dev, PORT_C);
 +                      intel_ddi_init(dev_priv, PORT_C);
                if (found & SFUSE_STRAP_DDID_DETECTED)
 -                      intel_ddi_init(dev, PORT_D);
 +                      intel_ddi_init(dev_priv, PORT_D);
                /*
                 * On SKL we don't have a way to detect DDI-E so we rely on VBT.
                 */
                    (dev_priv->vbt.ddi_port_info[PORT_E].supports_dp ||
                     dev_priv->vbt.ddi_port_info[PORT_E].supports_dvi ||
                     dev_priv->vbt.ddi_port_info[PORT_E].supports_hdmi))
 -                      intel_ddi_init(dev, PORT_E);
 +                      intel_ddi_init(dev_priv, PORT_E);
  
        } else if (HAS_PCH_SPLIT(dev_priv)) {
                int found;
                dpd_is_edp = intel_dp_is_edp(dev_priv, PORT_D);
  
                if (has_edp_a(dev_priv))
 -                      intel_dp_init(dev, DP_A, PORT_A);
 +                      intel_dp_init(dev_priv, DP_A, PORT_A);
  
                if (I915_READ(PCH_HDMIB) & SDVO_DETECTED) {
                        /* PCH SDVOB multiplex with HDMIB */
 -                      found = intel_sdvo_init(dev, PCH_SDVOB, PORT_B);
 +                      found = intel_sdvo_init(dev_priv, PCH_SDVOB, PORT_B);
                        if (!found)
 -                              intel_hdmi_init(dev, PCH_HDMIB, PORT_B);
 +                              intel_hdmi_init(dev_priv, PCH_HDMIB, PORT_B);
                        if (!found && (I915_READ(PCH_DP_B) & DP_DETECTED))
 -                              intel_dp_init(dev, PCH_DP_B, PORT_B);
 +                              intel_dp_init(dev_priv, PCH_DP_B, PORT_B);
                }
  
                if (I915_READ(PCH_HDMIC) & SDVO_DETECTED)
 -                      intel_hdmi_init(dev, PCH_HDMIC, PORT_C);
 +                      intel_hdmi_init(dev_priv, PCH_HDMIC, PORT_C);
  
                if (!dpd_is_edp && I915_READ(PCH_HDMID) & SDVO_DETECTED)
 -                      intel_hdmi_init(dev, PCH_HDMID, PORT_D);
 +                      intel_hdmi_init(dev_priv, PCH_HDMID, PORT_D);
  
                if (I915_READ(PCH_DP_C) & DP_DETECTED)
 -                      intel_dp_init(dev, PCH_DP_C, PORT_C);
 +                      intel_dp_init(dev_priv, PCH_DP_C, PORT_C);
  
                if (I915_READ(PCH_DP_D) & DP_DETECTED)
 -                      intel_dp_init(dev, PCH_DP_D, PORT_D);
 +                      intel_dp_init(dev_priv, PCH_DP_D, PORT_D);
        } else if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv)) {
                bool has_edp, has_port;
  
                has_edp = intel_dp_is_edp(dev_priv, PORT_B);
                has_port = intel_bios_is_port_present(dev_priv, PORT_B);
                if (I915_READ(VLV_DP_B) & DP_DETECTED || has_port)
 -                      has_edp &= intel_dp_init(dev, VLV_DP_B, PORT_B);
 +                      has_edp &= intel_dp_init(dev_priv, VLV_DP_B, PORT_B);
                if ((I915_READ(VLV_HDMIB) & SDVO_DETECTED || has_port) && !has_edp)
 -                      intel_hdmi_init(dev, VLV_HDMIB, PORT_B);
 +                      intel_hdmi_init(dev_priv, VLV_HDMIB, PORT_B);
  
                has_edp = intel_dp_is_edp(dev_priv, PORT_C);
                has_port = intel_bios_is_port_present(dev_priv, PORT_C);
                if (I915_READ(VLV_DP_C) & DP_DETECTED || has_port)
 -                      has_edp &= intel_dp_init(dev, VLV_DP_C, PORT_C);
 +                      has_edp &= intel_dp_init(dev_priv, VLV_DP_C, PORT_C);
                if ((I915_READ(VLV_HDMIC) & SDVO_DETECTED || has_port) && !has_edp)
 -                      intel_hdmi_init(dev, VLV_HDMIC, PORT_C);
 +                      intel_hdmi_init(dev_priv, VLV_HDMIC, PORT_C);
  
                if (IS_CHERRYVIEW(dev_priv)) {
                        /*
                         */
                        has_port = intel_bios_is_port_present(dev_priv, PORT_D);
                        if (I915_READ(CHV_DP_D) & DP_DETECTED || has_port)
 -                              intel_dp_init(dev, CHV_DP_D, PORT_D);
 +                              intel_dp_init(dev_priv, CHV_DP_D, PORT_D);
                        if (I915_READ(CHV_HDMID) & SDVO_DETECTED || has_port)
 -                              intel_hdmi_init(dev, CHV_HDMID, PORT_D);
 +                              intel_hdmi_init(dev_priv, CHV_HDMID, PORT_D);
                }
  
 -              intel_dsi_init(dev);
 +              intel_dsi_init(dev_priv);
        } else if (!IS_GEN2(dev_priv) && !IS_PINEVIEW(dev_priv)) {
                bool found = false;
  
                if (I915_READ(GEN3_SDVOB) & SDVO_DETECTED) {
                        DRM_DEBUG_KMS("probing SDVOB\n");
 -                      found = intel_sdvo_init(dev, GEN3_SDVOB, PORT_B);
 +                      found = intel_sdvo_init(dev_priv, GEN3_SDVOB, PORT_B);
                        if (!found && IS_G4X(dev_priv)) {
                                DRM_DEBUG_KMS("probing HDMI on SDVOB\n");
 -                              intel_hdmi_init(dev, GEN4_HDMIB, PORT_B);
 +                              intel_hdmi_init(dev_priv, GEN4_HDMIB, PORT_B);
                        }
  
                        if (!found && IS_G4X(dev_priv))
 -                              intel_dp_init(dev, DP_B, PORT_B);
 +                              intel_dp_init(dev_priv, DP_B, PORT_B);
                }
  
                /* Before G4X SDVOC doesn't have its own detect register */
  
                if (I915_READ(GEN3_SDVOB) & SDVO_DETECTED) {
                        DRM_DEBUG_KMS("probing SDVOC\n");
 -                      found = intel_sdvo_init(dev, GEN3_SDVOC, PORT_C);
 +                      found = intel_sdvo_init(dev_priv, GEN3_SDVOC, PORT_C);
                }
  
                if (!found && (I915_READ(GEN3_SDVOC) & SDVO_DETECTED)) {
  
                        if (IS_G4X(dev_priv)) {
                                DRM_DEBUG_KMS("probing HDMI on SDVOC\n");
 -                              intel_hdmi_init(dev, GEN4_HDMIC, PORT_C);
 +                              intel_hdmi_init(dev_priv, GEN4_HDMIC, PORT_C);
                        }
                        if (IS_G4X(dev_priv))
 -                              intel_dp_init(dev, DP_C, PORT_C);
 +                              intel_dp_init(dev_priv, DP_C, PORT_C);
                }
  
                if (IS_G4X(dev_priv) && (I915_READ(DP_D) & DP_DETECTED))
 -                      intel_dp_init(dev, DP_D, PORT_D);
 +                      intel_dp_init(dev_priv, DP_D, PORT_D);
        } else if (IS_GEN2(dev_priv))
 -              intel_dvo_init(dev);
 +              intel_dvo_init(dev_priv);
  
        if (SUPPORTS_TV(dev_priv))
 -              intel_tv_init(dev);
 +              intel_tv_init(dev_priv);
  
 -      intel_psr_init(dev);
 +      intel_psr_init(dev_priv);
  
 -      for_each_intel_encoder(dev, encoder) {
 +      for_each_intel_encoder(&dev_priv->drm, encoder) {
                encoder->base.possible_crtcs = encoder->crtc_mask;
                encoder->base.possible_clones =
                        intel_encoder_clones(encoder);
        }
  
 -      intel_init_pch_refclk(dev);
 +      intel_init_pch_refclk(dev_priv);
  
 -      drm_helper_move_panel_connectors_to_head(dev);
 +      drm_helper_move_panel_connectors_to_head(&dev_priv->drm);
  }
  
  static void intel_user_framebuffer_destroy(struct drm_framebuffer *fb)
@@@ -15924,7 -16009,7 +16056,7 @@@ static int intel_framebuffer_init(struc
        if (mode_cmd->offsets[0] != 0)
                return -EINVAL;
  
-       drm_helper_mode_fill_fb_struct(&intel_fb->base, mode_cmd);
+       drm_helper_mode_fill_fb_struct(dev, &intel_fb->base, mode_cmd);
        intel_fb->obj = obj;
  
        ret = intel_fill_fb_info(dev_priv, &intel_fb->base);
@@@ -15962,17 -16047,6 +16094,17 @@@ intel_user_framebuffer_create(struct dr
        return fb;
  }
  
 +static void intel_atomic_state_free(struct drm_atomic_state *state)
 +{
 +      struct intel_atomic_state *intel_state = to_intel_atomic_state(state);
 +
 +      drm_atomic_state_default_release(state);
 +
 +      i915_sw_fence_fini(&intel_state->commit_ready);
 +
 +      kfree(state);
 +}
 +
  static const struct drm_mode_config_funcs intel_mode_funcs = {
        .fb_create = intel_user_framebuffer_create,
        .output_poll_changed = intel_fbdev_output_poll_changed,
        .atomic_commit = intel_atomic_commit,
        .atomic_state_alloc = intel_atomic_state_alloc,
        .atomic_state_clear = intel_atomic_state_clear,
 +      .atomic_state_free = intel_atomic_state_free,
  };
  
  /**
@@@ -16061,7 -16134,7 +16193,7 @@@ void intel_init_display_hooks(struct dr
        if (IS_SKYLAKE(dev_priv) || IS_KABYLAKE(dev_priv))
                dev_priv->display.get_display_clock_speed =
                        skylake_get_display_clock_speed;
 -      else if (IS_BROXTON(dev_priv))
 +      else if (IS_GEN9_LP(dev_priv))
                dev_priv->display.get_display_clock_speed =
                        broxton_get_display_clock_speed;
        else if (IS_BROADWELL(dev_priv))
        else if (IS_GEN5(dev_priv))
                dev_priv->display.get_display_clock_speed =
                        ilk_get_display_clock_speed;
 -      else if (IS_I945G(dev_priv) || IS_BROADWATER(dev_priv) ||
 +      else if (IS_I945G(dev_priv) || IS_I965G(dev_priv) ||
                 IS_GEN6(dev_priv) || IS_IVYBRIDGE(dev_priv))
                dev_priv->display.get_display_clock_speed =
                        i945_get_display_clock_speed;
        else if (IS_GM45(dev_priv))
                dev_priv->display.get_display_clock_speed =
                        gm45_get_display_clock_speed;
 -      else if (IS_CRESTLINE(dev_priv))
 +      else if (IS_I965GM(dev_priv))
                dev_priv->display.get_display_clock_speed =
                        i965gm_get_display_clock_speed;
        else if (IS_PINEVIEW(dev_priv))
        else if (IS_I915G(dev_priv))
                dev_priv->display.get_display_clock_speed =
                        i915_get_display_clock_speed;
 -      else if (IS_I945GM(dev_priv) || IS_845G(dev_priv))
 +      else if (IS_I945GM(dev_priv) || IS_I845G(dev_priv))
                dev_priv->display.get_display_clock_speed =
                        i9xx_misc_get_display_clock_speed;
        else if (IS_I915GM(dev_priv))
                        valleyview_modeset_commit_cdclk;
                dev_priv->display.modeset_calc_cdclk =
                        valleyview_modeset_calc_cdclk;
 -      } else if (IS_BROXTON(dev_priv)) {
 +      } else if (IS_GEN9_LP(dev_priv)) {
                dev_priv->display.modeset_commit_cdclk =
                        bxt_modeset_commit_cdclk;
                dev_priv->display.modeset_calc_cdclk =
@@@ -16517,8 -16590,8 +16649,8 @@@ int intel_modeset_init(struct drm_devic
                dev->mode_config.max_height = 8192;
        }
  
 -      if (IS_845G(dev_priv) || IS_I865G(dev_priv)) {
 -              dev->mode_config.cursor_width = IS_845G(dev_priv) ? 64 : 512;
 +      if (IS_I845G(dev_priv) || IS_I865G(dev_priv)) {
 +              dev->mode_config.cursor_width = IS_I845G(dev_priv) ? 64 : 512;
                dev->mode_config.cursor_height = 1023;
        } else if (IS_GEN2(dev_priv)) {
                dev->mode_config.cursor_width = GEN2_CURSOR_WIDTH;
  
        /* Just disable it once at startup */
        i915_disable_vga(dev_priv);
 -      intel_setup_outputs(dev);
 +      intel_setup_outputs(dev_priv);
  
        drm_modeset_lock_all(dev);
        intel_modeset_setup_hw_state(dev);
@@@ -16861,6 -16934,7 +16993,6 @@@ static void intel_modeset_readout_hw_st
  
        for_each_intel_crtc(dev, crtc) {
                struct intel_crtc_state *crtc_state = crtc->config;
 -              int pixclk = 0;
  
                __drm_atomic_helper_crtc_destroy_state(&crtc_state->base);
                memset(crtc_state, 0, sizeof(*crtc_state));
                crtc->base.enabled = crtc_state->base.enable;
                crtc->active = crtc_state->base.active;
  
 -              if (crtc_state->base.active) {
 +              if (crtc_state->base.active)
                        dev_priv->active_crtcs |= 1 << crtc->pipe;
  
 -                      if (INTEL_GEN(dev_priv) >= 9 || IS_BROADWELL(dev_priv))
 -                              pixclk = ilk_pipe_pixel_rate(crtc_state);
 -                      else if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv))
 -                              pixclk = crtc_state->base.adjusted_mode.crtc_clock;
 -                      else
 -                              WARN_ON(dev_priv->display.modeset_calc_cdclk);
 -
 -                      /* pixel rate mustn't exceed 95% of cdclk with IPS on BDW */
 -                      if (IS_BROADWELL(dev_priv) && crtc_state->ips_enabled)
 -                              pixclk = DIV_ROUND_UP(pixclk * 100, 95);
 -              }
 -
 -              dev_priv->min_pixclk[crtc->pipe] = pixclk;
 -
                readout_plane_state(crtc);
  
                DRM_DEBUG_KMS("[CRTC:%d:%s] hw state readout: %s\n",
                struct intel_shared_dpll *pll = &dev_priv->shared_dplls[i];
  
                pll->on = pll->funcs.get_hw_state(dev_priv, pll,
 -                                                &pll->config.hw_state);
 -              pll->config.crtc_mask = 0;
 +                                                &pll->state.hw_state);
 +              pll->state.crtc_mask = 0;
                for_each_intel_crtc(dev, crtc) {
                        if (crtc->active && crtc->config->shared_dpll == pll)
 -                              pll->config.crtc_mask |= 1 << crtc->pipe;
 +                              pll->state.crtc_mask |= 1 << crtc->pipe;
                }
 -              pll->active_mask = pll->config.crtc_mask;
 +              pll->active_mask = pll->state.crtc_mask;
  
                DRM_DEBUG_KMS("%s hw state readout: crtc_mask 0x%08x, on %i\n",
 -                            pll->name, pll->config.crtc_mask, pll->on);
 +                            pll->name, pll->state.crtc_mask, pll->on);
        }
  
        for_each_intel_encoder(dev, encoder) {
        }
  
        for_each_intel_crtc(dev, crtc) {
 +              int pixclk = 0;
 +
                crtc->base.hwmode = crtc->config->base.adjusted_mode;
  
                memset(&crtc->base.mode, 0, sizeof(crtc->base.mode));
                         * the atomic core happy. It wants a valid mode if the
                         * crtc's enabled, so we do the above call.
                         *
 -                       * At this point some state updated by the connectors
 -                       * in their ->detect() callback has not run yet, so
 -                       * no recalculation can be done yet.
 -                       *
 -                       * Even if we could do a recalculation and modeset
 -                       * right now it would cause a double modeset if
 -                       * fbdev or userspace chooses a different initial mode.
 -                       *
 -                       * If that happens, someone indicated they wanted a
 -                       * mode change, which means it's safe to do a full
 -                       * recalculation.
 +                       * But we don't set all the derived state fully, hence
 +                       * set a flag to indicate that a full recalculation is
 +                       * needed on the next commit.
                         */
                        crtc->base.state->mode.private_flags = I915_MODE_FLAG_INHERITED;
  
 +                      if (INTEL_GEN(dev_priv) >= 9 || IS_BROADWELL(dev_priv))
 +                              pixclk = ilk_pipe_pixel_rate(crtc->config);
 +                      else if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv))
 +                              pixclk = crtc->config->base.adjusted_mode.crtc_clock;
 +                      else
 +                              WARN_ON(dev_priv->display.modeset_calc_cdclk);
 +
 +                      /* pixel rate mustn't exceed 95% of cdclk with IPS on BDW */
 +                      if (IS_BROADWELL(dev_priv) && crtc->config->ips_enabled)
 +                              pixclk = DIV_ROUND_UP(pixclk * 100, 95);
 +
                        drm_calc_timestamping_constants(&crtc->base, &crtc->base.hwmode);
                        update_scanline_offset(crtc);
                }
  
 +              dev_priv->min_pixclk[crtc->pipe] = pixclk;
 +
                intel_pipe_config_sanity_check(dev_priv, crtc->config);
        }
  }
@@@ -17184,7 -17265,7 +17316,7 @@@ void intel_modeset_cleanup(struct drm_d
  
        intel_cleanup_gt_powersave(dev_priv);
  
 -      intel_teardown_gmbus(dev);
 +      intel_teardown_gmbus(dev_priv);
  }
  
  void intel_connector_attach_encoder(struct intel_connector *connector,
@@@ -32,6 -32,7 +32,7 @@@
  #include "i915_drv.h"
  #include <drm/drm_crtc.h>
  #include <drm/drm_crtc_helper.h>
+ #include <drm/drm_encoder.h>
  #include <drm/drm_fb_helper.h>
  #include <drm/drm_dp_dual_mode_helper.h>
  #include <drm/drm_dp_mst_helper.h>
@@@ -358,7 -359,7 +359,7 @@@ struct intel_atomic_state 
        /* SKL/KBL Only */
        unsigned int cdclk_pll_vco;
  
 -      struct intel_shared_dpll_config shared_dpll[I915_NUM_PLLS];
 +      struct intel_shared_dpll_state shared_dpll[I915_NUM_PLLS];
  
        /*
         * Current watermarks can't be trusted during hardware readout, so
@@@ -691,9 -692,8 +692,9 @@@ struct intel_crtc 
         * some outputs connected to this crtc.
         */
        bool active;
 -      unsigned long enabled_power_domains;
        bool lowfreq_avail;
 +      u8 plane_ids_mask;
 +      unsigned long enabled_power_domains;
        struct intel_overlay *overlay;
        struct intel_flip_work *flip_work;
  
@@@ -767,8 -767,7 +768,8 @@@ struct intel_plane_wm_parameters 
  
  struct intel_plane {
        struct drm_plane base;
 -      int plane;
 +      u8 plane;
 +      enum plane_id id;
        enum pipe pipe;
        bool can_scale;
        int max_downscale;
@@@ -842,13 -841,11 +843,13 @@@ struct intel_hdmi 
        enum hdmi_picture_aspect aspect_ratio;
        struct intel_connector *attached_connector;
        void (*write_infoframe)(struct drm_encoder *encoder,
 +                              const struct intel_crtc_state *crtc_state,
                                enum hdmi_infoframe_type type,
                                const void *frame, ssize_t len);
        void (*set_infoframes)(struct drm_encoder *encoder,
                               bool enable,
 -                             const struct drm_display_mode *adjusted_mode);
 +                             const struct intel_crtc_state *crtc_state,
 +                             const struct drm_connector_state *conn_state);
        bool (*infoframe_enabled)(struct drm_encoder *encoder,
                                  const struct intel_crtc_state *pipe_config);
  };
@@@ -884,16 -881,6 +885,16 @@@ struct intel_dp_desc 
        u8 sw_minor_rev;
  } __packed;
  
 +struct intel_dp_compliance_data {
 +      unsigned long edid;
 +};
 +
 +struct intel_dp_compliance {
 +      unsigned long test_type;
 +      struct intel_dp_compliance_data test_data;
 +      bool test_active;
 +};
 +
  struct intel_dp {
        i915_reg_t output_reg;
        i915_reg_t aux_ch_ctl_reg;
        /* sink rates as reported by DP_SUPPORTED_LINK_RATES */
        uint8_t num_sink_rates;
        int sink_rates[DP_MAX_SUPPORTED_RATES];
 +      /* Max lane count for the sink as per DPCD registers */
 +      uint8_t max_sink_lane_count;
 +      /* Max link BW for the sink as per DPCD registers */
 +      int max_sink_link_bw;
        /* sink or branch descriptor */
        struct intel_dp_desc desc;
        struct drm_dp_aux aux;
         */
        enum pipe pps_pipe;
        /*
 +       * Pipe currently driving the port. Used for preventing
 +       * the use of the PPS for any pipe currentrly driving
 +       * external DP as that will mess things up on VLV.
 +       */
 +      enum pipe active_pipe;
 +      /*
         * Set if the sequencer may be reset due to a power transition,
         * requiring a reinitialization. Only relevant on BXT.
         */
        void (*prepare_link_retrain)(struct intel_dp *intel_dp);
  
        /* Displayport compliance testing */
 -      unsigned long compliance_test_type;
 -      unsigned long compliance_test_data;
 -      bool compliance_test_active;
 +      struct intel_dp_compliance compliance;
  };
  
  struct intel_lspcon {
@@@ -1111,12 -1090,6 +1112,12 @@@ dp_to_dig_port(struct intel_dp *intel_d
        return container_of(intel_dp, struct intel_digital_port, dp);
  }
  
 +static inline struct intel_lspcon *
 +dp_to_lspcon(struct intel_dp *intel_dp)
 +{
 +      return &dp_to_dig_port(intel_dp)->lspcon;
 +}
 +
  static inline struct intel_digital_port *
  hdmi_to_dig_port(struct intel_hdmi *intel_hdmi)
  {
@@@ -1169,7 -1142,7 +1170,7 @@@ void gen9_enable_guc_interrupts(struct 
  void gen9_disable_guc_interrupts(struct drm_i915_private *dev_priv);
  
  /* intel_crt.c */
 -void intel_crt_init(struct drm_device *dev);
 +void intel_crt_init(struct drm_i915_private *dev_priv);
  void intel_crt_reset(struct drm_encoder *encoder);
  
  /* intel_ddi.c */
@@@ -1180,7 -1153,7 +1181,7 @@@ void intel_ddi_fdi_post_disable(struct 
                                struct drm_connector_state *old_conn_state);
  void intel_prepare_dp_ddi_buffers(struct intel_encoder *encoder);
  void hsw_fdi_link_train(struct drm_crtc *crtc);
 -void intel_ddi_init(struct drm_device *dev, enum port port);
 +void intel_ddi_init(struct drm_i915_private *dev_priv, enum port port);
  enum port intel_ddi_get_encoder_port(struct intel_encoder *intel_encoder);
  bool intel_ddi_get_hw_state(struct intel_encoder *encoder, enum pipe *pipe);
  void intel_ddi_enable_transcoder_func(struct drm_crtc *crtc);
@@@ -1193,8 -1166,6 +1194,8 @@@ bool intel_ddi_pll_select(struct intel_
  void intel_ddi_set_pipe_settings(struct drm_crtc *crtc);
  void intel_ddi_prepare_link_retrain(struct intel_dp *intel_dp);
  bool intel_ddi_connector_get_hw_state(struct intel_connector *intel_connector);
 +bool intel_ddi_is_audio_enabled(struct drm_i915_private *dev_priv,
 +                               struct intel_crtc *intel_crtc);
  void intel_ddi_get_config(struct intel_encoder *encoder,
                          struct intel_crtc_state *pipe_config);
  struct intel_encoder *
@@@ -1239,7 -1210,7 +1240,7 @@@ unsigned int intel_fb_xy_to_linear(int 
  void intel_add_fb_offsets(int *x, int *y,
                          const struct intel_plane_state *state, int plane);
  unsigned int intel_rotation_info_size(const struct intel_rotation_info *rot_info);
 -bool intel_has_pending_fb_unpin(struct drm_device *dev);
 +bool intel_has_pending_fb_unpin(struct drm_i915_private *dev_priv);
  void intel_mark_busy(struct drm_i915_private *dev_priv);
  void intel_mark_idle(struct drm_i915_private *dev_priv);
  void intel_crtc_restore_mode(struct drm_crtc *crtc);
@@@ -1407,15 -1378,12 +1408,15 @@@ void intel_csr_ucode_suspend(struct drm
  void intel_csr_ucode_resume(struct drm_i915_private *);
  
  /* intel_dp.c */
 -bool intel_dp_init(struct drm_device *dev, i915_reg_t output_reg, enum port port);
 +bool intel_dp_init(struct drm_i915_private *dev_priv, i915_reg_t output_reg,
 +                 enum port port);
  bool intel_dp_init_connector(struct intel_digital_port *intel_dig_port,
                             struct intel_connector *intel_connector);
  void intel_dp_set_link_params(struct intel_dp *intel_dp,
                              int link_rate, uint8_t lane_count,
                              bool link_mst);
 +int intel_dp_get_link_train_fallback_values(struct intel_dp *intel_dp,
 +                                          int link_rate, uint8_t lane_count);
  void intel_dp_start_link_train(struct intel_dp *intel_dp);
  void intel_dp_stop_link_train(struct intel_dp *intel_dp);
  void intel_dp_sink_dpms(struct intel_dp *intel_dp, int mode);
@@@ -1477,8 -1445,6 +1478,8 @@@ bool intel_dp_read_dpcd(struct intel_d
  bool __intel_dp_read_desc(struct intel_dp *intel_dp,
                          struct intel_dp_desc *desc);
  bool intel_dp_read_desc(struct intel_dp *intel_dp);
 +int intel_dp_link_required(int pixel_clock, int bpp);
 +int intel_dp_max_data_rate(int max_link_clock, int max_lanes);
  
  /* intel_dp_aux_backlight.c */
  int intel_dp_aux_init_backlight_funcs(struct intel_connector *intel_connector);
  int intel_dp_mst_encoder_init(struct intel_digital_port *intel_dig_port, int conn_id);
  void intel_dp_mst_encoder_cleanup(struct intel_digital_port *intel_dig_port);
  /* intel_dsi.c */
 -void intel_dsi_init(struct drm_device *dev);
 +void intel_dsi_init(struct drm_i915_private *dev_priv);
  
  /* intel_dsi_dcs_backlight.c */
  int intel_dsi_dcs_init_backlight_funcs(struct intel_connector *intel_connector);
  
  /* intel_dvo.c */
 -void intel_dvo_init(struct drm_device *dev);
 +void intel_dvo_init(struct drm_i915_private *dev_priv);
  /* intel_hotplug.c */
  void intel_hpd_poll_init(struct drm_i915_private *dev_priv);
  
@@@ -1557,8 -1523,7 +1558,8 @@@ void intel_fbc_cleanup_cfb(struct drm_i
  void intel_fbc_handle_fifo_underrun_irq(struct drm_i915_private *dev_priv);
  
  /* intel_hdmi.c */
 -void intel_hdmi_init(struct drm_device *dev, i915_reg_t hdmi_reg, enum port port);
 +void intel_hdmi_init(struct drm_i915_private *dev_priv, i915_reg_t hdmi_reg,
 +                   enum port port);
  void intel_hdmi_init_connector(struct intel_digital_port *intel_dig_port,
                               struct intel_connector *intel_connector);
  struct intel_hdmi *enc_to_intel_hdmi(struct drm_encoder *encoder);
@@@ -1569,7 -1534,7 +1570,7 @@@ void intel_dp_dual_mode_set_tmds_output
  
  
  /* intel_lvds.c */
 -void intel_lvds_init(struct drm_device *dev);
 +void intel_lvds_init(struct drm_i915_private *dev_priv);
  struct intel_encoder *intel_get_lvds_encoder(struct drm_device *dev);
  bool intel_is_dual_link_lvds(struct drm_device *dev);
  
@@@ -1614,9 -1579,9 +1615,9 @@@ int intel_panel_setup_backlight(struct 
  void intel_panel_enable_backlight(struct intel_connector *connector);
  void intel_panel_disable_backlight(struct intel_connector *connector);
  void intel_panel_destroy_backlight(struct drm_connector *connector);
 -enum drm_connector_status intel_panel_detect(struct drm_device *dev);
 +enum drm_connector_status intel_panel_detect(struct drm_i915_private *dev_priv);
  extern struct drm_display_mode *intel_find_panel_downclock(
 -                              struct drm_device *dev,
 +                              struct drm_i915_private *dev_priv,
                                struct drm_display_mode *fixed_mode,
                                struct drm_connector *connector);
  
@@@ -1642,7 -1607,7 +1643,7 @@@ void intel_psr_invalidate(struct drm_i9
  void intel_psr_flush(struct drm_i915_private *dev_priv,
                     unsigned frontbuffer_bits,
                     enum fb_op_origin origin);
 -void intel_psr_init(struct drm_device *dev);
 +void intel_psr_init(struct drm_i915_private *dev_priv);
  void intel_psr_single_frame_update(struct drm_i915_private *dev_priv,
                                   unsigned frontbuffer_bits);
  
@@@ -1746,7 -1711,7 +1747,7 @@@ int ilk_wm_max_level(const struct drm_i
  void intel_update_watermarks(struct intel_crtc *crtc);
  void intel_init_pm(struct drm_i915_private *dev_priv);
  void intel_init_clock_gating_hooks(struct drm_i915_private *dev_priv);
 -void intel_pm_setup(struct drm_device *dev);
 +void intel_pm_setup(struct drm_i915_private *dev_priv);
  void intel_gpu_ips_init(struct drm_i915_private *dev_priv);
  void intel_gpu_ips_teardown(void);
  void intel_init_gt_powersave(struct drm_i915_private *dev_priv);
@@@ -1787,7 -1752,7 +1788,7 @@@ static inline int intel_enable_rc6(void
  }
  
  /* intel_sdvo.c */
 -bool intel_sdvo_init(struct drm_device *dev,
 +bool intel_sdvo_init(struct drm_i915_private *dev_priv,
                     i915_reg_t reg, enum port port);
  
  
@@@ -1802,7 -1767,7 +1803,7 @@@ void intel_pipe_update_start(struct int
  void intel_pipe_update_end(struct intel_crtc *crtc, struct intel_flip_work *work);
  
  /* intel_tv.c */
 -void intel_tv_init(struct drm_device *dev);
 +void intel_tv_init(struct drm_i915_private *dev_priv);
  
  /* intel_atomic.c */
  int intel_connector_atomic_get_property(struct drm_connector *connector,
@@@ -1814,6 -1779,8 +1815,6 @@@ void intel_crtc_destroy_state(struct dr
                               struct drm_crtc_state *state);
  struct drm_atomic_state *intel_atomic_state_alloc(struct drm_device *dev);
  void intel_atomic_state_clear(struct drm_atomic_state *);
 -struct intel_shared_dpll_config *
 -intel_atomic_get_shared_dpll_state(struct drm_atomic_state *s);
  
  static inline struct intel_crtc_state *
  intel_atomic_get_crtc_state(struct drm_atomic_state *state,
        return to_intel_crtc_state(crtc_state);
  }
  
 +static inline struct intel_crtc_state *
 +intel_atomic_get_existing_crtc_state(struct drm_atomic_state *state,
 +                                   struct intel_crtc *crtc)
 +{
 +      struct drm_crtc_state *crtc_state;
 +
 +      crtc_state = drm_atomic_get_existing_crtc_state(state, &crtc->base);
 +
 +      if (crtc_state)
 +              return to_intel_crtc_state(crtc_state);
 +      else
 +              return NULL;
 +}
 +
  static inline struct intel_plane_state *
  intel_atomic_get_existing_plane_state(struct drm_atomic_state *state,
                                      struct intel_plane *plane)
@@@ -1862,6 -1815,8 +1863,8 @@@ struct drm_plane_state *intel_plane_dup
  void intel_plane_destroy_state(struct drm_plane *plane,
                               struct drm_plane_state *state);
  extern const struct drm_plane_helper_funcs intel_plane_helper_funcs;
+ int intel_plane_atomic_check_with_state(struct intel_crtc_state *crtc_state,
+                                       struct intel_plane_state *intel_state);
  
  /* intel_color.c */
  void intel_color_init(struct drm_crtc *crtc);
@@@ -1872,10 -1827,4 +1875,10 @@@ void intel_color_load_luts(struct drm_c
  /* intel_lspcon.c */
  bool lspcon_init(struct intel_digital_port *intel_dig_port);
  void lspcon_resume(struct intel_lspcon *lspcon);
 +void lspcon_wait_pcon_mode(struct intel_lspcon *lspcon);
 +
 +/* intel_pipe_crc.c */
 +int intel_pipe_crc_create(struct drm_minor *minor);
 +void intel_pipe_crc_cleanup(struct drm_minor *minor);
 +extern const struct file_operations i915_display_crc_ctl_fops;
  #endif /* __INTEL_DRV_H__ */
@@@ -188,7 -188,7 +188,7 @@@ static void g4x_fbc_activate(struct drm
        u32 dpfc_ctl;
  
        dpfc_ctl = DPFC_CTL_PLANE(params->crtc.plane) | DPFC_SR_EN;
-       if (drm_format_plane_cpp(params->fb.pixel_format, 0) == 2)
+       if (params->fb.format->cpp[0] == 2)
                dpfc_ctl |= DPFC_CTL_LIMIT_2X;
        else
                dpfc_ctl |= DPFC_CTL_LIMIT_1X;
@@@ -235,7 -235,7 +235,7 @@@ static void ilk_fbc_activate(struct drm
        int threshold = dev_priv->fbc.threshold;
  
        dpfc_ctl = DPFC_CTL_PLANE(params->crtc.plane);
-       if (drm_format_plane_cpp(params->fb.pixel_format, 0) == 2)
+       if (params->fb.format->cpp[0] == 2)
                threshold++;
  
        switch (threshold) {
@@@ -303,7 -303,7 +303,7 @@@ static void gen7_fbc_activate(struct dr
        if (IS_IVYBRIDGE(dev_priv))
                dpfc_ctl |= IVB_DPFC_CTL_PLANE(params->crtc.plane);
  
-       if (drm_format_plane_cpp(params->fb.pixel_format, 0) == 2)
+       if (params->fb.format->cpp[0] == 2)
                threshold++;
  
        switch (threshold) {
@@@ -538,7 -538,7 +538,7 @@@ static int find_compression_threshold(s
            IS_SKYLAKE(dev_priv) || IS_KABYLAKE(dev_priv))
                end = ggtt->stolen_size - 8 * 1024 * 1024;
        else
 -              end = ggtt->stolen_usable_size;
 +              end = U64_MAX;
  
        /* HACK: This code depends on what we will do in *_enable_fbc. If that
         * code changes, this code needs to change as well.
@@@ -581,7 -581,7 +581,7 @@@ static int intel_fbc_alloc_cfb(struct i
        WARN_ON(drm_mm_node_allocated(&fbc->compressed_fb));
  
        size = intel_fbc_calculate_cfb_size(dev_priv, &fbc->state_cache);
-       fb_cpp = drm_format_plane_cpp(fbc->state_cache.fb.pixel_format, 0);
+       fb_cpp = fbc->state_cache.fb.format->cpp[0];
  
        ret = find_compression_threshold(dev_priv, &fbc->compressed_fb,
                                         size, fb_cpp);
@@@ -764,7 -764,7 +764,7 @@@ static void intel_fbc_update_state_cach
         * platforms that need. */
        if (IS_GEN(dev_priv, 5, 6))
                cache->fb.ilk_ggtt_offset = i915_gem_object_ggtt_offset(obj, NULL);
-       cache->fb.pixel_format = fb->pixel_format;
+       cache->fb.format = fb->format;
        cache->fb.stride = fb->pitches[0];
        cache->fb.fence_reg = get_fence_id(fb);
        cache->fb.tiling_mode = i915_gem_object_get_tiling(obj);
@@@ -823,7 -823,7 +823,7 @@@ static bool intel_fbc_can_activate(stru
                return false;
        }
  
-       if (!pixel_format_is_valid(dev_priv, cache->fb.pixel_format)) {
+       if (!pixel_format_is_valid(dev_priv, cache->fb.format->format)) {
                fbc->no_fbc_reason = "pixel format is invalid";
                return false;
        }
@@@ -892,7 -892,7 +892,7 @@@ static void intel_fbc_get_reg_params(st
        params->crtc.plane = crtc->plane;
        params->crtc.fence_y_offset = get_crtc_fence_y_offset(crtc);
  
-       params->fb.pixel_format = cache->fb.pixel_format;
+       params->fb.format = cache->fb.format;
        params->fb.stride = cache->fb.stride;
        params->fb.fence_reg = cache->fb.fence_reg;
  
@@@ -145,9 -145,9 +145,9 @@@ static int intelfb_alloc(struct drm_fb_
         * important and we should probably use that space with FBC or other
         * features. */
        if (size * 2 < ggtt->stolen_usable_size)
 -              obj = i915_gem_object_create_stolen(dev, size);
 +              obj = i915_gem_object_create_stolen(dev_priv, size);
        if (obj == NULL)
 -              obj = i915_gem_object_create(dev, size);
 +              obj = i915_gem_object_create(dev_priv, size);
        if (IS_ERR(obj)) {
                DRM_ERROR("failed to allocate framebuffer\n");
                ret = PTR_ERR(obj);
@@@ -261,7 -261,7 +261,7 @@@ static int intelfb_create(struct drm_fb
        /* This driver doesn't need a VT switch to restore the mode on resume */
        info->skip_vt_switch = true;
  
-       drm_fb_helper_fill_fix(info, fb->pitches[0], fb->depth);
+       drm_fb_helper_fill_fix(info, fb->pitches[0], fb->format->depth);
        drm_fb_helper_fill_var(info, &ifbdev->helper, sizes->fb_width, sizes->fb_height);
  
        /* If the object is shmemfs backed, it will have given us zeroed pages.
@@@ -621,7 -621,7 +621,7 @@@ static bool intel_fbdev_init_bios(struc
                 * rather than the current pipe's, since they differ.
                 */
                cur_size = intel_crtc->config->base.adjusted_mode.crtc_hdisplay;
-               cur_size = cur_size * fb->base.bits_per_pixel / 8;
+               cur_size = cur_size * fb->base.format->cpp[0];
                if (fb->base.pitches[0] < cur_size) {
                        DRM_DEBUG_KMS("fb not wide enough for plane %c (%d vs %d)\n",
                                      pipe_name(intel_crtc->pipe),
  
                cur_size = intel_crtc->config->base.adjusted_mode.crtc_vdisplay;
                cur_size = intel_fb_align_height(dev, cur_size,
-                                                fb->base.pixel_format,
+                                                fb->base.format->format,
                                                 fb->base.modifier);
                cur_size *= fb->base.pitches[0];
                DRM_DEBUG_KMS("pipe %c area: %dx%d, bpp: %d, size: %d\n",
                              pipe_name(intel_crtc->pipe),
                              intel_crtc->config->base.adjusted_mode.crtc_hdisplay,
                              intel_crtc->config->base.adjusted_mode.crtc_vdisplay,
-                             fb->base.bits_per_pixel,
+                             fb->base.format->cpp[0] * 8,
                              cur_size);
  
                if (cur_size > max_size) {
                goto out;
        }
  
-       ifbdev->preferred_bpp = fb->base.bits_per_pixel;
+       ifbdev->preferred_bpp = fb->base.format->cpp[0] * 8;
        ifbdev->fb = fb;
  
        drm_framebuffer_reference(&ifbdev->fb->base);
@@@ -187,29 -187,6 +187,29 @@@ struct intel_overlay 
        struct i915_gem_active last_flip;
  };
  
 +static void i830_overlay_clock_gating(struct drm_i915_private *dev_priv,
 +                                    bool enable)
 +{
 +      struct pci_dev *pdev = dev_priv->drm.pdev;
 +      u8 val;
 +
 +      /* WA_OVERLAY_CLKGATE:alm */
 +      if (enable)
 +              I915_WRITE(DSPCLK_GATE_D, 0);
 +      else
 +              I915_WRITE(DSPCLK_GATE_D, OVRUNIT_CLOCK_GATE_DISABLE);
 +
 +      /* WA_DISABLE_L2CACHE_CLOCK_GATING:alm */
 +      pci_bus_read_config_byte(pdev->bus,
 +                               PCI_DEVFN(0, 0), I830_CLOCK_GATE, &val);
 +      if (enable)
 +              val &= ~I830_L2_CACHE_CLOCK_GATE_DISABLE;
 +      else
 +              val |= I830_L2_CACHE_CLOCK_GATE_DISABLE;
 +      pci_bus_write_config_byte(pdev->bus,
 +                                PCI_DEVFN(0, 0), I830_CLOCK_GATE, val);
 +}
 +
  static struct overlay_registers __iomem *
  intel_overlay_map_regs(struct intel_overlay *overlay)
  {
@@@ -239,8 -216,7 +239,8 @@@ static void intel_overlay_submit_reques
  {
        GEM_BUG_ON(i915_gem_active_peek(&overlay->last_flip,
                                        &overlay->i915->drm.struct_mutex));
 -      overlay->last_flip.retire = retire;
 +      i915_gem_active_set_retire_fn(&overlay->last_flip, retire,
 +                                    &overlay->i915->drm.struct_mutex);
        i915_gem_active_set(&overlay->last_flip, req);
        i915_add_request(req);
  }
@@@ -285,9 -261,6 +285,9 @@@ static int intel_overlay_on(struct inte
  
        overlay->active = true;
  
 +      if (IS_I830(dev_priv))
 +              i830_overlay_clock_gating(dev_priv, false);
 +
        ring = req->ring;
        intel_ring_emit(ring, MI_OVERLAY_FLIP | MI_OVERLAY_ON);
        intel_ring_emit(ring, overlay->flip_addr | OFC_UPDATE);
        return intel_overlay_do_wait_request(overlay, req, NULL);
  }
  
 +static void intel_overlay_flip_prepare(struct intel_overlay *overlay,
 +                                     struct i915_vma *vma)
 +{
 +      enum pipe pipe = overlay->crtc->pipe;
 +
 +      WARN_ON(overlay->old_vma);
 +
 +      i915_gem_track_fb(overlay->vma ? overlay->vma->obj : NULL,
 +                        vma ? vma->obj : NULL,
 +                        INTEL_FRONTBUFFER_OVERLAY(pipe));
 +
 +      intel_frontbuffer_flip_prepare(overlay->i915,
 +                                     INTEL_FRONTBUFFER_OVERLAY(pipe));
 +
 +      overlay->old_vma = overlay->vma;
 +      if (vma)
 +              overlay->vma = i915_vma_get(vma);
 +      else
 +              overlay->vma = NULL;
 +}
 +
  /* overlay needs to be enabled in OCMD reg */
  static int intel_overlay_continue(struct intel_overlay *overlay,
 +                                struct i915_vma *vma,
                                  bool load_polyphase_filter)
  {
        struct drm_i915_private *dev_priv = overlay->i915;
        intel_ring_emit(ring, flip_addr);
        intel_ring_advance(ring);
  
 +      intel_overlay_flip_prepare(overlay, vma);
 +
        intel_overlay_submit_request(overlay, req, NULL);
  
        return 0;
  }
  
 -static void intel_overlay_release_old_vid_tail(struct i915_gem_active *active,
 -                                             struct drm_i915_gem_request *req)
 +static void intel_overlay_release_old_vma(struct intel_overlay *overlay)
  {
 -      struct intel_overlay *overlay =
 -              container_of(active, typeof(*overlay), last_flip);
        struct i915_vma *vma;
  
        vma = fetch_and_zero(&overlay->old_vma);
        if (WARN_ON(!vma))
                return;
  
 -      i915_gem_track_fb(vma->obj, NULL,
 -                        INTEL_FRONTBUFFER_OVERLAY(overlay->crtc->pipe));
 +      intel_frontbuffer_flip_complete(overlay->i915,
 +                                      INTEL_FRONTBUFFER_OVERLAY(overlay->crtc->pipe));
  
        i915_gem_object_unpin_from_display_plane(vma);
        i915_vma_put(vma);
  }
  
 +static void intel_overlay_release_old_vid_tail(struct i915_gem_active *active,
 +                                             struct drm_i915_gem_request *req)
 +{
 +      struct intel_overlay *overlay =
 +              container_of(active, typeof(*overlay), last_flip);
 +
 +      intel_overlay_release_old_vma(overlay);
 +}
 +
  static void intel_overlay_off_tail(struct i915_gem_active *active,
                                   struct drm_i915_gem_request *req)
  {
        struct intel_overlay *overlay =
                container_of(active, typeof(*overlay), last_flip);
 -      struct i915_vma *vma;
 -
 -      /* never have the overlay hw on without showing a frame */
 -      vma = fetch_and_zero(&overlay->vma);
 -      if (WARN_ON(!vma))
 -              return;
 +      struct drm_i915_private *dev_priv = overlay->i915;
  
 -      i915_gem_object_unpin_from_display_plane(vma);
 -      i915_vma_put(vma);
 +      intel_overlay_release_old_vma(overlay);
  
        overlay->crtc->overlay = NULL;
        overlay->crtc = NULL;
        overlay->active = false;
 +
 +      if (IS_I830(dev_priv))
 +              i830_overlay_clock_gating(dev_priv, true);
  }
  
  /* overlay needs to be disabled in OCMD reg */
  static int intel_overlay_off(struct intel_overlay *overlay)
  {
 -      struct drm_i915_private *dev_priv = overlay->i915;
        struct drm_i915_gem_request *req;
        struct intel_ring *ring;
        u32 flip_addr = overlay->flip_addr;
        }
  
        ring = req->ring;
 +
        /* wait for overlay to go idle */
        intel_ring_emit(ring, MI_OVERLAY_FLIP | MI_OVERLAY_CONTINUE);
        intel_ring_emit(ring, flip_addr);
        intel_ring_emit(ring, MI_WAIT_FOR_EVENT | MI_WAIT_FOR_OVERLAY_FLIP);
 +
        /* turn overlay off */
 -      if (IS_I830(dev_priv)) {
 -              /* Workaround: Don't disable the overlay fully, since otherwise
 -               * it dies on the next OVERLAY_ON cmd. */
 -              intel_ring_emit(ring, MI_NOOP);
 -              intel_ring_emit(ring, MI_NOOP);
 -              intel_ring_emit(ring, MI_NOOP);
 -      } else {
 -              intel_ring_emit(ring, MI_OVERLAY_FLIP | MI_OVERLAY_OFF);
 -              intel_ring_emit(ring, flip_addr);
 -              intel_ring_emit(ring,
 -                              MI_WAIT_FOR_EVENT | MI_WAIT_FOR_OVERLAY_FLIP);
 -      }
 +      intel_ring_emit(ring, MI_OVERLAY_FLIP | MI_OVERLAY_OFF);
 +      intel_ring_emit(ring, flip_addr);
 +      intel_ring_emit(ring, MI_WAIT_FOR_EVENT | MI_WAIT_FOR_OVERLAY_FLIP);
 +
        intel_ring_advance(ring);
  
 +      intel_overlay_flip_prepare(overlay, NULL);
 +
        return intel_overlay_do_wait_request(overlay, req,
                                             intel_overlay_off_tail);
  }
@@@ -590,57 -541,51 +590,57 @@@ static int uv_vsubsampling(u32 format
  
  static u32 calc_swidthsw(struct drm_i915_private *dev_priv, u32 offset, u32 width)
  {
 -      u32 mask, shift, ret;
 -      if (IS_GEN2(dev_priv)) {
 -              mask = 0x1f;
 -              shift = 5;
 -      } else {
 -              mask = 0x3f;
 -              shift = 6;
 -      }
 -      ret = ((offset + width + mask) >> shift) - (offset >> shift);
 -      if (!IS_GEN2(dev_priv))
 -              ret <<= 1;
 -      ret -= 1;
 -      return ret << 2;
 +      u32 sw;
 +
 +      if (IS_GEN2(dev_priv))
 +              sw = ALIGN((offset & 31) + width, 32);
 +      else
 +              sw = ALIGN((offset & 63) + width, 64);
 +
 +      if (sw == 0)
 +              return 0;
 +
 +      return (sw - 32) >> 3;
  }
  
 -static const u16 y_static_hcoeffs[N_HORIZ_Y_TAPS * N_PHASES] = {
 -      0x3000, 0xb4a0, 0x1930, 0x1920, 0xb4a0,
 -      0x3000, 0xb500, 0x19d0, 0x1880, 0xb440,
 -      0x3000, 0xb540, 0x1a88, 0x2f80, 0xb3e0,
 -      0x3000, 0xb580, 0x1b30, 0x2e20, 0xb380,
 -      0x3000, 0xb5c0, 0x1bd8, 0x2cc0, 0xb320,
 -      0x3020, 0xb5e0, 0x1c60, 0x2b80, 0xb2c0,
 -      0x3020, 0xb5e0, 0x1cf8, 0x2a20, 0xb260,
 -      0x3020, 0xb5e0, 0x1d80, 0x28e0, 0xb200,
 -      0x3020, 0xb5c0, 0x1e08, 0x3f40, 0xb1c0,
 -      0x3020, 0xb580, 0x1e78, 0x3ce0, 0xb160,
 -      0x3040, 0xb520, 0x1ed8, 0x3aa0, 0xb120,
 -      0x3040, 0xb4a0, 0x1f30, 0x3880, 0xb0e0,
 -      0x3040, 0xb400, 0x1f78, 0x3680, 0xb0a0,
 -      0x3020, 0xb340, 0x1fb8, 0x34a0, 0xb060,
 -      0x3020, 0xb240, 0x1fe0, 0x32e0, 0xb040,
 -      0x3020, 0xb140, 0x1ff8, 0x3160, 0xb020,
 -      0xb000, 0x3000, 0x0800, 0x3000, 0xb000
 +static const u16 y_static_hcoeffs[N_PHASES][N_HORIZ_Y_TAPS] = {
 +      [ 0] = { 0x3000, 0xb4a0, 0x1930, 0x1920, 0xb4a0, },
 +      [ 1] = { 0x3000, 0xb500, 0x19d0, 0x1880, 0xb440, },
 +      [ 2] = { 0x3000, 0xb540, 0x1a88, 0x2f80, 0xb3e0, },
 +      [ 3] = { 0x3000, 0xb580, 0x1b30, 0x2e20, 0xb380, },
 +      [ 4] = { 0x3000, 0xb5c0, 0x1bd8, 0x2cc0, 0xb320, },
 +      [ 5] = { 0x3020, 0xb5e0, 0x1c60, 0x2b80, 0xb2c0, },
 +      [ 6] = { 0x3020, 0xb5e0, 0x1cf8, 0x2a20, 0xb260, },
 +      [ 7] = { 0x3020, 0xb5e0, 0x1d80, 0x28e0, 0xb200, },
 +      [ 8] = { 0x3020, 0xb5c0, 0x1e08, 0x3f40, 0xb1c0, },
 +      [ 9] = { 0x3020, 0xb580, 0x1e78, 0x3ce0, 0xb160, },
 +      [10] = { 0x3040, 0xb520, 0x1ed8, 0x3aa0, 0xb120, },
 +      [11] = { 0x3040, 0xb4a0, 0x1f30, 0x3880, 0xb0e0, },
 +      [12] = { 0x3040, 0xb400, 0x1f78, 0x3680, 0xb0a0, },
 +      [13] = { 0x3020, 0xb340, 0x1fb8, 0x34a0, 0xb060, },
 +      [14] = { 0x3020, 0xb240, 0x1fe0, 0x32e0, 0xb040, },
 +      [15] = { 0x3020, 0xb140, 0x1ff8, 0x3160, 0xb020, },
 +      [16] = { 0xb000, 0x3000, 0x0800, 0x3000, 0xb000, },
  };
  
 -static const u16 uv_static_hcoeffs[N_HORIZ_UV_TAPS * N_PHASES] = {
 -      0x3000, 0x1800, 0x1800, 0xb000, 0x18d0, 0x2e60,
 -      0xb000, 0x1990, 0x2ce0, 0xb020, 0x1a68, 0x2b40,
 -      0xb040, 0x1b20, 0x29e0, 0xb060, 0x1bd8, 0x2880,
 -      0xb080, 0x1c88, 0x3e60, 0xb0a0, 0x1d28, 0x3c00,
 -      0xb0c0, 0x1db8, 0x39e0, 0xb0e0, 0x1e40, 0x37e0,
 -      0xb100, 0x1eb8, 0x3620, 0xb100, 0x1f18, 0x34a0,
 -      0xb100, 0x1f68, 0x3360, 0xb0e0, 0x1fa8, 0x3240,
 -      0xb0c0, 0x1fe0, 0x3140, 0xb060, 0x1ff0, 0x30a0,
 -      0x3000, 0x0800, 0x3000
 +static const u16 uv_static_hcoeffs[N_PHASES][N_HORIZ_UV_TAPS] = {
 +      [ 0] = { 0x3000, 0x1800, 0x1800, },
 +      [ 1] = { 0xb000, 0x18d0, 0x2e60, },
 +      [ 2] = { 0xb000, 0x1990, 0x2ce0, },
 +      [ 3] = { 0xb020, 0x1a68, 0x2b40, },
 +      [ 4] = { 0xb040, 0x1b20, 0x29e0, },
 +      [ 5] = { 0xb060, 0x1bd8, 0x2880, },
 +      [ 6] = { 0xb080, 0x1c88, 0x3e60, },
 +      [ 7] = { 0xb0a0, 0x1d28, 0x3c00, },
 +      [ 8] = { 0xb0c0, 0x1db8, 0x39e0, },
 +      [ 9] = { 0xb0e0, 0x1e40, 0x37e0, },
 +      [10] = { 0xb100, 0x1eb8, 0x3620, },
 +      [11] = { 0xb100, 0x1f18, 0x34a0, },
 +      [12] = { 0xb100, 0x1f68, 0x3360, },
 +      [13] = { 0xb0e0, 0x1fa8, 0x3240, },
 +      [14] = { 0xb0c0, 0x1fe0, 0x3140, },
 +      [15] = { 0xb060, 0x1ff0, 0x30a0, },
 +      [16] = { 0x3000, 0x0800, 0x3000, },
  };
  
  static void update_polyphase_filter(struct overlay_registers __iomem *regs)
@@@ -713,19 -658,16 +713,19 @@@ static bool update_scaling_factors(stru
  static void update_colorkey(struct intel_overlay *overlay,
                            struct overlay_registers __iomem *regs)
  {
 -      const struct drm_framebuffer *fb =
 -              overlay->crtc->base.primary->fb;
 +      const struct intel_plane_state *state =
 +              to_intel_plane_state(overlay->crtc->base.primary->state);
        u32 key = overlay->color_key;
 -      u32 flags;
 +      u32 format = 0;
 +      u32 flags = 0;
  
 -      flags = 0;
        if (overlay->color_key_enabled)
                flags |= DST_KEY_ENABLE;
  
 -      switch (fb->format->format) {
 +      if (state->base.visible)
-               format = state->base.fb->pixel_format;
++              format = state->base.fb->format->format;
 +
 +      switch (format) {
        case DRM_FORMAT_C8:
                key = 0;
                flags |= CLK_RGB8I_MASK;
@@@ -891,10 -833,18 +891,10 @@@ static int intel_overlay_do_put_image(s
  
        intel_overlay_unmap_regs(overlay, regs);
  
 -      ret = intel_overlay_continue(overlay, scale_changed);
 +      ret = intel_overlay_continue(overlay, vma, scale_changed);
        if (ret)
                goto out_unpin;
  
 -      i915_gem_track_fb(overlay->vma->obj, new_bo,
 -                        INTEL_FRONTBUFFER_OVERLAY(pipe));
 -
 -      overlay->old_vma = overlay->vma;
 -      overlay->vma = vma;
 -
 -      intel_frontbuffer_flip(dev_priv, INTEL_FRONTBUFFER_OVERLAY(pipe));
 -
        return 0;
  
  out_unpin:
@@@ -968,13 -918,12 +968,13 @@@ static void update_pfit_vscale_ratio(st
  static int check_overlay_dst(struct intel_overlay *overlay,
                             struct drm_intel_overlay_put_image *rec)
  {
 -      struct drm_display_mode *mode = &overlay->crtc->base.mode;
 +      const struct intel_crtc_state *pipe_config =
 +              overlay->crtc->config;
  
 -      if (rec->dst_x < mode->hdisplay &&
 -          rec->dst_x + rec->dst_width <= mode->hdisplay &&
 -          rec->dst_y < mode->vdisplay &&
 -          rec->dst_y + rec->dst_height <= mode->vdisplay)
 +      if (rec->dst_x < pipe_config->pipe_src_w &&
 +          rec->dst_x + rec->dst_width <= pipe_config->pipe_src_w &&
 +          rec->dst_y < pipe_config->pipe_src_h &&
 +          rec->dst_y + rec->dst_height <= pipe_config->pipe_src_h)
                return 0;
        else
                return -EINVAL;
@@@ -1006,7 -955,7 +1006,7 @@@ static int check_overlay_src(struct drm
        u32 tmp;
  
        /* check src dimensions */
 -      if (IS_845G(dev_priv) || IS_I830(dev_priv)) {
 +      if (IS_I845G(dev_priv) || IS_I830(dev_priv)) {
                if (rec->src_height > IMAGE_MAX_HEIGHT_LEGACY ||
                    rec->src_width  > IMAGE_MAX_WIDTH_LEGACY)
                        return -EINVAL;
                return -EINVAL;
  
        /* stride checking */
 -      if (IS_I830(dev_priv) || IS_845G(dev_priv))
 +      if (IS_I830(dev_priv) || IS_I845G(dev_priv))
                stride_mask = 255;
        else
                stride_mask = 63;
        return 0;
  }
  
 -/**
 - * Return the pipe currently connected to the panel fitter,
 - * or -1 if the panel fitter is not present or not in use
 - */
 -static int intel_panel_fitter_pipe(struct drm_i915_private *dev_priv)
 -{
 -      u32  pfit_control;
 -
 -      /* i830 doesn't have a panel fitter */
 -      if (INTEL_GEN(dev_priv) <= 3 &&
 -          (IS_I830(dev_priv) || !IS_MOBILE(dev_priv)))
 -              return -1;
 -
 -      pfit_control = I915_READ(PFIT_CONTROL);
 -
 -      /* See if the panel fitter is in use */
 -      if ((pfit_control & PFIT_ENABLE) == 0)
 -              return -1;
 -
 -      /* 965 can place panel fitter on either pipe */
 -      if (IS_GEN4(dev_priv))
 -              return (pfit_control >> 29) & 0x3;
 -
 -      /* older chips can only use pipe 1 */
 -      return 1;
 -}
 -
  int intel_overlay_put_image_ioctl(struct drm_device *dev, void *data,
                                  struct drm_file *file_priv)
  {
                goto out_unlock;
  
        if (overlay->crtc != crtc) {
 -              struct drm_display_mode *mode = &crtc->base.mode;
                ret = intel_overlay_switch_off(overlay);
                if (ret != 0)
                        goto out_unlock;
                crtc->overlay = overlay;
  
                /* line too wide, i.e. one-line-mode */
 -              if (mode->hdisplay > 1024 &&
 -                  intel_panel_fitter_pipe(dev_priv) == crtc->pipe) {
 +              if (crtc->config->pipe_src_w > 1024 &&
 +                  crtc->config->gmch_pfit.control & PFIT_ENABLE) {
                        overlay->pfit_active = true;
                        update_pfit_vscale_ratio(overlay);
                } else
  
        mutex_unlock(&dev->struct_mutex);
        drm_modeset_unlock_all(dev);
 +      i915_gem_object_put(new_bo);
  
        kfree(params);
  
@@@ -1413,9 -1389,10 +1413,9 @@@ void intel_setup_overlay(struct drm_i91
  
        reg_bo = NULL;
        if (!OVERLAY_NEEDS_PHYSICAL(dev_priv))
 -              reg_bo = i915_gem_object_create_stolen(&dev_priv->drm,
 -                                                     PAGE_SIZE);
 +              reg_bo = i915_gem_object_create_stolen(dev_priv, PAGE_SIZE);
        if (reg_bo == NULL)
 -              reg_bo = i915_gem_object_create(&dev_priv->drm, PAGE_SIZE);
 +              reg_bo = i915_gem_object_create(dev_priv, PAGE_SIZE);
        if (IS_ERR(reg_bo))
                goto out_free;
        overlay->reg_bo = reg_bo;
        overlay->contrast = 75;
        overlay->saturation = 146;
  
 +      init_request_active(&overlay->last_flip, NULL);
 +
        regs = intel_overlay_map_regs(overlay);
        if (!regs)
                goto out_unpin_bo;
@@@ -312,30 -312,23 +312,30 @@@ static void chv_set_memory_pm5(struct d
  #define FW_WM(value, plane) \
        (((value) << DSPFW_ ## plane ## _SHIFT) & DSPFW_ ## plane ## _MASK)
  
 -void intel_set_memory_cxsr(struct drm_i915_private *dev_priv, bool enable)
 +static bool _intel_set_memory_cxsr(struct drm_i915_private *dev_priv, bool enable)
  {
 +      bool was_enabled;
        u32 val;
  
        if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv)) {
 +              was_enabled = I915_READ(FW_BLC_SELF_VLV) & FW_CSPWRDWNEN;
                I915_WRITE(FW_BLC_SELF_VLV, enable ? FW_CSPWRDWNEN : 0);
                POSTING_READ(FW_BLC_SELF_VLV);
 -              dev_priv->wm.vlv.cxsr = enable;
 -      } else if (IS_G4X(dev_priv) || IS_CRESTLINE(dev_priv)) {
 +      } else if (IS_G4X(dev_priv) || IS_I965GM(dev_priv)) {
 +              was_enabled = I915_READ(FW_BLC_SELF) & FW_BLC_SELF_EN;
                I915_WRITE(FW_BLC_SELF, enable ? FW_BLC_SELF_EN : 0);
                POSTING_READ(FW_BLC_SELF);
        } else if (IS_PINEVIEW(dev_priv)) {
 -              val = I915_READ(DSPFW3) & ~PINEVIEW_SELF_REFRESH_EN;
 -              val |= enable ? PINEVIEW_SELF_REFRESH_EN : 0;
 +              val = I915_READ(DSPFW3);
 +              was_enabled = val & PINEVIEW_SELF_REFRESH_EN;
 +              if (enable)
 +                      val |= PINEVIEW_SELF_REFRESH_EN;
 +              else
 +                      val &= ~PINEVIEW_SELF_REFRESH_EN;
                I915_WRITE(DSPFW3, val);
                POSTING_READ(DSPFW3);
        } else if (IS_I945G(dev_priv) || IS_I945GM(dev_priv)) {
 +              was_enabled = I915_READ(FW_BLC_SELF) & FW_BLC_SELF_EN;
                val = enable ? _MASKED_BIT_ENABLE(FW_BLC_SELF_EN) :
                               _MASKED_BIT_DISABLE(FW_BLC_SELF_EN);
                I915_WRITE(FW_BLC_SELF, val);
                 * and yet it does have the related watermark in
                 * FW_BLC_SELF. What's going on?
                 */
 +              was_enabled = I915_READ(INSTPM) & INSTPM_SELF_EN;
                val = enable ? _MASKED_BIT_ENABLE(INSTPM_SELF_EN) :
                               _MASKED_BIT_DISABLE(INSTPM_SELF_EN);
                I915_WRITE(INSTPM, val);
                POSTING_READ(INSTPM);
        } else {
 -              return;
 +              return false;
        }
  
 -      DRM_DEBUG_KMS("memory self-refresh is %s\n", enableddisabled(enable));
 +      DRM_DEBUG_KMS("memory self-refresh is %s (was %s)\n",
 +                    enableddisabled(enable),
 +                    enableddisabled(was_enabled));
 +
 +      return was_enabled;
  }
  
 +bool intel_set_memory_cxsr(struct drm_i915_private *dev_priv, bool enable)
 +{
 +      bool ret;
 +
 +      mutex_lock(&dev_priv->wm.wm_mutex);
 +      ret = _intel_set_memory_cxsr(dev_priv, enable);
 +      dev_priv->wm.vlv.cxsr = enable;
 +      mutex_unlock(&dev_priv->wm.wm_mutex);
 +
 +      return ret;
 +}
  
  /*
   * Latency for FIFO fetches is dependent on several factors:
@@@ -393,15 -370,12 +393,15 @@@ static const int pessimal_latency_ns = 
  #define VLV_FIFO_START(dsparb, dsparb2, lo_shift, hi_shift) \
        ((((dsparb) >> (lo_shift)) & 0xff) | ((((dsparb2) >> (hi_shift)) & 0x1) << 8))
  
 -static int vlv_get_fifo_size(struct drm_i915_private *dev_priv,
 -                            enum pipe pipe, int plane)
 +static int vlv_get_fifo_size(struct intel_plane *plane)
  {
 +      struct drm_i915_private *dev_priv = to_i915(plane->base.dev);
        int sprite0_start, sprite1_start, size;
  
 -      switch (pipe) {
 +      if (plane->id == PLANE_CURSOR)
 +              return 63;
 +
 +      switch (plane->pipe) {
                uint32_t dsparb, dsparb2, dsparb3;
        case PIPE_A:
                dsparb = I915_READ(DSPARB);
                return 0;
        }
  
 -      switch (plane) {
 -      case 0:
 +      switch (plane->id) {
 +      case PLANE_PRIMARY:
                size = sprite0_start;
                break;
 -      case 1:
 +      case PLANE_SPRITE0:
                size = sprite1_start - sprite0_start;
                break;
 -      case 2:
 +      case PLANE_SPRITE1:
                size = 512 - 1 - sprite1_start;
                break;
        default:
                return 0;
        }
  
 -      DRM_DEBUG_KMS("Pipe %c %s %c FIFO size: %d\n",
 -                    pipe_name(pipe), plane == 0 ? "primary" : "sprite",
 -                    plane == 0 ? plane_name(pipe) : sprite_name(pipe, plane - 1),
 -                    size);
 +      DRM_DEBUG_KMS("%s FIFO size: %d\n", plane->base.name, size);
  
        return size;
  }
@@@ -675,7 -652,7 +675,7 @@@ static void pineview_update_wm(struct i
                        &crtc->config->base.adjusted_mode;
                const struct drm_framebuffer *fb =
                        crtc->base.primary->state->fb;
-               int cpp = drm_format_plane_cpp(fb->pixel_format, 0);
+               int cpp = fb->format->cpp[0];
                int clock = adjusted_mode->crtc_clock;
  
                /* Display SR */
@@@ -750,7 -727,7 +750,7 @@@ static bool g4x_compute_wm0(struct drm_
        clock = adjusted_mode->crtc_clock;
        htotal = adjusted_mode->crtc_htotal;
        hdisplay = crtc->config->pipe_src_w;
-       cpp = drm_format_plane_cpp(fb->pixel_format, 0);
+       cpp = fb->format->cpp[0];
  
        /* Use the small buffer method to calculate plane watermark */
        entries = ((clock * cpp / 1000) * display_latency_ns) / 1000;
@@@ -839,7 -816,7 +839,7 @@@ static bool g4x_compute_srwm(struct drm
        clock = adjusted_mode->crtc_clock;
        htotal = adjusted_mode->crtc_htotal;
        hdisplay = crtc->config->pipe_src_w;
-       cpp = drm_format_plane_cpp(fb->pixel_format, 0);
+       cpp = fb->format->cpp[0];
  
        line_time_us = max(htotal * 1000 / clock, 1);
        line_count = (latency_ns / line_time_us + 1000) / 1000;
  #define FW_WM_VLV(value, plane) \
        (((value) << DSPFW_ ## plane ## _SHIFT) & DSPFW_ ## plane ## _MASK_VLV)
  
 -static void vlv_write_wm_values(struct intel_crtc *crtc,
 +static void vlv_write_wm_values(struct drm_i915_private *dev_priv,
                                const struct vlv_wm_values *wm)
  {
 -      struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
 -      enum pipe pipe = crtc->pipe;
 +      enum pipe pipe;
  
 -      I915_WRITE(VLV_DDL(pipe),
 -                 (wm->ddl[pipe].cursor << DDL_CURSOR_SHIFT) |
 -                 (wm->ddl[pipe].sprite[1] << DDL_SPRITE_SHIFT(1)) |
 -                 (wm->ddl[pipe].sprite[0] << DDL_SPRITE_SHIFT(0)) |
 -                 (wm->ddl[pipe].primary << DDL_PLANE_SHIFT));
 +      for_each_pipe(dev_priv, pipe) {
 +              I915_WRITE(VLV_DDL(pipe),
 +                         (wm->ddl[pipe].plane[PLANE_CURSOR] << DDL_CURSOR_SHIFT) |
 +                         (wm->ddl[pipe].plane[PLANE_SPRITE1] << DDL_SPRITE_SHIFT(1)) |
 +                         (wm->ddl[pipe].plane[PLANE_SPRITE0] << DDL_SPRITE_SHIFT(0)) |
 +                         (wm->ddl[pipe].plane[PLANE_PRIMARY] << DDL_PLANE_SHIFT));
 +      }
 +
 +      /*
 +       * Zero the (unused) WM1 watermarks, and also clear all the
 +       * high order bits so that there are no out of bounds values
 +       * present in the registers during the reprogramming.
 +       */
 +      I915_WRITE(DSPHOWM, 0);
 +      I915_WRITE(DSPHOWM1, 0);
 +      I915_WRITE(DSPFW4, 0);
 +      I915_WRITE(DSPFW5, 0);
 +      I915_WRITE(DSPFW6, 0);
  
        I915_WRITE(DSPFW1,
                   FW_WM(wm->sr.plane, SR) |
 -                 FW_WM(wm->pipe[PIPE_B].cursor, CURSORB) |
 -                 FW_WM_VLV(wm->pipe[PIPE_B].primary, PLANEB) |
 -                 FW_WM_VLV(wm->pipe[PIPE_A].primary, PLANEA));
 +                 FW_WM(wm->pipe[PIPE_B].plane[PLANE_CURSOR], CURSORB) |
 +                 FW_WM_VLV(wm->pipe[PIPE_B].plane[PLANE_PRIMARY], PLANEB) |
 +                 FW_WM_VLV(wm->pipe[PIPE_A].plane[PLANE_PRIMARY], PLANEA));
        I915_WRITE(DSPFW2,
 -                 FW_WM_VLV(wm->pipe[PIPE_A].sprite[1], SPRITEB) |
 -                 FW_WM(wm->pipe[PIPE_A].cursor, CURSORA) |
 -                 FW_WM_VLV(wm->pipe[PIPE_A].sprite[0], SPRITEA));
 +                 FW_WM_VLV(wm->pipe[PIPE_A].plane[PLANE_SPRITE1], SPRITEB) |
 +                 FW_WM(wm->pipe[PIPE_A].plane[PLANE_CURSOR], CURSORA) |
 +                 FW_WM_VLV(wm->pipe[PIPE_A].plane[PLANE_SPRITE0], SPRITEA));
        I915_WRITE(DSPFW3,
                   FW_WM(wm->sr.cursor, CURSOR_SR));
  
        if (IS_CHERRYVIEW(dev_priv)) {
                I915_WRITE(DSPFW7_CHV,
 -                         FW_WM_VLV(wm->pipe[PIPE_B].sprite[1], SPRITED) |
 -                         FW_WM_VLV(wm->pipe[PIPE_B].sprite[0], SPRITEC));
 +                         FW_WM_VLV(wm->pipe[PIPE_B].plane[PLANE_SPRITE1], SPRITED) |
 +                         FW_WM_VLV(wm->pipe[PIPE_B].plane[PLANE_SPRITE0], SPRITEC));
                I915_WRITE(DSPFW8_CHV,
 -                         FW_WM_VLV(wm->pipe[PIPE_C].sprite[1], SPRITEF) |
 -                         FW_WM_VLV(wm->pipe[PIPE_C].sprite[0], SPRITEE));
 +                         FW_WM_VLV(wm->pipe[PIPE_C].plane[PLANE_SPRITE1], SPRITEF) |
 +                         FW_WM_VLV(wm->pipe[PIPE_C].plane[PLANE_SPRITE0], SPRITEE));
                I915_WRITE(DSPFW9_CHV,
 -                         FW_WM_VLV(wm->pipe[PIPE_C].primary, PLANEC) |
 -                         FW_WM(wm->pipe[PIPE_C].cursor, CURSORC));
 +                         FW_WM_VLV(wm->pipe[PIPE_C].plane[PLANE_PRIMARY], PLANEC) |
 +                         FW_WM(wm->pipe[PIPE_C].plane[PLANE_CURSOR], CURSORC));
                I915_WRITE(DSPHOWM,
                           FW_WM(wm->sr.plane >> 9, SR_HI) |
 -                         FW_WM(wm->pipe[PIPE_C].sprite[1] >> 8, SPRITEF_HI) |
 -                         FW_WM(wm->pipe[PIPE_C].sprite[0] >> 8, SPRITEE_HI) |
 -                         FW_WM(wm->pipe[PIPE_C].primary >> 8, PLANEC_HI) |
 -                         FW_WM(wm->pipe[PIPE_B].sprite[1] >> 8, SPRITED_HI) |
 -                         FW_WM(wm->pipe[PIPE_B].sprite[0] >> 8, SPRITEC_HI) |
 -                         FW_WM(wm->pipe[PIPE_B].primary >> 8, PLANEB_HI) |
 -                         FW_WM(wm->pipe[PIPE_A].sprite[1] >> 8, SPRITEB_HI) |
 -                         FW_WM(wm->pipe[PIPE_A].sprite[0] >> 8, SPRITEA_HI) |
 -                         FW_WM(wm->pipe[PIPE_A].primary >> 8, PLANEA_HI));
 +                         FW_WM(wm->pipe[PIPE_C].plane[PLANE_SPRITE1] >> 8, SPRITEF_HI) |
 +                         FW_WM(wm->pipe[PIPE_C].plane[PLANE_SPRITE0] >> 8, SPRITEE_HI) |
 +                         FW_WM(wm->pipe[PIPE_C].plane[PLANE_PRIMARY] >> 8, PLANEC_HI) |
 +                         FW_WM(wm->pipe[PIPE_B].plane[PLANE_SPRITE1] >> 8, SPRITED_HI) |
 +                         FW_WM(wm->pipe[PIPE_B].plane[PLANE_SPRITE0] >> 8, SPRITEC_HI) |
 +                         FW_WM(wm->pipe[PIPE_B].plane[PLANE_PRIMARY] >> 8, PLANEB_HI) |
 +                         FW_WM(wm->pipe[PIPE_A].plane[PLANE_SPRITE1] >> 8, SPRITEB_HI) |
 +                         FW_WM(wm->pipe[PIPE_A].plane[PLANE_SPRITE0] >> 8, SPRITEA_HI) |
 +                         FW_WM(wm->pipe[PIPE_A].plane[PLANE_PRIMARY] >> 8, PLANEA_HI));
        } else {
                I915_WRITE(DSPFW7,
 -                         FW_WM_VLV(wm->pipe[PIPE_B].sprite[1], SPRITED) |
 -                         FW_WM_VLV(wm->pipe[PIPE_B].sprite[0], SPRITEC));
 +                         FW_WM_VLV(wm->pipe[PIPE_B].plane[PLANE_SPRITE1], SPRITED) |
 +                         FW_WM_VLV(wm->pipe[PIPE_B].plane[PLANE_SPRITE0], SPRITEC));
                I915_WRITE(DSPHOWM,
                           FW_WM(wm->sr.plane >> 9, SR_HI) |
 -                         FW_WM(wm->pipe[PIPE_B].sprite[1] >> 8, SPRITED_HI) |
 -                         FW_WM(wm->pipe[PIPE_B].sprite[0] >> 8, SPRITEC_HI) |
 -                         FW_WM(wm->pipe[PIPE_B].primary >> 8, PLANEB_HI) |
 -                         FW_WM(wm->pipe[PIPE_A].sprite[1] >> 8, SPRITEB_HI) |
 -                         FW_WM(wm->pipe[PIPE_A].sprite[0] >> 8, SPRITEA_HI) |
 -                         FW_WM(wm->pipe[PIPE_A].primary >> 8, PLANEA_HI));
 +                         FW_WM(wm->pipe[PIPE_B].plane[PLANE_SPRITE1] >> 8, SPRITED_HI) |
 +                         FW_WM(wm->pipe[PIPE_B].plane[PLANE_SPRITE0] >> 8, SPRITEC_HI) |
 +                         FW_WM(wm->pipe[PIPE_B].plane[PLANE_PRIMARY] >> 8, PLANEB_HI) |
 +                         FW_WM(wm->pipe[PIPE_A].plane[PLANE_SPRITE1] >> 8, SPRITEB_HI) |
 +                         FW_WM(wm->pipe[PIPE_A].plane[PLANE_SPRITE0] >> 8, SPRITEA_HI) |
 +                         FW_WM(wm->pipe[PIPE_A].plane[PLANE_PRIMARY] >> 8, PLANEA_HI));
        }
  
 -      /* zero (unused) WM1 watermarks */
 -      I915_WRITE(DSPFW4, 0);
 -      I915_WRITE(DSPFW5, 0);
 -      I915_WRITE(DSPFW6, 0);
 -      I915_WRITE(DSPHOWM1, 0);
 -
        POSTING_READ(DSPFW1);
  }
  
@@@ -978,26 -949,24 +978,26 @@@ static void vlv_setup_wm_latency(struc
        }
  }
  
 -static uint16_t vlv_compute_wm_level(struct intel_plane *plane,
 -                                   struct intel_crtc *crtc,
 -                                   const struct intel_plane_state *state,
 +static uint16_t vlv_compute_wm_level(const struct intel_crtc_state *crtc_state,
 +                                   const struct intel_plane_state *plane_state,
                                     int level)
  {
 +      struct intel_plane *plane = to_intel_plane(plane_state->base.plane);
        struct drm_i915_private *dev_priv = to_i915(plane->base.dev);
 +      const struct drm_display_mode *adjusted_mode =
 +              &crtc_state->base.adjusted_mode;
        int clock, htotal, cpp, width, wm;
  
        if (dev_priv->wm.pri_latency[level] == 0)
                return USHRT_MAX;
  
 -      if (!state->base.visible)
 +      if (!plane_state->base.visible)
                return 0;
  
-       cpp = drm_format_plane_cpp(plane_state->base.fb->pixel_format, 0);
 -      cpp = state->base.fb->format->cpp[0];
 -      clock = crtc->config->base.adjusted_mode.crtc_clock;
 -      htotal = crtc->config->base.adjusted_mode.crtc_htotal;
 -      width = crtc->config->pipe_src_w;
++      cpp = plane_state->base.fb->format->cpp[0];
 +      clock = adjusted_mode->crtc_clock;
 +      htotal = adjusted_mode->crtc_htotal;
 +      width = crtc_state->pipe_src_w;
        if (WARN_ON(htotal == 0))
                htotal = 1;
  
@@@ -1035,7 -1004,7 +1035,7 @@@ static void vlv_compute_fifo(struct int
  
                if (state->base.visible) {
                        wm_state->num_active_planes++;
-                       total_rate += drm_format_plane_cpp(state->base.fb->pixel_format, 0);
+                       total_rate += state->base.fb->format->cpp[0];
                }
        }
  
                        continue;
                }
  
-               rate = drm_format_plane_cpp(state->base.fb->pixel_format, 0);
+               rate = state->base.fb->format->cpp[0];
                plane->wm.fifo_size = fifo_size * rate / total_rate;
                fifo_left -= plane->wm.fifo_size;
        }
        WARN_ON(fifo_left != 0);
  }
  
 +static u16 vlv_invert_wm_value(u16 wm, u16 fifo_size)
 +{
 +      if (wm > fifo_size)
 +              return USHRT_MAX;
 +      else
 +              return fifo_size - wm;
 +}
 +
  static void vlv_invert_wms(struct intel_crtc *crtc)
  {
        struct vlv_wm_state *wm_state = &crtc->wm_state;
        int level;
  
        for (level = 0; level < wm_state->num_levels; level++) {
 -              struct drm_device *dev = crtc->base.dev;
 +              struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
                const int sr_fifo_size =
 -                      INTEL_INFO(to_i915(dev))->num_pipes * 512 - 1;
 +                      INTEL_INFO(dev_priv)->num_pipes * 512 - 1;
                struct intel_plane *plane;
  
 -              wm_state->sr[level].plane = sr_fifo_size - wm_state->sr[level].plane;
 -              wm_state->sr[level].cursor = 63 - wm_state->sr[level].cursor;
 -
 -              for_each_intel_plane_on_crtc(dev, crtc, plane) {
 -                      switch (plane->base.type) {
 -                              int sprite;
 -                      case DRM_PLANE_TYPE_CURSOR:
 -                              wm_state->wm[level].cursor = plane->wm.fifo_size -
 -                                      wm_state->wm[level].cursor;
 -                              break;
 -                      case DRM_PLANE_TYPE_PRIMARY:
 -                              wm_state->wm[level].primary = plane->wm.fifo_size -
 -                                      wm_state->wm[level].primary;
 -                              break;
 -                      case DRM_PLANE_TYPE_OVERLAY:
 -                              sprite = plane->plane;
 -                              wm_state->wm[level].sprite[sprite] = plane->wm.fifo_size -
 -                                      wm_state->wm[level].sprite[sprite];
 -                              break;
 -                      }
 +              wm_state->sr[level].plane =
 +                      vlv_invert_wm_value(wm_state->sr[level].plane,
 +                                          sr_fifo_size);
 +              wm_state->sr[level].cursor =
 +                      vlv_invert_wm_value(wm_state->sr[level].cursor,
 +                                          63);
 +
 +              for_each_intel_plane_on_crtc(&dev_priv->drm, crtc, plane) {
 +                      wm_state->wm[level].plane[plane->id] =
 +                              vlv_invert_wm_value(wm_state->wm[level].plane[plane->id],
 +                                                  plane->wm.fifo_size);
                }
        }
  }
  
  static void vlv_compute_wm(struct intel_crtc *crtc)
  {
 -      struct drm_device *dev = crtc->base.dev;
 -      struct drm_i915_private *dev_priv = to_i915(dev);
 +      struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
        struct vlv_wm_state *wm_state = &crtc->wm_state;
        struct intel_plane *plane;
 -      int sr_fifo_size = INTEL_INFO(dev_priv)->num_pipes * 512 - 1;
        int level;
  
        memset(wm_state, 0, sizeof(*wm_state));
        if (wm_state->num_active_planes != 1)
                wm_state->cxsr = false;
  
 -      if (wm_state->cxsr) {
 -              for (level = 0; level < wm_state->num_levels; level++) {
 -                      wm_state->sr[level].plane = sr_fifo_size;
 -                      wm_state->sr[level].cursor = 63;
 -              }
 -      }
 -
 -      for_each_intel_plane_on_crtc(dev, crtc, plane) {
 +      for_each_intel_plane_on_crtc(&dev_priv->drm, crtc, plane) {
                struct intel_plane_state *state =
                        to_intel_plane_state(plane->base.state);
 +              int level;
  
                if (!state->base.visible)
                        continue;
  
                /* normal watermarks */
                for (level = 0; level < wm_state->num_levels; level++) {
 -                      int wm = vlv_compute_wm_level(plane, crtc, state, level);
 -                      int max_wm = plane->base.type == DRM_PLANE_TYPE_CURSOR ? 63 : 511;
 +                      int wm = vlv_compute_wm_level(crtc->config, state, level);
 +                      int max_wm = plane->wm.fifo_size;
  
                        /* hack */
                        if (WARN_ON(level == 0 && wm > max_wm))
                                wm = max_wm;
  
 -                      if (wm > plane->wm.fifo_size)
 +                      if (wm > max_wm)
                                break;
  
 -                      switch (plane->base.type) {
 -                              int sprite;
 -                      case DRM_PLANE_TYPE_CURSOR:
 -                              wm_state->wm[level].cursor = wm;
 -                              break;
 -                      case DRM_PLANE_TYPE_PRIMARY:
 -                              wm_state->wm[level].primary = wm;
 -                              break;
 -                      case DRM_PLANE_TYPE_OVERLAY:
 -                              sprite = plane->plane;
 -                              wm_state->wm[level].sprite[sprite] = wm;
 -                              break;
 -                      }
 +                      wm_state->wm[level].plane[plane->id] = wm;
                }
  
                wm_state->num_levels = level;
                        continue;
  
                /* maxfifo watermarks */
 -              switch (plane->base.type) {
 -                      int sprite, level;
 -              case DRM_PLANE_TYPE_CURSOR:
 +              if (plane->id == PLANE_CURSOR) {
                        for (level = 0; level < wm_state->num_levels; level++)
                                wm_state->sr[level].cursor =
 -                                      wm_state->wm[level].cursor;
 -                      break;
 -              case DRM_PLANE_TYPE_PRIMARY:
 -                      for (level = 0; level < wm_state->num_levels; level++)
 -                              wm_state->sr[level].plane =
 -                                      min(wm_state->sr[level].plane,
 -                                          wm_state->wm[level].primary);
 -                      break;
 -              case DRM_PLANE_TYPE_OVERLAY:
 -                      sprite = plane->plane;
 +                                      wm_state->wm[level].plane[PLANE_CURSOR];
 +              } else {
                        for (level = 0; level < wm_state->num_levels; level++)
                                wm_state->sr[level].plane =
 -                                      min(wm_state->sr[level].plane,
 -                                          wm_state->wm[level].sprite[sprite]);
 -                      break;
 +                                      max(wm_state->sr[level].plane,
 +                                          wm_state->wm[level].plane[plane->id]);
                }
        }
  
@@@ -1198,23 -1199,17 +1198,23 @@@ static void vlv_pipe_set_fifo_size(stru
        int sprite0_start = 0, sprite1_start = 0, fifo_size = 0;
  
        for_each_intel_plane_on_crtc(dev, crtc, plane) {
 -              if (plane->base.type == DRM_PLANE_TYPE_CURSOR) {
 -                      WARN_ON(plane->wm.fifo_size != 63);
 -                      continue;
 -              }
 -
 -              if (plane->base.type == DRM_PLANE_TYPE_PRIMARY)
 +              switch (plane->id) {
 +              case PLANE_PRIMARY:
                        sprite0_start = plane->wm.fifo_size;
 -              else if (plane->plane == 0)
 +                      break;
 +              case PLANE_SPRITE0:
                        sprite1_start = sprite0_start + plane->wm.fifo_size;
 -              else
 +                      break;
 +              case PLANE_SPRITE1:
                        fifo_size = sprite1_start + plane->wm.fifo_size;
 +                      break;
 +              case PLANE_CURSOR:
 +                      WARN_ON(plane->wm.fifo_size != 63);
 +                      break;
 +              default:
 +                      MISSING_CASE(plane->id);
 +                      break;
 +              }
        }
  
        WARN_ON(fifo_size != 512 - 1);
                      pipe_name(crtc->pipe), sprite0_start,
                      sprite1_start, fifo_size);
  
 +      spin_lock(&dev_priv->wm.dsparb_lock);
 +
        switch (crtc->pipe) {
                uint32_t dsparb, dsparb2, dsparb3;
        case PIPE_A:
        default:
                break;
        }
 +
 +      POSTING_READ(DSPARB);
 +
 +      spin_unlock(&dev_priv->wm.dsparb_lock);
  }
  
  #undef VLV_FIFO
  
 -static void vlv_merge_wm(struct drm_device *dev,
 +static void vlv_merge_wm(struct drm_i915_private *dev_priv,
                         struct vlv_wm_values *wm)
  {
        struct intel_crtc *crtc;
        int num_active_crtcs = 0;
  
 -      wm->level = to_i915(dev)->wm.max_level;
 +      wm->level = dev_priv->wm.max_level;
        wm->cxsr = true;
  
 -      for_each_intel_crtc(dev, crtc) {
 +      for_each_intel_crtc(&dev_priv->drm, crtc) {
                const struct vlv_wm_state *wm_state = &crtc->wm_state;
  
                if (!crtc->active)
        if (num_active_crtcs > 1)
                wm->level = VLV_WM_LEVEL_PM2;
  
 -      for_each_intel_crtc(dev, crtc) {
 +      for_each_intel_crtc(&dev_priv->drm, crtc) {
                struct vlv_wm_state *wm_state = &crtc->wm_state;
                enum pipe pipe = crtc->pipe;
  
                if (wm->cxsr)
                        wm->sr = wm_state->sr[wm->level];
  
 -              wm->ddl[pipe].primary = DDL_PRECISION_HIGH | 2;
 -              wm->ddl[pipe].sprite[0] = DDL_PRECISION_HIGH | 2;
 -              wm->ddl[pipe].sprite[1] = DDL_PRECISION_HIGH | 2;
 -              wm->ddl[pipe].cursor = DDL_PRECISION_HIGH | 2;
 +              wm->ddl[pipe].plane[PLANE_PRIMARY] = DDL_PRECISION_HIGH | 2;
 +              wm->ddl[pipe].plane[PLANE_SPRITE0] = DDL_PRECISION_HIGH | 2;
 +              wm->ddl[pipe].plane[PLANE_SPRITE1] = DDL_PRECISION_HIGH | 2;
 +              wm->ddl[pipe].plane[PLANE_CURSOR] = DDL_PRECISION_HIGH | 2;
        }
  }
  
 +static bool is_disabling(int old, int new, int threshold)
 +{
 +      return old >= threshold && new < threshold;
 +}
 +
 +static bool is_enabling(int old, int new, int threshold)
 +{
 +      return old < threshold && new >= threshold;
 +}
 +
  static void vlv_update_wm(struct intel_crtc *crtc)
  {
 -      struct drm_device *dev = crtc->base.dev;
 -      struct drm_i915_private *dev_priv = to_i915(dev);
 +      struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
        enum pipe pipe = crtc->pipe;
 -      struct vlv_wm_values wm = {};
 +      struct vlv_wm_values *old_wm = &dev_priv->wm.vlv;
 +      struct vlv_wm_values new_wm = {};
  
        vlv_compute_wm(crtc);
 -      vlv_merge_wm(dev, &wm);
 +      vlv_merge_wm(dev_priv, &new_wm);
  
 -      if (memcmp(&dev_priv->wm.vlv, &wm, sizeof(wm)) == 0) {
 +      if (memcmp(old_wm, &new_wm, sizeof(new_wm)) == 0) {
                /* FIXME should be part of crtc atomic commit */
                vlv_pipe_set_fifo_size(crtc);
 +
                return;
        }
  
 -      if (wm.level < VLV_WM_LEVEL_DDR_DVFS &&
 -          dev_priv->wm.vlv.level >= VLV_WM_LEVEL_DDR_DVFS)
 +      if (is_disabling(old_wm->level, new_wm.level, VLV_WM_LEVEL_DDR_DVFS))
                chv_set_memory_dvfs(dev_priv, false);
  
 -      if (wm.level < VLV_WM_LEVEL_PM5 &&
 -          dev_priv->wm.vlv.level >= VLV_WM_LEVEL_PM5)
 +      if (is_disabling(old_wm->level, new_wm.level, VLV_WM_LEVEL_PM5))
                chv_set_memory_pm5(dev_priv, false);
  
 -      if (!wm.cxsr && dev_priv->wm.vlv.cxsr)
 -              intel_set_memory_cxsr(dev_priv, false);
 +      if (is_disabling(old_wm->cxsr, new_wm.cxsr, true))
 +              _intel_set_memory_cxsr(dev_priv, false);
  
        /* FIXME should be part of crtc atomic commit */
        vlv_pipe_set_fifo_size(crtc);
  
 -      vlv_write_wm_values(crtc, &wm);
 +      vlv_write_wm_values(dev_priv, &new_wm);
  
        DRM_DEBUG_KMS("Setting FIFO watermarks - %c: plane=%d, cursor=%d, "
                      "sprite0=%d, sprite1=%d, SR: plane=%d, cursor=%d level=%d cxsr=%d\n",
 -                    pipe_name(pipe), wm.pipe[pipe].primary, wm.pipe[pipe].cursor,
 -                    wm.pipe[pipe].sprite[0], wm.pipe[pipe].sprite[1],
 -                    wm.sr.plane, wm.sr.cursor, wm.level, wm.cxsr);
 +                    pipe_name(pipe), new_wm.pipe[pipe].plane[PLANE_PRIMARY], new_wm.pipe[pipe].plane[PLANE_CURSOR],
 +                    new_wm.pipe[pipe].plane[PLANE_SPRITE0], new_wm.pipe[pipe].plane[PLANE_SPRITE1],
 +                    new_wm.sr.plane, new_wm.sr.cursor, new_wm.level, new_wm.cxsr);
  
 -      if (wm.cxsr && !dev_priv->wm.vlv.cxsr)
 -              intel_set_memory_cxsr(dev_priv, true);
 +      if (is_enabling(old_wm->cxsr, new_wm.cxsr, true))
 +              _intel_set_memory_cxsr(dev_priv, true);
  
 -      if (wm.level >= VLV_WM_LEVEL_PM5 &&
 -          dev_priv->wm.vlv.level < VLV_WM_LEVEL_PM5)
 +      if (is_enabling(old_wm->level, new_wm.level, VLV_WM_LEVEL_PM5))
                chv_set_memory_pm5(dev_priv, true);
  
 -      if (wm.level >= VLV_WM_LEVEL_DDR_DVFS &&
 -          dev_priv->wm.vlv.level < VLV_WM_LEVEL_DDR_DVFS)
 +      if (is_enabling(old_wm->level, new_wm.level, VLV_WM_LEVEL_DDR_DVFS))
                chv_set_memory_dvfs(dev_priv, true);
  
 -      dev_priv->wm.vlv = wm;
 +      *old_wm = new_wm;
  }
  
  #define single_plane_enabled(mask) is_power_of_2(mask)
@@@ -1473,7 -1455,7 +1473,7 @@@ static void i965_update_wm(struct intel
                int clock = adjusted_mode->crtc_clock;
                int htotal = adjusted_mode->crtc_htotal;
                int hdisplay = crtc->config->pipe_src_w;
-               int cpp = drm_format_plane_cpp(fb->pixel_format, 0);
+               int cpp = fb->format->cpp[0];
                unsigned long line_time_us;
                int entries;
  
@@@ -1559,7 -1541,7 +1559,7 @@@ static void i9xx_update_wm(struct intel
                if (IS_GEN2(dev_priv))
                        cpp = 4;
                else
-                       cpp = drm_format_plane_cpp(fb->pixel_format, 0);
+                       cpp = fb->format->cpp[0];
  
                planea_wm = intel_calculate_wm(adjusted_mode->crtc_clock,
                                               wm_info, fifo_size, cpp,
                if (IS_GEN2(dev_priv))
                        cpp = 4;
                else
-                       cpp = drm_format_plane_cpp(fb->pixel_format, 0);
+                       cpp = fb->format->cpp[0];
  
                planeb_wm = intel_calculate_wm(adjusted_mode->crtc_clock,
                                               wm_info, fifo_size, cpp,
                if (IS_I915GM(dev_priv) || IS_I945GM(dev_priv))
                        cpp = 4;
                else
-                       cpp = drm_format_plane_cpp(fb->pixel_format, 0);
+                       cpp = fb->format->cpp[0];
  
                line_time_us = max(htotal * 1000 / clock, 1);
  
@@@ -1799,13 -1781,14 +1799,14 @@@ static uint32_t ilk_compute_pri_wm(cons
                                   uint32_t mem_value,
                                   bool is_lp)
  {
-       int cpp = pstate->base.fb ?
-               drm_format_plane_cpp(pstate->base.fb->pixel_format, 0) : 0;
        uint32_t method1, method2;
+       int cpp;
  
        if (!cstate->base.active || !pstate->base.visible)
                return 0;
  
+       cpp = pstate->base.fb->format->cpp[0];
        method1 = ilk_wm_method1(ilk_pipe_pixel_rate(cstate), cpp, mem_value);
  
        if (!is_lp)
@@@ -1827,13 -1810,14 +1828,14 @@@ static uint32_t ilk_compute_spr_wm(cons
                                   const struct intel_plane_state *pstate,
                                   uint32_t mem_value)
  {
-       int cpp = pstate->base.fb ?
-               drm_format_plane_cpp(pstate->base.fb->pixel_format, 0) : 0;
        uint32_t method1, method2;
+       int cpp;
  
        if (!cstate->base.active || !pstate->base.visible)
                return 0;
  
+       cpp = pstate->base.fb->format->cpp[0];
        method1 = ilk_wm_method1(ilk_pipe_pixel_rate(cstate), cpp, mem_value);
        method2 = ilk_wm_method2(ilk_pipe_pixel_rate(cstate),
                                 cstate->base.adjusted_mode.crtc_htotal,
@@@ -1871,12 -1855,13 +1873,13 @@@ static uint32_t ilk_compute_fbc_wm(cons
                                   const struct intel_plane_state *pstate,
                                   uint32_t pri_val)
  {
-       int cpp = pstate->base.fb ?
-               drm_format_plane_cpp(pstate->base.fb->pixel_format, 0) : 0;
+       int cpp;
  
        if (!cstate->base.active || !pstate->base.visible)
                return 0;
  
+       cpp = pstate->base.fb->format->cpp[0];
        return ilk_wm_fbc(pri_val, drm_rect_width(&pstate->base.dst), cpp);
  }
  
@@@ -2885,6 -2870,28 +2888,6 @@@ bool ilk_disable_lp_wm(struct drm_devic
  #define SKL_SAGV_BLOCK_TIME   30 /* µs */
  
  /*
 - * Return the index of a plane in the SKL DDB and wm result arrays.  Primary
 - * plane is always in slot 0, cursor is always in slot I915_MAX_PLANES-1, and
 - * other universal planes are in indices 1..n.  Note that this may leave unused
 - * indices between the top "sprite" plane and the cursor.
 - */
 -static int
 -skl_wm_plane_id(const struct intel_plane *plane)
 -{
 -      switch (plane->base.type) {
 -      case DRM_PLANE_TYPE_PRIMARY:
 -              return 0;
 -      case DRM_PLANE_TYPE_CURSOR:
 -              return PLANE_CURSOR;
 -      case DRM_PLANE_TYPE_OVERLAY:
 -              return plane->plane + 1;
 -      default:
 -              MISSING_CASE(plane->base.type);
 -              return plane->plane;
 -      }
 -}
 -
 -/*
   * FIXME: We still don't have the proper code detect if we need to apply the WA,
   * so assume we'll always need it in order to avoid underruns.
   */
@@@ -2960,10 -2967,24 +2963,10 @@@ intel_enable_sagv(struct drm_i915_priva
        return 0;
  }
  
 -static int
 -intel_do_sagv_disable(struct drm_i915_private *dev_priv)
 -{
 -      int ret;
 -      uint32_t temp = GEN9_SAGV_DISABLE;
 -
 -      ret = sandybridge_pcode_read(dev_priv, GEN9_PCODE_SAGV_CONTROL,
 -                                   &temp);
 -      if (ret)
 -              return ret;
 -      else
 -              return temp & GEN9_SAGV_IS_DISABLED;
 -}
 -
  int
  intel_disable_sagv(struct drm_i915_private *dev_priv)
  {
 -      int ret, result;
 +      int ret;
  
        if (!intel_has_sagv(dev_priv))
                return 0;
        mutex_lock(&dev_priv->rps.hw_lock);
  
        /* bspec says to keep retrying for at least 1 ms */
 -      ret = wait_for(result = intel_do_sagv_disable(dev_priv), 1);
 +      ret = skl_pcode_request(dev_priv, GEN9_PCODE_SAGV_CONTROL,
 +                              GEN9_SAGV_DISABLE,
 +                              GEN9_SAGV_IS_DISABLED, GEN9_SAGV_IS_DISABLED,
 +                              1);
        mutex_unlock(&dev_priv->rps.hw_lock);
  
 -      if (ret == -ETIMEDOUT) {
 -              DRM_ERROR("Request to disable SAGV timed out\n");
 -              return -ETIMEDOUT;
 -      }
 -
        /*
         * Some skl systems, pre-release machines in particular,
         * don't actually have an SAGV.
         */
 -      if (IS_SKYLAKE(dev_priv) && result == -ENXIO) {
 +      if (IS_SKYLAKE(dev_priv) && ret == -ENXIO) {
                DRM_DEBUG_DRIVER("No SAGV found on system, ignoring\n");
                dev_priv->sagv_status = I915_SAGV_NOT_CONTROLLED;
                return 0;
 -      } else if (result < 0) {
 -              DRM_ERROR("Failed to disable the SAGV\n");
 -              return result;
 +      } else if (ret < 0) {
 +              DRM_ERROR("Failed to disable the SAGV (%d)\n", ret);
 +              return ret;
        }
  
        dev_priv->sagv_status = I915_SAGV_DISABLED;
@@@ -3006,6 -3029,7 +3009,6 @@@ bool intel_can_enable_sagv(struct drm_a
        struct intel_crtc *crtc;
        struct intel_plane *plane;
        struct intel_crtc_state *cstate;
 -      struct skl_plane_wm *wm;
        enum pipe pipe;
        int level, latency;
  
                return false;
  
        for_each_intel_plane_on_crtc(dev, crtc, plane) {
 -              wm = &cstate->wm.skl.optimal.planes[skl_wm_plane_id(plane)];
 +              struct skl_plane_wm *wm =
 +                      &cstate->wm.skl.optimal.planes[plane->id];
  
                /* Skip this plane if it's not enabled */
                if (!wm->wm[0].plane_en)
@@@ -3136,29 -3159,28 +3139,29 @@@ static void skl_ddb_entry_init_from_hw(
  void skl_ddb_get_hw_state(struct drm_i915_private *dev_priv,
                          struct skl_ddb_allocation *ddb /* out */)
  {
 -      enum pipe pipe;
 -      int plane;
 -      u32 val;
 +      struct intel_crtc *crtc;
  
        memset(ddb, 0, sizeof(*ddb));
  
 -      for_each_pipe(dev_priv, pipe) {
 +      for_each_intel_crtc(&dev_priv->drm, crtc) {
                enum intel_display_power_domain power_domain;
 +              enum plane_id plane_id;
 +              enum pipe pipe = crtc->pipe;
  
                power_domain = POWER_DOMAIN_PIPE(pipe);
                if (!intel_display_power_get_if_enabled(dev_priv, power_domain))
                        continue;
  
 -              for_each_universal_plane(dev_priv, pipe, plane) {
 -                      val = I915_READ(PLANE_BUF_CFG(pipe, plane));
 -                      skl_ddb_entry_init_from_hw(&ddb->plane[pipe][plane],
 -                                                 val);
 -              }
 +              for_each_plane_id_on_crtc(crtc, plane_id) {
 +                      u32 val;
  
 -              val = I915_READ(CUR_BUF_CFG(pipe));
 -              skl_ddb_entry_init_from_hw(&ddb->plane[pipe][PLANE_CURSOR],
 -                                         val);
 +                      if (plane_id != PLANE_CURSOR)
 +                              val = I915_READ(PLANE_BUF_CFG(pipe, plane_id));
 +                      else
 +                              val = I915_READ(CUR_BUF_CFG(pipe));
 +
 +                      skl_ddb_entry_init_from_hw(&ddb->plane[pipe][plane_id], val);
 +              }
  
                intel_display_power_put(dev_priv, power_domain);
        }
@@@ -3210,13 -3232,17 +3213,17 @@@ skl_plane_relative_data_rate(const stru
                             int y)
  {
        struct intel_plane_state *intel_pstate = to_intel_plane_state(pstate);
-       struct drm_framebuffer *fb = pstate->fb;
        uint32_t down_scale_amount, data_rate;
        uint32_t width = 0, height = 0;
-       unsigned format = fb ? fb->pixel_format : DRM_FORMAT_XRGB8888;
+       struct drm_framebuffer *fb;
+       u32 format;
  
        if (!intel_pstate->base.visible)
                return 0;
+       fb = pstate->fb;
+       format = fb->format->format;
        if (pstate->plane->type == DRM_PLANE_TYPE_CURSOR)
                return 0;
        if (y && format != DRM_FORMAT_NV12)
        if (format == DRM_FORMAT_NV12) {
                if (y)  /* y-plane data rate */
                        data_rate = width * height *
-                               drm_format_plane_cpp(format, 0);
+                               fb->format->cpp[0];
                else    /* uv-plane data rate */
                        data_rate = (width / 2) * (height / 2) *
-                               drm_format_plane_cpp(format, 1);
+                               fb->format->cpp[1];
        } else {
                /* for packed formats */
-               data_rate = width * height * drm_format_plane_cpp(format, 0);
+               data_rate = width * height * fb->format->cpp[0];
        }
  
        down_scale_amount = skl_plane_downscale_amount(intel_pstate);
@@@ -3259,28 -3285,30 +3266,28 @@@ skl_get_total_relative_data_rate(struc
        struct drm_crtc_state *cstate = &intel_cstate->base;
        struct drm_atomic_state *state = cstate->state;
        struct drm_plane *plane;
 -      const struct intel_plane *intel_plane;
        const struct drm_plane_state *pstate;
 -      unsigned int rate, total_data_rate = 0;
 -      int id;
 +      unsigned int total_data_rate = 0;
  
        if (WARN_ON(!state))
                return 0;
  
        /* Calculate and cache data rate for each plane */
        drm_atomic_crtc_state_for_each_plane_state(plane, pstate, cstate) {
 -              id = skl_wm_plane_id(to_intel_plane(plane));
 -              intel_plane = to_intel_plane(plane);
 +              enum plane_id plane_id = to_intel_plane(plane)->id;
 +              unsigned int rate;
  
                /* packed/uv */
                rate = skl_plane_relative_data_rate(intel_cstate,
                                                    pstate, 0);
 -              plane_data_rate[id] = rate;
 +              plane_data_rate[plane_id] = rate;
  
                total_data_rate += rate;
  
                /* y-plane */
                rate = skl_plane_relative_data_rate(intel_cstate,
                                                    pstate, 1);
 -              plane_y_data_rate[id] = rate;
 +              plane_y_data_rate[plane_id] = rate;
  
                total_data_rate += rate;
        }
@@@ -3302,7 -3330,7 +3309,7 @@@ skl_ddb_min_alloc(const struct drm_plan
                return 0;
  
        /* For packed formats, no y-plane, return 0 */
-       if (y && fb->pixel_format != DRM_FORMAT_NV12)
+       if (y && fb->format->format != DRM_FORMAT_NV12)
                return 0;
  
        /* For Non Y-tile return 8-blocks */
                swap(src_w, src_h);
  
        /* Halve UV plane width and height for NV12 */
-       if (fb->pixel_format == DRM_FORMAT_NV12 && !y) {
+       if (fb->format->format == DRM_FORMAT_NV12 && !y) {
                src_w /= 2;
                src_h /= 2;
        }
  
-       if (fb->pixel_format == DRM_FORMAT_NV12 && !y)
-               plane_bpp = drm_format_plane_cpp(fb->pixel_format, 1);
+       if (fb->format->format == DRM_FORMAT_NV12 && !y)
+               plane_bpp = fb->format->cpp[1];
        else
-               plane_bpp = drm_format_plane_cpp(fb->pixel_format, 0);
+               plane_bpp = fb->format->cpp[0];
  
        if (drm_rotation_90_or_270(pstate->rotation)) {
                switch (plane_bpp) {
@@@ -3359,16 -3387,17 +3366,16 @@@ skl_ddb_calc_min(const struct intel_crt
        struct drm_plane *plane;
  
        drm_atomic_crtc_state_for_each_plane_state(plane, pstate, &cstate->base) {
 -              struct intel_plane *intel_plane = to_intel_plane(plane);
 -              int id = skl_wm_plane_id(intel_plane);
 +              enum plane_id plane_id = to_intel_plane(plane)->id;
  
 -              if (id == PLANE_CURSOR)
 +              if (plane_id == PLANE_CURSOR)
                        continue;
  
                if (!pstate->visible)
                        continue;
  
 -              minimum[id] = skl_ddb_min_alloc(pstate, 0);
 -              y_minimum[id] = skl_ddb_min_alloc(pstate, 1);
 +              minimum[plane_id] = skl_ddb_min_alloc(pstate, 0);
 +              y_minimum[plane_id] = skl_ddb_min_alloc(pstate, 1);
        }
  
        minimum[PLANE_CURSOR] = skl_cursor_allocation(num_active);
@@@ -3388,8 -3417,8 +3395,8 @@@ skl_allocate_pipe_ddb(struct intel_crtc
        uint16_t minimum[I915_MAX_PLANES] = {};
        uint16_t y_minimum[I915_MAX_PLANES] = {};
        unsigned int total_data_rate;
 +      enum plane_id plane_id;
        int num_active;
 -      int id, i;
        unsigned plane_data_rate[I915_MAX_PLANES] = {};
        unsigned plane_y_data_rate[I915_MAX_PLANES] = {};
  
         * proportional to the data rate.
         */
  
 -      for (i = 0; i < I915_MAX_PLANES; i++) {
 -              alloc_size -= minimum[i];
 -              alloc_size -= y_minimum[i];
 +      for_each_plane_id_on_crtc(intel_crtc, plane_id) {
 +              alloc_size -= minimum[plane_id];
 +              alloc_size -= y_minimum[plane_id];
        }
  
        ddb->plane[pipe][PLANE_CURSOR].start = alloc->end - minimum[PLANE_CURSOR];
                return 0;
  
        start = alloc->start;
 -      for (id = 0; id < I915_MAX_PLANES; id++) {
 +      for_each_plane_id_on_crtc(intel_crtc, plane_id) {
                unsigned int data_rate, y_data_rate;
                uint16_t plane_blocks, y_plane_blocks = 0;
  
 -              if (id == PLANE_CURSOR)
 +              if (plane_id == PLANE_CURSOR)
                        continue;
  
 -              data_rate = plane_data_rate[id];
 +              data_rate = plane_data_rate[plane_id];
  
                /*
                 * allocation for (packed formats) or (uv-plane part of planar format):
                 * promote the expression to 64 bits to avoid overflowing, the
                 * result is < available as data_rate / total_data_rate < 1
                 */
 -              plane_blocks = minimum[id];
 +              plane_blocks = minimum[plane_id];
                plane_blocks += div_u64((uint64_t)alloc_size * data_rate,
                                        total_data_rate);
  
                /* Leave disabled planes at (0,0) */
                if (data_rate) {
 -                      ddb->plane[pipe][id].start = start;
 -                      ddb->plane[pipe][id].end = start + plane_blocks;
 +                      ddb->plane[pipe][plane_id].start = start;
 +                      ddb->plane[pipe][plane_id].end = start + plane_blocks;
                }
  
                start += plane_blocks;
                /*
                 * allocation for y_plane part of planar format:
                 */
 -              y_data_rate = plane_y_data_rate[id];
 +              y_data_rate = plane_y_data_rate[plane_id];
  
 -              y_plane_blocks = y_minimum[id];
 +              y_plane_blocks = y_minimum[plane_id];
                y_plane_blocks += div_u64((uint64_t)alloc_size * y_data_rate,
                                        total_data_rate);
  
                if (y_data_rate) {
 -                      ddb->y_plane[pipe][id].start = start;
 -                      ddb->y_plane[pipe][id].end = start + y_plane_blocks;
 +                      ddb->y_plane[pipe][plane_id].start = start;
 +                      ddb->y_plane[pipe][plane_id].end = start + y_plane_blocks;
                }
  
                start += y_plane_blocks;
   * should allow pixel_rate up to ~2 GHz which seems sufficient since max
   * 2xcdclk is 1350 MHz and the pixel rate should never exceed that.
  */
 -static uint32_t skl_wm_method1(uint32_t pixel_rate, uint8_t cpp, uint32_t latency)
 +static uint_fixed_16_16_t skl_wm_method1(uint32_t pixel_rate, uint8_t cpp,
 +                                       uint32_t latency)
  {
 -      uint32_t wm_intermediate_val, ret;
 +      uint32_t wm_intermediate_val;
 +      uint_fixed_16_16_t ret;
  
        if (latency == 0)
 -              return UINT_MAX;
 -
 -      wm_intermediate_val = latency * pixel_rate * cpp / 512;
 -      ret = DIV_ROUND_UP(wm_intermediate_val, 1000);
 +              return FP_16_16_MAX;
  
 +      wm_intermediate_val = latency * pixel_rate * cpp;
 +      ret = fixed_16_16_div_round_up_u64(wm_intermediate_val, 1000 * 512);
        return ret;
  }
  
 -static uint32_t skl_wm_method2(uint32_t pixel_rate, uint32_t pipe_htotal,
 -                             uint32_t latency, uint32_t plane_blocks_per_line)
 +static uint_fixed_16_16_t skl_wm_method2(uint32_t pixel_rate,
 +                      uint32_t pipe_htotal,
 +                      uint32_t latency,
 +                      uint_fixed_16_16_t plane_blocks_per_line)
  {
 -      uint32_t ret;
        uint32_t wm_intermediate_val;
 +      uint_fixed_16_16_t ret;
  
        if (latency == 0)
 -              return UINT_MAX;
 +              return FP_16_16_MAX;
  
        wm_intermediate_val = latency * pixel_rate;
 -      ret = DIV_ROUND_UP(wm_intermediate_val, pipe_htotal * 1000) *
 -                              plane_blocks_per_line;
 -
 +      wm_intermediate_val = DIV_ROUND_UP(wm_intermediate_val,
 +                                         pipe_htotal * 1000);
 +      ret = mul_u32_fixed_16_16(wm_intermediate_val, plane_blocks_per_line);
        return ret;
  }
  
@@@ -3561,36 -3587,24 +3568,36 @@@ static int skl_compute_plane_wm(const s
        struct drm_plane_state *pstate = &intel_pstate->base;
        struct drm_framebuffer *fb = pstate->fb;
        uint32_t latency = dev_priv->wm.skl_latency[level];
 -      uint32_t method1, method2;
 -      uint32_t plane_bytes_per_line, plane_blocks_per_line;
 +      uint_fixed_16_16_t method1, method2;
 +      uint_fixed_16_16_t plane_blocks_per_line;
 +      uint_fixed_16_16_t selected_result;
 +      uint32_t interm_pbpl;
 +      uint32_t plane_bytes_per_line;
        uint32_t res_blocks, res_lines;
 -      uint32_t selected_result;
        uint8_t cpp;
        uint32_t width = 0, height = 0;
        uint32_t plane_pixel_rate;
 -      uint32_t y_tile_minimum, y_min_scanlines;
 +      uint_fixed_16_16_t y_tile_minimum;
 +      uint32_t y_min_scanlines;
        struct intel_atomic_state *state =
                to_intel_atomic_state(cstate->base.state);
        bool apply_memory_bw_wa = skl_needs_memory_bw_wa(state);
 +      bool y_tiled, x_tiled;
  
        if (latency == 0 || !cstate->base.active || !intel_pstate->base.visible) {
                *enabled = false;
                return 0;
        }
  
 -      if (apply_memory_bw_wa && fb->modifier == I915_FORMAT_MOD_X_TILED)
 +      y_tiled = fb->modifier == I915_FORMAT_MOD_Y_TILED ||
 +                fb->modifier == I915_FORMAT_MOD_Yf_TILED;
 +      x_tiled = fb->modifier == I915_FORMAT_MOD_X_TILED;
 +
 +      /* Display WA #1141: kbl. */
 +      if (IS_KABYLAKE(dev_priv) && dev_priv->ipc_enabled)
 +              latency += 4;
 +
 +      if (apply_memory_bw_wa && x_tiled)
                latency += 15;
  
        width = drm_rect_width(&intel_pstate->base.src) >> 16;
        if (drm_rotation_90_or_270(pstate->rotation))
                swap(width, height);
  
-       cpp = drm_format_plane_cpp(fb->pixel_format, 0);
+       cpp = fb->format->cpp[0];
        plane_pixel_rate = skl_adjusted_plane_pixel_rate(cstate, intel_pstate);
  
        if (drm_rotation_90_or_270(pstate->rotation)) {
-               int cpp = (fb->pixel_format == DRM_FORMAT_NV12) ?
-                       drm_format_plane_cpp(fb->pixel_format, 1) :
-                       drm_format_plane_cpp(fb->pixel_format, 0);
+               int cpp = (fb->format->format == DRM_FORMAT_NV12) ?
+                       fb->format->cpp[1] :
+                       fb->format->cpp[0];
  
                switch (cpp) {
                case 1:
                y_min_scanlines *= 2;
  
        plane_bytes_per_line = width * cpp;
 -      if (fb->modifier == I915_FORMAT_MOD_Y_TILED ||
 -          fb->modifier == I915_FORMAT_MOD_Yf_TILED) {
 +      if (y_tiled) {
 +              interm_pbpl = DIV_ROUND_UP(plane_bytes_per_line *
 +                                         y_min_scanlines, 512);
                plane_blocks_per_line =
 -                    DIV_ROUND_UP(plane_bytes_per_line * y_min_scanlines, 512);
 -              plane_blocks_per_line /= y_min_scanlines;
 -      } else if (fb->modifier == DRM_FORMAT_MOD_NONE) {
 -              plane_blocks_per_line = DIV_ROUND_UP(plane_bytes_per_line, 512)
 -                                      + 1;
 +                    fixed_16_16_div_round_up(interm_pbpl, y_min_scanlines);
 +      } else if (x_tiled) {
 +              interm_pbpl = DIV_ROUND_UP(plane_bytes_per_line, 512);
 +              plane_blocks_per_line = u32_to_fixed_16_16(interm_pbpl);
        } else {
 -              plane_blocks_per_line = DIV_ROUND_UP(plane_bytes_per_line, 512);
 +              interm_pbpl = DIV_ROUND_UP(plane_bytes_per_line, 512) + 1;
 +              plane_blocks_per_line = u32_to_fixed_16_16(interm_pbpl);
        }
  
        method1 = skl_wm_method1(plane_pixel_rate, cpp, latency);
                                 latency,
                                 plane_blocks_per_line);
  
 -      y_tile_minimum = plane_blocks_per_line * y_min_scanlines;
 +      y_tile_minimum = mul_u32_fixed_16_16(y_min_scanlines,
 +                                           plane_blocks_per_line);
  
 -      if (fb->modifier == I915_FORMAT_MOD_Y_TILED ||
 -          fb->modifier == I915_FORMAT_MOD_Yf_TILED) {
 -              selected_result = max(method2, y_tile_minimum);
 +      if (y_tiled) {
 +              selected_result = max_fixed_16_16(method2, y_tile_minimum);
        } else {
                if ((cpp * cstate->base.adjusted_mode.crtc_htotal / 512 < 1) &&
                    (plane_bytes_per_line / 512 < 1))
                        selected_result = method2;
 -              else if ((ddb_allocation / plane_blocks_per_line) >= 1)
 -                      selected_result = min(method1, method2);
 +              else if ((ddb_allocation /
 +                      fixed_16_16_to_u32_round_up(plane_blocks_per_line)) >= 1)
 +                      selected_result = min_fixed_16_16(method1, method2);
                else
                        selected_result = method1;
        }
  
 -      res_blocks = selected_result + 1;
 -      res_lines = DIV_ROUND_UP(selected_result, plane_blocks_per_line);
 +      res_blocks = fixed_16_16_to_u32_round_up(selected_result) + 1;
 +      res_lines = DIV_ROUND_UP(selected_result.val,
 +                               plane_blocks_per_line.val);
  
        if (level >= 1 && level <= 7) {
 -              if (fb->modifier == I915_FORMAT_MOD_Y_TILED ||
 -                  fb->modifier == I915_FORMAT_MOD_Yf_TILED) {
 -                      res_blocks += y_tile_minimum;
 +              if (y_tiled) {
 +                      res_blocks += fixed_16_16_to_u32_round_up(y_tile_minimum);
                        res_lines += y_min_scanlines;
                } else {
                        res_blocks++;
                if (level) {
                        return 0;
                } else {
 +                      struct drm_plane *plane = pstate->plane;
 +
                        DRM_DEBUG_KMS("Requested display configuration exceeds system watermark limitations\n");
 -                      DRM_DEBUG_KMS("Plane %d.%d: blocks required = %u/%u, lines required = %u/31\n",
 -                                    to_intel_crtc(cstate->base.crtc)->pipe,
 -                                    skl_wm_plane_id(to_intel_plane(pstate->plane)),
 +                      DRM_DEBUG_KMS("[PLANE:%d:%s] blocks required = %u/%u, lines required = %u/31\n",
 +                                    plane->base.id, plane->name,
                                      res_blocks, ddb_allocation, res_lines);
 -
                        return -EINVAL;
                }
        }
@@@ -3719,6 -3731,7 +3726,6 @@@ skl_compute_wm_level(const struct drm_i
        uint16_t ddb_blocks;
        enum pipe pipe = intel_crtc->pipe;
        int ret;
 -      int i = skl_wm_plane_id(intel_plane);
  
        if (state)
                intel_pstate =
  
        WARN_ON(!intel_pstate->base.fb);
  
 -      ddb_blocks = skl_ddb_entry_size(&ddb->plane[pipe][i]);
 +      ddb_blocks = skl_ddb_entry_size(&ddb->plane[pipe][intel_plane->id]);
  
        ret = skl_compute_plane_wm(dev_priv,
                                   cstate,
  static uint32_t
  skl_compute_linetime_wm(struct intel_crtc_state *cstate)
  {
 +      struct drm_atomic_state *state = cstate->base.state;
 +      struct drm_i915_private *dev_priv = to_i915(state->dev);
        uint32_t pixel_rate;
 +      uint32_t linetime_wm;
  
        if (!cstate->base.active)
                return 0;
        if (WARN_ON(pixel_rate == 0))
                return 0;
  
 -      return DIV_ROUND_UP(8 * cstate->base.adjusted_mode.crtc_htotal * 1000,
 -                          pixel_rate);
 +      linetime_wm = DIV_ROUND_UP(8 * cstate->base.adjusted_mode.crtc_htotal *
 +                                 1000, pixel_rate);
 +
 +      /* Display WA #1135: bxt. */
 +      if (IS_BROXTON(dev_priv) && dev_priv->ipc_enabled)
 +              linetime_wm = DIV_ROUND_UP(linetime_wm, 2);
 +
 +      return linetime_wm;
  }
  
  static void skl_compute_transition_wm(struct intel_crtc_state *cstate,
@@@ -3813,7 -3817,7 +3820,7 @@@ static int skl_build_pipe_wm(struct int
        for_each_intel_plane_mask(&dev_priv->drm,
                                  intel_plane,
                                  cstate->base.plane_mask) {
 -              wm = &pipe_wm->planes[skl_wm_plane_id(intel_plane)];
 +              wm = &pipe_wm->planes[intel_plane->id];
  
                for (level = 0; level <= max_level; level++) {
                        ret = skl_compute_wm_level(dev_priv, ddb, cstate,
@@@ -3857,7 -3861,7 +3864,7 @@@ static void skl_write_wm_level(struct d
  static void skl_write_plane_wm(struct intel_crtc *intel_crtc,
                               const struct skl_plane_wm *wm,
                               const struct skl_ddb_allocation *ddb,
 -                             int plane)
 +                             enum plane_id plane_id)
  {
        struct drm_crtc *crtc = &intel_crtc->base;
        struct drm_device *dev = crtc->dev;
        enum pipe pipe = intel_crtc->pipe;
  
        for (level = 0; level <= max_level; level++) {
 -              skl_write_wm_level(dev_priv, PLANE_WM(pipe, plane, level),
 +              skl_write_wm_level(dev_priv, PLANE_WM(pipe, plane_id, level),
                                   &wm->wm[level]);
        }
 -      skl_write_wm_level(dev_priv, PLANE_WM_TRANS(pipe, plane),
 +      skl_write_wm_level(dev_priv, PLANE_WM_TRANS(pipe, plane_id),
                           &wm->trans_wm);
  
 -      skl_ddb_entry_write(dev_priv, PLANE_BUF_CFG(pipe, plane),
 -                          &ddb->plane[pipe][plane]);
 -      skl_ddb_entry_write(dev_priv, PLANE_NV12_BUF_CFG(pipe, plane),
 -                          &ddb->y_plane[pipe][plane]);
 +      skl_ddb_entry_write(dev_priv, PLANE_BUF_CFG(pipe, plane_id),
 +                          &ddb->plane[pipe][plane_id]);
 +      skl_ddb_entry_write(dev_priv, PLANE_NV12_BUF_CFG(pipe, plane_id),
 +                          &ddb->y_plane[pipe][plane_id]);
  }
  
  static void skl_write_cursor_wm(struct intel_crtc *intel_crtc,
@@@ -3980,16 -3984,17 +3987,16 @@@ skl_ddb_add_affected_planes(struct inte
        struct drm_plane_state *plane_state;
        struct drm_plane *plane;
        enum pipe pipe = intel_crtc->pipe;
 -      int id;
  
        WARN_ON(!drm_atomic_get_existing_crtc_state(state, crtc));
  
        drm_for_each_plane_mask(plane, dev, cstate->base.plane_mask) {
 -              id = skl_wm_plane_id(to_intel_plane(plane));
 +              enum plane_id plane_id = to_intel_plane(plane)->id;
  
 -              if (skl_ddb_entry_equal(&cur_ddb->plane[pipe][id],
 -                                      &new_ddb->plane[pipe][id]) &&
 -                  skl_ddb_entry_equal(&cur_ddb->y_plane[pipe][id],
 -                                      &new_ddb->y_plane[pipe][id]))
 +              if (skl_ddb_entry_equal(&cur_ddb->plane[pipe][plane_id],
 +                                      &new_ddb->plane[pipe][plane_id]) &&
 +                  skl_ddb_entry_equal(&cur_ddb->y_plane[pipe][plane_id],
 +                                      &new_ddb->y_plane[pipe][plane_id]))
                        continue;
  
                plane_state = drm_atomic_get_plane_state(state, plane);
@@@ -4101,6 -4106,7 +4108,6 @@@ skl_print_wm_changes(const struct drm_a
        const struct intel_plane *intel_plane;
        const struct skl_ddb_allocation *old_ddb = &dev_priv->wm.skl_hw.ddb;
        const struct skl_ddb_allocation *new_ddb = &intel_state->wm_results.ddb;
 -      int id;
        int i;
  
        for_each_crtc_in_state(state, crtc, cstate, i) {
                enum pipe pipe = intel_crtc->pipe;
  
                for_each_intel_plane_on_crtc(dev, intel_crtc, intel_plane) {
 +                      enum plane_id plane_id = intel_plane->id;
                        const struct skl_ddb_entry *old, *new;
  
 -                      id = skl_wm_plane_id(intel_plane);
 -                      old = &old_ddb->plane[pipe][id];
 -                      new = &new_ddb->plane[pipe][id];
 +                      old = &old_ddb->plane[pipe][plane_id];
 +                      new = &new_ddb->plane[pipe][plane_id];
  
                        if (skl_ddb_entry_equal(old, new))
                                continue;
@@@ -4202,21 -4208,17 +4209,21 @@@ static void skl_atomic_update_crtc_wm(s
        struct skl_pipe_wm *pipe_wm = &cstate->wm.skl.optimal;
        const struct skl_ddb_allocation *ddb = &state->wm_results.ddb;
        enum pipe pipe = crtc->pipe;
 -      int plane;
 +      enum plane_id plane_id;
  
        if (!(state->wm_results.dirty_pipes & drm_crtc_mask(&crtc->base)))
                return;
  
        I915_WRITE(PIPE_WM_LINETIME(pipe), pipe_wm->linetime);
  
 -      for_each_universal_plane(dev_priv, pipe, plane)
 -              skl_write_plane_wm(crtc, &pipe_wm->planes[plane], ddb, plane);
 -
 -      skl_write_cursor_wm(crtc, &pipe_wm->planes[PLANE_CURSOR], ddb);
 +      for_each_plane_id_on_crtc(crtc, plane_id) {
 +              if (plane_id != PLANE_CURSOR)
 +                      skl_write_plane_wm(crtc, &pipe_wm->planes[plane_id],
 +                                         ddb, plane_id);
 +              else
 +                      skl_write_cursor_wm(crtc, &pipe_wm->planes[plane_id],
 +                                          ddb);
 +      }
  }
  
  static void skl_initial_wm(struct intel_atomic_state *state,
@@@ -4331,29 -4333,32 +4338,29 @@@ static inline void skl_wm_level_from_re
  void skl_pipe_wm_get_hw_state(struct drm_crtc *crtc,
                              struct skl_pipe_wm *out)
  {
 -      struct drm_device *dev = crtc->dev;
 -      struct drm_i915_private *dev_priv = to_i915(dev);
 +      struct drm_i915_private *dev_priv = to_i915(crtc->dev);
        struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
 -      struct intel_plane *intel_plane;
 -      struct skl_plane_wm *wm;
        enum pipe pipe = intel_crtc->pipe;
 -      int level, id, max_level;
 +      int level, max_level;
 +      enum plane_id plane_id;
        uint32_t val;
  
        max_level = ilk_wm_max_level(dev_priv);
  
 -      for_each_intel_plane_on_crtc(dev, intel_crtc, intel_plane) {
 -              id = skl_wm_plane_id(intel_plane);
 -              wm = &out->planes[id];
 +      for_each_plane_id_on_crtc(intel_crtc, plane_id) {
 +              struct skl_plane_wm *wm = &out->planes[plane_id];
  
                for (level = 0; level <= max_level; level++) {
 -                      if (id != PLANE_CURSOR)
 -                              val = I915_READ(PLANE_WM(pipe, id, level));
 +                      if (plane_id != PLANE_CURSOR)
 +                              val = I915_READ(PLANE_WM(pipe, plane_id, level));
                        else
                                val = I915_READ(CUR_WM(pipe, level));
  
                        skl_wm_level_from_reg_val(val, &wm->wm[level]);
                }
  
 -              if (id != PLANE_CURSOR)
 -                      val = I915_READ(PLANE_WM_TRANS(pipe, id));
 +              if (plane_id != PLANE_CURSOR)
 +                      val = I915_READ(PLANE_WM_TRANS(pipe, plane_id));
                else
                        val = I915_READ(CUR_WM_TRANS(pipe));
  
@@@ -4461,67 -4466,67 +4468,67 @@@ static void vlv_read_wm_values(struct d
        for_each_pipe(dev_priv, pipe) {
                tmp = I915_READ(VLV_DDL(pipe));
  
 -              wm->ddl[pipe].primary =
 +              wm->ddl[pipe].plane[PLANE_PRIMARY] =
                        (tmp >> DDL_PLANE_SHIFT) & (DDL_PRECISION_HIGH | DRAIN_LATENCY_MASK);
 -              wm->ddl[pipe].cursor =
 +              wm->ddl[pipe].plane[PLANE_CURSOR] =
                        (tmp >> DDL_CURSOR_SHIFT) & (DDL_PRECISION_HIGH | DRAIN_LATENCY_MASK);
 -              wm->ddl[pipe].sprite[0] =
 +              wm->ddl[pipe].plane[PLANE_SPRITE0] =
                        (tmp >> DDL_SPRITE_SHIFT(0)) & (DDL_PRECISION_HIGH | DRAIN_LATENCY_MASK);
 -              wm->ddl[pipe].sprite[1] =
 +              wm->ddl[pipe].plane[PLANE_SPRITE1] =
                        (tmp >> DDL_SPRITE_SHIFT(1)) & (DDL_PRECISION_HIGH | DRAIN_LATENCY_MASK);
        }
  
        tmp = I915_READ(DSPFW1);
        wm->sr.plane = _FW_WM(tmp, SR);
 -      wm->pipe[PIPE_B].cursor = _FW_WM(tmp, CURSORB);
 -      wm->pipe[PIPE_B].primary = _FW_WM_VLV(tmp, PLANEB);
 -      wm->pipe[PIPE_A].primary = _FW_WM_VLV(tmp, PLANEA);
 +      wm->pipe[PIPE_B].plane[PLANE_CURSOR] = _FW_WM(tmp, CURSORB);
 +      wm->pipe[PIPE_B].plane[PLANE_PRIMARY] = _FW_WM_VLV(tmp, PLANEB);
 +      wm->pipe[PIPE_A].plane[PLANE_PRIMARY] = _FW_WM_VLV(tmp, PLANEA);
  
        tmp = I915_READ(DSPFW2);
 -      wm->pipe[PIPE_A].sprite[1] = _FW_WM_VLV(tmp, SPRITEB);
 -      wm->pipe[PIPE_A].cursor = _FW_WM(tmp, CURSORA);
 -      wm->pipe[PIPE_A].sprite[0] = _FW_WM_VLV(tmp, SPRITEA);
 +      wm->pipe[PIPE_A].plane[PLANE_SPRITE1] = _FW_WM_VLV(tmp, SPRITEB);
 +      wm->pipe[PIPE_A].plane[PLANE_CURSOR] = _FW_WM(tmp, CURSORA);
 +      wm->pipe[PIPE_A].plane[PLANE_SPRITE0] = _FW_WM_VLV(tmp, SPRITEA);
  
        tmp = I915_READ(DSPFW3);
        wm->sr.cursor = _FW_WM(tmp, CURSOR_SR);
  
        if (IS_CHERRYVIEW(dev_priv)) {
                tmp = I915_READ(DSPFW7_CHV);
 -              wm->pipe[PIPE_B].sprite[1] = _FW_WM_VLV(tmp, SPRITED);
 -              wm->pipe[PIPE_B].sprite[0] = _FW_WM_VLV(tmp, SPRITEC);
 +              wm->pipe[PIPE_B].plane[PLANE_SPRITE1] = _FW_WM_VLV(tmp, SPRITED);
 +              wm->pipe[PIPE_B].plane[PLANE_SPRITE0] = _FW_WM_VLV(tmp, SPRITEC);
  
                tmp = I915_READ(DSPFW8_CHV);
 -              wm->pipe[PIPE_C].sprite[1] = _FW_WM_VLV(tmp, SPRITEF);
 -              wm->pipe[PIPE_C].sprite[0] = _FW_WM_VLV(tmp, SPRITEE);
 +              wm->pipe[PIPE_C].plane[PLANE_SPRITE1] = _FW_WM_VLV(tmp, SPRITEF);
 +              wm->pipe[PIPE_C].plane[PLANE_SPRITE0] = _FW_WM_VLV(tmp, SPRITEE);
  
                tmp = I915_READ(DSPFW9_CHV);
 -              wm->pipe[PIPE_C].primary = _FW_WM_VLV(tmp, PLANEC);
 -              wm->pipe[PIPE_C].cursor = _FW_WM(tmp, CURSORC);
 +              wm->pipe[PIPE_C].plane[PLANE_PRIMARY] = _FW_WM_VLV(tmp, PLANEC);
 +              wm->pipe[PIPE_C].plane[PLANE_CURSOR] = _FW_WM(tmp, CURSORC);
  
                tmp = I915_READ(DSPHOWM);
                wm->sr.plane |= _FW_WM(tmp, SR_HI) << 9;
 -              wm->pipe[PIPE_C].sprite[1] |= _FW_WM(tmp, SPRITEF_HI) << 8;
 -              wm->pipe[PIPE_C].sprite[0] |= _FW_WM(tmp, SPRITEE_HI) << 8;
 -              wm->pipe[PIPE_C].primary |= _FW_WM(tmp, PLANEC_HI) << 8;
 -              wm->pipe[PIPE_B].sprite[1] |= _FW_WM(tmp, SPRITED_HI) << 8;
 -              wm->pipe[PIPE_B].sprite[0] |= _FW_WM(tmp, SPRITEC_HI) << 8;
 -              wm->pipe[PIPE_B].primary |= _FW_WM(tmp, PLANEB_HI) << 8;
 -              wm->pipe[PIPE_A].sprite[1] |= _FW_WM(tmp, SPRITEB_HI) << 8;
 -              wm->pipe[PIPE_A].sprite[0] |= _FW_WM(tmp, SPRITEA_HI) << 8;
 -              wm->pipe[PIPE_A].primary |= _FW_WM(tmp, PLANEA_HI) << 8;
 +              wm->pipe[PIPE_C].plane[PLANE_SPRITE1] |= _FW_WM(tmp, SPRITEF_HI) << 8;
 +              wm->pipe[PIPE_C].plane[PLANE_SPRITE0] |= _FW_WM(tmp, SPRITEE_HI) << 8;
 +              wm->pipe[PIPE_C].plane[PLANE_PRIMARY] |= _FW_WM(tmp, PLANEC_HI) << 8;
 +              wm->pipe[PIPE_B].plane[PLANE_SPRITE1] |= _FW_WM(tmp, SPRITED_HI) << 8;
 +              wm->pipe[PIPE_B].plane[PLANE_SPRITE0] |= _FW_WM(tmp, SPRITEC_HI) << 8;
 +              wm->pipe[PIPE_B].plane[PLANE_PRIMARY] |= _FW_WM(tmp, PLANEB_HI) << 8;
 +              wm->pipe[PIPE_A].plane[PLANE_SPRITE1] |= _FW_WM(tmp, SPRITEB_HI) << 8;
 +              wm->pipe[PIPE_A].plane[PLANE_SPRITE0] |= _FW_WM(tmp, SPRITEA_HI) << 8;
 +              wm->pipe[PIPE_A].plane[PLANE_PRIMARY] |= _FW_WM(tmp, PLANEA_HI) << 8;
        } else {
                tmp = I915_READ(DSPFW7);
 -              wm->pipe[PIPE_B].sprite[1] = _FW_WM_VLV(tmp, SPRITED);
 -              wm->pipe[PIPE_B].sprite[0] = _FW_WM_VLV(tmp, SPRITEC);
 +              wm->pipe[PIPE_B].plane[PLANE_SPRITE1] = _FW_WM_VLV(tmp, SPRITED);
 +              wm->pipe[PIPE_B].plane[PLANE_SPRITE0] = _FW_WM_VLV(tmp, SPRITEC);
  
                tmp = I915_READ(DSPHOWM);
                wm->sr.plane |= _FW_WM(tmp, SR_HI) << 9;
 -              wm->pipe[PIPE_B].sprite[1] |= _FW_WM(tmp, SPRITED_HI) << 8;
 -              wm->pipe[PIPE_B].sprite[0] |= _FW_WM(tmp, SPRITEC_HI) << 8;
 -              wm->pipe[PIPE_B].primary |= _FW_WM(tmp, PLANEB_HI) << 8;
 -              wm->pipe[PIPE_A].sprite[1] |= _FW_WM(tmp, SPRITEB_HI) << 8;
 -              wm->pipe[PIPE_A].sprite[0] |= _FW_WM(tmp, SPRITEA_HI) << 8;
 -              wm->pipe[PIPE_A].primary |= _FW_WM(tmp, PLANEA_HI) << 8;
 +              wm->pipe[PIPE_B].plane[PLANE_SPRITE1] |= _FW_WM(tmp, SPRITED_HI) << 8;
 +              wm->pipe[PIPE_B].plane[PLANE_SPRITE0] |= _FW_WM(tmp, SPRITEC_HI) << 8;
 +              wm->pipe[PIPE_B].plane[PLANE_PRIMARY] |= _FW_WM(tmp, PLANEB_HI) << 8;
 +              wm->pipe[PIPE_A].plane[PLANE_SPRITE1] |= _FW_WM(tmp, SPRITEB_HI) << 8;
 +              wm->pipe[PIPE_A].plane[PLANE_SPRITE0] |= _FW_WM(tmp, SPRITEA_HI) << 8;
 +              wm->pipe[PIPE_A].plane[PLANE_PRIMARY] |= _FW_WM(tmp, PLANEA_HI) << 8;
        }
  }
  
@@@ -4538,8 -4543,21 +4545,8 @@@ void vlv_wm_get_hw_state(struct drm_dev
  
        vlv_read_wm_values(dev_priv, wm);
  
 -      for_each_intel_plane(dev, plane) {
 -              switch (plane->base.type) {
 -                      int sprite;
 -              case DRM_PLANE_TYPE_CURSOR:
 -                      plane->wm.fifo_size = 63;
 -                      break;
 -              case DRM_PLANE_TYPE_PRIMARY:
 -                      plane->wm.fifo_size = vlv_get_fifo_size(dev_priv, plane->pipe, 0);
 -                      break;
 -              case DRM_PLANE_TYPE_OVERLAY:
 -                      sprite = plane->plane;
 -                      plane->wm.fifo_size = vlv_get_fifo_size(dev_priv, plane->pipe, sprite + 1);
 -                      break;
 -              }
 -      }
 +      for_each_intel_plane(dev, plane)
 +              plane->wm.fifo_size = vlv_get_fifo_size(plane);
  
        wm->cxsr = I915_READ(FW_BLC_SELF_VLV) & FW_CSPWRDWNEN;
        wm->level = VLV_WM_LEVEL_PM2;
  
        for_each_pipe(dev_priv, pipe)
                DRM_DEBUG_KMS("Initial watermarks: pipe %c, plane=%d, cursor=%d, sprite0=%d, sprite1=%d\n",
 -                            pipe_name(pipe), wm->pipe[pipe].primary, wm->pipe[pipe].cursor,
 -                            wm->pipe[pipe].sprite[0], wm->pipe[pipe].sprite[1]);
 +                            pipe_name(pipe),
 +                            wm->pipe[pipe].plane[PLANE_PRIMARY],
 +                            wm->pipe[pipe].plane[PLANE_CURSOR],
 +                            wm->pipe[pipe].plane[PLANE_SPRITE0],
 +                            wm->pipe[pipe].plane[PLANE_SPRITE1]);
  
        DRM_DEBUG_KMS("Initial watermarks: SR plane=%d, SR cursor=%d level=%d cxsr=%d\n",
                      wm->sr.plane, wm->sr.cursor, wm->level, wm->cxsr);
@@@ -5004,18 -5019,8 +5011,18 @@@ static void vlv_set_rps_idle(struct drm
        if (dev_priv->rps.cur_freq <= val)
                return;
  
 -      /* Wake up the media well, as that takes a lot less
 -       * power than the Render well. */
 +      /* The punit delays the write of the frequency and voltage until it
 +       * determines the GPU is awake. During normal usage we don't want to
 +       * waste power changing the frequency if the GPU is sleeping (rc6).
 +       * However, the GPU and driver is now idle and we do not want to delay
 +       * switching to minimum voltage (reducing power whilst idle) as we do
 +       * not expect to be woken in the near future and so must flush the
 +       * change by waking the device.
 +       *
 +       * We choose to take the media powerwell (either would do to trick the
 +       * punit into committing the voltage change) as that takes a lot less
 +       * power than the render powerwell.
 +       */
        intel_uncore_forcewake_get(dev_priv, FORCEWAKE_MEDIA);
        valleyview_set_rps(dev_priv, val);
        intel_uncore_forcewake_put(dev_priv, FORCEWAKE_MEDIA);
@@@ -5237,7 -5242,7 +5244,7 @@@ int sanitize_rc6_option(struct drm_i915
        if (!enable_rc6)
                return 0;
  
 -      if (IS_BROXTON(dev_priv) && !bxt_check_bios_rc6_setup(dev_priv)) {
 +      if (IS_GEN9_LP(dev_priv) && !bxt_check_bios_rc6_setup(dev_priv)) {
                DRM_INFO("RC6 disabled by BIOS\n");
                return 0;
        }
@@@ -5271,7 -5276,7 +5278,7 @@@ static void gen6_init_rps_frequencies(s
        /* All of these values are in units of 50MHz */
  
        /* static values from HW: RP0 > RP1 > RPn (min_freq) */
 -      if (IS_BROXTON(dev_priv)) {
 +      if (IS_GEN9_LP(dev_priv)) {
                u32 rp_state_cap = I915_READ(BXT_RP_STATE_CAP);
                dev_priv->rps.rp0_freq = (rp_state_cap >> 16) & 0xff;
                dev_priv->rps.rp1_freq = (rp_state_cap >>  8) & 0xff;
@@@ -5834,7 -5839,7 +5841,7 @@@ static void valleyview_setup_pctx(struc
                int pcbr_offset;
  
                pcbr_offset = (pcbr & (~4095)) - dev_priv->mm.stolen_base;
 -              pctx = i915_gem_object_create_stolen_for_preallocated(&dev_priv->drm,
 +              pctx = i915_gem_object_create_stolen_for_preallocated(dev_priv,
                                                                      pcbr_offset,
                                                                      I915_GTT_OFFSET_NONE,
                                                                      pctx_size);
         * overlap with other ranges, such as the frame buffer, protected
         * memory, or any other relevant ranges.
         */
 -      pctx = i915_gem_object_create_stolen(&dev_priv->drm, pctx_size);
 +      pctx = i915_gem_object_create_stolen(dev_priv, pctx_size);
        if (!pctx) {
                DRM_DEBUG("not enough stolen space for PCTX, disabling\n");
                goto out;
@@@ -6802,7 -6807,7 +6809,7 @@@ static void __intel_autoenable_gt_power
                goto out;
  
        rcs = dev_priv->engine[RCS];
 -      if (rcs->last_context)
 +      if (rcs->last_retired_context)
                goto out;
  
        if (!rcs->init_context)
@@@ -7613,6 -7618,8 +7620,6 @@@ static void i85x_init_clock_gating(stru
  
  static void i830_init_clock_gating(struct drm_i915_private *dev_priv)
  {
 -      I915_WRITE(DSPCLK_GATE_D, OVRUNIT_CLOCK_GATE_DISABLE);
 -
        I915_WRITE(MEM_MODE,
                   _MASKED_BIT_ENABLE(MEM_DISPLAY_A_TRICKLE_FEED_DISABLE) |
                   _MASKED_BIT_ENABLE(MEM_DISPLAY_B_TRICKLE_FEED_DISABLE));
@@@ -7649,7 -7656,7 +7656,7 @@@ void intel_init_clock_gating_hooks(stru
                dev_priv->display.init_clock_gating = skylake_init_clock_gating;
        else if (IS_KABYLAKE(dev_priv))
                dev_priv->display.init_clock_gating = kabylake_init_clock_gating;
 -      else if (IS_BROXTON(dev_priv))
 +      else if (IS_GEN9_LP(dev_priv))
                dev_priv->display.init_clock_gating = bxt_init_clock_gating;
        else if (IS_BROADWELL(dev_priv))
                dev_priv->display.init_clock_gating = broadwell_init_clock_gating;
                dev_priv->display.init_clock_gating = ironlake_init_clock_gating;
        else if (IS_G4X(dev_priv))
                dev_priv->display.init_clock_gating = g4x_init_clock_gating;
 -      else if (IS_CRESTLINE(dev_priv))
 +      else if (IS_I965GM(dev_priv))
                dev_priv->display.init_clock_gating = crestline_init_clock_gating;
 -      else if (IS_BROADWATER(dev_priv))
 +      else if (IS_I965G(dev_priv))
                dev_priv->display.init_clock_gating = broadwater_init_clock_gating;
        else if (IS_GEN3(dev_priv))
                dev_priv->display.init_clock_gating = gen3_init_clock_gating;
@@@ -7718,7 -7725,10 +7725,7 @@@ void intel_init_pm(struct drm_i915_priv
                        DRM_DEBUG_KMS("Failed to read display plane latency. "
                                      "Disable CxSR\n");
                }
 -      } else if (IS_CHERRYVIEW(dev_priv)) {
 -              vlv_setup_wm_latency(dev_priv);
 -              dev_priv->display.update_wm = vlv_update_wm;
 -      } else if (IS_VALLEYVIEW(dev_priv)) {
 +      } else if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv)) {
                vlv_setup_wm_latency(dev_priv);
                dev_priv->display.update_wm = vlv_update_wm;
        } else if (IS_PINEVIEW(dev_priv)) {
@@@ -7862,7 -7872,6 +7869,7 @@@ int sandybridge_pcode_write(struct drm_
        }
  
        I915_WRITE_FW(GEN6_PCODE_DATA, val);
 +      I915_WRITE_FW(GEN6_PCODE_DATA1, 0);
        I915_WRITE_FW(GEN6_PCODE_MAILBOX, GEN6_PCODE_READY | mbox);
  
        if (intel_wait_for_register_fw(dev_priv,
        return 0;
  }
  
 +static bool skl_pcode_try_request(struct drm_i915_private *dev_priv, u32 mbox,
 +                                u32 request, u32 reply_mask, u32 reply,
 +                                u32 *status)
 +{
 +      u32 val = request;
 +
 +      *status = sandybridge_pcode_read(dev_priv, mbox, &val);
 +
 +      return *status || ((val & reply_mask) == reply);
 +}
 +
 +/**
 + * skl_pcode_request - send PCODE request until acknowledgment
 + * @dev_priv: device private
 + * @mbox: PCODE mailbox ID the request is targeted for
 + * @request: request ID
 + * @reply_mask: mask used to check for request acknowledgment
 + * @reply: value used to check for request acknowledgment
 + * @timeout_base_ms: timeout for polling with preemption enabled
 + *
 + * Keep resending the @request to @mbox until PCODE acknowledges it, PCODE
 + * reports an error or an overall timeout of @timeout_base_ms+10 ms expires.
 + * The request is acknowledged once the PCODE reply dword equals @reply after
 + * applying @reply_mask. Polling is first attempted with preemption enabled
 + * for @timeout_base_ms and if this times out for another 10 ms with
 + * preemption disabled.
 + *
 + * Returns 0 on success, %-ETIMEDOUT in case of a timeout, <0 in case of some
 + * other error as reported by PCODE.
 + */
 +int skl_pcode_request(struct drm_i915_private *dev_priv, u32 mbox, u32 request,
 +                    u32 reply_mask, u32 reply, int timeout_base_ms)
 +{
 +      u32 status;
 +      int ret;
 +
 +      WARN_ON(!mutex_is_locked(&dev_priv->rps.hw_lock));
 +
 +#define COND skl_pcode_try_request(dev_priv, mbox, request, reply_mask, reply, \
 +                                 &status)
 +
 +      /*
 +       * Prime the PCODE by doing a request first. Normally it guarantees
 +       * that a subsequent request, at most @timeout_base_ms later, succeeds.
 +       * _wait_for() doesn't guarantee when its passed condition is evaluated
 +       * first, so send the first request explicitly.
 +       */
 +      if (COND) {
 +              ret = 0;
 +              goto out;
 +      }
 +      ret = _wait_for(COND, timeout_base_ms * 1000, 10);
 +      if (!ret)
 +              goto out;
 +
 +      /*
 +       * The above can time out if the number of requests was low (2 in the
 +       * worst case) _and_ PCODE was busy for some reason even after a
 +       * (queued) request and @timeout_base_ms delay. As a workaround retry
 +       * the poll with preemption disabled to maximize the number of
 +       * requests. Increase the timeout from @timeout_base_ms to 10ms to
 +       * account for interrupts that could reduce the number of these
 +       * requests.
 +       */
 +      DRM_DEBUG_KMS("PCODE timeout, retrying with preemption disabled\n");
 +      WARN_ON_ONCE(timeout_base_ms > 3);
 +      preempt_disable();
 +      ret = wait_for_atomic(COND, 10);
 +      preempt_enable();
 +
 +out:
 +      return ret ? ret : status;
 +#undef COND
 +}
 +
  static int byt_gpu_freq(struct drm_i915_private *dev_priv, int val)
  {
        /*
@@@ -8055,8 -7989,10 +8062,8 @@@ void intel_queue_rps_boost_for_request(
        queue_work(req->i915->wq, &boost->work);
  }
  
 -void intel_pm_setup(struct drm_device *dev)
 +void intel_pm_setup(struct drm_i915_private *dev_priv)
  {
 -      struct drm_i915_private *dev_priv = to_i915(dev);
 -
        mutex_init(&dev_priv->rps.hw_lock);
        spin_lock_init(&dev_priv->rps.client_lock);
  
@@@ -203,8 -203,8 +203,8 @@@ skl_update_plane(struct drm_plane *drm_
        struct drm_i915_private *dev_priv = to_i915(dev);
        struct intel_plane *intel_plane = to_intel_plane(drm_plane);
        struct drm_framebuffer *fb = plane_state->base.fb;
 -      const int pipe = intel_plane->pipe;
 -      const int plane = intel_plane->plane + 1;
 +      enum plane_id plane_id = intel_plane->id;
 +      enum pipe pipe = intel_plane->pipe;
        u32 plane_ctl;
        const struct drm_intel_sprite_colorkey *key = &plane_state->ckey;
        u32 surf_addr = plane_state->main.offset;
                PLANE_CTL_PIPE_GAMMA_ENABLE |
                PLANE_CTL_PIPE_CSC_ENABLE;
  
-       plane_ctl |= skl_plane_ctl_format(fb->pixel_format);
+       plane_ctl |= skl_plane_ctl_format(fb->format->format);
        plane_ctl |= skl_plane_ctl_tiling(fb->modifier);
  
        plane_ctl |= skl_plane_ctl_rotation(rotation);
  
        if (key->flags) {
 -              I915_WRITE(PLANE_KEYVAL(pipe, plane), key->min_value);
 -              I915_WRITE(PLANE_KEYMAX(pipe, plane), key->max_value);
 -              I915_WRITE(PLANE_KEYMSK(pipe, plane), key->channel_mask);
 +              I915_WRITE(PLANE_KEYVAL(pipe, plane_id), key->min_value);
 +              I915_WRITE(PLANE_KEYMAX(pipe, plane_id), key->max_value);
 +              I915_WRITE(PLANE_KEYMSK(pipe, plane_id), key->channel_mask);
        }
  
        if (key->flags & I915_SET_COLORKEY_DESTINATION)
        crtc_w--;
        crtc_h--;
  
 -      I915_WRITE(PLANE_OFFSET(pipe, plane), (y << 16) | x);
 -      I915_WRITE(PLANE_STRIDE(pipe, plane), stride);
 -      I915_WRITE(PLANE_SIZE(pipe, plane), (src_h << 16) | src_w);
 +      I915_WRITE(PLANE_OFFSET(pipe, plane_id), (y << 16) | x);
 +      I915_WRITE(PLANE_STRIDE(pipe, plane_id), stride);
 +      I915_WRITE(PLANE_SIZE(pipe, plane_id), (src_h << 16) | src_w);
  
        /* program plane scaler */
        if (plane_state->scaler_id >= 0) {
                int scaler_id = plane_state->scaler_id;
                const struct intel_scaler *scaler;
  
 -              DRM_DEBUG_KMS("plane = %d PS_PLANE_SEL(plane) = 0x%x\n", plane,
 -                      PS_PLANE_SEL(plane));
 +              DRM_DEBUG_KMS("plane = %d PS_PLANE_SEL(plane) = 0x%x\n",
 +                            plane_id, PS_PLANE_SEL(plane_id));
  
                scaler = &crtc_state->scaler_state.scalers[scaler_id];
  
                I915_WRITE(SKL_PS_CTRL(pipe, scaler_id),
 -                         PS_SCALER_EN | PS_PLANE_SEL(plane) | scaler->mode);
 +                         PS_SCALER_EN | PS_PLANE_SEL(plane_id) | scaler->mode);
                I915_WRITE(SKL_PS_PWR_GATE(pipe, scaler_id), 0);
                I915_WRITE(SKL_PS_WIN_POS(pipe, scaler_id), (crtc_x << 16) | crtc_y);
                I915_WRITE(SKL_PS_WIN_SZ(pipe, scaler_id),
                        ((crtc_w + 1) << 16)|(crtc_h + 1));
  
 -              I915_WRITE(PLANE_POS(pipe, plane), 0);
 +              I915_WRITE(PLANE_POS(pipe, plane_id), 0);
        } else {
 -              I915_WRITE(PLANE_POS(pipe, plane), (crtc_y << 16) | crtc_x);
 +              I915_WRITE(PLANE_POS(pipe, plane_id), (crtc_y << 16) | crtc_x);
        }
  
 -      I915_WRITE(PLANE_CTL(pipe, plane), plane_ctl);
 -      I915_WRITE(PLANE_SURF(pipe, plane),
 +      I915_WRITE(PLANE_CTL(pipe, plane_id), plane_ctl);
 +      I915_WRITE(PLANE_SURF(pipe, plane_id),
                   intel_fb_gtt_offset(fb, rotation) + surf_addr);
 -      POSTING_READ(PLANE_SURF(pipe, plane));
 +      POSTING_READ(PLANE_SURF(pipe, plane_id));
  }
  
  static void
@@@ -283,20 -283,20 +283,20 @@@ skl_disable_plane(struct drm_plane *dpl
        struct drm_device *dev = dplane->dev;
        struct drm_i915_private *dev_priv = to_i915(dev);
        struct intel_plane *intel_plane = to_intel_plane(dplane);
 -      const int pipe = intel_plane->pipe;
 -      const int plane = intel_plane->plane + 1;
 +      enum plane_id plane_id = intel_plane->id;
 +      enum pipe pipe = intel_plane->pipe;
  
 -      I915_WRITE(PLANE_CTL(pipe, plane), 0);
 +      I915_WRITE(PLANE_CTL(pipe, plane_id), 0);
  
 -      I915_WRITE(PLANE_SURF(pipe, plane), 0);
 -      POSTING_READ(PLANE_SURF(pipe, plane));
 +      I915_WRITE(PLANE_SURF(pipe, plane_id), 0);
 +      POSTING_READ(PLANE_SURF(pipe, plane_id));
  }
  
  static void
  chv_update_csc(struct intel_plane *intel_plane, uint32_t format)
  {
        struct drm_i915_private *dev_priv = to_i915(intel_plane->base.dev);
 -      int plane = intel_plane->plane;
 +      enum plane_id plane_id = intel_plane->id;
  
        /* Seems RGB data bypasses the CSC always */
        if (!format_is_yuv(format))
         * Cb and Cr apparently come in as signed already, so no
         * need for any offset. For Y we need to remove the offset.
         */
 -      I915_WRITE(SPCSCYGOFF(plane), SPCSC_OOFF(0) | SPCSC_IOFF(-64));
 -      I915_WRITE(SPCSCCBOFF(plane), SPCSC_OOFF(0) | SPCSC_IOFF(0));
 -      I915_WRITE(SPCSCCROFF(plane), SPCSC_OOFF(0) | SPCSC_IOFF(0));
 -
 -      I915_WRITE(SPCSCC01(plane), SPCSC_C1(4769) | SPCSC_C0(6537));
 -      I915_WRITE(SPCSCC23(plane), SPCSC_C1(-3330) | SPCSC_C0(0));
 -      I915_WRITE(SPCSCC45(plane), SPCSC_C1(-1605) | SPCSC_C0(4769));
 -      I915_WRITE(SPCSCC67(plane), SPCSC_C1(4769) | SPCSC_C0(0));
 -      I915_WRITE(SPCSCC8(plane), SPCSC_C0(8263));
 -
 -      I915_WRITE(SPCSCYGICLAMP(plane), SPCSC_IMAX(940) | SPCSC_IMIN(64));
 -      I915_WRITE(SPCSCCBICLAMP(plane), SPCSC_IMAX(448) | SPCSC_IMIN(-448));
 -      I915_WRITE(SPCSCCRICLAMP(plane), SPCSC_IMAX(448) | SPCSC_IMIN(-448));
 -
 -      I915_WRITE(SPCSCYGOCLAMP(plane), SPCSC_OMAX(1023) | SPCSC_OMIN(0));
 -      I915_WRITE(SPCSCCBOCLAMP(plane), SPCSC_OMAX(1023) | SPCSC_OMIN(0));
 -      I915_WRITE(SPCSCCROCLAMP(plane), SPCSC_OMAX(1023) | SPCSC_OMIN(0));
 +      I915_WRITE(SPCSCYGOFF(plane_id), SPCSC_OOFF(0) | SPCSC_IOFF(-64));
 +      I915_WRITE(SPCSCCBOFF(plane_id), SPCSC_OOFF(0) | SPCSC_IOFF(0));
 +      I915_WRITE(SPCSCCROFF(plane_id), SPCSC_OOFF(0) | SPCSC_IOFF(0));
 +
 +      I915_WRITE(SPCSCC01(plane_id), SPCSC_C1(4769) | SPCSC_C0(6537));
 +      I915_WRITE(SPCSCC23(plane_id), SPCSC_C1(-3330) | SPCSC_C0(0));
 +      I915_WRITE(SPCSCC45(plane_id), SPCSC_C1(-1605) | SPCSC_C0(4769));
 +      I915_WRITE(SPCSCC67(plane_id), SPCSC_C1(4769) | SPCSC_C0(0));
 +      I915_WRITE(SPCSCC8(plane_id), SPCSC_C0(8263));
 +
 +      I915_WRITE(SPCSCYGICLAMP(plane_id), SPCSC_IMAX(940) | SPCSC_IMIN(64));
 +      I915_WRITE(SPCSCCBICLAMP(plane_id), SPCSC_IMAX(448) | SPCSC_IMIN(-448));
 +      I915_WRITE(SPCSCCRICLAMP(plane_id), SPCSC_IMAX(448) | SPCSC_IMIN(-448));
 +
 +      I915_WRITE(SPCSCYGOCLAMP(plane_id), SPCSC_OMAX(1023) | SPCSC_OMIN(0));
 +      I915_WRITE(SPCSCCBOCLAMP(plane_id), SPCSC_OMAX(1023) | SPCSC_OMIN(0));
 +      I915_WRITE(SPCSCCROCLAMP(plane_id), SPCSC_OMAX(1023) | SPCSC_OMIN(0));
  }
  
  static void
@@@ -340,8 -340,8 +340,8 @@@ vlv_update_plane(struct drm_plane *dpla
        struct drm_i915_private *dev_priv = to_i915(dev);
        struct intel_plane *intel_plane = to_intel_plane(dplane);
        struct drm_framebuffer *fb = plane_state->base.fb;
 -      int pipe = intel_plane->pipe;
 -      int plane = intel_plane->plane;
 +      enum pipe pipe = intel_plane->pipe;
 +      enum plane_id plane_id = intel_plane->id;
        u32 sprctl;
        u32 sprsurf_offset, linear_offset;
        unsigned int rotation = plane_state->base.rotation;
  
        sprctl = SP_ENABLE;
  
-       switch (fb->pixel_format) {
+       switch (fb->format->format) {
        case DRM_FORMAT_YUYV:
                sprctl |= SP_FORMAT_YUV422 | SP_YUV_ORDER_YUYV;
                break;
        linear_offset = intel_fb_xy_to_linear(x, y, plane_state, 0);
  
        if (key->flags) {
 -              I915_WRITE(SPKEYMINVAL(pipe, plane), key->min_value);
 -              I915_WRITE(SPKEYMAXVAL(pipe, plane), key->max_value);
 -              I915_WRITE(SPKEYMSK(pipe, plane), key->channel_mask);
 +              I915_WRITE(SPKEYMINVAL(pipe, plane_id), key->min_value);
 +              I915_WRITE(SPKEYMAXVAL(pipe, plane_id), key->max_value);
 +              I915_WRITE(SPKEYMSK(pipe, plane_id), key->channel_mask);
        }
  
        if (key->flags & I915_SET_COLORKEY_SOURCE)
                sprctl |= SP_SOURCE_KEY;
  
        if (IS_CHERRYVIEW(dev_priv) && pipe == PIPE_B)
-               chv_update_csc(intel_plane, fb->pixel_format);
+               chv_update_csc(intel_plane, fb->format->format);
  
 -      I915_WRITE(SPSTRIDE(pipe, plane), fb->pitches[0]);
 -      I915_WRITE(SPPOS(pipe, plane), (crtc_y << 16) | crtc_x);
 +      I915_WRITE(SPSTRIDE(pipe, plane_id), fb->pitches[0]);
 +      I915_WRITE(SPPOS(pipe, plane_id), (crtc_y << 16) | crtc_x);
  
        if (fb->modifier == I915_FORMAT_MOD_X_TILED)
 -              I915_WRITE(SPTILEOFF(pipe, plane), (y << 16) | x);
 +              I915_WRITE(SPTILEOFF(pipe, plane_id), (y << 16) | x);
        else
 -              I915_WRITE(SPLINOFF(pipe, plane), linear_offset);
 +              I915_WRITE(SPLINOFF(pipe, plane_id), linear_offset);
  
 -      I915_WRITE(SPCONSTALPHA(pipe, plane), 0);
 +      I915_WRITE(SPCONSTALPHA(pipe, plane_id), 0);
  
 -      I915_WRITE(SPSIZE(pipe, plane), (crtc_h << 16) | crtc_w);
 -      I915_WRITE(SPCNTR(pipe, plane), sprctl);
 -      I915_WRITE(SPSURF(pipe, plane),
 +      I915_WRITE(SPSIZE(pipe, plane_id), (crtc_h << 16) | crtc_w);
 +      I915_WRITE(SPCNTR(pipe, plane_id), sprctl);
 +      I915_WRITE(SPSURF(pipe, plane_id),
                   intel_fb_gtt_offset(fb, rotation) + sprsurf_offset);
 -      POSTING_READ(SPSURF(pipe, plane));
 +      POSTING_READ(SPSURF(pipe, plane_id));
  }
  
  static void
@@@ -468,13 -468,13 +468,13 @@@ vlv_disable_plane(struct drm_plane *dpl
        struct drm_device *dev = dplane->dev;
        struct drm_i915_private *dev_priv = to_i915(dev);
        struct intel_plane *intel_plane = to_intel_plane(dplane);
 -      int pipe = intel_plane->pipe;
 -      int plane = intel_plane->plane;
 +      enum pipe pipe = intel_plane->pipe;
 +      enum plane_id plane_id = intel_plane->id;
  
 -      I915_WRITE(SPCNTR(pipe, plane), 0);
 +      I915_WRITE(SPCNTR(pipe, plane_id), 0);
  
 -      I915_WRITE(SPSURF(pipe, plane), 0);
 -      POSTING_READ(SPSURF(pipe, plane));
 +      I915_WRITE(SPSURF(pipe, plane_id), 0);
 +      POSTING_READ(SPSURF(pipe, plane_id));
  }
  
  static void
@@@ -502,7 -502,7 +502,7 @@@ ivb_update_plane(struct drm_plane *plan
  
        sprctl = SPRITE_ENABLE;
  
-       switch (fb->pixel_format) {
+       switch (fb->format->format) {
        case DRM_FORMAT_XBGR8888:
                sprctl |= SPRITE_FORMAT_RGBX888 | SPRITE_RGB_ORDER_RGBX;
                break;
@@@ -640,7 -640,7 +640,7 @@@ ilk_update_plane(struct drm_plane *plan
  
        dvscntr = DVS_ENABLE;
  
-       switch (fb->pixel_format) {
+       switch (fb->format->format) {
        case DRM_FORMAT_XBGR8888:
                dvscntr |= DVS_FORMAT_RGBX888 | DVS_RGB_ORDER_XBGR;
                break;
@@@ -866,7 -866,7 +866,7 @@@ intel_check_sprite_plane(struct drm_pla
                src_y = src->y1 >> 16;
                src_h = drm_rect_height(src) >> 16;
  
-               if (format_is_yuv(fb->pixel_format)) {
+               if (format_is_yuv(fb->format->format)) {
                        src_x &= ~1;
                        src_w &= ~1;
  
        /* Check size restrictions when scaling */
        if (state->base.visible && (src_w != crtc_w || src_h != crtc_h)) {
                unsigned int width_bytes;
-               int cpp = drm_format_plane_cpp(fb->pixel_format, 0);
+               int cpp = fb->format->cpp[0];
  
                WARN_ON(!can_scale);
  
@@@ -1112,7 -1112,6 +1112,7 @@@ intel_sprite_plane_create(struct drm_i9
  
        intel_plane->pipe = pipe;
        intel_plane->plane = plane;
 +      intel_plane->id = PLANE_SPRITE0 + plane;
        intel_plane->frontbuffer_bit = INTEL_FRONTBUFFER_SPRITE(pipe, plane);
        intel_plane->check_plane = intel_check_sprite_plane;
  
@@@ -91,7 -91,7 +91,7 @@@ static void set_scanout(struct drm_crt
  
        start = gem->paddr + fb->offsets[0] +
                crtc->y * fb->pitches[0] +
-               crtc->x * drm_format_plane_cpp(fb->pixel_format, 0);
+               crtc->x * fb->format->cpp[0];
  
        end = start + (crtc->mode.vdisplay * fb->pitches[0]);
  
@@@ -399,7 -399,7 +399,7 @@@ static void tilcdc_crtc_set_mode(struc
        if (info->tft_alt_mode)
                reg |= LCDC_TFT_ALT_ENABLE;
        if (priv->rev == 2) {
-               switch (fb->pixel_format) {
+               switch (fb->format->format) {
                case DRM_FORMAT_BGR565:
                case DRM_FORMAT_RGB565:
                        break;
@@@ -539,7 -539,7 +539,7 @@@ static void tilcdc_crtc_off(struct drm_
        }
  
        drm_flip_work_commit(&tilcdc_crtc->unref_work, priv->wq);
 -      tilcdc_crtc->last_vblank = ktime_set(0, 0);
 +      tilcdc_crtc->last_vblank = 0;
  
        tilcdc_crtc->enabled = false;
        mutex_unlock(&tilcdc_crtc->enable_lock);
diff --combined include/drm/drmP.h
@@@ -61,7 -61,7 +61,7 @@@
  
  #include <asm/mman.h>
  #include <asm/pgalloc.h>
 -#include <asm/uaccess.h>
 +#include <linux/uaccess.h>
  
  #include <uapi/drm/drm.h>
  #include <uapi/drm/drm_mode.h>
@@@ -634,6 -634,19 +634,19 @@@ struct drm_device 
        int switch_power_state;
  };
  
+ /**
+  * drm_drv_uses_atomic_modeset - check if the driver implements
+  * atomic_commit()
+  * @dev: DRM device
+  *
+  * This check is useful if drivers do not have DRIVER_ATOMIC set but
+  * have atomic modesetting internally implemented.
+  */
+ static inline bool drm_drv_uses_atomic_modeset(struct drm_device *dev)
+ {
+       return dev->mode_config.funcs->atomic_commit != NULL;
+ }
  #include <drm/drm_irq.h>
  
  #define DRM_SWITCH_POWER_ON 0
diff --combined lib/Makefile
@@@ -128,6 -128,7 +128,6 @@@ obj-$(CONFIG_SWIOTLB) += swiotlb.
  obj-$(CONFIG_IOMMU_HELPER) += iommu-helper.o iommu-common.o
  obj-$(CONFIG_FAULT_INJECTION) += fault-inject.o
  obj-$(CONFIG_NOTIFIER_ERROR_INJECTION) += notifier-error-inject.o
 -obj-$(CONFIG_CPU_NOTIFIER_ERROR_INJECT) += cpu-notifier-error-inject.o
  obj-$(CONFIG_PM_NOTIFIER_ERROR_INJECT) += pm-notifier-error-inject.o
  obj-$(CONFIG_NETDEV_NOTIFIER_ERROR_INJECT) += netdev-notifier-error-inject.o
  obj-$(CONFIG_MEMORY_NOTIFIER_ERROR_INJECT) += memory-notifier-error-inject.o
@@@ -196,6 -197,8 +196,8 @@@ obj-$(CONFIG_ASN1) += asn1_decoder.
  
  obj-$(CONFIG_FONT_SUPPORT) += fonts/
  
+ obj-$(CONFIG_PRIME_NUMBERS) += prime_numbers.o
  hostprogs-y   := gen_crc32table
  clean-files   := crc32table.h