Merge tag 'drm-intel-gt-next-2022-11-03' of git://anongit.freedesktop.org/drm/drm...
authorDave Airlie <airlied@redhat.com>
Fri, 4 Nov 2022 07:20:12 +0000 (17:20 +1000)
committerDave Airlie <airlied@redhat.com>
Fri, 4 Nov 2022 07:33:34 +0000 (17:33 +1000)
Driver Changes:

- Fix for #7306: [Arc A380] white flickering when using arc as a
  secondary gpu (Matt A)
- Add Wa_18017747507 for DG2 (Wayne)
- Avoid spurious WARN on DG1 due to incorrect cache_dirty flag
  (Niranjana, Matt A)
- Corrections to CS timestamp support for Gen5 and earlier (Ville)

- Fix a build error used with clang compiler on hwmon (GG)
- Improvements to LMEM handling with RPM (Anshuman, Matt A)
- Cleanups in dmabuf code (Mike)

- Selftest improvements (Matt A)

Signed-off-by: Dave Airlie <airlied@redhat.com>
From: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/Y2N11wu175p6qeEN@jlahtine-mobl.ger.corp.intel.com
24 files changed:
1  2 
MAINTAINERS
drivers/gpu/drm/i915/Makefile
drivers/gpu/drm/i915/display/intel_lpe_audio.c
drivers/gpu/drm/i915/gem/i915_gem_dmabuf.c
drivers/gpu/drm/i915/gem/i915_gem_execbuffer.c
drivers/gpu/drm/i915/gem/i915_gem_object.c
drivers/gpu/drm/i915/gem/i915_gem_ttm.c
drivers/gpu/drm/i915/gem/i915_gem_userptr.c
drivers/gpu/drm/i915/gem/selftests/i915_gem_dmabuf.c
drivers/gpu/drm/i915/gt/intel_gt_regs.h
drivers/gpu/drm/i915/gt/intel_workarounds.c
drivers/gpu/drm/i915/gvt/handlers.c
drivers/gpu/drm/i915/gvt/mmio_context.c
drivers/gpu/drm/i915/i915_driver.c
drivers/gpu/drm/i915/i915_drv.h
drivers/gpu/drm/i915/i915_pci.c
drivers/gpu/drm/i915/i915_reg.h
drivers/gpu/drm/i915/intel_device_info.h
drivers/gpu/drm/i915/intel_gvt_mmio_table.c
drivers/gpu/drm/i915/intel_pm.c
drivers/gpu/drm/i915/intel_runtime_pm.c
drivers/gpu/drm/i915/intel_uncore.h
drivers/gpu/drm/i915/pxp/intel_pxp_session.c
drivers/gpu/drm/i915/pxp/intel_pxp_tee.c

diff --combined MAINTAINERS
@@@ -348,6 -348,7 +348,6 @@@ M: "Rafael J. Wysocki" <rafael@kernel.o
  R:    Len Brown <lenb@kernel.org>
  L:    linux-acpi@vger.kernel.org
  S:    Supported
 -W:    https://01.org/linux-acpi
  Q:    https://patchwork.kernel.org/project/linux-acpi/list/
  B:    https://bugzilla.kernel.org
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm
@@@ -426,6 -427,7 +426,6 @@@ M: Rafael J. Wysocki <rafael@kernel.org
  R:    Zhang Rui <rui.zhang@intel.com>
  L:    linux-acpi@vger.kernel.org
  S:    Supported
 -W:    https://01.org/linux-acpi
  B:    https://bugzilla.kernel.org
  F:    drivers/acpi/*thermal*
  
@@@ -554,7 -556,7 +554,7 @@@ M: Michael Hennerich <michael.hennerich
  S:    Supported
  W:    http://wiki.analog.com/ADP5588
  W:    https://ez.analog.com/linux-software-drivers
 -F:    drivers/gpio/gpio-adp5588.c
 +F:    Documentation/devicetree/bindings/input/adi,adp5588.yaml
  F:    drivers/input/keyboard/adp5588-keys.c
  
  ADP8860 BACKLIGHT DRIVER (ADP8860/ADP8861/ADP8863)
@@@ -618,7 -620,7 +618,7 @@@ ADXL367 THREE-AXIS DIGITAL ACCELEROMETE
  M:    Cosmin Tanislav <cosmin.tanislav@analog.com>
  L:    linux-iio@vger.kernel.org
  S:    Supported
 -W:    http://ez.analog.com/community/linux-device-drivers
 +W:    https://ez.analog.com/linux-software-drivers
  F:    Documentation/devicetree/bindings/iio/accel/adi,adxl367.yaml
  F:    drivers/iio/accel/adxl367*
  
@@@ -669,8 -671,7 +669,8 @@@ F: fs/afs
  F:    include/trace/events/afs.h
  
  AGPGART DRIVER
 -M:    David Airlie <airlied@linux.ie>
 +M:    David Airlie <airlied@redhat.com>
 +L:    dri-devel@lists.freedesktop.org
  S:    Maintained
  T:    git git://anongit.freedesktop.org/drm/drm
  F:    drivers/char/agp/
@@@ -748,17 -749,19 +748,17 @@@ S:      Supporte
  F:    drivers/infiniband/hw/erdma
  F:    include/uapi/rdma/erdma-abi.h
  
 +ALIBABA PMU DRIVER
 +M:    Shuai Xue <xueshuai@linux.alibaba.com>
 +S:    Supported
 +F:    Documentation/admin-guide/perf/alibaba_pmu.rst
 +F:    drivers/perf/alibaba_uncore_drw_pmu.c
 +
  ALIENWARE WMI DRIVER
  L:    Dell.Client.Kernel@dell.com
  S:    Maintained
  F:    drivers/platform/x86/dell/alienware-wmi.c
  
 -ALL SENSORS DLH SERIES PRESSURE SENSORS DRIVER
 -M:    Tomislav Denis <tomislav.denis@avl.com>
 -L:    linux-iio@vger.kernel.org
 -S:    Maintained
 -W:    http://www.allsensors.com/
 -F:    Documentation/devicetree/bindings/iio/pressure/asc,dlhl60d.yaml
 -F:    drivers/iio/pressure/dlhl60d.c
 -
  ALLEGRO DVT VIDEO IP CORE DRIVER
  M:    Michael Tretter <m.tretter@pengutronix.de>
  R:    Pengutronix Kernel Team <kernel@pengutronix.de>
@@@ -817,13 -820,6 +817,13 @@@ L:       linux-media@vger.kernel.or
  S:    Maintained
  F:    drivers/staging/media/sunxi/cedrus/
  
 +ALLWINNER DMIC DRIVERS
 +M:    Ban Tao <fengzheng923@gmail.com>
 +L:    alsa-devel@alsa-project.org (moderated for non-subscribers)
 +S:    Maintained
 +F:    Documentation/devicetree/bindings/sound/allwinner,sun50i-h6-dmic.yaml
 +F:    sound/soc/sunxi/sun50i-dmic.c
 +
  ALPHA PORT
  M:    Richard Henderson <richard.henderson@linaro.org>
  M:    Ivan Kokshaysky <ink@jurassic.park.msu.ru>
@@@ -882,13 -878,6 +882,13 @@@ L:       netdev@vger.kernel.or
  S:    Maintained
  F:    drivers/net/ethernet/altera/
  
 +ALTERA TSE PCS
 +M:    Maxime Chevallier <maxime.chevallier@bootlin.com>
 +L:    netdev@vger.kernel.org
 +S:    Supported
 +F:    drivers/net/pcs/pcs-altera-tse.c
 +F:    include/linux/pcs-altera-tse.h
 +
  ALTERA UART/JTAG UART SERIAL DRIVERS
  M:    Tobias Klauser <tklauser@distanz.ch>
  L:    linux-serial@vger.kernel.org
@@@ -1021,6 -1010,7 +1021,6 @@@ F:      drivers/spi/spi-amd.
  
  AMD MP2 I2C DRIVER
  M:    Elie Morisse <syniurge@gmail.com>
 -M:    Nehal Shah <nehal-bakulchandra.shah@amd.com>
  M:    Shyam Sundar S K <shyam-sundar.s-k@amd.com>
  L:    linux-i2c@vger.kernel.org
  S:    Maintained
@@@ -1032,13 -1022,6 +1032,13 @@@ L:    platform-driver-x86@vger.kernel.or
  S:    Maintained
  F:    drivers/platform/x86/amd/pmc.c
  
 +AMD PMF DRIVER
 +M:    Shyam Sundar S K <Shyam-sundar.S-k@amd.com>
 +L:    platform-driver-x86@vger.kernel.org
 +S:    Maintained
 +F:    Documentation/ABI/testing/sysfs-amd-pmf
 +F:    drivers/platform/x86/amd/pmf/
 +
  AMD HSMP DRIVER
  M:    Naveen Krishna Chatradhi <naveenkrishna.chatradhi@amd.com>
  R:    Carlos Bilbao <carlos.bilbao@amd.com>
@@@ -1062,7 -1045,6 +1062,7 @@@ L:      linux-pm@vger.kernel.or
  S:    Supported
  F:    Documentation/admin-guide/pm/amd-pstate.rst
  F:    drivers/cpufreq/amd-pstate*
 +F:    include/linux/amd-pstate.h
  F:    tools/power/x86/amd_pstate_tracer/amd_pstate_trace.py
  
  AMD PTDMA DRIVER
@@@ -1170,7 -1152,7 +1170,7 @@@ ANALOG DEVICES INC AD74413R DRIVE
  M:    Cosmin Tanislav <cosmin.tanislav@analog.com>
  L:    linux-iio@vger.kernel.org
  S:    Supported
 -W:    http://ez.analog.com/community/linux-device-drivers
 +W:    https://ez.analog.com/linux-software-drivers
  F:    Documentation/devicetree/bindings/iio/addac/adi,ad74413r.yaml
  F:    drivers/iio/addac/ad74413r.c
  F:    include/dt-bindings/iio/addac/adi,ad74413r.h
@@@ -1345,23 -1327,13 +1345,23 @@@ W:   https://ez.analog.com/linux-software
  F:    Documentation/ABI/testing/sysfs-bus-iio-frequency-ad9523
  F:    Documentation/ABI/testing/sysfs-bus-iio-frequency-adf4350
  F:    Documentation/devicetree/bindings/iio/*/adi,*
 -F:    Documentation/devicetree/bindings/iio/dac/adi,ad5758.yaml
 +F:    Documentation/devicetree/bindings/iio/adc/lltc,ltc2496.yaml
 +F:    Documentation/devicetree/bindings/iio/adc/lltc,ltc2497.yaml
  F:    drivers/iio/*/ad*
  F:    drivers/iio/adc/ltc249*
  F:    drivers/iio/amplifiers/hmc425a.c
  F:    drivers/staging/iio/*/ad*
  X:    drivers/iio/*/adjd*
  
 +ANALOG DEVICES INC MAX31760 DRIVER
 +M:    Ibrahim Tilki <Ibrahim.Tilki@analog.com>
 +S:    Maintained
 +W:    http://wiki.analog.com/
 +W:    https://ez.analog.com/linux-software-drivers
 +F:    Documentation/devicetree/bindings/hwmon/adi,max31760.yaml
 +F:    Documentation/hwmon/max31760.rst
 +F:    drivers/hwmon/max31760.c
 +
  ANALOGBITS PLL LIBRARIES
  M:    Paul Walmsley <paul.walmsley@sifive.com>
  S:    Supported
@@@ -1410,7 -1382,7 +1410,7 @@@ APEX EMBEDDED SYSTEMS STX104 IIO DRIVE
  M:    William Breathitt Gray <william.gray@linaro.org>
  L:    linux-iio@vger.kernel.org
  S:    Maintained
 -F:    drivers/iio/adc/stx104.c
 +F:    drivers/iio/addac/stx104.c
  
  APM DRIVER
  M:    Jiri Kosina <jikos@kernel.org>
@@@ -1831,7 -1803,7 +1831,7 @@@ N:      sun[x456789]
  N:    sun50i
  
  ARM/Amlogic Meson SoC CLOCK FRAMEWORK
 -M:    Neil Armstrong <narmstrong@baylibre.com>
 +M:    Neil Armstrong <neil.armstrong@linaro.org>
  M:    Jerome Brunet <jbrunet@baylibre.com>
  L:    linux-amlogic@lists.infradead.org
  S:    Maintained
@@@ -1856,7 -1828,7 +1856,7 @@@ F:      Documentation/devicetree/bindings/so
  F:    sound/soc/meson/
  
  ARM/Amlogic Meson SoC support
 -M:    Neil Armstrong <narmstrong@baylibre.com>
 +M:    Neil Armstrong <neil.armstrong@linaro.org>
  M:    Kevin Hilman <khilman@baylibre.com>
  R:    Jerome Brunet <jbrunet@baylibre.com>
  R:    Martin Blumenstingl <martin.blumenstingl@googlemail.com>
@@@ -1915,7 -1887,6 +1915,7 @@@ F:      drivers/dma/apple-admac.
  F:    drivers/i2c/busses/i2c-pasemi-core.c
  F:    drivers/i2c/busses/i2c-pasemi-platform.c
  F:    drivers/iommu/apple-dart.c
 +F:    drivers/iommu/io-pgtable-dart.c
  F:    drivers/irqchip/irq-apple-aic.c
  F:    drivers/mailbox/apple-mailbox.c
  F:    drivers/nvme/host/apple.c
@@@ -1928,15 -1899,6 +1928,15 @@@ F:    include/dt-bindings/pinctrl/apple.
  F:    include/linux/apple-mailbox.h
  F:    include/linux/soc/apple/*
  
 +ARM/APPLE MACHINE SOUND DRIVERS
 +M:    Martin PoviÅ¡er <povik+lin@cutebit.org>
 +L:    asahi@lists.linux.dev
 +L:    alsa-devel@alsa-project.org (moderated for non-subscribers)
 +S:    Maintained
 +F:    Documentation/devicetree/bindings/sound/apple,*
 +F:    sound/soc/apple/*
 +F:    sound/soc/codecs/cs42l83-i2c.c
 +
  ARM/ARTPEC MACHINE SUPPORT
  M:    Jesper Nilsson <jesper.nilsson@axis.com>
  M:    Lars Persson <lars.persson@axis.com>
@@@ -2067,7 -2029,6 +2067,7 @@@ F:      drivers/hwtracing/coresight/
  F:    include/dt-bindings/arm/coresight-cti-dt.h
  F:    include/linux/coresight*
  F:    samples/coresight/*
 +F:    tools/perf/tests/shell/coresight/*
  F:    tools/perf/arch/arm/util/auxtrace.c
  F:    tools/perf/arch/arm/util/cs-etm.c
  F:    tools/perf/arch/arm/util/cs-etm.h
@@@ -2433,7 -2394,6 +2433,7 @@@ N:      atme
  ARM/Microchip Sparx5 SoC support
  M:    Lars Povlsen <lars.povlsen@microchip.com>
  M:    Steen Hegelund <Steen.Hegelund@microchip.com>
 +M:    Daniel Machon <daniel.machon@microchip.com>
  M:    UNGLinuxDriver@microchip.com
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
  S:    Supported
@@@ -2571,7 -2531,7 +2571,7 @@@ W:      http://www.digriz.org.uk/ts78xx/kern
  F:    arch/arm/mach-orion5x/ts78xx-*
  
  ARM/OXNAS platform support
 -M:    Neil Armstrong <narmstrong@baylibre.com>
 +M:    Neil Armstrong <neil.armstrong@linaro.org>
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
  L:    linux-oxnas@groups.io (moderated for non-subscribers)
  S:    Maintained
@@@ -2619,7 -2579,7 +2619,7 @@@ W:      http://www.armlinux.org.uk
  
  ARM/QUALCOMM SUPPORT
  M:    Andy Gross <agross@kernel.org>
 -M:    Bjorn Andersson <bjorn.andersson@linaro.org>
 +M:    Bjorn Andersson <andersson@kernel.org>
  R:    Konrad Dybcio <konrad.dybcio@somainline.org>
  L:    linux-arm-msm@vger.kernel.org
  S:    Maintained
@@@ -2628,7 -2588,6 +2628,7 @@@ F:      Documentation/devicetree/bindings/*/
  F:    Documentation/devicetree/bindings/soc/qcom/
  F:    arch/arm/boot/dts/qcom-*.dts
  F:    arch/arm/boot/dts/qcom-*.dtsi
 +F:    arch/arm/configs/qcom_defconfig
  F:    arch/arm/mach-qcom/
  F:    arch/arm64/boot/dts/qcom/
  F:    drivers/*/*/qcom*
@@@ -2691,7 -2650,7 +2691,7 @@@ F:      arch/arm/boot/dts/rtd
  F:    arch/arm/mach-realtek/
  F:    arch/arm64/boot/dts/realtek/
  
 -ARM/RENESAS ARM64 ARCHITECTURE
 +ARM/RENESAS ARCHITECTURE
  M:    Geert Uytterhoeven <geert+renesas@glider.be>
  M:    Magnus Damm <magnus.damm@gmail.com>
  L:    linux-renesas-soc@vger.kernel.org
@@@ -2702,16 -2661,6 +2702,16 @@@ T:    git git://git.kernel.org/pub/scm/lin
  F:    Documentation/devicetree/bindings/arm/renesas.yaml
  F:    Documentation/devicetree/bindings/hwinfo/renesas,prr.yaml
  F:    Documentation/devicetree/bindings/soc/renesas/
 +F:    arch/arm/boot/dts/emev2*
 +F:    arch/arm/boot/dts/gr-peach*
 +F:    arch/arm/boot/dts/iwg20d-q7*
 +F:    arch/arm/boot/dts/r7s*
 +F:    arch/arm/boot/dts/r8a*
 +F:    arch/arm/boot/dts/r9a*
 +F:    arch/arm/boot/dts/sh*
 +F:    arch/arm/configs/shmobile_defconfig
 +F:    arch/arm/include/debug/renesas-scif.S
 +F:    arch/arm/mach-shmobile/
  F:    arch/arm64/boot/dts/renesas/
  F:    drivers/soc/renesas/
  F:    include/linux/soc/renesas/
@@@ -2721,6 -2670,7 +2721,6 @@@ M:      Russell King <linux@armlinux.org.uk
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
  S:    Maintained
  W:    http://www.armlinux.org.uk/
 -F:    arch/arm/include/asm/hardware/entry-macro-iomd.S
  F:    arch/arm/include/asm/hardware/ioc.h
  F:    arch/arm/include/asm/hardware/iomd.h
  F:    arch/arm/include/asm/hardware/memc.h
@@@ -2822,6 -2772,29 +2822,6 @@@ L:     linux-media@vger.kernel.or
  S:    Maintained
  F:    drivers/media/platform/samsung/s5p-mfc/
  
 -ARM/SHMOBILE ARM ARCHITECTURE
 -M:    Geert Uytterhoeven <geert+renesas@glider.be>
 -M:    Magnus Damm <magnus.damm@gmail.com>
 -L:    linux-renesas-soc@vger.kernel.org
 -S:    Supported
 -Q:    http://patchwork.kernel.org/project/linux-renesas-soc/list/
 -C:    irc://irc.libera.chat/renesas-soc
 -T:    git git://git.kernel.org/pub/scm/linux/kernel/git/geert/renesas-devel.git next
 -F:    Documentation/devicetree/bindings/arm/renesas.yaml
 -F:    Documentation/devicetree/bindings/soc/renesas/
 -F:    arch/arm/boot/dts/emev2*
 -F:    arch/arm/boot/dts/gr-peach*
 -F:    arch/arm/boot/dts/iwg20d-q7*
 -F:    arch/arm/boot/dts/r7s*
 -F:    arch/arm/boot/dts/r8a*
 -F:    arch/arm/boot/dts/r9a*
 -F:    arch/arm/boot/dts/sh*
 -F:    arch/arm/configs/shmobile_defconfig
 -F:    arch/arm/include/debug/renesas-scif.S
 -F:    arch/arm/mach-shmobile/
 -F:    drivers/soc/renesas/
 -F:    include/linux/soc/renesas/
 -
  ARM/SOCFPGA ARCHITECTURE
  M:    Dinh Nguyen <dinguyen@kernel.org>
  S:    Maintained
@@@ -3114,8 -3087,6 +3114,8 @@@ W:      http://wiki.xilinx.co
  T:    git https://github.com/Xilinx/linux-xlnx.git
  F:    Documentation/devicetree/bindings/i2c/cdns,i2c-r1p10.yaml
  F:    Documentation/devicetree/bindings/i2c/xlnx,xps-iic-2.00.a.yaml
 +F:    Documentation/devicetree/bindings/memory-controllers/snps,dw-umctl2-ddrc.yaml
 +F:    Documentation/devicetree/bindings/memory-controllers/xlnx,zynq-ddrc-a05.yaml
  F:    Documentation/devicetree/bindings/spi/xlnx,zynq-qspi.yaml
  F:    arch/arm/mach-zynq/
  F:    drivers/clocksource/timer-cadence-ttc.c
@@@ -3239,13 -3210,6 +3239,13 @@@ S:    Maintaine
  F:    Documentation/devicetree/bindings/usb/aspeed,ast2600-udc.yaml
  F:    drivers/usb/gadget/udc/aspeed_udc.c
  
 +ASPEED CRYPTO DRIVER
 +M:    Neal Liu <neal_liu@aspeedtech.com>
 +L:    linux-aspeed@lists.ozlabs.org (moderated for non-subscribers)
 +S:    Maintained
 +F:    Documentation/devicetree/bindings/crypto/aspeed,ast2500-hace.yaml
 +F:    drivers/crypto/aspeed/
 +
  ASUS NOTEBOOKS AND EEEPC ACPI/WMI EXTRAS DRIVERS
  M:    Corentin Chary <corentin.chary@gmail.com>
  L:    acpi4asus-user@lists.sourceforge.net
@@@ -3269,6 -3233,13 +3269,6 @@@ L:     linux-hwmon@vger.kernel.or
  S:    Maintained
  F:    drivers/hwmon/asus_wmi_sensors.c
  
 -ASUS WMI EC HARDWARE MONITOR DRIVER
 -M:    Eugene Shalygin <eugene.shalygin@gmail.com>
 -M:    Denis Pauk <pauk.denis@gmail.com>
 -L:    linux-hwmon@vger.kernel.org
 -S:    Maintained
 -F:    drivers/hwmon/asus_wmi_ec_sensors.c
 -
  ASUS EC HARDWARE MONITOR DRIVER
  M:    Eugene Shalygin <eugene.shalygin@gmail.com>
  L:    linux-hwmon@vger.kernel.org
@@@ -3641,7 -3612,6 +3641,7 @@@ F:      include/linux/find.
  F:    include/linux/nodemask.h
  F:    lib/bitmap.c
  F:    lib/cpumask.c
 +F:    lib/cpumask_kunit.c
  F:    lib/find_bit.c
  F:    lib/find_bit_benchmark.c
  F:    lib/test_bitmap.c
@@@ -3709,7 -3679,6 +3709,7 @@@ F:      Documentation/networking/bonding.rs
  F:    drivers/net/bonding/
  F:    include/net/bond*
  F:    include/uapi/linux/if_bonding.h
 +F:    tools/testing/selftests/drivers/net/bonding/
  
  BOSCH SENSORTEC BMA400 ACCELEROMETER IIO DRIVER
  M:    Dan Robertson <dan@dlrobertson.com>
@@@ -3854,7 -3823,6 +3854,7 @@@ F:      kernel/bpf/dispatcher.
  F:    kernel/bpf/trampoline.c
  F:    include/linux/bpf*
  F:    include/linux/filter.h
 +F:    include/linux/tnum.h
  
  BPF [BTF]
  M:    Martin KaFai Lau <martin.lau@linux.dev>
@@@ -3980,7 -3948,6 +3980,7 @@@ M:      William Zhang <william.zhang@broadco
  M:    Anand Gore <anand.gore@broadcom.com>
  M:    Kursad Oney <kursad.oney@broadcom.com>
  M:    Florian Fainelli <f.fainelli@gmail.com>
 +M:    RafaÅ‚ MiÅ‚ecki <rafal@milecki.pl>
  R:    Broadcom internal kernel review list <bcm-kernel-feedback-list@broadcom.com>
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
  S:    Maintained
@@@ -4459,15 -4426,13 +4459,15 @@@ M:   Josef Bacik <josef@toxicpanda.com
  M:    David Sterba <dsterba@suse.com>
  L:    linux-btrfs@vger.kernel.org
  S:    Maintained
 -W:    http://btrfs.wiki.kernel.org/
 -Q:    http://patchwork.kernel.org/project/linux-btrfs/list/
 +W:    https://btrfs.readthedocs.io
 +W:    https://btrfs.wiki.kernel.org/
 +Q:    https://patchwork.kernel.org/project/linux-btrfs/list/
  C:    irc://irc.libera.chat/btrfs
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/kdave/linux.git
  F:    Documentation/filesystems/btrfs.rst
  F:    fs/btrfs/
  F:    include/linux/btrfs*
 +F:    include/trace/events/btrfs.h
  F:    include/uapi/linux/btrfs*
  
  BTTV VIDEO4LINUX DRIVER
@@@ -4929,7 -4894,6 +4929,7 @@@ M:      Prashant Malani <pmalani@chromium.or
  L:    chrome-platform@lists.linux.dev
  S:    Maintained
  F:    drivers/platform/chrome/cros_ec_typec.c
 +F:    drivers/platform/chrome/cros_typec_switch.c
  
  CHROMEOS EC USB PD NOTIFY DRIVER
  M:    Prashant Malani <pmalani@chromium.org>
@@@ -4993,7 -4957,7 +4993,7 @@@ F:      drivers/hwmon/lochnagar-hwmon.
  F:    drivers/mfd/lochnagar-i2c.c
  F:    drivers/pinctrl/cirrus/pinctrl-lochnagar.c
  F:    drivers/regulator/lochnagar-regulator.c
 -F:    include/dt-bindings/clk/lochnagar.h
 +F:    include/dt-bindings/clock/lochnagar.h
  F:    include/dt-bindings/pinctrl/lochnagar.h
  F:    include/linux/mfd/lochnagar*
  F:    sound/soc/codecs/lochnagar-sc.c
@@@ -5173,7 -5137,6 +5173,7 @@@ M:      Steve French <sfrench@samba.org
  R:    Paulo Alcantara <pc@cjr.nz> (DFS, global name space)
  R:    Ronnie Sahlberg <lsahlber@redhat.com> (directory leases, sparse files)
  R:    Shyam Prasad N <sprasad@microsoft.com> (multichannel)
 +R:    Tom Talpey <tom@talpey.com> (RDMA, smbdirect)
  L:    linux-cifs@vger.kernel.org
  L:    samba-technical@lists.samba.org (moderated for non-subscribers)
  S:    Supported
@@@ -5268,7 -5231,6 +5268,7 @@@ F:      tools/testing/selftests/cgroup
  
  CONTROL GROUP - BLOCK IO CONTROLLER (BLKIO)
  M:    Tejun Heo <tj@kernel.org>
 +M:    Josef Bacik <josef@toxicpanda.com>
  M:    Jens Axboe <axboe@kernel.dk>
  L:    cgroups@vger.kernel.org
  L:    linux-block@vger.kernel.org
@@@ -5276,13 -5238,11 +5276,13 @@@ T:   git git://git.kernel.dk/linux-bloc
  F:    Documentation/admin-guide/cgroup-v1/blkio-controller.rst
  F:    block/bfq-cgroup.c
  F:    block/blk-cgroup.c
 +F:    block/blk-iocost.c
  F:    block/blk-iolatency.c
  F:    block/blk-throttle.c
  F:    include/linux/blk-cgroup.h
  
  CONTROL GROUP - CPUSET
 +M:    Waiman Long <longman@redhat.com>
  M:    Zefan Li <lizefan.x@bytedance.com>
  L:    cgroups@vger.kernel.org
  S:    Maintained
@@@ -5330,7 -5290,7 +5330,7 @@@ COUNTER SUBSYSTE
  M:    William Breathitt Gray <william.gray@linaro.org>
  L:    linux-iio@vger.kernel.org
  S:    Maintained
 -T:    git https://git.linaro.org/people/william.gray/counter.git
 +T:    git git://git.kernel.org/pub/scm/linux/kernel/git/wbg/counter.git
  F:    Documentation/ABI/testing/sysfs-bus-counter
  F:    Documentation/driver-api/generic-counter.rst
  F:    drivers/counter/
@@@ -5411,8 -5371,8 +5411,8 @@@ T:      git git://git.kernel.org/pub/scm/lin
  F:    drivers/cpuidle/cpuidle-big_little.c
  
  CPUIDLE DRIVER - ARM EXYNOS
 -M:    Bartlomiej Zolnierkiewicz <b.zolnierkie@samsung.com>
  M:    Daniel Lezcano <daniel.lezcano@linaro.org>
 +R:    Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
  M:    Kukjin Kim <kgene@kernel.org>
  L:    linux-pm@vger.kernel.org
  L:    linux-samsung-soc@vger.kernel.org
@@@ -5670,12 -5630,6 +5670,12 @@@ Q:    http://patchwork.linuxtv.org/project
  T:    git git://linuxtv.org/anttip/media_tree.git
  F:    drivers/media/common/cypress_firmware*
  
 +CYPRESS CY8C95X0 PINCTRL DRIVER
 +M:    Patrick Rudolph <patrick.rudolph@9elements.com>
 +L:    linux-gpio@vger.kernel.org
 +S:    Maintained
 +F:    drivers/pinctrl/pinctrl-cy8c95x0.c
 +
  CYPRESS CY8CTMA140 TOUCHSCREEN DRIVER
  M:    Linus Walleij <linus.walleij@linaro.org>
  L:    linux-input@vger.kernel.org
@@@ -5766,6 -5720,13 +5766,6 @@@ F:     include/linux/tfrc.
  F:    include/uapi/linux/dccp.h
  F:    net/dccp/
  
 -DECnet NETWORK LAYER
 -L:    linux-decnet-user@lists.sourceforge.net
 -S:    Orphan
 -W:    http://linux-decnet.sourceforge.net
 -F:    Documentation/networking/decnet.rst
 -F:    net/decnet/
 -
  DECSTATION PLATFORM SUPPORT
  M:    "Maciej W. Rozycki" <macro@orcam.me.uk>
  L:    linux-mips@vger.kernel.org
@@@ -5934,9 -5895,10 +5934,9 @@@ T:     git git://git.kernel.org/pub/scm/lin
  F:    drivers/usb/dwc2/
  
  DESIGNWARE USB3 DRD IP DRIVER
 -M:    Felipe Balbi <balbi@kernel.org>
 +M:    Thinh Nguyen <Thinh.Nguyen@synopsys.com>
  L:    linux-usb@vger.kernel.org
  S:    Maintained
 -T:    git git://git.kernel.org/pub/scm/linux/kernel/git/balbi/usb.git
  F:    drivers/usb/dwc3/
  
  DEVANTECH SRF ULTRASONIC RANGER IIO DRIVER
@@@ -6183,7 -6145,6 +6183,7 @@@ F:      include/asm-generic/dma-mapping.
  F:    include/linux/dma-direct.h
  F:    include/linux/dma-mapping.h
  F:    include/linux/dma-map-ops.h
 +F:    include/linux/swiotlb.h
  F:    kernel/dma/
  
  DMA MAPPING BENCHMARK
@@@ -6218,7 -6179,7 +6218,7 @@@ F:      Documentation/devicetree/bindings/me
  F:    drivers/memory/samsung/exynos5422-dmc.c
  
  DME1737 HARDWARE MONITOR DRIVER
 -M:    Juerg Haefliger <juergh@gmail.com>
 +M:    Juerg Haefliger <juergh@proton.me>
  L:    linux-hwmon@vger.kernel.org
  S:    Maintained
  F:    Documentation/hwmon/dme1737.rst
@@@ -6284,7 -6245,7 +6284,7 @@@ M:      Sakari Ailus <sakari.ailus@linux.int
  L:    linux-media@vger.kernel.org
  S:    Maintained
  T:    git git://linuxtv.org/media_tree.git
 -F:    Documentation/devicetree/bindings/media/i2c/dongwoon,dw9714.txt
 +F:    Documentation/devicetree/bindings/media/i2c/dongwoon,dw9714.yaml
  F:    drivers/media/i2c/dw9714.c
  
  DONGWOON DW9768 LENS VOICE COIL DRIVER
@@@ -6692,7 -6653,6 +6692,7 @@@ L:      dri-devel@lists.freedesktop.or
  S:    Maintained
  T:    git git://anongit.freedesktop.org/drm/drm-misc
  F:    drivers/gpu/drm/drm_aperture.c
 +F:    drivers/gpu/drm/tiny/ofdrm.c
  F:    drivers/gpu/drm/tiny/simpledrm.c
  F:    drivers/video/aperture.c
  F:    include/drm/drm_aperture.h
@@@ -6796,7 -6756,7 +6796,7 @@@ F:      Documentation/devicetree/bindings/di
  F:    drivers/gpu/drm/panel/panel-widechips-ws2401.c
  
  DRM DRIVERS
 -M:    David Airlie <airlied@linux.ie>
 +M:    David Airlie <airlied@gmail.com>
  M:    Daniel Vetter <daniel@ffwll.ch>
  L:    dri-devel@lists.freedesktop.org
  S:    Maintained
@@@ -6835,7 -6795,7 +6835,7 @@@ F:      Documentation/devicetree/bindings/di
  F:    drivers/gpu/drm/sun4i/
  
  DRM DRIVERS FOR AMLOGIC SOCS
 -M:    Neil Armstrong <narmstrong@baylibre.com>
 +M:    Neil Armstrong <neil.armstrong@linaro.org>
  L:    dri-devel@lists.freedesktop.org
  L:    linux-amlogic@lists.infradead.org
  S:    Supported
@@@ -6857,7 -6817,7 +6857,7 @@@ F:      drivers/gpu/drm/atmel-hlcdc
  
  DRM DRIVERS FOR BRIDGE CHIPS
  M:    Andrzej Hajda <andrzej.hajda@intel.com>
 -M:    Neil Armstrong <narmstrong@baylibre.com>
 +M:    Neil Armstrong <neil.armstrong@linaro.org>
  M:    Robert Foss <robert.foss@linaro.org>
  R:    Laurent Pinchart <Laurent.pinchart@ideasonboard.com>
  R:    Jonas Karlman <jonas@kwiboo.se>
@@@ -7250,8 -7210,6 +7250,8 @@@ M:      Jason Baron <jbaron@akamai.com
  S:    Maintained
  F:    include/linux/dynamic_debug.h
  F:    lib/dynamic_debug.c
 +M:    Jim Cromie <jim.cromie@gmail.com>
 +F:    lib/test_dynamic_debug.c
  
  DYNAMIC INTERRUPT MODERATION
  M:    Tal Gilboa <talgi@nvidia.com>
@@@ -7579,7 -7537,7 +7579,7 @@@ M:      Adrian Hunter <adrian.hunter@intel.c
  M:    Ritesh Harjani <riteshh@codeaurora.org>
  M:    Asutosh Das <asutoshd@codeaurora.org>
  L:    linux-mmc@vger.kernel.org
 -S:    Maintained
 +S:    Supported
  F:    drivers/mmc/host/cqhci*
  
  EMULEX 10Gbps iSCSI - OneConnect DRIVER
@@@ -7732,6 -7690,7 +7732,6 @@@ R:      Kees Cook <keescook@chromium.org
  L:    linux-mm@kvack.org
  S:    Supported
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/kees/linux.git for-next/execve
 -F:    arch/alpha/kernel/binfmt_loader.c
  F:    fs/*binfmt_*.c
  F:    fs/exec.c
  F:    include/linux/binfmts.h
@@@ -8048,7 -8007,6 +8048,7 @@@ L:      linux-hardening@vger.kernel.or
  S:    Supported
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/kees/linux.git for-next/hardening
  F:    include/linux/fortify-string.h
 +F:    lib/fortify_kunit.c
  F:    lib/test_fortify/*
  F:    scripts/test_fortify.sh
  K:    \b__NO_FORTIFY\b
@@@ -8455,19 -8413,6 +8455,19 @@@ L:    platform-driver-x86@vger.kernel.or
  S:    Maintained
  F:    drivers/platform/x86/fujitsu-tablet.c
  
 +FUNCTION HOOKS (FTRACE)
 +M:    Steven Rostedt <rostedt@goodmis.org>
 +M:    Masami Hiramatsu <mhiramat@kernel.org>
 +R:    Mark Rutland <mark.rutland@arm.com>
 +S:    Maintained
 +T:    git git://git.kernel.org/pub/scm/linux/kernel/git/trace/linux-trace.git
 +F:    Documentation/trace/ftrace*
 +F:    kernel/trace/ftrace*
 +F:    kernel/trace/fgraph.c
 +F:    arch/*/*/*/*ftrace*
 +F:    arch/*/*/*ftrace*
 +F:    include/*/ftrace.h
 +
  FUNGIBLE ETHERNET DRIVERS
  M:    Dimitris Michailidis <dmichail@fungible.com>
  L:    netdev@vger.kernel.org
@@@ -8504,6 -8449,7 +8504,6 @@@ F:      tools/testing/selftests/futex
  
  GATEWORKS SYSTEM CONTROLLER (GSC) DRIVER
  M:    Tim Harvey <tharvey@gateworks.com>
 -M:    Robert Jones <rjones@gateworks.com>
  S:    Maintained
  F:    Documentation/devicetree/bindings/mfd/gateworks-gsc.yaml
  F:    drivers/mfd/gateworks-gsc.c
@@@ -8709,8 -8655,8 +8709,8 @@@ F:      drivers/input/touchscreen/goodix
  
  GOOGLE ETHERNET DRIVERS
  M:    Jeroen de Borst <jeroendb@google.com>
 -R:    Catherine Sullivan <csully@google.com>
 -R:    David Awogbemila <awogbemila@google.com>
 +M:    Catherine Sullivan <csully@google.com>
 +R:    Shailend Chand <shailend@google.com>
  L:    netdev@vger.kernel.org
  S:    Supported
  F:    Documentation/networking/device_drivers/ethernet/google/gve.rst
@@@ -8943,7 -8889,6 +8943,7 @@@ T:      git https://git.kernel.org/pub/scm/l
  F:    Documentation/ABI/testing/debugfs-driver-habanalabs
  F:    Documentation/ABI/testing/sysfs-driver-habanalabs
  F:    drivers/misc/habanalabs/
 +F:    include/trace/events/habanalabs.h
  F:    include/uapi/misc/habanalabs.h
  
  HACKRF MEDIA DRIVER
@@@ -8965,7 -8910,7 +8965,7 @@@ S:      Maintaine
  F:    Documentation/devicetree/bindings/media/nxp,imx8mq-vpu.yaml
  F:    Documentation/devicetree/bindings/media/rockchip,rk3568-vepu.yaml
  F:    Documentation/devicetree/bindings/media/rockchip-vpu.yaml
 -F:    drivers/staging/media/hantro/
 +F:    drivers/media/platform/verisilicon/
  
  HARD DRIVE ACTIVE PROTECTION SYSTEM (HDAPS) DRIVER
  M:    Frank Seidel <frank@f-seidel.de>
@@@ -9001,7 -8946,7 +9001,7 @@@ F:      include/linux/hw_random.
  
  HARDWARE SPINLOCK CORE
  M:    Ohad Ben-Cohen <ohad@wizery.com>
 -M:    Bjorn Andersson <bjorn.andersson@linaro.org>
 +M:    Bjorn Andersson <andersson@kernel.org>
  R:    Baolin Wang <baolin.wang7@gmail.com>
  L:    linux-remoteproc@vger.kernel.org
  S:    Maintained
@@@ -9111,12 -9056,6 +9111,12 @@@ L:    linux-input@vger.kernel.or
  S:    Supported
  F:    drivers/hid/hid-playstation.c
  
 +HID PHOENIX RC FLIGHT CONTROLLER
 +M:    Marcus Folkesson <marcus.folkesson@gmail.com>
 +L:    linux-input@vger.kernel.org
 +S:    Maintained
 +F:    drivers/hid/hid-pxrc.c
 +
  HID SENSOR HUB DRIVERS
  M:    Jiri Kosina <jikos@kernel.org>
  M:    Jonathan Cameron <jic23@kernel.org>
@@@ -9129,12 -9068,6 +9129,12 @@@ F:    drivers/hid/hid-sensor-
  F:    drivers/iio/*/hid-*
  F:    include/linux/hid-sensor-*
  
 +HID VRC-2 CAR CONTROLLER DRIVER
 +M:    Marcus Folkesson <marcus.folkesson@gmail.com>
 +L:    linux-input@vger.kernel.org
 +S:    Maintained
 +F:    drivers/hid/hid-vrc2.c
 +
  HID WACOM DRIVER
  M:    Ping Cheng <ping.cheng@wacom.com>
  M:    Jason Gerecke  <jason.gerecke@wacom.com>
@@@ -9187,13 -9120,12 +9187,13 @@@ F:   net/dsa/tag_hellcreek.
  
  HISILICON DMA DRIVER
  M:    Zhou Wang <wangzhou1@hisilicon.com>
 +M:    Jie Hai <haijie1@hisilicon.com>
  L:    dmaengine@vger.kernel.org
  S:    Maintained
  F:    drivers/dma/hisi_dma.c
  
  HISILICON GPIO DRIVER
 -M:    Luo Jiaxing <luojiaxing@huawei.com>
 +M:    Jay Fang <f.fangjian@huawei.com>
  L:    linux-gpio@vger.kernel.org
  S:    Maintained
  F:    drivers/gpio/gpio-hisi.c
@@@ -9259,14 -9191,6 +9259,14 @@@ S:    Supporte
  F:    Documentation/admin-guide/perf/hns3-pmu.rst
  F:    drivers/perf/hisilicon/hns3_pmu.c
  
 +HISILICON PTT DRIVER
 +M:    Yicong Yang <yangyicong@hisilicon.com>
 +L:    linux-kernel@vger.kernel.org
 +S:    Maintained
 +F:    Documentation/ABI/testing/sysfs-devices-hisi_ptt
 +F:    Documentation/trace/hisi-ptt.rst
 +F:    drivers/hwtracing/ptt/
 +
  HISILICON QM DRIVER
  M:    Weili Qian <qianweili@huawei.com>
  M:    Zhou Wang <wangzhou1@hisilicon.com>
@@@ -9287,8 -9211,8 +9287,8 @@@ F:      Documentation/ABI/testing/debugfs-hi
  F:    drivers/crypto/hisilicon/zip/
  
  HISILICON ROCE DRIVER
 +M:    Haoyue Xu <xuhaoyue1@hisilicon.com>
  M:    Wenpeng Liang <liangwenpeng@huawei.com>
 -M:    Weihang Li <liweihang@huawei.com>
  L:    linux-rdma@vger.kernel.org
  S:    Maintained
  F:    Documentation/devicetree/bindings/infiniband/hisilicon-hns-roce.txt
@@@ -9725,13 -9649,6 +9725,13 @@@ S:    Orpha
  F:    Documentation/ia64/
  F:    arch/ia64/
  
 +IBM Operation Panel Input Driver
 +M:    Eddie James <eajames@linux.ibm.com>
 +L:    linux-input@vger.kernel.org
 +S:    Maintained
 +F:    Documentation/devicetree/bindings/input/ibm,op-panel.yaml
 +F:    drivers/input/misc/ibm-panel.c
 +
  IBM Power 842 compression accelerator
  M:    Haren Myneni <haren@us.ibm.com>
  S:    Supported
@@@ -9869,7 -9786,7 +9869,7 @@@ M:      Christian Brauner <brauner@kernel.or
  M:    Seth Forshee <sforshee@kernel.org>
  L:    linux-fsdevel@vger.kernel.org
  S:    Maintained
 -T:    git git://git.kernel.org/pub/scm/linux/kernel/git/brauner/linux.git
 +T:    git://git.kernel.org/pub/scm/linux/kernel/git/vfs/idmapping.git
  F:    Documentation/filesystems/idmappings.rst
  F:    tools/testing/selftests/mount_setattr/
  F:    include/linux/mnt_idmapping.h
@@@ -10118,7 -10035,6 +10118,7 @@@ F:   Documentation/devicetree/bindings/in
  F:    Documentation/devicetree/bindings/serio/
  F:    Documentation/input/
  F:    drivers/input/
 +F:    include/dt-bindings/input/
  F:    include/linux/input.h
  F:    include/linux/input/
  F:    include/uapi/linux/input-event-codes.h
@@@ -10224,6 -10140,7 +10224,7 @@@ Q:   http://patchwork.freedesktop.org/pro
  B:    https://gitlab.freedesktop.org/drm/intel/-/wikis/How-to-file-i915-bugs
  C:    irc://irc.oftc.net/intel-gfx
  T:    git git://anongit.freedesktop.org/drm-intel
+ F:    Documentation/ABI/testing/sysfs-driver-intel-i915-hwmon
  F:    Documentation/gpu/i915.rst
  F:    drivers/gpu/drm/i915/
  F:    include/drm/i915*
@@@ -10464,6 -10381,7 +10465,6 @@@ INTEL MENLOW THERMAL DRIVE
  M:    Sujith Thomas <sujith.thomas@intel.com>
  L:    linux-pm@vger.kernel.org
  S:    Supported
 -W:    https://01.org/linux-acpi
  F:    drivers/thermal/intel/intel_menlow.c
  
  INTEL P-Unit IPC DRIVER
@@@ -10711,8 -10629,8 +10712,8 @@@ L:   iommu@lists.linux.de
  S:    Maintained
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/joro/iommu.git
  F:    drivers/iommu/dma-iommu.c
 +F:    drivers/iommu/dma-iommu.h
  F:    drivers/iommu/iova.c
 -F:    include/linux/dma-iommu.h
  F:    include/linux/iova.h
  
  IOMMU SUBSYSTEM
@@@ -10746,7 -10664,6 +10747,7 @@@ T:   git git://git.kernel.dk/linux-bloc
  T:    git git://git.kernel.dk/liburing
  F:    io_uring/
  F:    include/linux/io_uring.h
 +F:    include/linux/io_uring_types.h
  F:    include/uapi/linux/io_uring.h
  F:    tools/io_uring/
  
@@@ -10913,7 -10830,7 +10914,7 @@@ F:   drivers/media/tuners/it913x
  
  ITE IT66121 HDMI BRIDGE DRIVER
  M:    Phong LE <ple@baylibre.com>
 -M:    Neil Armstrong <narmstrong@baylibre.com>
 +M:    Neil Armstrong <neil.armstrong@linaro.org>
  S:    Maintained
  T:    git git://anongit.freedesktop.org/drm/drm-misc
  F:    Documentation/devicetree/bindings/display/bridge/ite,it66121.yaml
@@@ -11024,6 -10941,7 +11025,6 @@@ F:   arch/*/include/asm/*kasan.
  F:    arch/*/mm/kasan_init*
  F:    include/linux/kasan*.h
  F:    lib/Kconfig.kasan
 -F:    lib/test_kasan*.c
  F:    mm/kasan/
  F:    scripts/Makefile.kasan
  
@@@ -11157,8 -11075,8 +11158,8 @@@ F:   tools/testing/selftests
  KERNEL SMB3 SERVER (KSMBD)
  M:    Namjae Jeon <linkinjeon@kernel.org>
  M:    Steve French <sfrench@samba.org>
 -M:    Hyunchul Lee <hyc.lee@gmail.com>
  R:    Sergey Senozhatsky <senozhatsky@chromium.org>
 +R:    Tom Talpey <tom@talpey.com>
  L:    linux-cifs@vger.kernel.org
  S:    Maintained
  T:    git git://git.samba.org/ksmbd.git
@@@ -11209,8 -11127,7 +11210,8 @@@ R:   Alexandru Elisei <alexandru.elisei@a
  R:    Suzuki K Poulose <suzuki.poulose@arm.com>
  R:    Oliver Upton <oliver.upton@linux.dev>
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
 -L:    kvmarm@lists.cs.columbia.edu (moderated for non-subscribers)
 +L:    kvmarm@lists.linux.dev
 +L:    kvmarm@lists.cs.columbia.edu (deprecated, moderated for non-subscribers)
  S:    Maintained
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/kvmarm/kvmarm.git
  F:    arch/arm64/include/asm/kvm*
@@@ -11432,7 -11349,7 +11433,7 @@@ F:   kernel/debug
  F:    kernel/module/kdb.c
  
  KHADAS MCU MFD DRIVER
 -M:    Neil Armstrong <narmstrong@baylibre.com>
 +M:    Neil Armstrong <neil.armstrong@linaro.org>
  L:    linux-amlogic@lists.infradead.org
  S:    Maintained
  F:    Documentation/devicetree/bindings/mfd/khadas,mcu.yaml
@@@ -11458,27 -11375,13 +11459,27 @@@ F:        kernel/kmod.
  F:    lib/test_kmod.c
  F:    tools/testing/selftests/kmod/
  
 +KMSAN
 +M:    Alexander Potapenko <glider@google.com>
 +R:    Marco Elver <elver@google.com>
 +R:    Dmitry Vyukov <dvyukov@google.com>
 +L:    kasan-dev@googlegroups.com
 +S:    Maintained
 +F:    Documentation/dev-tools/kmsan.rst
 +F:    arch/*/include/asm/kmsan.h
 +F:    arch/*/mm/kmsan_*
 +F:    include/linux/kmsan*.h
 +F:    lib/Kconfig.kmsan
 +F:    mm/kmsan/
 +F:    scripts/Makefile.kmsan
 +
  KPROBES
  M:    Naveen N. Rao <naveen.n.rao@linux.ibm.com>
  M:    Anil S Keshavamurthy <anil.s.keshavamurthy@intel.com>
  M:    "David S. Miller" <davem@davemloft.net>
  M:    Masami Hiramatsu <mhiramat@kernel.org>
  S:    Maintained
 -T:    git git://git.kernel.org/pub/scm/linux/kernel/git/rostedt/linux-trace.git
 +T:    git git://git.kernel.org/pub/scm/linux/kernel/git/trace/linux-trace.git
  F:    Documentation/trace/kprobes.rst
  F:    include/asm-generic/kprobes.h
  F:    include/linux/kprobes.h
@@@ -11655,15 -11558,6 +11656,15 @@@ F: drivers/ata/ahci_platform.
  F:    drivers/ata/libahci_platform.c
  F:    include/linux/ahci_platform.h
  
 +LIBATA SATA AHCI SYNOPSYS DWC CONTROLLER DRIVER
 +M:    Serge Semin <fancer.lancer@gmail.com>
 +L:    linux-ide@vger.kernel.org
 +S:    Maintained
 +T:    git git://git.kernel.org/pub/scm/linux/kernel/git/dlemoal/libata.git
 +F:    Documentation/devicetree/bindings/ata/baikal,bt1-ahci.yaml
 +F:    Documentation/devicetree/bindings/ata/snps,dwc-ahci.yaml
 +F:    drivers/ata/ahci_dwc.c
 +
  LIBATA SATA PROMISE TX2/TX4 CONTROLLER DRIVER
  M:    Mikael Pettersson <mikpelinux@gmail.com>
  L:    linux-ide@vger.kernel.org
@@@ -11738,7 -11632,6 +11739,7 @@@ F:   Documentation/process/license-rules.
  F:    LICENSES/
  F:    scripts/spdxcheck-test.sh
  F:    scripts/spdxcheck.py
 +F:    scripts/spdxexclude
  
  LINEAR RANGES HELPERS
  M:    Mark Brown <broonie@kernel.org>
@@@ -12037,7 -11930,7 +12038,7 @@@ LTC2688 IIO DAC DRIVE
  M:    Nuno Sá <nuno.sa@analog.com>
  L:    linux-iio@vger.kernel.org
  S:    Supported
 -W:    http://ez.analog.com/community/linux-device-drivers
 +W:    https://ez.analog.com/linux-software-drivers
  F:    Documentation/ABI/testing/sysfs-bus-iio-dac-ltc2688
  F:    Documentation/devicetree/bindings/iio/dac/adi,ltc2688.yaml
  F:    drivers/iio/dac/ltc2688.c
@@@ -12202,18 -12095,6 +12203,18 @@@ L: linux-man@vger.kernel.or
  S:    Maintained
  W:    http://www.kernel.org/doc/man-pages
  
 +MAPLE TREE
 +M:    Liam R. Howlett <Liam.Howlett@oracle.com>
 +L:    linux-mm@kvack.org
 +S:    Supported
 +F:    Documentation/core-api/maple_tree.rst
 +F:    include/linux/maple_tree.h
 +F:    include/trace/events/maple_tree.h
 +F:    lib/maple_tree.c
 +F:    lib/test_maple_tree.c
 +F:    tools/testing/radix-tree/linux/maple_tree.h
 +F:    tools/testing/radix-tree/maple.c
 +
  MARDUK (CREATOR CI40) DEVICE TREE SUPPORT
  M:    Rahul Bedarkar <rahulbedarkar89@gmail.com>
  L:    linux-mips@vger.kernel.org
@@@ -12466,14 -12347,6 +12467,14 @@@ S: Maintaine
  F:    Documentation/devicetree/bindings/iio/proximity/maxbotix,mb1232.yaml
  F:    drivers/iio/proximity/mb1232.c
  
 +MAXIM MAX11205 DRIVER
 +M:    Ramona Bolboaca <ramona.bolboaca@analog.com>
 +L:    linux-iio@vger.kernel.org
 +S:    Supported
 +W:    https://ez.analog.com/linux-software-drivers
 +F:    Documentation/devicetree/bindings/iio/adc/maxim,max11205.yaml
 +F:    drivers/iio/adc/max11205.c
 +
  MAXIM MAX17040 FAMILY FUEL GAUGE DRIVERS
  R:    Iskren Chernev <iskren.chernev@gmail.com>
  R:    Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
@@@ -12539,6 -12412,7 +12540,6 @@@ F:   drivers/power/supply/max77976_charge
  
  MAXIM MUIC CHARGER DRIVERS FOR EXYNOS BASED BOARDS
  M:    Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
 -M:    Bartlomiej Zolnierkiewicz <b.zolnierkie@samsung.com>
  L:    linux-pm@vger.kernel.org
  S:    Supported
  B:    mailto:linux-samsung-soc@vger.kernel.org
@@@ -12550,6 -12424,7 +12551,6 @@@ F:   drivers/power/supply/max77693_charge
  MAXIM PMIC AND MUIC DRIVERS FOR EXYNOS BASED BOARDS
  M:    Chanwoo Choi <cw00.choi@samsung.com>
  M:    Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
 -M:    Bartlomiej Zolnierkiewicz <b.zolnierkie@samsung.com>
  L:    linux-kernel@vger.kernel.org
  S:    Supported
  B:    mailto:linux-samsung-soc@vger.kernel.org
@@@ -12945,12 -12820,6 +12946,12 @@@ S: Supporte
  F:    Documentation/devicetree/bindings/media/mediatek-jpeg-*.yaml
  F:    drivers/media/platform/mediatek/jpeg/
  
 +MEDIATEK KEYPAD DRIVER
 +M:    Mattijs Korpershoek <mkorpershoek@baylibre.com>
 +S:    Supported
 +F:    Documentation/devicetree/bindings/input/mediatek,mt6779-keypad.yaml
 +F:    drivers/input/keyboard/mt6779-keypad.c
 +
  MEDIATEK MDP DRIVER
  M:    Minghsiu Tsai <minghsiu.tsai@mediatek.com>
  M:    Houlong Wei <houlong.wei@mediatek.com>
@@@ -13003,7 -12872,7 +13004,7 @@@ MEDIATEK MT7621/28/88 I2C DRIVE
  M:    Stefan Roese <sr@denx.de>
  L:    linux-i2c@vger.kernel.org
  S:    Maintained
 -F:    Documentation/devicetree/bindings/i2c/i2c-mt7621.txt
 +F:    Documentation/devicetree/bindings/i2c/mediatek,mt7621-i2c.yaml
  F:    drivers/i2c/busses/i2c-mt7621.c
  
  MEDIATEK MT7621 PCIE CONTROLLER DRIVER
@@@ -13116,9 -12985,9 +13117,9 @@@ F:   drivers/input/touchscreen/melfas_mip
  
  MELLANOX BLUEFIELD I2C DRIVER
  M:    Khalil Blaiech <kblaiech@nvidia.com>
 +M:    Asmaa Mnebhi <asmaa@nvidia.com>
  L:    linux-i2c@vger.kernel.org
  S:    Supported
 -F:    Documentation/devicetree/bindings/i2c/mellanox,i2c-mlxbf.yaml
  F:    drivers/i2c/busses/i2c-mlxbf.c
  
  MELLANOX ETHERNET DRIVER (mlx4_en)
@@@ -13322,13 -13191,6 +13323,13 @@@ F: drivers/mtd
  F:    include/linux/mtd/
  F:    include/uapi/mtd/
  
 +MEMSENSING MICROSYSTEMS MSA311 DRIVER
 +M:    Dmitry Rokosov <ddrokosov@sberdevices.ru>
 +L:    linux-iio@vger.kernel.org
 +S:    Maintained
 +F:    Documentation/devicetree/bindings/iio/accel/memsensing,msa311.yaml
 +F:    drivers/iio/accel/msa311.c
 +
  MEN A21 WATCHDOG DRIVER
  M:    Johannes Thumshirn <morbidrsa@gmail.com>
  L:    linux-watchdog@vger.kernel.org
@@@ -13358,7 -13220,7 +13359,7 @@@ S:   Maintaine
  F:    drivers/watchdog/menz69_wdt.c
  
  MESON AO CEC DRIVER FOR AMLOGIC SOCS
 -M:    Neil Armstrong <narmstrong@baylibre.com>
 +M:    Neil Armstrong <neil.armstrong@linaro.org>
  L:    linux-media@vger.kernel.org
  L:    linux-amlogic@lists.infradead.org
  S:    Supported
@@@ -13369,7 -13231,7 +13370,7 @@@ F:   drivers/media/cec/platform/meson/ao-
  F:    drivers/media/cec/platform/meson/ao-cec.c
  
  MESON GE2D DRIVER FOR AMLOGIC SOCS
 -M:    Neil Armstrong <narmstrong@baylibre.com>
 +M:    Neil Armstrong <neil.armstrong@linaro.org>
  L:    linux-media@vger.kernel.org
  L:    linux-amlogic@lists.infradead.org
  S:    Supported
@@@ -13385,7 -13247,7 +13386,7 @@@ F:   Documentation/devicetree/bindings/mt
  F:    drivers/mtd/nand/raw/meson_*
  
  MESON VIDEO DECODER DRIVER FOR AMLOGIC SOCS
 -M:    Neil Armstrong <narmstrong@baylibre.com>
 +M:    Neil Armstrong <neil.armstrong@linaro.org>
  L:    linux-media@vger.kernel.org
  L:    linux-amlogic@lists.infradead.org
  S:    Supported
@@@ -13432,7 -13294,7 +13433,7 @@@ F:   include/dt-bindings/dma/at91.
  MICROCHIP AT91 SERIAL DRIVER
  M:    Richard Genoud <richard.genoud@gmail.com>
  S:    Maintained
 -F:    Documentation/devicetree/bindings/mfd/atmel-usart.txt
 +F:    Documentation/devicetree/bindings/serial/atmel,at91-usart.yaml
  F:    drivers/tty/serial/atmel_serial.c
  F:    drivers/tty/serial/atmel_serial.h
  
@@@ -13440,7 -13302,7 +13441,7 @@@ MICROCHIP AT91 USART MFD DRIVE
  M:    Radu Pirea <radu_nicolae.pirea@upb.ro>
  L:    linux-kernel@vger.kernel.org
  S:    Supported
 -F:    Documentation/devicetree/bindings/mfd/atmel-usart.txt
 +F:    Documentation/devicetree/bindings/serial/atmel,at91-usart.yaml
  F:    drivers/mfd/at91-usart.c
  F:    include/dt-bindings/mfd/at91-usart.h
  
@@@ -13448,7 -13310,7 +13449,7 @@@ MICROCHIP AT91 USART SPI DRIVE
  M:    Radu Pirea <radu_nicolae.pirea@upb.ro>
  L:    linux-spi@vger.kernel.org
  S:    Supported
 -F:    Documentation/devicetree/bindings/mfd/atmel-usart.txt
 +F:    Documentation/devicetree/bindings/serial/atmel,at91-usart.yaml
  F:    drivers/spi/spi-at91-usart.c
  
  MICROCHIP AUDIO ASOC DRIVERS
@@@ -13550,7 -13412,7 +13551,7 @@@ MICROCHIP MCP3911 ADC DRIVE
  M:    Marcus Folkesson <marcus.folkesson@gmail.com>
  M:    Kent Gustavsson <kent@minoris.se>
  L:    linux-iio@vger.kernel.org
 -S:    Supported
 +S:    Maintained
  F:    Documentation/devicetree/bindings/iio/adc/microchip,mcp3911.yaml
  F:    drivers/iio/adc/mcp3911.c
  
@@@ -13566,14 -13428,6 +13567,14 @@@ S: Supporte
  F:    Documentation/devicetree/bindings/mtd/atmel-nand.txt
  F:    drivers/mtd/nand/raw/atmel/*
  
 +MICROCHIP PCI1XXXX GP DRIVER
 +M:    Kumaravel Thiagarajan <kumaravel.thiagarajan@microchip.com>
 +L:    linux-gpio@vger.kernel.org
 +S:    Supported
 +F:    drivers/misc/mchp_pci1xxxx/mchp_pci1xxxx_gp.c
 +F:    drivers/misc/mchp_pci1xxxx/mchp_pci1xxxx_gp.h
 +F:    drivers/misc/mchp_pci1xxxx/mchp_pci1xxxx_gpio.c
 +
  MICROCHIP OTPC DRIVER
  M:    Claudiu Beznea <claudiu.beznea@microchip.com>
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
@@@ -13582,14 -13436,6 +13583,14 @@@ F: Documentation/devicetree/bindings/nv
  F:    drivers/nvmem/microchip-otpc.c
  F:    include/dt-bindings/nvmem/microchip,sama7g5-otpc.h
  
 +MICROCHIP PCI1XXXX I2C DRIVER
 +M:    Tharun Kumar P <tharunkumar.pasumarthi@microchip.com>
 +M:    Kumaravel Thiagarajan <kumaravel.thiagarajan@microchip.com>
 +M:    Microchip Linux Driver Support <UNGLinuxDriver@microchip.com>
 +L:    linux-i2c@vger.kernel.org
 +S:    Maintained
 +F:    drivers/i2c/busses/i2c-mchp-pci1xxxx.c
 +
  MICROCHIP PWM DRIVER
  M:    Claudiu Beznea <claudiu.beznea@microchip.com>
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
@@@ -13649,7 -13495,6 +13650,7 @@@ M:   UNGLinuxDriver@microchip.co
  L:    linux-mips@vger.kernel.org
  S:    Supported
  F:    Documentation/devicetree/bindings/mips/mscc.txt
 +F:    Documentation/devicetree/bindings/phy/mscc,vsc7514-serdes.yaml
  F:    Documentation/devicetree/bindings/power/reset/ocelot-reset.txt
  F:    arch/mips/boot/dts/mscc/
  F:    arch/mips/configs/generic/board-ocelot.config
@@@ -13937,7 -13782,7 +13938,7 @@@ MOTION EYE VAIO PICTUREBOOK CAMERA DRIV
  S:    Orphan
  W:    http://popies.net/meye/
  F:    Documentation/userspace-api/media/drivers/meye*
 -F:    drivers/media/pci/meye/
 +F:    drivers/staging/media/deprecated/meye/
  F:    include/uapi/linux/meye.h
  
  MOTORCOMM PHY DRIVER
@@@ -14606,7 -14451,6 +14607,7 @@@ M:   Willy Tarreau <w@1wt.eu
  S:    Maintained
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/wtarreau/nolibc.git
  F:    tools/include/nolibc/
 +F:    tools/testing/selftests/nolibc/
  
  NSDEPS
  M:    Matthias Maennich <maennich@google.com>
@@@ -14705,21 -14549,6 +14706,21 @@@ F: drivers/nvme/common
  F:    include/linux/nvme*
  F:    include/uapi/linux/nvme_ioctl.h
  
 +NVM EXPRESS FABRICS AUTHENTICATION
 +M:    Hannes Reinecke <hare@suse.de>
 +L:    linux-nvme@lists.infradead.org
 +S:    Supported
 +F:    drivers/nvme/host/auth.c
 +F:    drivers/nvme/target/auth.c
 +F:    drivers/nvme/target/fabrics-cmd-auth.c
 +F:    include/linux/nvme-auth.h
 +
 +NVM EXPRESS HARDWARE MONITORING SUPPORT
 +M:    Guenter Roeck <linux@roeck-us.net>
 +L:    linux-nvme@lists.infradead.org
 +S:    Supported
 +F:    drivers/nvme/host/hwmon.c
 +
  NVM EXPRESS FC TRANSPORT DRIVERS
  M:    James Smart <james.smart@broadcom.com>
  L:    linux-nvme@lists.infradead.org
@@@ -14869,15 -14698,6 +14870,15 @@@ S: Orpha
  F:    Documentation/devicetree/bindings/net/nfc/nxp,nci.yaml
  F:    drivers/nfc/nxp-nci
  
 +NXP i.MX 8MP DW100 V4L2 DRIVER
 +M:    Xavier Roumegue <xavier.roumegue@oss.nxp.com>
 +L:    linux-media@vger.kernel.org
 +S:    Maintained
 +F:    Documentation/devicetree/bindings/media/nxp,dw100.yaml
 +F:    Documentation/userspace-api/media/drivers/dw100.rst
 +F:    drivers/media/platform/nxp/dw100/
 +F:    include/uapi/linux/dw100.h
 +
  NXP i.MX 8QXP/8QM JPEG V4L2 DRIVER
  M:    Mirela Rabulea <mirela.rabulea@nxp.com>
  R:    NXP Linux Team <linux-imx@nxp.com>
@@@ -14929,13 -14749,6 +14930,13 @@@ F: net/dsa/tag_ocelot.
  F:    net/dsa/tag_ocelot_8021q.c
  F:    tools/testing/selftests/drivers/net/ocelot/*
  
 +OCELOT EXTERNAL SWITCH CONTROL
 +M:    Colin Foster <colin.foster@in-advantage.com>
 +S:    Supported
 +F:    Documentation/devicetree/bindings/mfd/mscc,ocelot.yaml
 +F:    drivers/mfd/ocelot*
 +F:    include/linux/mfd/ocelot.h
 +
  OCXL (Open Coherent Accelerator Processor Interface OpenCAPI) DRIVER
  M:    Frederic Barrat <fbarrat@linux.ibm.com>
  M:    Andrew Donnellan <ajd@linux.ibm.com>
@@@ -15130,7 -14943,6 +15131,7 @@@ F:   drivers/regulator/palmas-regulator*.
  F:    drivers/regulator/pbias-regulator.c
  F:    drivers/regulator/tps65217-regulator.c
  F:    drivers/regulator/tps65218-regulator.c
 +F:    drivers/regulator/tps65219-regulator.c
  F:    drivers/regulator/tps65910-regulator.c
  F:    drivers/regulator/twl-regulator.c
  F:    drivers/regulator/twl6030-regulator.c
@@@ -15370,6 -15182,17 +15371,6 @@@ L:  linux-rdma@vger.kernel.or
  S:    Supported
  F:    drivers/infiniband/ulp/opa_vnic
  
 -OPEN FIRMWARE AND DEVICE TREE OVERLAYS
 -M:    Pantelis Antoniou <pantelis.antoniou@konsulko.com>
 -M:    Frank Rowand <frowand.list@gmail.com>
 -L:    devicetree@vger.kernel.org
 -S:    Maintained
 -F:    Documentation/devicetree/dynamic-resolution-notes.rst
 -F:    Documentation/devicetree/overlay-notes.rst
 -F:    drivers/of/overlay.c
 -F:    drivers/of/resolver.c
 -K:    of_overlay_notifier_
 -
  OPEN FIRMWARE AND FLATTENED DEVICE TREE
  M:    Rob Herring <robh+dt@kernel.org>
  M:    Frank Rowand <frowand.list@gmail.com>
@@@ -15382,9 -15205,6 +15383,9 @@@ F:   Documentation/ABI/testing/sysfs-firm
  F:    drivers/of/
  F:    include/linux/of*.h
  F:    scripts/dtc/
 +K:    of_overlay_notifier_
 +K:    of_overlay_fdt_apply
 +K:    of_overlay_remove
  
  OPEN FIRMWARE AND FLATTENED DEVICE TREE BINDINGS
  M:    Rob Herring <robh+dt@kernel.org>
@@@ -15422,7 -15242,7 +15423,7 @@@ M:   Stafford Horne <shorne@gmail.com
  L:    openrisc@lists.librecores.org
  S:    Maintained
  W:    http://openrisc.io
 -T:    git git://github.com/openrisc/linux.git
 +T:    git https://github.com/openrisc/linux.git
  F:    Documentation/devicetree/bindings/openrisc/
  F:    Documentation/openrisc/
  F:    arch/openrisc/
@@@ -15850,7 -15670,7 +15851,7 @@@ F:   Documentation/devicetree/bindings/pc
  F:    drivers/pci/controller/dwc/*designware*
  
  PCI DRIVER FOR TI DRA7XX/J721E
 -M:    Kishon Vijay Abraham I <kishon@ti.com>
 +M:    Vignesh Raghavendra <vigneshr@ti.com>
  L:    linux-omap@vger.kernel.org
  L:    linux-pci@vger.kernel.org
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
@@@ -15867,10 -15687,9 +15868,10 @@@ F: Documentation/devicetree/bindings/pc
  F:    drivers/pci/controller/pci-v3-semi.c
  
  PCI ENDPOINT SUBSYSTEM
 -M:    Kishon Vijay Abraham I <kishon@ti.com>
  M:    Lorenzo Pieralisi <lpieralisi@kernel.org>
  R:    Krzysztof WilczyÅ„ski <kw@linux.com>
 +R:    Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
 +R:    Kishon Vijay Abraham I <kishon@kernel.org>
  L:    linux-pci@vger.kernel.org
  S:    Supported
  Q:    https://patchwork.kernel.org/project/linux-pci/list/
@@@ -15884,8 -15703,8 +15885,8 @@@ F:   drivers/pci/endpoint
  F:    tools/pci/
  
  PCI ENHANCED ERROR HANDLING (EEH) FOR POWERPC
 -M:    Russell Currey <ruscur@russell.cc>
 -M:    Oliver O'Halloran <oohall@gmail.com>
 +M:    Mahesh J Salgaonkar <mahesh@linux.ibm.com>
 +R:    Oliver O'Halloran <oohall@gmail.com>
  L:    linuxppc-dev@lists.ozlabs.org
  S:    Supported
  F:    Documentation/PCI/pci-error-recovery.rst
@@@ -16309,7 -16128,7 +16310,7 @@@ F:   drivers/gpio/gpio-sama5d2-piobu.
  F:    drivers/pinctrl/pinctrl-at91*
  
  PIN CONTROLLER - QUALCOMM
 -M:    Bjorn Andersson <bjorn.andersson@linaro.org>
 +M:    Bjorn Andersson <andersson@kernel.org>
  L:    linux-arm-msm@vger.kernel.org
  S:    Maintained
  F:    Documentation/devicetree/bindings/pinctrl/qcom,*.txt
@@@ -16362,12 -16181,6 +16363,12 @@@ F: Documentation/devicetree/bindings/pi
  F:    drivers/pinctrl/sunplus/
  F:    include/dt-bindings/pinctrl/sppctl*.h
  
 +PINE64 PINEPHONE KEYBOARD DRIVER
 +M:    Samuel Holland <samuel@sholland.org>
 +S:    Supported
 +F:    Documentation/devicetree/bindings/input/pine64,pinephone-keyboard.yaml
 +F:    drivers/input/keyboard/pinephone-keyboard.c
 +
  PKTCDVD DRIVER
  M:    linux-block@vger.kernel.org
  S:    Orphan
@@@ -16728,6 -16541,14 +16729,6 @@@ T:  git git://linuxtv.org/media_tree.gi
  F:    drivers/media/usb/pwc/*
  F:    include/trace/events/pwc.h
  
 -PWM FAN DRIVER
 -M:    Bartlomiej Zolnierkiewicz <b.zolnierkie@samsung.com>
 -L:    linux-hwmon@vger.kernel.org
 -S:    Supported
 -F:    Documentation/devicetree/bindings/hwmon/pwm-fan.txt
 -F:    Documentation/hwmon/pwm-fan.rst
 -F:    drivers/hwmon/pwm-fan.c
 -
  PWM IR Transmitter
  M:    Sean Young <sean@mess.org>
  L:    linux-media@vger.kernel.org
@@@ -16796,9 -16617,6 +16797,9 @@@ M:   Srinivas Kandagatla <srinivas.kandag
  M:    Banajit Goswami <bgoswami@quicinc.com>
  L:    alsa-devel@alsa-project.org (moderated for non-subscribers)
  S:    Supported
 +F:    Documentation/devicetree/bindings/soc/qcom/qcom,apr.yaml
 +F:    Documentation/devicetree/bindings/sound/qcom,*
 +F:    drivers/soc/qcom/apr.c
  F:    include/dt-bindings/sound/qcom,wcd9335.h
  F:    sound/soc/codecs/lpass-rx-macro.*
  F:    sound/soc/codecs/lpass-tx-macro.*
@@@ -17003,7 -16821,7 +17004,7 @@@ F:   Documentation/devicetree/bindings/me
  F:    drivers/media/platform/qcom/camss/
  
  QUALCOMM CLOCK DRIVERS
 -M:    Bjorn Andersson <bjorn.andersson@linaro.org>
 +M:    Bjorn Andersson <andersson@kernel.org>
  L:    linux-arm-msm@vger.kernel.org
  S:    Supported
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/qcom/linux.git
@@@ -17042,7 -16860,6 +17043,7 @@@ F:   drivers/net/ethernet/qualcomm/emac
  
  QUALCOMM ETHQOS ETHERNET DRIVER
  M:    Vinod Koul <vkoul@kernel.org>
 +R:    Bhupesh Sharma <bhupesh.sharma@linaro.org>
  L:    netdev@vger.kernel.org
  S:    Maintained
  F:    Documentation/devicetree/bindings/net/qcom,ethqos.txt
@@@ -17053,7 -16870,7 +17054,7 @@@ M:   Srinivas Kandagatla <srinivas.kandag
  M:    Amol Maheshwari <amahesh@qti.qualcomm.com>
  L:    linux-arm-msm@vger.kernel.org
  S:    Maintained
 -F:    Documentation/devicetree/bindings/misc/qcom,fastrpc.txt
 +F:    Documentation/devicetree/bindings/misc/qcom,fastrpc.yaml
  F:    drivers/misc/fastrpc.c
  F:    include/uapi/misc/fastrpc.h
  
@@@ -17493,7 -17310,7 +17494,7 @@@ S:   Supporte
  F:    fs/reiserfs/
  
  REMOTE PROCESSOR (REMOTEPROC) SUBSYSTEM
 -M:    Bjorn Andersson <bjorn.andersson@linaro.org>
 +M:    Bjorn Andersson <andersson@kernel.org>
  M:    Mathieu Poirier <mathieu.poirier@linaro.org>
  L:    linux-remoteproc@vger.kernel.org
  S:    Maintained
@@@ -17506,7 -17323,7 +17507,7 @@@ F:   include/linux/remoteproc.
  F:    include/linux/remoteproc/
  
  REMOTE PROCESSOR MESSAGING (RPMSG) SUBSYSTEM
 -M:    Bjorn Andersson <bjorn.andersson@linaro.org>
 +M:    Bjorn Andersson <andersson@kernel.org>
  M:    Mathieu Poirier <mathieu.poirier@linaro.org>
  L:    linux-remoteproc@vger.kernel.org
  S:    Maintained
@@@ -17632,12 -17449,6 +17633,12 @@@ S: Maintaine
  F:    Documentation/devicetree/bindings/mtd/renesas-nandc.yaml
  F:    drivers/mtd/nand/raw/renesas-nand-controller.c
  
 +RENESAS VERSACLOCK 7 CLOCK DRIVER
 +M:    Alex Helms <alexander.helms.jy@renesas.com>
 +S:    Maintained
 +F:    Documentation/devicetree/bindings/clock/renesas,versaclock7.yaml
 +F:    drivers/clk/clk-versaclock7.c
 +
  RESET CONTROLLER FRAMEWORK
  M:    Philipp Zabel <p.zabel@pengutronix.de>
  S:    Maintained
@@@ -17713,7 -17524,6 +17714,7 @@@ M:   Palmer Dabbelt <palmer@dabbelt.com
  M:    Albert Ou <aou@eecs.berkeley.edu>
  L:    linux-riscv@lists.infradead.org
  S:    Supported
 +Q:    https://patchwork.kernel.org/project/linux-riscv/list/
  P:    Documentation/riscv/patch-acceptance.rst
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/riscv/linux.git
  F:    arch/riscv/
@@@ -17725,26 -17535,13 +17726,26 @@@ M:        Conor Dooley <conor.dooley@microchip
  M:    Daire McNamara <daire.mcnamara@microchip.com>
  L:    linux-riscv@lists.infradead.org
  S:    Supported
 +F:    Documentation/devicetree/bindings/clock/microchip,mpfs*.yaml
 +F:    Documentation/devicetree/bindings/gpio/microchip,mpfs-gpio.yaml
 +F:    Documentation/devicetree/bindings/i2c/microchip,corei2c.yaml
 +F:    Documentation/devicetree/bindings/mailbox/microchip,mpfs-mailbox.yaml
 +F:    Documentation/devicetree/bindings/net/can/microchip,mpfs-can.yaml
 +F:    Documentation/devicetree/bindings/pwm/microchip,corepwm.yaml
 +F:    Documentation/devicetree/bindings/riscv/microchip.yaml
 +F:    Documentation/devicetree/bindings/soc/microchip/microchip,mpfs-sys-controller.yaml
 +F:    Documentation/devicetree/bindings/spi/microchip,mpfs-spi.yaml
 +F:    Documentation/devicetree/bindings/usb/microchip,mpfs-musb.yaml
  F:    arch/riscv/boot/dts/microchip/
  F:    drivers/char/hw_random/mpfs-rng.c
  F:    drivers/clk/microchip/clk-mpfs.c
 +F:    drivers/i2c/busses/i2c-microchip-core.c
  F:    drivers/mailbox/mailbox-mpfs.c
  F:    drivers/pci/controller/pcie-microchip-host.c
 +F:    drivers/reset/reset-mpfs.c
  F:    drivers/rtc/rtc-mpfs.c
  F:    drivers/soc/microchip/
 +F:    drivers/spi/spi-microchip-core-qspi.c
  F:    drivers/spi/spi-microchip-core.c
  F:    drivers/usb/musb/mpfs.c
  F:    include/soc/microchip/mpfs.h
@@@ -17941,35 -17738,6 +17942,35 @@@ L: linux-rdma@vger.kernel.or
  S:    Maintained
  F:    drivers/infiniband/ulp/rtrs/
  
 +RUNTIME VERIFICATION (RV)
 +M:    Daniel Bristot de Oliveira <bristot@kernel.org>
 +M:    Steven Rostedt <rostedt@goodmis.org>
 +L:    linux-trace-devel@vger.kernel.org
 +S:    Maintained
 +F:    Documentation/trace/rv/
 +F:    include/linux/rv.h
 +F:    include/rv/
 +F:    kernel/trace/rv/
 +F:    tools/verification/
 +
 +RUST
 +M:    Miguel Ojeda <ojeda@kernel.org>
 +M:    Alex Gaynor <alex.gaynor@gmail.com>
 +M:    Wedson Almeida Filho <wedsonaf@gmail.com>
 +R:    Boqun Feng <boqun.feng@gmail.com>
 +R:    Gary Guo <gary@garyguo.net>
 +R:    Björn Roy Baron <bjorn3_gh@protonmail.com>
 +L:    rust-for-linux@vger.kernel.org
 +S:    Supported
 +W:    https://github.com/Rust-for-Linux/linux
 +B:    https://github.com/Rust-for-Linux/linux/issues
 +T:    git https://github.com/Rust-for-Linux/linux.git rust-next
 +F:    Documentation/rust/
 +F:    rust/
 +F:    samples/rust/
 +F:    scripts/*rust*
 +K:    \b(?i:rust)\b
 +
  RXRPC SOCKETS (AF_RXRPC)
  M:    David Howells <dhowells@redhat.com>
  M:    Marc Dionne <marc.dionne@auristor.com>
@@@ -18141,7 -17909,9 +18142,7 @@@ M:   Hans Verkuil <hverkuil@xs4all.nl
  L:    linux-media@vger.kernel.org
  S:    Maintained
  T:    git git://linuxtv.org/media_tree.git
 -F:    drivers/media/common/saa7146/
 -F:    drivers/media/pci/saa7146/
 -F:    include/media/drv-intf/saa7146*
 +F:    drivers/staging/media/deprecated/saa7146/
  
  SAFESETID SECURITY MODULE
  M:    Micah Morton <mortonm@chromium.org>
@@@ -18195,6 -17965,7 +18196,6 @@@ F:   drivers/platform/x86/samsung-laptop.
  
  SAMSUNG MULTIFUNCTION PMIC DEVICE DRIVERS
  M:    Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
 -M:    Bartlomiej Zolnierkiewicz <b.zolnierkie@samsung.com>
  L:    linux-kernel@vger.kernel.org
  L:    linux-samsung-soc@vger.kernel.org
  S:    Supported
@@@ -18221,6 -17992,7 +18222,6 @@@ F:   include/media/drv-intf/s3c_camif.
  
  SAMSUNG S3FWRN5 NFC DRIVER
  M:    Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
 -M:    Krzysztof Opasiak <k.opasiak@samsung.com>
  L:    linux-nfc@lists.01.org (subscribers-only)
  S:    Maintained
  F:    Documentation/devicetree/bindings/net/nfc/samsung,s3fwrn5.yaml
@@@ -18258,14 -18030,12 +18259,14 @@@ Q:        https://patchwork.linuxtv.org/projec
  F:    drivers/media/platform/samsung/exynos4-is/
  
  SAMSUNG SOC CLOCK DRIVERS
 +M:    Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
  M:    Sylwester Nawrocki <s.nawrocki@samsung.com>
  M:    Tomasz Figa <tomasz.figa@gmail.com>
  M:    Chanwoo Choi <cw00.choi@samsung.com>
  R:    Alim Akhtar <alim.akhtar@samsung.com>
  L:    linux-samsung-soc@vger.kernel.org
  S:    Supported
 +T:    git git://git.kernel.org/pub/scm/linux/kernel/git/krzk/linux.git
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/snawrocki/clk.git
  F:    Documentation/devicetree/bindings/clock/samsung,*.yaml
  F:    Documentation/devicetree/bindings/clock/samsung,s3c*
@@@ -18490,7 -18260,7 +18491,7 @@@ F:   drivers/mmc/host/sdhci-brcmstb
  SECURE DIGITAL HOST CONTROLLER INTERFACE (SDHCI) DRIVER
  M:    Adrian Hunter <adrian.hunter@intel.com>
  L:    linux-mmc@vger.kernel.org
 -S:    Maintained
 +S:    Supported
  F:    drivers/mmc/host/sdhci*
  
  SECURE DIGITAL HOST CONTROLLER INTERFACE (SDHCI) MICROCHIP DRIVER
@@@ -18513,7 -18283,7 +18514,7 @@@ S:   Maintaine
  F:    drivers/mmc/host/sdhci-spear.c
  
  SECURE DIGITAL HOST CONTROLLER INTERFACE (SDHCI) TI OMAP DRIVER
 -M:    Kishon Vijay Abraham I <kishon@ti.com>
 +M:    Vignesh Raghavendra <vigneshr@ti.com>
  L:    linux-mmc@vger.kernel.org
  S:    Maintained
  F:    drivers/mmc/host/sdhci-omap.c
@@@ -18526,7 -18296,8 +18527,7 @@@ S:   Maintaine
  F:    drivers/mmc/host/sdhci-esdhc-imx.c
  
  SECURE ENCRYPTING DEVICE (SED) OPAL DRIVER
 -M:    Jonathan Derrick <jonathan.derrick@intel.com>
 -M:    Revanth Rajashekar <revanth.rajashekar@intel.com>
 +M:    Jonathan Derrick <jonathan.derrick@linux.dev>
  L:    linux-block@vger.kernel.org
  S:    Supported
  F:    block/opal_proto.h
@@@ -18672,7 -18443,6 +18673,7 @@@ F:   drivers/misc/sgi-xp
  SHARED MEMORY COMMUNICATIONS (SMC) SOCKETS
  M:    Karsten Graul <kgraul@linux.ibm.com>
  M:    Wenjia Zhang <wenjia@linux.ibm.com>
 +M:    Jan Karcher <jaka@linux.ibm.com>
  L:    linux-s390@vger.kernel.org
  S:    Supported
  W:    http://www.ibm.com/developerworks/linux/linux390/
@@@ -19618,8 -19388,8 +19619,8 @@@ M:   Emil Renner Berthing <kernel@esmil.d
  L:    linux-gpio@vger.kernel.org
  S:    Maintained
  F:    Documentation/devicetree/bindings/pinctrl/starfive,jh7100-pinctrl.yaml
 -F:    drivers/pinctrl/pinctrl-starfive.c
 -F:    include/dt-bindings/pinctrl/pinctrl-starfive.h
 +F:    drivers/pinctrl/starfive/
 +F:    include/dt-bindings/pinctrl/pinctrl-starfive-jh7100.h
  
  STARFIVE JH7100 RESET CONTROLLER DRIVER
  M:    Emil Renner Berthing <kernel@esmil.dk>
@@@ -19714,11 -19484,6 +19715,11 @@@ L: netdev@vger.kernel.or
  S:    Maintained
  F:    drivers/net/ethernet/dlink/sundance.c
  
 +SUN HAPPY MEAL ETHERNET DRIVER
 +M:    Sean Anderson <seanga2@gmail.com>
 +S:    Maintained
 +F:    drivers/net/ethernet/sun/sunhme.*
 +
  SUNPLUS ETHERNET DRIVER
  M:    Wells Lu <wellslutw@gmail.com>
  L:    netdev@vger.kernel.org
@@@ -19733,15 -19498,6 +19734,15 @@@ S: Maintaine
  F:    Documentation/devicetree/bindings/nvmem/sunplus,sp7021-ocotp.yaml
  F:    drivers/nvmem/sunplus-ocotp.c
  
 +SUNPLUS USB2 PHY DRIVER
 +M:    Vincent Shih <vincent.sunplus@gmail.com>
 +L:    linux-usb@vger.kernel.org
 +S:    Maintained
 +F:    Documentation/devicetree/bindings/phy/sunplus,sp7021-usb2-phy.yaml
 +F:    drivers/phy/sunplus/Kconfig
 +F:    drivers/phy/sunplus/Makefile
 +F:    drivers/phy/sunplus/phy-sunplus-usb2.c
 +
  SUNPLUS PWM DRIVER
  M:    Hammer Hsieh <hammerh0314@gmail.com>
  S:    Maintained
@@@ -19807,6 -19563,16 +19808,6 @@@ S:  Maintaine
  F:    Documentation/admin-guide/svga.rst
  F:    arch/x86/boot/video*
  
 -SWIOTLB SUBSYSTEM
 -M:    Christoph Hellwig <hch@infradead.org>
 -L:    iommu@lists.linux.dev
 -S:    Supported
 -W:    http://git.infradead.org/users/hch/dma-mapping.git
 -T:    git git://git.infradead.org/users/hch/dma-mapping.git
 -F:    arch/*/kernel/pci-swiotlb.c
 -F:    include/linux/swiotlb.h
 -F:    kernel/dma/swiotlb.c
 -
  SWITCHDEV
  M:    Jiri Pirko <jiri@resnulli.us>
  M:    Ivan Vecera <ivecera@redhat.com>
@@@ -20175,7 -19941,6 +20176,7 @@@ S:   Supporte
  F:    drivers/net/team/
  F:    include/linux/if_team.h
  F:    include/uapi/linux/if_team.h
 +F:    tools/testing/selftests/drivers/net/team/
  
  TECHNOLOGIC SYSTEMS TS-5500 PLATFORM SUPPORT
  M:    "Savoir-faire Linux Inc." <kernel@savoirfairelinux.com>
@@@ -20489,6 -20254,13 +20490,6 @@@ M:  Robert Richter <rric@kernel.org
  S:    Odd Fixes
  F:    drivers/gpio/gpio-thunderx.c
  
 -TI ADS131E0X ADC SERIES DRIVER
 -M:    Tomislav Denis <tomislav.denis@avl.com>
 -L:    linux-iio@vger.kernel.org
 -S:    Maintained
 -F:    Documentation/devicetree/bindings/iio/adc/ti,ads131e08.yaml
 -F:    drivers/iio/adc/ti-ads131e08.c
 -
  TI AM437X VPFE DRIVER
  M:    "Lad, Prabhakar" <prabhakar.csengg@gmail.com>
  L:    linux-media@vger.kernel.org
@@@ -20540,7 -20312,6 +20541,7 @@@ R:   Sekhar Nori <nsekhar@ti.com
  S:    Maintained
  F:    Documentation/devicetree/bindings/clock/ti/davinci/
  F:    drivers/clk/davinci/
 +F:    include/linux/clk/davinci.h
  
  TI DAVINCI SERIES GPIO DRIVER
  M:    Keerthy <j-keerthy@ti.com>
@@@ -20557,18 -20328,8 +20558,18 @@@ W: https://linuxtv.or
  Q:    http://patchwork.linuxtv.org/project/linux-media/list/
  T:    git git://linuxtv.org/mhadli/v4l-dvb-davinci_devices.git
  F:    drivers/media/platform/ti/davinci/
 +F:    drivers/staging/media/deprecated/vpfe_capture/
  F:    include/media/davinci/
  
 +TI ENHANCED CAPTURE (eCAP) DRIVER
 +M:    Vignesh Raghavendra <vigneshr@ti.com>
 +R:    Julien Panis <jpanis@baylibre.com>
 +L:    linux-iio@vger.kernel.org
 +L:    linux-omap@vger.kernel.org
 +S:    Maintained
 +F:    Documentation/devicetree/bindings/counter/ti,am62-ecap-capture.yaml
 +F:    drivers/counter/ti-ecap-capture.c
 +
  TI ENHANCED QUADRATURE ENCODER PULSE (eQEP) DRIVER
  R:    David Lechner <david@lechnology.com>
  L:    linux-iio@vger.kernel.org
@@@ -20707,7 -20468,7 +20708,7 @@@ S:   Odd fixe
  W:    https://linuxtv.org
  T:    git git://linuxtv.org/media_tree.git
  F:    Documentation/admin-guide/media/tm6000*
 -F:    drivers/media/usb/tm6000/
 +F:    drivers/staging/media/deprecated/tm6000/
  
  TMIO/SDHI MMC DRIVER
  M:    Wolfram Sang <wsa+renesas@sang-engineering.com>
@@@ -20807,10 -20568,9 +20808,10 @@@ F: include/linux/toshiba.
  F:    include/uapi/linux/toshiba.h
  
  TOSHIBA TC358743 DRIVER
 -M:    Mats Randgaard <matrandg@cisco.com>
 +M:    Hans Verkuil <hverkuil-cisco@xs4all.nl>
  L:    linux-media@vger.kernel.org
  S:    Maintained
 +F:    Documentation/devicetree/bindings/media/i2c/tc358743.txt
  F:    drivers/media/i2c/tc358743*
  F:    include/media/i2c/tc358743.h
  
@@@ -20831,29 -20591,24 +20832,29 @@@ Q:        https://patchwork.kernel.org/project
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/jarkko/linux-tpmdd.git
  F:    drivers/char/tpm/
  
 +TPS546D24 DRIVER
 +M:    Duke Du <dukedu83@gmail.com>
 +L:    linux-hwmon@vger.kernel.org
 +S:    Maintained
 +F:    Documentation/hwmon/tps546d24.rst
 +F:    drivers/hwmon/pmbus/tps546d24.c
 +
  TRACING
  M:    Steven Rostedt <rostedt@goodmis.org>
 -M:    Ingo Molnar <mingo@redhat.com>
 +M:    Masami Hiramatsu <mhiramat@kernel.org>
  S:    Maintained
 -T:    git git://git.kernel.org/pub/scm/linux/kernel/git/rostedt/linux-trace.git
 -F:    Documentation/trace/ftrace.rst
 -F:    arch/*/*/*/*ftrace*
 -F:    arch/*/*/*ftrace*
 +T:    git git://git.kernel.org/pub/scm/linux/kernel/git/trace/linux-trace.git
 +F:    Documentation/trace/*
  F:    fs/tracefs/
 -F:    include/*/ftrace.h
  F:    include/linux/trace*.h
  F:    include/trace/
  F:    kernel/trace/
 +F:    scripts/tracing/
  F:    tools/testing/selftests/ftrace/
  
  TRACING MMIO ACCESSES (MMIOTRACE)
  M:    Steven Rostedt <rostedt@goodmis.org>
 -M:    Ingo Molnar <mingo@kernel.org>
 +M:    Masami Hiramatsu <mhiramat@kernel.org>
  R:    Karol Herbst <karolherbst@gmail.com>
  R:    Pekka Paalanen <ppaalanen@gmail.com>
  L:    linux-kernel@vger.kernel.org
@@@ -20984,7 -20739,6 +20985,7 @@@ U-BOOT ENVIRONMENT VARIABLE
  M:    RafaÅ‚ MiÅ‚ecki <rafal@milecki.pl>
  S:    Maintained
  F:    Documentation/devicetree/bindings/nvmem/u-boot,env.yaml
 +F:    drivers/nvmem/u-boot-env.c
  
  UACCE ACCELERATOR FRAMEWORK
  M:    Zhangfei Gao <zhangfei.gao@linaro.org>
@@@ -21014,7 -20768,6 +21015,7 @@@ UBLK USERSPACE BLOCK DRIVE
  M:    Ming Lei <ming.lei@redhat.com>
  L:    linux-block@vger.kernel.org
  S:    Maintained
 +F:    Documentation/block/ublk.rst
  F:    drivers/block/ublk_drv.c
  F:    include/uapi/linux/ublk_cmd.h
  
@@@ -21302,7 -21055,7 +21303,7 @@@ L:   linux-usb@vger.kernel.or
  L:    netdev@vger.kernel.org
  S:    Maintained
  W:    https://github.com/petkan/pegasus
 -T:    git git://github.com/petkan/pegasus.git
 +T:    git https://github.com/petkan/pegasus.git
  F:    drivers/net/usb/pegasus.*
  
  USB PHY LAYER
@@@ -21339,7 -21092,7 +21340,7 @@@ L:   linux-usb@vger.kernel.or
  L:    netdev@vger.kernel.org
  S:    Maintained
  W:    https://github.com/petkan/rtl8150
 -T:    git git://github.com/petkan/rtl8150.git
 +T:    git https://github.com/petkan/rtl8150.git
  F:    drivers/net/usb/rtl8150.c
  
  USB SERIAL SUBSYSTEM
@@@ -21464,7 -21217,7 +21465,7 @@@ S:   Maintaine
  W:    http://royale.zerezo.com/zr364xx/
  T:    git git://linuxtv.org/media_tree.git
  F:    Documentation/admin-guide/media/zr364xx*
 -F:    drivers/media/usb/zr364xx/
 +F:    drivers/staging/media/deprecated/zr364xx/
  
  USER-MODE LINUX (UML)
  M:    Richard Weinberger <richard@nod.at>
@@@ -21561,7 -21314,6 +21562,7 @@@ R:   Cornelia Huck <cohuck@redhat.com
  L:    kvm@vger.kernel.org
  S:    Maintained
  T:    git git://github.com/awilliam/linux-vfio.git
 +F:    Documentation/ABI/testing/sysfs-devices-vfio-dev
  F:    Documentation/driver-api/vfio.rst
  F:    drivers/vfio/
  F:    include/linux/vfio.h
@@@ -21742,10 -21494,6 +21743,10 @@@ F: include/linux/virtio*.
  F:    include/uapi/linux/virtio_*.h
  F:    tools/virtio/
  
 +IFCVF VIRTIO DATA PATH ACCELERATOR
 +R:    Zhu Lingshan <lingshan.zhu@intel.com>
 +F:    drivers/vdpa/ifcvf/
 +
  VIRTIO BALLOON
  M:    "Michael S. Tsirkin" <mst@redhat.com>
  M:    David Hildenbrand <david@redhat.com>
@@@ -21797,7 -21545,7 +21798,7 @@@ F:   drivers/gpio/gpio-virtio.
  F:    include/uapi/linux/virtio_gpio.h
  
  VIRTIO GPU DRIVER
 -M:    David Airlie <airlied@linux.ie>
 +M:    David Airlie <airlied@redhat.com>
  M:    Gerd Hoffmann <kraxel@redhat.com>
  R:    Gurchetan Singh <gurchetansingh@chromium.org>
  R:    Chia-I Wu <olvaffe@gmail.com>
@@@ -21937,7 -21685,7 +21938,7 @@@ VMWARE BALLOON DRIVE
  M:    Nadav Amit <namit@vmware.com>
  R:    VMware PV-Drivers Reviewers <pv-drivers@vmware.com>
  L:    linux-kernel@vger.kernel.org
 -S:    Maintained
 +S:    Supported
  F:    drivers/misc/vmw_balloon.c
  
  VMWARE HYPERVISOR INTERFACE
@@@ -21956,14 -21704,14 +21957,14 @@@ M:        Bryan Tan <bryantan@vmware.com
  M:    Vishnu Dasa <vdasa@vmware.com>
  R:    VMware PV-Drivers Reviewers <pv-drivers@vmware.com>
  L:    linux-rdma@vger.kernel.org
 -S:    Maintained
 +S:    Supported
  F:    drivers/infiniband/hw/vmw_pvrdma/
  
 -VMware PVSCSI driver
 +VMWARE PVSCSI DRIVER
  M:    Vishal Bhakta <vbhakta@vmware.com>
  R:    VMware PV-Drivers Reviewers <pv-drivers@vmware.com>
  L:    linux-scsi@vger.kernel.org
 -S:    Maintained
 +S:    Supported
  F:    drivers/scsi/vmw_pvscsi.c
  F:    drivers/scsi/vmw_pvscsi.h
  
@@@ -21976,19 -21724,19 +21977,19 @@@ F:        drivers/ptp/ptp_vmw.
  
  VMWARE VMCI DRIVER
  M:    Bryan Tan <bryantan@vmware.com>
 -M:    Rajesh Jalisatgi <rjalisatgi@vmware.com>
  M:    Vishnu Dasa <vdasa@vmware.com>
  R:    VMware PV-Drivers Reviewers <pv-drivers@vmware.com>
  L:    linux-kernel@vger.kernel.org
 -S:    Maintained
 +S:    Supported
  F:    drivers/misc/vmw_vmci/
 +F:    include/linux/vmw_vmci*
  
  VMWARE VMMOUSE SUBDRIVER
  M:    Zack Rusin <zackr@vmware.com>
  R:    VMware Graphics Reviewers <linux-graphics-maintainer@vmware.com>
  R:    VMware PV-Drivers Reviewers <pv-drivers@vmware.com>
  L:    linux-input@vger.kernel.org
 -S:    Maintained
 +S:    Supported
  F:    drivers/input/mouse/vmmouse.c
  F:    drivers/input/mouse/vmmouse.h
  
@@@ -21996,17 -21744,9 +21997,17 @@@ VMWARE VMXNET3 ETHERNET DRIVE
  M:    Ronak Doshi <doshir@vmware.com>
  R:    VMware PV-Drivers Reviewers <pv-drivers@vmware.com>
  L:    netdev@vger.kernel.org
 -S:    Maintained
 +S:    Supported
  F:    drivers/net/vmxnet3/
  
 +VMWARE VSOCK VMCI TRANSPORT DRIVER
 +M:    Bryan Tan <bryantan@vmware.com>
 +M:    Vishnu Dasa <vdasa@vmware.com>
 +R:    VMware PV-Drivers Reviewers <pv-drivers@vmware.com>
 +L:    linux-kernel@vger.kernel.org
 +S:    Supported
 +F:    net/vmw_vsock/vmci_transport*
 +
  VOCORE VOCORE2 BOARD
  M:    Harvey Hunt <harveyhuntnexus@gmail.com>
  L:    linux-mips@vger.kernel.org
@@@ -22052,7 -21792,7 +22053,7 @@@ F:   lib/test_scanf.
  F:    lib/vsprintf.c
  
  VT1211 HARDWARE MONITOR DRIVER
 -M:    Juerg Haefliger <juergh@gmail.com>
 +M:    Juerg Haefliger <juergh@proton.me>
  L:    linux-hwmon@vger.kernel.org
  S:    Maintained
  F:    Documentation/hwmon/vt1211.rst
@@@ -22111,11 -21851,9 +22112,11 @@@ F: drivers/input/tablet/wacom_serial4.
  
  WANGXUN ETHERNET DRIVER
  M:    Jiawen Wu <jiawenwu@trustnetic.com>
 +M:    Mengyuan Lou <mengyuanlou@net-swift.com>
 +W:    https://www.net-swift.com
  L:    netdev@vger.kernel.org
  S:    Maintained
 -F:    Documentation/networking/device_drivers/ethernet/wangxun/txgbe.rst
 +F:    Documentation/networking/device_drivers/ethernet/wangxun/*
  F:    drivers/net/ethernet/wangxun/
  
  WATCHDOG DEVICE DRIVERS
@@@ -22130,7 -21868,6 +22131,7 @@@ F:   Documentation/watchdog
  F:    drivers/watchdog/
  F:    include/linux/watchdog.h
  F:    include/uapi/linux/watchdog.h
 +F:    include/trace/events/watchdog.h
  
  WHISKEYCOVE PMIC GPIO DRIVER
  M:    Kuppuswamy Sathyanarayanan <sathyanarayanan.kuppuswamy@linux.intel.com>
@@@ -22529,10 -22266,8 +22530,10 @@@ M: Stefano Stabellini <sstabellini@kern
  L:    xen-devel@lists.xenproject.org (moderated for non-subscribers)
  L:    iommu@lists.linux.dev
  S:    Supported
 -F:    arch/x86/xen/*swiotlb*
 -F:    drivers/xen/*swiotlb*
 +F:    arch/*/include/asm/xen/swiotlb-xen.h
 +F:    drivers/xen/swiotlb-xen.c
 +F:    include/xen/arm/swiotlb-xen.h
 +F:    include/xen/swiotlb-xen.h
  
  XFS FILESYSTEM
  C:    irc://irc.oftc.net/xfs
@@@ -22574,7 -22309,7 +22575,7 @@@ M:   Shubhrajyoti Datta <shubhrajyoti.dat
  R:    Srinivas Neeli <srinivas.neeli@xilinx.com>
  R:    Michal Simek <michal.simek@xilinx.com>
  S:    Maintained
 -F:    Documentation/devicetree/bindings/gpio/gpio-xilinx.txt
 +F:    Documentation/devicetree/bindings/gpio/xlnx,gpio-xilinx.yaml
  F:    Documentation/devicetree/bindings/gpio/gpio-zynq.yaml
  F:    drivers/gpio/gpio-xilinx.c
  F:    drivers/gpio/gpio-zynq.c
@@@ -22771,7 -22506,7 +22772,7 @@@ S:   Maintaine
  W:    http://mjpeg.sourceforge.net/driver-zoran/
  Q:    https://patchwork.linuxtv.org/project/linux-media/list/
  F:    Documentation/driver-api/media/drivers/zoran.rst
 -F:    drivers/staging/media/zoran/
 +F:    drivers/media/pci/zoran/
  
  ZRAM COMPRESSED RAM BLOCK DEVICE DRVIER
  M:    Minchan Kim <minchan@kernel.org>
@@@ -209,6 -209,9 +209,9 @@@ i915-y += gt/uc/intel_uc.o 
  # graphics system controller (GSC) support
  i915-y += gt/intel_gsc.o
  
+ # graphics hardware monitoring (HWMON) support
+ i915-$(CONFIG_HWMON) += i915_hwmon.o
  # modesetting core code
  i915-y += \
        display/hsw_ips.o \
@@@ -282,7 -285,6 +285,7 @@@ i915-y += 
        display/intel_ddi.o \
        display/intel_ddi_buf_trans.o \
        display/intel_display_trace.o \
 +      display/intel_dkl_phy.o \
        display/intel_dp.o \
        display/intel_dp_aux.o \
        display/intel_dp_aux_backlight.o \
  
  i915-y += i915_perf.o
  
- # Protected execution platform (PXP) support
- i915-$(CONFIG_DRM_I915_PXP) += \
+ # Protected execution platform (PXP) support. Base support is required for HuC
+ i915-y += \
        pxp/intel_pxp.o \
+       pxp/intel_pxp_tee.o \
+       pxp/intel_pxp_huc.o
+ i915-$(CONFIG_DRM_I915_PXP) += \
        pxp/intel_pxp_cmd.o \
        pxp/intel_pxp_debugfs.o \
        pxp/intel_pxp_irq.o \
        pxp/intel_pxp_pm.o \
-       pxp/intel_pxp_session.o \
-       pxp/intel_pxp_tee.o
+       pxp/intel_pxp_session.o
  
  # Post-mortem debug and GPU hang state capture
  i915-$(CONFIG_DRM_I915_CAPTURE_ERROR) += i915_gpu_error.o
@@@ -80,7 -80,8 +80,7 @@@
  static struct platform_device *
  lpe_audio_platdev_create(struct drm_i915_private *dev_priv)
  {
 -      struct drm_device *dev = &dev_priv->drm;
 -      struct pci_dev *pdev = to_pci_dev(dev->dev);
 +      struct pci_dev *pdev = to_pci_dev(dev_priv->drm.dev);
        struct platform_device_info pinfo = {};
        struct resource *rsc;
        struct platform_device *platdev;
        rsc[0].flags    = IORESOURCE_IRQ;
        rsc[0].name     = "hdmi-lpe-audio-irq";
  
-       rsc[1].start    = pci_resource_start(pdev, GTTMMADR_BAR) +
+       rsc[1].start    = pci_resource_start(pdev, GEN4_GTTMMADR_BAR) +
                I915_HDMI_LPE_AUDIO_BASE;
-       rsc[1].end      = pci_resource_start(pdev, GTTMMADR_BAR) +
+       rsc[1].end      = pci_resource_start(pdev, GEN4_GTTMMADR_BAR) +
                I915_HDMI_LPE_AUDIO_BASE + I915_HDMI_LPE_AUDIO_SIZE - 1;
        rsc[1].flags    = IORESOURCE_MEM;
        rsc[1].name     = "hdmi-lpe-audio-mmio";
  
 -      pinfo.parent = dev->dev;
 +      pinfo.parent = dev_priv->drm.dev;
        pinfo.name = "hdmi-lpe-audio";
        pinfo.id = -1;
        pinfo.res = rsc;
@@@ -25,43 -25,44 +25,44 @@@ static struct drm_i915_gem_object *dma_
        return to_intel_bo(buf->priv);
  }
  
- static struct sg_table *i915_gem_map_dma_buf(struct dma_buf_attachment *attachment,
+ static struct sg_table *i915_gem_map_dma_buf(struct dma_buf_attachment *attach,
                                             enum dma_data_direction dir)
  {
-       struct drm_i915_gem_object *obj = dma_buf_to_obj(attachment->dmabuf);
-       struct sg_table *st;
+       struct drm_i915_gem_object *obj = dma_buf_to_obj(attach->dmabuf);
+       struct sg_table *sgt;
        struct scatterlist *src, *dst;
        int ret, i;
  
-       /* Copy sg so that we make an independent mapping */
-       st = kmalloc(sizeof(struct sg_table), GFP_KERNEL);
-       if (st == NULL) {
+       /*
+        * Make a copy of the object's sgt, so that we can make an independent
+        * mapping
+        */
+       sgt = kmalloc(sizeof(*sgt), GFP_KERNEL);
+       if (!sgt) {
                ret = -ENOMEM;
                goto err;
        }
  
-       ret = sg_alloc_table(st, obj->mm.pages->nents, GFP_KERNEL);
+       ret = sg_alloc_table(sgt, obj->mm.pages->orig_nents, GFP_KERNEL);
        if (ret)
                goto err_free;
  
-       src = obj->mm.pages->sgl;
-       dst = st->sgl;
-       for (i = 0; i < obj->mm.pages->nents; i++) {
+       dst = sgt->sgl;
+       for_each_sg(obj->mm.pages->sgl, src, obj->mm.pages->orig_nents, i) {
                sg_set_page(dst, sg_page(src), src->length, 0);
                dst = sg_next(dst);
-               src = sg_next(src);
        }
  
-       ret = dma_map_sgtable(attachment->dev, st, dir, DMA_ATTR_SKIP_CPU_SYNC);
+       ret = dma_map_sgtable(attach->dev, sgt, dir, DMA_ATTR_SKIP_CPU_SYNC);
        if (ret)
                goto err_free_sg;
  
-       return st;
+       return sgt;
  
  err_free_sg:
-       sg_free_table(st);
+       sg_free_table(sgt);
  err_free:
-       kfree(st);
+       kfree(sgt);
  err:
        return ERR_PTR(ret);
  }
@@@ -72,7 -73,7 +73,7 @@@ static int i915_gem_dmabuf_vmap(struct 
        struct drm_i915_gem_object *obj = dma_buf_to_obj(dma_buf);
        void *vaddr;
  
 -      vaddr = i915_gem_object_pin_map_unlocked(obj, I915_MAP_WB);
 +      vaddr = i915_gem_object_pin_map(obj, I915_MAP_WB);
        if (IS_ERR(vaddr))
                return PTR_ERR(vaddr);
  
@@@ -236,15 -237,15 +237,15 @@@ struct dma_buf *i915_gem_prime_export(s
  static int i915_gem_object_get_pages_dmabuf(struct drm_i915_gem_object *obj)
  {
        struct drm_i915_private *i915 = to_i915(obj->base.dev);
-       struct sg_table *pages;
+       struct sg_table *sgt;
        unsigned int sg_page_sizes;
  
        assert_object_held(obj);
  
-       pages = dma_buf_map_attachment(obj->base.import_attach,
-                                      DMA_BIDIRECTIONAL);
-       if (IS_ERR(pages))
-               return PTR_ERR(pages);
+       sgt = dma_buf_map_attachment(obj->base.import_attach,
+                                    DMA_BIDIRECTIONAL);
+       if (IS_ERR(sgt))
+               return PTR_ERR(sgt);
  
        /*
         * DG1 is special here since it still snoops transactions even with
            (!HAS_LLC(i915) && !IS_DG1(i915)))
                wbinvd_on_all_cpus();
  
-       sg_page_sizes = i915_sg_dma_sizes(pages->sgl);
-       __i915_gem_object_set_pages(obj, pages, sg_page_sizes);
+       sg_page_sizes = i915_sg_dma_sizes(sgt->sgl);
+       __i915_gem_object_set_pages(obj, sgt, sg_page_sizes);
  
        return 0;
  }
  
  static void i915_gem_object_put_pages_dmabuf(struct drm_i915_gem_object *obj,
-                                            struct sg_table *pages)
+                                            struct sg_table *sgt)
  {
-       dma_buf_unmap_attachment(obj->base.import_attach, pages,
+       dma_buf_unmap_attachment(obj->base.import_attach, sgt,
                                 DMA_BIDIRECTIONAL);
  }
  
@@@ -313,7 -314,7 +314,7 @@@ struct drm_gem_object *i915_gem_prime_i
        get_dma_buf(dma_buf);
  
        obj = i915_gem_object_alloc();
-       if (obj == NULL) {
+       if (!obj) {
                ret = -ENOMEM;
                goto fail_detach;
        }
@@@ -2424,7 -2424,7 +2424,7 @@@ gen8_dispatch_bsd_engine(struct drm_i91
        /* Check whether the file_priv has already selected one ring. */
        if ((int)file_priv->bsd_engine < 0)
                file_priv->bsd_engine =
 -                      get_random_int() % num_vcs_engines(dev_priv);
 +                      prandom_u32_max(num_vcs_engines(dev_priv));
  
        return file_priv->bsd_engine;
  }
@@@ -2954,11 -2954,6 +2954,6 @@@ await_fence_array(struct i915_execbuffe
        int err;
  
        for (n = 0; n < eb->num_fences; n++) {
-               struct drm_syncobj *syncobj;
-               unsigned int flags;
-               syncobj = ptr_unpack_bits(eb->fences[n].syncobj, &flags, 2);
                if (!eb->fences[n].dma_fence)
                        continue;
  
@@@ -290,21 -290,7 +290,21 @@@ void __i915_gem_object_pages_fini(struc
        __i915_gem_object_free_mmaps(obj);
  
        atomic_set(&obj->mm.pages_pin_count, 0);
 +
 +      /*
 +       * dma_buf_unmap_attachment() requires reservation to be
 +       * locked. The imported GEM shouldn't share reservation lock
 +       * and ttm_bo_cleanup_memtype_use() shouldn't be invoked for
 +       * dma-buf, so it's safe to take the lock.
 +       */
 +      if (obj->base.import_attach)
 +              i915_gem_object_lock(obj, NULL);
 +
        __i915_gem_object_put_pages(obj);
 +
 +      if (obj->base.import_attach)
 +              i915_gem_object_unlock(obj);
 +
        GEM_BUG_ON(i915_gem_object_has_pages(obj));
  }
  
@@@ -458,6 -444,16 +458,16 @@@ i915_gem_object_read_from_page_iomap(st
        io_mapping_unmap(src_map);
  }
  
+ static bool object_has_mappable_iomem(struct drm_i915_gem_object *obj)
+ {
+       GEM_BUG_ON(!i915_gem_object_has_iomem(obj));
+       if (IS_DGFX(to_i915(obj->base.dev)))
+               return i915_ttm_resource_mappable(i915_gem_to_ttm(obj)->resource);
+       return true;
+ }
  /**
   * i915_gem_object_read_from_page - read data from the page of a GEM object
   * @obj: GEM object to read from
@@@ -480,7 -476,7 +490,7 @@@ int i915_gem_object_read_from_page(stru
  
        if (i915_gem_object_has_struct_page(obj))
                i915_gem_object_read_from_page_kmap(obj, offset, dst, size);
-       else if (i915_gem_object_has_iomem(obj))
+       else if (i915_gem_object_has_iomem(obj) && object_has_mappable_iomem(obj))
                i915_gem_object_read_from_page_iomap(obj, offset, dst, size);
        else
                return -ENODEV;
@@@ -189,7 -189,7 +189,7 @@@ static int i915_ttm_tt_shmem_populate(s
        struct drm_i915_private *i915 = container_of(bdev, typeof(*i915), bdev);
        struct intel_memory_region *mr = i915->mm.regions[INTEL_MEMORY_SYSTEM];
        struct i915_ttm_tt *i915_tt = container_of(ttm, typeof(*i915_tt), ttm);
-       const unsigned int max_segment = i915_sg_segment_size();
+       const unsigned int max_segment = i915_sg_segment_size(i915->drm.dev);
        const size_t size = (size_t)ttm->num_pages << PAGE_SHIFT;
        struct file *filp = i915_tt->filp;
        struct sgt_iter sgt_iter;
@@@ -279,7 -279,7 +279,7 @@@ static struct ttm_tt *i915_ttm_tt_creat
        struct i915_ttm_tt *i915_tt;
        int ret;
  
-       if (!obj)
+       if (i915_ttm_is_ghost_object(bo))
                return NULL;
  
        i915_tt = kzalloc(sizeof(*i915_tt), GFP_KERNEL);
@@@ -362,7 -362,7 +362,7 @@@ static bool i915_ttm_eviction_valuable(
  {
        struct drm_i915_gem_object *obj = i915_ttm_to_gem(bo);
  
-       if (!obj)
+       if (i915_ttm_is_ghost_object(bo))
                return false;
  
        /*
@@@ -509,18 -509,9 +509,9 @@@ static int i915_ttm_shrink(struct drm_i
  static void i915_ttm_delete_mem_notify(struct ttm_buffer_object *bo)
  {
        struct drm_i915_gem_object *obj = i915_ttm_to_gem(bo);
-       intel_wakeref_t wakeref = 0;
-       if (bo->resource && likely(obj)) {
-               /* ttm_bo_release() already has dma_resv_lock */
-               if (i915_ttm_cpu_maps_iomem(bo->resource))
-                       wakeref = intel_runtime_pm_get(&to_i915(obj->base.dev)->runtime_pm);
  
+       if (bo->resource && !i915_ttm_is_ghost_object(bo)) {
                __i915_gem_object_pages_fini(obj);
-               if (wakeref)
-                       intel_runtime_pm_put(&to_i915(obj->base.dev)->runtime_pm, wakeref);
                i915_ttm_free_cached_io_rsgt(obj);
        }
  }
@@@ -538,7 -529,7 +529,7 @@@ static struct i915_refct_sgt *i915_ttm_
        ret = sg_alloc_table_from_pages_segment(st,
                        ttm->pages, ttm->num_pages,
                        0, (unsigned long)ttm->num_pages << PAGE_SHIFT,
-                       i915_sg_segment_size(), GFP_KERNEL);
+                       i915_sg_segment_size(i915_tt->dev), GFP_KERNEL);
        if (ret) {
                st->sgl = NULL;
                return ERR_PTR(ret);
@@@ -624,7 -615,7 +615,7 @@@ static void i915_ttm_swap_notify(struc
        struct drm_i915_gem_object *obj = i915_ttm_to_gem(bo);
        int ret;
  
-       if (!obj)
+       if (i915_ttm_is_ghost_object(bo))
                return;
  
        ret = i915_ttm_move_notify(bo);
@@@ -649,7 -640,7 +640,7 @@@ bool i915_ttm_resource_mappable(struct 
        if (!i915_ttm_cpu_maps_iomem(res))
                return true;
  
 -      return bman_res->used_visible_size == bman_res->base.num_pages;
 +      return bman_res->used_visible_size == PFN_UP(bman_res->base.size);
  }
  
  static int i915_ttm_io_mem_reserve(struct ttm_device *bdev, struct ttm_resource *mem)
        struct drm_i915_gem_object *obj = i915_ttm_to_gem(mem->bo);
        bool unknown_state;
  
-       if (!obj)
+       if (i915_ttm_is_ghost_object(mem->bo))
                return -EINVAL;
  
        if (!kref_get_unless_zero(&obj->base.refcount))
@@@ -690,7 -681,7 +681,7 @@@ static unsigned long i915_ttm_io_mem_pf
        unsigned long base;
        unsigned int ofs;
  
-       GEM_BUG_ON(!obj);
+       GEM_BUG_ON(i915_ttm_is_ghost_object(bo));
        GEM_WARN_ON(bo->ttm);
  
        base = obj->mm.region->iomap.base - obj->mm.region->region.start;
        return ((base + sg_dma_address(sg)) >> PAGE_SHIFT) + ofs;
  }
  
+ static int i915_ttm_access_memory(struct ttm_buffer_object *bo,
+                                 unsigned long offset, void *buf,
+                                 int len, int write)
+ {
+       struct drm_i915_gem_object *obj = i915_ttm_to_gem(bo);
+       resource_size_t iomap = obj->mm.region->iomap.base -
+               obj->mm.region->region.start;
+       unsigned long page = offset >> PAGE_SHIFT;
+       unsigned long bytes_left = len;
+       /*
+        * TODO: For now just let it fail if the resource is non-mappable,
+        * otherwise we need to perform the memcpy from the gpu here, without
+        * interfering with the object (like moving the entire thing).
+        */
+       if (!i915_ttm_resource_mappable(bo->resource))
+               return -EIO;
+       offset -= page << PAGE_SHIFT;
+       do {
+               unsigned long bytes = min(bytes_left, PAGE_SIZE - offset);
+               void __iomem *ptr;
+               dma_addr_t daddr;
+               daddr = i915_gem_object_get_dma_address(obj, page);
+               ptr = ioremap_wc(iomap + daddr + offset, bytes);
+               if (!ptr)
+                       return -EIO;
+               if (write)
+                       memcpy_toio(ptr, buf, bytes);
+               else
+                       memcpy_fromio(buf, ptr, bytes);
+               iounmap(ptr);
+               page++;
+               buf += bytes;
+               bytes_left -= bytes;
+               offset = 0;
+       } while (bytes_left);
+       return len;
+ }
  /*
   * All callbacks need to take care not to downcast a struct ttm_buffer_object
   * without checking its subclass, since it might be a TTM ghost object.
@@@ -715,6 -750,7 +750,7 @@@ static struct ttm_device_funcs i915_ttm
        .delete_mem_notify = i915_ttm_delete_mem_notify,
        .io_mem_reserve = i915_ttm_io_mem_reserve,
        .io_mem_pfn = i915_ttm_io_mem_pfn,
+       .access_memory = i915_ttm_access_memory,
  };
  
  /**
@@@ -990,13 -1026,12 +1026,12 @@@ static vm_fault_t vm_fault_ttm(struct v
        struct vm_area_struct *area = vmf->vma;
        struct ttm_buffer_object *bo = area->vm_private_data;
        struct drm_device *dev = bo->base.dev;
-       struct drm_i915_gem_object *obj;
+       struct drm_i915_gem_object *obj = i915_ttm_to_gem(bo);
        intel_wakeref_t wakeref = 0;
        vm_fault_t ret;
        int idx;
  
-       obj = i915_ttm_to_gem(bo);
-       if (!obj)
+       if (i915_ttm_is_ghost_object(bo))
                return VM_FAULT_SIGBUS;
  
        /* Sanity check that we allow writing into this object */
                }
  
                if (err) {
-                       drm_dbg(dev, "Unable to make resource CPU accessible\n");
+                       drm_dbg(dev, "Unable to make resource CPU accessible(err = %pe)\n",
+                               ERR_PTR(err));
                        dma_resv_unlock(bo->base.resv);
                        ret = VM_FAULT_SIGBUS;
                        goto out_rpm;
        if (ret == VM_FAULT_RETRY && !(vmf->flags & FAULT_FLAG_RETRY_NOWAIT))
                goto out_rpm;
  
-       /* ttm_bo_vm_reserve() already has dma_resv_lock */
+       /*
+        * ttm_bo_vm_reserve() already has dma_resv_lock.
+        * userfault_count is protected by dma_resv lock and rpm wakeref.
+        */
        if (ret == VM_FAULT_NOPAGE && wakeref && !obj->userfault_count) {
                obj->userfault_count = 1;
-               mutex_lock(&to_gt(to_i915(obj->base.dev))->lmem_userfault_lock);
-               list_add(&obj->userfault_link, &to_gt(to_i915(obj->base.dev))->lmem_userfault_list);
-               mutex_unlock(&to_gt(to_i915(obj->base.dev))->lmem_userfault_lock);
+               spin_lock(&to_i915(obj->base.dev)->runtime_pm.lmem_userfault_lock);
+               list_add(&obj->userfault_link, &to_i915(obj->base.dev)->runtime_pm.lmem_userfault_list);
+               spin_unlock(&to_i915(obj->base.dev)->runtime_pm.lmem_userfault_lock);
        }
  
        if (wakeref & CONFIG_DRM_I915_USERFAULT_AUTOSUSPEND)
-               intel_wakeref_auto(&to_gt(to_i915(obj->base.dev))->userfault_wakeref,
+               intel_wakeref_auto(&to_i915(obj->base.dev)->runtime_pm.userfault_wakeref,
                                   msecs_to_jiffies_timeout(CONFIG_DRM_I915_USERFAULT_AUTOSUSPEND));
  
        i915_ttm_adjust_lru(obj);
@@@ -1094,7 -1133,7 +1133,7 @@@ static void ttm_vm_open(struct vm_area_
        struct drm_i915_gem_object *obj =
                i915_ttm_to_gem(vma->vm_private_data);
  
-       GEM_BUG_ON(!obj);
+       GEM_BUG_ON(i915_ttm_is_ghost_object(vma->vm_private_data));
        i915_gem_object_get(obj);
  }
  
@@@ -1103,7 -1142,7 +1142,7 @@@ static void ttm_vm_close(struct vm_area
        struct drm_i915_gem_object *obj =
                i915_ttm_to_gem(vma->vm_private_data);
  
-       GEM_BUG_ON(!obj);
+       GEM_BUG_ON(i915_ttm_is_ghost_object(vma->vm_private_data));
        i915_gem_object_put(obj);
  }
  
@@@ -1124,7 -1163,27 +1163,27 @@@ static u64 i915_ttm_mmap_offset(struct 
  
  static void i915_ttm_unmap_virtual(struct drm_i915_gem_object *obj)
  {
+       struct ttm_buffer_object *bo = i915_gem_to_ttm(obj);
+       intel_wakeref_t wakeref = 0;
+       assert_object_held_shared(obj);
+       if (i915_ttm_cpu_maps_iomem(bo->resource)) {
+               wakeref = intel_runtime_pm_get(&to_i915(obj->base.dev)->runtime_pm);
+               /* userfault_count is protected by obj lock and rpm wakeref. */
+               if (obj->userfault_count) {
+                       spin_lock(&to_i915(obj->base.dev)->runtime_pm.lmem_userfault_lock);
+                       list_del(&obj->userfault_link);
+                       spin_unlock(&to_i915(obj->base.dev)->runtime_pm.lmem_userfault_lock);
+                       obj->userfault_count = 0;
+               }
+       }
        ttm_bo_unmap_virtual(i915_gem_to_ttm(obj));
+       if (wakeref)
+               intel_runtime_pm_put(&to_i915(obj->base.dev)->runtime_pm, wakeref);
  }
  
  static const struct drm_i915_gem_object_ops i915_gem_ttm_obj_ops = {
@@@ -129,7 -129,7 +129,7 @@@ static void i915_gem_object_userptr_dro
  static int i915_gem_userptr_get_pages(struct drm_i915_gem_object *obj)
  {
        const unsigned long num_pages = obj->base.size >> PAGE_SHIFT;
-       unsigned int max_segment = i915_sg_segment_size();
+       unsigned int max_segment = i915_sg_segment_size(obj->base.dev->dev);
        struct sg_table *st;
        unsigned int sg_page_sizes;
        struct page **pvec;
@@@ -292,7 -292,7 +292,7 @@@ int i915_gem_object_userptr_submit_init
        if (!i915_gem_object_is_readonly(obj))
                gup_flags |= FOLL_WRITE;
  
-       pinned = ret = 0;
+       pinned = 0;
        while (pinned < num_pages) {
                ret = pin_user_pages_fast(obj->userptr.ptr + pinned * PAGE_SIZE,
                                          num_pages - pinned, gup_flags,
  
                pinned += ret;
        }
-       ret = 0;
  
        ret = i915_gem_object_lock_interruptible(obj, NULL);
        if (ret)
@@@ -426,11 -425,12 +425,11 @@@ static const struct drm_i915_gem_object
  static int
  probe_range(struct mm_struct *mm, unsigned long addr, unsigned long len)
  {
 -      const unsigned long end = addr + len;
 +      VMA_ITERATOR(vmi, mm, addr);
        struct vm_area_struct *vma;
 -      int ret = -EFAULT;
  
        mmap_read_lock(mm);
 -      for (vma = find_vma(mm, addr); vma; vma = vma->vm_next) {
 +      for_each_vma_range(vmi, vma, addr + len) {
                /* Check for holes, note that we also update the addr below */
                if (vma->vm_start > addr)
                        break;
                if (vma->vm_flags & (VM_PFNMAP | VM_MIXEDMAP))
                        break;
  
 -              if (vma->vm_end >= end) {
 -                      ret = 0;
 -                      break;
 -              }
 -
                addr = vma->vm_end;
        }
        mmap_read_unlock(mm);
  
 -      return ret;
 +      if (vma)
 +              return -EFAULT;
 +      return 0;
  }
  
  /*
@@@ -6,8 -6,12 +6,12 @@@
  
  #include "i915_drv.h"
  #include "i915_selftest.h"
+ #include "gem/i915_gem_context.h"
  
+ #include "mock_context.h"
  #include "mock_dmabuf.h"
+ #include "igt_gem_utils.h"
+ #include "selftests/mock_drm.h"
  #include "selftests/mock_gem_device.h"
  
  static int igt_dmabuf_export(void *arg)
@@@ -140,6 -144,75 +144,75 @@@ out_ret
        return err;
  }
  
+ static int verify_access(struct drm_i915_private *i915,
+                        struct drm_i915_gem_object *native_obj,
+                        struct drm_i915_gem_object *import_obj)
+ {
+       struct i915_gem_engines_iter it;
+       struct i915_gem_context *ctx;
+       struct intel_context *ce;
+       struct i915_vma *vma;
+       struct file *file;
+       u32 *vaddr;
+       int err = 0, i;
+       file = mock_file(i915);
+       if (IS_ERR(file))
+               return PTR_ERR(file);
+       ctx = live_context(i915, file);
+       if (IS_ERR(ctx)) {
+               err = PTR_ERR(ctx);
+               goto out_file;
+       }
+       for_each_gem_engine(ce, i915_gem_context_lock_engines(ctx), it) {
+               if (intel_engine_can_store_dword(ce->engine))
+                       break;
+       }
+       i915_gem_context_unlock_engines(ctx);
+       if (!ce)
+               goto out_file;
+       vma = i915_vma_instance(import_obj, ce->vm, NULL);
+       if (IS_ERR(vma)) {
+               err = PTR_ERR(vma);
+               goto out_file;
+       }
+       err = i915_vma_pin(vma, 0, 0, PIN_USER);
+       if (err)
+               goto out_file;
+       err = igt_gpu_fill_dw(ce, vma, 0,
+                             vma->size >> PAGE_SHIFT, 0xdeadbeaf);
+       i915_vma_unpin(vma);
+       if (err)
+               goto out_file;
+       err = i915_gem_object_wait(import_obj, 0, MAX_SCHEDULE_TIMEOUT);
+       if (err)
+               goto out_file;
+       vaddr = i915_gem_object_pin_map_unlocked(native_obj, I915_MAP_WB);
+       if (IS_ERR(vaddr)) {
+               err = PTR_ERR(vaddr);
+               goto out_file;
+       }
+       for (i = 0; i < native_obj->base.size / sizeof(u32); i += PAGE_SIZE / sizeof(u32)) {
+               if (vaddr[i] != 0xdeadbeaf) {
+                       pr_err("Data mismatch [%d]=%u\n", i, vaddr[i]);
+                       err = -EINVAL;
+                       goto out_file;
+               }
+       }
+ out_file:
+       fput(file);
+       return err;
+ }
  static int igt_dmabuf_import_same_driver(struct drm_i915_private *i915,
                                         struct intel_memory_region **regions,
                                         unsigned int num_regions)
  
        force_different_devices = true;
  
-       obj = __i915_gem_object_create_user(i915, PAGE_SIZE,
+       obj = __i915_gem_object_create_user(i915, SZ_8M,
                                            regions, num_regions);
        if (IS_ERR(obj)) {
                pr_err("__i915_gem_object_create_user failed with err=%ld\n",
  
        i915_gem_object_unlock(import_obj);
  
+       err = verify_access(i915, obj, import_obj);
+       if (err)
+               goto out_import;
        /* Now try a fake an importer */
        import_attach = dma_buf_attach(dmabuf, obj->base.dev->dev);
        if (IS_ERR(import_attach)) {
                goto out_import;
        }
  
 -      st = dma_buf_map_attachment(import_attach, DMA_BIDIRECTIONAL);
 +      st = dma_buf_map_attachment_unlocked(import_attach, DMA_BIDIRECTIONAL);
        if (IS_ERR(st)) {
                err = PTR_ERR(st);
                goto out_detach;
                timeout = -ETIME;
        }
        err = timeout > 0 ? 0 : timeout;
 -      dma_buf_unmap_attachment(import_attach, st, DMA_BIDIRECTIONAL);
 +      dma_buf_unmap_attachment_unlocked(import_attach, st, DMA_BIDIRECTIONAL);
  out_detach:
        dma_buf_detach(dmabuf, import_attach);
  out_import:
@@@ -296,7 -373,7 +373,7 @@@ static int igt_dmabuf_import(void *arg
                goto out_obj;
        }
  
 -      err = dma_buf_vmap(dmabuf, &map);
 +      err = dma_buf_vmap_unlocked(dmabuf, &map);
        dma_map = err ? NULL : map.vaddr;
        if (!dma_map) {
                pr_err("dma_buf_vmap failed\n");
  
        err = 0;
  out_dma_map:
 -      dma_buf_vunmap(dmabuf, &map);
 +      dma_buf_vunmap_unlocked(dmabuf, &map);
  out_obj:
        i915_gem_object_put(obj);
  out_dmabuf:
@@@ -358,7 -435,7 +435,7 @@@ static int igt_dmabuf_import_ownership(
        if (IS_ERR(dmabuf))
                return PTR_ERR(dmabuf);
  
 -      err = dma_buf_vmap(dmabuf, &map);
 +      err = dma_buf_vmap_unlocked(dmabuf, &map);
        ptr = err ? NULL : map.vaddr;
        if (!ptr) {
                pr_err("dma_buf_vmap failed\n");
        }
  
        memset(ptr, 0xc5, PAGE_SIZE);
 -      dma_buf_vunmap(dmabuf, &map);
 +      dma_buf_vunmap_unlocked(dmabuf, &map);
  
        obj = to_intel_bo(i915_gem_prime_import(&i915->drm, dmabuf));
        if (IS_ERR(obj)) {
@@@ -418,7 -495,7 +495,7 @@@ static int igt_dmabuf_export_vmap(void 
        }
        i915_gem_object_put(obj);
  
 -      err = dma_buf_vmap(dmabuf, &map);
 +      err = dma_buf_vmap_unlocked(dmabuf, &map);
        ptr = err ? NULL : map.vaddr;
        if (!ptr) {
                pr_err("dma_buf_vmap failed\n");
        memset(ptr, 0xc5, dmabuf->size);
  
        err = 0;
 -      dma_buf_vunmap(dmabuf, &map);
 +      dma_buf_vunmap_unlocked(dmabuf, &map);
  out:
        dma_buf_put(dmabuf);
        return err;
@@@ -8,6 -8,19 +8,19 @@@
  
  #include "i915_reg_defs.h"
  
+ #define MCR_REG(offset)       ((const i915_mcr_reg_t){ .reg = (offset) })
+ /*
+  * The perf control registers are technically multicast registers, but the
+  * driver never needs to read/write them directly; we only use them to build
+  * lists of registers (where they're mixed in with other non-MCR registers)
+  * and then operate on the offset directly.  For now we'll just define them
+  * as non-multicast so we can place them on the same list, but we may want
+  * to try to come up with a better way to handle heterogeneous lists of
+  * registers in the future.
+  */
+ #define PERF_REG(offset)                      _MMIO(offset)
  /* RPM unit config (Gen8+) */
  #define RPM_CONFIG0                           _MMIO(0xd00)
  #define   GEN9_RPM_CONFIG0_CRYSTAL_CLOCK_FREQ_SHIFT   3
  #define FORCEWAKE_ACK_RENDER_GEN9             _MMIO(0xd84)
  #define FORCEWAKE_ACK_MEDIA_GEN9              _MMIO(0xd88)
  
+ #define FORCEWAKE_ACK_GSC                     _MMIO(0xdf8)
+ #define FORCEWAKE_ACK_GT_MTL                  _MMIO(0xdfc)
 +#define GMD_ID_GRAPHICS                               _MMIO(0xd8c)
 +#define GMD_ID_MEDIA                          _MMIO(MTL_MEDIA_GSI_BASE + 0xd8c)
 +
  #define MCFG_MCR_SELECTOR                     _MMIO(0xfd0)
+ #define MTL_MCR_SELECTOR                      _MMIO(0xfd4)
  #define SF_MCR_SELECTOR                               _MMIO(0xfd8)
  #define GEN8_MCR_SELECTOR                     _MMIO(0xfdc)
+ #define GAM_MCR_SELECTOR                      _MMIO(0xfe0)
  #define   GEN8_MCR_SLICE(slice)                       (((slice) & 3) << 26)
  #define   GEN8_MCR_SLICE_MASK                 GEN8_MCR_SLICE(3)
  #define   GEN8_MCR_SUBSLICE(subslice)         (((subslice) & 3) << 24)
@@@ -54,6 -69,8 +72,8 @@@
  #define   GEN11_MCR_SLICE_MASK                        GEN11_MCR_SLICE(0xf)
  #define   GEN11_MCR_SUBSLICE(subslice)                (((subslice) & 0x7) << 24)
  #define   GEN11_MCR_SUBSLICE_MASK             GEN11_MCR_SUBSLICE(0x7)
+ #define   MTL_MCR_GROUPID                     REG_GENMASK(11, 8)
+ #define   MTL_MCR_INSTANCEID                  REG_GENMASK(3, 0)
  
  #define IPEIR_I965                            _MMIO(0x2064)
  #define IPEHR_I965                            _MMIO(0x2068)
  #define GEN7_TLB_RD_ADDR                      _MMIO(0x4700)
  
  #define GEN12_PAT_INDEX(index)                        _MMIO(0x4800 + (index) * 4)
+ #define XEHP_PAT_INDEX(index)                 MCR_REG(0x4800 + (index) * 4)
  
- #define XEHP_TILE0_ADDR_RANGE                 _MMIO(0x4900)
+ #define XEHP_TILE0_ADDR_RANGE                 MCR_REG(0x4900)
  #define   XEHP_TILE_LMEM_RANGE_SHIFT          8
  
- #define XEHP_FLAT_CCS_BASE_ADDR                       _MMIO(0x4910)
+ #define XEHP_FLAT_CCS_BASE_ADDR                       MCR_REG(0x4910)
  #define   XEHP_CCS_BASE_SHIFT                 8
  
  #define GAMTARBMODE                           _MMIO(0x4a08)
  #define CHICKEN_RASTER_2                      _MMIO(0x6208)
  #define   TBIMR_FAST_CLIP                     REG_BIT(5)
  
- #define VFLSKPD                                       _MMIO(0x62a8)
+ #define VFLSKPD                                       MCR_REG(0x62a8)
  #define   DIS_OVER_FETCH_CACHE                        REG_BIT(1)
  #define   DIS_MULT_MISS_RD_SQUASH             REG_BIT(0)
  
- #define FF_MODE2                              _MMIO(0x6604)
+ #define GEN12_FF_MODE2                                _MMIO(0x6604)
+ #define XEHP_FF_MODE2                         MCR_REG(0x6604)
  #define   FF_MODE2_GS_TIMER_MASK              REG_GENMASK(31, 24)
  #define   FF_MODE2_GS_TIMER_224                       REG_FIELD_PREP(FF_MODE2_GS_TIMER_MASK, 224)
  #define   FF_MODE2_TDS_TIMER_MASK             REG_GENMASK(23, 16)
  #define   FF_MODE2_TDS_TIMER_128              REG_FIELD_PREP(FF_MODE2_TDS_TIMER_MASK, 4)
  
- #define XEHPG_INSTDONE_GEOM_SVG                       _MMIO(0x666c)
+ #define XEHPG_INSTDONE_GEOM_SVG                       MCR_REG(0x666c)
  
  #define CACHE_MODE_0_GEN7                     _MMIO(0x7000) /* IVB+ */
  #define   RC_OP_FLUSH_ENABLE                  (1 << 0)
  #define HIZ_CHICKEN                           _MMIO(0x7018)
  #define   CHV_HZ_8X8_MODE_IN_1X                       REG_BIT(15)
  #define   DG1_HZ_READ_SUPPRESSION_OPTIMIZATION_DISABLE        REG_BIT(14)
+ #define   HZ_DEPTH_TEST_LE_GE_OPT_DISABLE     REG_BIT(13)
  #define   BDW_HIZ_POWER_COMPILER_CLOCK_GATING_DISABLE REG_BIT(3)
  
  #define GEN8_L3CNTLREG                                _MMIO(0x7034)
  #define GEN8_HDC_CHICKEN1                     _MMIO(0x7304)
  
  #define GEN11_COMMON_SLICE_CHICKEN3           _MMIO(0x7304)
+ #define XEHP_COMMON_SLICE_CHICKEN3            MCR_REG(0x7304)
  #define   DG1_FLOAT_POINT_BLEND_OPT_STRICT_MODE_EN    REG_BIT(12)
  #define   XEHP_DUAL_SIMD8_SEQ_MERGE_DISABLE   REG_BIT(12)
  #define   GEN11_BLEND_EMB_FIX_DISABLE_IN_RCC  REG_BIT(11)
  #define   GEN12_DISABLE_CPS_AWARE_COLOR_PIPE  REG_BIT(9)
  
- /* GEN9 chicken */
- #define SLICE_ECO_CHICKEN0                    _MMIO(0x7308)
- #define   PIXEL_MASK_CAMMING_DISABLE          (1 << 14)
- #define GEN9_SLICE_COMMON_ECO_CHICKEN0                _MMIO(0x7308)
- #define   DISABLE_PIXEL_MASK_CAMMING          (1 << 14)
  #define GEN9_SLICE_COMMON_ECO_CHICKEN1                _MMIO(0x731c)
- #define   GEN11_STATE_CACHE_REDIRECT_TO_CS    (1 << 11)
- #define SLICE_COMMON_ECO_CHICKEN1             _MMIO(0x731c)
+ #define XEHP_SLICE_COMMON_ECO_CHICKEN1                MCR_REG(0x731c)
  #define   MSC_MSAA_REODER_BUF_BYPASS_DISABLE  REG_BIT(14)
+ #define   GEN11_STATE_CACHE_REDIRECT_TO_CS    (1 << 11)
  
  #define GEN9_SLICE_PGCTL_ACK(slice)           _MMIO(0x804c + (slice) * 0x4)
  #define GEN10_SLICE_PGCTL_ACK(slice)          _MMIO(0x804c + ((slice) / 3) * 0x34 + \
  #define VF_PREEMPTION                         _MMIO(0x83a4)
  #define   PREEMPTION_VERTEX_COUNT             REG_GENMASK(15, 0)
  
+ #define VFG_PREEMPTION_CHICKEN                        _MMIO(0x83b4)
+ #define   POLYGON_TRIFAN_LINELOOP_DISABLE     REG_BIT(4)
  #define GEN8_RC6_CTX_INFO                     _MMIO(0x8504)
  
- #define GEN12_SQCM                            _MMIO(0x8724)
+ #define XEHP_SQCM                             MCR_REG(0x8724)
  #define   EN_32B_ACCESS                               REG_BIT(30)
  
  #define HSW_IDICR                             _MMIO(0x9008)
  #define   GEN6_MBCTL_BOOT_FETCH_MECH          (1 << 0)
  
  /* Fuse readout registers for GT */
+ #define XEHP_FUSE4                            _MMIO(0x9114)
+ #define   GT_L3_EXC_MASK                      REG_GENMASK(6, 4)
  #define       GEN10_MIRROR_FUSE3                      _MMIO(0x9118)
  #define   GEN10_L3BANK_PAIR_COUNT             4
  #define   GEN10_L3BANK_MASK                   0x0F
  
  #define GEN7_MISCCPCTL                                _MMIO(0x9424)
  #define   GEN7_DOP_CLOCK_GATE_ENABLE          (1 << 0)
+ #define GEN8_MISCCPCTL                                MCR_REG(0x9424)
+ #define   GEN8_DOP_CLOCK_GATE_ENABLE          REG_BIT(0)
  #define   GEN12_DOP_CLOCK_GATE_RENDER_ENABLE  REG_BIT(1)
  #define   GEN8_DOP_CLOCK_GATE_CFCLK_ENABLE    (1 << 2)
  #define   GEN8_DOP_CLOCK_GATE_GUC_ENABLE      (1 << 4)
  #define   GAMTLBVEBOX0_CLKGATE_DIS            REG_BIT(16)
  #define   LTCDD_CLKGATE_DIS                   REG_BIT(10)
  
- #define SLICE_UNIT_LEVEL_CLKGATE              _MMIO(0x94d4)
+ #define GEN11_SLICE_UNIT_LEVEL_CLKGATE                _MMIO(0x94d4)
+ #define XEHP_SLICE_UNIT_LEVEL_CLKGATE         MCR_REG(0x94d4)
  #define   SARBUNIT_CLKGATE_DIS                        (1 << 5)
  #define   RCCUNIT_CLKGATE_DIS                 (1 << 7)
  #define   MSCUNIT_CLKGATE_DIS                 (1 << 10)
  #define   L3_CLKGATE_DIS                      REG_BIT(16)
  #define   L3_CR2X_CLKGATE_DIS                 REG_BIT(17)
  
- #define SCCGCTL94DC                           _MMIO(0x94dc)
+ #define SCCGCTL94DC                           MCR_REG(0x94dc)
  #define   CG3DDISURB                          REG_BIT(14)
  
  #define UNSLICE_UNIT_LEVEL_CLKGATE2           _MMIO(0x94e4)
  #define   VSUNIT_CLKGATE_DIS_TGL              REG_BIT(19)
  #define   PSDUNIT_CLKGATE_DIS                 REG_BIT(5)
  
- #define SUBSLICE_UNIT_LEVEL_CLKGATE           _MMIO(0x9524)
+ #define GEN11_SUBSLICE_UNIT_LEVEL_CLKGATE     MCR_REG(0x9524)
  #define   DSS_ROUTER_CLKGATE_DIS              REG_BIT(28)
  #define   GWUNIT_CLKGATE_DIS                  REG_BIT(16)
  
- #define SUBSLICE_UNIT_LEVEL_CLKGATE2          _MMIO(0x9528)
+ #define SUBSLICE_UNIT_LEVEL_CLKGATE2          MCR_REG(0x9528)
  #define   CPSSUNIT_CLKGATE_DIS                        REG_BIT(9)
  
- #define SSMCGCTL9530                          _MMIO(0x9530)
+ #define SSMCGCTL9530                          MCR_REG(0x9530)
  #define   RTFUNIT_CLKGATE_DIS                 REG_BIT(18)
  
- #define GEN10_DFR_RATIO_EN_AND_CHICKEN                _MMIO(0x9550)
+ #define GEN10_DFR_RATIO_EN_AND_CHICKEN                MCR_REG(0x9550)
  #define   DFR_DISABLE                         (1 << 9)
  
- #define INF_UNIT_LEVEL_CLKGATE                        _MMIO(0x9560)
+ #define INF_UNIT_LEVEL_CLKGATE                        MCR_REG(0x9560)
  #define   CGPSF_CLKGATE_DIS                   (1 << 3)
  
  #define MICRO_BP0_0                           _MMIO(0x9800)
  #define FORCEWAKE_MEDIA_VDBOX_GEN11(n)                _MMIO(0xa540 + (n) * 4)
  #define FORCEWAKE_MEDIA_VEBOX_GEN11(n)                _MMIO(0xa560 + (n) * 4)
  
+ #define FORCEWAKE_REQ_GSC                     _MMIO(0xa618)
  #define CHV_POWER_SS0_SIG1                    _MMIO(0xa720)
  #define CHV_POWER_SS0_SIG2                    _MMIO(0xa724)
  #define CHV_POWER_SS1_SIG1                    _MMIO(0xa728)
  
  /* MOCS (Memory Object Control State) registers */
  #define GEN9_LNCFCMOCS(i)                     _MMIO(0xb020 + (i) * 4) /* L3 Cache Control */
- #define GEN9_LNCFCMOCS_REG_COUNT              32
+ #define XEHP_LNCFCMOCS(i)                     MCR_REG(0xb020 + (i) * 4)
+ #define LNCFCMOCS_REG_COUNT                   32
  
  #define GEN7_L3CNTLREG3                               _MMIO(0xb024)
  
  #define GEN7_L3LOG(slice, i)                  _MMIO(0xb070 + (slice) * 0x200 + (i) * 4)
  #define   GEN7_L3LOG_SIZE                     0x80
  
- #define GEN10_SCRATCH_LNCF2                   _MMIO(0xb0a0)
- #define   PMFLUSHDONE_LNICRSDROP              (1 << 20)
- #define   PMFLUSH_GAPL3UNBLOCK                        (1 << 21)
- #define   PMFLUSHDONE_LNEBLK                  (1 << 22)
- #define XEHP_L3NODEARBCFG                     _MMIO(0xb0b4)
+ #define XEHP_L3NODEARBCFG                     MCR_REG(0xb0b4)
  #define   XEHP_LNESPARE                               REG_BIT(19)
  
- #define GEN8_L3SQCREG1                                _MMIO(0xb100)
+ #define GEN8_L3SQCREG1                                MCR_REG(0xb100)
  /*
   * Note that on CHV the following has an off-by-one error wrt. to BSpec.
   * Using the formula in BSpec leads to a hang, while the formula here works
  #define   L3_HIGH_PRIO_CREDITS(x)             (((x) >> 1) << 14)
  #define   L3_PRIO_CREDITS_MASK                        ((0x1f << 19) | (0x1f << 14))
  
- #define GEN10_L3_CHICKEN_MODE_REGISTER                _MMIO(0xb114)
- #define   GEN11_I2M_WRITE_DISABLE             (1 << 28)
- #define GEN8_L3SQCREG4                                _MMIO(0xb118)
+ #define GEN8_L3SQCREG4                                MCR_REG(0xb118)
  #define   GEN11_LQSC_CLEAN_EVICT_DISABLE      (1 << 6)
  #define   GEN8_LQSC_RO_PERF_DIS                       (1 << 27)
  #define   GEN8_LQSC_FLUSH_COHERENT_LINES      (1 << 21)
  #define   GEN8_LQSQ_NONIA_COHERENT_ATOMICS_ENABLE     REG_BIT(22)
  
- #define GEN9_SCRATCH1                         _MMIO(0xb11c)
+ #define GEN9_SCRATCH1                         MCR_REG(0xb11c)
  #define   EVICTION_PERF_FIX_ENABLE            REG_BIT(8)
  
- #define BDW_SCRATCH1                          _MMIO(0xb11c)
+ #define BDW_SCRATCH1                          MCR_REG(0xb11c)
  #define   GEN9_LBS_SLA_RETRY_TIMER_DECREMENT_ENABLE   (1 << 2)
  
- #define GEN11_SCRATCH2                                _MMIO(0xb140)
+ #define GEN11_SCRATCH2                                MCR_REG(0xb140)
  #define   GEN11_COHERENT_PARTIAL_WRITE_MERGE_ENABLE   (1 << 19)
  
- #define GEN11_L3SQCREG5                               _MMIO(0xb158)
+ #define XEHP_L3SQCREG5                                MCR_REG(0xb158)
  #define   L3_PWM_TIMER_INIT_VAL_MASK          REG_GENMASK(9, 0)
  
- #define MLTICTXCTL                            _MMIO(0xb170)
+ #define MLTICTXCTL                            MCR_REG(0xb170)
  #define   TDONRENDER                          REG_BIT(2)
  
- #define XEHP_L3SCQREG7                                _MMIO(0xb188)
+ #define XEHP_L3SCQREG7                                MCR_REG(0xb188)
  #define   BLEND_FILL_CACHING_OPT_DIS          REG_BIT(3)
  
  #define XEHPC_L3SCRUB                         _MMIO(0xb18c)
  #define   SCRUB_RATE_PER_BANK_MASK            REG_GENMASK(2, 0)
  #define   SCRUB_RATE_4B_PER_CLK                       REG_FIELD_PREP(SCRUB_RATE_PER_BANK_MASK, 0x6)
  
- #define L3SQCREG1_CCS0                                _MMIO(0xb200)
+ #define L3SQCREG1_CCS0                                MCR_REG(0xb200)
  #define   FLUSHALLNONCOH                      REG_BIT(5)
  
  #define GEN11_GLBLINVL                                _MMIO(0xb404)
  #define GEN9_BLT_MOCS(i)                      _MMIO(__GEN9_BCS0_MOCS0 + (i) * 4)
  
  #define GEN12_FAULT_TLB_DATA0                 _MMIO(0xceb8)
+ #define XEHP_FAULT_TLB_DATA0                  MCR_REG(0xceb8)
  #define GEN12_FAULT_TLB_DATA1                 _MMIO(0xcebc)
+ #define XEHP_FAULT_TLB_DATA1                  MCR_REG(0xcebc)
  #define   FAULT_VA_HIGH_BITS                  (0xf << 0)
  #define   FAULT_GTT_SEL                               (1 << 4)
  
  #define GEN12_RING_FAULT_REG                  _MMIO(0xcec4)
+ #define XEHP_RING_FAULT_REG                   MCR_REG(0xcec4)
  #define   GEN8_RING_FAULT_ENGINE_ID(x)                (((x) >> 12) & 0x7)
  #define   RING_FAULT_GTTSEL_MASK              (1 << 11)
  #define   RING_FAULT_SRCID(x)                 (((x) >> 3) & 0xff)
  #define   RING_FAULT_VALID                    (1 << 0)
  
  #define GEN12_GFX_TLB_INV_CR                  _MMIO(0xced8)
+ #define XEHP_GFX_TLB_INV_CR                   MCR_REG(0xced8)
  #define GEN12_VD_TLB_INV_CR                   _MMIO(0xcedc)
+ #define XEHP_VD_TLB_INV_CR                    MCR_REG(0xcedc)
  #define GEN12_VE_TLB_INV_CR                   _MMIO(0xcee0)
+ #define XEHP_VE_TLB_INV_CR                    MCR_REG(0xcee0)
  #define GEN12_BLT_TLB_INV_CR                  _MMIO(0xcee4)
+ #define XEHP_BLT_TLB_INV_CR                   MCR_REG(0xcee4)
  #define GEN12_COMPCTX_TLB_INV_CR              _MMIO(0xcf04)
+ #define XEHP_COMPCTX_TLB_INV_CR                       MCR_REG(0xcf04)
  
- #define GEN12_MERT_MOD_CTRL                   _MMIO(0xcf28)
- #define RENDER_MOD_CTRL                               _MMIO(0xcf2c)
- #define COMP_MOD_CTRL                         _MMIO(0xcf30)
- #define VDBX_MOD_CTRL                         _MMIO(0xcf34)
- #define VEBX_MOD_CTRL                         _MMIO(0xcf38)
+ #define XEHP_MERT_MOD_CTRL                    MCR_REG(0xcf28)
+ #define RENDER_MOD_CTRL                               MCR_REG(0xcf2c)
+ #define COMP_MOD_CTRL                         MCR_REG(0xcf30)
+ #define VDBX_MOD_CTRL                         MCR_REG(0xcf34)
+ #define VEBX_MOD_CTRL                         MCR_REG(0xcf38)
  #define   FORCE_MISS_FTLB                     REG_BIT(3)
  
  #define GEN12_GAMSTLB_CTRL                    _MMIO(0xcf4c)
  #define GEN12_GAM_DONE                                _MMIO(0xcf68)
  
  #define GEN7_HALF_SLICE_CHICKEN1              _MMIO(0xe100) /* IVB GT1 + VLV */
+ #define GEN8_HALF_SLICE_CHICKEN1              MCR_REG(0xe100)
  #define   GEN7_MAX_PS_THREAD_DEP              (8 << 12)
  #define   GEN7_SINGLE_SUBSCAN_DISPATCH_ENABLE (1 << 10)
  #define   GEN7_SBE_SS_CACHE_DISPATCH_PORT_SHARING_DISABLE     (1 << 4)
  #define   GEN7_PSD_SINGLE_PORT_DISPATCH_ENABLE        (1 << 3)
  
  #define GEN7_SAMPLER_INSTDONE                 _MMIO(0xe160)
+ #define GEN8_SAMPLER_INSTDONE                 MCR_REG(0xe160)
  #define GEN7_ROW_INSTDONE                     _MMIO(0xe164)
+ #define GEN8_ROW_INSTDONE                     MCR_REG(0xe164)
  
- #define HALF_SLICE_CHICKEN2                   _MMIO(0xe180)
+ #define HALF_SLICE_CHICKEN2                   MCR_REG(0xe180)
  #define   GEN8_ST_PO_DISABLE                  (1 << 13)
  
- #define HALF_SLICE_CHICKEN3                   _MMIO(0xe184)
+ #define HSW_HALF_SLICE_CHICKEN3                       _MMIO(0xe184)
+ #define GEN8_HALF_SLICE_CHICKEN3              MCR_REG(0xe184)
  #define   HSW_SAMPLE_C_PERFORMANCE            (1 << 9)
  #define   GEN8_CENTROID_PIXEL_OPT_DIS         (1 << 8)
  #define   GEN9_DISABLE_OCL_OOB_SUPPRESS_LOGIC (1 << 5)
  #define   GEN8_SAMPLER_POWER_BYPASS_DIS               (1 << 1)
  
- #define GEN9_HALF_SLICE_CHICKEN5              _MMIO(0xe188)
+ #define GEN9_HALF_SLICE_CHICKEN5              MCR_REG(0xe188)
  #define   GEN9_DG_MIRROR_FIX_ENABLE           (1 << 5)
  #define   GEN9_CCS_TLB_PREFETCH_ENABLE                (1 << 3)
  
- #define GEN10_SAMPLER_MODE                    _MMIO(0xe18c)
+ #define GEN10_SAMPLER_MODE                    MCR_REG(0xe18c)
  #define   ENABLE_SMALLPL                      REG_BIT(15)
  #define   SC_DISABLE_POWER_OPTIMIZATION_EBB   REG_BIT(9)
  #define   GEN11_SAMPLER_ENABLE_HEADLESS_MSG   REG_BIT(5)
  
- #define GEN9_HALF_SLICE_CHICKEN7              _MMIO(0xe194)
+ #define GEN9_HALF_SLICE_CHICKEN7              MCR_REG(0xe194)
  #define   DG2_DISABLE_ROUND_ENABLE_ALLOW_FOR_SSLA     REG_BIT(15)
  #define   GEN9_SAMPLER_HASH_COMPRESSED_READ_ADDR      REG_BIT(8)
  #define   GEN9_ENABLE_YV12_BUGFIX             REG_BIT(4)
  #define   GEN9_ENABLE_GPGPU_PREEMPTION                REG_BIT(2)
  
- #define GEN10_CACHE_MODE_SS                   _MMIO(0xe420)
+ #define GEN10_CACHE_MODE_SS                   MCR_REG(0xe420)
  #define   ENABLE_EU_COUNT_FOR_TDL_FLUSH               REG_BIT(10)
  #define   DISABLE_ECC                         REG_BIT(5)
  #define   FLOAT_BLEND_OPTIMIZATION_ENABLE     REG_BIT(4)
  #define   ENABLE_PREFETCH_INTO_IC             REG_BIT(3)
  
- #define EU_PERF_CNTL0                         _MMIO(0xe458)
- #define EU_PERF_CNTL4                         _MMIO(0xe45c)
+ #define EU_PERF_CNTL0                         PERF_REG(0xe458)
+ #define EU_PERF_CNTL4                         PERF_REG(0xe45c)
  
- #define GEN9_ROW_CHICKEN4                     _MMIO(0xe48c)
+ #define GEN9_ROW_CHICKEN4                     MCR_REG(0xe48c)
  #define   GEN12_DISABLE_GRF_CLEAR             REG_BIT(13)
  #define   XEHP_DIS_BBL_SYSPIPE                        REG_BIT(11)
  #define   GEN12_DISABLE_TDL_PUSH              REG_BIT(9)
  #define HSW_ROW_CHICKEN3                      _MMIO(0xe49c)
  #define   HSW_ROW_CHICKEN3_L3_GLOBAL_ATOMICS_DISABLE  (1 << 6)
  
- #define GEN8_ROW_CHICKEN                      _MMIO(0xe4f0)
+ #define GEN8_ROW_CHICKEN                      MCR_REG(0xe4f0)
  #define   FLOW_CONTROL_ENABLE                 REG_BIT(15)
  #define   UGM_BACKUP_MODE                     REG_BIT(13)
  #define   MDQ_ARBITRATION_MODE                        REG_BIT(12)
  #define   DISABLE_EARLY_EOT                   REG_BIT(1)
  
  #define GEN7_ROW_CHICKEN2                     _MMIO(0xe4f4)
+ #define GEN8_ROW_CHICKEN2                     MCR_REG(0xe4f4)
  #define   GEN12_DISABLE_READ_SUPPRESSION      REG_BIT(15)
  #define   GEN12_DISABLE_EARLY_READ            REG_BIT(14)
  #define   GEN12_ENABLE_LARGE_GRF_MODE         REG_BIT(12)
  #define   GEN12_PUSH_CONST_DEREF_HOLD_DIS     REG_BIT(8)
+ #define   GEN12_DISABLE_DOP_GATING              REG_BIT(0)
  
- #define RT_CTRL                                       _MMIO(0xe530)
+ #define RT_CTRL                                       MCR_REG(0xe530)
  #define   DIS_NULL_QUERY                      REG_BIT(10)
  #define   STACKID_CTRL                                REG_GENMASK(6, 5)
  #define   STACKID_CTRL_512                    REG_FIELD_PREP(STACKID_CTRL, 0x2)
  
- #define EU_PERF_CNTL1                         _MMIO(0xe558)
- #define EU_PERF_CNTL5                         _MMIO(0xe55c)
+ #define EU_PERF_CNTL1                         PERF_REG(0xe558)
+ #define EU_PERF_CNTL5                         PERF_REG(0xe55c)
  
- #define GEN12_HDC_CHICKEN0                    _MMIO(0xe5f0)
+ #define XEHP_HDC_CHICKEN0                     MCR_REG(0xe5f0)
  #define   LSC_L1_FLUSH_CTL_3D_DATAPORT_FLUSH_EVENTS_MASK      REG_GENMASK(13, 11)
- #define ICL_HDC_MODE                          _MMIO(0xe5f4)
+ #define ICL_HDC_MODE                          MCR_REG(0xe5f4)
  
- #define EU_PERF_CNTL2                         _MMIO(0xe658)
- #define EU_PERF_CNTL6                         _MMIO(0xe65c)
- #define EU_PERF_CNTL3                         _MMIO(0xe758)
+ #define EU_PERF_CNTL2                         PERF_REG(0xe658)
+ #define EU_PERF_CNTL6                         PERF_REG(0xe65c)
+ #define EU_PERF_CNTL3                         PERF_REG(0xe758)
  
- #define LSC_CHICKEN_BIT_0                     _MMIO(0xe7c8)
+ #define LSC_CHICKEN_BIT_0                     MCR_REG(0xe7c8)
  #define   DISABLE_D8_D16_COASLESCE            REG_BIT(30)
  #define   FORCE_1_SUB_MESSAGE_PER_FRAGMENT    REG_BIT(15)
- #define LSC_CHICKEN_BIT_0_UDW                 _MMIO(0xe7c8 + 4)
+ #define LSC_CHICKEN_BIT_0_UDW                 MCR_REG(0xe7c8 + 4)
  #define   DIS_CHAIN_2XSIMD8                   REG_BIT(55 - 32)
  #define   FORCE_SLM_FENCE_SCOPE_TO_TILE               REG_BIT(42 - 32)
  #define   FORCE_UGM_FENCE_SCOPE_TO_TILE               REG_BIT(41 - 32)
  #define   MAXREQS_PER_BANK                    REG_GENMASK(39 - 32, 37 - 32)
  #define   DISABLE_128B_EVICTION_COMMAND_UDW   REG_BIT(36 - 32)
  
- #define SARB_CHICKEN1                         _MMIO(0xe90c)
+ #define SARB_CHICKEN1                         MCR_REG(0xe90c)
  #define   COMP_CKN_IN                         REG_GENMASK(30, 29)
  
- #define GEN7_HALF_SLICE_CHICKEN1_GT2          _MMIO(0xf100)
  #define GEN7_ROW_CHICKEN2_GT2                 _MMIO(0xf4f4)
  #define   DOP_CLOCK_GATING_DISABLE            (1 << 0)
  #define   PUSH_CONSTANT_DEREF_DISABLE         (1 << 8)
  #define VLV_RENDER_C0_COUNT                   _MMIO(0x138118)
  #define VLV_MEDIA_C0_COUNT                    _MMIO(0x13811c)
  
+ #define GEN12_RPSTAT1                         _MMIO(0x1381b4)
+ #define   GEN12_VOLTAGE_MASK                  REG_GENMASK(10, 0)
  #define GEN11_GT_INTR_DW(x)                   _MMIO(0x190018 + ((x) * 4))
  #define   GEN11_CSME                          (31)
  #define   GEN11_GUNIT                         (28)
  
  #define GEN12_SFC_DONE(n)                     _MMIO(0x1cc000 + (n) * 0x1000)
  
+ #define GT0_PACKAGE_ENERGY_STATUS             _MMIO(0x250004)
+ #define GT0_PACKAGE_RAPL_LIMIT                        _MMIO(0x250008)
+ #define GT0_PACKAGE_POWER_SKU_UNIT            _MMIO(0x250068)
+ #define GT0_PLATFORM_ENERGY_STATUS            _MMIO(0x25006c)
  /*
   * Standalone Media's non-engine GT registers are located at their regular GT
   * offsets plus 0x380000.  This extra offset is stored inside the intel_uncore
@@@ -166,6 -166,21 +166,21 @@@ static void wa_add(struct i915_wa_list 
        _wa_add(wal, &wa);
  }
  
+ static void wa_mcr_add(struct i915_wa_list *wal, i915_mcr_reg_t reg,
+                      u32 clear, u32 set, u32 read_mask, bool masked_reg)
+ {
+       struct i915_wa wa = {
+               .mcr_reg = reg,
+               .clr  = clear,
+               .set  = set,
+               .read = read_mask,
+               .masked_reg = masked_reg,
+               .is_mcr = 1,
+       };
+       _wa_add(wal, &wa);
+ }
  static void
  wa_write_clr_set(struct i915_wa_list *wal, i915_reg_t reg, u32 clear, u32 set)
  {
  }
  
  static void
+ wa_mcr_write_clr_set(struct i915_wa_list *wal, i915_mcr_reg_t reg, u32 clear, u32 set)
+ {
+       wa_mcr_add(wal, reg, clear, set, clear, false);
+ }
+ static void
  wa_write(struct i915_wa_list *wal, i915_reg_t reg, u32 set)
  {
        wa_write_clr_set(wal, reg, ~0, set);
@@@ -185,11 -206,23 +206,23 @@@ wa_write_or(struct i915_wa_list *wal, i
  }
  
  static void
+ wa_mcr_write_or(struct i915_wa_list *wal, i915_mcr_reg_t reg, u32 set)
+ {
+       wa_mcr_write_clr_set(wal, reg, set, set);
+ }
+ static void
  wa_write_clr(struct i915_wa_list *wal, i915_reg_t reg, u32 clr)
  {
        wa_write_clr_set(wal, reg, clr, 0);
  }
  
+ static void
+ wa_mcr_write_clr(struct i915_wa_list *wal, i915_mcr_reg_t reg, u32 clr)
+ {
+       wa_mcr_write_clr_set(wal, reg, clr, 0);
+ }
  /*
   * WA operations on "masked register". A masked register has the upper 16 bits
   * documented as "masked" in b-spec. Its purpose is to allow writing to just a
@@@ -208,18 -241,37 +241,37 @@@ wa_masked_en(struct i915_wa_list *wal, 
  }
  
  static void
+ wa_mcr_masked_en(struct i915_wa_list *wal, i915_mcr_reg_t reg, u32 val)
+ {
+       wa_mcr_add(wal, reg, 0, _MASKED_BIT_ENABLE(val), val, true);
+ }
+ static void
  wa_masked_dis(struct i915_wa_list *wal, i915_reg_t reg, u32 val)
  {
        wa_add(wal, reg, 0, _MASKED_BIT_DISABLE(val), val, true);
  }
  
  static void
+ wa_mcr_masked_dis(struct i915_wa_list *wal, i915_mcr_reg_t reg, u32 val)
+ {
+       wa_mcr_add(wal, reg, 0, _MASKED_BIT_DISABLE(val), val, true);
+ }
+ static void
  wa_masked_field_set(struct i915_wa_list *wal, i915_reg_t reg,
                    u32 mask, u32 val)
  {
        wa_add(wal, reg, 0, _MASKED_FIELD(mask, val), mask, true);
  }
  
+ static void
+ wa_mcr_masked_field_set(struct i915_wa_list *wal, i915_mcr_reg_t reg,
+                       u32 mask, u32 val)
+ {
+       wa_mcr_add(wal, reg, 0, _MASKED_FIELD(mask, val), mask, true);
+ }
  static void gen6_ctx_workarounds_init(struct intel_engine_cs *engine,
                                      struct i915_wa_list *wal)
  {
@@@ -241,8 -293,8 +293,8 @@@ static void gen8_ctx_workarounds_init(s
        wa_masked_en(wal, RING_MI_MODE(RENDER_RING_BASE), ASYNC_FLIP_PERF_DISABLE);
  
        /* WaDisablePartialInstShootdown:bdw,chv */
-       wa_masked_en(wal, GEN8_ROW_CHICKEN,
-                    PARTIAL_INSTRUCTION_SHOOTDOWN_DISABLE);
+       wa_mcr_masked_en(wal, GEN8_ROW_CHICKEN,
+                        PARTIAL_INSTRUCTION_SHOOTDOWN_DISABLE);
  
        /* Use Force Non-Coherent whenever executing a 3D context. This is a
         * workaround for a possible hang in the unlikely event a TLB
@@@ -288,18 -340,18 +340,18 @@@ static void bdw_ctx_workarounds_init(st
        gen8_ctx_workarounds_init(engine, wal);
  
        /* WaDisableThreadStallDopClockGating:bdw (pre-production) */
-       wa_masked_en(wal, GEN8_ROW_CHICKEN, STALL_DOP_GATING_DISABLE);
+       wa_mcr_masked_en(wal, GEN8_ROW_CHICKEN, STALL_DOP_GATING_DISABLE);
  
        /* WaDisableDopClockGating:bdw
         *
         * Also see the related UCGTCL1 write in bdw_init_clock_gating()
         * to disable EUTC clock gating.
         */
-       wa_masked_en(wal, GEN7_ROW_CHICKEN2,
-                    DOP_CLOCK_GATING_DISABLE);
+       wa_mcr_masked_en(wal, GEN8_ROW_CHICKEN2,
+                        DOP_CLOCK_GATING_DISABLE);
  
-       wa_masked_en(wal, HALF_SLICE_CHICKEN3,
-                    GEN8_SAMPLER_POWER_BYPASS_DIS);
+       wa_mcr_masked_en(wal, GEN8_HALF_SLICE_CHICKEN3,
+                        GEN8_SAMPLER_POWER_BYPASS_DIS);
  
        wa_masked_en(wal, HDC_CHICKEN0,
                     /* WaForceContextSaveRestoreNonCoherent:bdw */
@@@ -314,7 -366,7 +366,7 @@@ static void chv_ctx_workarounds_init(st
        gen8_ctx_workarounds_init(engine, wal);
  
        /* WaDisableThreadStallDopClockGating:chv */
-       wa_masked_en(wal, GEN8_ROW_CHICKEN, STALL_DOP_GATING_DISABLE);
+       wa_mcr_masked_en(wal, GEN8_ROW_CHICKEN, STALL_DOP_GATING_DISABLE);
  
        /* Improve HiZ throughput on CHV. */
        wa_masked_en(wal, HIZ_CHICKEN, CHV_HZ_8X8_MODE_IN_1X);
@@@ -333,21 -385,21 +385,21 @@@ static void gen9_ctx_workarounds_init(s
                 */
                wa_masked_en(wal, COMMON_SLICE_CHICKEN2,
                             GEN9_PBE_COMPRESSED_HASH_SELECTION);
-               wa_masked_en(wal, GEN9_HALF_SLICE_CHICKEN7,
-                            GEN9_SAMPLER_HASH_COMPRESSED_READ_ADDR);
+               wa_mcr_masked_en(wal, GEN9_HALF_SLICE_CHICKEN7,
+                                GEN9_SAMPLER_HASH_COMPRESSED_READ_ADDR);
        }
  
        /* WaClearFlowControlGpgpuContextSave:skl,bxt,kbl,glk,cfl */
        /* WaDisablePartialInstShootdown:skl,bxt,kbl,glk,cfl */
-       wa_masked_en(wal, GEN8_ROW_CHICKEN,
-                    FLOW_CONTROL_ENABLE |
-                    PARTIAL_INSTRUCTION_SHOOTDOWN_DISABLE);
+       wa_mcr_masked_en(wal, GEN8_ROW_CHICKEN,
+                        FLOW_CONTROL_ENABLE |
+                        PARTIAL_INSTRUCTION_SHOOTDOWN_DISABLE);
  
        /* WaEnableYV12BugFixInHalfSliceChicken7:skl,bxt,kbl,glk,cfl */
        /* WaEnableSamplerGPGPUPreemptionSupport:skl,bxt,kbl,cfl */
-       wa_masked_en(wal, GEN9_HALF_SLICE_CHICKEN7,
-                    GEN9_ENABLE_YV12_BUGFIX |
-                    GEN9_ENABLE_GPGPU_PREEMPTION);
+       wa_mcr_masked_en(wal, GEN9_HALF_SLICE_CHICKEN7,
+                        GEN9_ENABLE_YV12_BUGFIX |
+                        GEN9_ENABLE_GPGPU_PREEMPTION);
  
        /* Wa4x4STCOptimizationDisable:skl,bxt,kbl,glk,cfl */
        /* WaDisablePartialResolveInVc:skl,bxt,kbl,cfl */
                     GEN9_PARTIAL_RESOLVE_IN_VC_DISABLE);
  
        /* WaCcsTlbPrefetchDisable:skl,bxt,kbl,glk,cfl */
-       wa_masked_dis(wal, GEN9_HALF_SLICE_CHICKEN5,
-                     GEN9_CCS_TLB_PREFETCH_ENABLE);
+       wa_mcr_masked_dis(wal, GEN9_HALF_SLICE_CHICKEN5,
+                         GEN9_CCS_TLB_PREFETCH_ENABLE);
  
        /* WaForceContextSaveRestoreNonCoherent:skl,bxt,kbl,cfl */
        wa_masked_en(wal, HDC_CHICKEN0,
            IS_KABYLAKE(i915) ||
            IS_COFFEELAKE(i915) ||
            IS_COMETLAKE(i915))
-               wa_masked_en(wal, HALF_SLICE_CHICKEN3,
-                            GEN8_SAMPLER_POWER_BYPASS_DIS);
+               wa_mcr_masked_en(wal, GEN8_HALF_SLICE_CHICKEN3,
+                                GEN8_SAMPLER_POWER_BYPASS_DIS);
  
        /* WaDisableSTUnitPowerOptimization:skl,bxt,kbl,glk,cfl */
-       wa_masked_en(wal, HALF_SLICE_CHICKEN2, GEN8_ST_PO_DISABLE);
+       wa_mcr_masked_en(wal, HALF_SLICE_CHICKEN2, GEN8_ST_PO_DISABLE);
  
        /*
         * Supporting preemption with fine-granularity requires changes in the
@@@ -469,8 -521,8 +521,8 @@@ static void bxt_ctx_workarounds_init(st
        gen9_ctx_workarounds_init(engine, wal);
  
        /* WaDisableThreadStallDopClockGating:bxt */
-       wa_masked_en(wal, GEN8_ROW_CHICKEN,
-                    STALL_DOP_GATING_DISABLE);
+       wa_mcr_masked_en(wal, GEN8_ROW_CHICKEN,
+                        STALL_DOP_GATING_DISABLE);
  
        /* WaToEnableHwFixForPushConstHWBug:bxt */
        wa_masked_en(wal, COMMON_SLICE_CHICKEN2,
@@@ -490,8 -542,8 +542,8 @@@ static void kbl_ctx_workarounds_init(st
                             GEN8_SBE_DISABLE_REPLAY_BUF_OPTIMIZATION);
  
        /* WaDisableSbeCacheDispatchPortSharing:kbl */
-       wa_masked_en(wal, GEN7_HALF_SLICE_CHICKEN1,
-                    GEN7_SBE_SS_CACHE_DISPATCH_PORT_SHARING_DISABLE);
+       wa_mcr_masked_en(wal, GEN8_HALF_SLICE_CHICKEN1,
+                        GEN7_SBE_SS_CACHE_DISPATCH_PORT_SHARING_DISABLE);
  }
  
  static void glk_ctx_workarounds_init(struct intel_engine_cs *engine,
@@@ -514,8 -566,8 +566,8 @@@ static void cfl_ctx_workarounds_init(st
                     GEN8_SBE_DISABLE_REPLAY_BUF_OPTIMIZATION);
  
        /* WaDisableSbeCacheDispatchPortSharing:cfl */
-       wa_masked_en(wal, GEN7_HALF_SLICE_CHICKEN1,
-                    GEN7_SBE_SS_CACHE_DISPATCH_PORT_SHARING_DISABLE);
+       wa_mcr_masked_en(wal, GEN8_HALF_SLICE_CHICKEN1,
+                        GEN7_SBE_SS_CACHE_DISPATCH_PORT_SHARING_DISABLE);
  }
  
  static void icl_ctx_workarounds_init(struct intel_engine_cs *engine,
         * (the register is whitelisted in hardware now, so UMDs can opt in
         * for coherency if they have a good reason).
         */
-       wa_masked_en(wal, ICL_HDC_MODE, HDC_FORCE_NON_COHERENT);
+       wa_mcr_masked_en(wal, ICL_HDC_MODE, HDC_FORCE_NON_COHERENT);
  
        /* WaEnableFloatBlendOptimization:icl */
-       wa_add(wal, GEN10_CACHE_MODE_SS, 0,
-              _MASKED_BIT_ENABLE(FLOAT_BLEND_OPTIMIZATION_ENABLE),
-              0 /* write-only, so skip validation */,
-              true);
+       wa_mcr_add(wal, GEN10_CACHE_MODE_SS, 0,
+                  _MASKED_BIT_ENABLE(FLOAT_BLEND_OPTIMIZATION_ENABLE),
+                  0 /* write-only, so skip validation */,
+                  true);
  
        /* WaDisableGPGPUMidThreadPreemption:icl */
        wa_masked_field_set(wal, GEN8_CS_CHICKEN1,
                            GEN9_PREEMPT_GPGPU_THREAD_GROUP_LEVEL);
  
        /* allow headerless messages for preemptible GPGPU context */
-       wa_masked_en(wal, GEN10_SAMPLER_MODE,
-                    GEN11_SAMPLER_ENABLE_HEADLESS_MSG);
+       wa_mcr_masked_en(wal, GEN10_SAMPLER_MODE,
+                        GEN11_SAMPLER_ENABLE_HEADLESS_MSG);
  
        /* Wa_1604278689:icl,ehl */
        wa_write(wal, IVB_FBC_RT_BASE, 0xFFFFFFFF & ~ILK_FBC_RT_VALID);
                         0xFFFFFFFF);
  
        /* Wa_1406306137:icl,ehl */
-       wa_masked_en(wal, GEN9_ROW_CHICKEN4, GEN11_DIS_PICK_2ND_EU);
+       wa_mcr_masked_en(wal, GEN9_ROW_CHICKEN4, GEN11_DIS_PICK_2ND_EU);
  }
  
  /*
@@@ -569,13 -621,13 +621,13 @@@ static void dg2_ctx_gt_tuning_init(stru
                                   struct i915_wa_list *wal)
  {
        wa_masked_en(wal, CHICKEN_RASTER_2, TBIMR_FAST_CLIP);
-       wa_write_clr_set(wal, GEN11_L3SQCREG5, L3_PWM_TIMER_INIT_VAL_MASK,
-                        REG_FIELD_PREP(L3_PWM_TIMER_INIT_VAL_MASK, 0x7f));
-       wa_add(wal,
-              FF_MODE2,
-              FF_MODE2_TDS_TIMER_MASK,
-              FF_MODE2_TDS_TIMER_128,
-              0, false);
+       wa_mcr_write_clr_set(wal, XEHP_L3SQCREG5, L3_PWM_TIMER_INIT_VAL_MASK,
+                            REG_FIELD_PREP(L3_PWM_TIMER_INIT_VAL_MASK, 0x7f));
+       wa_mcr_add(wal,
+                  XEHP_FF_MODE2,
+                  FF_MODE2_TDS_TIMER_MASK,
+                  FF_MODE2_TDS_TIMER_128,
+                  0, false);
  }
  
  /*
@@@ -599,7 -651,7 +651,7 @@@ static void gen12_ctx_gt_tuning_init(st
         * verification is ignored.
         */
        wa_add(wal,
-              FF_MODE2,
+              GEN12_FF_MODE2,
               FF_MODE2_TDS_TIMER_MASK,
               FF_MODE2_TDS_TIMER_128,
               0, false);
  static void gen12_ctx_workarounds_init(struct intel_engine_cs *engine,
                                       struct i915_wa_list *wal)
  {
+       struct drm_i915_private *i915 = engine->i915;
        gen12_ctx_gt_tuning_init(engine, wal);
  
        /*
         * to Wa_1608008084.
         */
        wa_add(wal,
-              FF_MODE2,
+              GEN12_FF_MODE2,
               FF_MODE2_GS_TIMER_MASK,
               FF_MODE2_GS_TIMER_224,
               0, false);
+       if (!IS_DG1(i915))
+               /* Wa_1806527549 */
+               wa_masked_en(wal, HIZ_CHICKEN, HZ_DEPTH_TEST_LE_GE_OPT_DISABLE);
  }
  
  static void dg1_ctx_workarounds_init(struct intel_engine_cs *engine,
@@@ -664,27 -722,27 +722,27 @@@ static void dg2_ctx_workarounds_init(st
  
        /* Wa_16011186671:dg2_g11 */
        if (IS_DG2_GRAPHICS_STEP(engine->i915, G11, STEP_A0, STEP_B0)) {
-               wa_masked_dis(wal, VFLSKPD, DIS_MULT_MISS_RD_SQUASH);
-               wa_masked_en(wal, VFLSKPD, DIS_OVER_FETCH_CACHE);
+               wa_mcr_masked_dis(wal, VFLSKPD, DIS_MULT_MISS_RD_SQUASH);
+               wa_mcr_masked_en(wal, VFLSKPD, DIS_OVER_FETCH_CACHE);
        }
  
        if (IS_DG2_GRAPHICS_STEP(engine->i915, G10, STEP_A0, STEP_B0)) {
                /* Wa_14010469329:dg2_g10 */
-               wa_masked_en(wal, GEN11_COMMON_SLICE_CHICKEN3,
-                            XEHP_DUAL_SIMD8_SEQ_MERGE_DISABLE);
+               wa_mcr_masked_en(wal, XEHP_COMMON_SLICE_CHICKEN3,
+                                XEHP_DUAL_SIMD8_SEQ_MERGE_DISABLE);
  
                /*
                 * Wa_22010465075:dg2_g10
                 * Wa_22010613112:dg2_g10
                 * Wa_14010698770:dg2_g10
                 */
-               wa_masked_en(wal, GEN11_COMMON_SLICE_CHICKEN3,
-                            GEN12_DISABLE_CPS_AWARE_COLOR_PIPE);
+               wa_mcr_masked_en(wal, XEHP_COMMON_SLICE_CHICKEN3,
+                                GEN12_DISABLE_CPS_AWARE_COLOR_PIPE);
        }
  
        /* Wa_16013271637:dg2 */
-       wa_masked_en(wal, SLICE_COMMON_ECO_CHICKEN1,
-                    MSC_MSAA_REODER_BUF_BYPASS_DISABLE);
+       wa_mcr_masked_en(wal, XEHP_SLICE_COMMON_ECO_CHICKEN1,
+                        MSC_MSAA_REODER_BUF_BYPASS_DISABLE);
  
        /* Wa_14014947963:dg2 */
        if (IS_DG2_GRAPHICS_STEP(engine->i915, G10, STEP_B0, STEP_FOREVER) ||
@@@ -1076,18 -1134,23 +1134,23 @@@ static void __set_mcr_steering(struct i
        wa_write_clr_set(wal, steering_reg, mcr_mask, mcr);
  }
  
- static void __add_mcr_wa(struct intel_gt *gt, struct i915_wa_list *wal,
-                        unsigned int slice, unsigned int subslice)
+ static void debug_dump_steering(struct intel_gt *gt)
  {
        struct drm_printer p = drm_debug_printer("MCR Steering:");
  
+       if (drm_debug_enabled(DRM_UT_DRIVER))
+               intel_gt_mcr_report_steering(&p, gt, false);
+ }
+ static void __add_mcr_wa(struct intel_gt *gt, struct i915_wa_list *wal,
+                        unsigned int slice, unsigned int subslice)
+ {
        __set_mcr_steering(wal, GEN8_MCR_SELECTOR, slice, subslice);
  
        gt->default_steering.groupid = slice;
        gt->default_steering.instanceid = subslice;
  
-       if (drm_debug_enabled(DRM_UT_DRIVER))
-               intel_gt_mcr_report_steering(&p, gt, false);
+       debug_dump_steering(gt);
  }
  
  static void
@@@ -1181,6 -1244,9 +1244,9 @@@ xehp_init_mcr(struct intel_gt *gt, stru
                gt->steering_table[MSLICE] = NULL;
        }
  
+       if (IS_XEHPSDV(gt->i915) && slice_mask & BIT(0))
+               gt->steering_table[GAM] = NULL;
        slice = __ffs(slice_mask);
        subslice = intel_sseu_find_first_xehp_dss(sseu, GEN_DSS_PER_GSLICE, slice) %
                GEN_DSS_PER_GSLICE;
         */
        __set_mcr_steering(wal, MCFG_MCR_SELECTOR, 0, 2);
        __set_mcr_steering(wal, SF_MCR_SELECTOR, 0, 2);
+       /*
+        * On DG2, GAM registers have a dedicated steering control register
+        * and must always be programmed to a hardcoded groupid of "1."
+        */
+       if (IS_DG2(gt->i915))
+               __set_mcr_steering(wal, GAM_MCR_SELECTOR, 1, 0);
  }
  
  static void
@@@ -1254,22 -1327,22 +1327,22 @@@ icl_gt_workarounds_init(struct intel_g
                    PSDUNIT_CLKGATE_DIS);
  
        /* Wa_1406680159:icl,ehl */
-       wa_write_or(wal,
-                   SUBSLICE_UNIT_LEVEL_CLKGATE,
-                   GWUNIT_CLKGATE_DIS);
+       wa_mcr_write_or(wal,
+                       GEN11_SUBSLICE_UNIT_LEVEL_CLKGATE,
+                       GWUNIT_CLKGATE_DIS);
  
        /* Wa_1607087056:icl,ehl,jsl */
        if (IS_ICELAKE(i915) ||
            IS_JSL_EHL_GRAPHICS_STEP(i915, STEP_A0, STEP_B0))
                wa_write_or(wal,
-                           SLICE_UNIT_LEVEL_CLKGATE,
+                           GEN11_SLICE_UNIT_LEVEL_CLKGATE,
                            L3_CLKGATE_DIS | L3_CR2X_CLKGATE_DIS);
  
        /*
         * This is not a documented workaround, but rather an optimization
         * to reduce sampler power.
         */
-       wa_write_clr(wal, GEN10_DFR_RATIO_EN_AND_CHICKEN, DFR_DISABLE);
+       wa_mcr_write_clr(wal, GEN10_DFR_RATIO_EN_AND_CHICKEN, DFR_DISABLE);
  }
  
  /*
@@@ -1303,7 -1376,7 +1376,7 @@@ gen12_gt_workarounds_init(struct intel_
        wa_14011060649(gt, wal);
  
        /* Wa_14011059788:tgl,rkl,adl-s,dg1,adl-p */
-       wa_write_or(wal, GEN10_DFR_RATIO_EN_AND_CHICKEN, DFR_DISABLE);
+       wa_mcr_write_or(wal, GEN10_DFR_RATIO_EN_AND_CHICKEN, DFR_DISABLE);
  }
  
  static void
@@@ -1315,14 -1388,14 +1388,14 @@@ tgl_gt_workarounds_init(struct intel_g
  
        /* Wa_1409420604:tgl */
        if (IS_TGL_UY_GRAPHICS_STEP(i915, STEP_A0, STEP_B0))
-               wa_write_or(wal,
-                           SUBSLICE_UNIT_LEVEL_CLKGATE2,
-                           CPSSUNIT_CLKGATE_DIS);
+               wa_mcr_write_or(wal,
+                               SUBSLICE_UNIT_LEVEL_CLKGATE2,
+                               CPSSUNIT_CLKGATE_DIS);
  
        /* Wa_1607087056:tgl also know as BUG:1409180338 */
        if (IS_TGL_UY_GRAPHICS_STEP(i915, STEP_A0, STEP_B0))
                wa_write_or(wal,
-                           SLICE_UNIT_LEVEL_CLKGATE,
+                           GEN11_SLICE_UNIT_LEVEL_CLKGATE,
                            L3_CLKGATE_DIS | L3_CR2X_CLKGATE_DIS);
  
        /* Wa_1408615072:tgl[a0] */
@@@ -1341,14 -1414,14 +1414,14 @@@ dg1_gt_workarounds_init(struct intel_g
        /* Wa_1607087056:dg1 */
        if (IS_DG1_GRAPHICS_STEP(i915, STEP_A0, STEP_B0))
                wa_write_or(wal,
-                           SLICE_UNIT_LEVEL_CLKGATE,
+                           GEN11_SLICE_UNIT_LEVEL_CLKGATE,
                            L3_CLKGATE_DIS | L3_CR2X_CLKGATE_DIS);
  
        /* Wa_1409420604:dg1 */
        if (IS_DG1(i915))
-               wa_write_or(wal,
-                           SUBSLICE_UNIT_LEVEL_CLKGATE2,
-                           CPSSUNIT_CLKGATE_DIS);
+               wa_mcr_write_or(wal,
+                               SUBSLICE_UNIT_LEVEL_CLKGATE2,
+                               CPSSUNIT_CLKGATE_DIS);
  
        /* Wa_1408615072:dg1 */
        /* Empirical testing shows this register is unaffected by engine reset. */
@@@ -1365,7 -1438,7 +1438,7 @@@ xehpsdv_gt_workarounds_init(struct inte
        xehp_init_mcr(gt, wal);
  
        /* Wa_1409757795:xehpsdv */
-       wa_write_or(wal, SCCGCTL94DC, CG3DDISURB);
+       wa_mcr_write_or(wal, SCCGCTL94DC, CG3DDISURB);
  
        /* Wa_16011155590:xehpsdv */
        if (IS_XEHPSDV_GRAPHICS_STEP(i915, STEP_A0, STEP_B0))
@@@ -1445,8 -1518,8 +1518,8 @@@ dg2_gt_workarounds_init(struct intel_g
                            CG3DDISCFEG_CLKGATE_DIS);
  
                /* Wa_14011006942:dg2 */
-               wa_write_or(wal, SUBSLICE_UNIT_LEVEL_CLKGATE,
-                           DSS_ROUTER_CLKGATE_DIS);
+               wa_mcr_write_or(wal, GEN11_SUBSLICE_UNIT_LEVEL_CLKGATE,
+                               DSS_ROUTER_CLKGATE_DIS);
        }
  
        if (IS_DG2_GRAPHICS_STEP(gt->i915, G10, STEP_A0, STEP_B0)) {
                wa_write_or(wal, UNSLCGCTL9444, LTCDD_CLKGATE_DIS);
  
                /* Wa_14011371254:dg2_g10 */
-               wa_write_or(wal, SLICE_UNIT_LEVEL_CLKGATE, NODEDSS_CLKGATE_DIS);
+               wa_mcr_write_or(wal, XEHP_SLICE_UNIT_LEVEL_CLKGATE, NODEDSS_CLKGATE_DIS);
  
                /* Wa_14011431319:dg2_g10 */
                wa_write_or(wal, UNSLCGCTL9440, GAMTLBOACS_CLKGATE_DIS |
                            GAMEDIA_CLKGATE_DIS);
  
                /* Wa_14011028019:dg2_g10 */
-               wa_write_or(wal, SSMCGCTL9530, RTFUNIT_CLKGATE_DIS);
+               wa_mcr_write_or(wal, SSMCGCTL9530, RTFUNIT_CLKGATE_DIS);
        }
  
        /* Wa_14014830051:dg2 */
-       wa_write_clr(wal, SARB_CHICKEN1, COMP_CKN_IN);
+       wa_mcr_write_clr(wal, SARB_CHICKEN1, COMP_CKN_IN);
  
        /*
         * The following are not actually "workarounds" but rather
         * recommended tuning settings documented in the bspec's
         * performance guide section.
         */
-       wa_write_or(wal, GEN12_SQCM, EN_32B_ACCESS);
+       wa_mcr_write_or(wal, XEHP_SQCM, EN_32B_ACCESS);
  
        /* Wa_14015795083 */
-       wa_write_clr(wal, GEN7_MISCCPCTL, GEN12_DOP_CLOCK_GATE_RENDER_ENABLE);
+       wa_mcr_write_clr(wal, GEN8_MISCCPCTL, GEN12_DOP_CLOCK_GATE_RENDER_ENABLE);
  }
  
  static void
@@@ -1516,7 -1589,27 +1589,27 @@@ pvc_gt_workarounds_init(struct intel_g
        pvc_init_mcr(gt, wal);
  
        /* Wa_14015795083 */
-       wa_write_clr(wal, GEN7_MISCCPCTL, GEN12_DOP_CLOCK_GATE_RENDER_ENABLE);
+       wa_mcr_write_clr(wal, GEN8_MISCCPCTL, GEN12_DOP_CLOCK_GATE_RENDER_ENABLE);
+ }
+ static void
+ xelpg_gt_workarounds_init(struct intel_gt *gt, struct i915_wa_list *wal)
+ {
+       /* FIXME: Actual workarounds will be added in future patch(es) */
+       /*
+        * Unlike older platforms, we no longer setup implicit steering here;
+        * all MCR accesses are explicitly steered.
+        */
+       debug_dump_steering(gt);
+ }
+ static void
+ xelpmp_gt_workarounds_init(struct intel_gt *gt, struct i915_wa_list *wal)
+ {
+       /* FIXME: Actual workarounds will be added in future patch(es) */
+       debug_dump_steering(gt);
  }
  
  static void
@@@ -1524,7 -1617,18 +1617,18 @@@ gt_init_workarounds(struct intel_gt *gt
  {
        struct drm_i915_private *i915 = gt->i915;
  
-       if (IS_PONTEVECCHIO(i915))
+       if (gt->type == GT_MEDIA) {
+               if (MEDIA_VER(i915) >= 13)
+                       xelpmp_gt_workarounds_init(gt, wal);
+               else
+                       MISSING_CASE(MEDIA_VER(i915));
+               return;
+       }
+       if (GRAPHICS_VER_FULL(i915) >= IP_VER(12, 70))
+               xelpg_gt_workarounds_init(gt, wal);
+       else if (IS_PONTEVECCHIO(i915))
                pvc_gt_workarounds_init(gt, wal);
        else if (IS_DG2(i915))
                dg2_gt_workarounds_init(gt, wal);
@@@ -1628,14 -1732,25 +1732,25 @@@ wa_list_apply(struct intel_gt *gt, cons
                u32 val, old = 0;
  
                /* open-coded rmw due to steering */
-               old = wa->clr ? intel_gt_mcr_read_any_fw(gt, wa->reg) : 0;
+               if (wa->clr)
+                       old = wa->is_mcr ?
+                               intel_gt_mcr_read_any_fw(gt, wa->mcr_reg) :
+                               intel_uncore_read_fw(uncore, wa->reg);
                val = (old & ~wa->clr) | wa->set;
-               if (val != old || !wa->clr)
-                       intel_uncore_write_fw(uncore, wa->reg, val);
+               if (val != old || !wa->clr) {
+                       if (wa->is_mcr)
+                               intel_gt_mcr_multicast_write_fw(gt, wa->mcr_reg, val);
+                       else
+                               intel_uncore_write_fw(uncore, wa->reg, val);
+               }
+               if (IS_ENABLED(CONFIG_DRM_I915_DEBUG_GEM)) {
+                       u32 val = wa->is_mcr ?
+                               intel_gt_mcr_read_any_fw(gt, wa->mcr_reg) :
+                               intel_uncore_read_fw(uncore, wa->reg);
  
-               if (IS_ENABLED(CONFIG_DRM_I915_DEBUG_GEM))
-                       wa_verify(wa, intel_gt_mcr_read_any_fw(gt, wa->reg),
-                                 wal->name, "application");
+                       wa_verify(wa, val, wal->name, "application");
+               }
        }
  
        intel_uncore_forcewake_put__locked(uncore, fw);
@@@ -1664,8 -1779,9 +1779,9 @@@ static bool wa_list_verify(struct intel
        intel_uncore_forcewake_get__locked(uncore, fw);
  
        for (i = 0, wa = wal->list; i < wal->count; i++, wa++)
-               ok &= wa_verify(wa,
-                               intel_gt_mcr_read_any_fw(gt, wa->reg),
+               ok &= wa_verify(wa, wa->is_mcr ?
+                               intel_gt_mcr_read_any_fw(gt, wa->mcr_reg) :
+                               intel_uncore_read_fw(uncore, wa->reg),
                                wal->name, from);
  
        intel_uncore_forcewake_put__locked(uncore, fw);
@@@ -1712,11 -1828,35 +1828,35 @@@ whitelist_reg_ext(struct i915_wa_list *
  }
  
  static void
+ whitelist_mcr_reg_ext(struct i915_wa_list *wal, i915_mcr_reg_t reg, u32 flags)
+ {
+       struct i915_wa wa = {
+               .mcr_reg = reg,
+               .is_mcr = 1,
+       };
+       if (GEM_DEBUG_WARN_ON(wal->count >= RING_MAX_NONPRIV_SLOTS))
+               return;
+       if (GEM_DEBUG_WARN_ON(!is_nonpriv_flags_valid(flags)))
+               return;
+       wa.mcr_reg.reg |= flags;
+       _wa_add(wal, &wa);
+ }
+ static void
  whitelist_reg(struct i915_wa_list *wal, i915_reg_t reg)
  {
        whitelist_reg_ext(wal, reg, RING_FORCE_TO_NONPRIV_ACCESS_RW);
  }
  
+ static void
+ whitelist_mcr_reg(struct i915_wa_list *wal, i915_mcr_reg_t reg)
+ {
+       whitelist_mcr_reg_ext(wal, reg, RING_FORCE_TO_NONPRIV_ACCESS_RW);
+ }
  static void gen9_whitelist_build(struct i915_wa_list *w)
  {
        /* WaVFEStateAfterPipeControlwithMediaStateClear:skl,bxt,glk,cfl */
@@@ -1742,7 -1882,7 +1882,7 @@@ static void skl_whitelist_build(struct 
        gen9_whitelist_build(w);
  
        /* WaDisableLSQCROPERFforOCL:skl */
-       whitelist_reg(w, GEN8_L3SQCREG4);
+       whitelist_mcr_reg(w, GEN8_L3SQCREG4);
  }
  
  static void bxt_whitelist_build(struct intel_engine_cs *engine)
@@@ -1763,7 -1903,7 +1903,7 @@@ static void kbl_whitelist_build(struct 
        gen9_whitelist_build(w);
  
        /* WaDisableLSQCROPERFforOCL:kbl */
-       whitelist_reg(w, GEN8_L3SQCREG4);
+       whitelist_mcr_reg(w, GEN8_L3SQCREG4);
  }
  
  static void glk_whitelist_build(struct intel_engine_cs *engine)
@@@ -1828,10 -1968,10 +1968,10 @@@ static void icl_whitelist_build(struct 
        switch (engine->class) {
        case RENDER_CLASS:
                /* WaAllowUMDToModifyHalfSliceChicken7:icl */
-               whitelist_reg(w, GEN9_HALF_SLICE_CHICKEN7);
+               whitelist_mcr_reg(w, GEN9_HALF_SLICE_CHICKEN7);
  
                /* WaAllowUMDToModifySamplerMode:icl */
-               whitelist_reg(w, GEN10_SAMPLER_MODE);
+               whitelist_mcr_reg(w, GEN10_SAMPLER_MODE);
  
                /* WaEnableStateCacheRedirectToCS:icl */
                whitelist_reg(w, GEN9_SLICE_COMMON_ECO_CHICKEN1);
@@@ -2107,24 -2247,21 +2247,21 @@@ rcs_engine_wa_init(struct intel_engine_
  
        if (IS_DG2_GRAPHICS_STEP(i915, G11, STEP_A0, STEP_B0)) {
                /* Wa_14013392000:dg2_g11 */
-               wa_masked_en(wal, GEN7_ROW_CHICKEN2, GEN12_ENABLE_LARGE_GRF_MODE);
-               /* Wa_16011620976:dg2_g11 */
-               wa_write_or(wal, LSC_CHICKEN_BIT_0_UDW, DIS_CHAIN_2XSIMD8);
+               wa_mcr_masked_en(wal, GEN8_ROW_CHICKEN2, GEN12_ENABLE_LARGE_GRF_MODE);
        }
  
        if (IS_DG2_GRAPHICS_STEP(i915, G10, STEP_B0, STEP_FOREVER) ||
            IS_DG2_G11(i915) || IS_DG2_G12(i915)) {
                /* Wa_1509727124:dg2 */
-               wa_masked_en(wal, GEN10_SAMPLER_MODE,
-                            SC_DISABLE_POWER_OPTIMIZATION_EBB);
+               wa_mcr_masked_en(wal, GEN10_SAMPLER_MODE,
+                                SC_DISABLE_POWER_OPTIMIZATION_EBB);
        }
  
        if (IS_DG2_GRAPHICS_STEP(i915, G10, STEP_A0, STEP_B0) ||
            IS_DG2_GRAPHICS_STEP(i915, G11, STEP_A0, STEP_B0)) {
                /* Wa_14012419201:dg2 */
-               wa_masked_en(wal, GEN9_ROW_CHICKEN4,
-                            GEN12_DISABLE_HDR_PAST_PAYLOAD_HOLD_FIX);
+               wa_mcr_masked_en(wal, GEN9_ROW_CHICKEN4,
+                                GEN12_DISABLE_HDR_PAST_PAYLOAD_HOLD_FIX);
        }
  
        if (IS_DG2_GRAPHICS_STEP(i915, G10, STEP_B0, STEP_C0) ||
                 * Wa_22012826095:dg2
                 * Wa_22013059131:dg2
                 */
-               wa_write_clr_set(wal, LSC_CHICKEN_BIT_0_UDW,
-                                MAXREQS_PER_BANK,
-                                REG_FIELD_PREP(MAXREQS_PER_BANK, 2));
+               wa_mcr_write_clr_set(wal, LSC_CHICKEN_BIT_0_UDW,
+                                    MAXREQS_PER_BANK,
+                                    REG_FIELD_PREP(MAXREQS_PER_BANK, 2));
  
                /* Wa_22013059131:dg2 */
-               wa_write_or(wal, LSC_CHICKEN_BIT_0,
-                           FORCE_1_SUB_MESSAGE_PER_FRAGMENT);
+               wa_mcr_write_or(wal, LSC_CHICKEN_BIT_0,
+                               FORCE_1_SUB_MESSAGE_PER_FRAGMENT);
        }
  
        /* Wa_1308578152:dg2_g10 when first gslice is fused off */
        if (IS_DG2_GRAPHICS_STEP(i915, G10, STEP_B0, STEP_FOREVER) ||
            IS_DG2_G11(i915) || IS_DG2_G12(i915)) {
                /* Wa_22013037850:dg2 */
-               wa_write_or(wal, LSC_CHICKEN_BIT_0_UDW,
-                           DISABLE_128B_EVICTION_COMMAND_UDW);
+               wa_mcr_write_or(wal, LSC_CHICKEN_BIT_0_UDW,
+                               DISABLE_128B_EVICTION_COMMAND_UDW);
  
                /* Wa_22012856258:dg2 */
-               wa_masked_en(wal, GEN7_ROW_CHICKEN2,
-                            GEN12_DISABLE_READ_SUPPRESSION);
+               wa_mcr_masked_en(wal, GEN8_ROW_CHICKEN2,
+                                GEN12_DISABLE_READ_SUPPRESSION);
  
                /*
                 * Wa_22010960976:dg2
                 * Wa_14013347512:dg2
                 */
-               wa_masked_dis(wal, GEN12_HDC_CHICKEN0,
-                             LSC_L1_FLUSH_CTL_3D_DATAPORT_FLUSH_EVENTS_MASK);
+               wa_mcr_masked_dis(wal, XEHP_HDC_CHICKEN0,
+                                 LSC_L1_FLUSH_CTL_3D_DATAPORT_FLUSH_EVENTS_MASK);
        }
  
        if (IS_DG2_GRAPHICS_STEP(i915, G10, STEP_A0, STEP_B0)) {
                 * Wa_1608949956:dg2_g10
                 * Wa_14010198302:dg2_g10
                 */
-               wa_masked_en(wal, GEN8_ROW_CHICKEN,
-                            MDQ_ARBITRATION_MODE | UGM_BACKUP_MODE);
+               wa_mcr_masked_en(wal, GEN8_ROW_CHICKEN,
+                                MDQ_ARBITRATION_MODE | UGM_BACKUP_MODE);
  
                /*
                 * Wa_14010918519:dg2_g10
                 * LSC_CHICKEN_BIT_0 always reads back as 0 is this stepping,
                 * so ignoring verification.
                 */
-               wa_add(wal, LSC_CHICKEN_BIT_0_UDW, 0,
-                      FORCE_SLM_FENCE_SCOPE_TO_TILE | FORCE_UGM_FENCE_SCOPE_TO_TILE,
-                      0, false);
+               wa_mcr_add(wal, LSC_CHICKEN_BIT_0_UDW, 0,
+                          FORCE_SLM_FENCE_SCOPE_TO_TILE | FORCE_UGM_FENCE_SCOPE_TO_TILE,
+                          0, false);
        }
  
        if (IS_DG2_GRAPHICS_STEP(i915, G10, STEP_A0, STEP_B0)) {
                /* Wa_22010430635:dg2 */
-               wa_masked_en(wal,
-                            GEN9_ROW_CHICKEN4,
-                            GEN12_DISABLE_GRF_CLEAR);
+               wa_mcr_masked_en(wal,
+                                GEN9_ROW_CHICKEN4,
+                                GEN12_DISABLE_GRF_CLEAR);
  
                /* Wa_14010648519:dg2 */
-               wa_write_or(wal, XEHP_L3NODEARBCFG, XEHP_LNESPARE);
+               wa_mcr_write_or(wal, XEHP_L3NODEARBCFG, XEHP_LNESPARE);
        }
  
        /* Wa_14013202645:dg2 */
        if (IS_DG2_GRAPHICS_STEP(i915, G10, STEP_B0, STEP_C0) ||
            IS_DG2_GRAPHICS_STEP(i915, G11, STEP_A0, STEP_B0))
-               wa_write_or(wal, RT_CTRL, DIS_NULL_QUERY);
+               wa_mcr_write_or(wal, RT_CTRL, DIS_NULL_QUERY);
  
        /* Wa_22012532006:dg2 */
        if (IS_DG2_GRAPHICS_STEP(engine->i915, G10, STEP_A0, STEP_C0) ||
            IS_DG2_GRAPHICS_STEP(engine->i915, G11, STEP_A0, STEP_B0))
-               wa_masked_en(wal, GEN9_HALF_SLICE_CHICKEN7,
-                            DG2_DISABLE_ROUND_ENABLE_ALLOW_FOR_SSLA);
+               wa_mcr_masked_en(wal, GEN9_HALF_SLICE_CHICKEN7,
+                                DG2_DISABLE_ROUND_ENABLE_ALLOW_FOR_SSLA);
  
        if (IS_DG2_GRAPHICS_STEP(engine->i915, G10, STEP_A0, STEP_B0)) {
                /* Wa_14010680813:dg2_g10 */
        if (IS_DG2_GRAPHICS_STEP(engine->i915, G10, STEP_A0, STEP_B0) ||
            IS_DG2_GRAPHICS_STEP(engine->i915, G11, STEP_A0, STEP_B0)) {
                /* Wa_14012362059:dg2 */
-               wa_write_or(wal, GEN12_MERT_MOD_CTRL, FORCE_MISS_FTLB);
+               wa_mcr_write_or(wal, XEHP_MERT_MOD_CTRL, FORCE_MISS_FTLB);
        }
  
        if (IS_DG2_GRAPHICS_STEP(i915, G11, STEP_B0, STEP_FOREVER) ||
            IS_DG2_G10(i915)) {
                /* Wa_22014600077:dg2 */
-               wa_add(wal, GEN10_CACHE_MODE_SS, 0,
-                      _MASKED_BIT_ENABLE(ENABLE_EU_COUNT_FOR_TDL_FLUSH),
-                      0 /* Wa_14012342262 :write-only reg, so skip
-                           verification */,
-                      true);
+               wa_mcr_add(wal, GEN10_CACHE_MODE_SS, 0,
+                          _MASKED_BIT_ENABLE(ENABLE_EU_COUNT_FOR_TDL_FLUSH),
+                          0 /* Wa_14012342262 write-only reg, so skip verification */,
+                          true);
        }
  
        if (IS_DG1_GRAPHICS_STEP(i915, STEP_A0, STEP_B0) ||
        if (IS_ALDERLAKE_P(i915) || IS_ALDERLAKE_S(i915) || IS_DG1(i915) ||
            IS_ROCKETLAKE(i915) || IS_TIGERLAKE(i915)) {
                /* Wa_1606931601:tgl,rkl,dg1,adl-s,adl-p */
-               wa_masked_en(wal, GEN7_ROW_CHICKEN2, GEN12_DISABLE_EARLY_READ);
+               wa_mcr_masked_en(wal, GEN8_ROW_CHICKEN2, GEN12_DISABLE_EARLY_READ);
  
                /*
                 * Wa_1407928979:tgl A*
            IS_DG1_GRAPHICS_STEP(i915, STEP_A0, STEP_B0) ||
            IS_ROCKETLAKE(i915) || IS_TIGERLAKE(i915)) {
                /* Wa_1409804808:tgl,rkl,dg1[a0],adl-s,adl-p */
-               wa_masked_en(wal, GEN7_ROW_CHICKEN2,
-                            GEN12_PUSH_CONST_DEREF_HOLD_DIS);
+               wa_mcr_masked_en(wal, GEN8_ROW_CHICKEN2,
+                                GEN12_PUSH_CONST_DEREF_HOLD_DIS);
  
                /*
                 * Wa_1409085225:tgl
                 * Wa_14010229206:tgl,rkl,dg1[a0],adl-s,adl-p
                 */
-               wa_masked_en(wal, GEN9_ROW_CHICKEN4, GEN12_DISABLE_TDL_PUSH);
+               wa_mcr_masked_en(wal, GEN9_ROW_CHICKEN4, GEN12_DISABLE_TDL_PUSH);
        }
  
        if (IS_DG1_GRAPHICS_STEP(i915, STEP_A0, STEP_B0) ||
 -          IS_ROCKETLAKE(i915) || IS_TIGERLAKE(i915)) {
 +          IS_ROCKETLAKE(i915) || IS_TIGERLAKE(i915) || IS_ALDERLAKE_P(i915)) {
                /*
                 * Wa_1607030317:tgl
                 * Wa_1607186500:tgl
 -               * Wa_1607297627:tgl,rkl,dg1[a0]
 +               * Wa_1607297627:tgl,rkl,dg1[a0],adlp
                 *
                 * On TGL and RKL there are multiple entries for this WA in the
                 * BSpec; some indicate this is an A0-only WA, others indicate
        if (IS_DG1(i915) || IS_ROCKETLAKE(i915) || IS_TIGERLAKE(i915) ||
            IS_ALDERLAKE_S(i915) || IS_ALDERLAKE_P(i915)) {
                /* Wa_1406941453:tgl,rkl,dg1,adl-s,adl-p */
-               wa_masked_en(wal,
-                            GEN10_SAMPLER_MODE,
-                            ENABLE_SMALLPL);
+               wa_mcr_masked_en(wal,
+                                GEN10_SAMPLER_MODE,
+                                ENABLE_SMALLPL);
        }
  
        if (GRAPHICS_VER(i915) == 11) {
                 * Wa_1405733216:icl
                 * Formerly known as WaDisableCleanEvicts
                 */
-               wa_write_or(wal,
-                           GEN8_L3SQCREG4,
-                           GEN11_LQSC_CLEAN_EVICT_DISABLE);
+               wa_mcr_write_or(wal,
+                               GEN8_L3SQCREG4,
+                               GEN11_LQSC_CLEAN_EVICT_DISABLE);
  
                /* Wa_1606682166:icl */
                wa_write_or(wal,
                            GEN7_DISABLE_SAMPLER_PREFETCH);
  
                /* Wa_1409178092:icl */
-               wa_write_clr_set(wal,
-                                GEN11_SCRATCH2,
-                                GEN11_COHERENT_PARTIAL_WRITE_MERGE_ENABLE,
-                                0);
+               wa_mcr_write_clr_set(wal,
+                                    GEN11_SCRATCH2,
+                                    GEN11_COHERENT_PARTIAL_WRITE_MERGE_ENABLE,
+                                    0);
  
                /* WaEnable32PlaneMode:icl */
                wa_masked_en(wal, GEN9_CSFE_CHICKEN1_RCS,
                             FF_DOP_CLOCK_GATE_DISABLE);
        }
  
-       if (IS_GRAPHICS_VER(i915, 9, 12)) {
-               /* FtrPerCtxtPreemptionGranularityControl:skl,bxt,kbl,cfl,cnl,icl,tgl */
+       /*
+        * Intel platforms that support fine-grained preemption (i.e., gen9 and
+        * beyond) allow the kernel-mode driver to choose between two different
+        * options for controlling preemption granularity and behavior.
+        *
+        * Option 1 (hardware default):
+        *   Preemption settings are controlled in a global manner via
+        *   kernel-only register CS_DEBUG_MODE1 (0x20EC).  Any granularity
+        *   and settings chosen by the kernel-mode driver will apply to all
+        *   userspace clients.
+        *
+        * Option 2:
+        *   Preemption settings are controlled on a per-context basis via
+        *   register CS_CHICKEN1 (0x2580).  CS_CHICKEN1 is saved/restored on
+        *   context switch and is writable by userspace (e.g., via
+        *   MI_LOAD_REGISTER_IMMEDIATE instructions placed in a batch buffer)
+        *   which allows different userspace drivers/clients to select
+        *   different settings, or to change those settings on the fly in
+        *   response to runtime needs.  This option was known by name
+        *   "FtrPerCtxtPreemptionGranularityControl" at one time, although
+        *   that name is somewhat misleading as other non-granularity
+        *   preemption settings are also impacted by this decision.
+        *
+        * On Linux, our policy has always been to let userspace drivers
+        * control preemption granularity/settings (Option 2).  This was
+        * originally mandatory on gen9 to prevent ABI breakage (old gen9
+        * userspace developed before object-level preemption was enabled would
+        * not behave well if i915 were to go with Option 1 and enable that
+        * preemption in a global manner).  On gen9 each context would have
+        * object-level preemption disabled by default (see
+        * WaDisable3DMidCmdPreemption in gen9_ctx_workarounds_init), but
+        * userspace drivers could opt-in to object-level preemption as they
+        * saw fit.  For post-gen9 platforms, we continue to utilize Option 2;
+        * even though it is no longer necessary for ABI compatibility when
+        * enabling a new platform, it does ensure that userspace will be able
+        * to implement any workarounds that show up requiring temporary
+        * adjustments to preemption behavior at runtime.
+        *
+        * Notes/Workarounds:
+        *  - Wa_14015141709:  On DG2 and early steppings of MTL,
+        *      CS_CHICKEN1[0] does not disable object-level preemption as
+        *      it is supposed to (nor does CS_DEBUG_MODE1[0] if we had been
+        *      using Option 1).  Effectively this means userspace is unable
+        *      to disable object-level preemption on these platforms/steppings
+        *      despite the setting here.
+        *
+        *  - Wa_16013994831:  May require that userspace program
+        *      CS_CHICKEN1[10] when certain runtime conditions are true.
+        *      Userspace requires Option 2 to be in effect for their update of
+        *      CS_CHICKEN1[10] to be effective.
+        *
+        * Other workarounds may appear in the future that will also require
+        * Option 2 behavior to allow proper userspace implementation.
+        */
+       if (GRAPHICS_VER(i915) >= 9)
                wa_masked_en(wal,
                             GEN7_FF_SLICE_CS_CHICKEN1,
                             GEN9_FFSC_PERCTX_PREEMPT_CTRL);
-       }
  
        if (IS_SKYLAKE(i915) ||
            IS_KABYLAKE(i915) ||
                             GEN9_PREEMPT_GPGPU_SYNC_SWITCH_DISABLE);
  
                /* WaEnableLbsSlaRetryTimerDecrement:skl,bxt,kbl,glk,cfl */
-               wa_write_or(wal,
-                           BDW_SCRATCH1,
-                           GEN9_LBS_SLA_RETRY_TIMER_DECREMENT_ENABLE);
+               wa_mcr_write_or(wal,
+                               BDW_SCRATCH1,
+                               GEN9_LBS_SLA_RETRY_TIMER_DECREMENT_ENABLE);
  
                /* WaProgramL3SqcReg1DefaultForPerf:bxt,glk */
                if (IS_GEN9_LP(i915))
-                       wa_write_clr_set(wal,
-                                        GEN8_L3SQCREG1,
-                                        L3_PRIO_CREDITS_MASK,
-                                        L3_GENERAL_PRIO_CREDITS(62) |
-                                        L3_HIGH_PRIO_CREDITS(2));
+                       wa_mcr_write_clr_set(wal,
+                                            GEN8_L3SQCREG1,
+                                            L3_PRIO_CREDITS_MASK,
+                                            L3_GENERAL_PRIO_CREDITS(62) |
+                                            L3_HIGH_PRIO_CREDITS(2));
  
                /* WaOCLCoherentLineFlush:skl,bxt,kbl,cfl */
-               wa_write_or(wal,
-                           GEN8_L3SQCREG4,
-                           GEN8_LQSC_FLUSH_COHERENT_LINES);
+               wa_mcr_write_or(wal,
+                               GEN8_L3SQCREG4,
+                               GEN8_LQSC_FLUSH_COHERENT_LINES);
  
                /* Disable atomics in L3 to prevent unrecoverable hangs */
                wa_write_clr_set(wal, GEN9_SCRATCH_LNCF1,
                                 GEN9_LNCF_NONIA_COHERENT_ATOMICS_ENABLE, 0);
-               wa_write_clr_set(wal, GEN8_L3SQCREG4,
-                                GEN8_LQSQ_NONIA_COHERENT_ATOMICS_ENABLE, 0);
-               wa_write_clr_set(wal, GEN9_SCRATCH1,
-                                EVICTION_PERF_FIX_ENABLE, 0);
+               wa_mcr_write_clr_set(wal, GEN8_L3SQCREG4,
+                                    GEN8_LQSQ_NONIA_COHERENT_ATOMICS_ENABLE, 0);
+               wa_mcr_write_clr_set(wal, GEN9_SCRATCH1,
+                                    EVICTION_PERF_FIX_ENABLE, 0);
        }
  
        if (IS_HASWELL(i915)) {
                /* WaSampleCChickenBitEnable:hsw */
                wa_masked_en(wal,
-                            HALF_SLICE_CHICKEN3, HSW_SAMPLE_C_PERFORMANCE);
+                            HSW_HALF_SLICE_CHICKEN3, HSW_SAMPLE_C_PERFORMANCE);
  
                wa_masked_dis(wal,
                              CACHE_MODE_0_GEN7,
@@@ -2657,7 -2845,7 +2845,7 @@@ ccs_engine_wa_init(struct intel_engine_
  {
        if (IS_PVC_CT_STEP(engine->i915, STEP_A0, STEP_C0)) {
                /* Wa_14014999345:pvc */
-               wa_masked_en(wal, GEN10_CACHE_MODE_SS, DISABLE_ECC);
+               wa_mcr_masked_en(wal, GEN10_CACHE_MODE_SS, DISABLE_ECC);
        }
  }
  
@@@ -2683,8 -2871,8 +2871,8 @@@ add_render_compute_tuning_settings(stru
        }
  
        if (IS_DG2(i915)) {
-               wa_write_or(wal, XEHP_L3SCQREG7, BLEND_FILL_CACHING_OPT_DIS);
-               wa_write_clr_set(wal, RT_CTRL, STACKID_CTRL, STACKID_CTRL_512);
+               wa_mcr_write_or(wal, XEHP_L3SCQREG7, BLEND_FILL_CACHING_OPT_DIS);
+               wa_mcr_write_clr_set(wal, RT_CTRL, STACKID_CTRL, STACKID_CTRL_512);
  
                /*
                 * This is also listed as Wa_22012654132 for certain DG2
                 * back for verification on DG2 (due to Wa_14012342262), so
                 * we need to explicitly skip the readback.
                 */
-               wa_add(wal, GEN10_CACHE_MODE_SS, 0,
-                      _MASKED_BIT_ENABLE(ENABLE_PREFETCH_INTO_IC),
-                      0 /* write-only, so skip validation */,
-                      true);
+               wa_mcr_add(wal, GEN10_CACHE_MODE_SS, 0,
+                          _MASKED_BIT_ENABLE(ENABLE_PREFETCH_INTO_IC),
+                          0 /* write-only, so skip validation */,
+                          true);
        }
  
        /*
         * platforms.
         */
        if (INTEL_INFO(i915)->tuning_thread_rr_after_dep)
-               wa_masked_field_set(wal, GEN9_ROW_CHICKEN4, THREAD_EX_ARB_MODE,
-                                   THREAD_EX_ARB_MODE_RR_AFTER_DEP);
+               wa_mcr_masked_field_set(wal, GEN9_ROW_CHICKEN4, THREAD_EX_ARB_MODE,
+                                       THREAD_EX_ARB_MODE_RR_AFTER_DEP);
  }
  
  /*
@@@ -2734,30 -2922,30 +2922,30 @@@ general_render_compute_wa_init(struct i
  
        if (IS_XEHPSDV(i915)) {
                /* Wa_1409954639 */
-               wa_masked_en(wal,
-                            GEN8_ROW_CHICKEN,
-                            SYSTOLIC_DOP_CLOCK_GATING_DIS);
+               wa_mcr_masked_en(wal,
+                                GEN8_ROW_CHICKEN,
+                                SYSTOLIC_DOP_CLOCK_GATING_DIS);
  
                /* Wa_1607196519 */
-               wa_masked_en(wal,
-                            GEN9_ROW_CHICKEN4,
-                            GEN12_DISABLE_GRF_CLEAR);
+               wa_mcr_masked_en(wal,
+                                GEN9_ROW_CHICKEN4,
+                                GEN12_DISABLE_GRF_CLEAR);
  
                /* Wa_14010670810:xehpsdv */
-               wa_write_or(wal, XEHP_L3NODEARBCFG, XEHP_LNESPARE);
+               wa_mcr_write_or(wal, XEHP_L3NODEARBCFG, XEHP_LNESPARE);
  
                /* Wa_14010449647:xehpsdv */
-               wa_masked_en(wal, GEN7_HALF_SLICE_CHICKEN1,
-                            GEN7_PSD_SINGLE_PORT_DISPATCH_ENABLE);
+               wa_mcr_masked_en(wal, GEN8_HALF_SLICE_CHICKEN1,
+                                GEN7_PSD_SINGLE_PORT_DISPATCH_ENABLE);
  
                /* Wa_18011725039:xehpsdv */
                if (IS_XEHPSDV_GRAPHICS_STEP(i915, STEP_A1, STEP_B0)) {
-                       wa_masked_dis(wal, MLTICTXCTL, TDONRENDER);
-                       wa_write_or(wal, L3SQCREG1_CCS0, FLUSHALLNONCOH);
+                       wa_mcr_masked_dis(wal, MLTICTXCTL, TDONRENDER);
+                       wa_mcr_write_or(wal, L3SQCREG1_CCS0, FLUSHALLNONCOH);
                }
  
                /* Wa_14012362059:xehpsdv */
-               wa_write_or(wal, GEN12_MERT_MOD_CTRL, FORCE_MISS_FTLB);
+               wa_mcr_write_or(wal, XEHP_MERT_MOD_CTRL, FORCE_MISS_FTLB);
  
                /* Wa_14014368820:xehpsdv */
                wa_write_or(wal, GEN12_GAMCNTRL_CTRL, INVALIDATION_BROADCAST_MODE_DIS |
  
        if (IS_DG2(i915) || IS_PONTEVECCHIO(i915)) {
                /* Wa_14015227452:dg2,pvc */
-               wa_masked_en(wal, GEN9_ROW_CHICKEN4, XEHP_DIS_BBL_SYSPIPE);
+               wa_mcr_masked_en(wal, GEN9_ROW_CHICKEN4, XEHP_DIS_BBL_SYSPIPE);
  
                /* Wa_22014226127:dg2,pvc */
-               wa_write_or(wal, LSC_CHICKEN_BIT_0, DISABLE_D8_D16_COASLESCE);
+               wa_mcr_write_or(wal, LSC_CHICKEN_BIT_0, DISABLE_D8_D16_COASLESCE);
  
                /* Wa_16015675438:dg2,pvc */
                wa_masked_en(wal, FF_SLICE_CS_CHICKEN2, GEN12_PERF_FIX_BALANCING_CFE_DISABLE);
  
                /* Wa_18018781329:dg2,pvc */
-               wa_write_or(wal, RENDER_MOD_CTRL, FORCE_MISS_FTLB);
-               wa_write_or(wal, COMP_MOD_CTRL, FORCE_MISS_FTLB);
-               wa_write_or(wal, VDBX_MOD_CTRL, FORCE_MISS_FTLB);
-               wa_write_or(wal, VEBX_MOD_CTRL, FORCE_MISS_FTLB);
+               wa_mcr_write_or(wal, RENDER_MOD_CTRL, FORCE_MISS_FTLB);
+               wa_mcr_write_or(wal, COMP_MOD_CTRL, FORCE_MISS_FTLB);
+               wa_mcr_write_or(wal, VDBX_MOD_CTRL, FORCE_MISS_FTLB);
+               wa_mcr_write_or(wal, VEBX_MOD_CTRL, FORCE_MISS_FTLB);
+       }
+       if (IS_DG2(i915)) {
+               /*
+                * Wa_16011620976:dg2_g11
+                * Wa_22015475538:dg2
+                */
+               wa_mcr_write_or(wal, LSC_CHICKEN_BIT_0_UDW, DIS_CHAIN_2XSIMD8);
+               /* Wa_18017747507:dg2 */
+               wa_masked_en(wal, VFG_PREEMPTION_CHICKEN, POLYGON_TRIFAN_LINELOOP_DISABLE);
        }
  }
  
@@@ -734,7 -734,7 +734,7 @@@ static i915_reg_t force_nonpriv_white_l
        _MMIO(0x770c),
        _MMIO(0x83a8),
        _MMIO(0xb110),
-       GEN8_L3SQCREG4,//_MMIO(0xb118)
+       _MMIO(0xb118),
        _MMIO(0xe100),
        _MMIO(0xe18c),
        _MMIO(0xe48c),
@@@ -905,7 -905,7 +905,7 @@@ static int update_fdi_rx_iir_status(str
        else if (FDI_RX_IMR_TO_PIPE(offset) != INVALID_INDEX)
                index = FDI_RX_IMR_TO_PIPE(offset);
        else {
 -              gvt_vgpu_err("Unsupport registers %x\n", offset);
 +              gvt_vgpu_err("Unsupported registers %x\n", offset);
                return -EINVAL;
        }
  
@@@ -2257,7 -2257,7 +2257,7 @@@ static int init_generic_mmio_info(struc
        MMIO_DFH(_MMIO(0x2438), D_ALL, F_CMD_ACCESS, NULL, NULL);
        MMIO_DFH(_MMIO(0x243c), D_ALL, F_CMD_ACCESS, NULL, NULL);
        MMIO_DFH(_MMIO(0x7018), D_ALL, F_MODE_MASK | F_CMD_ACCESS, NULL, NULL);
-       MMIO_DFH(HALF_SLICE_CHICKEN3, D_ALL, F_MODE_MASK | F_CMD_ACCESS, NULL, NULL);
+       MMIO_DFH(HSW_HALF_SLICE_CHICKEN3, D_ALL, F_MODE_MASK | F_CMD_ACCESS, NULL, NULL);
        MMIO_DFH(GEN7_HALF_SLICE_CHICKEN1, D_ALL, F_MODE_MASK | F_CMD_ACCESS, NULL, NULL);
  
        /* display */
@@@ -3052,7 -3052,7 +3052,7 @@@ int intel_vgpu_default_mmio_read(struc
  }
  
  /**
 - * intel_t_default_mmio_write - default MMIO write handler
 + * intel_vgpu_default_mmio_write() - default MMIO write handler
   * @vgpu: a vGPU
   * @offset: access offset
   * @p_data: write data buffer
@@@ -106,15 -106,15 +106,15 @@@ static struct engine_mmio gen9_engine_m
        {RCS0, GEN8_CS_CHICKEN1, 0xffff, true}, /* 0x2580 */
        {RCS0, COMMON_SLICE_CHICKEN2, 0xffff, true}, /* 0x7014 */
        {RCS0, GEN9_CS_DEBUG_MODE1, 0xffff, false}, /* 0x20ec */
-       {RCS0, GEN8_L3SQCREG4, 0, false}, /* 0xb118 */
-       {RCS0, GEN9_SCRATCH1, 0, false}, /* 0xb11c */
+       {RCS0, _MMIO(0xb118), 0, false}, /* GEN8_L3SQCREG4 */
+       {RCS0, _MMIO(0xb11c), 0, false}, /* GEN9_SCRATCH1 */
        {RCS0, GEN9_SCRATCH_LNCF1, 0, false}, /* 0xb008 */
        {RCS0, GEN7_HALF_SLICE_CHICKEN1, 0xffff, true}, /* 0xe100 */
-       {RCS0, HALF_SLICE_CHICKEN2, 0xffff, true}, /* 0xe180 */
-       {RCS0, HALF_SLICE_CHICKEN3, 0xffff, true}, /* 0xe184 */
-       {RCS0, GEN9_HALF_SLICE_CHICKEN5, 0xffff, true}, /* 0xe188 */
-       {RCS0, GEN9_HALF_SLICE_CHICKEN7, 0xffff, true}, /* 0xe194 */
-       {RCS0, GEN8_ROW_CHICKEN, 0xffff, true}, /* 0xe4f0 */
+       {RCS0, _MMIO(0xe180), 0xffff, true}, /* HALF_SLICE_CHICKEN2 */
+       {RCS0, _MMIO(0xe184), 0xffff, true}, /* GEN8_HALF_SLICE_CHICKEN3 */
+       {RCS0, _MMIO(0xe188), 0xffff, true}, /* GEN9_HALF_SLICE_CHICKEN5 */
+       {RCS0, _MMIO(0xe194), 0xffff, true}, /* GEN9_HALF_SLICE_CHICKEN7 */
+       {RCS0, _MMIO(0xe4f0), 0xffff, true}, /* GEN8_ROW_CHICKEN */
        {RCS0, TRVATTL3PTRDW(0), 0, true}, /* 0x4de0 */
        {RCS0, TRVATTL3PTRDW(1), 0, true}, /* 0x4de4 */
        {RCS0, TRNULLDETCT, 0, true}, /* 0x4de8 */
@@@ -546,7 -546,7 +546,7 @@@ static void switch_mmio(struct intel_vg
  }
  
  /**
 - * intel_gvt_switch_render_mmio - switch mmio context of specific engine
 + * intel_gvt_switch_mmio - switch mmio context of specific engine
   * @pre: the last vGPU that own the engine
   * @next: the vGPU to switch to
   * @engine: the engine
@@@ -81,6 -81,7 +81,7 @@@
  #include "i915_drm_client.h"
  #include "i915_drv.h"
  #include "i915_getparam.h"
+ #include "i915_hwmon.h"
  #include "i915_ioc32.h"
  #include "i915_ioctl.h"
  #include "i915_irq.h"
@@@ -337,8 -338,7 +338,8 @@@ static int i915_driver_early_probe(stru
        if (i915_inject_probe_failure(dev_priv))
                return -ENODEV;
  
 -      intel_device_info_subplatform_init(dev_priv);
 +      intel_device_info_runtime_init_early(dev_priv);
 +
        intel_step_init(dev_priv);
  
        intel_uncore_mmio_debug_init_early(dev_priv);
        mutex_init(&dev_priv->display.wm.wm_mutex);
        mutex_init(&dev_priv->display.pps.mutex);
        mutex_init(&dev_priv->display.hdcp.comp_mutex);
 +      spin_lock_init(&dev_priv->display.dkl.phy_lock);
  
        i915_memcpy_init_early(dev_priv);
        intel_runtime_pm_init_early(&dev_priv->runtime_pm);
@@@ -740,6 -739,7 +741,6 @@@ static void i915_driver_hw_remove(struc
   */
  static void i915_driver_register(struct drm_i915_private *dev_priv)
  {
 -      struct drm_device *dev = &dev_priv->drm;
        struct intel_gt *gt;
        unsigned int i;
  
        intel_vgpu_register(dev_priv);
  
        /* Reveal our presence to userspace */
 -      if (drm_dev_register(dev, 0)) {
 +      if (drm_dev_register(&dev_priv->drm, 0)) {
                drm_err(&dev_priv->drm,
                        "Failed to register driver for userspace access!\n");
                return;
        for_each_gt(gt, dev_priv, i)
                intel_gt_driver_register(gt);
  
+       i915_hwmon_register(dev_priv);
        intel_display_driver_register(dev_priv);
  
        intel_power_domains_enable(dev_priv);
@@@ -796,6 -798,8 +799,8 @@@ static void i915_driver_unregister(stru
        for_each_gt(gt, dev_priv, i)
                intel_gt_driver_unregister(gt);
  
+       i915_hwmon_unregister(dev_priv);
        i915_perf_unregister(dev_priv);
        i915_pmu_unregister(dev_priv);
  
@@@ -894,6 -898,10 +899,6 @@@ int i915_driver_probe(struct pci_dev *p
        if (IS_ERR(i915))
                return PTR_ERR(i915);
  
 -      /* Disable nuclear pageflip by default on pre-ILK */
 -      if (!i915->params.nuclear_pageflip && DISPLAY_VER(i915) < 5)
 -              i915->drm.driver_features &= ~DRIVER_ATOMIC;
 -
        ret = pci_enable_device(pdev);
        if (ret)
                goto out_fini;
@@@ -1089,30 -1097,32 +1094,30 @@@ static void i915_driver_postclose(struc
  
  static void intel_suspend_encoders(struct drm_i915_private *dev_priv)
  {
 -      struct drm_device *dev = &dev_priv->drm;
        struct intel_encoder *encoder;
  
        if (!HAS_DISPLAY(dev_priv))
                return;
  
 -      drm_modeset_lock_all(dev);
 -      for_each_intel_encoder(dev, encoder)
 +      drm_modeset_lock_all(&dev_priv->drm);
 +      for_each_intel_encoder(&dev_priv->drm, encoder)
                if (encoder->suspend)
                        encoder->suspend(encoder);
 -      drm_modeset_unlock_all(dev);
 +      drm_modeset_unlock_all(&dev_priv->drm);
  }
  
  static void intel_shutdown_encoders(struct drm_i915_private *dev_priv)
  {
 -      struct drm_device *dev = &dev_priv->drm;
        struct intel_encoder *encoder;
  
        if (!HAS_DISPLAY(dev_priv))
                return;
  
 -      drm_modeset_lock_all(dev);
 -      for_each_intel_encoder(dev, encoder)
 +      drm_modeset_lock_all(&dev_priv->drm);
 +      for_each_intel_encoder(&dev_priv->drm, encoder)
                if (encoder->shutdown)
                        encoder->shutdown(encoder);
 -      drm_modeset_unlock_all(dev);
 +      drm_modeset_unlock_all(&dev_priv->drm);
  }
  
  void i915_driver_shutdown(struct drm_i915_private *i915)
@@@ -1656,7 -1666,8 +1661,8 @@@ static int intel_runtime_suspend(struc
  
                intel_runtime_pm_enable_interrupts(dev_priv);
  
-               intel_gt_runtime_resume(to_gt(dev_priv));
+               for_each_gt(gt, dev_priv, i)
+                       intel_gt_runtime_resume(gt);
  
                enable_rpm_wakeref_asserts(rpm);
  
@@@ -40,7 -40,6 +40,6 @@@
  #include "display/intel_display_core.h"
  
  #include "gem/i915_gem_context_types.h"
- #include "gem/i915_gem_lmem.h"
  #include "gem/i915_gem_shrinker.h"
  #include "gem/i915_gem_stolen.h"
  
@@@ -75,6 -74,9 +74,6 @@@ struct intel_limit
  struct intel_overlay_error_state;
  struct vlv_s0ix_state;
  
 -/* Threshold == 5 for long IRQs, 50 for short */
 -#define HPD_STORM_DEFAULT_THRESHOLD 50
 -
  #define I915_GEM_GPU_DOMAINS \
        (I915_GEM_DOMAIN_RENDER | \
         I915_GEM_DOMAIN_SAMPLER | \
@@@ -350,6 -352,8 +349,8 @@@ struct drm_i915_private 
  
        struct i915_perf perf;
  
+       struct i915_hwmon *hwmon;
        /* Abstract the submission mechanism (legacy ringbuffer or execlists) away */
        struct intel_gt gt0;
  
@@@ -868,7 -872,6 +869,7 @@@ IS_SUBPLATFORM(const struct drm_i915_pr
  #define HAS_DOUBLE_BUFFERED_M_N(dev_priv)     (DISPLAY_VER(dev_priv) >= 9 || IS_BROADWELL(dev_priv))
  
  #define HAS_CDCLK_CRAWL(dev_priv)      (INTEL_INFO(dev_priv)->display.has_cdclk_crawl)
 +#define HAS_CDCLK_SQUASH(dev_priv)     (INTEL_INFO(dev_priv)->display.has_cdclk_squash)
  #define HAS_DDI(dev_priv)              (INTEL_INFO(dev_priv)->display.has_ddi)
  #define HAS_FPGA_DBG_UNCLAIMED(dev_priv) (INTEL_INFO(dev_priv)->display.has_fpga_dbg)
  #define HAS_PSR(dev_priv)              (INTEL_INFO(dev_priv)->display.has_psr)
  #define HAS_RUNTIME_PM(dev_priv) (INTEL_INFO(dev_priv)->has_runtime_pm)
  #define HAS_64BIT_RELOC(dev_priv) (INTEL_INFO(dev_priv)->has_64bit_reloc)
  
+ #define HAS_OA_BPC_REPORTING(dev_priv) \
+       (INTEL_INFO(dev_priv)->has_oa_bpc_reporting)
+ #define HAS_OA_SLICE_CONTRIB_LIMITS(dev_priv) \
+       (INTEL_INFO(dev_priv)->has_oa_slice_contrib_limits)
  /*
   * Set this flag, when platform requires 64K GTT page sizes or larger for
   * device local memory access.
   */
  #define HAS_64K_PAGES(dev_priv) (INTEL_INFO(dev_priv)->has_64k_pages)
  
- /*
-  * Set this flag when platform doesn't allow both 64k pages and 4k pages in
-  * the same PT. this flag means we need to support compact PT layout for the
-  * ppGTT when using the 64K GTT pages.
-  */
- #define NEEDS_COMPACT_PT(dev_priv) (INTEL_INFO(dev_priv)->needs_compact_pt)
  #define HAS_IPC(dev_priv)              (INTEL_INFO(dev_priv)->display.has_ipc)
  
  #define HAS_REGION(i915, i) (RUNTIME_INFO(i915)->memory_regions & (i))
  
  #define HAS_GMCH(dev_priv) (INTEL_INFO(dev_priv)->display.has_gmch)
  
 +#define HAS_GMD_ID(i915)      (INTEL_INFO(i915)->has_gmd_id)
 +
  #define HAS_LSPCON(dev_priv) (IS_DISPLAY_VER(dev_priv, 9, 10))
  
  #define HAS_L3_CCS_READ(i915) (INTEL_INFO(i915)->has_l3_ccs_read)
  
  #define HAS_ONE_EU_PER_FUSE_BIT(i915) (INTEL_INFO(i915)->has_one_eu_per_fuse_bit)
  
+ #define HAS_LMEMBAR_SMEM_STOLEN(i915) (!HAS_LMEM(i915) && \
+                                      GRAPHICS_VER_FULL(i915) >= IP_VER(12, 70))
  /* intel_device_info.c */
  static inline struct intel_device_info *
  mkwrite_device_info(struct drm_i915_private *dev_priv)
        return (struct intel_device_info *)INTEL_INFO(dev_priv);
  }
  
- static inline enum i915_map_type
- i915_coherent_map_type(struct drm_i915_private *i915,
-                      struct drm_i915_gem_object *obj, bool always_coherent)
- {
-       if (i915_gem_object_is_lmem(obj))
-               return I915_MAP_WC;
-       if (HAS_LLC(i915) || always_coherent)
-               return I915_MAP_WB;
-       else
-               return I915_MAP_WC;
- }
  #endif
@@@ -1023,6 -1023,8 +1023,8 @@@ static const struct intel_device_info a
        .has_logical_ring_contexts = 1, \
        .has_logical_ring_elsq = 1, \
        .has_mslice_steering = 1, \
+       .has_oa_bpc_reporting = 1, \
+       .has_oa_slice_contrib_limits = 1, \
        .has_rc6 = 1, \
        .has_reset_engine = 1, \
        .has_rps = 1, \
@@@ -1042,7 -1044,6 +1044,6 @@@ static const struct intel_device_info x
        PLATFORM(INTEL_XEHPSDV),
        NO_DISPLAY,
        .has_64k_pages = 1,
-       .needs_compact_pt = 1,
        .has_media_ratio_mode = 1,
        .__runtime.platform_engine_mask =
                BIT(RCS0) | BIT(BCS0) |
        .has_64k_pages = 1, \
        .has_guc_deprivilege = 1, \
        .has_heci_pxp = 1, \
-       .needs_compact_pt = 1, \
        .has_media_ratio_mode = 1, \
 +      .display.has_cdclk_squash = 1, \
        .__runtime.platform_engine_mask = \
                BIT(RCS0) | BIT(BCS0) | \
                BIT(VECS0) | BIT(VECS1) | \
@@@ -1145,7 -1144,7 +1145,8 @@@ static const struct intel_device_info m
        .display.has_modular_fia = 1,
        .extra_gt_list = xelpmp_extra_gt,
        .has_flat_ccs = 0,
 +      .has_gmd_id = 1,
+       .has_mslice_steering = 0,
        .has_snoop = 1,
        .__runtime.memory_regions = REGION_SMEM | REGION_STOLEN_LMEM,
        .__runtime.platform_engine_mask = BIT(RCS0) | BIT(BCS0) | BIT(CCS0),
@@@ -1298,9 -1297,7 +1299,7 @@@ bool i915_pci_resource_valid(struct pci
  
  static bool intel_mmio_bar_valid(struct pci_dev *pdev, struct intel_device_info *intel_info)
  {
-       int gttmmaddr_bar = intel_info->__runtime.graphics.ip.ver == 2 ? GEN2_GTTMMADR_BAR : GTTMMADR_BAR;
-       return i915_pci_resource_valid(pdev, gttmmaddr_bar);
+       return i915_pci_resource_valid(pdev, intel_mmio_bar(intel_info->__runtime.graphics.ip.ver));
  }
  
  static int i915_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
  #define XEHPSDV_RP_STATE_CAP  _MMIO(0x250014)
  #define PVC_RP_STATE_CAP      _MMIO(0x281014)
  
+ #define MTL_RP_STATE_CAP      _MMIO(0x138000)
+ #define MTL_MEDIAP_STATE_CAP  _MMIO(0x138020)
+ #define   MTL_RP0_CAP_MASK    REG_GENMASK(8, 0)
+ #define   MTL_RPN_CAP_MASK    REG_GENMASK(24, 16)
+ #define MTL_GT_RPE_FREQUENCY  _MMIO(0x13800c)
+ #define MTL_MPE_FREQUENCY     _MMIO(0x13802c)
+ #define   MTL_RPE_MASK                REG_GENMASK(8, 0)
  #define GT0_PERF_LIMIT_REASONS                _MMIO(0x1381a8)
  #define   GT0_PERF_LIMIT_REASONS_MASK 0xde3
  #define   PROCHOT_MASK                        REG_BIT(0)
  #define   POWER_LIMIT_4_MASK          REG_BIT(8)
  #define   POWER_LIMIT_1_MASK          REG_BIT(10)
  #define   POWER_LIMIT_2_MASK          REG_BIT(11)
+ #define   GT0_PERF_LIMIT_REASONS_LOG_MASK REG_GENMASK(31, 16)
+ #define MTL_MEDIA_PERF_LIMIT_REASONS  _MMIO(0x138030)
  
  #define CHV_CLK_CTL1                  _MMIO(0x101100)
  #define VLV_CLK_CTL2                  _MMIO(0x101104)
  #define TRANS_PSR_IIR(tran)                   _MMIO_TRANS2(tran, _PSR_IIR_A)
  #define   _EDP_PSR_TRANS_SHIFT(trans)         ((trans) == TRANSCODER_EDP ? \
                                                 0 : ((trans) - TRANSCODER_A + 1) * 8)
 -#define   EDP_PSR_TRANS_MASK(trans)           (0x7 << _EDP_PSR_TRANS_SHIFT(trans))
 -#define   EDP_PSR_ERROR(trans)                        (0x4 << _EDP_PSR_TRANS_SHIFT(trans))
 -#define   EDP_PSR_POST_EXIT(trans)            (0x2 << _EDP_PSR_TRANS_SHIFT(trans))
 -#define   EDP_PSR_PRE_ENTRY(trans)            (0x1 << _EDP_PSR_TRANS_SHIFT(trans))
 +#define   TGL_PSR_MASK                        REG_GENMASK(2, 0)
 +#define   TGL_PSR_ERROR                       REG_BIT(2)
 +#define   TGL_PSR_POST_EXIT           REG_BIT(1)
 +#define   TGL_PSR_PRE_ENTRY           REG_BIT(0)
 +#define   EDP_PSR_MASK(trans)         (TGL_PSR_MASK <<                \
 +                                       _EDP_PSR_TRANS_SHIFT(trans))
 +#define   EDP_PSR_ERROR(trans)                (TGL_PSR_ERROR <<               \
 +                                       _EDP_PSR_TRANS_SHIFT(trans))
 +#define   EDP_PSR_POST_EXIT(trans)    (TGL_PSR_POST_EXIT <<           \
 +                                       _EDP_PSR_TRANS_SHIFT(trans))
 +#define   EDP_PSR_PRE_ENTRY(trans)    (TGL_PSR_PRE_ENTRY <<           \
 +                                       _EDP_PSR_TRANS_SHIFT(trans))
  
  #define _SRD_AUX_DATA_A                               0x60814
  #define _SRD_AUX_DATA_EDP                     0x6f814
  #define ICL_DSSM_CDCLK_PLL_REFCLK_19_2MHz     (1 << 29)
  #define ICL_DSSM_CDCLK_PLL_REFCLK_38_4MHz     (2 << 29)
  
 +#define GMD_ID_DISPLAY                                _MMIO(0x510a0)
 +#define   GMD_ID_ARCH_MASK                    REG_GENMASK(31, 22)
 +#define   GMD_ID_RELEASE_MASK                 REG_GENMASK(21, 14)
 +#define   GMD_ID_STEP                         REG_GENMASK(5, 0)
 +
  /*GEN11 chicken */
  #define _PIPEA_CHICKEN                                0x70038
  #define _PIPEB_CHICKEN                                0x71038
  #define   DG1_PCODE_STATUS                    0x7E
  #define     DG1_UNCORE_GET_INIT_STATUS                0x0
  #define     DG1_UNCORE_INIT_STATUS_COMPLETE   0x1
+ #define   PCODE_POWER_SETUP                   0x7C
+ #define     POWER_SETUP_SUBCOMMAND_READ_I1    0x4
+ #define     POWER_SETUP_SUBCOMMAND_WRITE_I1   0x5
+ #define           POWER_SETUP_I1_WATTS                REG_BIT(31)
+ #define           POWER_SETUP_I1_SHIFT                6       /* 10.6 fixed point format */
+ #define           POWER_SETUP_I1_DATA_MASK            REG_GENMASK(15, 0)
  #define GEN12_PCODE_READ_SAGV_BLOCK_TIME_US   0x23
  #define   XEHP_PCODE_FREQUENCY_CONFIG         0x6e    /* xehpsdv, pvc */
  /* XEHP_PCODE_FREQUENCY_CONFIG sub-commands (param1) */
@@@ -7418,6 -7422,182 +7435,6 @@@ enum skl_power_gate 
                                                   _ADLS_DPLL4_CFGCR1, \
                                                   _ADLS_DPLL3_CFGCR1)
  
 -#define _DKL_PHY1_BASE                        0x168000
 -#define _DKL_PHY2_BASE                        0x169000
 -#define _DKL_PHY3_BASE                        0x16A000
 -#define _DKL_PHY4_BASE                        0x16B000
 -#define _DKL_PHY5_BASE                        0x16C000
 -#define _DKL_PHY6_BASE                        0x16D000
 -
 -/* DEKEL PHY MMIO Address = Phy base + (internal address & ~index_mask) */
 -#define _DKL_PCS_DW5                  0x14
 -#define DKL_PCS_DW5(tc_port)          _MMIO(_PORT(tc_port, _DKL_PHY1_BASE, \
 -                                                  _DKL_PHY2_BASE) + \
 -                                                  _DKL_PCS_DW5)
 -#define   DKL_PCS_DW5_CORE_SOFTRESET  REG_BIT(11)
 -
 -#define _DKL_PLL_DIV0                 0x200
 -#define   DKL_PLL_DIV0_AFC_STARTUP_MASK       REG_GENMASK(27, 25)
 -#define   DKL_PLL_DIV0_AFC_STARTUP(val)       REG_FIELD_PREP(DKL_PLL_DIV0_AFC_STARTUP_MASK, (val))
 -#define   DKL_PLL_DIV0_INTEG_COEFF(x) ((x) << 16)
 -#define   DKL_PLL_DIV0_INTEG_COEFF_MASK       (0x1F << 16)
 -#define   DKL_PLL_DIV0_PROP_COEFF(x)  ((x) << 12)
 -#define   DKL_PLL_DIV0_PROP_COEFF_MASK        (0xF << 12)
 -#define   DKL_PLL_DIV0_FBPREDIV_SHIFT   (8)
 -#define   DKL_PLL_DIV0_FBPREDIV(x)    ((x) << DKL_PLL_DIV0_FBPREDIV_SHIFT)
 -#define   DKL_PLL_DIV0_FBPREDIV_MASK  (0xF << DKL_PLL_DIV0_FBPREDIV_SHIFT)
 -#define   DKL_PLL_DIV0_FBDIV_INT(x)   ((x) << 0)
 -#define   DKL_PLL_DIV0_FBDIV_INT_MASK (0xFF << 0)
 -#define   DKL_PLL_DIV0_MASK           (DKL_PLL_DIV0_INTEG_COEFF_MASK | \
 -                                       DKL_PLL_DIV0_PROP_COEFF_MASK | \
 -                                       DKL_PLL_DIV0_FBPREDIV_MASK | \
 -                                       DKL_PLL_DIV0_FBDIV_INT_MASK)
 -#define DKL_PLL_DIV0(tc_port)         _MMIO(_PORT(tc_port, _DKL_PHY1_BASE, \
 -                                                  _DKL_PHY2_BASE) + \
 -                                                  _DKL_PLL_DIV0)
 -
 -#define _DKL_PLL_DIV1                         0x204
 -#define   DKL_PLL_DIV1_IREF_TRIM(x)           ((x) << 16)
 -#define   DKL_PLL_DIV1_IREF_TRIM_MASK         (0x1F << 16)
 -#define   DKL_PLL_DIV1_TDC_TARGET_CNT(x)      ((x) << 0)
 -#define   DKL_PLL_DIV1_TDC_TARGET_CNT_MASK    (0xFF << 0)
 -#define DKL_PLL_DIV1(tc_port)         _MMIO(_PORT(tc_port, _DKL_PHY1_BASE, \
 -                                                  _DKL_PHY2_BASE) + \
 -                                                  _DKL_PLL_DIV1)
 -
 -#define _DKL_PLL_SSC                          0x210
 -#define   DKL_PLL_SSC_IREF_NDIV_RATIO(x)      ((x) << 29)
 -#define   DKL_PLL_SSC_IREF_NDIV_RATIO_MASK    (0x7 << 29)
 -#define   DKL_PLL_SSC_STEP_LEN(x)             ((x) << 16)
 -#define   DKL_PLL_SSC_STEP_LEN_MASK           (0xFF << 16)
 -#define   DKL_PLL_SSC_STEP_NUM(x)             ((x) << 11)
 -#define   DKL_PLL_SSC_STEP_NUM_MASK           (0x7 << 11)
 -#define   DKL_PLL_SSC_EN                      (1 << 9)
 -#define DKL_PLL_SSC(tc_port)          _MMIO(_PORT(tc_port, _DKL_PHY1_BASE, \
 -                                                  _DKL_PHY2_BASE) + \
 -                                                  _DKL_PLL_SSC)
 -
 -#define _DKL_PLL_BIAS                 0x214
 -#define   DKL_PLL_BIAS_FRAC_EN_H      (1 << 30)
 -#define   DKL_PLL_BIAS_FBDIV_SHIFT    (8)
 -#define   DKL_PLL_BIAS_FBDIV_FRAC(x)  ((x) << DKL_PLL_BIAS_FBDIV_SHIFT)
 -#define   DKL_PLL_BIAS_FBDIV_FRAC_MASK        (0x3FFFFF << DKL_PLL_BIAS_FBDIV_SHIFT)
 -#define DKL_PLL_BIAS(tc_port)         _MMIO(_PORT(tc_port, _DKL_PHY1_BASE, \
 -                                                  _DKL_PHY2_BASE) + \
 -                                                  _DKL_PLL_BIAS)
 -
 -#define _DKL_PLL_TDC_COLDST_BIAS              0x218
 -#define   DKL_PLL_TDC_SSC_STEP_SIZE(x)                ((x) << 8)
 -#define   DKL_PLL_TDC_SSC_STEP_SIZE_MASK      (0xFF << 8)
 -#define   DKL_PLL_TDC_FEED_FWD_GAIN(x)                ((x) << 0)
 -#define   DKL_PLL_TDC_FEED_FWD_GAIN_MASK      (0xFF << 0)
 -#define DKL_PLL_TDC_COLDST_BIAS(tc_port) _MMIO(_PORT(tc_port, \
 -                                                   _DKL_PHY1_BASE, \
 -                                                   _DKL_PHY2_BASE) + \
 -                                                   _DKL_PLL_TDC_COLDST_BIAS)
 -
 -#define _DKL_REFCLKIN_CTL             0x12C
 -/* Bits are the same as MG_REFCLKIN_CTL */
 -#define DKL_REFCLKIN_CTL(tc_port)     _MMIO(_PORT(tc_port, \
 -                                                  _DKL_PHY1_BASE, \
 -                                                  _DKL_PHY2_BASE) + \
 -                                            _DKL_REFCLKIN_CTL)
 -
 -#define _DKL_CLKTOP2_HSCLKCTL         0xD4
 -/* Bits are the same as MG_CLKTOP2_HSCLKCTL */
 -#define DKL_CLKTOP2_HSCLKCTL(tc_port) _MMIO(_PORT(tc_port, \
 -                                                  _DKL_PHY1_BASE, \
 -                                                  _DKL_PHY2_BASE) + \
 -                                            _DKL_CLKTOP2_HSCLKCTL)
 -
 -#define _DKL_CLKTOP2_CORECLKCTL1              0xD8
 -/* Bits are the same as MG_CLKTOP2_CORECLKCTL1 */
 -#define DKL_CLKTOP2_CORECLKCTL1(tc_port)      _MMIO(_PORT(tc_port, \
 -                                                          _DKL_PHY1_BASE, \
 -                                                          _DKL_PHY2_BASE) + \
 -                                                    _DKL_CLKTOP2_CORECLKCTL1)
 -
 -#define _DKL_TX_DPCNTL0                               0x2C0
 -#define  DKL_TX_PRESHOOT_COEFF(x)                     ((x) << 13)
 -#define  DKL_TX_PRESHOOT_COEFF_MASK                   (0x1f << 13)
 -#define  DKL_TX_DE_EMPHASIS_COEFF(x)          ((x) << 8)
 -#define  DKL_TX_DE_EMPAHSIS_COEFF_MASK                (0x1f << 8)
 -#define  DKL_TX_VSWING_CONTROL(x)                     ((x) << 0)
 -#define  DKL_TX_VSWING_CONTROL_MASK                   (0x7 << 0)
 -#define DKL_TX_DPCNTL0(tc_port) _MMIO(_PORT(tc_port, \
 -                                                   _DKL_PHY1_BASE, \
 -                                                   _DKL_PHY2_BASE) + \
 -                                                   _DKL_TX_DPCNTL0)
 -
 -#define _DKL_TX_DPCNTL1                               0x2C4
 -/* Bits are the same as DKL_TX_DPCNTRL0 */
 -#define DKL_TX_DPCNTL1(tc_port) _MMIO(_PORT(tc_port, \
 -                                                   _DKL_PHY1_BASE, \
 -                                                   _DKL_PHY2_BASE) + \
 -                                                   _DKL_TX_DPCNTL1)
 -
 -#define _DKL_TX_DPCNTL2                                       0x2C8
 -#define  DKL_TX_DP20BITMODE                           REG_BIT(2)
 -#define  DKL_TX_DPCNTL2_CFG_LOADGENSELECT_TX1_MASK    REG_GENMASK(4, 3)
 -#define  DKL_TX_DPCNTL2_CFG_LOADGENSELECT_TX1(val)    REG_FIELD_PREP(DKL_TX_DPCNTL2_CFG_LOADGENSELECT_TX1_MASK, (val))
 -#define  DKL_TX_DPCNTL2_CFG_LOADGENSELECT_TX2_MASK    REG_GENMASK(6, 5)
 -#define  DKL_TX_DPCNTL2_CFG_LOADGENSELECT_TX2(val)    REG_FIELD_PREP(DKL_TX_DPCNTL2_CFG_LOADGENSELECT_TX2_MASK, (val))
 -#define DKL_TX_DPCNTL2(tc_port) _MMIO(_PORT(tc_port, \
 -                                                   _DKL_PHY1_BASE, \
 -                                                   _DKL_PHY2_BASE) + \
 -                                                   _DKL_TX_DPCNTL2)
 -
 -#define _DKL_TX_FW_CALIB                              0x2F8
 -#define  DKL_TX_CFG_DISABLE_WAIT_INIT                 (1 << 7)
 -#define DKL_TX_FW_CALIB(tc_port) _MMIO(_PORT(tc_port, \
 -                                                   _DKL_PHY1_BASE, \
 -                                                   _DKL_PHY2_BASE) + \
 -                                                   _DKL_TX_FW_CALIB)
 -
 -#define _DKL_TX_PMD_LANE_SUS                          0xD00
 -#define DKL_TX_PMD_LANE_SUS(tc_port) _MMIO(_PORT(tc_port, \
 -                                                        _DKL_PHY1_BASE, \
 -                                                        _DKL_PHY2_BASE) + \
 -                                                        _DKL_TX_PMD_LANE_SUS)
 -
 -#define _DKL_TX_DW17                                  0xDC4
 -#define DKL_TX_DW17(tc_port) _MMIO(_PORT(tc_port, \
 -                                                   _DKL_PHY1_BASE, \
 -                                                   _DKL_PHY2_BASE) + \
 -                                                   _DKL_TX_DW17)
 -
 -#define _DKL_TX_DW18                                  0xDC8
 -#define DKL_TX_DW18(tc_port) _MMIO(_PORT(tc_port, \
 -                                                   _DKL_PHY1_BASE, \
 -                                                   _DKL_PHY2_BASE) + \
 -                                                   _DKL_TX_DW18)
 -
 -#define _DKL_DP_MODE                                  0xA0
 -#define DKL_DP_MODE(tc_port) _MMIO(_PORT(tc_port, \
 -                                                   _DKL_PHY1_BASE, \
 -                                                   _DKL_PHY2_BASE) + \
 -                                                   _DKL_DP_MODE)
 -
 -#define _DKL_CMN_UC_DW27                      0x36C
 -#define  DKL_CMN_UC_DW27_UC_HEALTH            (0x1 << 15)
 -#define DKL_CMN_UC_DW_27(tc_port)             _MMIO(_PORT(tc_port, \
 -                                                          _DKL_PHY1_BASE, \
 -                                                          _DKL_PHY2_BASE) + \
 -                                                          _DKL_CMN_UC_DW27)
 -
 -/*
 - * Each Dekel PHY is addressed through a 4KB aperture. Each PHY has more than
 - * 4KB of register space, so a separate index is programmed in HIP_INDEX_REG0
 - * or HIP_INDEX_REG1, based on the port number, to set the upper 2 address
 - * bits that point the 4KB window into the full PHY register space.
 - */
 -#define _HIP_INDEX_REG0                       0x1010A0
 -#define _HIP_INDEX_REG1                       0x1010A4
 -#define HIP_INDEX_REG(tc_port)                _MMIO((tc_port) < 4 ? _HIP_INDEX_REG0 \
 -                                            : _HIP_INDEX_REG1)
 -#define _HIP_INDEX_SHIFT(tc_port)     (8 * ((tc_port) % 4))
 -#define HIP_INDEX_VAL(tc_port, val)   ((val) << _HIP_INDEX_SHIFT(tc_port))
 -
  /* BXT display engine PLL */
  #define BXT_DE_PLL_CTL                        _MMIO(0x6d000)
  #define   BXT_DE_PLL_RATIO(x)         (x)     /* {60,65,100} * 19.2MHz */
                                                           _ICL_PIPE_DSS_CTL2_PB, \
                                                           _ICL_PIPE_DSS_CTL2_PC)
  
+ #define GGC                           _MMIO(0x108040)
+ #define   GMS_MASK                    REG_GENMASK(15, 8)
+ #define   GGMS_MASK                   REG_GENMASK(7, 6)
  #define GEN12_GSMBASE                 _MMIO(0x108100)
  #define GEN12_DSMBASE                 _MMIO(0x1080C0)
+ #define   GEN12_BDSM_MASK             REG_GENMASK64(63, 20)
  
  #define XEHP_CLOCK_GATE_DIS           _MMIO(0x101014)
  #define   SGSI_SIDECLK_DIS            REG_BIT(17)
  #define GEN12_CULLBIT2                        _MMIO(0x7030)
  #define GEN12_STATE_ACK_DEBUG         _MMIO(0x20BC)
  
 +#define _MTL_CLKGATE_DIS_TRANS_A                      0x604E8
 +#define _MTL_CLKGATE_DIS_TRANS_B                      0x614E8
 +#define MTL_CLKGATE_DIS_TRANS(trans)                  _MMIO_TRANS2(trans, _MTL_CLKGATE_DIS_TRANS_A)
 +#define  MTL_CLKGATE_DIS_TRANS_DMASC_GATING_DIS               REG_BIT(7)
 +
  #define MTL_LATENCY_LP0_LP1           _MMIO(0x45780)
  #define MTL_LATENCY_LP2_LP3           _MMIO(0x45784)
  #define MTL_LATENCY_LP4_LP5           _MMIO(0x45788)
  #define   MTL_TRAS_MASK                       REG_GENMASK(16, 8)
  #define   MTL_TRDPRE_MASK             REG_GENMASK(7, 0)
  
 +#define MTL_MEDIA_GSI_BASE            0x380000
 +
  #endif /* _I915_REG_H_ */
@@@ -146,14 -146,12 +146,13 @@@ enum intel_ppgtt_type 
        /* Keep has_* in alphabetical order */ \
        func(has_64bit_reloc); \
        func(has_64k_pages); \
-       func(needs_compact_pt); \
        func(gpu_reset_clobbers_display); \
        func(has_reset_engine); \
        func(has_3d_pipeline); \
        func(has_4tile); \
        func(has_flat_ccs); \
        func(has_global_mocs); \
 +      func(has_gmd_id); \
        func(has_gt_uc); \
        func(has_heci_pxp); \
        func(has_heci_gscfi); \
        func(has_logical_ring_elsq); \
        func(has_media_ratio_mode); \
        func(has_mslice_steering); \
+       func(has_oa_bpc_reporting); \
+       func(has_oa_slice_contrib_limits); \
        func(has_one_eu_per_fuse_bit); \
        func(has_pxp); \
        func(has_rc6); \
        /* Keep in alphabetical order */ \
        func(cursor_needs_physical); \
        func(has_cdclk_crawl); \
 +      func(has_cdclk_squash); \
        func(has_ddi); \
        func(has_dp_mst); \
        func(has_dsb); \
        func(overlay_needs_physical); \
        func(supports_tv);
  
 -struct ip_version {
 +struct intel_ip_version {
        u8 ver;
        u8 rel;
 +      u8 step;
  };
  
  struct intel_runtime_info {
 +      /*
 +       * Single "graphics" IP version that represents
 +       * render, compute and copy behavior.
 +       */
        struct {
 -              struct ip_version ip;
 +              struct intel_ip_version ip;
        } graphics;
        struct {
 -              struct ip_version ip;
 +              struct intel_ip_version ip;
        } media;
        struct {
 -              struct ip_version ip;
 +              struct intel_ip_version ip;
        } display;
  
        /*
@@@ -315,7 -309,7 +316,7 @@@ struct intel_driver_caps 
  
  const char *intel_platform_name(enum intel_platform platform);
  
 -void intel_device_info_subplatform_init(struct drm_i915_private *dev_priv);
 +void intel_device_info_runtime_init_early(struct drm_i915_private *dev_priv);
  void intel_device_info_runtime_init(struct drm_i915_private *dev_priv);
  
  void intel_device_info_print(const struct intel_device_info *info,
@@@ -102,7 -102,7 +102,7 @@@ static int iterate_generic_mmio(struct 
        MMIO_D(_MMIO(0x2438));
        MMIO_D(_MMIO(0x243c));
        MMIO_D(_MMIO(0x7018));
-       MMIO_D(HALF_SLICE_CHICKEN3);
+       MMIO_D(HSW_HALF_SLICE_CHICKEN3);
        MMIO_D(GEN7_HALF_SLICE_CHICKEN1);
        /* display */
        MMIO_F(_MMIO(0x60220), 0x20);
@@@ -1077,8 -1077,7 +1077,8 @@@ static int iterate_skl_plus_mmio(struc
        MMIO_D(GEN8_HDC_CHICKEN1);
        MMIO_D(GEN9_WM_CHICKEN3);
  
 -      if (IS_KABYLAKE(dev_priv) || IS_COFFEELAKE(dev_priv))
 +      if (IS_KABYLAKE(dev_priv) ||
 +          IS_COFFEELAKE(dev_priv) || IS_COMETLAKE(dev_priv))
                MMIO_D(GAMT_CHKN_BIT_REG);
        if (!IS_BROXTON(dev_priv))
                MMIO_D(GEN9_CTX_PREEMPT_REG);
@@@ -30,6 -30,8 +30,8 @@@
  #include "display/skl_watermark.h"
  
  #include "gt/intel_engine_regs.h"
+ #include "gt/intel_gt.h"
+ #include "gt/intel_gt_mcr.h"
  #include "gt/intel_gt_regs.h"
  
  #include "i915_drv.h"
@@@ -58,25 -60,20 +60,20 @@@ static void gen9_init_clock_gating(stru
                 * Must match Sampler, Pixel Back End, and Media. See
                 * WaCompressedResourceSamplerPbeMediaNewHashMode.
                 */
-               intel_uncore_write(&dev_priv->uncore, CHICKEN_PAR1_1,
-                          intel_uncore_read(&dev_priv->uncore, CHICKEN_PAR1_1) |
-                          SKL_DE_COMPRESSED_HASH_MODE);
+               intel_uncore_rmw(&dev_priv->uncore, CHICKEN_PAR1_1, 0, SKL_DE_COMPRESSED_HASH_MODE);
        }
  
        /* See Bspec note for PSR2_CTL bit 31, Wa#828:skl,bxt,kbl,cfl */
-       intel_uncore_write(&dev_priv->uncore, CHICKEN_PAR1_1,
-                  intel_uncore_read(&dev_priv->uncore, CHICKEN_PAR1_1) | SKL_EDP_PSR_FIX_RDWRAP);
+       intel_uncore_rmw(&dev_priv->uncore, CHICKEN_PAR1_1, 0, SKL_EDP_PSR_FIX_RDWRAP);
  
        /* WaEnableChickenDCPR:skl,bxt,kbl,glk,cfl */
-       intel_uncore_write(&dev_priv->uncore, GEN8_CHICKEN_DCPR_1,
-                  intel_uncore_read(&dev_priv->uncore, GEN8_CHICKEN_DCPR_1) | MASK_WAKEMEM);
+       intel_uncore_rmw(&dev_priv->uncore, GEN8_CHICKEN_DCPR_1, 0, MASK_WAKEMEM);
  
        /*
         * WaFbcWakeMemOn:skl,bxt,kbl,glk,cfl
         * Display WA #0859: skl,bxt,kbl,glk,cfl
         */
-       intel_uncore_write(&dev_priv->uncore, DISP_ARB_CTL, intel_uncore_read(&dev_priv->uncore, DISP_ARB_CTL) |
-                  DISP_FBC_MEMORY_WAKE);
+       intel_uncore_rmw(&dev_priv->uncore, DISP_ARB_CTL, 0, DISP_FBC_MEMORY_WAKE);
  }
  
  static void bxt_init_clock_gating(struct drm_i915_private *dev_priv)
        gen9_init_clock_gating(dev_priv);
  
        /* WaDisableSDEUnitClockGating:bxt */
-       intel_uncore_write(&dev_priv->uncore, GEN8_UCGCTL6, intel_uncore_read(&dev_priv->uncore, GEN8_UCGCTL6) |
-                  GEN8_SDEUNIT_CLOCK_GATE_DISABLE);
+       intel_uncore_rmw(&dev_priv->uncore, GEN8_UCGCTL6, 0, GEN8_SDEUNIT_CLOCK_GATE_DISABLE);
  
        /*
         * FIXME:
         * GEN8_HDCUNIT_CLOCK_GATE_DISABLE_HDCREQ applies on 3x6 GT SKUs only.
         */
-       intel_uncore_write(&dev_priv->uncore, GEN8_UCGCTL6, intel_uncore_read(&dev_priv->uncore, GEN8_UCGCTL6) |
-                  GEN8_HDCUNIT_CLOCK_GATE_DISABLE_HDCREQ);
+       intel_uncore_rmw(&dev_priv->uncore, GEN8_UCGCTL6, 0, GEN8_HDCUNIT_CLOCK_GATE_DISABLE_HDCREQ);
  
        /*
         * Wa: Backlight PWM may stop in the asserted state, causing backlight
         * WaFbcTurnOffFbcWatermark:bxt
         * Display WA #0562: bxt
         */
-       intel_uncore_write(&dev_priv->uncore, DISP_ARB_CTL, intel_uncore_read(&dev_priv->uncore, DISP_ARB_CTL) |
-                  DISP_FBC_WM_DIS);
+       intel_uncore_rmw(&dev_priv->uncore, DISP_ARB_CTL, 0, DISP_FBC_WM_DIS);
  
        /*
         * WaFbcHighMemBwCorruptionAvoidance:bxt
         * Display WA #0883: bxt
         */
-       intel_uncore_write(&dev_priv->uncore, ILK_DPFC_CHICKEN(INTEL_FBC_A),
-                          intel_uncore_read(&dev_priv->uncore, ILK_DPFC_CHICKEN(INTEL_FBC_A)) |
-                          DPFC_DISABLE_DUMMY0);
+       intel_uncore_rmw(&dev_priv->uncore, ILK_DPFC_CHICKEN(INTEL_FBC_A), 0, DPFC_DISABLE_DUMMY0);
  }
  
  static void glk_init_clock_gating(struct drm_i915_private *dev_priv)
@@@ -895,14 -887,19 +887,14 @@@ static void pnv_update_wm(struct drm_i9
                wm = intel_calculate_wm(pixel_rate, &pnv_cursor_wm,
                                        pnv_display_wm.fifo_size,
                                        4, latency->cursor_sr);
 -              reg = intel_uncore_read(&dev_priv->uncore, DSPFW3);
 -              reg &= ~DSPFW_CURSOR_SR_MASK;
 -              reg |= FW_WM(wm, CURSOR_SR);
 -              intel_uncore_write(&dev_priv->uncore, DSPFW3, reg);
 +              intel_uncore_rmw(&dev_priv->uncore, DSPFW3, DSPFW_CURSOR_SR_MASK,
 +                               FW_WM(wm, CURSOR_SR));
  
                /* Display HPLL off SR */
                wm = intel_calculate_wm(pixel_rate, &pnv_display_hplloff_wm,
                                        pnv_display_hplloff_wm.fifo_size,
                                        cpp, latency->display_hpll_disable);
 -              reg = intel_uncore_read(&dev_priv->uncore, DSPFW3);
 -              reg &= ~DSPFW_HPLL_SR_MASK;
 -              reg |= FW_WM(wm, HPLL_SR);
 -              intel_uncore_write(&dev_priv->uncore, DSPFW3, reg);
 +              intel_uncore_rmw(&dev_priv->uncore, DSPFW3, DSPFW_HPLL_SR_MASK, FW_WM(wm, HPLL_SR));
  
                /* cursor HPLL off SR */
                wm = intel_calculate_wm(pixel_rate, &pnv_cursor_hplloff_wm,
@@@ -1332,14 -1329,34 +1324,14 @@@ static bool g4x_compute_fbc_en(const st
        return true;
  }
  
 -static int g4x_compute_pipe_wm(struct intel_atomic_state *state,
 -                             struct intel_crtc *crtc)
 +static int _g4x_compute_pipe_wm(struct intel_crtc_state *crtc_state)
  {
 -      struct intel_crtc_state *crtc_state =
 -              intel_atomic_get_new_crtc_state(state, crtc);
 +      struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
        struct g4x_wm_state *wm_state = &crtc_state->wm.g4x.optimal;
        u8 active_planes = crtc_state->active_planes & ~BIT(PLANE_CURSOR);
        const struct g4x_pipe_wm *raw;
 -      const struct intel_plane_state *old_plane_state;
 -      const struct intel_plane_state *new_plane_state;
 -      struct intel_plane *plane;
        enum plane_id plane_id;
 -      int i, level;
 -      unsigned int dirty = 0;
 -
 -      for_each_oldnew_intel_plane_in_state(state, plane,
 -                                           old_plane_state,
 -                                           new_plane_state, i) {
 -              if (new_plane_state->hw.crtc != &crtc->base &&
 -                  old_plane_state->hw.crtc != &crtc->base)
 -                      continue;
 -
 -              if (g4x_raw_plane_wm_compute(crtc_state, new_plane_state))
 -                      dirty |= BIT(plane->id);
 -      }
 -
 -      if (!dirty)
 -              return 0;
 +      int level;
  
        level = G4X_WM_LEVEL_NORMAL;
        if (!g4x_raw_crtc_wm_is_valid(crtc_state, level))
        return 0;
  }
  
 +static int g4x_compute_pipe_wm(struct intel_atomic_state *state,
 +                             struct intel_crtc *crtc)
 +{
 +      struct intel_crtc_state *crtc_state =
 +              intel_atomic_get_new_crtc_state(state, crtc);
 +      const struct intel_plane_state *old_plane_state;
 +      const struct intel_plane_state *new_plane_state;
 +      struct intel_plane *plane;
 +      unsigned int dirty = 0;
 +      int i;
 +
 +      for_each_oldnew_intel_plane_in_state(state, plane,
 +                                           old_plane_state,
 +                                           new_plane_state, i) {
 +              if (new_plane_state->hw.crtc != &crtc->base &&
 +                  old_plane_state->hw.crtc != &crtc->base)
 +                      continue;
 +
 +              if (g4x_raw_plane_wm_compute(crtc_state, new_plane_state))
 +                      dirty |= BIT(plane->id);
 +      }
 +
 +      if (!dirty)
 +              return 0;
 +
 +      return _g4x_compute_pipe_wm(crtc_state);
 +}
 +
  static int g4x_compute_intermediate_wm(struct intel_atomic_state *state,
                                       struct intel_crtc *crtc)
  {
@@@ -1860,17 -1849,64 +1852,17 @@@ static bool vlv_raw_crtc_wm_is_valid(co
                vlv_raw_plane_wm_is_valid(crtc_state, PLANE_CURSOR, level);
  }
  
 -static int vlv_compute_pipe_wm(struct intel_atomic_state *state,
 -                             struct intel_crtc *crtc)
 +static int _vlv_compute_pipe_wm(struct intel_crtc_state *crtc_state)
  {
 +      struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
        struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
 -      struct intel_crtc_state *crtc_state =
 -              intel_atomic_get_new_crtc_state(state, crtc);
        struct vlv_wm_state *wm_state = &crtc_state->wm.vlv.optimal;
        const struct vlv_fifo_state *fifo_state =
                &crtc_state->wm.vlv.fifo_state;
        u8 active_planes = crtc_state->active_planes & ~BIT(PLANE_CURSOR);
        int num_active_planes = hweight8(active_planes);
 -      bool needs_modeset = drm_atomic_crtc_needs_modeset(&crtc_state->uapi);
 -      const struct intel_plane_state *old_plane_state;
 -      const struct intel_plane_state *new_plane_state;
 -      struct intel_plane *plane;
        enum plane_id plane_id;
 -      int level, ret, i;
 -      unsigned int dirty = 0;
 -
 -      for_each_oldnew_intel_plane_in_state(state, plane,
 -                                           old_plane_state,
 -                                           new_plane_state, i) {
 -              if (new_plane_state->hw.crtc != &crtc->base &&
 -                  old_plane_state->hw.crtc != &crtc->base)
 -                      continue;
 -
 -              if (vlv_raw_plane_wm_compute(crtc_state, new_plane_state))
 -                      dirty |= BIT(plane->id);
 -      }
 -
 -      /*
 -       * DSPARB registers may have been reset due to the
 -       * power well being turned off. Make sure we restore
 -       * them to a consistent state even if no primary/sprite
 -       * planes are initially active.
 -       */
 -      if (needs_modeset)
 -              crtc_state->fifo_changed = true;
 -
 -      if (!dirty)
 -              return 0;
 -
 -      /* cursor changes don't warrant a FIFO recompute */
 -      if (dirty & ~BIT(PLANE_CURSOR)) {
 -              const struct intel_crtc_state *old_crtc_state =
 -                      intel_atomic_get_old_crtc_state(state, crtc);
 -              const struct vlv_fifo_state *old_fifo_state =
 -                      &old_crtc_state->wm.vlv.fifo_state;
 -
 -              ret = vlv_compute_fifo(crtc_state);
 -              if (ret)
 -                      return ret;
 -
 -              if (needs_modeset ||
 -                  memcmp(old_fifo_state, fifo_state,
 -                         sizeof(*fifo_state)) != 0)
 -                      crtc_state->fifo_changed = true;
 -      }
 +      int level;
  
        /* initially allow all levels */
        wm_state->num_levels = intel_wm_num_levels(dev_priv);
        return 0;
  }
  
 +static int vlv_compute_pipe_wm(struct intel_atomic_state *state,
 +                             struct intel_crtc *crtc)
 +{
 +      struct intel_crtc_state *crtc_state =
 +              intel_atomic_get_new_crtc_state(state, crtc);
 +      bool needs_modeset = drm_atomic_crtc_needs_modeset(&crtc_state->uapi);
 +      const struct intel_plane_state *old_plane_state;
 +      const struct intel_plane_state *new_plane_state;
 +      struct intel_plane *plane;
 +      unsigned int dirty = 0;
 +      int i;
 +
 +      for_each_oldnew_intel_plane_in_state(state, plane,
 +                                           old_plane_state,
 +                                           new_plane_state, i) {
 +              if (new_plane_state->hw.crtc != &crtc->base &&
 +                  old_plane_state->hw.crtc != &crtc->base)
 +                      continue;
 +
 +              if (vlv_raw_plane_wm_compute(crtc_state, new_plane_state))
 +                      dirty |= BIT(plane->id);
 +      }
 +
 +      /*
 +       * DSPARB registers may have been reset due to the
 +       * power well being turned off. Make sure we restore
 +       * them to a consistent state even if no primary/sprite
 +       * planes are initially active. We also force a FIFO
 +       * recomputation so that we are sure to sanitize the
 +       * FIFO setting we took over from the BIOS even if there
 +       * are no active planes on the crtc.
 +       */
 +      if (needs_modeset)
 +              dirty = ~0;
 +
 +      if (!dirty)
 +              return 0;
 +
 +      /* cursor changes don't warrant a FIFO recompute */
 +      if (dirty & ~BIT(PLANE_CURSOR)) {
 +              const struct intel_crtc_state *old_crtc_state =
 +                      intel_atomic_get_old_crtc_state(state, crtc);
 +              const struct vlv_fifo_state *old_fifo_state =
 +                      &old_crtc_state->wm.vlv.fifo_state;
 +              const struct vlv_fifo_state *new_fifo_state =
 +                      &crtc_state->wm.vlv.fifo_state;
 +              int ret;
 +
 +              ret = vlv_compute_fifo(crtc_state);
 +              if (ret)
 +                      return ret;
 +
 +              if (needs_modeset ||
 +                  memcmp(old_fifo_state, new_fifo_state,
 +                         sizeof(*new_fifo_state)) != 0)
 +                      crtc_state->fifo_changed = true;
 +      }
 +
 +      return _vlv_compute_pipe_wm(crtc_state);
 +}
 +
  #define VLV_FIFO(plane, value) \
        (((value) << DSPARB_ ## plane ## _SHIFT_VLV) & DSPARB_ ## plane ## _MASK_VLV)
  
@@@ -3475,6 -3450,7 +3467,6 @@@ static void ilk_write_wm_values(struct 
  {
        struct ilk_wm_values *previous = &dev_priv->display.wm.hw;
        unsigned int dirty;
 -      u32 val;
  
        dirty = ilk_compute_wm_dirty(dev_priv, previous, results);
        if (!dirty)
                intel_uncore_write(&dev_priv->uncore, WM0_PIPE_ILK(PIPE_C), results->wm_pipe[2]);
  
        if (dirty & WM_DIRTY_DDB) {
 -              if (IS_HASWELL(dev_priv) || IS_BROADWELL(dev_priv)) {
 -                      val = intel_uncore_read(&dev_priv->uncore, WM_MISC);
 -                      if (results->partitioning == INTEL_DDB_PART_1_2)
 -                              val &= ~WM_MISC_DATA_PARTITION_5_6;
 -                      else
 -                              val |= WM_MISC_DATA_PARTITION_5_6;
 -                      intel_uncore_write(&dev_priv->uncore, WM_MISC, val);
 -              } else {
 -                      val = intel_uncore_read(&dev_priv->uncore, DISP_ARB_CTL2);
 -                      if (results->partitioning == INTEL_DDB_PART_1_2)
 -                              val &= ~DISP_DATA_PARTITION_5_6;
 -                      else
 -                              val |= DISP_DATA_PARTITION_5_6;
 -                      intel_uncore_write(&dev_priv->uncore, DISP_ARB_CTL2, val);
 -              }
 -      }
 -
 -      if (dirty & WM_DIRTY_FBC) {
 -              val = intel_uncore_read(&dev_priv->uncore, DISP_ARB_CTL);
 -              if (results->enable_fbc_wm)
 -                      val &= ~DISP_FBC_WM_DIS;
 +              if (IS_HASWELL(dev_priv) || IS_BROADWELL(dev_priv))
 +                      intel_uncore_rmw(&dev_priv->uncore, WM_MISC, WM_MISC_DATA_PARTITION_5_6,
 +                                       results->partitioning == INTEL_DDB_PART_1_2 ? 0 :
 +                                       WM_MISC_DATA_PARTITION_5_6);
                else
 -                      val |= DISP_FBC_WM_DIS;
 -              intel_uncore_write(&dev_priv->uncore, DISP_ARB_CTL, val);
 +                      intel_uncore_rmw(&dev_priv->uncore, DISP_ARB_CTL2, DISP_DATA_PARTITION_5_6,
 +                                       results->partitioning == INTEL_DDB_PART_1_2 ? 0 :
 +                                       DISP_DATA_PARTITION_5_6);
        }
  
 +      if (dirty & WM_DIRTY_FBC)
 +              intel_uncore_rmw(&dev_priv->uncore, DISP_ARB_CTL, DISP_FBC_WM_DIS,
 +                               results->enable_fbc_wm ? 0 : DISP_FBC_WM_DIS);
 +
        if (dirty & WM_DIRTY_LP(1) &&
            previous->wm_lp_spr[0] != results->wm_lp_spr[0])
                intel_uncore_write(&dev_priv->uncore, WM1S_LP_ILK, results->wm_lp_spr[0]);
@@@ -3828,8 -3816,6 +3820,8 @@@ void g4x_wm_get_hw_state(struct drm_i91
                                             plane_id, USHRT_MAX);
                g4x_raw_fbc_wm_set(crtc_state, level, USHRT_MAX);
  
 +              g4x_invalidate_wms(crtc, active, level);
 +
                crtc_state->wm.g4x.optimal = *active;
                crtc_state->wm.g4x.intermediate = *active;
  
@@@ -3866,30 -3852,37 +3858,30 @@@ void g4x_wm_sanitize(struct drm_i915_pr
                        to_intel_crtc_state(crtc->base.state);
                struct intel_plane_state *plane_state =
                        to_intel_plane_state(plane->base.state);
 -              struct g4x_wm_state *wm_state = &crtc_state->wm.g4x.optimal;
                enum plane_id plane_id = plane->id;
 -              int level;
 +              int level, num_levels = intel_wm_num_levels(dev_priv);
  
                if (plane_state->uapi.visible)
                        continue;
  
 -              for (level = 0; level < 3; level++) {
 +              for (level = 0; level < num_levels; level++) {
                        struct g4x_pipe_wm *raw =
                                &crtc_state->wm.g4x.raw[level];
  
                        raw->plane[plane_id] = 0;
 -                      wm_state->wm.plane[plane_id] = 0;
 -              }
  
 -              if (plane_id == PLANE_PRIMARY) {
 -                      for (level = 0; level < 3; level++) {
 -                              struct g4x_pipe_wm *raw =
 -                                      &crtc_state->wm.g4x.raw[level];
 +                      if (plane_id == PLANE_PRIMARY)
                                raw->fbc = 0;
 -                      }
 -
 -                      wm_state->sr.fbc = 0;
 -                      wm_state->hpll.fbc = 0;
 -                      wm_state->fbc_en = false;
                }
        }
  
        for_each_intel_crtc(&dev_priv->drm, crtc) {
                struct intel_crtc_state *crtc_state =
                        to_intel_crtc_state(crtc->base.state);
 +              int ret;
 +
 +              ret = _g4x_compute_pipe_wm(crtc_state);
 +              drm_WARN_ON(&dev_priv->drm, ret);
  
                crtc_state->wm.g4x.intermediate =
                        crtc_state->wm.g4x.optimal;
@@@ -4015,27 -4008,30 +4007,27 @@@ void vlv_wm_sanitize(struct drm_i915_pr
                        to_intel_crtc_state(crtc->base.state);
                struct intel_plane_state *plane_state =
                        to_intel_plane_state(plane->base.state);
 -              struct vlv_wm_state *wm_state = &crtc_state->wm.vlv.optimal;
 -              const struct vlv_fifo_state *fifo_state =
 -                      &crtc_state->wm.vlv.fifo_state;
                enum plane_id plane_id = plane->id;
 -              int level;
 +              int level, num_levels = intel_wm_num_levels(dev_priv);
  
                if (plane_state->uapi.visible)
                        continue;
  
 -              for (level = 0; level < wm_state->num_levels; level++) {
 +              for (level = 0; level < num_levels; level++) {
                        struct g4x_pipe_wm *raw =
                                &crtc_state->wm.vlv.raw[level];
  
                        raw->plane[plane_id] = 0;
 -
 -                      wm_state->wm[level].plane[plane_id] =
 -                              vlv_invert_wm_value(raw->plane[plane_id],
 -                                                  fifo_state->plane[plane_id]);
                }
        }
  
        for_each_intel_crtc(&dev_priv->drm, crtc) {
                struct intel_crtc_state *crtc_state =
                        to_intel_crtc_state(crtc->base.state);
 +              int ret;
 +
 +              ret = _vlv_compute_pipe_wm(crtc_state);
 +              drm_WARN_ON(&dev_priv->drm, ret);
  
                crtc_state->wm.vlv.intermediate =
                        crtc_state->wm.vlv.optimal;
   */
  static void ilk_init_lp_watermarks(struct drm_i915_private *dev_priv)
  {
-       intel_uncore_write(&dev_priv->uncore, WM3_LP_ILK, intel_uncore_read(&dev_priv->uncore, WM3_LP_ILK) & ~WM_LP_ENABLE);
-       intel_uncore_write(&dev_priv->uncore, WM2_LP_ILK, intel_uncore_read(&dev_priv->uncore, WM2_LP_ILK) & ~WM_LP_ENABLE);
-       intel_uncore_write(&dev_priv->uncore, WM1_LP_ILK, intel_uncore_read(&dev_priv->uncore, WM1_LP_ILK) & ~WM_LP_ENABLE);
+       intel_uncore_rmw(&dev_priv->uncore, WM3_LP_ILK, WM_LP_ENABLE, 0);
+       intel_uncore_rmw(&dev_priv->uncore, WM2_LP_ILK, WM_LP_ENABLE, 0);
+       intel_uncore_rmw(&dev_priv->uncore, WM1_LP_ILK, WM_LP_ENABLE, 0);
  
        /*
         * Don't touch WM_LP_SPRITE_ENABLE here.
@@@ -4109,11 -4105,9 +4101,9 @@@ static void g4x_disable_trickle_feed(st
        enum pipe pipe;
  
        for_each_pipe(dev_priv, pipe) {
-               intel_uncore_write(&dev_priv->uncore, DSPCNTR(pipe),
-                          intel_uncore_read(&dev_priv->uncore, DSPCNTR(pipe)) |
-                          DISP_TRICKLE_FEED_DISABLE);
+               intel_uncore_rmw(&dev_priv->uncore, DSPCNTR(pipe), 0, DISP_TRICKLE_FEED_DISABLE);
  
 -              intel_uncore_write(&dev_priv->uncore, DSPSURF(pipe), intel_uncore_read(&dev_priv->uncore, DSPSURF(pipe)));
 +              intel_uncore_rmw(&dev_priv->uncore, DSPSURF(pipe), 0, 0);
                intel_uncore_posting_read(&dev_priv->uncore, DSPSURF(pipe));
        }
  }
@@@ -4160,19 -4154,13 +4150,13 @@@ static void ilk_init_clock_gating(struc
         */
        if (IS_IRONLAKE_M(dev_priv)) {
                /* WaFbcAsynchFlipDisableFbcQueue:ilk */
-               intel_uncore_write(&dev_priv->uncore, ILK_DISPLAY_CHICKEN1,
-                          intel_uncore_read(&dev_priv->uncore, ILK_DISPLAY_CHICKEN1) |
-                          ILK_FBCQ_DIS);
-               intel_uncore_write(&dev_priv->uncore, ILK_DISPLAY_CHICKEN2,
-                          intel_uncore_read(&dev_priv->uncore, ILK_DISPLAY_CHICKEN2) |
-                          ILK_DPARB_GATE);
+               intel_uncore_rmw(&dev_priv->uncore, ILK_DISPLAY_CHICKEN1, 0, ILK_FBCQ_DIS);
+               intel_uncore_rmw(&dev_priv->uncore, ILK_DISPLAY_CHICKEN2, 0, ILK_DPARB_GATE);
        }
  
        intel_uncore_write(&dev_priv->uncore, ILK_DSPCLK_GATE_D, dspclk_gate);
  
-       intel_uncore_write(&dev_priv->uncore, ILK_DISPLAY_CHICKEN2,
-                  intel_uncore_read(&dev_priv->uncore, ILK_DISPLAY_CHICKEN2) |
-                  ILK_ELPIN_409_SELECT);
+       intel_uncore_rmw(&dev_priv->uncore, ILK_DISPLAY_CHICKEN2, 0, ILK_ELPIN_409_SELECT);
  
        g4x_disable_trickle_feed(dev_priv);
  
@@@ -4192,8 -4180,7 +4176,7 @@@ static void cpt_init_clock_gating(struc
        intel_uncore_write(&dev_priv->uncore, SOUTH_DSPCLK_GATE_D, PCH_DPLSUNIT_CLOCK_GATE_DISABLE |
                   PCH_DPLUNIT_CLOCK_GATE_DISABLE |
                   PCH_CPUNIT_CLOCK_GATE_DISABLE);
-       intel_uncore_write(&dev_priv->uncore, SOUTH_CHICKEN2, intel_uncore_read(&dev_priv->uncore, SOUTH_CHICKEN2) |
-                  DPLS_EDP_PPS_FIX_DIS);
+       intel_uncore_rmw(&dev_priv->uncore, SOUTH_CHICKEN2, 0, DPLS_EDP_PPS_FIX_DIS);
        /* The below fixes the weird display corruption, a few pixels shifted
         * downward, on (only) LVDS of some HP laptops with IVY.
         */
@@@ -4231,9 -4218,7 +4214,7 @@@ static void gen6_init_clock_gating(stru
  
        intel_uncore_write(&dev_priv->uncore, ILK_DSPCLK_GATE_D, dspclk_gate);
  
-       intel_uncore_write(&dev_priv->uncore, ILK_DISPLAY_CHICKEN2,
-                  intel_uncore_read(&dev_priv->uncore, ILK_DISPLAY_CHICKEN2) |
-                  ILK_ELPIN_409_SELECT);
+       intel_uncore_rmw(&dev_priv->uncore, ILK_DISPLAY_CHICKEN2, 0, ILK_ELPIN_409_SELECT);
  
        intel_uncore_write(&dev_priv->uncore, GEN6_UCGCTL1,
                   intel_uncore_read(&dev_priv->uncore, GEN6_UCGCTL1) |
@@@ -4293,14 -4278,12 +4274,12 @@@ static void lpt_init_clock_gating(struc
         * disabled when not needed anymore in order to save power.
         */
        if (HAS_PCH_LPT_LP(dev_priv))
-               intel_uncore_write(&dev_priv->uncore, SOUTH_DSPCLK_GATE_D,
-                          intel_uncore_read(&dev_priv->uncore, SOUTH_DSPCLK_GATE_D) |
-                          PCH_LP_PARTITION_LEVEL_DISABLE);
+               intel_uncore_rmw(&dev_priv->uncore, SOUTH_DSPCLK_GATE_D,
+                                0, PCH_LP_PARTITION_LEVEL_DISABLE);
  
        /* WADPOClockGatingDisable:hsw */
-       intel_uncore_write(&dev_priv->uncore, TRANS_CHICKEN1(PIPE_A),
-                  intel_uncore_read(&dev_priv->uncore, TRANS_CHICKEN1(PIPE_A)) |
-                  TRANS_CHICKEN1_DP0UNIT_GC_DISABLE);
+       intel_uncore_rmw(&dev_priv->uncore, TRANS_CHICKEN1(PIPE_A),
+                        0, TRANS_CHICKEN1_DP0UNIT_GC_DISABLE);
  }
  
  static void lpt_suspend_hw(struct drm_i915_private *dev_priv)
@@@ -4321,22 -4304,22 +4300,22 @@@ static void gen8_set_l3sqc_credits(stru
        u32 val;
  
        /* WaTempDisableDOPClkGating:bdw */
-       misccpctl = intel_uncore_rmw(&dev_priv->uncore, GEN7_MISCCPCTL,
-                                    GEN7_DOP_CLOCK_GATE_ENABLE, 0);
+       misccpctl = intel_gt_mcr_multicast_rmw(to_gt(dev_priv), GEN8_MISCCPCTL,
+                                              GEN8_DOP_CLOCK_GATE_ENABLE, 0);
  
-       val = intel_uncore_read(&dev_priv->uncore, GEN8_L3SQCREG1);
+       val = intel_gt_mcr_read_any(to_gt(dev_priv), GEN8_L3SQCREG1);
        val &= ~L3_PRIO_CREDITS_MASK;
        val |= L3_GENERAL_PRIO_CREDITS(general_prio_credits);
        val |= L3_HIGH_PRIO_CREDITS(high_prio_credits);
-       intel_uncore_write(&dev_priv->uncore, GEN8_L3SQCREG1, val);
+       intel_gt_mcr_multicast_write(to_gt(dev_priv), GEN8_L3SQCREG1, val);
  
        /*
         * Wait at least 100 clocks before re-enabling clock gating.
         * See the definition of L3SQCREG1 in BSpec.
         */
-       intel_uncore_posting_read(&dev_priv->uncore, GEN8_L3SQCREG1);
+       intel_gt_mcr_read_any(to_gt(dev_priv), GEN8_L3SQCREG1);
        udelay(1);
-       intel_uncore_write(&dev_priv->uncore, GEN7_MISCCPCTL, misccpctl);
+       intel_gt_mcr_multicast_write(to_gt(dev_priv), GEN8_MISCCPCTL, misccpctl);
  }
  
  static void icl_init_clock_gating(struct drm_i915_private *dev_priv)
@@@ -4359,8 -4342,7 +4338,7 @@@ static void gen12lp_init_clock_gating(s
  
        /* Wa_1409825376:tgl (pre-prod)*/
        if (IS_TGL_DISPLAY_STEP(dev_priv, STEP_A0, STEP_C0))
-               intel_uncore_write(&dev_priv->uncore, GEN9_CLKGATE_DIS_3, intel_uncore_read(&dev_priv->uncore, GEN9_CLKGATE_DIS_3) |
-                          TGL_VRH_GATING_DIS);
+               intel_uncore_rmw(&dev_priv->uncore, GEN9_CLKGATE_DIS_3, 0, TGL_VRH_GATING_DIS);
  
        /* Wa_14013723622:tgl,rkl,dg1,adl-s */
        if (DISPLAY_VER(dev_priv) == 12)
@@@ -4385,8 -4367,7 +4363,7 @@@ static void dg1_init_clock_gating(struc
  
        /* Wa_1409836686:dg1[a0] */
        if (IS_DG1_GRAPHICS_STEP(dev_priv, STEP_A0, STEP_B0))
-               intel_uncore_write(&dev_priv->uncore, GEN9_CLKGATE_DIS_3, intel_uncore_read(&dev_priv->uncore, GEN9_CLKGATE_DIS_3) |
-                          DPT_GATING_DIS);
+               intel_uncore_rmw(&dev_priv->uncore, GEN9_CLKGATE_DIS_3, 0, DPT_GATING_DIS);
  }
  
  static void xehpsdv_init_clock_gating(struct drm_i915_private *dev_priv)
@@@ -4428,8 -4409,7 +4405,7 @@@ static void cnp_init_clock_gating(struc
                return;
  
        /* Display WA #1181 WaSouthDisplayDisablePWMCGEGating: cnp */
-       intel_uncore_write(&dev_priv->uncore, SOUTH_DSPCLK_GATE_D, intel_uncore_read(&dev_priv->uncore, SOUTH_DSPCLK_GATE_D) |
-                  CNP_PWM_CGE_GATING_DISABLE);
+       intel_uncore_rmw(&dev_priv->uncore, SOUTH_DSPCLK_GATE_D, 0, CNP_PWM_CGE_GATING_DISABLE);
  }
  
  static void cfl_init_clock_gating(struct drm_i915_private *dev_priv)
        gen9_init_clock_gating(dev_priv);
  
        /* WAC6entrylatency:cfl */
-       intel_uncore_write(&dev_priv->uncore, FBC_LLC_READ_CTRL, intel_uncore_read(&dev_priv->uncore, FBC_LLC_READ_CTRL) |
-                  FBC_LLC_FULLY_OPEN);
+       intel_uncore_rmw(&dev_priv->uncore, FBC_LLC_READ_CTRL, 0, FBC_LLC_FULLY_OPEN);
  
        /*
         * WaFbcTurnOffFbcWatermark:cfl
         * Display WA #0562: cfl
         */
-       intel_uncore_write(&dev_priv->uncore, DISP_ARB_CTL, intel_uncore_read(&dev_priv->uncore, DISP_ARB_CTL) |
-                  DISP_FBC_WM_DIS);
+       intel_uncore_rmw(&dev_priv->uncore, DISP_ARB_CTL, 0, DISP_FBC_WM_DIS);
  
        /*
         * WaFbcNukeOnHostModify:cfl
         * Display WA #0873: cfl
         */
-       intel_uncore_write(&dev_priv->uncore, ILK_DPFC_CHICKEN(INTEL_FBC_A),
-                          intel_uncore_read(&dev_priv->uncore, ILK_DPFC_CHICKEN(INTEL_FBC_A)) |
-                          DPFC_NUKE_ON_ANY_MODIFICATION);
+       intel_uncore_rmw(&dev_priv->uncore, ILK_DPFC_CHICKEN(INTEL_FBC_A),
+                        0, DPFC_NUKE_ON_ANY_MODIFICATION);
  }
  
  static void kbl_init_clock_gating(struct drm_i915_private *dev_priv)
        gen9_init_clock_gating(dev_priv);
  
        /* WAC6entrylatency:kbl */
-       intel_uncore_write(&dev_priv->uncore, FBC_LLC_READ_CTRL, intel_uncore_read(&dev_priv->uncore, FBC_LLC_READ_CTRL) |
-                  FBC_LLC_FULLY_OPEN);
+       intel_uncore_rmw(&dev_priv->uncore, FBC_LLC_READ_CTRL, 0, FBC_LLC_FULLY_OPEN);
  
        /* WaDisableSDEUnitClockGating:kbl */
        if (IS_KBL_GRAPHICS_STEP(dev_priv, 0, STEP_C0))
-               intel_uncore_write(&dev_priv->uncore, GEN8_UCGCTL6, intel_uncore_read(&dev_priv->uncore, GEN8_UCGCTL6) |
-                          GEN8_SDEUNIT_CLOCK_GATE_DISABLE);
+               intel_uncore_rmw(&dev_priv->uncore, GEN8_UCGCTL6,
+                                0, GEN8_SDEUNIT_CLOCK_GATE_DISABLE);
  
        /* WaDisableGamClockGating:kbl */
        if (IS_KBL_GRAPHICS_STEP(dev_priv, 0, STEP_C0))
-               intel_uncore_write(&dev_priv->uncore, GEN6_UCGCTL1, intel_uncore_read(&dev_priv->uncore, GEN6_UCGCTL1) |
-                          GEN6_GAMUNIT_CLOCK_GATE_DISABLE);
+               intel_uncore_rmw(&dev_priv->uncore, GEN6_UCGCTL1,
+                                0, GEN6_GAMUNIT_CLOCK_GATE_DISABLE);
  
        /*
         * WaFbcTurnOffFbcWatermark:kbl
         * Display WA #0562: kbl
         */
-       intel_uncore_write(&dev_priv->uncore, DISP_ARB_CTL, intel_uncore_read(&dev_priv->uncore, DISP_ARB_CTL) |
-                  DISP_FBC_WM_DIS);
+       intel_uncore_rmw(&dev_priv->uncore, DISP_ARB_CTL, 0, DISP_FBC_WM_DIS);
  
        /*
         * WaFbcNukeOnHostModify:kbl
         * Display WA #0873: kbl
         */
-       intel_uncore_write(&dev_priv->uncore, ILK_DPFC_CHICKEN(INTEL_FBC_A),
-                          intel_uncore_read(&dev_priv->uncore, ILK_DPFC_CHICKEN(INTEL_FBC_A)) |
-                          DPFC_NUKE_ON_ANY_MODIFICATION);
+       intel_uncore_rmw(&dev_priv->uncore, ILK_DPFC_CHICKEN(INTEL_FBC_A),
+                        0, DPFC_NUKE_ON_ANY_MODIFICATION);
  }
  
  static void skl_init_clock_gating(struct drm_i915_private *dev_priv)
        gen9_init_clock_gating(dev_priv);
  
        /* WaDisableDopClockGating:skl */
-       intel_uncore_write(&dev_priv->uncore, GEN7_MISCCPCTL, intel_uncore_read(&dev_priv->uncore, GEN7_MISCCPCTL) &
-                  ~GEN7_DOP_CLOCK_GATE_ENABLE);
+       intel_gt_mcr_multicast_rmw(to_gt(dev_priv), GEN8_MISCCPCTL,
+                                  GEN8_DOP_CLOCK_GATE_ENABLE, 0);
  
        /* WAC6entrylatency:skl */
-       intel_uncore_write(&dev_priv->uncore, FBC_LLC_READ_CTRL, intel_uncore_read(&dev_priv->uncore, FBC_LLC_READ_CTRL) |
-                  FBC_LLC_FULLY_OPEN);
+       intel_uncore_rmw(&dev_priv->uncore, FBC_LLC_READ_CTRL, 0, FBC_LLC_FULLY_OPEN);
  
        /*
         * WaFbcTurnOffFbcWatermark:skl
         * Display WA #0562: skl
         */
-       intel_uncore_write(&dev_priv->uncore, DISP_ARB_CTL, intel_uncore_read(&dev_priv->uncore, DISP_ARB_CTL) |
-                  DISP_FBC_WM_DIS);
+       intel_uncore_rmw(&dev_priv->uncore, DISP_ARB_CTL, 0, DISP_FBC_WM_DIS);
  
        /*
         * WaFbcNukeOnHostModify:skl
         * Display WA #0873: skl
         */
-       intel_uncore_write(&dev_priv->uncore, ILK_DPFC_CHICKEN(INTEL_FBC_A),
-                          intel_uncore_read(&dev_priv->uncore, ILK_DPFC_CHICKEN(INTEL_FBC_A)) |
-                          DPFC_NUKE_ON_ANY_MODIFICATION);
+       intel_uncore_rmw(&dev_priv->uncore, ILK_DPFC_CHICKEN(INTEL_FBC_A),
+                        0, DPFC_NUKE_ON_ANY_MODIFICATION);
  
        /*
         * WaFbcHighMemBwCorruptionAvoidance:skl
         * Display WA #0883: skl
         */
-       intel_uncore_write(&dev_priv->uncore, ILK_DPFC_CHICKEN(INTEL_FBC_A),
-                          intel_uncore_read(&dev_priv->uncore, ILK_DPFC_CHICKEN(INTEL_FBC_A)) |
-                          DPFC_DISABLE_DUMMY0);
+       intel_uncore_rmw(&dev_priv->uncore, ILK_DPFC_CHICKEN(INTEL_FBC_A), 0, DPFC_DISABLE_DUMMY0);
  }
  
  static void bdw_init_clock_gating(struct drm_i915_private *dev_priv)
        enum pipe pipe;
  
        /* WaFbcAsynchFlipDisableFbcQueue:hsw,bdw */
-       intel_uncore_write(&dev_priv->uncore, CHICKEN_PIPESL_1(PIPE_A),
-                  intel_uncore_read(&dev_priv->uncore, CHICKEN_PIPESL_1(PIPE_A)) |
-                  HSW_FBCQ_DIS);
+       intel_uncore_rmw(&dev_priv->uncore, CHICKEN_PIPESL_1(PIPE_A), 0, HSW_FBCQ_DIS);
  
        /* WaSwitchSolVfFArbitrationPriority:bdw */
-       intel_uncore_write(&dev_priv->uncore, GAM_ECOCHK, intel_uncore_read(&dev_priv->uncore, GAM_ECOCHK) | HSW_ECOCHK_ARB_PRIO_SOL);
+       intel_uncore_rmw(&dev_priv->uncore, GAM_ECOCHK, 0, HSW_ECOCHK_ARB_PRIO_SOL);
  
        /* WaPsrDPAMaskVBlankInSRD:bdw */
-       intel_uncore_write(&dev_priv->uncore, CHICKEN_PAR1_1,
-                  intel_uncore_read(&dev_priv->uncore, CHICKEN_PAR1_1) | DPA_MASK_VBLANK_SRD);
+       intel_uncore_rmw(&dev_priv->uncore, CHICKEN_PAR1_1, 0, DPA_MASK_VBLANK_SRD);
  
        for_each_pipe(dev_priv, pipe) {
                /* WaPsrDPRSUnmaskVBlankInSRD:bdw */
-               intel_uncore_write(&dev_priv->uncore, CHICKEN_PIPESL_1(pipe),
-                          intel_uncore_read(&dev_priv->uncore, CHICKEN_PIPESL_1(pipe)) |
-                          BDW_DPRS_MASK_VBLANK_SRD);
+               intel_uncore_rmw(&dev_priv->uncore, CHICKEN_PIPESL_1(pipe),
+                                0, BDW_DPRS_MASK_VBLANK_SRD);
        }
  
        /* WaVSRefCountFullforceMissDisable:bdw */
        /* WaDSRefCountFullforceMissDisable:bdw */
-       intel_uncore_write(&dev_priv->uncore, GEN7_FF_THREAD_MODE,
-                  intel_uncore_read(&dev_priv->uncore, GEN7_FF_THREAD_MODE) &
-                  ~(GEN8_FF_DS_REF_CNT_FFME | GEN7_FF_VS_REF_CNT_FFME));
+       intel_uncore_rmw(&dev_priv->uncore, GEN7_FF_THREAD_MODE,
+                        GEN8_FF_DS_REF_CNT_FFME | GEN7_FF_VS_REF_CNT_FFME, 0);
  
        intel_uncore_write(&dev_priv->uncore, RING_PSMI_CTL(RENDER_RING_BASE),
                   _MASKED_BIT_ENABLE(GEN8_RC_SEMA_IDLE_MSG_DISABLE));
  
        /* WaDisableSDEUnitClockGating:bdw */
-       intel_uncore_write(&dev_priv->uncore, GEN8_UCGCTL6, intel_uncore_read(&dev_priv->uncore, GEN8_UCGCTL6) |
-                  GEN8_SDEUNIT_CLOCK_GATE_DISABLE);
+       intel_uncore_rmw(&dev_priv->uncore, GEN8_UCGCTL6, 0, GEN8_SDEUNIT_CLOCK_GATE_DISABLE);
  
        /* WaProgramL3SqcReg1Default:bdw */
        gen8_set_l3sqc_credits(dev_priv, 30, 2);
  
        /* WaKVMNotificationOnConfigChange:bdw */
-       intel_uncore_write(&dev_priv->uncore, CHICKEN_PAR2_1, intel_uncore_read(&dev_priv->uncore, CHICKEN_PAR2_1)
-                  | KVM_CONFIG_CHANGE_NOTIFICATION_SELECT);
+       intel_uncore_rmw(&dev_priv->uncore, CHICKEN_PAR2_1,
+                        0, KVM_CONFIG_CHANGE_NOTIFICATION_SELECT);
  
        lpt_init_clock_gating(dev_priv);
  
         * Also see the CHICKEN2 write in bdw_init_workarounds() to disable DOP
         * clock gating.
         */
-       intel_uncore_write(&dev_priv->uncore, GEN6_UCGCTL1,
-                  intel_uncore_read(&dev_priv->uncore, GEN6_UCGCTL1) | GEN6_EU_TCUNIT_CLOCK_GATE_DISABLE);
+       intel_uncore_rmw(&dev_priv->uncore, GEN6_UCGCTL1, 0, GEN6_EU_TCUNIT_CLOCK_GATE_DISABLE);
  }
  
  static void hsw_init_clock_gating(struct drm_i915_private *dev_priv)
  {
        /* WaFbcAsynchFlipDisableFbcQueue:hsw,bdw */
-       intel_uncore_write(&dev_priv->uncore, CHICKEN_PIPESL_1(PIPE_A),
-                  intel_uncore_read(&dev_priv->uncore, CHICKEN_PIPESL_1(PIPE_A)) |
-                  HSW_FBCQ_DIS);
+       intel_uncore_rmw(&dev_priv->uncore, CHICKEN_PIPESL_1(PIPE_A), 0, HSW_FBCQ_DIS);
  
        /* This is required by WaCatErrorRejectionIssue:hsw */
-       intel_uncore_write(&dev_priv->uncore, GEN7_SQ_CHICKEN_MBCUNIT_CONFIG,
-                  intel_uncore_read(&dev_priv->uncore, GEN7_SQ_CHICKEN_MBCUNIT_CONFIG) |
-                  GEN7_SQ_CHICKEN_MBCUNIT_SQINTMOB);
+       intel_uncore_rmw(&dev_priv->uncore, GEN7_SQ_CHICKEN_MBCUNIT_CONFIG,
+                        0, GEN7_SQ_CHICKEN_MBCUNIT_SQINTMOB);
  
        /* WaSwitchSolVfFArbitrationPriority:hsw */
-       intel_uncore_write(&dev_priv->uncore, GAM_ECOCHK, intel_uncore_read(&dev_priv->uncore, GAM_ECOCHK) | HSW_ECOCHK_ARB_PRIO_SOL);
+       intel_uncore_rmw(&dev_priv->uncore, GAM_ECOCHK, 0, HSW_ECOCHK_ARB_PRIO_SOL);
  
        lpt_init_clock_gating(dev_priv);
  }
  
  static void ivb_init_clock_gating(struct drm_i915_private *dev_priv)
  {
 -      u32 snpcr;
 -
        intel_uncore_write(&dev_priv->uncore, ILK_DSPCLK_GATE_D, ILK_VRHUNIT_CLOCK_GATE_DISABLE);
  
        /* WaFbcAsynchFlipDisableFbcQueue:ivb */
-       intel_uncore_write(&dev_priv->uncore, ILK_DISPLAY_CHICKEN1,
-                  intel_uncore_read(&dev_priv->uncore, ILK_DISPLAY_CHICKEN1) |
-                  ILK_FBCQ_DIS);
+       intel_uncore_rmw(&dev_priv->uncore, ILK_DISPLAY_CHICKEN1, 0, ILK_FBCQ_DIS);
  
        /* WaDisableBackToBackFlipFix:ivb */
        intel_uncore_write(&dev_priv->uncore, IVB_CHICKEN3,
                   GEN6_RCZUNIT_CLOCK_GATE_DISABLE);
  
        /* This is required by WaCatErrorRejectionIssue:ivb */
-       intel_uncore_write(&dev_priv->uncore, GEN7_SQ_CHICKEN_MBCUNIT_CONFIG,
-                       intel_uncore_read(&dev_priv->uncore, GEN7_SQ_CHICKEN_MBCUNIT_CONFIG) |
-                       GEN7_SQ_CHICKEN_MBCUNIT_SQINTMOB);
+       intel_uncore_rmw(&dev_priv->uncore, GEN7_SQ_CHICKEN_MBCUNIT_CONFIG,
+                        0, GEN7_SQ_CHICKEN_MBCUNIT_SQINTMOB);
  
        g4x_disable_trickle_feed(dev_priv);
  
 -      snpcr = intel_uncore_read(&dev_priv->uncore, GEN6_MBCUNIT_SNPCR);
 -      snpcr &= ~GEN6_MBC_SNPCR_MASK;
 -      snpcr |= GEN6_MBC_SNPCR_MED;
 -      intel_uncore_write(&dev_priv->uncore, GEN6_MBCUNIT_SNPCR, snpcr);
 +      intel_uncore_rmw(&dev_priv->uncore, GEN6_MBCUNIT_SNPCR, GEN6_MBC_SNPCR_MASK,
 +                       GEN6_MBC_SNPCR_MED);
  
        if (!HAS_PCH_NOP(dev_priv))
                cpt_init_clock_gating(dev_priv);
@@@ -4659,9 -4619,8 +4611,8 @@@ static void vlv_init_clock_gating(struc
                   _MASKED_BIT_ENABLE(DOP_CLOCK_GATING_DISABLE));
  
        /* This is required by WaCatErrorRejectionIssue:vlv */
-       intel_uncore_write(&dev_priv->uncore, GEN7_SQ_CHICKEN_MBCUNIT_CONFIG,
-                  intel_uncore_read(&dev_priv->uncore, GEN7_SQ_CHICKEN_MBCUNIT_CONFIG) |
-                  GEN7_SQ_CHICKEN_MBCUNIT_SQINTMOB);
+       intel_uncore_rmw(&dev_priv->uncore, GEN7_SQ_CHICKEN_MBCUNIT_CONFIG,
+                        0, GEN7_SQ_CHICKEN_MBCUNIT_SQINTMOB);
  
        /*
         * According to the spec, bit 13 (RCZUNIT) must be set on IVB.
        /* WaDisableL3Bank2xClockGate:vlv
         * Disabling L3 clock gating- MMIO 940c[25] = 1
         * Set bit 25, to disable L3_BANK_2x_CLK_GATING */
-       intel_uncore_write(&dev_priv->uncore, GEN7_UCGCTL4,
-                  intel_uncore_read(&dev_priv->uncore, GEN7_UCGCTL4) | GEN7_L3BANK2X_CLOCK_GATE_DISABLE);
+       intel_uncore_rmw(&dev_priv->uncore, GEN7_UCGCTL4, 0, GEN7_L3BANK2X_CLOCK_GATE_DISABLE);
  
        /*
         * WaDisableVLVClockGating_VBIIssue:vlv
@@@ -4688,21 -4646,18 +4638,18 @@@ static void chv_init_clock_gating(struc
  {
        /* WaVSRefCountFullforceMissDisable:chv */
        /* WaDSRefCountFullforceMissDisable:chv */
-       intel_uncore_write(&dev_priv->uncore, GEN7_FF_THREAD_MODE,
-                  intel_uncore_read(&dev_priv->uncore, GEN7_FF_THREAD_MODE) &
-                  ~(GEN8_FF_DS_REF_CNT_FFME | GEN7_FF_VS_REF_CNT_FFME));
+       intel_uncore_rmw(&dev_priv->uncore, GEN7_FF_THREAD_MODE,
+                        GEN8_FF_DS_REF_CNT_FFME | GEN7_FF_VS_REF_CNT_FFME, 0);
  
        /* WaDisableSemaphoreAndSyncFlipWait:chv */
        intel_uncore_write(&dev_priv->uncore, RING_PSMI_CTL(RENDER_RING_BASE),
                   _MASKED_BIT_ENABLE(GEN8_RC_SEMA_IDLE_MSG_DISABLE));
  
        /* WaDisableCSUnitClockGating:chv */
-       intel_uncore_write(&dev_priv->uncore, GEN6_UCGCTL1, intel_uncore_read(&dev_priv->uncore, GEN6_UCGCTL1) |
-                  GEN6_CSUNIT_CLOCK_GATE_DISABLE);
+       intel_uncore_rmw(&dev_priv->uncore, GEN6_UCGCTL1, 0, GEN6_CSUNIT_CLOCK_GATE_DISABLE);
  
        /* WaDisableSDEUnitClockGating:chv */
-       intel_uncore_write(&dev_priv->uncore, GEN8_UCGCTL6, intel_uncore_read(&dev_priv->uncore, GEN8_UCGCTL6) |
-                  GEN8_SDEUNIT_CLOCK_GATE_DISABLE);
+       intel_uncore_rmw(&dev_priv->uncore, GEN8_UCGCTL6, 0, GEN8_SDEUNIT_CLOCK_GATE_DISABLE);
  
        /*
         * WaProgramL3SqcReg1Default:chv
@@@ -591,15 -591,8 +591,15 @@@ void intel_runtime_pm_enable(struct int
                pm_runtime_use_autosuspend(kdev);
        }
  
 -      /* Enable by default */
 -      pm_runtime_allow(kdev);
 +      /*
 +       *  FIXME: Temp hammer to keep autosupend disable on lmem supported platforms.
 +       *  As per PCIe specs 5.3.1.4.1, all iomem read write request over a PCIe
 +       *  function will be unsupported in case PCIe endpoint function is in D3.
 +       *  Let's keep i915 autosuspend control 'on' till we fix all known issue
 +       *  with lmem access in D3.
 +       */
 +      if (!IS_DGFX(i915))
 +              pm_runtime_allow(kdev);
  
        /*
         * The core calls the driver load handler with an RPM reference held.
@@@ -633,6 -626,8 +633,8 @@@ void intel_runtime_pm_driver_release(st
                                                     runtime_pm);
        int count = atomic_read(&rpm->wakeref_count);
  
+       intel_wakeref_auto_fini(&rpm->userfault_wakeref);
        drm_WARN(&i915->drm, count,
                 "i915 raw-wakerefs=%d wakelocks=%d on cleanup\n",
                 intel_rpm_raw_wakeref_count(count),
@@@ -652,4 -647,7 +654,7 @@@ void intel_runtime_pm_init_early(struc
        rpm->available = HAS_RUNTIME_PM(i915);
  
        init_intel_runtime_pm_wakeref(rpm);
+       INIT_LIST_HEAD(&rpm->lmem_userfault_list);
+       spin_lock_init(&rpm->lmem_userfault_lock);
+       intel_wakeref_auto_init(&rpm->userfault_wakeref, rpm);
  }
@@@ -62,6 -62,7 +62,7 @@@ enum forcewake_domain_id 
        FW_DOMAIN_ID_MEDIA_VEBOX1,
        FW_DOMAIN_ID_MEDIA_VEBOX2,
        FW_DOMAIN_ID_MEDIA_VEBOX3,
+       FW_DOMAIN_ID_GSC,
  
        FW_DOMAIN_ID_COUNT
  };
@@@ -82,6 -83,7 +83,7 @@@ enum forcewake_domains 
        FORCEWAKE_MEDIA_VEBOX1  = BIT(FW_DOMAIN_ID_MEDIA_VEBOX1),
        FORCEWAKE_MEDIA_VEBOX2  = BIT(FW_DOMAIN_ID_MEDIA_VEBOX2),
        FORCEWAKE_MEDIA_VEBOX3  = BIT(FW_DOMAIN_ID_MEDIA_VEBOX3),
+       FORCEWAKE_GSC           = BIT(FW_DOMAIN_ID_GSC),
  
        FORCEWAKE_ALL = BIT(FW_DOMAIN_ID_COUNT) - 1,
  };
@@@ -431,15 -433,15 +433,15 @@@ intel_uncore_read64_2x32(struct intel_u
  #define intel_uncore_write64_fw(...) __raw_uncore_write64(__VA_ARGS__)
  #define intel_uncore_posting_read_fw(...) ((void)intel_uncore_read_fw(__VA_ARGS__))
  
 -static inline void intel_uncore_rmw(struct intel_uncore *uncore,
 -                                  i915_reg_t reg, u32 clear, u32 set)
 +static inline u32 intel_uncore_rmw(struct intel_uncore *uncore,
 +                                 i915_reg_t reg, u32 clear, u32 set)
  {
        u32 old, val;
  
        old = intel_uncore_read(uncore, reg);
        val = (old & ~clear) | set;
 -      if (val != old)
 -              intel_uncore_write(uncore, reg, val);
 +      intel_uncore_write(uncore, reg, val);
 +      return old;
  }
  
  static inline void intel_uncore_rmw_fw(struct intel_uncore *uncore,
@@@ -77,7 -77,6 +77,7 @@@ static int pxp_create_arb_session(struc
                drm_err(&gt->i915->drm, "arb session failed to go in play\n");
                return ret;
        }
 +      drm_dbg(&gt->i915->drm, "PXP ARB session is alive\n");
  
        if (!++pxp->key_instance)
                ++pxp->key_instance;
@@@ -138,7 -137,7 +138,7 @@@ static void pxp_terminate_complete(stru
        complete_all(&pxp->termination);
  }
  
void intel_pxp_session_work(struct work_struct *work)
static void pxp_session_work(struct work_struct *work)
  {
        struct intel_pxp *pxp = container_of(work, typeof(*pxp), session_work);
        struct intel_gt *gt = pxp_to_gt(pxp);
  
        intel_runtime_pm_put(gt->uncore->rpm, wakeref);
  }
+ void intel_pxp_session_management_init(struct intel_pxp *pxp)
+ {
+       mutex_init(&pxp->arb_mutex);
+       INIT_WORK(&pxp->session_work, pxp_session_work);
+ }
@@@ -8,11 -8,14 +8,14 @@@
  #include <drm/i915_pxp_tee_interface.h>
  #include <drm/i915_component.h>
  
+ #include "gem/i915_gem_lmem.h"
  #include "i915_drv.h"
  #include "intel_pxp.h"
  #include "intel_pxp_session.h"
  #include "intel_pxp_tee.h"
  #include "intel_pxp_tee_interface.h"
+ #include "intel_pxp_huc.h"
  
  static inline struct intel_pxp *i915_dev_to_pxp(struct device *i915_kdev)
  {
@@@ -69,6 -72,47 +72,47 @@@ unlock
        return ret;
  }
  
+ int intel_pxp_tee_stream_message(struct intel_pxp *pxp,
+                                u8 client_id, u32 fence_id,
+                                void *msg_in, size_t msg_in_len,
+                                void *msg_out, size_t msg_out_len)
+ {
+       /* TODO: for bigger objects we need to use a sg of 4k pages */
+       const size_t max_msg_size = PAGE_SIZE;
+       struct drm_i915_private *i915 = pxp_to_gt(pxp)->i915;
+       struct i915_pxp_component *pxp_component = pxp->pxp_component;
+       unsigned int offset = 0;
+       struct scatterlist *sg;
+       int ret;
+       if (msg_in_len > max_msg_size || msg_out_len > max_msg_size)
+               return -ENOSPC;
+       mutex_lock(&pxp->tee_mutex);
+       if (unlikely(!pxp_component || !pxp_component->ops->gsc_command)) {
+               ret = -ENODEV;
+               goto unlock;
+       }
+       GEM_BUG_ON(!pxp->stream_cmd.obj);
+       sg = i915_gem_object_get_sg_dma(pxp->stream_cmd.obj, 0, &offset);
+       memcpy(pxp->stream_cmd.vaddr, msg_in, msg_in_len);
+       ret = pxp_component->ops->gsc_command(pxp_component->tee_dev, client_id,
+                                             fence_id, sg, msg_in_len, sg);
+       if (ret < 0)
+               drm_err(&i915->drm, "Failed to send PXP TEE gsc command\n");
+       else
+               memcpy(msg_out, pxp->stream_cmd.vaddr, msg_out_len);
+ unlock:
+       mutex_unlock(&pxp->tee_mutex);
+       return ret;
+ }
  /**
   * i915_pxp_tee_component_bind - bind function to pass the function pointers to pxp_tee
   * @i915_kdev: pointer to i915 kernel device
@@@ -84,24 -128,36 +128,36 @@@ static int i915_pxp_tee_component_bind(
  {
        struct drm_i915_private *i915 = kdev_to_i915(i915_kdev);
        struct intel_pxp *pxp = i915_dev_to_pxp(i915_kdev);
+       struct intel_uc *uc = &pxp_to_gt(pxp)->uc;
        intel_wakeref_t wakeref;
+       int ret = 0;
  
        mutex_lock(&pxp->tee_mutex);
        pxp->pxp_component = data;
        pxp->pxp_component->tee_dev = tee_kdev;
        mutex_unlock(&pxp->tee_mutex);
  
+       if (intel_uc_uses_huc(uc) && intel_huc_is_loaded_by_gsc(&uc->huc)) {
+               with_intel_runtime_pm(&i915->runtime_pm, wakeref) {
+                       /* load huc via pxp */
+                       ret = intel_huc_fw_load_and_auth_via_gsc(&uc->huc);
+                       if (ret < 0)
+                               drm_err(&i915->drm, "failed to load huc via gsc %d\n", ret);
+               }
+       }
        /* if we are suspended, the HW will be re-initialized on resume */
        wakeref = intel_runtime_pm_get_if_in_use(&i915->runtime_pm);
        if (!wakeref)
                return 0;
  
        /* the component is required to fully start the PXP HW */
-       intel_pxp_init_hw(pxp);
+       if (intel_pxp_is_enabled(pxp))
+               intel_pxp_init_hw(pxp);
  
        intel_runtime_pm_put(&i915->runtime_pm, wakeref);
  
-       return 0;
+       return ret;
  }
  
  static void i915_pxp_tee_component_unbind(struct device *i915_kdev,
        struct intel_pxp *pxp = i915_dev_to_pxp(i915_kdev);
        intel_wakeref_t wakeref;
  
-       with_intel_runtime_pm_if_in_use(&i915->runtime_pm, wakeref)
-               intel_pxp_fini_hw(pxp);
+       if (intel_pxp_is_enabled(pxp))
+               with_intel_runtime_pm_if_in_use(&i915->runtime_pm, wakeref)
+                       intel_pxp_fini_hw(pxp);
  
        mutex_lock(&pxp->tee_mutex);
        pxp->pxp_component = NULL;
@@@ -124,22 -181,92 +181,92 @@@ static const struct component_ops i915_
        .unbind = i915_pxp_tee_component_unbind,
  };
  
+ static int alloc_streaming_command(struct intel_pxp *pxp)
+ {
+       struct drm_i915_private *i915 = pxp_to_gt(pxp)->i915;
+       struct drm_i915_gem_object *obj = NULL;
+       void *cmd;
+       int err;
+       pxp->stream_cmd.obj = NULL;
+       pxp->stream_cmd.vaddr = NULL;
+       if (!IS_DGFX(i915))
+               return 0;
+       /* allocate lmem object of one page for PXP command memory and store it */
+       obj = i915_gem_object_create_lmem(i915, PAGE_SIZE, I915_BO_ALLOC_CONTIGUOUS);
+       if (IS_ERR(obj)) {
+               drm_err(&i915->drm, "Failed to allocate pxp streaming command!\n");
+               return PTR_ERR(obj);
+       }
+       err = i915_gem_object_pin_pages_unlocked(obj);
+       if (err) {
+               drm_err(&i915->drm, "Failed to pin gsc message page!\n");
+               goto out_put;
+       }
+       /* map the lmem into the virtual memory pointer */
+       cmd = i915_gem_object_pin_map_unlocked(obj, i915_coherent_map_type(i915, obj, true));
+       if (IS_ERR(cmd)) {
+               drm_err(&i915->drm, "Failed to map gsc message page!\n");
+               err = PTR_ERR(cmd);
+               goto out_unpin;
+       }
+       memset(cmd, 0, obj->base.size);
+       pxp->stream_cmd.obj = obj;
+       pxp->stream_cmd.vaddr = cmd;
+       return 0;
+ out_unpin:
+       i915_gem_object_unpin_pages(obj);
+ out_put:
+       i915_gem_object_put(obj);
+       return err;
+ }
+ static void free_streaming_command(struct intel_pxp *pxp)
+ {
+       struct drm_i915_gem_object *obj = fetch_and_zero(&pxp->stream_cmd.obj);
+       if (!obj)
+               return;
+       i915_gem_object_unpin_map(obj);
+       i915_gem_object_unpin_pages(obj);
+       i915_gem_object_put(obj);
+ }
  int intel_pxp_tee_component_init(struct intel_pxp *pxp)
  {
        int ret;
        struct intel_gt *gt = pxp_to_gt(pxp);
        struct drm_i915_private *i915 = gt->i915;
  
+       mutex_init(&pxp->tee_mutex);
+       ret = alloc_streaming_command(pxp);
+       if (ret)
+               return ret;
        ret = component_add_typed(i915->drm.dev, &i915_pxp_tee_component_ops,
                                  I915_COMPONENT_PXP);
        if (ret < 0) {
                drm_err(&i915->drm, "Failed to add PXP component (%d)\n", ret);
-               return ret;
+               goto out_free;
        }
  
        pxp->pxp_component_added = true;
  
        return 0;
+ out_free:
+       free_streaming_command(pxp);
+       return ret;
  }
  
  void intel_pxp_tee_component_fini(struct intel_pxp *pxp)
  
        component_del(i915->drm.dev, &i915_pxp_tee_component_ops);
        pxp->pxp_component_added = false;
+       free_streaming_command(pxp);
  }
  
  int intel_pxp_tee_cmd_create_arb_session(struct intel_pxp *pxp,
  
        if (ret)
                drm_err(&i915->drm, "Failed to send tee msg ret=[%d]\n", ret);
 +      else if (msg_out.header.status != 0x0)
 +              drm_warn(&i915->drm, "PXP firmware failed arb session init request ret=[0x%08x]\n",
 +                       msg_out.header.status);
  
        return ret;
  }