summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorThorsten Leemhuis <fedora@leemhuis.info>2020-05-29 19:50:14 +0200
committerThorsten Leemhuis <fedora@leemhuis.info>2020-05-29 19:50:14 +0200
commit59adb3dc6384af48c3b97589c8d887c87689e0e4 (patch)
treec0fb7c5ecc5260b57173619973336989e0b8a256
parentd48a756e71e269ecef24682ba38b6b49ed2a6abe (diff)
parent42bbfcc428758569177d4e644fddfb5ed46c57a5 (diff)
downloadkernel-59adb3dc6384af48c3b97589c8d887c87689e0e4.tar.gz
kernel-59adb3dc6384af48c3b97589c8d887c87689e0e4.tar.xz
kernel-59adb3dc6384af48c3b97589c8d887c87689e0e4.zip
Merge remote-tracking branch 'origin/master' into rawhide-user-thl-vanilla-fedorakernel-5.7.0-0.rc7.20200529gitb0c3ba31be3e.1.vanilla.1.fc32
-rw-r--r--0001-acr-Use-kmemdup-instead-of-kmalloc-and-memcpy.patch55
-rw-r--r--0001-core-memory-remove-redundant-assignments-to-variable.patch32
-rw-r--r--0001-device-detect-if-changing-endianness-failed.patch62
-rw-r--r--0001-device-detect-vGPUs.patch59
-rw-r--r--0001-device-rework-mmio-mapping-code-to-get-rid-of-second.patch84
-rw-r--r--0001-device-use-regular-PRI-accessors-in-chipset-detectio.patch113
-rw-r--r--0001-disp-gv100-expose-capabilities-class.patch149
-rw-r--r--0001-disp-hda-gf119-add-HAL-for-programming-device-entry-.patch146
-rw-r--r--0001-disp-hda-gf119-select-HDA-device-entry-based-on-boun.patch49
-rw-r--r--0001-disp-hda-gt215-pass-head-to-nvkm_ior.hda.eld.patch83
-rw-r--r--0001-disp-hda-gv100-NV_PDISP_SF_AUDIO_CNTRL0-register-mov.patch105
-rw-r--r--0001-disp-nv50-increase-timeout-on-pio-channel-free-polli.patch26
-rw-r--r--0001-drm-Use-generic-helper-to-check-_PR3-presence.patch96
-rw-r--r--0001-kms-Fix-regression-by-audio-component-transition.patch82
-rw-r--r--0001-kms-gv100-Add-support-for-interlaced-modes.patch64
-rw-r--r--0001-kms-nv50-Initialize-core-channel-in-nouveau_display_.patch47
-rw-r--r--0001-kms-nv50-Move-8BPC-limit-for-MST-into-nv50_mstc_get_.patch65
-rw-r--r--0001-kms-nv50-Probe-SOR-and-PIOR-caps-for-DP-interlacing-.patch439
-rw-r--r--0001-kms-nv50-Share-DP-SST-mode_valid-handling-with-MST.patch209
-rw-r--r--0001-mmu-Remove-unneeded-semicolon.patch47
-rw-r--r--0001-platform-x86-sony-laptop-SNC-calls-should-handle-BUF.patch116
-rw-r--r--0001-virt-vbox-Add-a-few-new-vmmdev-request-types-to-the-.patch58
-rw-r--r--0001-virt-vbox-Add-support-for-the-new-VBG_IOCTL_ACQUIRE_.patch320
-rw-r--r--0001-virt-vbox-Add-vbg_set_host_capabilities-helper-funct.patch130
-rw-r--r--0001-virt-vbox-Fix-VBGL_IOCTL_VMMDEV_REQUEST_BIG-and-_LOG.patch123
-rw-r--r--0001-virt-vbox-Fix-guest-capabilities-mask-check.patch47
-rw-r--r--0001-virt-vbox-Log-unknown-ioctl-requests-as-error.patch30
-rw-r--r--0001-virt-vbox-Rename-guest_caps-struct-members-to-set_gu.patch103
-rw-r--r--Patchlist28
-rw-r--r--kernel-aarch64-debug-fedora.config3
-rw-r--r--kernel-aarch64-debug-rhel.config8
-rw-r--r--kernel-aarch64-fedora.config2
-rw-r--r--kernel-aarch64-rhel.config5
-rw-r--r--kernel-armv7hl-debug-fedora.config3
-rw-r--r--kernel-armv7hl-fedora.config2
-rw-r--r--kernel-armv7hl-lpae-debug-fedora.config3
-rw-r--r--kernel-armv7hl-lpae-fedora.config2
-rw-r--r--kernel-i686-debug-fedora.config1
-rw-r--r--kernel-ppc64le-debug-fedora.config3
-rw-r--r--kernel-ppc64le-debug-rhel.config8
-rw-r--r--kernel-ppc64le-fedora.config2
-rw-r--r--kernel-ppc64le-rhel.config5
-rw-r--r--kernel-s390x-debug-fedora.config3
-rw-r--r--kernel-s390x-debug-rhel.config8
-rw-r--r--kernel-s390x-fedora.config2
-rw-r--r--kernel-s390x-rhel.config5
-rw-r--r--kernel-s390x-zfcpdump-rhel.config5
-rw-r--r--kernel-x86_64-debug-fedora.config1
-rw-r--r--kernel-x86_64-debug-rhel.config9
-rw-r--r--kernel-x86_64-rhel.config6
-rw-r--r--kernel.spec109
-rw-r--r--sources6
52 files changed, 3124 insertions, 44 deletions
diff --git a/0001-acr-Use-kmemdup-instead-of-kmalloc-and-memcpy.patch b/0001-acr-Use-kmemdup-instead-of-kmalloc-and-memcpy.patch
new file mode 100644
index 000000000..9470c4608
--- /dev/null
+++ b/0001-acr-Use-kmemdup-instead-of-kmalloc-and-memcpy.patch
@@ -0,0 +1,55 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Zou Wei <zou_wei@huawei.com>
+Date: Tue, 21 Apr 2020 20:37:31 +0800
+Subject: [PATCH] acr: Use kmemdup instead of kmalloc and memcpy
+
+Fixes coccicheck warning:
+
+drivers/gpu/drivers/gpu/drm/nouveau/nvkm/subdev/acr/hsfw.c:103:23-30: WARNING opportunity for kmemdup
+drivers/gpu/drivers/gpu/drm/nouveau/nvkm/subdev/acr/hsfw.c:113:22-29: WARNING opportunity for kmemdup
+
+Fixes: 22dcda45a3d1 ("drivers/gpu/drm/nouveau/acr: implement new subdev to replace "secure boot"")
+Reported-by: Hulk Robot <hulkci@huawei.com>
+Signed-off-by: Zou Wei <zou_wei@huawei.com>
+Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
+---
+ drivers/gpu/drm/nouveau/nvkm/subdev/acr/hsfw.c | 12 ++++--------
+ 1 file changed, 4 insertions(+), 8 deletions(-)
+
+diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/acr/hsfw.c b/drivers/gpu/drm/nouveau/nvkm/subdev/acr/hsfw.c
+index aecce2dac558..667fa016496e 100644
+--- a/drivers/gpu/drm/nouveau/nvkm/subdev/acr/hsfw.c
++++ b/drivers/gpu/drm/nouveau/nvkm/subdev/acr/hsfw.c
+@@ -100,25 +100,21 @@ nvkm_acr_hsfw_load_image(struct nvkm_acr *acr, const char *name, int ver,
+ hsfw->data_size = lhdr->data_size;
+
+ hsfw->sig.prod.size = fwhdr->sig_prod_size;
+- hsfw->sig.prod.data = kmalloc(hsfw->sig.prod.size, GFP_KERNEL);
++ hsfw->sig.prod.data = kmemdup(fw->data + fwhdr->sig_prod_offset + sig,
++ hsfw->sig.prod.size, GFP_KERNEL);
+ if (!hsfw->sig.prod.data) {
+ ret = -ENOMEM;
+ goto done;
+ }
+
+- memcpy(hsfw->sig.prod.data, fw->data + fwhdr->sig_prod_offset + sig,
+- hsfw->sig.prod.size);
+-
+ hsfw->sig.dbg.size = fwhdr->sig_dbg_size;
+- hsfw->sig.dbg.data = kmalloc(hsfw->sig.dbg.size, GFP_KERNEL);
++ hsfw->sig.dbg.data = kmemdup(fw->data + fwhdr->sig_dbg_offset + sig,
++ hsfw->sig.dbg.size, GFP_KERNEL);
+ if (!hsfw->sig.dbg.data) {
+ ret = -ENOMEM;
+ goto done;
+ }
+
+- memcpy(hsfw->sig.dbg.data, fw->data + fwhdr->sig_dbg_offset + sig,
+- hsfw->sig.dbg.size);
+-
+ hsfw->sig.patch_loc = loc;
+ done:
+ nvkm_firmware_put(fw);
+--
+2.26.2
+
diff --git a/0001-core-memory-remove-redundant-assignments-to-variable.patch b/0001-core-memory-remove-redundant-assignments-to-variable.patch
new file mode 100644
index 000000000..d490d68d2
--- /dev/null
+++ b/0001-core-memory-remove-redundant-assignments-to-variable.patch
@@ -0,0 +1,32 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Colin Ian King <colin.king@canonical.com>
+Date: Sat, 29 Feb 2020 00:53:07 +0000
+Subject: [PATCH] core/memory: remove redundant assignments to variable ret
+
+The variable ret is being initialized with a value that is never
+read and it is being updated later with a new value. The initialization
+is redundant and can be removed.
+
+Addresses-Coverity: ("Unused value")
+Signed-off-by: Colin Ian King <colin.king@canonical.com>
+Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
+---
+ drivers/gpu/drm/nouveau/nvkm/core/memory.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/drivers/gpu/drm/nouveau/nvkm/core/memory.c b/drivers/gpu/drm/nouveau/nvkm/core/memory.c
+index 4cc186262d34..38130ef272d6 100644
+--- a/drivers/gpu/drm/nouveau/nvkm/core/memory.c
++++ b/drivers/gpu/drm/nouveau/nvkm/core/memory.c
+@@ -140,7 +140,7 @@ nvkm_memory_new(struct nvkm_device *device, enum nvkm_memory_target target,
+ {
+ struct nvkm_instmem *imem = device->imem;
+ struct nvkm_memory *memory;
+- int ret = -ENOSYS;
++ int ret;
+
+ if (unlikely(target != NVKM_MEM_TARGET_INST || !imem))
+ return -ENOSYS;
+--
+2.26.2
+
diff --git a/0001-device-detect-if-changing-endianness-failed.patch b/0001-device-detect-if-changing-endianness-failed.patch
new file mode 100644
index 000000000..1089b7e87
--- /dev/null
+++ b/0001-device-detect-if-changing-endianness-failed.patch
@@ -0,0 +1,62 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Karol Herbst <kherbst@redhat.com>
+Date: Tue, 28 Apr 2020 18:54:03 +0200
+Subject: [PATCH] device: detect if changing endianness failed
+
+v2: relax the checks a little
+
+Signed-off-by: Karol Herbst <kherbst@redhat.com>
+Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
+---
+ .../gpu/drm/nouveau/nvkm/engine/device/base.c | 26 +++++++++++++++----
+ 1 file changed, 21 insertions(+), 5 deletions(-)
+
+diff --git a/drivers/gpu/drm/nouveau/nvkm/engine/device/base.c b/drivers/gpu/drm/nouveau/nvkm/engine/device/base.c
+index 37589f36546d..c732074bf790 100644
+--- a/drivers/gpu/drm/nouveau/nvkm/engine/device/base.c
++++ b/drivers/gpu/drm/nouveau/nvkm/engine/device/base.c
+@@ -2924,6 +2924,20 @@ nvkm_device_del(struct nvkm_device **pdevice)
+ }
+ }
+
++static inline bool
++nvkm_device_endianness(void __iomem *pri)
++{
++ u32 boot1 = ioread32_native(pri + 0x000004) & 0x01000001;
++#ifdef __BIG_ENDIAN
++ if (!boot1)
++ return false;
++#else
++ if (boot1)
++ return false;
++#endif
++ return true;
++}
++
+ int
+ nvkm_device_ctor(const struct nvkm_device_func *func,
+ const struct nvkm_device_quirk *quirk,
+@@ -2973,13 +2987,15 @@ nvkm_device_ctor(const struct nvkm_device_func *func,
+ /* identify the chipset, and determine classes of subdev/engines */
+ if (detect) {
+ /* switch mmio to cpu's native endianness */
+-#ifndef __BIG_ENDIAN
+- if (ioread32_native(map + 0x000004) != 0x00000000) {
+-#else
+- if (ioread32_native(map + 0x000004) == 0x00000000) {
+-#endif
++ if (!nvkm_device_endianness(map)) {
+ iowrite32_native(0x01000001, map + 0x000004);
+ ioread32_native(map);
++ if (!nvkm_device_endianness(map)) {
++ nvdev_error(device,
++ "GPU not supported on big-endian\n");
++ ret = -ENOSYS;
++ goto done;
++ }
+ }
+
+ /* read boot0 and strapping information */
+--
+2.26.2
+
diff --git a/0001-device-detect-vGPUs.patch b/0001-device-detect-vGPUs.patch
new file mode 100644
index 000000000..08f591ff7
--- /dev/null
+++ b/0001-device-detect-vGPUs.patch
@@ -0,0 +1,59 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Karol Herbst <kherbst@redhat.com>
+Date: Tue, 28 Apr 2020 18:54:04 +0200
+Subject: [PATCH] device: detect vGPUs
+
+Using ENODEV as this prevents probe failed errors in dmesg.
+
+v2: move check further down
+
+Signed-off-by: Karol Herbst <kherbst@redhat.com>
+Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
+---
+ drivers/gpu/drm/nouveau/nvkm/engine/device/base.c | 15 ++++++++++++---
+ 1 file changed, 12 insertions(+), 3 deletions(-)
+
+diff --git a/drivers/gpu/drm/nouveau/nvkm/engine/device/base.c b/drivers/gpu/drm/nouveau/nvkm/engine/device/base.c
+index c732074bf790..f977dddcd809 100644
+--- a/drivers/gpu/drm/nouveau/nvkm/engine/device/base.c
++++ b/drivers/gpu/drm/nouveau/nvkm/engine/device/base.c
+@@ -2948,7 +2948,7 @@ nvkm_device_ctor(const struct nvkm_device_func *func,
+ {
+ struct nvkm_subdev *subdev;
+ u64 mmio_base, mmio_size;
+- u32 boot0, strap;
++ u32 boot0, boot1, strap;
+ void __iomem *map = NULL;
+ int ret = -EEXIST, i;
+ unsigned chipset;
+@@ -2998,9 +2998,7 @@ nvkm_device_ctor(const struct nvkm_device_func *func,
+ }
+ }
+
+- /* read boot0 and strapping information */
+ boot0 = ioread32_native(map + 0x000000);
+- strap = ioread32_native(map + 0x101000);
+
+ /* chipset can be overridden for devel/testing purposes */
+ chipset = nvkm_longopt(device->cfgopt, "NvChipset", 0);
+@@ -3158,6 +3156,17 @@ nvkm_device_ctor(const struct nvkm_device_func *func,
+ nvdev_info(device, "NVIDIA %s (%08x)\n",
+ device->chip->name, boot0);
+
++ /* vGPU detection */
++ boot1 = ioread32_native(map + 0x000004);
++ if (device->card_type >= TU100 && (boot1 & 0x00030000)) {
++ nvdev_info(device, "vGPUs are not supported\n");
++ ret = -ENODEV;
++ goto done;
++ }
++
++ /* read strapping information */
++ strap = ioread32_native(map + 0x101000);
++
+ /* determine frequency of timing crystal */
+ if ( device->card_type <= NV_10 || device->chipset < 0x17 ||
+ (device->chipset >= 0x20 && device->chipset < 0x25))
+--
+2.26.2
+
diff --git a/0001-device-rework-mmio-mapping-code-to-get-rid-of-second.patch b/0001-device-rework-mmio-mapping-code-to-get-rid-of-second.patch
new file mode 100644
index 000000000..bde820ba5
--- /dev/null
+++ b/0001-device-rework-mmio-mapping-code-to-get-rid-of-second.patch
@@ -0,0 +1,84 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Karol Herbst <kherbst@redhat.com>
+Date: Tue, 28 Apr 2020 18:54:02 +0200
+Subject: [PATCH] device: rework mmio mapping code to get rid of second map
+
+Fixes warnings on GPUs with smaller a smaller mmio region like vGPUs.
+
+Signed-off-by: Karol Herbst <kherbst@redhat.com>
+Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
+---
+ .../gpu/drm/nouveau/nvkm/engine/device/base.c | 27 ++++++++++---------
+ 1 file changed, 15 insertions(+), 12 deletions(-)
+
+diff --git a/drivers/gpu/drm/nouveau/nvkm/engine/device/base.c b/drivers/gpu/drm/nouveau/nvkm/engine/device/base.c
+index 8ebbe1656008..37589f36546d 100644
+--- a/drivers/gpu/drm/nouveau/nvkm/engine/device/base.c
++++ b/drivers/gpu/drm/nouveau/nvkm/engine/device/base.c
+@@ -2935,7 +2935,7 @@ nvkm_device_ctor(const struct nvkm_device_func *func,
+ struct nvkm_subdev *subdev;
+ u64 mmio_base, mmio_size;
+ u32 boot0, strap;
+- void __iomem *map;
++ void __iomem *map = NULL;
+ int ret = -EEXIST, i;
+ unsigned chipset;
+
+@@ -2961,12 +2961,17 @@ nvkm_device_ctor(const struct nvkm_device_func *func,
+ mmio_base = device->func->resource_addr(device, 0);
+ mmio_size = device->func->resource_size(device, 0);
+
+- /* identify the chipset, and determine classes of subdev/engines */
+- if (detect) {
+- map = ioremap(mmio_base, 0x102000);
+- if (ret = -ENOMEM, map == NULL)
++ if (detect || mmio) {
++ map = ioremap(mmio_base, mmio_size);
++ if (map == NULL) {
++ nvdev_error(device, "unable to map PRI\n");
++ ret = -ENOMEM;
+ goto done;
++ }
++ }
+
++ /* identify the chipset, and determine classes of subdev/engines */
++ if (detect) {
+ /* switch mmio to cpu's native endianness */
+ #ifndef __BIG_ENDIAN
+ if (ioread32_native(map + 0x000004) != 0x00000000) {
+@@ -2980,7 +2985,6 @@ nvkm_device_ctor(const struct nvkm_device_func *func,
+ /* read boot0 and strapping information */
+ boot0 = ioread32_native(map + 0x000000);
+ strap = ioread32_native(map + 0x101000);
+- iounmap(map);
+
+ /* chipset can be overridden for devel/testing purposes */
+ chipset = nvkm_longopt(device->cfgopt, "NvChipset", 0);
+@@ -3159,12 +3163,7 @@ nvkm_device_ctor(const struct nvkm_device_func *func,
+ device->name = device->chip->name;
+
+ if (mmio) {
+- device->pri = ioremap(mmio_base, mmio_size);
+- if (!device->pri) {
+- nvdev_error(device, "unable to map PRI\n");
+- ret = -ENOMEM;
+- goto done;
+- }
++ device->pri = map;
+ }
+
+ mutex_init(&device->mutex);
+@@ -3254,6 +3253,10 @@ nvkm_device_ctor(const struct nvkm_device_func *func,
+
+ ret = 0;
+ done:
++ if (map && (!mmio || ret)) {
++ device->pri = NULL;
++ iounmap(map);
++ }
+ mutex_unlock(&nv_devices_mutex);
+ return ret;
+ }
+--
+2.26.2
+
diff --git a/0001-device-use-regular-PRI-accessors-in-chipset-detectio.patch b/0001-device-use-regular-PRI-accessors-in-chipset-detectio.patch
new file mode 100644
index 000000000..ec4345169
--- /dev/null
+++ b/0001-device-use-regular-PRI-accessors-in-chipset-detectio.patch
@@ -0,0 +1,113 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Ben Skeggs <bskeggs@redhat.com>
+Date: Thu, 30 Apr 2020 14:08:53 +1000
+Subject: [PATCH] device: use regular PRI accessors in chipset detection
+
+Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
+---
+ .../gpu/drm/nouveau/nvkm/engine/device/base.c | 31 ++++++++-----------
+ 1 file changed, 13 insertions(+), 18 deletions(-)
+
+diff --git a/drivers/gpu/drm/nouveau/nvkm/engine/device/base.c b/drivers/gpu/drm/nouveau/nvkm/engine/device/base.c
+index f977dddcd809..5b90c2a1bf3d 100644
+--- a/drivers/gpu/drm/nouveau/nvkm/engine/device/base.c
++++ b/drivers/gpu/drm/nouveau/nvkm/engine/device/base.c
+@@ -2925,9 +2925,9 @@ nvkm_device_del(struct nvkm_device **pdevice)
+ }
+
+ static inline bool
+-nvkm_device_endianness(void __iomem *pri)
++nvkm_device_endianness(struct nvkm_device *device)
+ {
+- u32 boot1 = ioread32_native(pri + 0x000004) & 0x01000001;
++ u32 boot1 = nvkm_rd32(device, 0x000004) & 0x01000001;
+ #ifdef __BIG_ENDIAN
+ if (!boot1)
+ return false;
+@@ -2949,7 +2949,6 @@ nvkm_device_ctor(const struct nvkm_device_func *func,
+ struct nvkm_subdev *subdev;
+ u64 mmio_base, mmio_size;
+ u32 boot0, boot1, strap;
+- void __iomem *map = NULL;
+ int ret = -EEXIST, i;
+ unsigned chipset;
+
+@@ -2976,8 +2975,8 @@ nvkm_device_ctor(const struct nvkm_device_func *func,
+ mmio_size = device->func->resource_size(device, 0);
+
+ if (detect || mmio) {
+- map = ioremap(mmio_base, mmio_size);
+- if (map == NULL) {
++ device->pri = ioremap(mmio_base, mmio_size);
++ if (device->pri == NULL) {
+ nvdev_error(device, "unable to map PRI\n");
+ ret = -ENOMEM;
+ goto done;
+@@ -2987,10 +2986,10 @@ nvkm_device_ctor(const struct nvkm_device_func *func,
+ /* identify the chipset, and determine classes of subdev/engines */
+ if (detect) {
+ /* switch mmio to cpu's native endianness */
+- if (!nvkm_device_endianness(map)) {
+- iowrite32_native(0x01000001, map + 0x000004);
+- ioread32_native(map);
+- if (!nvkm_device_endianness(map)) {
++ if (!nvkm_device_endianness(device)) {
++ nvkm_wr32(device, 0x000004, 0x01000001);
++ nvkm_rd32(device, 0x000000);
++ if (!nvkm_device_endianness(device)) {
+ nvdev_error(device,
+ "GPU not supported on big-endian\n");
+ ret = -ENOSYS;
+@@ -2998,7 +2997,7 @@ nvkm_device_ctor(const struct nvkm_device_func *func,
+ }
+ }
+
+- boot0 = ioread32_native(map + 0x000000);
++ boot0 = nvkm_rd32(device, 0x000000);
+
+ /* chipset can be overridden for devel/testing purposes */
+ chipset = nvkm_longopt(device->cfgopt, "NvChipset", 0);
+@@ -3157,7 +3156,7 @@ nvkm_device_ctor(const struct nvkm_device_func *func,
+ device->chip->name, boot0);
+
+ /* vGPU detection */
+- boot1 = ioread32_native(map + 0x000004);
++ boot1 = nvkm_rd32(device, 0x0000004);
+ if (device->card_type >= TU100 && (boot1 & 0x00030000)) {
+ nvdev_info(device, "vGPUs are not supported\n");
+ ret = -ENODEV;
+@@ -3165,7 +3164,7 @@ nvkm_device_ctor(const struct nvkm_device_func *func,
+ }
+
+ /* read strapping information */
+- strap = ioread32_native(map + 0x101000);
++ strap = nvkm_rd32(device, 0x101000);
+
+ /* determine frequency of timing crystal */
+ if ( device->card_type <= NV_10 || device->chipset < 0x17 ||
+@@ -3187,10 +3186,6 @@ nvkm_device_ctor(const struct nvkm_device_func *func,
+ if (!device->name)
+ device->name = device->chip->name;
+
+- if (mmio) {
+- device->pri = map;
+- }
+-
+ mutex_init(&device->mutex);
+
+ for (i = 0; i < NVKM_SUBDEV_NR; i++) {
+@@ -3278,9 +3273,9 @@ nvkm_device_ctor(const struct nvkm_device_func *func,
+
+ ret = 0;
+ done:
+- if (map && (!mmio || ret)) {
++ if (device->pri && (!mmio || ret)) {
++ iounmap(device->pri);
+ device->pri = NULL;
+- iounmap(map);
+ }
+ mutex_unlock(&nv_devices_mutex);
+ return ret;
+--
+2.26.2
+
diff --git a/0001-disp-gv100-expose-capabilities-class.patch b/0001-disp-gv100-expose-capabilities-class.patch
new file mode 100644
index 000000000..60293792f
--- /dev/null
+++ b/0001-disp-gv100-expose-capabilities-class.patch
@@ -0,0 +1,149 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Ben Skeggs <bskeggs@redhat.com>
+Date: Thu, 13 Feb 2020 09:39:34 +1000
+Subject: [PATCH] disp/gv100-: expose capabilities class
+
+Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
+---
+ drivers/gpu/drm/nouveau/include/nvif/class.h | 2 +
+ .../gpu/drm/nouveau/nvkm/engine/disp/Kbuild | 2 +
+ .../drm/nouveau/nvkm/engine/disp/capsgv100.c | 60 +++++++++++++++++++
+ .../drm/nouveau/nvkm/engine/disp/rootgv100.c | 1 +
+ .../drm/nouveau/nvkm/engine/disp/rootnv50.h | 3 +
+ .../drm/nouveau/nvkm/engine/disp/roottu102.c | 1 +
+ 6 files changed, 69 insertions(+)
+ create mode 100644 drivers/gpu/drm/nouveau/nvkm/engine/disp/capsgv100.c
+
+diff --git a/drivers/gpu/drm/nouveau/include/nvif/class.h b/drivers/gpu/drm/nouveau/include/nvif/class.h
+index 30659747ffe8..2c79beb41126 100644
+--- a/drivers/gpu/drm/nouveau/include/nvif/class.h
++++ b/drivers/gpu/drm/nouveau/include/nvif/class.h
+@@ -89,6 +89,8 @@
+ #define GV100_DISP /* cl5070.h */ 0x0000c370
+ #define TU102_DISP /* cl5070.h */ 0x0000c570
+
++#define GV100_DISP_CAPS 0x0000c373
++
+ #define NV31_MPEG 0x00003174
+ #define G82_MPEG 0x00008274
+
+diff --git a/drivers/gpu/drm/nouveau/nvkm/engine/disp/Kbuild b/drivers/gpu/drm/nouveau/nvkm/engine/disp/Kbuild
+index 0d584d0da59c..f7af648e0c17 100644
+--- a/drivers/gpu/drm/nouveau/nvkm/engine/disp/Kbuild
++++ b/drivers/gpu/drm/nouveau/nvkm/engine/disp/Kbuild
+@@ -74,6 +74,8 @@ nvkm-y += nvkm/engine/disp/rootgp102.o
+ nvkm-y += nvkm/engine/disp/rootgv100.o
+ nvkm-y += nvkm/engine/disp/roottu102.o
+
++nvkm-y += nvkm/engine/disp/capsgv100.o
++
+ nvkm-y += nvkm/engine/disp/channv50.o
+ nvkm-y += nvkm/engine/disp/changf119.o
+ nvkm-y += nvkm/engine/disp/changv100.o
+diff --git a/drivers/gpu/drm/nouveau/nvkm/engine/disp/capsgv100.c b/drivers/gpu/drm/nouveau/nvkm/engine/disp/capsgv100.c
+new file mode 100644
+index 000000000000..5026e530f4bb
+--- /dev/null
++++ b/drivers/gpu/drm/nouveau/nvkm/engine/disp/capsgv100.c
+@@ -0,0 +1,60 @@
++/*
++ * Copyright 2020 Red Hat Inc.
++ *
++ * Permission is hereby granted, free of charge, to any person obtaining a
++ * copy of this software and associated documentation files (the "Software"),
++ * to deal in the Software without restriction, including without limitation
++ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
++ * and/or sell copies of the Software, and to permit persons to whom the
++ * Software is furnished to do so, subject to the following conditions:
++ *
++ * The above copyright notice and this permission notice shall be included in
++ * all copies or substantial portions of the Software.
++ *
++ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
++ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
++ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
++ * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
++ * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
++ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
++ * OTHER DEALINGS IN THE SOFTWARE.
++ */
++#define gv100_disp_caps(p) container_of((p), struct gv100_disp_caps, object)
++#include "rootnv50.h"
++
++struct gv100_disp_caps {
++ struct nvkm_object object;
++ struct nv50_disp *disp;
++};
++
++static int
++gv100_disp_caps_map(struct nvkm_object *object, void *argv, u32 argc,
++ enum nvkm_object_map *type, u64 *addr, u64 *size)
++{
++ struct gv100_disp_caps *caps = gv100_disp_caps(object);
++ struct nvkm_device *device = caps->disp->base.engine.subdev.device;
++ *type = NVKM_OBJECT_MAP_IO;
++ *addr = 0x640000 + device->func->resource_addr(device, 0);
++ *size = 0x1000;
++ return 0;
++}
++
++static const struct nvkm_object_func
++gv100_disp_caps = {
++ .map = gv100_disp_caps_map,
++};
++
++int
++gv100_disp_caps_new(const struct nvkm_oclass *oclass, void *argv, u32 argc,
++ struct nv50_disp *disp, struct nvkm_object **pobject)
++{
++ struct gv100_disp_caps *caps;
++
++ if (!(caps = kzalloc(sizeof(*caps), GFP_KERNEL)))
++ return -ENOMEM;
++ *pobject = &caps->object;
++
++ nvkm_object_ctor(&gv100_disp_caps, oclass, &caps->object);
++ caps->disp = disp;
++ return 0;
++}
+diff --git a/drivers/gpu/drm/nouveau/nvkm/engine/disp/rootgv100.c b/drivers/gpu/drm/nouveau/nvkm/engine/disp/rootgv100.c
+index 9c658d632d37..47efb48d769a 100644
+--- a/drivers/gpu/drm/nouveau/nvkm/engine/disp/rootgv100.c
++++ b/drivers/gpu/drm/nouveau/nvkm/engine/disp/rootgv100.c
+@@ -27,6 +27,7 @@
+ static const struct nv50_disp_root_func
+ gv100_disp_root = {
+ .user = {
++ {{-1,-1,GV100_DISP_CAPS }, gv100_disp_caps_new },
+ {{0,0,GV100_DISP_CURSOR }, gv100_disp_curs_new },
+ {{0,0,GV100_DISP_WINDOW_IMM_CHANNEL_DMA}, gv100_disp_wimm_new },
+ {{0,0,GV100_DISP_CORE_CHANNEL_DMA }, gv100_disp_core_new },
+diff --git a/drivers/gpu/drm/nouveau/nvkm/engine/disp/rootnv50.h b/drivers/gpu/drm/nouveau/nvkm/engine/disp/rootnv50.h
+index a1f942793f98..7070f5408d92 100644
+--- a/drivers/gpu/drm/nouveau/nvkm/engine/disp/rootnv50.h
++++ b/drivers/gpu/drm/nouveau/nvkm/engine/disp/rootnv50.h
+@@ -24,6 +24,9 @@ int nv50_disp_root_new_(const struct nv50_disp_root_func *, struct nvkm_disp *,
+ const struct nvkm_oclass *, void *data, u32 size,
+ struct nvkm_object **);
+
++int gv100_disp_caps_new(const struct nvkm_oclass *, void *, u32,
++ struct nv50_disp *, struct nvkm_object **);
++
+ extern const struct nvkm_disp_oclass nv50_disp_root_oclass;
+ extern const struct nvkm_disp_oclass g84_disp_root_oclass;
+ extern const struct nvkm_disp_oclass g94_disp_root_oclass;
+diff --git a/drivers/gpu/drm/nouveau/nvkm/engine/disp/roottu102.c b/drivers/gpu/drm/nouveau/nvkm/engine/disp/roottu102.c
+index 579a5d02308a..d8719d38b98a 100644
+--- a/drivers/gpu/drm/nouveau/nvkm/engine/disp/roottu102.c
++++ b/drivers/gpu/drm/nouveau/nvkm/engine/disp/roottu102.c
+@@ -27,6 +27,7 @@
+ static const struct nv50_disp_root_func
+ tu102_disp_root = {
+ .user = {
++ {{-1,-1,GV100_DISP_CAPS }, gv100_disp_caps_new },
+ {{0,0,TU102_DISP_CURSOR }, gv100_disp_curs_new },
+ {{0,0,TU102_DISP_WINDOW_IMM_CHANNEL_DMA}, gv100_disp_wimm_new },
+ {{0,0,TU102_DISP_CORE_CHANNEL_DMA }, gv100_disp_core_new },
+--
+2.26.2
+
diff --git a/0001-disp-hda-gf119-add-HAL-for-programming-device-entry-.patch b/0001-disp-hda-gf119-add-HAL-for-programming-device-entry-.patch
new file mode 100644
index 000000000..cba6699dc
--- /dev/null
+++ b/0001-disp-hda-gf119-add-HAL-for-programming-device-entry-.patch
@@ -0,0 +1,146 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Ben Skeggs <bskeggs@redhat.com>
+Date: Wed, 6 May 2020 14:40:56 +1000
+Subject: [PATCH] disp/hda/gf119-: add HAL for programming device entry in SF
+
+Register has moved on GV100.
+
+Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
+---
+ drivers/gpu/drm/nouveau/nvkm/engine/disp/hdagf119.c | 11 +++++++++--
+ drivers/gpu/drm/nouveau/nvkm/engine/disp/ior.h | 2 ++
+ drivers/gpu/drm/nouveau/nvkm/engine/disp/sorgf119.c | 1 +
+ drivers/gpu/drm/nouveau/nvkm/engine/disp/sorgk104.c | 1 +
+ drivers/gpu/drm/nouveau/nvkm/engine/disp/sorgm107.c | 1 +
+ drivers/gpu/drm/nouveau/nvkm/engine/disp/sorgm200.c | 1 +
+ drivers/gpu/drm/nouveau/nvkm/engine/disp/sorgv100.c | 1 +
+ drivers/gpu/drm/nouveau/nvkm/engine/disp/sortu102.c | 1 +
+ 8 files changed, 17 insertions(+), 2 deletions(-)
+
+diff --git a/drivers/gpu/drm/nouveau/nvkm/engine/disp/hdagf119.c b/drivers/gpu/drm/nouveau/nvkm/engine/disp/hdagf119.c
+index 1080ba6ecd64..8a0ec7db5145 100644
+--- a/drivers/gpu/drm/nouveau/nvkm/engine/disp/hdagf119.c
++++ b/drivers/gpu/drm/nouveau/nvkm/engine/disp/hdagf119.c
+@@ -23,6 +23,14 @@
+ */
+ #include "ior.h"
+
++void
++gf119_hda_device_entry(struct nvkm_ior *ior, int head)
++{
++ struct nvkm_device *device = ior->disp->engine.subdev.device;
++ const u32 hoff = 0x800 * head;
++ nvkm_mask(device, 0x616548 + hoff, 0x00000070, 0x00000000);
++}
++
+ void
+ gf119_hda_eld(struct nvkm_ior *ior, int head, u8 *data, u8 size)
+ {
+@@ -41,11 +49,10 @@ void
+ gf119_hda_hpd(struct nvkm_ior *ior, int head, bool present)
+ {
+ struct nvkm_device *device = ior->disp->engine.subdev.device;
+- const u32 hoff = 0x800 * head;
+ u32 data = 0x80000000;
+ u32 mask = 0x80000001;
+ if (present) {
+- nvkm_mask(device, 0x616548 + hoff, 0x00000070, 0x00000000);
++ ior->func->hda.device_entry(ior, head);
+ data |= 0x00000001;
+ } else {
+ mask |= 0x00000002;
+diff --git a/drivers/gpu/drm/nouveau/nvkm/engine/disp/ior.h b/drivers/gpu/drm/nouveau/nvkm/engine/disp/ior.h
+index c60acf71831e..eb1155e47ecd 100644
+--- a/drivers/gpu/drm/nouveau/nvkm/engine/disp/ior.h
++++ b/drivers/gpu/drm/nouveau/nvkm/engine/disp/ior.h
+@@ -88,6 +88,7 @@ struct nvkm_ior_func {
+ struct {
+ void (*hpd)(struct nvkm_ior *, int head, bool present);
+ void (*eld)(struct nvkm_ior *, int head, u8 *data, u8 size);
++ void (*device_entry)(struct nvkm_ior *, int head);
+ } hda;
+ };
+
+@@ -162,6 +163,7 @@ void gt215_hda_eld(struct nvkm_ior *, int, u8 *, u8);
+
+ void gf119_hda_hpd(struct nvkm_ior *, int, bool);
+ void gf119_hda_eld(struct nvkm_ior *, int, u8 *, u8);
++void gf119_hda_device_entry(struct nvkm_ior *, int);
+
+ #define IOR_MSG(i,l,f,a...) do { \
+ struct nvkm_ior *_ior = (i); \
+diff --git a/drivers/gpu/drm/nouveau/nvkm/engine/disp/sorgf119.c b/drivers/gpu/drm/nouveau/nvkm/engine/disp/sorgf119.c
+index 456a5a143522..3b3643fb1019 100644
+--- a/drivers/gpu/drm/nouveau/nvkm/engine/disp/sorgf119.c
++++ b/drivers/gpu/drm/nouveau/nvkm/engine/disp/sorgf119.c
+@@ -177,6 +177,7 @@ gf119_sor = {
+ .hda = {
+ .hpd = gf119_hda_hpd,
+ .eld = gf119_hda_eld,
++ .device_entry = gf119_hda_device_entry,
+ },
+ };
+
+diff --git a/drivers/gpu/drm/nouveau/nvkm/engine/disp/sorgk104.c b/drivers/gpu/drm/nouveau/nvkm/engine/disp/sorgk104.c
+index b94090edaebf..0c0925680790 100644
+--- a/drivers/gpu/drm/nouveau/nvkm/engine/disp/sorgk104.c
++++ b/drivers/gpu/drm/nouveau/nvkm/engine/disp/sorgk104.c
+@@ -43,6 +43,7 @@ gk104_sor = {
+ .hda = {
+ .hpd = gf119_hda_hpd,
+ .eld = gf119_hda_eld,
++ .device_entry = gf119_hda_device_entry,
+ },
+ };
+
+diff --git a/drivers/gpu/drm/nouveau/nvkm/engine/disp/sorgm107.c b/drivers/gpu/drm/nouveau/nvkm/engine/disp/sorgm107.c
+index e6965dec09c9..38045c92197f 100644
+--- a/drivers/gpu/drm/nouveau/nvkm/engine/disp/sorgm107.c
++++ b/drivers/gpu/drm/nouveau/nvkm/engine/disp/sorgm107.c
+@@ -57,6 +57,7 @@ gm107_sor = {
+ .hda = {
+ .hpd = gf119_hda_hpd,
+ .eld = gf119_hda_eld,
++ .device_entry = gf119_hda_device_entry,
+ },
+ };
+
+diff --git a/drivers/gpu/drm/nouveau/nvkm/engine/disp/sorgm200.c b/drivers/gpu/drm/nouveau/nvkm/engine/disp/sorgm200.c
+index 384f82652bec..cf2075db742a 100644
+--- a/drivers/gpu/drm/nouveau/nvkm/engine/disp/sorgm200.c
++++ b/drivers/gpu/drm/nouveau/nvkm/engine/disp/sorgm200.c
+@@ -115,6 +115,7 @@ gm200_sor = {
+ .hda = {
+ .hpd = gf119_hda_hpd,
+ .eld = gf119_hda_eld,
++ .device_entry = gf119_hda_device_entry,
+ },
+ };
+
+diff --git a/drivers/gpu/drm/nouveau/nvkm/engine/disp/sorgv100.c b/drivers/gpu/drm/nouveau/nvkm/engine/disp/sorgv100.c
+index b0597ff9a714..565cfbc65550 100644
+--- a/drivers/gpu/drm/nouveau/nvkm/engine/disp/sorgv100.c
++++ b/drivers/gpu/drm/nouveau/nvkm/engine/disp/sorgv100.c
+@@ -103,6 +103,7 @@ gv100_sor = {
+ .hda = {
+ .hpd = gf119_hda_hpd,
+ .eld = gf119_hda_eld,
++ .device_entry = gf119_hda_device_entry,
+ },
+ };
+
+diff --git a/drivers/gpu/drm/nouveau/nvkm/engine/disp/sortu102.c b/drivers/gpu/drm/nouveau/nvkm/engine/disp/sortu102.c
+index 4d5f3791ea7b..b16ecea098c7 100644
+--- a/drivers/gpu/drm/nouveau/nvkm/engine/disp/sortu102.c
++++ b/drivers/gpu/drm/nouveau/nvkm/engine/disp/sortu102.c
+@@ -88,6 +88,7 @@ tu102_sor = {
+ .hda = {
+ .hpd = gf119_hda_hpd,
+ .eld = gf119_hda_eld,
++ .device_entry = gf119_hda_device_entry,
+ },
+ };
+
+--
+2.26.2
+
diff --git a/0001-disp-hda-gf119-select-HDA-device-entry-based-on-boun.patch b/0001-disp-hda-gf119-select-HDA-device-entry-based-on-boun.patch
new file mode 100644
index 000000000..714d1a0f3
--- /dev/null
+++ b/0001-disp-hda-gf119-select-HDA-device-entry-based-on-boun.patch
@@ -0,0 +1,49 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Ben Skeggs <bskeggs@redhat.com>
+Date: Wed, 6 May 2020 14:40:58 +1000
+Subject: [PATCH] disp/hda/gf119-: select HDA device entry based on bound head
+
+Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
+---
+ drivers/gpu/drm/nouveau/nvkm/engine/disp/hdagf119.c | 7 ++++---
+ 1 file changed, 4 insertions(+), 3 deletions(-)
+
+diff --git a/drivers/gpu/drm/nouveau/nvkm/engine/disp/hdagf119.c b/drivers/gpu/drm/nouveau/nvkm/engine/disp/hdagf119.c
+index 8a0ec7db5145..19d2d58344e4 100644
+--- a/drivers/gpu/drm/nouveau/nvkm/engine/disp/hdagf119.c
++++ b/drivers/gpu/drm/nouveau/nvkm/engine/disp/hdagf119.c
+@@ -28,14 +28,14 @@ gf119_hda_device_entry(struct nvkm_ior *ior, int head)
+ {
+ struct nvkm_device *device = ior->disp->engine.subdev.device;
+ const u32 hoff = 0x800 * head;
+- nvkm_mask(device, 0x616548 + hoff, 0x00000070, 0x00000000);
++ nvkm_mask(device, 0x616548 + hoff, 0x00000070, head << 4);
+ }
+
+ void
+ gf119_hda_eld(struct nvkm_ior *ior, int head, u8 *data, u8 size)
+ {
+ struct nvkm_device *device = ior->disp->engine.subdev.device;
+- const u32 soff = 0x030 * ior->id;
++ const u32 soff = 0x030 * ior->id + (head * 0x04);
+ int i;
+
+ for (i = 0; i < size; i++)
+@@ -49,6 +49,7 @@ void
+ gf119_hda_hpd(struct nvkm_ior *ior, int head, bool present)
+ {
+ struct nvkm_device *device = ior->disp->engine.subdev.device;
++ const u32 soff = 0x030 * ior->id + (head * 0x04);
+ u32 data = 0x80000000;
+ u32 mask = 0x80000001;
+ if (present) {
+@@ -57,5 +58,5 @@ gf119_hda_hpd(struct nvkm_ior *ior, int head, bool present)
+ } else {
+ mask |= 0x00000002;
+ }
+- nvkm_mask(device, 0x10ec10 + ior->id * 0x030, mask, data);
++ nvkm_mask(device, 0x10ec10 + soff, mask, data);
+ }
+--
+2.26.2
+
diff --git a/0001-disp-hda-gt215-pass-head-to-nvkm_ior.hda.eld.patch b/0001-disp-hda-gt215-pass-head-to-nvkm_ior.hda.eld.patch
new file mode 100644
index 000000000..0011e60ae
--- /dev/null
+++ b/0001-disp-hda-gt215-pass-head-to-nvkm_ior.hda.eld.patch
@@ -0,0 +1,83 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Ben Skeggs <bskeggs@redhat.com>
+Date: Wed, 6 May 2020 14:40:52 +1000
+Subject: [PATCH] disp/hda/gt215-: pass head to nvkm_ior.hda.eld()
+
+We're going to use the bound head to select HDA device entry.
+
+Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
+---
+ drivers/gpu/drm/nouveau/nvkm/engine/disp/hdagf119.c | 2 +-
+ drivers/gpu/drm/nouveau/nvkm/engine/disp/hdagt215.c | 2 +-
+ drivers/gpu/drm/nouveau/nvkm/engine/disp/ior.h | 6 +++---
+ drivers/gpu/drm/nouveau/nvkm/engine/disp/rootnv50.c | 2 +-
+ 4 files changed, 6 insertions(+), 6 deletions(-)
+
+diff --git a/drivers/gpu/drm/nouveau/nvkm/engine/disp/hdagf119.c b/drivers/gpu/drm/nouveau/nvkm/engine/disp/hdagf119.c
+index 0fa0ec0a1de0..1080ba6ecd64 100644
+--- a/drivers/gpu/drm/nouveau/nvkm/engine/disp/hdagf119.c
++++ b/drivers/gpu/drm/nouveau/nvkm/engine/disp/hdagf119.c
+@@ -24,7 +24,7 @@
+ #include "ior.h"
+
+ void
+-gf119_hda_eld(struct nvkm_ior *ior, u8 *data, u8 size)
++gf119_hda_eld(struct nvkm_ior *ior, int head, u8 *data, u8 size)
+ {
+ struct nvkm_device *device = ior->disp->engine.subdev.device;
+ const u32 soff = 0x030 * ior->id;
+diff --git a/drivers/gpu/drm/nouveau/nvkm/engine/disp/hdagt215.c b/drivers/gpu/drm/nouveau/nvkm/engine/disp/hdagt215.c
+index 4509d2ba880e..0d1b81fe1093 100644
+--- a/drivers/gpu/drm/nouveau/nvkm/engine/disp/hdagt215.c
++++ b/drivers/gpu/drm/nouveau/nvkm/engine/disp/hdagt215.c
+@@ -24,7 +24,7 @@
+ #include "ior.h"
+
+ void
+-gt215_hda_eld(struct nvkm_ior *ior, u8 *data, u8 size)
++gt215_hda_eld(struct nvkm_ior *ior, int head, u8 *data, u8 size)
+ {
+ struct nvkm_device *device = ior->disp->engine.subdev.device;
+ const u32 soff = ior->id * 0x800;
+diff --git a/drivers/gpu/drm/nouveau/nvkm/engine/disp/ior.h b/drivers/gpu/drm/nouveau/nvkm/engine/disp/ior.h
+index 009d3a8b7a50..c60acf71831e 100644
+--- a/drivers/gpu/drm/nouveau/nvkm/engine/disp/ior.h
++++ b/drivers/gpu/drm/nouveau/nvkm/engine/disp/ior.h
+@@ -87,7 +87,7 @@ struct nvkm_ior_func {
+
+ struct {
+ void (*hpd)(struct nvkm_ior *, int head, bool present);
+- void (*eld)(struct nvkm_ior *, u8 *data, u8 size);
++ void (*eld)(struct nvkm_ior *, int head, u8 *data, u8 size);
+ } hda;
+ };
+
+@@ -158,10 +158,10 @@ void gv100_hdmi_ctrl(struct nvkm_ior *, int, bool, u8, u8, u8 *, u8 , u8 *, u8);
+ void gm200_hdmi_scdc(struct nvkm_ior *, int, u8);
+
+ void gt215_hda_hpd(struct nvkm_ior *, int, bool);
+-void gt215_hda_eld(struct nvkm_ior *, u8 *, u8);
++void gt215_hda_eld(struct nvkm_ior *, int, u8 *, u8);
+
+ void gf119_hda_hpd(struct nvkm_ior *, int, bool);
+-void gf119_hda_eld(struct nvkm_ior *, u8 *, u8);
++void gf119_hda_eld(struct nvkm_ior *, int, u8 *, u8);
+
+ #define IOR_MSG(i,l,f,a...) do { \
+ struct nvkm_ior *_ior = (i); \
+diff --git a/drivers/gpu/drm/nouveau/nvkm/engine/disp/rootnv50.c b/drivers/gpu/drm/nouveau/nvkm/engine/disp/rootnv50.c
+index 5f758948d6e1..a7672ef17d3b 100644
+--- a/drivers/gpu/drm/nouveau/nvkm/engine/disp/rootnv50.c
++++ b/drivers/gpu/drm/nouveau/nvkm/engine/disp/rootnv50.c
+@@ -155,7 +155,7 @@ nv50_disp_root_mthd_(struct nvkm_object *object, u32 mthd, void *data, u32 size)
+ if (outp->info.type == DCB_OUTPUT_DP)
+ ior->func->dp.audio(ior, hidx, true);
+ ior->func->hda.hpd(ior, hidx, true);
+- ior->func->hda.eld(ior, data, size);
++ ior->func->hda.eld(ior, hidx, data, size);
+ } else {
+ if (outp->info.type == DCB_OUTPUT_DP)
+ ior->func->dp.audio(ior, hidx, false);
+--
+2.26.2
+
diff --git a/0001-disp-hda-gv100-NV_PDISP_SF_AUDIO_CNTRL0-register-mov.patch b/0001-disp-hda-gv100-NV_PDISP_SF_AUDIO_CNTRL0-register-mov.patch
new file mode 100644
index 000000000..b93c9f13b
--- /dev/null
+++ b/0001-disp-hda-gv100-NV_PDISP_SF_AUDIO_CNTRL0-register-mov.patch
@@ -0,0 +1,105 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Ben Skeggs <bskeggs@redhat.com>
+Date: Wed, 6 May 2020 14:41:01 +1000
+Subject: [PATCH] disp/hda/gv100-: NV_PDISP_SF_AUDIO_CNTRL0 register moved
+
+Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
+---
+ .../gpu/drm/nouveau/nvkm/engine/disp/Kbuild | 1 +
+ .../drm/nouveau/nvkm/engine/disp/hdagv100.c | 30 +++++++++++++++++++
+ .../gpu/drm/nouveau/nvkm/engine/disp/ior.h | 2 ++
+ .../drm/nouveau/nvkm/engine/disp/sorgv100.c | 2 +-
+ .../drm/nouveau/nvkm/engine/disp/sortu102.c | 2 +-
+ 5 files changed, 35 insertions(+), 2 deletions(-)
+ create mode 100644 drivers/gpu/drm/nouveau/nvkm/engine/disp/hdagv100.c
+
+diff --git a/drivers/gpu/drm/nouveau/nvkm/engine/disp/Kbuild b/drivers/gpu/drm/nouveau/nvkm/engine/disp/Kbuild
+index f7af648e0c17..571687ba85b8 100644
+--- a/drivers/gpu/drm/nouveau/nvkm/engine/disp/Kbuild
++++ b/drivers/gpu/drm/nouveau/nvkm/engine/disp/Kbuild
+@@ -47,6 +47,7 @@ nvkm-y += nvkm/engine/disp/dp.o
+
+ nvkm-y += nvkm/engine/disp/hdagt215.o
+ nvkm-y += nvkm/engine/disp/hdagf119.o
++nvkm-y += nvkm/engine/disp/hdagv100.o
+
+ nvkm-y += nvkm/engine/disp/hdmi.o
+ nvkm-y += nvkm/engine/disp/hdmig84.o
+diff --git a/drivers/gpu/drm/nouveau/nvkm/engine/disp/hdagv100.c b/drivers/gpu/drm/nouveau/nvkm/engine/disp/hdagv100.c
+new file mode 100644
+index 000000000000..57d374ecfeef
+--- /dev/null
++++ b/drivers/gpu/drm/nouveau/nvkm/engine/disp/hdagv100.c
+@@ -0,0 +1,30 @@
++/*
++ * Copyright 2020 Red Hat Inc.
++ *
++ * Permission is hereby granted, free of charge, to any person obtaining a
++ * copy of this software and associated documentation files (the "Software"),
++ * to deal in the Software without restriction, including without limitation
++ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
++ * and/or sell copies of the Software, and to permit persons to whom the
++ * Software is furnished to do so, subject to the following conditions:
++ *
++ * The above copyright notice and this permission notice shall be included in
++ * all copies or substantial portions of the Software.
++ *
++ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
++ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
++ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
++ * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
++ * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
++ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
++ * OTHER DEALINGS IN THE SOFTWARE.
++ */
++#include "ior.h"
++
++void
++gv100_hda_device_entry(struct nvkm_ior *ior, int head)
++{
++ struct nvkm_device *device = ior->disp->engine.subdev.device;
++ const u32 hoff = 0x800 * head;
++ nvkm_mask(device, 0x616528 + hoff, 0x00000070, head << 4);
++}
+diff --git a/drivers/gpu/drm/nouveau/nvkm/engine/disp/ior.h b/drivers/gpu/drm/nouveau/nvkm/engine/disp/ior.h
+index eb1155e47ecd..c1d7a36e4d3c 100644
+--- a/drivers/gpu/drm/nouveau/nvkm/engine/disp/ior.h
++++ b/drivers/gpu/drm/nouveau/nvkm/engine/disp/ior.h
+@@ -165,6 +165,8 @@ void gf119_hda_hpd(struct nvkm_ior *, int, bool);
+ void gf119_hda_eld(struct nvkm_ior *, int, u8 *, u8);
+ void gf119_hda_device_entry(struct nvkm_ior *, int);
+
++void gv100_hda_device_entry(struct nvkm_ior *, int);
++
+ #define IOR_MSG(i,l,f,a...) do { \
+ struct nvkm_ior *_ior = (i); \
+ nvkm_##l(&_ior->disp->engine.subdev, "%s: "f"\n", _ior->name, ##a); \
+diff --git a/drivers/gpu/drm/nouveau/nvkm/engine/disp/sorgv100.c b/drivers/gpu/drm/nouveau/nvkm/engine/disp/sorgv100.c
+index 565cfbc65550..d11a0dff10c6 100644
+--- a/drivers/gpu/drm/nouveau/nvkm/engine/disp/sorgv100.c
++++ b/drivers/gpu/drm/nouveau/nvkm/engine/disp/sorgv100.c
+@@ -103,7 +103,7 @@ gv100_sor = {
+ .hda = {
+ .hpd = gf119_hda_hpd,
+ .eld = gf119_hda_eld,
+- .device_entry = gf119_hda_device_entry,
++ .device_entry = gv100_hda_device_entry,
+ },
+ };
+
+diff --git a/drivers/gpu/drm/nouveau/nvkm/engine/disp/sortu102.c b/drivers/gpu/drm/nouveau/nvkm/engine/disp/sortu102.c
+index b16ecea098c7..fa6d74251237 100644
+--- a/drivers/gpu/drm/nouveau/nvkm/engine/disp/sortu102.c
++++ b/drivers/gpu/drm/nouveau/nvkm/engine/disp/sortu102.c
+@@ -88,7 +88,7 @@ tu102_sor = {
+ .hda = {
+ .hpd = gf119_hda_hpd,
+ .eld = gf119_hda_eld,
+- .device_entry = gf119_hda_device_entry,
++ .device_entry = gv100_hda_device_entry,
+ },
+ };
+
+--
+2.26.2
+
diff --git a/0001-disp-nv50-increase-timeout-on-pio-channel-free-polli.patch b/0001-disp-nv50-increase-timeout-on-pio-channel-free-polli.patch
new file mode 100644
index 000000000..d8c1a93d5
--- /dev/null
+++ b/0001-disp-nv50-increase-timeout-on-pio-channel-free-polli.patch
@@ -0,0 +1,26 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Ben Skeggs <bskeggs@redhat.com>
+Date: Wed, 6 May 2020 14:40:45 +1000
+Subject: [PATCH] disp/nv50-: increase timeout on pio channel free() polling
+
+Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
+---
+ drivers/gpu/drm/nouveau/dispnv50/curs507a.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/drivers/gpu/drm/nouveau/dispnv50/curs507a.c b/drivers/gpu/drm/nouveau/dispnv50/curs507a.c
+index 8c5cf096f69b..658a200ab616 100644
+--- a/drivers/gpu/drm/nouveau/dispnv50/curs507a.c
++++ b/drivers/gpu/drm/nouveau/dispnv50/curs507a.c
+@@ -32,7 +32,7 @@
+ bool
+ curs507a_space(struct nv50_wndw *wndw)
+ {
+- nvif_msec(&nouveau_drm(wndw->plane.dev)->client.device, 2,
++ nvif_msec(&nouveau_drm(wndw->plane.dev)->client.device, 100,
+ if (nvif_rd32(&wndw->wimm.base.user, 0x0008) >= 4)
+ return true;
+ );
+--
+2.26.2
+
diff --git a/0001-drm-Use-generic-helper-to-check-_PR3-presence.patch b/0001-drm-Use-generic-helper-to-check-_PR3-presence.patch
new file mode 100644
index 000000000..f0f9e0dfd
--- /dev/null
+++ b/0001-drm-Use-generic-helper-to-check-_PR3-presence.patch
@@ -0,0 +1,96 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Kai-Heng Feng <kai.heng.feng@canonical.com>
+Date: Thu, 23 Apr 2020 14:23:58 +0800
+Subject: [PATCH] drm: Use generic helper to check _PR3 presence
+
+Replace nouveau_pr3_present() in favor of a more generic one,
+pci_pr3_present().
+
+Also the presence of upstream bridge _PR3 doesn't need to go hand in
+hand with device's _DSM, so check _PR3 before _DSM.
+
+Signed-off-by: Kai-Heng Feng <kai.heng.feng@canonical.com>
+Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
+---
+ drivers/gpu/drm/nouveau/nouveau_acpi.c | 44 ++++++--------------------
+ 1 file changed, 10 insertions(+), 34 deletions(-)
+
+diff --git a/drivers/gpu/drm/nouveau/nouveau_acpi.c b/drivers/gpu/drm/nouveau/nouveau_acpi.c
+index fe3a10255c36..b84dff1b0f28 100644
+--- a/drivers/gpu/drm/nouveau/nouveau_acpi.c
++++ b/drivers/gpu/drm/nouveau/nouveau_acpi.c
+@@ -212,37 +212,6 @@ static const struct vga_switcheroo_handler nouveau_dsm_handler = {
+ .get_client_id = nouveau_dsm_get_client_id,
+ };
+
+-/*
+- * Firmware supporting Windows 8 or later do not use _DSM to put the device into
+- * D3cold, they instead rely on disabling power resources on the parent.
+- */
+-static bool nouveau_pr3_present(struct pci_dev *pdev)
+-{
+- struct pci_dev *parent_pdev = pci_upstream_bridge(pdev);
+- struct acpi_device *parent_adev;
+-
+- if (!parent_pdev)
+- return false;
+-
+- if (!parent_pdev->bridge_d3) {
+- /*
+- * Parent PCI bridge is currently not power managed.
+- * Since userspace can change these afterwards to be on
+- * the safe side we stick with _DSM and prevent usage of
+- * _PR3 from the bridge.
+- */
+- pci_d3cold_disable(pdev);
+- return false;
+- }
+-
+- parent_adev = ACPI_COMPANION(&parent_pdev->dev);
+- if (!parent_adev)
+- return false;
+-
+- return parent_adev->power.flags.power_resources &&
+- acpi_has_method(parent_adev->handle, "_PR3");
+-}
+-
+ static void nouveau_dsm_pci_probe(struct pci_dev *pdev, acpi_handle *dhandle_out,
+ bool *has_mux, bool *has_opt,
+ bool *has_opt_flags, bool *has_pr3)
+@@ -250,6 +219,16 @@ static void nouveau_dsm_pci_probe(struct pci_dev *pdev, acpi_handle *dhandle_out
+ acpi_handle dhandle;
+ bool supports_mux;
+ int optimus_funcs;
++ struct pci_dev *parent_pdev;
++
++ *has_pr3 = false;
++ parent_pdev = pci_upstream_bridge(pdev);
++ if (parent_pdev) {
++ if (parent_pdev->bridge_d3)
++ *has_pr3 = pci_pr3_present(parent_pdev);
++ else
++ pci_d3cold_disable(pdev);
++ }
+
+ dhandle = ACPI_HANDLE(&pdev->dev);
+ if (!dhandle)
+@@ -270,7 +249,6 @@ static void nouveau_dsm_pci_probe(struct pci_dev *pdev, acpi_handle *dhandle_out
+ *has_mux = supports_mux;
+ *has_opt = !!optimus_funcs;
+ *has_opt_flags = optimus_funcs & (1 << NOUVEAU_DSM_OPTIMUS_FLAGS);
+- *has_pr3 = false;
+
+ if (optimus_funcs) {
+ uint32_t result;
+@@ -280,8 +258,6 @@ static void nouveau_dsm_pci_probe(struct pci_dev *pdev, acpi_handle *dhandle_out
+ (result & OPTIMUS_ENABLED) ? "enabled" : "disabled",
+ (result & OPTIMUS_DYNAMIC_PWR_CAP) ? "dynamic power, " : "",
+ (result & OPTIMUS_HDA_CODEC_MASK) ? "hda bios codec supported" : "");
+-
+- *has_pr3 = nouveau_pr3_present(pdev);
+ }
+ }
+
+--
+2.26.2
+
diff --git a/0001-kms-Fix-regression-by-audio-component-transition.patch b/0001-kms-Fix-regression-by-audio-component-transition.patch
new file mode 100644
index 000000000..198e0be9e
--- /dev/null
+++ b/0001-kms-Fix-regression-by-audio-component-transition.patch
@@ -0,0 +1,82 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Takashi Iwai <tiwai@suse.de>
+Date: Thu, 16 Apr 2020 09:54:28 +0200
+Subject: [PATCH] kms: Fix regression by audio component transition
+
+Since the commit 742db30c4ee6 ("drm/nouveau: Add HD-audio component
+notifier support"), the nouveau driver notifies and pokes the HD-audio
+HPD and ELD via audio component, but this seems broken. The culprit
+is the naive assumption that crtc->index corresponds to the HDA pin.
+Actually this rather corresponds to the MST dev_id (alias "pipe" in
+the audio component framework) while the actual port number is given
+from the output ior id number.
+
+This patch corrects the assignment of port and dev_id arguments in the
+audio component ops to recover from the HDMI/DP audio regression.
+
+Fixes: 742db30c4ee6 ("drm/nouveau: Add HD-audio component notifier support")
+BugLink: https://bugzilla.kernel.org/show_bug.cgi?id=207223
+Cc: <stable@vger.kernel.org>
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
+---
+ drivers/gpu/drm/nouveau/dispnv50/disp.c | 16 ++++++++++------
+ 1 file changed, 10 insertions(+), 6 deletions(-)
+
+diff --git a/drivers/gpu/drm/nouveau/dispnv50/disp.c b/drivers/gpu/drm/nouveau/dispnv50/disp.c
+index 6be9df1820c5..2625ed84fc44 100644
+--- a/drivers/gpu/drm/nouveau/dispnv50/disp.c
++++ b/drivers/gpu/drm/nouveau/dispnv50/disp.c
+@@ -482,15 +482,16 @@ nv50_dac_create(struct drm_connector *connector, struct dcb_output *dcbe)
+ * audio component binding for ELD notification
+ */
+ static void
+-nv50_audio_component_eld_notify(struct drm_audio_component *acomp, int port)
++nv50_audio_component_eld_notify(struct drm_audio_component *acomp, int port,
++ int dev_id)
+ {
+ if (acomp && acomp->audio_ops && acomp->audio_ops->pin_eld_notify)
+ acomp->audio_ops->pin_eld_notify(acomp->audio_ops->audio_ptr,
+- port, -1);
++ port, dev_id);
+ }
+
+ static int
+-nv50_audio_component_get_eld(struct device *kdev, int port, int pipe,
++nv50_audio_component_get_eld(struct device *kdev, int port, int dev_id,
+ bool *enabled, unsigned char *buf, int max_bytes)
+ {
+ struct drm_device *drm_dev = dev_get_drvdata(kdev);
+@@ -506,7 +507,8 @@ nv50_audio_component_get_eld(struct device *kdev, int port, int pipe,
+ nv_encoder = nouveau_encoder(encoder);
+ nv_connector = nouveau_encoder_connector_get(nv_encoder);
+ nv_crtc = nouveau_crtc(encoder->crtc);
+- if (!nv_connector || !nv_crtc || nv_crtc->index != port)
++ if (!nv_connector || !nv_crtc || nv_encoder->or != port ||
++ nv_crtc->index != dev_id)
+ continue;
+ *enabled = drm_detect_monitor_audio(nv_connector->edid);
+ if (*enabled) {
+@@ -600,7 +602,8 @@ nv50_audio_disable(struct drm_encoder *encoder, struct nouveau_crtc *nv_crtc)
+
+ nvif_mthd(&disp->disp->object, 0, &args, sizeof(args));
+
+- nv50_audio_component_eld_notify(drm->audio.component, nv_crtc->index);
++ nv50_audio_component_eld_notify(drm->audio.component, nv_encoder->or,
++ nv_crtc->index);
+ }
+
+ static void
+@@ -634,7 +637,8 @@ nv50_audio_enable(struct drm_encoder *encoder, struct drm_display_mode *mode)
+ nvif_mthd(&disp->disp->object, 0, &args,
+ sizeof(args.base) + drm_eld_size(args.data));
+
+- nv50_audio_component_eld_notify(drm->audio.component, nv_crtc->index);
++ nv50_audio_component_eld_notify(drm->audio.component, nv_encoder->or,
++ nv_crtc->index);
+ }
+
+ /******************************************************************************
+--
+2.26.2
+
diff --git a/0001-kms-gv100-Add-support-for-interlaced-modes.patch b/0001-kms-gv100-Add-support-for-interlaced-modes.patch
new file mode 100644
index 000000000..c50c826b8
--- /dev/null
+++ b/0001-kms-gv100-Add-support-for-interlaced-modes.patch
@@ -0,0 +1,64 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Lyude Paul <lyude@redhat.com>
+Date: Mon, 11 May 2020 18:41:25 -0400
+Subject: [PATCH] kms/gv100-: Add support for interlaced modes
+
+We advertise being able to set interlaced modes, so let's actually make
+sure to do that. Otherwise, we'll end up hanging the display engine due
+to trying to set a mode with timings adjusted for interlacing without
+telling the hardware it's actually an interlaced mode.
+
+Signed-off-by: Lyude Paul <lyude@redhat.com>
+Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
+---
+ drivers/gpu/drm/nouveau/dispnv50/headc37d.c | 5 +++--
+ drivers/gpu/drm/nouveau/dispnv50/headc57d.c | 5 +++--
+ 2 files changed, 6 insertions(+), 4 deletions(-)
+
+diff --git a/drivers/gpu/drm/nouveau/dispnv50/headc37d.c b/drivers/gpu/drm/nouveau/dispnv50/headc37d.c
+index 00011ce109a6..4a9a32b89f74 100644
+--- a/drivers/gpu/drm/nouveau/dispnv50/headc37d.c
++++ b/drivers/gpu/drm/nouveau/dispnv50/headc37d.c
+@@ -168,14 +168,15 @@ headc37d_mode(struct nv50_head *head, struct nv50_head_atom *asyh)
+ struct nv50_dmac *core = &nv50_disp(head->base.base.dev)->core->chan;
+ struct nv50_head_mode *m = &asyh->mode;
+ u32 *push;
+- if ((push = evo_wait(core, 12))) {
++ if ((push = evo_wait(core, 13))) {
+ evo_mthd(push, 0x2064 + (head->base.index * 0x400), 5);
+ evo_data(push, (m->v.active << 16) | m->h.active );
+ evo_data(push, (m->v.synce << 16) | m->h.synce );
+ evo_data(push, (m->v.blanke << 16) | m->h.blanke );
+ evo_data(push, (m->v.blanks << 16) | m->h.blanks );
+ evo_data(push, (m->v.blank2e << 16) | m->v.blank2s);
+- evo_mthd(push, 0x200c + (head->base.index * 0x400), 1);
++ evo_mthd(push, 0x2008 + (head->base.index * 0x400), 2);
++ evo_data(push, m->interlace);
+ evo_data(push, m->clock * 1000);
+ evo_mthd(push, 0x2028 + (head->base.index * 0x400), 1);
+ evo_data(push, m->clock * 1000);
+diff --git a/drivers/gpu/drm/nouveau/dispnv50/headc57d.c b/drivers/gpu/drm/nouveau/dispnv50/headc57d.c
+index 938d910a1b1e..859131a8bc3c 100644
+--- a/drivers/gpu/drm/nouveau/dispnv50/headc57d.c
++++ b/drivers/gpu/drm/nouveau/dispnv50/headc57d.c
+@@ -173,14 +173,15 @@ headc57d_mode(struct nv50_head *head, struct nv50_head_atom *asyh)
+ struct nv50_dmac *core = &nv50_disp(head->base.base.dev)->core->chan;
+ struct nv50_head_mode *m = &asyh->mode;
+ u32 *push;
+- if ((push = evo_wait(core, 12))) {
++ if ((push = evo_wait(core, 13))) {
+ evo_mthd(push, 0x2064 + (head->base.index * 0x400), 5);
+ evo_data(push, (m->v.active << 16) | m->h.active );
+ evo_data(push, (m->v.synce << 16) | m->h.synce );
+ evo_data(push, (m->v.blanke << 16) | m->h.blanke );
+ evo_data(push, (m->v.blanks << 16) | m->h.blanks );
+ evo_data(push, (m->v.blank2e << 16) | m->v.blank2s);
+- evo_mthd(push, 0x200c + (head->base.index * 0x400), 1);
++ evo_mthd(push, 0x2008 + (head->base.index * 0x400), 2);
++ evo_data(push, m->interlace);
+ evo_data(push, m->clock * 1000);
+ evo_mthd(push, 0x2028 + (head->base.index * 0x400), 1);
+ evo_data(push, m->clock * 1000);
+--
+2.26.2
+
diff --git a/0001-kms-nv50-Initialize-core-channel-in-nouveau_display_.patch b/0001-kms-nv50-Initialize-core-channel-in-nouveau_display_.patch
new file mode 100644
index 000000000..b590bb06c
--- /dev/null
+++ b/0001-kms-nv50-Initialize-core-channel-in-nouveau_display_.patch
@@ -0,0 +1,47 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Lyude Paul <lyude@redhat.com>
+Date: Mon, 11 May 2020 18:41:23 -0400
+Subject: [PATCH] kms/nv50-: Initialize core channel in
+ nouveau_display_create()
+
+We'll need the core channel initialized and ready by the time that we
+start creating modesetting objects, so that we can call the
+NV507D_GET_CAPABILITIES method to make the hardware expose it's
+modesetting capabilities for later probing.
+
+So, when loading the driver prepare the core channel from within
+nouveau_display_create(). Everywhere else, we initialize the core
+channel during resume.
+
+Signed-off-by: Lyude Paul <lyude@redhat.com>
+Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
+---
+ drivers/gpu/drm/nouveau/dispnv50/disp.c | 5 ++++-
+ 1 file changed, 4 insertions(+), 1 deletion(-)
+
+diff --git a/drivers/gpu/drm/nouveau/dispnv50/disp.c b/drivers/gpu/drm/nouveau/dispnv50/disp.c
+index 2625ed84fc44..2afd56b9887d 100644
+--- a/drivers/gpu/drm/nouveau/dispnv50/disp.c
++++ b/drivers/gpu/drm/nouveau/dispnv50/disp.c
+@@ -2373,7 +2373,8 @@ nv50_display_init(struct drm_device *dev, bool resume, bool runtime)
+ struct drm_encoder *encoder;
+ struct drm_plane *plane;
+
+- core->func->init(core);
++ if (resume || runtime)
++ core->func->init(core);
+
+ list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) {
+ if (encoder->encoder_type != DRM_MODE_ENCODER_DPMST) {
+@@ -2460,6 +2461,8 @@ nv50_display_create(struct drm_device *dev)
+ if (ret)
+ goto out;
+
++ disp->core->func->init(disp->core);
++
+ /* create crtc objects to represent the hw heads */
+ if (disp->disp->object.oclass >= GV100_DISP)
+ crtcs = nvif_rd32(&device->object, 0x610060) & 0xff;
+--
+2.26.2
+
diff --git a/0001-kms-nv50-Move-8BPC-limit-for-MST-into-nv50_mstc_get_.patch b/0001-kms-nv50-Move-8BPC-limit-for-MST-into-nv50_mstc_get_.patch
new file mode 100644
index 000000000..0a6a4cfa8
--- /dev/null
+++ b/0001-kms-nv50-Move-8BPC-limit-for-MST-into-nv50_mstc_get_.patch
@@ -0,0 +1,65 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Lyude Paul <lyude@redhat.com>
+Date: Mon, 11 May 2020 18:41:26 -0400
+Subject: [PATCH] kms/nv50-: Move 8BPC limit for MST into nv50_mstc_get_modes()
+
+This just limits the BPC for MST connectors to a maximum of 8 from
+nv50_mstc_get_modes(), instead of doing so during
+nv50_msto_atomic_check(). This doesn't introduce any functional changes
+yet (other then userspace now lying about the max bpc, but we can't
+support that yet anyway so meh). But, we'll need this in a moment so
+that we can share mode validation between SST and MST which will fix
+some real world issues.
+
+Signed-off-by: Lyude Paul <lyude@redhat.com>
+Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
+---
+ drivers/gpu/drm/nouveau/dispnv50/disp.c | 25 ++++++++++++++-----------
+ 1 file changed, 14 insertions(+), 11 deletions(-)
+
+diff --git a/drivers/gpu/drm/nouveau/dispnv50/disp.c b/drivers/gpu/drm/nouveau/dispnv50/disp.c
+index 1db4f20b8697..e92e7bf49780 100644
+--- a/drivers/gpu/drm/nouveau/dispnv50/disp.c
++++ b/drivers/gpu/drm/nouveau/dispnv50/disp.c
+@@ -908,15 +908,9 @@ nv50_msto_atomic_check(struct drm_encoder *encoder,
+ if (!state->duplicated) {
+ const int clock = crtc_state->adjusted_mode.clock;
+
+- /*
+- * XXX: Since we don't use HDR in userspace quite yet, limit
+- * the bpc to 8 to save bandwidth on the topology. In the
+- * future, we'll want to properly fix this by dynamically
+- * selecting the highest possible bpc that would fit in the
+- * topology
+- */
+- asyh->or.bpc = min(connector->display_info.bpc, 8U);
+- asyh->dp.pbn = drm_dp_calc_pbn_mode(clock, asyh->or.bpc * 3, false);
++ asyh->or.bpc = connector->display_info.bpc;
++ asyh->dp.pbn = drm_dp_calc_pbn_mode(clock, asyh->or.bpc * 3,
++ false);
+ }
+
+ slots = drm_dp_atomic_find_vcpi_slots(state, &mstm->mgr, mstc->port,
+@@ -1076,8 +1070,17 @@ nv50_mstc_get_modes(struct drm_connector *connector)
+ if (mstc->edid)
+ ret = drm_add_edid_modes(&mstc->connector, mstc->edid);
+
+- if (!mstc->connector.display_info.bpc)
+- mstc->connector.display_info.bpc = 8;
++ /*
++ * XXX: Since we don't use HDR in userspace quite yet, limit the bpc
++ * to 8 to save bandwidth on the topology. In the future, we'll want
++ * to properly fix this by dynamically selecting the highest possible
++ * bpc that would fit in the topology
++ */
++ if (connector->display_info.bpc)
++ connector->display_info.bpc =
++ clamp(connector->display_info.bpc, 6U, 8U);
++ else
++ connector->display_info.bpc = 8;
+
+ if (mstc->native)
+ drm_mode_destroy(mstc->connector.dev, mstc->native);
+--
+2.26.2
+
diff --git a/0001-kms-nv50-Probe-SOR-and-PIOR-caps-for-DP-interlacing-.patch b/0001-kms-nv50-Probe-SOR-and-PIOR-caps-for-DP-interlacing-.patch
new file mode 100644
index 000000000..e74501bef
--- /dev/null
+++ b/0001-kms-nv50-Probe-SOR-and-PIOR-caps-for-DP-interlacing-.patch
@@ -0,0 +1,439 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Lyude Paul <lyude@redhat.com>
+Date: Mon, 11 May 2020 18:41:24 -0400
+Subject: [PATCH] kms/nv50-: Probe SOR and PIOR caps for DP interlacing support
+
+Right now, we make the mistake of allowing interlacing on all
+connectors. Nvidia hardware does not always support interlacing with DP
+though, so we need to make sure that we don't allow interlaced modes to
+be set in such situations as otherwise we'll end up accidentally hanging
+the display HW.
+
+This fixes some hangs with Turing, which would be caused by attempting
+to set an interlaced mode on hardware that doesn't support it. This
+patch likely fixes other hardware hanging in the same way as well.
+
+Note that we say we probe PIOR caps, but they don't actually have any
+interlacing caps. So, the get_caps() function for PIORs just sets
+interlacing support to true.
+
+Changes since v1:
+* Actually probe caps correctly this time, both on EVO and NVDisplay.
+Changes since v2:
+* Fix probing for < GF119
+* Use vfunc table, in prep for adding more caps in the future.
+
+Signed-off-by: Lyude Paul <lyude@redhat.com>
+Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
+---
+ drivers/gpu/drm/nouveau/dispnv50/core.h | 7 ++++++
+ drivers/gpu/drm/nouveau/dispnv50/core507d.c | 15 ++++++++++++
+ drivers/gpu/drm/nouveau/dispnv50/core827d.c | 1 +
+ drivers/gpu/drm/nouveau/dispnv50/core907d.c | 1 +
+ drivers/gpu/drm/nouveau/dispnv50/core917d.c | 1 +
+ drivers/gpu/drm/nouveau/dispnv50/corec37d.c | 26 +++++++++++++++++++++
+ drivers/gpu/drm/nouveau/dispnv50/corec57d.c | 1 +
+ drivers/gpu/drm/nouveau/dispnv50/disp.c | 19 +++++++++++++--
+ drivers/gpu/drm/nouveau/dispnv50/disp.h | 1 +
+ drivers/gpu/drm/nouveau/dispnv50/pior507d.c | 8 +++++++
+ drivers/gpu/drm/nouveau/dispnv50/sor507d.c | 7 ++++++
+ drivers/gpu/drm/nouveau/dispnv50/sor907d.c | 11 +++++++++
+ drivers/gpu/drm/nouveau/dispnv50/sorc37d.c | 9 +++++++
+ drivers/gpu/drm/nouveau/nouveau_connector.c | 10 +++++++-
+ drivers/gpu/drm/nouveau/nouveau_encoder.h | 4 ++++
+ 15 files changed, 118 insertions(+), 3 deletions(-)
+
+diff --git a/drivers/gpu/drm/nouveau/dispnv50/core.h b/drivers/gpu/drm/nouveau/dispnv50/core.h
+index ff94f3f6f264..99157dc94d23 100644
+--- a/drivers/gpu/drm/nouveau/dispnv50/core.h
++++ b/drivers/gpu/drm/nouveau/dispnv50/core.h
+@@ -2,6 +2,7 @@
+ #define __NV50_KMS_CORE_H__
+ #include "disp.h"
+ #include "atom.h"
++#include <nouveau_encoder.h>
+
+ struct nv50_core {
+ const struct nv50_core_func *func;
+@@ -15,6 +16,7 @@ void nv50_core_del(struct nv50_core **);
+ struct nv50_core_func {
+ void (*init)(struct nv50_core *);
+ void (*ntfy_init)(struct nouveau_bo *, u32 offset);
++ int (*caps_init)(struct nouveau_drm *, struct nv50_disp *);
+ int (*ntfy_wait_done)(struct nouveau_bo *, u32 offset,
+ struct nvif_device *);
+ void (*update)(struct nv50_core *, u32 *interlock, bool ntfy);
+@@ -27,6 +29,9 @@ struct nv50_core_func {
+ const struct nv50_outp_func {
+ void (*ctrl)(struct nv50_core *, int or, u32 ctrl,
+ struct nv50_head_atom *);
++ /* XXX: Only used by SORs and PIORs for now */
++ void (*get_caps)(struct nv50_disp *,
++ struct nouveau_encoder *, int or);
+ } *dac, *pior, *sor;
+ };
+
+@@ -35,6 +40,7 @@ int core507d_new_(const struct nv50_core_func *, struct nouveau_drm *, s32,
+ struct nv50_core **);
+ void core507d_init(struct nv50_core *);
+ void core507d_ntfy_init(struct nouveau_bo *, u32);
++int core507d_caps_init(struct nouveau_drm *, struct nv50_disp *);
+ int core507d_ntfy_wait_done(struct nouveau_bo *, u32, struct nvif_device *);
+ void core507d_update(struct nv50_core *, u32 *, bool);
+
+@@ -51,6 +57,7 @@ extern const struct nv50_outp_func sor907d;
+ int core917d_new(struct nouveau_drm *, s32, struct nv50_core **);
+
+ int corec37d_new(struct nouveau_drm *, s32, struct nv50_core **);
++int corec37d_caps_init(struct nouveau_drm *, struct nv50_disp *);
+ int corec37d_ntfy_wait_done(struct nouveau_bo *, u32, struct nvif_device *);
+ void corec37d_update(struct nv50_core *, u32 *, bool);
+ void corec37d_wndw_owner(struct nv50_core *);
+diff --git a/drivers/gpu/drm/nouveau/dispnv50/core507d.c b/drivers/gpu/drm/nouveau/dispnv50/core507d.c
+index c5152c39c684..e341f572c269 100644
+--- a/drivers/gpu/drm/nouveau/dispnv50/core507d.c
++++ b/drivers/gpu/drm/nouveau/dispnv50/core507d.c
+@@ -62,6 +62,20 @@ core507d_ntfy_init(struct nouveau_bo *bo, u32 offset)
+ nouveau_bo_wr32(bo, offset / 4, 0x00000000);
+ }
+
++int
++core507d_caps_init(struct nouveau_drm *drm, struct nv50_disp *disp)
++{
++ u32 *push = evo_wait(&disp->core->chan, 2);
++
++ if (push) {
++ evo_mthd(push, 0x008c, 1);
++ evo_data(push, 0x0);
++ evo_kick(push, &disp->core->chan);
++ }
++
++ return 0;
++}
++
+ void
+ core507d_init(struct nv50_core *core)
+ {
+@@ -77,6 +91,7 @@ static const struct nv50_core_func
+ core507d = {
+ .init = core507d_init,
+ .ntfy_init = core507d_ntfy_init,
++ .caps_init = core507d_caps_init,
+ .ntfy_wait_done = core507d_ntfy_wait_done,
+ .update = core507d_update,
+ .head = &head507d,
+diff --git a/drivers/gpu/drm/nouveau/dispnv50/core827d.c b/drivers/gpu/drm/nouveau/dispnv50/core827d.c
+index 6123a068f836..2e0c1c536afe 100644
+--- a/drivers/gpu/drm/nouveau/dispnv50/core827d.c
++++ b/drivers/gpu/drm/nouveau/dispnv50/core827d.c
+@@ -26,6 +26,7 @@ static const struct nv50_core_func
+ core827d = {
+ .init = core507d_init,
+ .ntfy_init = core507d_ntfy_init,
++ .caps_init = core507d_caps_init,
+ .ntfy_wait_done = core507d_ntfy_wait_done,
+ .update = core507d_update,
+ .head = &head827d,
+diff --git a/drivers/gpu/drm/nouveau/dispnv50/core907d.c b/drivers/gpu/drm/nouveau/dispnv50/core907d.c
+index ef822f813435..271629832629 100644
+--- a/drivers/gpu/drm/nouveau/dispnv50/core907d.c
++++ b/drivers/gpu/drm/nouveau/dispnv50/core907d.c
+@@ -26,6 +26,7 @@ static const struct nv50_core_func
+ core907d = {
+ .init = core507d_init,
+ .ntfy_init = core507d_ntfy_init,
++ .caps_init = core507d_caps_init,
+ .ntfy_wait_done = core507d_ntfy_wait_done,
+ .update = core507d_update,
+ .head = &head907d,
+diff --git a/drivers/gpu/drm/nouveau/dispnv50/core917d.c b/drivers/gpu/drm/nouveau/dispnv50/core917d.c
+index 392338df5bfd..5cc072d4c30f 100644
+--- a/drivers/gpu/drm/nouveau/dispnv50/core917d.c
++++ b/drivers/gpu/drm/nouveau/dispnv50/core917d.c
+@@ -26,6 +26,7 @@ static const struct nv50_core_func
+ core917d = {
+ .init = core507d_init,
+ .ntfy_init = core507d_ntfy_init,
++ .caps_init = core507d_caps_init,
+ .ntfy_wait_done = core507d_ntfy_wait_done,
+ .update = core507d_update,
+ .head = &head917d,
+diff --git a/drivers/gpu/drm/nouveau/dispnv50/corec37d.c b/drivers/gpu/drm/nouveau/dispnv50/corec37d.c
+index c03cb987856b..e0c8811fb8e4 100644
+--- a/drivers/gpu/drm/nouveau/dispnv50/corec37d.c
++++ b/drivers/gpu/drm/nouveau/dispnv50/corec37d.c
+@@ -22,6 +22,7 @@
+ #include "core.h"
+ #include "head.h"
+
++#include <nvif/class.h>
+ #include <nouveau_bo.h>
+
+ #include <nvif/timer.h>
+@@ -87,6 +88,30 @@ corec37d_ntfy_init(struct nouveau_bo *bo, u32 offset)
+ nouveau_bo_wr32(bo, offset / 4 + 3, 0x00000000);
+ }
+
++int corec37d_caps_init(struct nouveau_drm *drm, struct nv50_disp *disp)
++{
++ int ret;
++
++ ret = nvif_object_init(&disp->disp->object, 0, GV100_DISP_CAPS,
++ NULL, 0, &disp->caps);
++ if (ret) {
++ NV_ERROR(drm,
++ "Failed to init notifier caps region: %d\n",
++ ret);
++ return ret;
++ }
++
++ ret = nvif_object_map(&disp->caps, NULL, 0);
++ if (ret) {
++ NV_ERROR(drm,
++ "Failed to map notifier caps region: %d\n",
++ ret);
++ return ret;
++ }
++
++ return 0;
++}
++
+ static void
+ corec37d_init(struct nv50_core *core)
+ {
+@@ -111,6 +136,7 @@ static const struct nv50_core_func
+ corec37d = {
+ .init = corec37d_init,
+ .ntfy_init = corec37d_ntfy_init,
++ .caps_init = corec37d_caps_init,
+ .ntfy_wait_done = corec37d_ntfy_wait_done,
+ .update = corec37d_update,
+ .wndw.owner = corec37d_wndw_owner,
+diff --git a/drivers/gpu/drm/nouveau/dispnv50/corec57d.c b/drivers/gpu/drm/nouveau/dispnv50/corec57d.c
+index 147adcd60937..10ba9e9e4ae6 100644
+--- a/drivers/gpu/drm/nouveau/dispnv50/corec57d.c
++++ b/drivers/gpu/drm/nouveau/dispnv50/corec57d.c
+@@ -46,6 +46,7 @@ static const struct nv50_core_func
+ corec57d = {
+ .init = corec57d_init,
+ .ntfy_init = corec37d_ntfy_init,
++ .caps_init = corec37d_caps_init,
+ .ntfy_wait_done = corec37d_ntfy_wait_done,
+ .update = corec37d_update,
+ .wndw.owner = corec37d_wndw_owner,
+diff --git a/drivers/gpu/drm/nouveau/dispnv50/disp.c b/drivers/gpu/drm/nouveau/dispnv50/disp.c
+index 2afd56b9887d..1db4f20b8697 100644
+--- a/drivers/gpu/drm/nouveau/dispnv50/disp.c
++++ b/drivers/gpu/drm/nouveau/dispnv50/disp.c
+@@ -1663,6 +1663,7 @@ nv50_sor_create(struct drm_connector *connector, struct dcb_output *dcbe)
+ struct nvkm_i2c *i2c = nvxx_i2c(&drm->client.device);
+ struct nouveau_encoder *nv_encoder;
+ struct drm_encoder *encoder;
++ struct nv50_disp *disp = nv50_disp(connector->dev);
+ int type, ret;
+
+ switch (dcbe->type) {
+@@ -1689,10 +1690,12 @@ nv50_sor_create(struct drm_connector *connector, struct dcb_output *dcbe)
+
+ drm_connector_attach_encoder(connector, encoder);
+
++ disp->core->func->sor->get_caps(disp, nv_encoder, ffs(dcbe->or) - 1);
++
+ if (dcbe->type == DCB_OUTPUT_DP) {
+- struct nv50_disp *disp = nv50_disp(encoder->dev);
+ struct nvkm_i2c_aux *aux =
+ nvkm_i2c_aux_find(i2c, dcbe->i2c_index);
++
+ if (aux) {
+ if (disp->disp->object.oclass < GF110_DISP) {
+ /* HW has no support for address-only
+@@ -1805,7 +1808,9 @@ nv50_pior_func = {
+ static int
+ nv50_pior_create(struct drm_connector *connector, struct dcb_output *dcbe)
+ {
+- struct nouveau_drm *drm = nouveau_drm(connector->dev);
++ struct drm_device *dev = connector->dev;
++ struct nouveau_drm *drm = nouveau_drm(dev);
++ struct nv50_disp *disp = nv50_disp(dev);
+ struct nvkm_i2c *i2c = nvxx_i2c(&drm->client.device);
+ struct nvkm_i2c_bus *bus = NULL;
+ struct nvkm_i2c_aux *aux = NULL;
+@@ -1844,6 +1849,9 @@ nv50_pior_create(struct drm_connector *connector, struct dcb_output *dcbe)
+ drm_encoder_helper_add(encoder, &nv50_pior_help);
+
+ drm_connector_attach_encoder(connector, encoder);
++
++ disp->core->func->pior->get_caps(disp, nv_encoder, ffs(dcbe->or) - 1);
++
+ return 0;
+ }
+
+@@ -2401,6 +2409,8 @@ nv50_display_destroy(struct drm_device *dev)
+
+ nv50_audio_component_fini(nouveau_drm(dev));
+
++ nvif_object_unmap(&disp->caps);
++ nvif_object_fini(&disp->caps);
+ nv50_core_del(&disp->core);
+
+ nouveau_bo_unmap(disp->sync);
+@@ -2462,6 +2472,11 @@ nv50_display_create(struct drm_device *dev)
+ goto out;
+
+ disp->core->func->init(disp->core);
++ if (disp->core->func->caps_init) {
++ ret = disp->core->func->caps_init(drm, disp);
++ if (ret)
++ goto out;
++ }
+
+ /* create crtc objects to represent the hw heads */
+ if (disp->disp->object.oclass >= GV100_DISP)
+diff --git a/drivers/gpu/drm/nouveau/dispnv50/disp.h b/drivers/gpu/drm/nouveau/dispnv50/disp.h
+index d54fe00ac3a3..89c3b38c32a5 100644
+--- a/drivers/gpu/drm/nouveau/dispnv50/disp.h
++++ b/drivers/gpu/drm/nouveau/dispnv50/disp.h
+@@ -9,6 +9,7 @@ struct nv50_msto;
+ struct nv50_disp {
+ struct nvif_disp *disp;
+ struct nv50_core *core;
++ struct nvif_object caps;
+
+ #define NV50_DISP_SYNC(c, o) ((c) * 0x040 + (o))
+ #define NV50_DISP_CORE_NTFY NV50_DISP_SYNC(0 , 0x00)
+diff --git a/drivers/gpu/drm/nouveau/dispnv50/pior507d.c b/drivers/gpu/drm/nouveau/dispnv50/pior507d.c
+index d2bac6a341dc..45d8ce7d2c28 100644
+--- a/drivers/gpu/drm/nouveau/dispnv50/pior507d.c
++++ b/drivers/gpu/drm/nouveau/dispnv50/pior507d.c
+@@ -38,7 +38,15 @@ pior507d_ctrl(struct nv50_core *core, int or, u32 ctrl,
+ }
+ }
+
++static void
++pior507d_get_caps(struct nv50_disp *disp, struct nouveau_encoder *outp,
++ int or)
++{
++ outp->caps.dp_interlace = true;
++}
++
+ const struct nv50_outp_func
+ pior507d = {
+ .ctrl = pior507d_ctrl,
++ .get_caps = pior507d_get_caps,
+ };
+diff --git a/drivers/gpu/drm/nouveau/dispnv50/sor507d.c b/drivers/gpu/drm/nouveau/dispnv50/sor507d.c
+index 5222fe6a9b21..9a59fa7da00d 100644
+--- a/drivers/gpu/drm/nouveau/dispnv50/sor507d.c
++++ b/drivers/gpu/drm/nouveau/dispnv50/sor507d.c
+@@ -38,7 +38,14 @@ sor507d_ctrl(struct nv50_core *core, int or, u32 ctrl,
+ }
+ }
+
++static void
++sor507d_get_caps(struct nv50_disp *core, struct nouveau_encoder *outp, int or)
++{
++ outp->caps.dp_interlace = true;
++}
++
+ const struct nv50_outp_func
+ sor507d = {
+ .ctrl = sor507d_ctrl,
++ .get_caps = sor507d_get_caps,
+ };
+diff --git a/drivers/gpu/drm/nouveau/dispnv50/sor907d.c b/drivers/gpu/drm/nouveau/dispnv50/sor907d.c
+index b0314ec11fb3..9577ccf1c809 100644
+--- a/drivers/gpu/drm/nouveau/dispnv50/sor907d.c
++++ b/drivers/gpu/drm/nouveau/dispnv50/sor907d.c
+@@ -21,6 +21,7 @@
+ */
+ #include "core.h"
+
++#include <nouveau_bo.h>
+ #include <nvif/class.h>
+
+ static void
+@@ -35,7 +36,17 @@ sor907d_ctrl(struct nv50_core *core, int or, u32 ctrl,
+ }
+ }
+
++static void
++sor907d_get_caps(struct nv50_disp *disp, struct nouveau_encoder *outp, int or)
++{
++ const int off = or * 2;
++ u32 tmp = nouveau_bo_rd32(disp->sync, 0x000014 + off);
++
++ outp->caps.dp_interlace = !!(tmp & 0x04000000);
++}
++
+ const struct nv50_outp_func
+ sor907d = {
+ .ctrl = sor907d_ctrl,
++ .get_caps = sor907d_get_caps,
+ };
+diff --git a/drivers/gpu/drm/nouveau/dispnv50/sorc37d.c b/drivers/gpu/drm/nouveau/dispnv50/sorc37d.c
+index dff059241c5d..c86ca955fdcd 100644
+--- a/drivers/gpu/drm/nouveau/dispnv50/sorc37d.c
++++ b/drivers/gpu/drm/nouveau/dispnv50/sorc37d.c
+@@ -33,7 +33,16 @@ sorc37d_ctrl(struct nv50_core *core, int or, u32 ctrl,
+ }
+ }
+
++static void
++sorc37d_get_caps(struct nv50_disp *disp, struct nouveau_encoder *outp, int or)
++{
++ u32 tmp = nvif_rd32(&disp->caps, 0x000144 + (or * 8));
++
++ outp->caps.dp_interlace = !!(tmp & 0x04000000);
++}
++
+ const struct nv50_outp_func
+ sorc37d = {
+ .ctrl = sorc37d_ctrl,
++ .get_caps = sorc37d_get_caps,
+ };
+diff --git a/drivers/gpu/drm/nouveau/nouveau_connector.c b/drivers/gpu/drm/nouveau/nouveau_connector.c
+index 9a9a7f5003d3..6dae00da5d7e 100644
+--- a/drivers/gpu/drm/nouveau/nouveau_connector.c
++++ b/drivers/gpu/drm/nouveau/nouveau_connector.c
+@@ -509,7 +509,11 @@ nouveau_connector_set_encoder(struct drm_connector *connector,
+ nv_connector->detected_encoder = nv_encoder;
+
+ if (drm->client.device.info.family >= NV_DEVICE_INFO_V0_TESLA) {
+- connector->interlace_allowed = true;
++ if (nv_encoder->dcb->type == DCB_OUTPUT_DP)
++ connector->interlace_allowed =
++ nv_encoder->caps.dp_interlace;
++ else
++ connector->interlace_allowed = true;
+ connector->doublescan_allowed = true;
+ } else
+ if (nv_encoder->dcb->type == DCB_OUTPUT_LVDS ||
+@@ -1060,6 +1064,10 @@ nouveau_connector_mode_valid(struct drm_connector *connector,
+ case DCB_OUTPUT_TV:
+ return get_slave_funcs(encoder)->mode_valid(encoder, mode);
+ case DCB_OUTPUT_DP:
++ if (mode->flags & DRM_MODE_FLAG_INTERLACE &&
++ !nv_encoder->caps.dp_interlace)
++ return MODE_NO_INTERLACE;
++
+ max_clock = nv_encoder->dp.link_nr;
+ max_clock *= nv_encoder->dp.link_bw;
+ clock = clock * (connector->display_info.bpc * 3) / 10;
+diff --git a/drivers/gpu/drm/nouveau/nouveau_encoder.h b/drivers/gpu/drm/nouveau/nouveau_encoder.h
+index 3517f920bf89..3217f587eceb 100644
+--- a/drivers/gpu/drm/nouveau/nouveau_encoder.h
++++ b/drivers/gpu/drm/nouveau/nouveau_encoder.h
+@@ -66,6 +66,10 @@ struct nouveau_encoder {
+ } dp;
+ };
+
++ struct {
++ bool dp_interlace : 1;
++ } caps;
++
+ void (*enc_save)(struct drm_encoder *encoder);
+ void (*enc_restore)(struct drm_encoder *encoder);
+ void (*update)(struct nouveau_encoder *, u8 head,
+--
+2.26.2
+
diff --git a/0001-kms-nv50-Share-DP-SST-mode_valid-handling-with-MST.patch b/0001-kms-nv50-Share-DP-SST-mode_valid-handling-with-MST.patch
new file mode 100644
index 000000000..c14aed7ea
--- /dev/null
+++ b/0001-kms-nv50-Share-DP-SST-mode_valid-handling-with-MST.patch
@@ -0,0 +1,209 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Lyude Paul <lyude@redhat.com>
+Date: Mon, 11 May 2020 18:41:27 -0400
+Subject: [PATCH] kms/nv50-: Share DP SST mode_valid() handling with MST
+
+Currently, the nv50_mstc_mode_valid() function is happy to take any and
+all modes, even the ones we can't actually support sometimes like
+interlaced modes.
+
+Luckily, the only difference between the mode validation that needs to
+be performed for MST vs. SST is that eventually we'll need to check the
+minimum PBN against the MSTB's full PBN capabilities (remember-we don't
+care about the current bw state here). Otherwise, all of the other code
+can be shared.
+
+So, we move all of the common mode validation in
+nouveau_connector_mode_valid() into a separate helper,
+nv50_dp_mode_valid(), and use that from both nv50_mstc_mode_valid() and
+nouveau_connector_mode_valid(). Note that we allow for returning the
+calculated clock that nv50_dp_mode_valid() came up with, since we'll
+eventually want to use that for PBN calculation in
+nv50_mstc_mode_valid().
+
+Signed-off-by: Lyude Paul <lyude@redhat.com>
+Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
+---
+ drivers/gpu/drm/nouveau/dispnv50/disp.c | 9 +++-
+ drivers/gpu/drm/nouveau/nouveau_connector.c | 46 ++++++++++++---------
+ drivers/gpu/drm/nouveau/nouveau_connector.h | 5 +++
+ drivers/gpu/drm/nouveau/nouveau_dp.c | 31 ++++++++++++++
+ drivers/gpu/drm/nouveau/nouveau_encoder.h | 4 ++
+ 5 files changed, 75 insertions(+), 20 deletions(-)
+
+diff --git a/drivers/gpu/drm/nouveau/dispnv50/disp.c b/drivers/gpu/drm/nouveau/dispnv50/disp.c
+index e92e7bf49780..d5d69532f3c5 100644
+--- a/drivers/gpu/drm/nouveau/dispnv50/disp.c
++++ b/drivers/gpu/drm/nouveau/dispnv50/disp.c
+@@ -1056,7 +1056,14 @@ static enum drm_mode_status
+ nv50_mstc_mode_valid(struct drm_connector *connector,
+ struct drm_display_mode *mode)
+ {
+- return MODE_OK;
++ struct nv50_mstc *mstc = nv50_mstc(connector);
++ struct nouveau_encoder *outp = mstc->mstm->outp;
++
++ /* TODO: calculate the PBN from the dotclock and validate against the
++ * MSTB's max possible PBN
++ */
++
++ return nv50_dp_mode_valid(connector, outp, mode, NULL);
+ }
+
+ static int
+diff --git a/drivers/gpu/drm/nouveau/nouveau_connector.c b/drivers/gpu/drm/nouveau/nouveau_connector.c
+index 6dae00da5d7e..1b383ae0248f 100644
+--- a/drivers/gpu/drm/nouveau/nouveau_connector.c
++++ b/drivers/gpu/drm/nouveau/nouveau_connector.c
+@@ -38,6 +38,7 @@
+ #include "nouveau_reg.h"
+ #include "nouveau_drv.h"
+ #include "dispnv04/hw.h"
++#include "dispnv50/disp.h"
+ #include "nouveau_acpi.h"
+
+ #include "nouveau_display.h"
+@@ -1033,6 +1034,29 @@ get_tmds_link_bandwidth(struct drm_connector *connector)
+ return 112000 * duallink_scale;
+ }
+
++enum drm_mode_status
++nouveau_conn_mode_clock_valid(const struct drm_display_mode *mode,
++ const unsigned min_clock,
++ const unsigned max_clock,
++ unsigned int *clock_out)
++{
++ unsigned int clock = mode->clock;
++
++ if ((mode->flags & DRM_MODE_FLAG_3D_MASK) ==
++ DRM_MODE_FLAG_3D_FRAME_PACKING)
++ clock *= 2;
++
++ if (clock < min_clock)
++ return MODE_CLOCK_LOW;
++ if (clock > max_clock)
++ return MODE_CLOCK_HIGH;
++
++ if (clock_out)
++ *clock_out = clock;
++
++ return MODE_OK;
++}
++
+ static enum drm_mode_status
+ nouveau_connector_mode_valid(struct drm_connector *connector,
+ struct drm_display_mode *mode)
+@@ -1041,7 +1065,6 @@ nouveau_connector_mode_valid(struct drm_connector *connector,
+ struct nouveau_encoder *nv_encoder = nv_connector->detected_encoder;
+ struct drm_encoder *encoder = to_drm_encoder(nv_encoder);
+ unsigned min_clock = 25000, max_clock = min_clock;
+- unsigned clock = mode->clock;
+
+ switch (nv_encoder->dcb->type) {
+ case DCB_OUTPUT_LVDS:
+@@ -1064,29 +1087,14 @@ nouveau_connector_mode_valid(struct drm_connector *connector,
+ case DCB_OUTPUT_TV:
+ return get_slave_funcs(encoder)->mode_valid(encoder, mode);
+ case DCB_OUTPUT_DP:
+- if (mode->flags & DRM_MODE_FLAG_INTERLACE &&
+- !nv_encoder->caps.dp_interlace)
+- return MODE_NO_INTERLACE;
+-
+- max_clock = nv_encoder->dp.link_nr;
+- max_clock *= nv_encoder->dp.link_bw;
+- clock = clock * (connector->display_info.bpc * 3) / 10;
+- break;
++ return nv50_dp_mode_valid(connector, nv_encoder, mode, NULL);
+ default:
+ BUG();
+ return MODE_BAD;
+ }
+
+- if ((mode->flags & DRM_MODE_FLAG_3D_MASK) == DRM_MODE_FLAG_3D_FRAME_PACKING)
+- clock *= 2;
+-
+- if (clock < min_clock)
+- return MODE_CLOCK_LOW;
+-
+- if (clock > max_clock)
+- return MODE_CLOCK_HIGH;
+-
+- return MODE_OK;
++ return nouveau_conn_mode_clock_valid(mode, min_clock, max_clock,
++ NULL);
+ }
+
+ static struct drm_encoder *
+diff --git a/drivers/gpu/drm/nouveau/nouveau_connector.h b/drivers/gpu/drm/nouveau/nouveau_connector.h
+index de84fb4708c7..9e062c7adec8 100644
+--- a/drivers/gpu/drm/nouveau/nouveau_connector.h
++++ b/drivers/gpu/drm/nouveau/nouveau_connector.h
+@@ -195,6 +195,11 @@ int nouveau_conn_atomic_get_property(struct drm_connector *,
+ const struct drm_connector_state *,
+ struct drm_property *, u64 *);
+ struct drm_display_mode *nouveau_conn_native_mode(struct drm_connector *);
++enum drm_mode_status
++nouveau_conn_mode_clock_valid(const struct drm_display_mode *,
++ const unsigned min_clock,
++ const unsigned max_clock,
++ unsigned *clock);
+
+ #ifdef CONFIG_DRM_NOUVEAU_BACKLIGHT
+ extern int nouveau_backlight_init(struct drm_connector *);
+diff --git a/drivers/gpu/drm/nouveau/nouveau_dp.c b/drivers/gpu/drm/nouveau/nouveau_dp.c
+index 2674f1587457..8a0f7994e1ae 100644
+--- a/drivers/gpu/drm/nouveau/nouveau_dp.c
++++ b/drivers/gpu/drm/nouveau/nouveau_dp.c
+@@ -98,3 +98,34 @@ nouveau_dp_detect(struct nouveau_encoder *nv_encoder)
+ return NOUVEAU_DP_SST;
+ return ret;
+ }
++
++/* TODO:
++ * - Use the minimum possible BPC here, once we add support for the max bpc
++ * property.
++ * - Validate the mode against downstream port caps (see
++ * drm_dp_downstream_max_clock())
++ * - Validate against the DP caps advertised by the GPU (we don't check these
++ * yet)
++ */
++enum drm_mode_status
++nv50_dp_mode_valid(struct drm_connector *connector,
++ struct nouveau_encoder *outp,
++ const struct drm_display_mode *mode,
++ unsigned *out_clock)
++{
++ const unsigned min_clock = 25000;
++ unsigned max_clock, clock;
++ enum drm_mode_status ret;
++
++ if (mode->flags & DRM_MODE_FLAG_INTERLACE && !outp->caps.dp_interlace)
++ return MODE_NO_INTERLACE;
++
++ max_clock = outp->dp.link_nr * outp->dp.link_bw;
++ clock = mode->clock * (connector->display_info.bpc * 3) / 10;
++
++ ret = nouveau_conn_mode_clock_valid(mode, min_clock, max_clock,
++ &clock);
++ if (out_clock)
++ *out_clock = clock;
++ return ret;
++}
+diff --git a/drivers/gpu/drm/nouveau/nouveau_encoder.h b/drivers/gpu/drm/nouveau/nouveau_encoder.h
+index 3217f587eceb..de51733b0476 100644
+--- a/drivers/gpu/drm/nouveau/nouveau_encoder.h
++++ b/drivers/gpu/drm/nouveau/nouveau_encoder.h
+@@ -104,6 +104,10 @@ enum nouveau_dp_status {
+ };
+
+ int nouveau_dp_detect(struct nouveau_encoder *);
++enum drm_mode_status nv50_dp_mode_valid(struct drm_connector *,
++ struct nouveau_encoder *,
++ const struct drm_display_mode *,
++ unsigned *clock);
+
+ struct nouveau_connector *
+ nouveau_encoder_connector_get(struct nouveau_encoder *encoder);
+--
+2.26.2
+
diff --git a/0001-mmu-Remove-unneeded-semicolon.patch b/0001-mmu-Remove-unneeded-semicolon.patch
new file mode 100644
index 000000000..3931ff586
--- /dev/null
+++ b/0001-mmu-Remove-unneeded-semicolon.patch
@@ -0,0 +1,47 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Zheng Bin <zhengbin13@huawei.com>
+Date: Fri, 24 Apr 2020 15:36:01 +0800
+Subject: [PATCH] mmu: Remove unneeded semicolon
+
+Fixes coccicheck warning:
+
+drivers/gpu/drivers/gpu/drm/nouveau/nvkm/subdev/mmu/vmm.h:307:2-3: Unneeded semicolon
+drivers/gpu/drivers/gpu/drm/nouveau/nvkm/subdev/mmu/vmm.c:583:2-3: Unneeded semicolon
+
+Reported-by: Hulk Robot <hulkci@huawei.com>
+Signed-off-by: Zheng Bin <zhengbin13@huawei.com>
+Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
+---
+ drivers/gpu/drm/nouveau/nvkm/subdev/mmu/vmm.c | 2 +-
+ drivers/gpu/drm/nouveau/nvkm/subdev/mmu/vmm.h | 2 +-
+ 2 files changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/mmu/vmm.c b/drivers/gpu/drm/nouveau/nvkm/subdev/mmu/vmm.c
+index 41640e0584ac..199f94e15c5f 100644
+--- a/drivers/gpu/drm/nouveau/nvkm/subdev/mmu/vmm.c
++++ b/drivers/gpu/drm/nouveau/nvkm/subdev/mmu/vmm.c
+@@ -580,7 +580,7 @@ nvkm_vmm_iter(struct nvkm_vmm *vmm, const struct nvkm_vmm_page *page,
+ it.pte[it.lvl]++;
+ }
+ }
+- };
++ }
+
+ nvkm_vmm_flush(&it);
+ return ~0ULL;
+diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/mmu/vmm.h b/drivers/gpu/drm/nouveau/nvkm/subdev/mmu/vmm.h
+index 5e55ecbd8005..d3f8f916d0db 100644
+--- a/drivers/gpu/drm/nouveau/nvkm/subdev/mmu/vmm.h
++++ b/drivers/gpu/drm/nouveau/nvkm/subdev/mmu/vmm.h
+@@ -304,7 +304,7 @@ int tu102_vmm_new(struct nvkm_mmu *, bool, u64, u64, void *, u32,
+ FILL(VMM, PT, PTEI, _ptes, MAP, _addr); \
+ PTEI += _ptes; \
+ PTEN -= _ptes; \
+- }; \
++ } \
+ nvkm_done((PT)->memory); \
+ } while(0)
+
+--
+2.26.2
+
diff --git a/0001-platform-x86-sony-laptop-SNC-calls-should-handle-BUF.patch b/0001-platform-x86-sony-laptop-SNC-calls-should-handle-BUF.patch
new file mode 100644
index 000000000..743e38804
--- /dev/null
+++ b/0001-platform-x86-sony-laptop-SNC-calls-should-handle-BUF.patch
@@ -0,0 +1,116 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Mattia Dongili <malattia@linux.it>
+Date: Fri, 8 May 2020 09:14:04 +0900
+Subject: [PATCH] platform/x86: sony-laptop: SNC calls should handle BUFFER
+ types
+
+After commit 6d232b29cfce ("ACPICA: Dispatcher: always generate buffer
+objects for ASL create_field() operator") ACPICA creates buffers even
+when new fields are small enough to fit into an integer.
+Many SNC calls counted on the old behaviour.
+Since sony-laptop already handles the INTEGER/BUFFER case in
+sony_nc_buffer_call, switch sony_nc_int_call to use its more generic
+function instead.
+
+Fixes: 6d232b29cfce ("ACPICA: Dispatcher: always generate buffer objects for ASL create_field() operator")
+Reported-by: Dominik Mierzejewski <dominik@greysector.net>
+Bugzilla: https://bugzilla.kernel.org/show_bug.cgi?id=207491
+Reported-by: William Bader <williambader@hotmail.com>
+Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1830150
+Signed-off-by: Mattia Dongili <malattia@linux.it>
+Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
+Upstream Status: linux-platform-drivers-x86/for-next
+(cherry picked from commit 47828d22539f76c8c9dcf2a55f18ea3a8039d8ef)
+---
+ drivers/platform/x86/sony-laptop.c | 53 +++++++++++++-----------------
+ 1 file changed, 23 insertions(+), 30 deletions(-)
+
+diff --git a/drivers/platform/x86/sony-laptop.c b/drivers/platform/x86/sony-laptop.c
+index 51309f7ceede..6932cd11e660 100644
+--- a/drivers/platform/x86/sony-laptop.c
++++ b/drivers/platform/x86/sony-laptop.c
+@@ -757,33 +757,6 @@ static union acpi_object *__call_snc_method(acpi_handle handle, char *method,
+ return result;
+ }
+
+-static int sony_nc_int_call(acpi_handle handle, char *name, int *value,
+- int *result)
+-{
+- union acpi_object *object = NULL;
+- if (value) {
+- u64 v = *value;
+- object = __call_snc_method(handle, name, &v);
+- } else
+- object = __call_snc_method(handle, name, NULL);
+-
+- if (!object)
+- return -EINVAL;
+-
+- if (object->type != ACPI_TYPE_INTEGER) {
+- pr_warn("Invalid acpi_object: expected 0x%x got 0x%x\n",
+- ACPI_TYPE_INTEGER, object->type);
+- kfree(object);
+- return -EINVAL;
+- }
+-
+- if (result)
+- *result = object->integer.value;
+-
+- kfree(object);
+- return 0;
+-}
+-
+ #define MIN(a, b) (a > b ? b : a)
+ static int sony_nc_buffer_call(acpi_handle handle, char *name, u64 *value,
+ void *buffer, size_t buflen)
+@@ -795,17 +768,20 @@ static int sony_nc_buffer_call(acpi_handle handle, char *name, u64 *value,
+ if (!object)
+ return -EINVAL;
+
+- if (object->type == ACPI_TYPE_BUFFER) {
++ if (!buffer) {
++ /* do nothing */
++ } else if (object->type == ACPI_TYPE_BUFFER) {
+ len = MIN(buflen, object->buffer.length);
++ memset(buffer, 0, buflen);
+ memcpy(buffer, object->buffer.pointer, len);
+
+ } else if (object->type == ACPI_TYPE_INTEGER) {
+ len = MIN(buflen, sizeof(object->integer.value));
++ memset(buffer, 0, buflen);
+ memcpy(buffer, &object->integer.value, len);
+
+ } else {
+- pr_warn("Invalid acpi_object: expected 0x%x got 0x%x\n",
+- ACPI_TYPE_BUFFER, object->type);
++ pr_warn("Unexpected acpi_object: 0x%x\n", object->type);
+ ret = -EINVAL;
+ }
+
+@@ -813,6 +789,23 @@ static int sony_nc_buffer_call(acpi_handle handle, char *name, u64 *value,
+ return ret;
+ }
+
++static int sony_nc_int_call(acpi_handle handle, char *name, int *value, int
++ *result)
++{
++ int ret;
++
++ if (value) {
++ u64 v = *value;
++
++ ret = sony_nc_buffer_call(handle, name, &v, result,
++ sizeof(*result));
++ } else {
++ ret = sony_nc_buffer_call(handle, name, NULL, result,
++ sizeof(*result));
++ }
++ return ret;
++}
++
+ struct sony_nc_handles {
+ u16 cap[0x10];
+ struct device_attribute devattr;
+--
+2.26.2
+
diff --git a/0001-virt-vbox-Add-a-few-new-vmmdev-request-types-to-the-.patch b/0001-virt-vbox-Add-a-few-new-vmmdev-request-types-to-the-.patch
new file mode 100644
index 000000000..92c93e835
--- /dev/null
+++ b/0001-virt-vbox-Add-a-few-new-vmmdev-request-types-to-the-.patch
@@ -0,0 +1,58 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Hans de Goede <hdegoede@redhat.com>
+Date: Tue, 19 May 2020 11:05:40 +0200
+Subject: [PATCH] virt: vbox: Add a few new vmmdev request types to the
+ userspace whitelist
+
+Upstream VirtualBox has defined and is using a few new request types for
+vmmdev requests passed through /dev/vboxguest to the hypervisor.
+
+Add the defines for these to vbox_vmmdev_types.h and add add them to the
+whitelists of vmmdev requests which userspace is allowed to make.
+
+BugLink: https://bugzilla.redhat.com/show_bug.cgi?id=1789545
+Signed-off-by: Hans de Goede <hdegoede@redhat.com>
+Upstream Status: https://lore.kernel.org/lkml/20200520195440.38759-1-hdegoede@redhat.com/
+---
+ drivers/virt/vboxguest/vboxguest_core.c | 2 ++
+ include/uapi/linux/vbox_vmmdev_types.h | 3 +++
+ 2 files changed, 5 insertions(+)
+
+diff --git a/drivers/virt/vboxguest/vboxguest_core.c b/drivers/virt/vboxguest/vboxguest_core.c
+index 4f1addaa3f6f..ffd76b949276 100644
+--- a/drivers/virt/vboxguest/vboxguest_core.c
++++ b/drivers/virt/vboxguest/vboxguest_core.c
+@@ -1299,7 +1299,9 @@ static int vbg_req_allowed(struct vbg_dev *gdev, struct vbg_session *session,
+ case VMMDEVREQ_VIDEO_ACCEL_ENABLE:
+ case VMMDEVREQ_VIDEO_ACCEL_FLUSH:
+ case VMMDEVREQ_VIDEO_SET_VISIBLE_REGION:
++ case VMMDEVREQ_VIDEO_UPDATE_MONITOR_POSITIONS:
+ case VMMDEVREQ_GET_DISPLAY_CHANGE_REQEX:
++ case VMMDEVREQ_GET_DISPLAY_CHANGE_REQ_MULTI:
+ case VMMDEVREQ_GET_SEAMLESS_CHANGE_REQ:
+ case VMMDEVREQ_GET_VRDPCHANGE_REQ:
+ case VMMDEVREQ_LOG_STRING:
+diff --git a/include/uapi/linux/vbox_vmmdev_types.h b/include/uapi/linux/vbox_vmmdev_types.h
+index c27289fd619a..f8a8d6b3c521 100644
+--- a/include/uapi/linux/vbox_vmmdev_types.h
++++ b/include/uapi/linux/vbox_vmmdev_types.h
+@@ -63,6 +63,7 @@ enum vmmdev_request_type {
+ VMMDEVREQ_SET_GUEST_CAPABILITIES = 56,
+ VMMDEVREQ_VIDEMODE_SUPPORTED2 = 57, /* since version 3.2.0 */
+ VMMDEVREQ_GET_DISPLAY_CHANGE_REQEX = 80, /* since version 4.2.4 */
++ VMMDEVREQ_GET_DISPLAY_CHANGE_REQ_MULTI = 81,
+ VMMDEVREQ_HGCM_CONNECT = 60,
+ VMMDEVREQ_HGCM_DISCONNECT = 61,
+ VMMDEVREQ_HGCM_CALL32 = 62,
+@@ -92,6 +93,8 @@ enum vmmdev_request_type {
+ VMMDEVREQ_WRITE_COREDUMP = 218,
+ VMMDEVREQ_GUEST_HEARTBEAT = 219,
+ VMMDEVREQ_HEARTBEAT_CONFIGURE = 220,
++ VMMDEVREQ_NT_BUG_CHECK = 221,
++ VMMDEVREQ_VIDEO_UPDATE_MONITOR_POSITIONS = 222,
+ /* Ensure the enum is a 32 bit data-type */
+ VMMDEVREQ_SIZEHACK = 0x7fffffff
+ };
+--
+2.26.2
+
diff --git a/0001-virt-vbox-Add-support-for-the-new-VBG_IOCTL_ACQUIRE_.patch b/0001-virt-vbox-Add-support-for-the-new-VBG_IOCTL_ACQUIRE_.patch
new file mode 100644
index 000000000..c001fe5d4
--- /dev/null
+++ b/0001-virt-vbox-Add-support-for-the-new-VBG_IOCTL_ACQUIRE_.patch
@@ -0,0 +1,320 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Hans de Goede <hdegoede@redhat.com>
+Date: Tue, 19 May 2020 18:04:30 +0200
+Subject: [PATCH] virt: vbox: Add support for the new
+ VBG_IOCTL_ACQUIRE_GUEST_CAPABILITIES ioctl
+
+Add support for the new VBG_IOCTL_ACQUIRE_GUEST_CAPABILITIES ioctl, this
+is necessary for automatic resizing of the guest resolution to match the
+VM-window size to work with the new VMSVGA virtual GPU which is now the
+new default in VirtualBox.
+
+BugLink: https://bugzilla.redhat.com/show_bug.cgi?id=1789545
+Signed-off-by: Hans de Goede <hdegoede@redhat.com>
+Upstream Status: https://lore.kernel.org/lkml/20200520195440.38759-1-hdegoede@redhat.com/
+---
+ drivers/virt/vboxguest/vboxguest_core.c | 163 +++++++++++++++++++++++-
+ drivers/virt/vboxguest/vboxguest_core.h | 14 ++
+ include/uapi/linux/vboxguest.h | 24 ++++
+ 3 files changed, 200 insertions(+), 1 deletion(-)
+
+diff --git a/drivers/virt/vboxguest/vboxguest_core.c b/drivers/virt/vboxguest/vboxguest_core.c
+index 15b3cb618c6e..4f1addaa3f6f 100644
+--- a/drivers/virt/vboxguest/vboxguest_core.c
++++ b/drivers/virt/vboxguest/vboxguest_core.c
+@@ -679,7 +679,7 @@ static int vbg_set_host_capabilities(struct vbg_dev *gdev,
+
+ WARN_ON(!mutex_is_locked(&gdev->session_mutex));
+
+- caps = gdev->set_guest_caps_tracker.mask;
++ caps = gdev->acquired_guest_caps | gdev->set_guest_caps_tracker.mask;
+
+ if (gdev->guest_caps_host == caps)
+ return 0;
+@@ -703,6 +703,113 @@ static int vbg_set_host_capabilities(struct vbg_dev *gdev,
+ return vbg_status_code_to_errno(rc);
+ }
+
++/**
++ * Acquire (get exclusive access) guest capabilities for a session.
++ * Takes the session mutex.
++ * Return: 0 or negative errno value.
++ * @gdev: The Guest extension device.
++ * @session: The session.
++ * @flags: Flags (VBGL_IOC_AGC_FLAGS_XXX).
++ * @or_mask: The capabilities to add.
++ * @not_mask: The capabilities to remove.
++ * @session_termination: Set if we're called by the session cleanup code.
++ * This tweaks the error handling so we perform
++ * proper session cleanup even if the host
++ * misbehaves.
++ */
++static int vbg_acquire_session_capabilities(struct vbg_dev *gdev,
++ struct vbg_session *session,
++ u32 or_mask, u32 not_mask,
++ u32 flags, bool session_termination)
++{
++ unsigned long irqflags;
++ bool wakeup = false;
++ int ret = 0;
++
++ mutex_lock(&gdev->session_mutex);
++
++ if (gdev->set_guest_caps_tracker.mask & or_mask) {
++ vbg_err("%s error: cannot acquire caps which are currently set\n",
++ __func__);
++ ret = -EINVAL;
++ goto out;
++ }
++
++ /*
++ * Mark any caps in the or_mask as now being in acquire-mode. Note
++ * once caps are in acquire_mode they always stay in this mode.
++ * This impacts event handling, so we take the event-lock.
++ */
++ spin_lock_irqsave(&gdev->event_spinlock, irqflags);
++ gdev->acquire_mode_guest_caps |= or_mask;
++ spin_unlock_irqrestore(&gdev->event_spinlock, irqflags);
++
++ /* If we only have to switch the caps to acquire mode, we're done. */
++ if (flags & VBGL_IOC_AGC_FLAGS_CONFIG_ACQUIRE_MODE)
++ goto out;
++
++ not_mask &= ~or_mask; /* or_mask takes priority over not_mask */
++ not_mask &= session->acquired_guest_caps;
++ or_mask &= ~session->acquired_guest_caps;
++
++ if (or_mask == 0 && not_mask == 0)
++ goto out;
++
++ if (gdev->acquired_guest_caps & or_mask) {
++ ret = -EBUSY;
++ goto out;
++ }
++
++ gdev->acquired_guest_caps |= or_mask;
++ gdev->acquired_guest_caps &= ~not_mask;
++ /* session->acquired_guest_caps impacts event handling, take the lock */
++ spin_lock_irqsave(&gdev->event_spinlock, irqflags);
++ session->acquired_guest_caps |= or_mask;
++ session->acquired_guest_caps &= ~not_mask;
++ spin_unlock_irqrestore(&gdev->event_spinlock, irqflags);
++
++ ret = vbg_set_host_capabilities(gdev, session, session_termination);
++ /* Roll back on failure, unless it's session termination time. */
++ if (ret < 0 && !session_termination) {
++ gdev->acquired_guest_caps &= ~or_mask;
++ gdev->acquired_guest_caps |= not_mask;
++ spin_lock_irqsave(&gdev->event_spinlock, irqflags);
++ session->acquired_guest_caps &= ~or_mask;
++ session->acquired_guest_caps |= not_mask;
++ spin_unlock_irqrestore(&gdev->event_spinlock, irqflags);
++ }
++
++ /*
++ * If we added a capability, check if that means some other thread in
++ * our session should be unblocked because there are events pending
++ * (the result of vbg_get_allowed_event_mask_for_session() may change).
++ *
++ * HACK ALERT! When the seamless support capability is added we generate
++ * a seamless change event so that the ring-3 client can sync with
++ * the seamless state.
++ */
++ if (ret == 0 && or_mask != 0) {
++ spin_lock_irqsave(&gdev->event_spinlock, irqflags);
++
++ if (or_mask & VMMDEV_GUEST_SUPPORTS_SEAMLESS)
++ gdev->pending_events |=
++ VMMDEV_EVENT_SEAMLESS_MODE_CHANGE_REQUEST;
++
++ if (gdev->pending_events)
++ wakeup = true;
++
++ spin_unlock_irqrestore(&gdev->event_spinlock, irqflags);
++
++ if (wakeup)
++ wake_up(&gdev->event_wq);
++ }
++
++out:
++ mutex_unlock(&gdev->session_mutex);
++
++ return ret;
++}
++
+ /**
+ * Sets the guest capabilities for a session. Takes the session spinlock.
+ * Return: 0 or negative errno value.
+@@ -725,6 +832,13 @@ static int vbg_set_session_capabilities(struct vbg_dev *gdev,
+
+ mutex_lock(&gdev->session_mutex);
+
++ if (gdev->acquire_mode_guest_caps & or_mask) {
++ vbg_err("%s error: cannot set caps which are in acquire_mode\n",
++ __func__);
++ ret = -EBUSY;
++ goto out;
++ }
++
+ /* Apply the changes to the session mask. */
+ previous = session->set_guest_caps;
+ session->set_guest_caps |= or_mask;
+@@ -962,6 +1076,7 @@ void vbg_core_close_session(struct vbg_session *session)
+ struct vbg_dev *gdev = session->gdev;
+ int i, rc;
+
++ vbg_acquire_session_capabilities(gdev, session, 0, U32_MAX, 0, true);
+ vbg_set_session_capabilities(gdev, session, 0, U32_MAX, true);
+ vbg_set_session_event_filter(gdev, session, 0, U32_MAX, true);
+
+@@ -1019,6 +1134,25 @@ static int vbg_ioctl_driver_version_info(
+ return 0;
+ }
+
++/* Must be called with the event_lock held */
++static u32 vbg_get_allowed_event_mask_for_session(struct vbg_dev *gdev,
++ struct vbg_session *session)
++{
++ u32 acquire_mode_caps = gdev->acquire_mode_guest_caps;
++ u32 session_acquired_caps = session->acquired_guest_caps;
++ u32 allowed_events = VMMDEV_EVENT_VALID_EVENT_MASK;
++
++ if ((acquire_mode_caps & VMMDEV_GUEST_SUPPORTS_GRAPHICS) &&
++ !(session_acquired_caps & VMMDEV_GUEST_SUPPORTS_GRAPHICS))
++ allowed_events &= ~VMMDEV_EVENT_DISPLAY_CHANGE_REQUEST;
++
++ if ((acquire_mode_caps & VMMDEV_GUEST_SUPPORTS_SEAMLESS) &&
++ !(session_acquired_caps & VMMDEV_GUEST_SUPPORTS_SEAMLESS))
++ allowed_events &= ~VMMDEV_EVENT_SEAMLESS_MODE_CHANGE_REQUEST;
++
++ return allowed_events;
++}
++
+ static bool vbg_wait_event_cond(struct vbg_dev *gdev,
+ struct vbg_session *session,
+ u32 event_mask)
+@@ -1030,6 +1164,7 @@ static bool vbg_wait_event_cond(struct vbg_dev *gdev,
+ spin_lock_irqsave(&gdev->event_spinlock, flags);
+
+ events = gdev->pending_events & event_mask;
++ events &= vbg_get_allowed_event_mask_for_session(gdev, session);
+ wakeup = events || session->cancel_waiters;
+
+ spin_unlock_irqrestore(&gdev->event_spinlock, flags);
+@@ -1044,6 +1179,7 @@ static u32 vbg_consume_events_locked(struct vbg_dev *gdev,
+ {
+ u32 events = gdev->pending_events & event_mask;
+
++ events &= vbg_get_allowed_event_mask_for_session(gdev, session);
+ gdev->pending_events &= ~events;
+ return events;
+ }
+@@ -1445,6 +1581,29 @@ static int vbg_ioctl_change_filter_mask(struct vbg_dev *gdev,
+ false);
+ }
+
++static int vbg_ioctl_acquire_guest_capabilities(struct vbg_dev *gdev,
++ struct vbg_session *session,
++ struct vbg_ioctl_acquire_guest_caps *caps)
++{
++ u32 flags, or_mask, not_mask;
++
++ if (vbg_ioctl_chk(&caps->hdr, sizeof(caps->u.in), 0))
++ return -EINVAL;
++
++ flags = caps->u.in.flags;
++ or_mask = caps->u.in.or_mask;
++ not_mask = caps->u.in.not_mask;
++
++ if (flags & ~VBGL_IOC_AGC_FLAGS_VALID_MASK)
++ return -EINVAL;
++
++ if ((or_mask | not_mask) & ~VMMDEV_GUEST_CAPABILITIES_MASK)
++ return -EINVAL;
++
++ return vbg_acquire_session_capabilities(gdev, session, or_mask,
++ not_mask, flags, false);
++}
++
+ static int vbg_ioctl_change_guest_capabilities(struct vbg_dev *gdev,
+ struct vbg_session *session, struct vbg_ioctl_set_guest_caps *caps)
+ {
+@@ -1554,6 +1713,8 @@ int vbg_core_ioctl(struct vbg_session *session, unsigned int req, void *data)
+ return vbg_ioctl_interrupt_all_wait_events(gdev, session, data);
+ case VBG_IOCTL_CHANGE_FILTER_MASK:
+ return vbg_ioctl_change_filter_mask(gdev, session, data);
++ case VBG_IOCTL_ACQUIRE_GUEST_CAPABILITIES:
++ return vbg_ioctl_acquire_guest_capabilities(gdev, session, data);
+ case VBG_IOCTL_CHANGE_GUEST_CAPABILITIES:
+ return vbg_ioctl_change_guest_capabilities(gdev, session, data);
+ case VBG_IOCTL_CHECK_BALLOON:
+diff --git a/drivers/virt/vboxguest/vboxguest_core.h b/drivers/virt/vboxguest/vboxguest_core.h
+index dc745a033164..ab4bf64e2cec 100644
+--- a/drivers/virt/vboxguest/vboxguest_core.h
++++ b/drivers/virt/vboxguest/vboxguest_core.h
+@@ -117,6 +117,15 @@ struct vbg_dev {
+ */
+ u32 event_filter_host;
+
++ /**
++ * Guest capabilities which have been switched to acquire_mode.
++ */
++ u32 acquire_mode_guest_caps;
++ /**
++ * Guest capabilities acquired by vbg_acquire_session_capabilities().
++ * Only one session can acquire a capability at a time.
++ */
++ u32 acquired_guest_caps;
+ /**
+ * Usage counters for guest capabilities requested through
+ * vbg_set_session_capabilities(). Indexed by capability bit
+@@ -164,6 +173,11 @@ struct vbg_session {
+ * host filter. Protected by vbg_gdev.session_mutex.
+ */
+ u32 event_filter;
++ /**
++ * Guest capabilities acquired by vbg_acquire_session_capabilities().
++ * Only one session can acquire a capability at a time.
++ */
++ u32 acquired_guest_caps;
+ /**
+ * Guest capabilities set through vbg_set_session_capabilities().
+ * A capability claimed by any guest session will be reported to the
+diff --git a/include/uapi/linux/vboxguest.h b/include/uapi/linux/vboxguest.h
+index f79d7abe27db..15125f6ec60d 100644
+--- a/include/uapi/linux/vboxguest.h
++++ b/include/uapi/linux/vboxguest.h
+@@ -257,6 +257,30 @@ VMMDEV_ASSERT_SIZE(vbg_ioctl_change_filter, 24 + 8);
+ _IOWR('V', 12, struct vbg_ioctl_change_filter)
+
+
++/** VBG_IOCTL_ACQUIRE_GUEST_CAPABILITIES data structure. */
++struct vbg_ioctl_acquire_guest_caps {
++ /** The header. */
++ struct vbg_ioctl_hdr hdr;
++ union {
++ struct {
++ /** Flags (VBGL_IOC_AGC_FLAGS_XXX). */
++ __u32 flags;
++ /** Capabilities to set (VMMDEV_GUEST_SUPPORTS_XXX). */
++ __u32 or_mask;
++ /** Capabilities to drop (VMMDEV_GUEST_SUPPORTS_XXX). */
++ __u32 not_mask;
++ } in;
++ } u;
++};
++VMMDEV_ASSERT_SIZE(vbg_ioctl_acquire_guest_caps, 24 + 12);
++
++#define VBGL_IOC_AGC_FLAGS_CONFIG_ACQUIRE_MODE 0x00000001
++#define VBGL_IOC_AGC_FLAGS_VALID_MASK 0x00000001
++
++#define VBG_IOCTL_ACQUIRE_GUEST_CAPABILITIES \
++ _IOWR('V', 13, struct vbg_ioctl_acquire_guest_caps)
++
++
+ /** VBG_IOCTL_CHANGE_GUEST_CAPABILITIES data structure. */
+ struct vbg_ioctl_set_guest_caps {
+ /** The header. */
+--
+2.26.2
+
diff --git a/0001-virt-vbox-Add-vbg_set_host_capabilities-helper-funct.patch b/0001-virt-vbox-Add-vbg_set_host_capabilities-helper-funct.patch
new file mode 100644
index 000000000..3362eaddf
--- /dev/null
+++ b/0001-virt-vbox-Add-vbg_set_host_capabilities-helper-funct.patch
@@ -0,0 +1,130 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Hans de Goede <hdegoede@redhat.com>
+Date: Tue, 19 May 2020 15:30:29 +0200
+Subject: [PATCH] virt: vbox: Add vbg_set_host_capabilities() helper function
+
+Add vbg_set_host_capabilities() helper function, this is a preparation
+patch for adding support for the VBGL_IOCTL_GUEST_CAPS_ACQUIRE ioctl.
+
+Signed-off-by: Hans de Goede <hdegoede@redhat.com>
+Upstream Status: https://lore.kernel.org/lkml/20200520195440.38759-1-hdegoede@redhat.com/
+---
+ drivers/virt/vboxguest/vboxguest_core.c | 79 ++++++++++++++-----------
+ 1 file changed, 46 insertions(+), 33 deletions(-)
+
+diff --git a/drivers/virt/vboxguest/vboxguest_core.c b/drivers/virt/vboxguest/vboxguest_core.c
+index aee5eff229f2..15b3cb618c6e 100644
+--- a/drivers/virt/vboxguest/vboxguest_core.c
++++ b/drivers/virt/vboxguest/vboxguest_core.c
+@@ -661,6 +661,48 @@ static int vbg_reset_host_capabilities(struct vbg_dev *gdev)
+ return vbg_status_code_to_errno(rc);
+ }
+
++/**
++ * Set guest capabilities on the host.
++ * Must be called with gdev->session_mutex hold.
++ * Return: 0 or negative errno value.
++ * @gdev: The Guest extension device.
++ * @session: The session.
++ * @session_termination: Set if we're called by the session cleanup code.
++ */
++static int vbg_set_host_capabilities(struct vbg_dev *gdev,
++ struct vbg_session *session,
++ bool session_termination)
++{
++ struct vmmdev_mask *req;
++ u32 caps;
++ int rc;
++
++ WARN_ON(!mutex_is_locked(&gdev->session_mutex));
++
++ caps = gdev->set_guest_caps_tracker.mask;
++
++ if (gdev->guest_caps_host == caps)
++ return 0;
++
++ /* On termination the requestor is the kernel, as we're cleaning up. */
++ req = vbg_req_alloc(sizeof(*req), VMMDEVREQ_SET_GUEST_CAPABILITIES,
++ session_termination ? VBG_KERNEL_REQUEST :
++ session->requestor);
++ if (!req) {
++ gdev->guest_caps_host = U32_MAX;
++ return -ENOMEM;
++ }
++
++ req->or_mask = caps;
++ req->not_mask = ~caps;
++ rc = vbg_req_perform(gdev, req);
++ vbg_req_free(req, sizeof(*req));
++
++ gdev->guest_caps_host = (rc >= 0) ? caps : U32_MAX;
++
++ return vbg_status_code_to_errno(rc);
++}
++
+ /**
+ * Sets the guest capabilities for a session. Takes the session spinlock.
+ * Return: 0 or negative errno value.
+@@ -678,23 +720,8 @@ static int vbg_set_session_capabilities(struct vbg_dev *gdev,
+ u32 or_mask, u32 not_mask,
+ bool session_termination)
+ {
+- struct vmmdev_mask *req;
+ u32 changed, previous;
+- int rc, ret = 0;
+-
+- /*
+- * Allocate a request buffer before taking the spinlock, when
+- * the session is being terminated the requestor is the kernel,
+- * as we're cleaning up.
+- */
+- req = vbg_req_alloc(sizeof(*req), VMMDEVREQ_SET_GUEST_CAPABILITIES,
+- session_termination ? VBG_KERNEL_REQUEST :
+- session->requestor);
+- if (!req) {
+- if (!session_termination)
+- return -ENOMEM;
+- /* Ignore allocation failure, we must do session cleanup. */
+- }
++ int ret = 0;
+
+ mutex_lock(&gdev->session_mutex);
+
+@@ -709,23 +736,10 @@ static int vbg_set_session_capabilities(struct vbg_dev *gdev,
+ goto out;
+
+ vbg_track_bit_usage(&gdev->set_guest_caps_tracker, changed, previous);
+- or_mask = gdev->set_guest_caps_tracker.mask;
+-
+- if (gdev->guest_caps_host == or_mask || !req)
+- goto out;
+-
+- gdev->guest_caps_host = or_mask;
+- req->or_mask = or_mask;
+- req->not_mask = ~or_mask;
+- rc = vbg_req_perform(gdev, req);
+- if (rc < 0) {
+- ret = vbg_status_code_to_errno(rc);
+-
+- /* Failed, roll back (unless it's session termination time). */
+- gdev->guest_caps_host = U32_MAX;
+- if (session_termination)
+- goto out;
+
++ ret = vbg_set_host_capabilities(gdev, session, session_termination);
++ /* Roll back on failure, unless it's session termination time. */
++ if (ret < 0 && !session_termination) {
+ vbg_track_bit_usage(&gdev->set_guest_caps_tracker, changed,
+ session->set_guest_caps);
+ session->set_guest_caps = previous;
+@@ -733,7 +747,6 @@ static int vbg_set_session_capabilities(struct vbg_dev *gdev,
+
+ out:
+ mutex_unlock(&gdev->session_mutex);
+- vbg_req_free(req, sizeof(*req));
+
+ return ret;
+ }
+--
+2.26.2
+
diff --git a/0001-virt-vbox-Fix-VBGL_IOCTL_VMMDEV_REQUEST_BIG-and-_LOG.patch b/0001-virt-vbox-Fix-VBGL_IOCTL_VMMDEV_REQUEST_BIG-and-_LOG.patch
new file mode 100644
index 000000000..daf372ec2
--- /dev/null
+++ b/0001-virt-vbox-Fix-VBGL_IOCTL_VMMDEV_REQUEST_BIG-and-_LOG.patch
@@ -0,0 +1,123 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Hans de Goede <hdegoede@redhat.com>
+Date: Tue, 19 May 2020 12:21:30 +0200
+Subject: [PATCH] virt: vbox: Fix VBGL_IOCTL_VMMDEV_REQUEST_BIG and _LOG req
+ numbers to match upstream
+
+Until this commit the mainline kernel version (this version) of the
+vboxguest module contained a bug where it defined
+VBGL_IOCTL_VMMDEV_REQUEST_BIG and VBGL_IOCTL_LOG using
+_IOC(_IOC_READ | _IOC_WRITE, 'V', ...) instead of
+_IO(V, ...) as the out of tree VirtualBox upstream version does.
+
+Since the VirtualBox userspace bits are always built against VirtualBox
+upstream's headers, this means that so far the mainline kernel version
+of the vboxguest module has been failing these 2 ioctls with -ENOTTY.
+I guess that VBGL_IOCTL_VMMDEV_REQUEST_BIG is never used causing us to
+not hit that one and sofar the vboxguest driver has failed to actually
+log any log messages passed it through VBGL_IOCTL_LOG.
+
+This commit changes the VBGL_IOCTL_VMMDEV_REQUEST_BIG and VBGL_IOCTL_LOG
+defines to match the out of tree VirtualBox upstream vboxguest version,
+while keeping compatibility with the old wrong request defines so as
+to not break the kernel ABI in case someone has been using the old
+request defines.
+
+Fixes: f6ddd094f579 ("virt: Add vboxguest driver for Virtual Box Guest integration UAPI")
+Cc: stable@vger.kernel.org
+Signed-off-by: Hans de Goede <hdegoede@redhat.com>
+Upstream Status: https://lore.kernel.org/lkml/20200520195440.38759-1-hdegoede@redhat.com/
+---
+ drivers/virt/vboxguest/vboxguest_core.c | 4 +++-
+ drivers/virt/vboxguest/vboxguest_core.h | 15 +++++++++++++++
+ drivers/virt/vboxguest/vboxguest_linux.c | 3 ++-
+ include/uapi/linux/vboxguest.h | 4 ++--
+ 4 files changed, 22 insertions(+), 4 deletions(-)
+
+diff --git a/drivers/virt/vboxguest/vboxguest_core.c b/drivers/virt/vboxguest/vboxguest_core.c
+index b690a8a4bf9e..8fab04e76c14 100644
+--- a/drivers/virt/vboxguest/vboxguest_core.c
++++ b/drivers/virt/vboxguest/vboxguest_core.c
+@@ -1520,7 +1520,8 @@ int vbg_core_ioctl(struct vbg_session *session, unsigned int req, void *data)
+
+ /* For VMMDEV_REQUEST hdr->type != VBG_IOCTL_HDR_TYPE_DEFAULT */
+ if (req_no_size == VBG_IOCTL_VMMDEV_REQUEST(0) ||
+- req == VBG_IOCTL_VMMDEV_REQUEST_BIG)
++ req == VBG_IOCTL_VMMDEV_REQUEST_BIG ||
++ req == VBG_IOCTL_VMMDEV_REQUEST_BIG_ALT)
+ return vbg_ioctl_vmmrequest(gdev, session, data);
+
+ if (hdr->type != VBG_IOCTL_HDR_TYPE_DEFAULT)
+@@ -1558,6 +1559,7 @@ int vbg_core_ioctl(struct vbg_session *session, unsigned int req, void *data)
+ case VBG_IOCTL_HGCM_CALL(0):
+ return vbg_ioctl_hgcm_call(gdev, session, f32bit, data);
+ case VBG_IOCTL_LOG(0):
++ case VBG_IOCTL_LOG_ALT(0):
+ return vbg_ioctl_log(data);
+ }
+
+diff --git a/drivers/virt/vboxguest/vboxguest_core.h b/drivers/virt/vboxguest/vboxguest_core.h
+index 4188c12b839f..77c3a9c8255d 100644
+--- a/drivers/virt/vboxguest/vboxguest_core.h
++++ b/drivers/virt/vboxguest/vboxguest_core.h
+@@ -15,6 +15,21 @@
+ #include <linux/vboxguest.h>
+ #include "vmmdev.h"
+
++/*
++ * The mainline kernel version (this version) of the vboxguest module
++ * contained a bug where it defined VBGL_IOCTL_VMMDEV_REQUEST_BIG and
++ * VBGL_IOCTL_LOG using _IOC(_IOC_READ | _IOC_WRITE, 'V', ...) instead
++ * of _IO(V, ...) as the out of tree VirtualBox upstream version does.
++ *
++ * These _ALT definitions keep compatibility with the wrong defines the
++ * mainline kernel version used for a while.
++ * Note the VirtualBox userspace bits have always been built against
++ * VirtualBox upstream's headers, so this is likely not necessary. But
++ * we must never break our ABI so we keep these around to be 100% sure.
++ */
++#define VBG_IOCTL_VMMDEV_REQUEST_BIG_ALT _IOC(_IOC_READ | _IOC_WRITE, 'V', 3, 0)
++#define VBG_IOCTL_LOG_ALT(s) _IOC(_IOC_READ | _IOC_WRITE, 'V', 9, s)
++
+ struct vbg_session;
+
+ /** VBox guest memory balloon. */
+diff --git a/drivers/virt/vboxguest/vboxguest_linux.c b/drivers/virt/vboxguest/vboxguest_linux.c
+index 6e8c0f1c1056..32c2c52f7e84 100644
+--- a/drivers/virt/vboxguest/vboxguest_linux.c
++++ b/drivers/virt/vboxguest/vboxguest_linux.c
+@@ -131,7 +131,8 @@ static long vbg_misc_device_ioctl(struct file *filp, unsigned int req,
+ * the need for a bounce-buffer and another copy later on.
+ */
+ is_vmmdev_req = (req & ~IOCSIZE_MASK) == VBG_IOCTL_VMMDEV_REQUEST(0) ||
+- req == VBG_IOCTL_VMMDEV_REQUEST_BIG;
++ req == VBG_IOCTL_VMMDEV_REQUEST_BIG ||
++ req == VBG_IOCTL_VMMDEV_REQUEST_BIG_ALT;
+
+ if (is_vmmdev_req)
+ buf = vbg_req_alloc(size, VBG_IOCTL_HDR_TYPE_DEFAULT,
+diff --git a/include/uapi/linux/vboxguest.h b/include/uapi/linux/vboxguest.h
+index 9cec58a6a5ea..f79d7abe27db 100644
+--- a/include/uapi/linux/vboxguest.h
++++ b/include/uapi/linux/vboxguest.h
+@@ -103,7 +103,7 @@ VMMDEV_ASSERT_SIZE(vbg_ioctl_driver_version_info, 24 + 20);
+
+
+ /* IOCTL to perform a VMM Device request larger then 1KB. */
+-#define VBG_IOCTL_VMMDEV_REQUEST_BIG _IOC(_IOC_READ | _IOC_WRITE, 'V', 3, 0)
++#define VBG_IOCTL_VMMDEV_REQUEST_BIG _IO('V', 3)
+
+
+ /** VBG_IOCTL_HGCM_CONNECT data structure. */
+@@ -198,7 +198,7 @@ struct vbg_ioctl_log {
+ } u;
+ };
+
+-#define VBG_IOCTL_LOG(s) _IOC(_IOC_READ | _IOC_WRITE, 'V', 9, s)
++#define VBG_IOCTL_LOG(s) _IO('V', 9)
+
+
+ /** VBG_IOCTL_WAIT_FOR_EVENTS data structure. */
+--
+2.26.2
+
diff --git a/0001-virt-vbox-Fix-guest-capabilities-mask-check.patch b/0001-virt-vbox-Fix-guest-capabilities-mask-check.patch
new file mode 100644
index 000000000..77dbde8f5
--- /dev/null
+++ b/0001-virt-vbox-Fix-guest-capabilities-mask-check.patch
@@ -0,0 +1,47 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Hans de Goede <hdegoede@redhat.com>
+Date: Tue, 19 May 2020 13:23:06 +0200
+Subject: [PATCH] virt: vbox: Fix guest capabilities mask check
+
+Check the passed in capabilities against VMMDEV_GUEST_CAPABILITIES_MASK
+instead of against VMMDEV_EVENT_VALID_EVENT_MASK.
+This tightens the allowed mask from 0x7ff to 0x7.
+
+Fixes: 0ba002bc4393 ("virt: Add vboxguest driver for Virtual Box Guest integration")
+Cc: stable@vger.kernel.org
+Signed-off-by: Hans de Goede <hdegoede@redhat.com>
+Upstream Status: https://lore.kernel.org/lkml/20200520195440.38759-1-hdegoede@redhat.com/
+---
+ drivers/virt/vboxguest/vboxguest_core.c | 2 +-
+ drivers/virt/vboxguest/vmmdev.h | 2 ++
+ 2 files changed, 3 insertions(+), 1 deletion(-)
+
+diff --git a/drivers/virt/vboxguest/vboxguest_core.c b/drivers/virt/vboxguest/vboxguest_core.c
+index 8fab04e76c14..18ebd7a6af98 100644
+--- a/drivers/virt/vboxguest/vboxguest_core.c
++++ b/drivers/virt/vboxguest/vboxguest_core.c
+@@ -1444,7 +1444,7 @@ static int vbg_ioctl_change_guest_capabilities(struct vbg_dev *gdev,
+ or_mask = caps->u.in.or_mask;
+ not_mask = caps->u.in.not_mask;
+
+- if ((or_mask | not_mask) & ~VMMDEV_EVENT_VALID_EVENT_MASK)
++ if ((or_mask | not_mask) & ~VMMDEV_GUEST_CAPABILITIES_MASK)
+ return -EINVAL;
+
+ ret = vbg_set_session_capabilities(gdev, session, or_mask, not_mask,
+diff --git a/drivers/virt/vboxguest/vmmdev.h b/drivers/virt/vboxguest/vmmdev.h
+index 6337b8d75d96..21f408120e3f 100644
+--- a/drivers/virt/vboxguest/vmmdev.h
++++ b/drivers/virt/vboxguest/vmmdev.h
+@@ -206,6 +206,8 @@ VMMDEV_ASSERT_SIZE(vmmdev_mask, 24 + 8);
+ * not.
+ */
+ #define VMMDEV_GUEST_SUPPORTS_GRAPHICS BIT(2)
++/* The mask of valid capabilities, for sanity checking. */
++#define VMMDEV_GUEST_CAPABILITIES_MASK 0x00000007U
+
+ /** struct vmmdev_hypervisorinfo - Hypervisor info structure. */
+ struct vmmdev_hypervisorinfo {
+--
+2.26.2
+
diff --git a/0001-virt-vbox-Log-unknown-ioctl-requests-as-error.patch b/0001-virt-vbox-Log-unknown-ioctl-requests-as-error.patch
new file mode 100644
index 000000000..b9a90c4cd
--- /dev/null
+++ b/0001-virt-vbox-Log-unknown-ioctl-requests-as-error.patch
@@ -0,0 +1,30 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Hans de Goede <hdegoede@redhat.com>
+Date: Tue, 19 May 2020 11:24:43 +0200
+Subject: [PATCH] virt: vbox: Log unknown ioctl requests as error
+
+Every now and then upstream adds new ioctls without notifying us,
+log unknown ioctl requests as an error to catch these.
+
+Signed-off-by: Hans de Goede <hdegoede@redhat.com>
+Upstream Status: https://lore.kernel.org/lkml/20200520195440.38759-1-hdegoede@redhat.com/
+---
+ drivers/virt/vboxguest/vboxguest_core.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/drivers/virt/vboxguest/vboxguest_core.c b/drivers/virt/vboxguest/vboxguest_core.c
+index ffd76b949276..e0e343d0ba93 100644
+--- a/drivers/virt/vboxguest/vboxguest_core.c
++++ b/drivers/virt/vboxguest/vboxguest_core.c
+@@ -1739,7 +1739,7 @@ int vbg_core_ioctl(struct vbg_session *session, unsigned int req, void *data)
+ return vbg_ioctl_log(data);
+ }
+
+- vbg_debug("VGDrvCommonIoCtl: Unknown req %#08x\n", req);
++ vbg_err("Userspace made an unknown ioctl req %#08x\n", req);
+ return -ENOTTY;
+ }
+
+--
+2.26.2
+
diff --git a/0001-virt-vbox-Rename-guest_caps-struct-members-to-set_gu.patch b/0001-virt-vbox-Rename-guest_caps-struct-members-to-set_gu.patch
new file mode 100644
index 000000000..e92eac034
--- /dev/null
+++ b/0001-virt-vbox-Rename-guest_caps-struct-members-to-set_gu.patch
@@ -0,0 +1,103 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Hans de Goede <hdegoede@redhat.com>
+Date: Tue, 19 May 2020 14:33:13 +0200
+Subject: [PATCH] virt: vbox: Rename guest_caps struct members to
+ set_guest_caps
+
+Rename guest_caps[_tracker] struct members to set_guest_caps[_tracker]
+this is a preparation patch for adding support for the
+VBGL_IOCTL_GUEST_CAPS_ACQUIRE ioctl.
+
+Signed-off-by: Hans de Goede <hdegoede@redhat.com>
+Upstream Status: https://lore.kernel.org/lkml/20200520195440.38759-1-hdegoede@redhat.com/
+---
+ drivers/virt/vboxguest/vboxguest_core.c | 20 ++++++++++----------
+ drivers/virt/vboxguest/vboxguest_core.h | 9 +++++----
+ 2 files changed, 15 insertions(+), 14 deletions(-)
+
+diff --git a/drivers/virt/vboxguest/vboxguest_core.c b/drivers/virt/vboxguest/vboxguest_core.c
+index 18ebd7a6af98..aee5eff229f2 100644
+--- a/drivers/virt/vboxguest/vboxguest_core.c
++++ b/drivers/virt/vboxguest/vboxguest_core.c
+@@ -699,17 +699,17 @@ static int vbg_set_session_capabilities(struct vbg_dev *gdev,
+ mutex_lock(&gdev->session_mutex);
+
+ /* Apply the changes to the session mask. */
+- previous = session->guest_caps;
+- session->guest_caps |= or_mask;
+- session->guest_caps &= ~not_mask;
++ previous = session->set_guest_caps;
++ session->set_guest_caps |= or_mask;
++ session->set_guest_caps &= ~not_mask;
+
+ /* If anything actually changed, update the global usage counters. */
+- changed = previous ^ session->guest_caps;
++ changed = previous ^ session->set_guest_caps;
+ if (!changed)
+ goto out;
+
+- vbg_track_bit_usage(&gdev->guest_caps_tracker, changed, previous);
+- or_mask = gdev->guest_caps_tracker.mask;
++ vbg_track_bit_usage(&gdev->set_guest_caps_tracker, changed, previous);
++ or_mask = gdev->set_guest_caps_tracker.mask;
+
+ if (gdev->guest_caps_host == or_mask || !req)
+ goto out;
+@@ -726,9 +726,9 @@ static int vbg_set_session_capabilities(struct vbg_dev *gdev,
+ if (session_termination)
+ goto out;
+
+- vbg_track_bit_usage(&gdev->guest_caps_tracker, changed,
+- session->guest_caps);
+- session->guest_caps = previous;
++ vbg_track_bit_usage(&gdev->set_guest_caps_tracker, changed,
++ session->set_guest_caps);
++ session->set_guest_caps = previous;
+ }
+
+ out:
+@@ -1452,7 +1452,7 @@ static int vbg_ioctl_change_guest_capabilities(struct vbg_dev *gdev,
+ if (ret)
+ return ret;
+
+- caps->u.out.session_caps = session->guest_caps;
++ caps->u.out.session_caps = session->set_guest_caps;
+ caps->u.out.global_caps = gdev->guest_caps_host;
+
+ return 0;
+diff --git a/drivers/virt/vboxguest/vboxguest_core.h b/drivers/virt/vboxguest/vboxguest_core.h
+index 77c3a9c8255d..dc745a033164 100644
+--- a/drivers/virt/vboxguest/vboxguest_core.h
++++ b/drivers/virt/vboxguest/vboxguest_core.h
+@@ -118,11 +118,12 @@ struct vbg_dev {
+ u32 event_filter_host;
+
+ /**
+- * Usage counters for guest capabilities. Indexed by capability bit
++ * Usage counters for guest capabilities requested through
++ * vbg_set_session_capabilities(). Indexed by capability bit
+ * number, one count per session using a capability.
+ * Protected by session_mutex.
+ */
+- struct vbg_bit_usage_tracker guest_caps_tracker;
++ struct vbg_bit_usage_tracker set_guest_caps_tracker;
+ /**
+ * The guest capabilities last reported to the host (or UINT32_MAX).
+ * Protected by session_mutex.
+@@ -164,11 +165,11 @@ struct vbg_session {
+ */
+ u32 event_filter;
+ /**
+- * Guest capabilities for this session.
++ * Guest capabilities set through vbg_set_session_capabilities().
+ * A capability claimed by any guest session will be reported to the
+ * host. Protected by vbg_gdev.session_mutex.
+ */
+- u32 guest_caps;
++ u32 set_guest_caps;
+ /** VMMDEV_REQUESTOR_* flags */
+ u32 requestor;
+ /** Set on CANCEL_ALL_WAITEVENTS, protected by vbg_devevent_spinlock. */
+--
+2.26.2
+
diff --git a/Patchlist b/Patchlist
index 765199b72..6d744a483 100644
--- a/Patchlist
+++ b/Patchlist
@@ -75,3 +75,31 @@
0001-perf-cs-etm-Move-defined-of-traceid_list.patch
0001-pwm-lpss-Fix-get_state-runtime-pm-reference-handling.patch
0001-x86-Fix-compile-issues-with-rh_check_supported.patch
+0001-disp-gv100-expose-capabilities-class.patch
+0001-core-memory-remove-redundant-assignments-to-variable.patch
+0001-acr-Use-kmemdup-instead-of-kmalloc-and-memcpy.patch
+0001-drm-Use-generic-helper-to-check-_PR3-presence.patch
+0001-mmu-Remove-unneeded-semicolon.patch
+0001-device-rework-mmio-mapping-code-to-get-rid-of-second.patch
+0001-device-detect-if-changing-endianness-failed.patch
+0001-device-detect-vGPUs.patch
+0001-device-use-regular-PRI-accessors-in-chipset-detectio.patch
+0001-kms-Fix-regression-by-audio-component-transition.patch
+0001-disp-nv50-increase-timeout-on-pio-channel-free-polli.patch
+0001-disp-hda-gt215-pass-head-to-nvkm_ior.hda.eld.patch
+0001-disp-hda-gf119-add-HAL-for-programming-device-entry-.patch
+0001-disp-hda-gf119-select-HDA-device-entry-based-on-boun.patch
+0001-disp-hda-gv100-NV_PDISP_SF_AUDIO_CNTRL0-register-mov.patch
+0001-kms-nv50-Initialize-core-channel-in-nouveau_display_.patch
+0001-kms-nv50-Probe-SOR-and-PIOR-caps-for-DP-interlacing-.patch
+0001-kms-gv100-Add-support-for-interlaced-modes.patch
+0001-kms-nv50-Move-8BPC-limit-for-MST-into-nv50_mstc_get_.patch
+0001-kms-nv50-Share-DP-SST-mode_valid-handling-with-MST.patch
+0001-virt-vbox-Fix-VBGL_IOCTL_VMMDEV_REQUEST_BIG-and-_LOG.patch
+0001-virt-vbox-Fix-guest-capabilities-mask-check.patch
+0001-virt-vbox-Rename-guest_caps-struct-members-to-set_gu.patch
+0001-virt-vbox-Add-vbg_set_host_capabilities-helper-funct.patch
+0001-virt-vbox-Add-support-for-the-new-VBG_IOCTL_ACQUIRE_.patch
+0001-virt-vbox-Add-a-few-new-vmmdev-request-types-to-the-.patch
+0001-virt-vbox-Log-unknown-ioctl-requests-as-error.patch
+0001-platform-x86-sony-laptop-SNC-calls-should-handle-BUF.patch
diff --git a/kernel-aarch64-debug-fedora.config b/kernel-aarch64-debug-fedora.config
index 9afbd5998..187e61cd0 100644
--- a/kernel-aarch64-debug-fedora.config
+++ b/kernel-aarch64-debug-fedora.config
@@ -6194,7 +6194,7 @@ CONFIG_SND_SOC_IMX_SGTL5000=m
CONFIG_SND_SOC_IMX_SPDIF=m
# CONFIG_SND_SOC_INNO_RK3036 is not set
# CONFIG_SND_SOC_INTEL_BDW_RT5650_MACH is not set
-# CONFIG_SND_SOC_INTEL_SOF_PCM512x_MACH is not set
+CONFIG_SND_SOC_INTEL_SOF_PCM512x_MACH=m
# CONFIG_SND_SOC_INTEL_USER_FRIENDLY_LONG_NAMES is not set
CONFIG_SND_SOC=m
CONFIG_SND_SOC_MAX9759=m
@@ -6263,6 +6263,7 @@ CONFIG_SND_SOC_SOF_ACPI=m
# CONFIG_SND_SOC_SOF_DEBUG is not set
# CONFIG_SND_SOC_SOF_DEBUG_PROBES is not set
# CONFIG_SND_SOC_SOF_HDA_ALWAYS_ENABLE_DMI_L1 is not set
+CONFIG_SND_SOC_SOF_HDA_PROBES=y
CONFIG_SND_SOC_SOF_IMX8_SUPPORT=y
CONFIG_SND_SOC_SOF_IMX_TOPLEVEL=y
# CONFIG_SND_SOC_SOF_NOCODEC is not set
diff --git a/kernel-aarch64-debug-rhel.config b/kernel-aarch64-debug-rhel.config
index 9054a5f49..52903e3bf 100644
--- a/kernel-aarch64-debug-rhel.config
+++ b/kernel-aarch64-debug-rhel.config
@@ -2686,7 +2686,7 @@ CONFIG_LSM="yama,integrity,selinux"
# CONFIG_LTE_GDM724X is not set
# CONFIG_LTR501 is not set
# CONFIG_LV0104CS is not set
-# CONFIG_LWTUNNEL_BPF is not set
+CONFIG_LWTUNNEL_BPF=y
CONFIG_LWTUNNEL=y
CONFIG_LXT_PHY=m
# CONFIG_M62332 is not set
@@ -5020,7 +5020,7 @@ CONFIG_SND_SOC_INTEL_KBL_RT5660_MACH=m
CONFIG_SND_SOC_INTEL_KBL_RT5663_MAX98927_MACH=m
CONFIG_SND_SOC_INTEL_KBL_RT5663_RT5514_MAX98927_MACH=m
CONFIG_SND_SOC_INTEL_SKL_HDA_DSP_GENERIC_MACH=m
-# CONFIG_SND_SOC_INTEL_SOF_PCM512x_MACH is not set
+CONFIG_SND_SOC_INTEL_SOF_PCM512x_MACH=m
CONFIG_SND_SOC_INTEL_SST_TOPLEVEL=y
# CONFIG_SND_SOC_INTEL_USER_FRIENDLY_LONG_NAMES is not set
# CONFIG_SND_SOC is not set
@@ -5049,6 +5049,7 @@ CONFIG_SND_SOC_MAX98373=m
# CONFIG_SND_SOC_PCM3060_SPI is not set
# CONFIG_SND_SOC_PCM3168A_I2C is not set
# CONFIG_SND_SOC_PCM3168A_SPI is not set
+# CONFIG_SND_SOC_PCM512x_I2C is not set
# CONFIG_SND_SOC_RK3328 is not set
# CONFIG_SND_SOC_RT5616 is not set
# CONFIG_SND_SOC_RT5631 is not set
@@ -5056,8 +5057,9 @@ CONFIG_SND_SOC_MAX98373=m
# CONFIG_SND_SOC_SIRF_AUDIO_CODEC is not set
CONFIG_SND_SOC_SOF_ACPI=m
# CONFIG_SND_SOC_SOF_DEBUG is not set
-# CONFIG_SND_SOC_SOF_DEBUG_PROBES is not set
+CONFIG_SND_SOC_SOF_DEBUG_PROBES=y
# CONFIG_SND_SOC_SOF_HDA_ALWAYS_ENABLE_DMI_L1 is not set
+CONFIG_SND_SOC_SOF_HDA_PROBES=y
# CONFIG_SND_SOC_SOF_NOCODEC_SUPPORT is not set
# CONFIG_SND_SOC_SOF_OF is not set
CONFIG_SND_SOC_SOF_PCI=m
diff --git a/kernel-aarch64-fedora.config b/kernel-aarch64-fedora.config
index 8197ae374..af5c9c309 100644
--- a/kernel-aarch64-fedora.config
+++ b/kernel-aarch64-fedora.config
@@ -6174,7 +6174,7 @@ CONFIG_SND_SOC_IMX_SGTL5000=m
CONFIG_SND_SOC_IMX_SPDIF=m
# CONFIG_SND_SOC_INNO_RK3036 is not set
# CONFIG_SND_SOC_INTEL_BDW_RT5650_MACH is not set
-# CONFIG_SND_SOC_INTEL_SOF_PCM512x_MACH is not set
+CONFIG_SND_SOC_INTEL_SOF_PCM512x_MACH=m
# CONFIG_SND_SOC_INTEL_USER_FRIENDLY_LONG_NAMES is not set
CONFIG_SND_SOC=m
CONFIG_SND_SOC_MAX9759=m
diff --git a/kernel-aarch64-rhel.config b/kernel-aarch64-rhel.config
index 284fd9918..6ada5fb99 100644
--- a/kernel-aarch64-rhel.config
+++ b/kernel-aarch64-rhel.config
@@ -2669,7 +2669,7 @@ CONFIG_LSM="yama,integrity,selinux"
# CONFIG_LTE_GDM724X is not set
# CONFIG_LTR501 is not set
# CONFIG_LV0104CS is not set
-# CONFIG_LWTUNNEL_BPF is not set
+CONFIG_LWTUNNEL_BPF=y
CONFIG_LWTUNNEL=y
CONFIG_LXT_PHY=m
# CONFIG_M62332 is not set
@@ -5001,7 +5001,7 @@ CONFIG_SND_SOC_INTEL_KBL_RT5660_MACH=m
CONFIG_SND_SOC_INTEL_KBL_RT5663_MAX98927_MACH=m
CONFIG_SND_SOC_INTEL_KBL_RT5663_RT5514_MAX98927_MACH=m
CONFIG_SND_SOC_INTEL_SKL_HDA_DSP_GENERIC_MACH=m
-# CONFIG_SND_SOC_INTEL_SOF_PCM512x_MACH is not set
+CONFIG_SND_SOC_INTEL_SOF_PCM512x_MACH=m
CONFIG_SND_SOC_INTEL_SST_TOPLEVEL=y
# CONFIG_SND_SOC_INTEL_USER_FRIENDLY_LONG_NAMES is not set
# CONFIG_SND_SOC is not set
@@ -5030,6 +5030,7 @@ CONFIG_SND_SOC_MAX98373=m
# CONFIG_SND_SOC_PCM3060_SPI is not set
# CONFIG_SND_SOC_PCM3168A_I2C is not set
# CONFIG_SND_SOC_PCM3168A_SPI is not set
+# CONFIG_SND_SOC_PCM512x_I2C is not set
# CONFIG_SND_SOC_RK3328 is not set
# CONFIG_SND_SOC_RT5616 is not set
# CONFIG_SND_SOC_RT5631 is not set
diff --git a/kernel-armv7hl-debug-fedora.config b/kernel-armv7hl-debug-fedora.config
index 589a67c1a..e4c2b963e 100644
--- a/kernel-armv7hl-debug-fedora.config
+++ b/kernel-armv7hl-debug-fedora.config
@@ -6352,7 +6352,7 @@ CONFIG_SND_SOC_IMX_SPDIF=m
CONFIG_SND_SOC_IMX_SSI=m
# CONFIG_SND_SOC_INNO_RK3036 is not set
# CONFIG_SND_SOC_INTEL_BDW_RT5650_MACH is not set
-# CONFIG_SND_SOC_INTEL_SOF_PCM512x_MACH is not set
+CONFIG_SND_SOC_INTEL_SOF_PCM512x_MACH=m
# CONFIG_SND_SOC_INTEL_USER_FRIENDLY_LONG_NAMES is not set
CONFIG_SND_SOC_LPASS_CPU=m
CONFIG_SND_SOC_LPASS_PLATFORM=m
@@ -6431,6 +6431,7 @@ CONFIG_SND_SOC_SOF_ACPI=m
# CONFIG_SND_SOC_SOF_DEBUG is not set
# CONFIG_SND_SOC_SOF_DEBUG_PROBES is not set
# CONFIG_SND_SOC_SOF_HDA_ALWAYS_ENABLE_DMI_L1 is not set
+CONFIG_SND_SOC_SOF_HDA_PROBES=y
# CONFIG_SND_SOC_SOF_NOCODEC is not set
# CONFIG_SND_SOC_SOF_NOCODEC_SUPPORT is not set
# CONFIG_SND_SOC_SOF_OF is not set
diff --git a/kernel-armv7hl-fedora.config b/kernel-armv7hl-fedora.config
index 352b1668e..83c193e58 100644
--- a/kernel-armv7hl-fedora.config
+++ b/kernel-armv7hl-fedora.config
@@ -6333,7 +6333,7 @@ CONFIG_SND_SOC_IMX_SPDIF=m
CONFIG_SND_SOC_IMX_SSI=m
# CONFIG_SND_SOC_INNO_RK3036 is not set
# CONFIG_SND_SOC_INTEL_BDW_RT5650_MACH is not set
-# CONFIG_SND_SOC_INTEL_SOF_PCM512x_MACH is not set
+CONFIG_SND_SOC_INTEL_SOF_PCM512x_MACH=m
# CONFIG_SND_SOC_INTEL_USER_FRIENDLY_LONG_NAMES is not set
CONFIG_SND_SOC_LPASS_CPU=m
CONFIG_SND_SOC_LPASS_PLATFORM=m
diff --git a/kernel-armv7hl-lpae-debug-fedora.config b/kernel-armv7hl-lpae-debug-fedora.config
index 8916417e2..1addb9f79 100644
--- a/kernel-armv7hl-lpae-debug-fedora.config
+++ b/kernel-armv7hl-lpae-debug-fedora.config
@@ -6148,7 +6148,7 @@ CONFIG_SND_SOC_IMX_SGTL5000=m
CONFIG_SND_SOC_IMX_SPDIF=m
# CONFIG_SND_SOC_INNO_RK3036 is not set
# CONFIG_SND_SOC_INTEL_BDW_RT5650_MACH is not set
-# CONFIG_SND_SOC_INTEL_SOF_PCM512x_MACH is not set
+CONFIG_SND_SOC_INTEL_SOF_PCM512x_MACH=m
# CONFIG_SND_SOC_INTEL_USER_FRIENDLY_LONG_NAMES is not set
CONFIG_SND_SOC=m
CONFIG_SND_SOC_MAX9759=m
@@ -6221,6 +6221,7 @@ CONFIG_SND_SOC_SOF_ACPI=m
# CONFIG_SND_SOC_SOF_DEBUG is not set
# CONFIG_SND_SOC_SOF_DEBUG_PROBES is not set
# CONFIG_SND_SOC_SOF_HDA_ALWAYS_ENABLE_DMI_L1 is not set
+CONFIG_SND_SOC_SOF_HDA_PROBES=y
# CONFIG_SND_SOC_SOF_NOCODEC is not set
# CONFIG_SND_SOC_SOF_NOCODEC_SUPPORT is not set
# CONFIG_SND_SOC_SOF_OF is not set
diff --git a/kernel-armv7hl-lpae-fedora.config b/kernel-armv7hl-lpae-fedora.config
index ebdbb1b14..5d887f3ad 100644
--- a/kernel-armv7hl-lpae-fedora.config
+++ b/kernel-armv7hl-lpae-fedora.config
@@ -6129,7 +6129,7 @@ CONFIG_SND_SOC_IMX_SGTL5000=m
CONFIG_SND_SOC_IMX_SPDIF=m
# CONFIG_SND_SOC_INNO_RK3036 is not set
# CONFIG_SND_SOC_INTEL_BDW_RT5650_MACH is not set
-# CONFIG_SND_SOC_INTEL_SOF_PCM512x_MACH is not set
+CONFIG_SND_SOC_INTEL_SOF_PCM512x_MACH=m
# CONFIG_SND_SOC_INTEL_USER_FRIENDLY_LONG_NAMES is not set
CONFIG_SND_SOC=m
CONFIG_SND_SOC_MAX9759=m
diff --git a/kernel-i686-debug-fedora.config b/kernel-i686-debug-fedora.config
index 58cc283fb..96842bf04 100644
--- a/kernel-i686-debug-fedora.config
+++ b/kernel-i686-debug-fedora.config
@@ -5692,6 +5692,7 @@ CONFIG_SND_SOC_SOF_GEMINILAKE_SUPPORT=y
CONFIG_SND_SOC_SOF_HDA_AUDIO_CODEC=y
CONFIG_SND_SOC_SOF_HDA_COMMON_HDMI_CODEC=y
CONFIG_SND_SOC_SOF_HDA_LINK=y
+CONFIG_SND_SOC_SOF_HDA_PROBES=y
CONFIG_SND_SOC_SOF_ICELAKE_SUPPORT=y
CONFIG_SND_SOC_SOF_INTEL_TOPLEVEL=y
CONFIG_SND_SOC_SOF_JASPERLAKE_SUPPORT=y
diff --git a/kernel-ppc64le-debug-fedora.config b/kernel-ppc64le-debug-fedora.config
index b9ec28a93..69c7c6cec 100644
--- a/kernel-ppc64le-debug-fedora.config
+++ b/kernel-ppc64le-debug-fedora.config
@@ -5257,7 +5257,7 @@ CONFIG_SND_SOC_HDMI_CODEC=m
# CONFIG_SND_SOC_IMX_ES8328 is not set
# CONFIG_SND_SOC_INNO_RK3036 is not set
# CONFIG_SND_SOC_INTEL_BDW_RT5650_MACH is not set
-# CONFIG_SND_SOC_INTEL_SOF_PCM512x_MACH is not set
+CONFIG_SND_SOC_INTEL_SOF_PCM512x_MACH=m
# CONFIG_SND_SOC_INTEL_USER_FRIENDLY_LONG_NAMES is not set
# CONFIG_SND_SOC is not set
CONFIG_SND_SOC_MAX9759=m
@@ -5306,6 +5306,7 @@ CONFIG_SND_SOC_SOF_ACPI=m
# CONFIG_SND_SOC_SOF_DEBUG is not set
# CONFIG_SND_SOC_SOF_DEBUG_PROBES is not set
# CONFIG_SND_SOC_SOF_HDA_ALWAYS_ENABLE_DMI_L1 is not set
+CONFIG_SND_SOC_SOF_HDA_PROBES=y
# CONFIG_SND_SOC_SOF_NOCODEC is not set
# CONFIG_SND_SOC_SOF_NOCODEC_SUPPORT is not set
# CONFIG_SND_SOC_SOF_OF is not set
diff --git a/kernel-ppc64le-debug-rhel.config b/kernel-ppc64le-debug-rhel.config
index a2287da56..e8ca0a942 100644
--- a/kernel-ppc64le-debug-rhel.config
+++ b/kernel-ppc64le-debug-rhel.config
@@ -2567,7 +2567,7 @@ CONFIG_LSM="yama,integrity,selinux"
# CONFIG_LTE_GDM724X is not set
# CONFIG_LTR501 is not set
# CONFIG_LV0104CS is not set
-# CONFIG_LWTUNNEL_BPF is not set
+CONFIG_LWTUNNEL_BPF=y
CONFIG_LWTUNNEL=y
CONFIG_LXT_PHY=m
# CONFIG_M62332 is not set
@@ -4865,7 +4865,7 @@ CONFIG_SND_SOC_INTEL_KBL_RT5660_MACH=m
CONFIG_SND_SOC_INTEL_KBL_RT5663_MAX98927_MACH=m
CONFIG_SND_SOC_INTEL_KBL_RT5663_RT5514_MAX98927_MACH=m
CONFIG_SND_SOC_INTEL_SKL_HDA_DSP_GENERIC_MACH=m
-# CONFIG_SND_SOC_INTEL_SOF_PCM512x_MACH is not set
+CONFIG_SND_SOC_INTEL_SOF_PCM512x_MACH=m
CONFIG_SND_SOC_INTEL_SST_TOPLEVEL=y
# CONFIG_SND_SOC_INTEL_USER_FRIENDLY_LONG_NAMES is not set
# CONFIG_SND_SOC is not set
@@ -4894,6 +4894,7 @@ CONFIG_SND_SOC_MAX98373=m
# CONFIG_SND_SOC_PCM3060_SPI is not set
# CONFIG_SND_SOC_PCM3168A_I2C is not set
# CONFIG_SND_SOC_PCM3168A_SPI is not set
+# CONFIG_SND_SOC_PCM512x_I2C is not set
# CONFIG_SND_SOC_RK3328 is not set
# CONFIG_SND_SOC_RT5616 is not set
# CONFIG_SND_SOC_RT5631 is not set
@@ -4901,8 +4902,9 @@ CONFIG_SND_SOC_MAX98373=m
# CONFIG_SND_SOC_SIRF_AUDIO_CODEC is not set
CONFIG_SND_SOC_SOF_ACPI=m
# CONFIG_SND_SOC_SOF_DEBUG is not set
-# CONFIG_SND_SOC_SOF_DEBUG_PROBES is not set
+CONFIG_SND_SOC_SOF_DEBUG_PROBES=y
# CONFIG_SND_SOC_SOF_HDA_ALWAYS_ENABLE_DMI_L1 is not set
+CONFIG_SND_SOC_SOF_HDA_PROBES=y
# CONFIG_SND_SOC_SOF_NOCODEC_SUPPORT is not set
# CONFIG_SND_SOC_SOF_OF is not set
CONFIG_SND_SOC_SOF_PCI=m
diff --git a/kernel-ppc64le-fedora.config b/kernel-ppc64le-fedora.config
index 22a774944..40e3c975d 100644
--- a/kernel-ppc64le-fedora.config
+++ b/kernel-ppc64le-fedora.config
@@ -5236,7 +5236,7 @@ CONFIG_SND_SOC_HDMI_CODEC=m
# CONFIG_SND_SOC_IMX_ES8328 is not set
# CONFIG_SND_SOC_INNO_RK3036 is not set
# CONFIG_SND_SOC_INTEL_BDW_RT5650_MACH is not set
-# CONFIG_SND_SOC_INTEL_SOF_PCM512x_MACH is not set
+CONFIG_SND_SOC_INTEL_SOF_PCM512x_MACH=m
# CONFIG_SND_SOC_INTEL_USER_FRIENDLY_LONG_NAMES is not set
# CONFIG_SND_SOC is not set
CONFIG_SND_SOC_MAX9759=m
diff --git a/kernel-ppc64le-rhel.config b/kernel-ppc64le-rhel.config
index b6852e1e2..0382635b9 100644
--- a/kernel-ppc64le-rhel.config
+++ b/kernel-ppc64le-rhel.config
@@ -2551,7 +2551,7 @@ CONFIG_LSM="yama,integrity,selinux"
# CONFIG_LTE_GDM724X is not set
# CONFIG_LTR501 is not set
# CONFIG_LV0104CS is not set
-# CONFIG_LWTUNNEL_BPF is not set
+CONFIG_LWTUNNEL_BPF=y
CONFIG_LWTUNNEL=y
CONFIG_LXT_PHY=m
# CONFIG_M62332 is not set
@@ -4848,7 +4848,7 @@ CONFIG_SND_SOC_INTEL_KBL_RT5660_MACH=m
CONFIG_SND_SOC_INTEL_KBL_RT5663_MAX98927_MACH=m
CONFIG_SND_SOC_INTEL_KBL_RT5663_RT5514_MAX98927_MACH=m
CONFIG_SND_SOC_INTEL_SKL_HDA_DSP_GENERIC_MACH=m
-# CONFIG_SND_SOC_INTEL_SOF_PCM512x_MACH is not set
+CONFIG_SND_SOC_INTEL_SOF_PCM512x_MACH=m
CONFIG_SND_SOC_INTEL_SST_TOPLEVEL=y
# CONFIG_SND_SOC_INTEL_USER_FRIENDLY_LONG_NAMES is not set
# CONFIG_SND_SOC is not set
@@ -4877,6 +4877,7 @@ CONFIG_SND_SOC_MAX98373=m
# CONFIG_SND_SOC_PCM3060_SPI is not set
# CONFIG_SND_SOC_PCM3168A_I2C is not set
# CONFIG_SND_SOC_PCM3168A_SPI is not set
+# CONFIG_SND_SOC_PCM512x_I2C is not set
# CONFIG_SND_SOC_RK3328 is not set
# CONFIG_SND_SOC_RT5616 is not set
# CONFIG_SND_SOC_RT5631 is not set
diff --git a/kernel-s390x-debug-fedora.config b/kernel-s390x-debug-fedora.config
index d0e60f200..4c5085dc4 100644
--- a/kernel-s390x-debug-fedora.config
+++ b/kernel-s390x-debug-fedora.config
@@ -5201,7 +5201,7 @@ CONFIG_SND_SOC_HDMI_CODEC=m
# CONFIG_SND_SOC_IMX_ES8328 is not set
# CONFIG_SND_SOC_INNO_RK3036 is not set
# CONFIG_SND_SOC_INTEL_BDW_RT5650_MACH is not set
-# CONFIG_SND_SOC_INTEL_SOF_PCM512x_MACH is not set
+CONFIG_SND_SOC_INTEL_SOF_PCM512x_MACH=m
# CONFIG_SND_SOC_INTEL_USER_FRIENDLY_LONG_NAMES is not set
CONFIG_SND_SOC=m
CONFIG_SND_SOC_MAX9759=m
@@ -5250,6 +5250,7 @@ CONFIG_SND_SOC_SOF_ACPI=m
# CONFIG_SND_SOC_SOF_DEBUG is not set
# CONFIG_SND_SOC_SOF_DEBUG_PROBES is not set
# CONFIG_SND_SOC_SOF_HDA_ALWAYS_ENABLE_DMI_L1 is not set
+CONFIG_SND_SOC_SOF_HDA_PROBES=y
# CONFIG_SND_SOC_SOF_NOCODEC is not set
# CONFIG_SND_SOC_SOF_NOCODEC_SUPPORT is not set
# CONFIG_SND_SOC_SOF_OF is not set
diff --git a/kernel-s390x-debug-rhel.config b/kernel-s390x-debug-rhel.config
index b5d142a5d..93ab0804e 100644
--- a/kernel-s390x-debug-rhel.config
+++ b/kernel-s390x-debug-rhel.config
@@ -2535,7 +2535,7 @@ CONFIG_LSM="yama,integrity,selinux"
# CONFIG_LTE_GDM724X is not set
# CONFIG_LTR501 is not set
# CONFIG_LV0104CS is not set
-# CONFIG_LWTUNNEL_BPF is not set
+CONFIG_LWTUNNEL_BPF=y
CONFIG_LWTUNNEL=y
# CONFIG_LXT_PHY is not set
# CONFIG_M62332 is not set
@@ -4807,7 +4807,7 @@ CONFIG_SND_SOC_INTEL_KBL_RT5660_MACH=m
CONFIG_SND_SOC_INTEL_KBL_RT5663_MAX98927_MACH=m
CONFIG_SND_SOC_INTEL_KBL_RT5663_RT5514_MAX98927_MACH=m
CONFIG_SND_SOC_INTEL_SKL_HDA_DSP_GENERIC_MACH=m
-# CONFIG_SND_SOC_INTEL_SOF_PCM512x_MACH is not set
+CONFIG_SND_SOC_INTEL_SOF_PCM512x_MACH=m
CONFIG_SND_SOC_INTEL_SST_TOPLEVEL=y
# CONFIG_SND_SOC_INTEL_USER_FRIENDLY_LONG_NAMES is not set
# CONFIG_SND_SOC is not set
@@ -4836,6 +4836,7 @@ CONFIG_SND_SOC_MAX98373=m
# CONFIG_SND_SOC_PCM3060_SPI is not set
# CONFIG_SND_SOC_PCM3168A_I2C is not set
# CONFIG_SND_SOC_PCM3168A_SPI is not set
+# CONFIG_SND_SOC_PCM512x_I2C is not set
# CONFIG_SND_SOC_RK3328 is not set
# CONFIG_SND_SOC_RT5616 is not set
# CONFIG_SND_SOC_RT5631 is not set
@@ -4843,8 +4844,9 @@ CONFIG_SND_SOC_MAX98373=m
# CONFIG_SND_SOC_SIRF_AUDIO_CODEC is not set
CONFIG_SND_SOC_SOF_ACPI=m
# CONFIG_SND_SOC_SOF_DEBUG is not set
-# CONFIG_SND_SOC_SOF_DEBUG_PROBES is not set
+CONFIG_SND_SOC_SOF_DEBUG_PROBES=y
# CONFIG_SND_SOC_SOF_HDA_ALWAYS_ENABLE_DMI_L1 is not set
+CONFIG_SND_SOC_SOF_HDA_PROBES=y
# CONFIG_SND_SOC_SOF_NOCODEC_SUPPORT is not set
# CONFIG_SND_SOC_SOF_OF is not set
CONFIG_SND_SOC_SOF_PCI=m
diff --git a/kernel-s390x-fedora.config b/kernel-s390x-fedora.config
index 15b32d7bc..0ca25f841 100644
--- a/kernel-s390x-fedora.config
+++ b/kernel-s390x-fedora.config
@@ -5180,7 +5180,7 @@ CONFIG_SND_SOC_HDMI_CODEC=m
# CONFIG_SND_SOC_IMX_ES8328 is not set
# CONFIG_SND_SOC_INNO_RK3036 is not set
# CONFIG_SND_SOC_INTEL_BDW_RT5650_MACH is not set
-# CONFIG_SND_SOC_INTEL_SOF_PCM512x_MACH is not set
+CONFIG_SND_SOC_INTEL_SOF_PCM512x_MACH=m
# CONFIG_SND_SOC_INTEL_USER_FRIENDLY_LONG_NAMES is not set
CONFIG_SND_SOC=m
CONFIG_SND_SOC_MAX9759=m
diff --git a/kernel-s390x-rhel.config b/kernel-s390x-rhel.config
index e8b2584ef..671bfc7a1 100644
--- a/kernel-s390x-rhel.config
+++ b/kernel-s390x-rhel.config
@@ -2519,7 +2519,7 @@ CONFIG_LSM="yama,integrity,selinux"
# CONFIG_LTE_GDM724X is not set
# CONFIG_LTR501 is not set
# CONFIG_LV0104CS is not set
-# CONFIG_LWTUNNEL_BPF is not set
+CONFIG_LWTUNNEL_BPF=y
CONFIG_LWTUNNEL=y
# CONFIG_LXT_PHY is not set
# CONFIG_M62332 is not set
@@ -4790,7 +4790,7 @@ CONFIG_SND_SOC_INTEL_KBL_RT5660_MACH=m
CONFIG_SND_SOC_INTEL_KBL_RT5663_MAX98927_MACH=m
CONFIG_SND_SOC_INTEL_KBL_RT5663_RT5514_MAX98927_MACH=m
CONFIG_SND_SOC_INTEL_SKL_HDA_DSP_GENERIC_MACH=m
-# CONFIG_SND_SOC_INTEL_SOF_PCM512x_MACH is not set
+CONFIG_SND_SOC_INTEL_SOF_PCM512x_MACH=m
CONFIG_SND_SOC_INTEL_SST_TOPLEVEL=y
# CONFIG_SND_SOC_INTEL_USER_FRIENDLY_LONG_NAMES is not set
# CONFIG_SND_SOC is not set
@@ -4819,6 +4819,7 @@ CONFIG_SND_SOC_MAX98373=m
# CONFIG_SND_SOC_PCM3060_SPI is not set
# CONFIG_SND_SOC_PCM3168A_I2C is not set
# CONFIG_SND_SOC_PCM3168A_SPI is not set
+# CONFIG_SND_SOC_PCM512x_I2C is not set
# CONFIG_SND_SOC_RK3328 is not set
# CONFIG_SND_SOC_RT5616 is not set
# CONFIG_SND_SOC_RT5631 is not set
diff --git a/kernel-s390x-zfcpdump-rhel.config b/kernel-s390x-zfcpdump-rhel.config
index 561ded5bf..9eae33db5 100644
--- a/kernel-s390x-zfcpdump-rhel.config
+++ b/kernel-s390x-zfcpdump-rhel.config
@@ -2539,7 +2539,7 @@ CONFIG_LSM="yama,integrity,selinux"
# CONFIG_LTE_GDM724X is not set
# CONFIG_LTR501 is not set
# CONFIG_LV0104CS is not set
-# CONFIG_LWTUNNEL_BPF is not set
+CONFIG_LWTUNNEL_BPF=y
CONFIG_LWTUNNEL=y
# CONFIG_LXT_PHY is not set
# CONFIG_M62332 is not set
@@ -4819,7 +4819,7 @@ CONFIG_SND_SOC_INTEL_KBL_RT5660_MACH=m
CONFIG_SND_SOC_INTEL_KBL_RT5663_MAX98927_MACH=m
CONFIG_SND_SOC_INTEL_KBL_RT5663_RT5514_MAX98927_MACH=m
CONFIG_SND_SOC_INTEL_SKL_HDA_DSP_GENERIC_MACH=m
-# CONFIG_SND_SOC_INTEL_SOF_PCM512x_MACH is not set
+CONFIG_SND_SOC_INTEL_SOF_PCM512x_MACH=m
CONFIG_SND_SOC_INTEL_SST_TOPLEVEL=y
# CONFIG_SND_SOC_INTEL_USER_FRIENDLY_LONG_NAMES is not set
# CONFIG_SND_SOC is not set
@@ -4848,6 +4848,7 @@ CONFIG_SND_SOC_MAX98373=m
# CONFIG_SND_SOC_PCM3060_SPI is not set
# CONFIG_SND_SOC_PCM3168A_I2C is not set
# CONFIG_SND_SOC_PCM3168A_SPI is not set
+# CONFIG_SND_SOC_PCM512x_I2C is not set
# CONFIG_SND_SOC_RK3328 is not set
# CONFIG_SND_SOC_RT5616 is not set
# CONFIG_SND_SOC_RT5631 is not set
diff --git a/kernel-x86_64-debug-fedora.config b/kernel-x86_64-debug-fedora.config
index bbe23b899..500426261 100644
--- a/kernel-x86_64-debug-fedora.config
+++ b/kernel-x86_64-debug-fedora.config
@@ -5740,6 +5740,7 @@ CONFIG_SND_SOC_SOF_GEMINILAKE_SUPPORT=y
CONFIG_SND_SOC_SOF_HDA_AUDIO_CODEC=y
CONFIG_SND_SOC_SOF_HDA_COMMON_HDMI_CODEC=y
CONFIG_SND_SOC_SOF_HDA_LINK=y
+CONFIG_SND_SOC_SOF_HDA_PROBES=y
CONFIG_SND_SOC_SOF_ICELAKE_SUPPORT=y
CONFIG_SND_SOC_SOF_INTEL_TOPLEVEL=y
CONFIG_SND_SOC_SOF_JASPERLAKE_SUPPORT=y
diff --git a/kernel-x86_64-debug-rhel.config b/kernel-x86_64-debug-rhel.config
index a70fe8022..29fbb38e4 100644
--- a/kernel-x86_64-debug-rhel.config
+++ b/kernel-x86_64-debug-rhel.config
@@ -2731,7 +2731,7 @@ CONFIG_LSM="yama,integrity,selinux"
# CONFIG_LTE_GDM724X is not set
# CONFIG_LTR501 is not set
# CONFIG_LV0104CS is not set
-# CONFIG_LWTUNNEL_BPF is not set
+CONFIG_LWTUNNEL_BPF=y
CONFIG_LWTUNNEL=y
CONFIG_LXT_PHY=m
# CONFIG_M62332 is not set
@@ -5043,7 +5043,7 @@ CONFIG_SND_SOC_INTEL_SKL_NAU88L25_SSM4567_MACH=m
CONFIG_SND_SOC_INTEL_SKL_RT286_MACH=m
CONFIG_SND_SOC_INTEL_SKYLAKE_HDAUDIO_CODEC=y
CONFIG_SND_SOC_INTEL_SKYLAKE=m
-# CONFIG_SND_SOC_INTEL_SOF_PCM512x_MACH is not set
+CONFIG_SND_SOC_INTEL_SOF_PCM512x_MACH=m
CONFIG_SND_SOC_INTEL_SOF_RT5682_MACH=m
CONFIG_SND_SOC_INTEL_SST_TOPLEVEL=y
# CONFIG_SND_SOC_INTEL_USER_FRIENDLY_LONG_NAMES is not set
@@ -5073,7 +5073,7 @@ CONFIG_SND_SOC_MAX98373=m
# CONFIG_SND_SOC_PCM3060_SPI is not set
# CONFIG_SND_SOC_PCM3168A_I2C is not set
# CONFIG_SND_SOC_PCM3168A_SPI is not set
-# CONFIG_SND_SOC_PCM512x_I2C is not set
+CONFIG_SND_SOC_PCM512x_I2C=m
# CONFIG_SND_SOC_PCM512x_SPI is not set
# CONFIG_SND_SOC_RK3328 is not set
# CONFIG_SND_SOC_RT5616 is not set
@@ -5090,13 +5090,14 @@ CONFIG_SND_SOC_SOF_COFFEELAKE_SUPPORT=y
# CONFIG_SND_SOC_SOF_COMETLAKE_H_SUPPORT is not set
# CONFIG_SND_SOC_SOF_COMETLAKE_LP_SUPPORT is not set
# CONFIG_SND_SOC_SOF_DEBUG is not set
-# CONFIG_SND_SOC_SOF_DEBUG_PROBES is not set
+CONFIG_SND_SOC_SOF_DEBUG_PROBES=y
CONFIG_SND_SOC_SOF_ELKHARTLAKE_SUPPORT=y
CONFIG_SND_SOC_SOF_GEMINILAKE_SUPPORT=y
# CONFIG_SND_SOC_SOF_HDA_ALWAYS_ENABLE_DMI_L1 is not set
CONFIG_SND_SOC_SOF_HDA_AUDIO_CODEC=y
CONFIG_SND_SOC_SOF_HDA_COMMON_HDMI_CODEC=y
CONFIG_SND_SOC_SOF_HDA_LINK=y
+CONFIG_SND_SOC_SOF_HDA_PROBES=y
CONFIG_SND_SOC_SOF_ICELAKE_SUPPORT=y
CONFIG_SND_SOC_SOF_INTEL_TOPLEVEL=y
# CONFIG_SND_SOC_SOF_JASPERLAKE_SUPPORT is not set
diff --git a/kernel-x86_64-rhel.config b/kernel-x86_64-rhel.config
index fe6e1cd92..6a0c1aea2 100644
--- a/kernel-x86_64-rhel.config
+++ b/kernel-x86_64-rhel.config
@@ -2714,7 +2714,7 @@ CONFIG_LSM="yama,integrity,selinux"
# CONFIG_LTE_GDM724X is not set
# CONFIG_LTR501 is not set
# CONFIG_LV0104CS is not set
-# CONFIG_LWTUNNEL_BPF is not set
+CONFIG_LWTUNNEL_BPF=y
CONFIG_LWTUNNEL=y
CONFIG_LXT_PHY=m
# CONFIG_M62332 is not set
@@ -5024,7 +5024,7 @@ CONFIG_SND_SOC_INTEL_SKL_NAU88L25_SSM4567_MACH=m
CONFIG_SND_SOC_INTEL_SKL_RT286_MACH=m
CONFIG_SND_SOC_INTEL_SKYLAKE_HDAUDIO_CODEC=y
CONFIG_SND_SOC_INTEL_SKYLAKE=m
-# CONFIG_SND_SOC_INTEL_SOF_PCM512x_MACH is not set
+CONFIG_SND_SOC_INTEL_SOF_PCM512x_MACH=m
CONFIG_SND_SOC_INTEL_SOF_RT5682_MACH=m
CONFIG_SND_SOC_INTEL_SST_TOPLEVEL=y
# CONFIG_SND_SOC_INTEL_USER_FRIENDLY_LONG_NAMES is not set
@@ -5054,7 +5054,7 @@ CONFIG_SND_SOC_MAX98373=m
# CONFIG_SND_SOC_PCM3060_SPI is not set
# CONFIG_SND_SOC_PCM3168A_I2C is not set
# CONFIG_SND_SOC_PCM3168A_SPI is not set
-# CONFIG_SND_SOC_PCM512x_I2C is not set
+CONFIG_SND_SOC_PCM512x_I2C=m
# CONFIG_SND_SOC_PCM512x_SPI is not set
# CONFIG_SND_SOC_RK3328 is not set
# CONFIG_SND_SOC_RT5616 is not set
diff --git a/kernel.spec b/kernel.spec
index 878533784..bd82297e7 100644
--- a/kernel.spec
+++ b/kernel.spec
@@ -30,7 +30,7 @@ Summary: The Linux kernel
# For a stable, released kernel, released_kernel should be 1.
%global released_kernel 0
-%global distro_build 0.rc7.1
+%global distro_build 0.rc7.20200529gitb0c3ba31be3e.1
%if 0%{?fedora}
%define secure_boot_arch x86_64
@@ -71,10 +71,10 @@ Summary: The Linux kernel
%endif
%define rpmversion 5.7.0
-%define pkgrelease 0.rc7.1
+%define pkgrelease 0.rc7.20200529gitb0c3ba31be3e.1
# allow pkg_release to have configurable %%{?dist} tag
-%define specrelease 0.rc7.1%{?buildid}%{?dist}
+%define specrelease 0.rc7.20200529gitb0c3ba31be3e.1%{?buildid}%{?dist}
%define pkg_release %{specrelease}
@@ -165,7 +165,7 @@ Summary: The Linux kernel
# Set debugbuildsenabled to 1 for production (build separate debug kernels)
# and 0 for rawhide (all kernels are debug kernels).
# See also 'make debug' and 'make release'.
-%define debugbuildsenabled 1
+%define debugbuildsenabled 0
# The kernel tarball/base version
%define kversion 5.7
@@ -566,7 +566,7 @@ BuildRequires: asciidoc
# exact git commit you can run
#
# xzcat -qq ${TARBALL} | git get-tar-commit-id
-Source0: linux-5.7-rc7.tar.xz
+Source0: linux-20200529gitb0c3ba31be3e.tar.xz
Source1: Makefile.rhelver
@@ -782,6 +782,34 @@ Patch75: 0001-e1000e-bump-up-timeout-to-wait-when-ME-un-configure-.patch
Patch76: 0001-perf-cs-etm-Move-defined-of-traceid_list.patch
Patch77: 0001-pwm-lpss-Fix-get_state-runtime-pm-reference-handling.patch
Patch78: 0001-x86-Fix-compile-issues-with-rh_check_supported.patch
+Patch79: 0001-disp-gv100-expose-capabilities-class.patch
+Patch80: 0001-core-memory-remove-redundant-assignments-to-variable.patch
+Patch81: 0001-acr-Use-kmemdup-instead-of-kmalloc-and-memcpy.patch
+Patch82: 0001-drm-Use-generic-helper-to-check-_PR3-presence.patch
+Patch83: 0001-mmu-Remove-unneeded-semicolon.patch
+Patch84: 0001-device-rework-mmio-mapping-code-to-get-rid-of-second.patch
+Patch85: 0001-device-detect-if-changing-endianness-failed.patch
+Patch86: 0001-device-detect-vGPUs.patch
+Patch87: 0001-device-use-regular-PRI-accessors-in-chipset-detectio.patch
+Patch88: 0001-kms-Fix-regression-by-audio-component-transition.patch
+Patch89: 0001-disp-nv50-increase-timeout-on-pio-channel-free-polli.patch
+Patch90: 0001-disp-hda-gt215-pass-head-to-nvkm_ior.hda.eld.patch
+Patch91: 0001-disp-hda-gf119-add-HAL-for-programming-device-entry-.patch
+Patch92: 0001-disp-hda-gf119-select-HDA-device-entry-based-on-boun.patch
+Patch93: 0001-disp-hda-gv100-NV_PDISP_SF_AUDIO_CNTRL0-register-mov.patch
+Patch94: 0001-kms-nv50-Initialize-core-channel-in-nouveau_display_.patch
+Patch95: 0001-kms-nv50-Probe-SOR-and-PIOR-caps-for-DP-interlacing-.patch
+Patch96: 0001-kms-gv100-Add-support-for-interlaced-modes.patch
+Patch97: 0001-kms-nv50-Move-8BPC-limit-for-MST-into-nv50_mstc_get_.patch
+Patch98: 0001-kms-nv50-Share-DP-SST-mode_valid-handling-with-MST.patch
+Patch99: 0001-virt-vbox-Fix-VBGL_IOCTL_VMMDEV_REQUEST_BIG-and-_LOG.patch
+Patch100: 0001-virt-vbox-Fix-guest-capabilities-mask-check.patch
+Patch101: 0001-virt-vbox-Rename-guest_caps-struct-members-to-set_gu.patch
+Patch102: 0001-virt-vbox-Add-vbg_set_host_capabilities-helper-funct.patch
+Patch103: 0001-virt-vbox-Add-support-for-the-new-VBG_IOCTL_ACQUIRE_.patch
+Patch104: 0001-virt-vbox-Add-a-few-new-vmmdev-request-types-to-the-.patch
+Patch105: 0001-virt-vbox-Log-unknown-ioctl-requests-as-error.patch
+Patch106: 0001-platform-x86-sony-laptop-SNC-calls-should-handle-BUF.patch
%endif
@@ -1277,8 +1305,8 @@ ApplyOptionalPatch()
fi
}
-%setup -q -n kernel-5.7-rc7 -c
-mv linux-5.7-rc7 linux-%{KVERREL}
+%setup -q -n kernel-20200529gitb0c3ba31be3e -c
+mv linux-20200529gitb0c3ba31be3e linux-%{KVERREL}
cd linux-%{KVERREL}
# cp -a %{SOURCE1} .
@@ -1362,6 +1390,34 @@ ApplyOptionalPatch 0001-e1000e-bump-up-timeout-to-wait-when-ME-un-configure-.pat
ApplyOptionalPatch 0001-perf-cs-etm-Move-defined-of-traceid_list.patch
ApplyOptionalPatch 0001-pwm-lpss-Fix-get_state-runtime-pm-reference-handling.patch
ApplyOptionalPatch 0001-x86-Fix-compile-issues-with-rh_check_supported.patch
+ApplyOptionalPatch 0001-disp-gv100-expose-capabilities-class.patch
+ApplyOptionalPatch 0001-core-memory-remove-redundant-assignments-to-variable.patch
+ApplyOptionalPatch 0001-acr-Use-kmemdup-instead-of-kmalloc-and-memcpy.patch
+ApplyOptionalPatch 0001-drm-Use-generic-helper-to-check-_PR3-presence.patch
+ApplyOptionalPatch 0001-mmu-Remove-unneeded-semicolon.patch
+ApplyOptionalPatch 0001-device-rework-mmio-mapping-code-to-get-rid-of-second.patch
+ApplyOptionalPatch 0001-device-detect-if-changing-endianness-failed.patch
+ApplyOptionalPatch 0001-device-detect-vGPUs.patch
+ApplyOptionalPatch 0001-device-use-regular-PRI-accessors-in-chipset-detectio.patch
+ApplyOptionalPatch 0001-kms-Fix-regression-by-audio-component-transition.patch
+ApplyOptionalPatch 0001-disp-nv50-increase-timeout-on-pio-channel-free-polli.patch
+ApplyOptionalPatch 0001-disp-hda-gt215-pass-head-to-nvkm_ior.hda.eld.patch
+ApplyOptionalPatch 0001-disp-hda-gf119-add-HAL-for-programming-device-entry-.patch
+ApplyOptionalPatch 0001-disp-hda-gf119-select-HDA-device-entry-based-on-boun.patch
+ApplyOptionalPatch 0001-disp-hda-gv100-NV_PDISP_SF_AUDIO_CNTRL0-register-mov.patch
+ApplyOptionalPatch 0001-kms-nv50-Initialize-core-channel-in-nouveau_display_.patch
+ApplyOptionalPatch 0001-kms-nv50-Probe-SOR-and-PIOR-caps-for-DP-interlacing-.patch
+ApplyOptionalPatch 0001-kms-gv100-Add-support-for-interlaced-modes.patch
+ApplyOptionalPatch 0001-kms-nv50-Move-8BPC-limit-for-MST-into-nv50_mstc_get_.patch
+ApplyOptionalPatch 0001-kms-nv50-Share-DP-SST-mode_valid-handling-with-MST.patch
+ApplyOptionalPatch 0001-virt-vbox-Fix-VBGL_IOCTL_VMMDEV_REQUEST_BIG-and-_LOG.patch
+ApplyOptionalPatch 0001-virt-vbox-Fix-guest-capabilities-mask-check.patch
+ApplyOptionalPatch 0001-virt-vbox-Rename-guest_caps-struct-members-to-set_gu.patch
+ApplyOptionalPatch 0001-virt-vbox-Add-vbg_set_host_capabilities-helper-funct.patch
+ApplyOptionalPatch 0001-virt-vbox-Add-support-for-the-new-VBG_IOCTL_ACQUIRE_.patch
+ApplyOptionalPatch 0001-virt-vbox-Add-a-few-new-vmmdev-request-types-to-the-.patch
+ApplyOptionalPatch 0001-virt-vbox-Log-unknown-ioctl-requests-as-error.patch
+ApplyOptionalPatch 0001-platform-x86-sony-laptop-SNC-calls-should-handle-BUF.patch
%endif
@@ -2778,6 +2834,45 @@ fi
#
#
%changelog
+* Thu May 28 2020 CKI@GitLab <cki-project@redhat.com> [5.7.0-0.rc7.20200528gitb0c3ba31be3e.1]
+- b0c3ba31be3e rebase
+- Updated changelog for the release based on 444fc5cde643 ("CKI@GitLab")
+
+* Wed May 27 2020 CKI@GitLab <cki-project@redhat.com> [5.7.0-0.rc7.20200527git444fc5cde643.1]
+- 444fc5cde643 rebase
+- platform/x86: sony-laptop: SNC calls should handle BUFFER types (Mattia Dongili)
+- virt: vbox: Log unknown ioctl requests as error (Hans de Goede)
+- virt: vbox: Add a few new vmmdev request types to the userspace whitelist (Hans de Goede)
+- virt: vbox: Add support for the new VBG_IOCTL_ACQUIRE_GUEST_CAPABILITIES ioctl (Hans de Goede)
+- virt: vbox: Add vbg_set_host_capabilities() helper function (Hans de Goede)
+- virt: vbox: Rename guest_caps struct members to set_guest_caps (Hans de Goede)
+- virt: vbox: Fix guest capabilities mask check (Hans de Goede)
+- virt: vbox: Fix VBGL_IOCTL_VMMDEV_REQUEST_BIG and _LOG req numbers to match upstream (Hans de Goede)
+- kms/nv50-: Share DP SST mode_valid() handling with MST (Lyude Paul)
+- kms/nv50-: Move 8BPC limit for MST into nv50_mstc_get_modes() (Lyude Paul)
+- kms/gv100-: Add support for interlaced modes (Lyude Paul)
+- kms/nv50-: Probe SOR and PIOR caps for DP interlacing support (Lyude Paul)
+- kms/nv50-: Initialize core channel in nouveau_display_create() (Lyude Paul)
+- disp/hda/gv100-: NV_PDISP_SF_AUDIO_CNTRL0 register moved (Ben Skeggs)
+- disp/hda/gf119-: select HDA device entry based on bound head (Ben Skeggs)
+- disp/hda/gf119-: add HAL for programming device entry in SF (Ben Skeggs)
+- disp/hda/gt215-: pass head to nvkm_ior.hda.eld() (Ben Skeggs)
+- disp/nv50-: increase timeout on pio channel free() polling (Ben Skeggs)
+- kms: Fix regression by audio component transition (Takashi Iwai)
+- device: use regular PRI accessors in chipset detection (Ben Skeggs)
+- device: detect vGPUs (Karol Herbst)
+- device: detect if changing endianness failed (Karol Herbst)
+- device: rework mmio mapping code to get rid of second map (Karol Herbst)
+- mmu: Remove unneeded semicolon (Zheng Bin)
+- drm: Use generic helper to check _PR3 presence (Kai-Heng Feng)
+- acr: Use kmemdup instead of kmalloc and memcpy (Zou Wei)
+- core/memory: remove redundant assignments to variable ret (Colin Ian King)
+- disp/gv100-: expose capabilities class (Ben Skeggs)
+- Remove typoed config file aarch64CONFIG_SM_GCC_8150 ("Justin M. Forbes")
+- Updated changelog for the release based on v5.7-rc7 ("CKI@GitLab")
+- redhat: Add dummy-module kernel module (Prarit Bhargava)
+- redhat: enable CONFIG_LWTUNNEL_BPF (Jiri Benc)
+
* Mon May 25 2020 CKI@GitLab <cki-project@redhat.com> [5.7.0-0.rc7.1]
- v5.7-rc7 rebase
- Updated changelog for the release based on caffb99b6929 ("CKI@GitLab")
diff --git a/sources b/sources
index ce3adca65..36ac92daa 100644
--- a/sources
+++ b/sources
@@ -1,3 +1,3 @@
-SHA512 (linux-5.7-rc7.tar.xz) = d2553e8f25f988f796f017c4425ae3c45f6f468785b6ab29f8fe380832da42e9023cf1ed7ff04bcaeea8aea772942a98de301af1fa6b2103c26119c3738a6bb3
-SHA512 (kernel-abi-whitelists-5.7.0-0.rc7.1.tar.bz2) = 0354fc494949869eb0414c302b01f6900779a10eabf98e8c5d59f258c1a9217173b81b8e968fa501ee2ae44391e647cf22e19e016c6eb6f756fe89807156e309
-SHA512 (kernel-kabi-dw-5.7.0-0.rc7.1.tar.bz2) = b279439b7bdd140df979367fde66b294fc9888bd66f51d850f7520fb9ab20ad4e9449a16ced7dd0893bafed7dad5017997dbf4b6bc2ed4f71574670b7e052126
+SHA512 (linux-20200529gitb0c3ba31be3e.tar.xz) = 8320ecf812b972de6ce45b19027aec0186ab638292998920fbde877d8ed91b474cf768295731b243175c852fcfa044c15dce5d2435b3571c831afd7ff552b499
+SHA512 (kernel-abi-whitelists-5.7.0-0.rc7.20200529gitb0c3ba31be3e.1.tar.bz2) = af0d71077bf8ac12ee60414db29b9d8ff1d440ca716c73e60d74605b3c1f980909466e0be24c7440cfea39ae7860c1b18513114302a94bab3aca6cde2458c88f
+SHA512 (kernel-kabi-dw-5.7.0-0.rc7.20200529gitb0c3ba31be3e.1.tar.bz2) = 6ede21f3f4edb4e28c14b26a3a4c2e77fa068a82a8ca18f04017fb71b167566b7ae50071455300f1fc77e38b65186782358b876716b3b89fd3b0089dba160f9c