diff --git a/debian/changelog b/debian/changelog
index eddf1b8..9e214e0 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,13 @@
+qemu (1:2.11+dfsg-1ubuntu7.20) bionic; urgency=medium
+
+  * d/p/lp-1842774-s390x-cpumodel-Add-the-z15-name-to-the-description-o.patch:
+    update the z15 model name (LP: #1842774)
+  * d/p/u/lp-1847948-*: allow MSIX BAR mapping on VFIO in general and use that
+    instead of emulation on ppc64 increasing performance of e.g. NVME
+    passthrough (LP: #1847948)
+
+ -- Christian Ehrhardt <christian.ehrhardt@canonical.com>  Tue, 15 Oct 2019 11:23:23 +0200
+
 qemu (1:2.11+dfsg-1ubuntu7.19) bionic; urgency=medium
 
   * d/p/ubuntu/lp-1837869-block-Fix-flags-in-reopen-queue.patch: avoid
diff --git a/debian/patches/lp-1847948-vfio-Use-a-trace-point-when-a-RAM-section-cannot-be-.patch b/debian/patches/lp-1847948-vfio-Use-a-trace-point-when-a-RAM-section-cannot-be-.patch
new file mode 100644
index 0000000..ee036ab
--- /dev/null
+++ b/debian/patches/lp-1847948-vfio-Use-a-trace-point-when-a-RAM-section-cannot-be-.patch
@@ -0,0 +1,81 @@
+From 5c08600547c059e3fd072995f9f367cdaf3c7d9d Mon Sep 17 00:00:00 2001
+From: Eric Auger <eric.auger@redhat.com>
+Date: Wed, 4 Apr 2018 22:30:50 +0200
+Subject: [PATCH] vfio: Use a trace point when a RAM section cannot be DMA
+ mapped
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Commit 567b5b309abe ("vfio/pci: Relax DMA map errors for MMIO regions")
+added an error message if a passed memory section address or size
+is not aligned to the page size and thus cannot be DMA mapped.
+
+This patch fixes the trace by printing the region name and the
+memory region section offset within the address space (instead of
+offset_within_region).
+
+We also turn the error_report into a trace event. Indeed, In some
+cases, the traces can be confusing to non expert end-users and
+let think the use case does not work (whereas it works as before).
+
+This is the case where a BAR is successively mapped at different
+GPAs and its sections are not compatible with dma map. The listener
+is called several times and traces are issued for each intermediate
+mapping.  The end-user cannot easily match those GPAs against the
+final GPA output by lscpi. So let's keep those information to
+informed users. In mid term, the plan is to advise the user about
+BAR relocation relevance.
+
+Fixes: 567b5b309abe ("vfio/pci: Relax DMA map errors for MMIO regions")
+Signed-off-by: Eric Auger <eric.auger@redhat.com>
+Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
+Reviewed-by: Alexey Kardashevskiy <aik@ozlabs.ru>
+Signed-off-by: Alex Williamson <alex.williamson@redhat.com>
+
+Origin: upstream, https://git.qemu.org/?p=qemu.git;a=commit;h=5c08600547c05
+Bug-Ubuntu: https://bugs.launchpad.net/bugs/1847948
+Last-Update: 2019-10-16
+
+---
+ hw/vfio/common.c     | 11 +++++------
+ hw/vfio/trace-events |  1 +
+ 2 files changed, 6 insertions(+), 6 deletions(-)
+
+diff --git a/hw/vfio/common.c b/hw/vfio/common.c
+index 5e84716218..07ffa0ba10 100644
+--- a/hw/vfio/common.c
++++ b/hw/vfio/common.c
+@@ -548,12 +548,11 @@ static void vfio_listener_region_add(MemoryListener *listener,
+         hwaddr pgmask = (1ULL << ctz64(hostwin->iova_pgsizes)) - 1;
+ 
+         if ((iova & pgmask) || (int128_get64(llsize) & pgmask)) {
+-            error_report("Region 0x%"HWADDR_PRIx"..0x%"HWADDR_PRIx
+-                         " is not aligned to 0x%"HWADDR_PRIx
+-                         " and cannot be mapped for DMA",
+-                         section->offset_within_region,
+-                         int128_getlo(section->size),
+-                         pgmask + 1);
++            trace_vfio_listener_region_add_no_dma_map(
++                memory_region_name(section->mr),
++                section->offset_within_address_space,
++                int128_getlo(section->size),
++                pgmask + 1);
+             return;
+         }
+     }
+diff --git a/hw/vfio/trace-events b/hw/vfio/trace-events
+index 79f63a2ff6..20109cb758 100644
+--- a/hw/vfio/trace-events
++++ b/hw/vfio/trace-events
+@@ -90,6 +90,7 @@ vfio_iommu_map_notify(const char *op, uint64_t iova_start, uint64_t iova_end) "i
+ vfio_listener_region_add_skip(uint64_t start, uint64_t end) "SKIPPING region_add 0x%"PRIx64" - 0x%"PRIx64
+ vfio_listener_region_add_iommu(uint64_t start, uint64_t end) "region_add [iommu] 0x%"PRIx64" - 0x%"PRIx64
+ vfio_listener_region_add_ram(uint64_t iova_start, uint64_t iova_end, void *vaddr) "region_add [ram] 0x%"PRIx64" - 0x%"PRIx64" [%p]"
++vfio_listener_region_add_no_dma_map(const char *name, uint64_t iova, uint64_t size, uint64_t page_size) "Region \"%s\" 0x%"PRIx64" size=0x%"PRIx64" is not aligned to 0x%"PRIx64" and cannot be mapped for DMA"
+ vfio_listener_region_del_skip(uint64_t start, uint64_t end) "SKIPPING region_del 0x%"PRIx64" - 0x%"PRIx64
+ vfio_listener_region_del(uint64_t start, uint64_t end) "region_del 0x%"PRIx64" - 0x%"PRIx64
+ vfio_disconnect_container(int fd) "close container->fd=%d"
+-- 
+2.23.0
+
diff --git a/debian/patches/lp-1847948-vfio-pci-Relax-DMA-map-errors-for-MMIO-regions.patch b/debian/patches/lp-1847948-vfio-pci-Relax-DMA-map-errors-for-MMIO-regions.patch
new file mode 100644
index 0000000..7994041
--- /dev/null
+++ b/debian/patches/lp-1847948-vfio-pci-Relax-DMA-map-errors-for-MMIO-regions.patch
@@ -0,0 +1,137 @@
+From 567b5b309abe744b1098018a2eb157e7109c9f30 Mon Sep 17 00:00:00 2001
+From: Alexey Kardashevskiy <aik@ozlabs.ru>
+Date: Tue, 13 Mar 2018 11:17:30 -0600
+Subject: [PATCH] vfio/pci: Relax DMA map errors for MMIO regions
+
+At the moment if vfio_memory_listener is registered in the system memory
+address space, it maps/unmaps every RAM memory region for DMA.
+It expects system page size aligned memory sections so vfio_dma_map
+would not fail and so far this has been the case. A mapping failure
+would be fatal. A side effect of such behavior is that some MMIO pages
+would not be mapped silently.
+
+However we are going to change MSIX BAR handling so we will end having
+non-aligned sections in vfio_memory_listener (more details is in
+the next patch) and vfio_dma_map will exit QEMU.
+
+In order to avoid fatal failures on what previously was not a failure and
+was just silently ignored, this checks the section alignment to
+the smallest supported IOMMU page size and prints an error if not aligned;
+it also prints an error if vfio_dma_map failed despite the page size check.
+Both errors are not fatal; only MMIO RAM regions are checked
+(aka "RAM device" regions).
+
+If the amount of errors printed is overwhelming, the MSIX relocation
+could be used to avoid excessive error output.
+
+This is unlikely to cause any behavioral change.
+
+Signed-off-by: Alexey Kardashevskiy <aik@ozlabs.ru>
+[aw: Fix Int128 bit ops]
+Signed-off-by: Alex Williamson <alex.williamson@redhat.com>
+
+Origin: upstream, https://git.qemu.org/?p=qemu.git;a=commit;h=567b5b309abe7
+Bug-Ubuntu: https://bugs.launchpad.net/bugs/1847948
+Last-Update: 2019-10-16
+
+---
+ hw/vfio/common.c | 55 ++++++++++++++++++++++++++++++++++++++++++------
+ 1 file changed, 49 insertions(+), 6 deletions(-)
+
+diff --git a/hw/vfio/common.c b/hw/vfio/common.c
+index 6a8203a532..07c03d78b6 100644
+--- a/hw/vfio/common.c
++++ b/hw/vfio/common.c
+@@ -544,18 +544,40 @@ static void vfio_listener_region_add(MemoryListener *listener,
+ 
+     llsize = int128_sub(llend, int128_make64(iova));
+ 
++    if (memory_region_is_ram_device(section->mr)) {
++        hwaddr pgmask = (1ULL << ctz64(hostwin->iova_pgsizes)) - 1;
++
++        if ((iova & pgmask) || (int128_get64(llsize) & pgmask)) {
++            error_report("Region 0x%"HWADDR_PRIx"..0x%"HWADDR_PRIx
++                         " is not aligned to 0x%"HWADDR_PRIx
++                         " and cannot be mapped for DMA",
++                         section->offset_within_region,
++                         int128_getlo(section->size),
++                         pgmask + 1);
++            return;
++        }
++    }
++
+     ret = vfio_dma_map(container, iova, int128_get64(llsize),
+                        vaddr, section->readonly);
+     if (ret) {
+         error_report("vfio_dma_map(%p, 0x%"HWADDR_PRIx", "
+                      "0x%"HWADDR_PRIx", %p) = %d (%m)",
+                      container, iova, int128_get64(llsize), vaddr, ret);
++        if (memory_region_is_ram_device(section->mr)) {
++            /* Allow unexpected mappings not to be fatal for RAM devices */
++            return;
++        }
+         goto fail;
+     }
+ 
+     return;
+ 
+ fail:
++    if (memory_region_is_ram_device(section->mr)) {
++        error_report("failed to vfio_dma_map. pci p2p may not work");
++        return;
++    }
+     /*
+      * On the initfn path, store the first error in the container so we
+      * can gracefully fail.  Runtime, there's not much we can do other
+@@ -577,6 +599,7 @@ static void vfio_listener_region_del(MemoryListener *listener,
+     hwaddr iova, end;
+     Int128 llend, llsize;
+     int ret;
++    bool try_unmap = true;
+ 
+     if (vfio_listener_skipped_section(section)) {
+         trace_vfio_listener_region_del_skip(
+@@ -629,14 +652,34 @@ static void vfio_listener_region_del(MemoryListener *listener,
+ 
+     trace_vfio_listener_region_del(iova, end);
+ 
+-    ret = vfio_dma_unmap(container, iova, int128_get64(llsize));
+-    memory_region_unref(section->mr);
+-    if (ret) {
+-        error_report("vfio_dma_unmap(%p, 0x%"HWADDR_PRIx", "
+-                     "0x%"HWADDR_PRIx") = %d (%m)",
+-                     container, iova, int128_get64(llsize), ret);
++    if (memory_region_is_ram_device(section->mr)) {
++        hwaddr pgmask;
++        VFIOHostDMAWindow *hostwin;
++        bool hostwin_found = false;
++
++        QLIST_FOREACH(hostwin, &container->hostwin_list, hostwin_next) {
++            if (hostwin->min_iova <= iova && end <= hostwin->max_iova) {
++                hostwin_found = true;
++                break;
++            }
++        }
++        assert(hostwin_found); /* or region_add() would have failed */
++
++        pgmask = (1ULL << ctz64(hostwin->iova_pgsizes)) - 1;
++        try_unmap = !((iova & pgmask) || (int128_get64(llsize) & pgmask));
++    }
++
++    if (try_unmap) {
++        ret = vfio_dma_unmap(container, iova, int128_get64(llsize));
++        if (ret) {
++            error_report("vfio_dma_unmap(%p, 0x%"HWADDR_PRIx", "
++                         "0x%"HWADDR_PRIx") = %d (%m)",
++                         container, iova, int128_get64(llsize), ret);
++        }
+     }
+ 
++    memory_region_unref(section->mr);
++
+     if (container->iommu_type == VFIO_SPAPR_TCE_v2_IOMMU) {
+         vfio_spapr_remove_window(container,
+                                  section->offset_within_address_space);
+-- 
+2.23.0
+
diff --git a/debian/patches/series b/debian/patches/series
index d6a690a..b2015aa 100644
--- a/debian/patches/series
+++ b/debian/patches/series
@@ -123,3 +123,8 @@ ubuntu/lp-1836154-09-s390-cpumodel-fix-description-for-the-new-vector-fac.patch
 ubuntu/lp-1836154-s390x-cpumodel-remove-esort-from-the-default-model.patch
 ubuntu/lp-1836154-s390x-cpumodel-also-change-name-of-vxbeh.patch
 ubuntu/lp-1837869-block-Fix-flags-in-reopen-queue.patch
+ubuntu/lp-1842774-s390x-cpumodel-Add-the-z15-name-to-the-description-o.patch
+ubuntu/lp-1847948-vfio-pci-Allow-mmap-of-MSIX-BAR.patch
+ubuntu/lp-1847948-ppc-spapr-vfio-Turn-off-MSIX-emulation-for-VFIO-devi.patch
+lp-1847948-vfio-pci-Relax-DMA-map-errors-for-MMIO-regions.patch
+lp-1847948-vfio-Use-a-trace-point-when-a-RAM-section-cannot-be-.patch
diff --git a/debian/patches/ubuntu/lp-1842774-s390x-cpumodel-Add-the-z15-name-to-the-description-o.patch b/debian/patches/ubuntu/lp-1842774-s390x-cpumodel-Add-the-z15-name-to-the-description-o.patch
new file mode 100644
index 0000000..e888e41
--- /dev/null
+++ b/debian/patches/ubuntu/lp-1842774-s390x-cpumodel-Add-the-z15-name-to-the-description-o.patch
@@ -0,0 +1,30 @@
+From 7505deca0bfa859136ec6419dbafc504f22fcac2 Mon Sep 17 00:00:00 2001
+From: Christian Borntraeger <borntraeger@de.ibm.com>
+Date: Wed, 18 Sep 2019 16:42:14 +0200
+Subject: [PATCH] s390x/cpumodel: Add the z15 name to the description of gen15a
+
+We now know that gen15a is called z15.
+
+Reviewed-by: David Hildenbrand <david@redhat.com>
+Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com>
+
+Backport-Note: context slightly changed for z14.2
+Origin: backport, https://git.qemu.org/?p=qemu.git;a=commit;h=7505deca
+Bug-Ubuntu: https://bugs.launchpad.net/bugs/1842774
+Last-Update: 2019-09-24
+
+---
+ target/s390x/cpu_models.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+--- a/target/s390x/cpu_models.c
++++ b/target/s390x/cpu_models.c
+@@ -79,7 +79,7 @@ static S390CPUDef s390_cpu_defs[] = {
+     CPUDEF_INIT(0x2965, 13, 2, 47, 0x08000000U, "z13s", "IBM z13s GA1"),
+     CPUDEF_INIT(0x3906, 14, 1, 47, 0x08000000U, "z14", "IBM z14 GA1"),
+     CPUDEF_INIT(0x3907, 14, 1, 47, 0x08000000U, "z14ZR1", "IBM z14 Model ZR1 GA1"),
+-    CPUDEF_INIT(0x8561, 15, 1, 47, 0x08000000U, "gen15a", "IBM 8561 GA1"),
++    CPUDEF_INIT(0x8561, 15, 1, 47, 0x08000000U, "gen15a", "IBM z15 GA1"),
+     CPUDEF_INIT(0x8562, 15, 1, 47, 0x08000000U, "gen15b", "IBM 8562 GA1"),
+ };
+ 
diff --git a/debian/patches/ubuntu/lp-1847948-ppc-spapr-vfio-Turn-off-MSIX-emulation-for-VFIO-devi.patch b/debian/patches/ubuntu/lp-1847948-ppc-spapr-vfio-Turn-off-MSIX-emulation-for-VFIO-devi.patch
new file mode 100644
index 0000000..8d3f8b0
--- /dev/null
+++ b/debian/patches/ubuntu/lp-1847948-ppc-spapr-vfio-Turn-off-MSIX-emulation-for-VFIO-devi.patch
@@ -0,0 +1,82 @@
+From fcad0d2121976df4b422b4007a5eb7fcaac01134 Mon Sep 17 00:00:00 2001
+From: Alexey Kardashevskiy <aik@ozlabs.ru>
+Date: Tue, 13 Mar 2018 11:17:31 -0600
+Subject: [PATCH] ppc/spapr, vfio: Turn off MSIX emulation for VFIO devices
+
+This adds a possibility for the platform to tell VFIO not to emulate MSIX
+so MMIO memory regions do not get split into chunks in flatview and
+the entire page can be registered as a KVM memory slot and make direct
+MMIO access possible for the guest.
+
+This enables the entire MSIX BAR mapping to the guest for the pseries
+platform in order to achieve the maximum MMIO preformance for certain
+devices.
+
+Tested on:
+LSI Logic / Symbios Logic SAS3008 PCI-Express Fusion-MPT SAS-3 (rev 02)
+
+Signed-off-by: Alexey Kardashevskiy <aik@ozlabs.ru>
+Reviewed-by: David Gibson <david@gibson.dropbear.id.au>
+Signed-off-by: Alex Williamson <alex.williamson@redhat.com>
+
+Origin: upstream, https://git.qemu.org/?p=qemu.git;a=commit;h=fcad0d2121976df4b422b4007a5e
+Bug-Ubuntu: https://bugs.launchpad.net/bugs/1847948
+Last-Update: 2019-10-15
+
+---
+ hw/ppc/spapr.c |  7 +++++++
+ hw/vfio/pci.c  | 13 +++++++++++++
+ 2 files changed, 20 insertions(+)
+
+diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c
+index 7e1c858566..032d03423f 100644
+--- a/hw/ppc/spapr.c
++++ b/hw/ppc/spapr.c
+@@ -2855,6 +2855,11 @@ static void spapr_set_modern_hotplug_events(Object *obj, bool value,
+     spapr->use_hotplug_event_source = value;
+ }
+ 
++static bool spapr_get_msix_emulation(Object *obj, Error **errp)
++{
++    return true;
++}
++
+ static char *spapr_get_resize_hpt(Object *obj, Error **errp)
+ {
+     sPAPRMachineState *spapr = SPAPR_MACHINE(obj);
+@@ -2936,6 +2941,8 @@ static void spapr_instance_init(Object *obj)
+     object_property_set_description(obj, "vsmt",
+                                     "Virtual SMT: KVM behaves as if this were"
+                                     " the host's SMT mode", &error_abort);
++    object_property_add_bool(obj, "vfio-no-msix-emulation",
++                             spapr_get_msix_emulation, NULL, NULL);
+ }
+ 
+ static void spapr_machine_finalizefn(Object *obj)
+diff --git a/hw/vfio/pci.c b/hw/vfio/pci.c
+index 02974f4eb9..b9bc6cd310 100644
+--- a/hw/vfio/pci.c
++++ b/hw/vfio/pci.c
+@@ -1581,6 +1581,19 @@ static int vfio_msix_setup(VFIOPCIDevice *vdev, int pos, Error **errp)
+      */
+     memory_region_set_enabled(&vdev->pdev.msix_pba_mmio, false);
+ 
++    /*
++     * The emulated machine may provide a paravirt interface for MSIX setup
++     * so it is not strictly necessary to emulate MSIX here. This becomes
++     * helpful when frequently accessed MMIO registers are located in
++     * subpages adjacent to the MSIX table but the MSIX data containing page
++     * cannot be mapped because of a host page size bigger than the MSIX table
++     * alignment.
++     */
++    if (object_property_get_bool(OBJECT(qdev_get_machine()),
++                                 "vfio-no-msix-emulation", NULL)) {
++        memory_region_set_enabled(&vdev->pdev.msix_table_mmio, false);
++    }
++
+     return 0;
+ }
+ 
+-- 
+2.23.0
+
diff --git a/debian/patches/ubuntu/lp-1847948-vfio-pci-Allow-mmap-of-MSIX-BAR.patch b/debian/patches/ubuntu/lp-1847948-vfio-pci-Allow-mmap-of-MSIX-BAR.patch
new file mode 100644
index 0000000..b0c1550
--- /dev/null
+++ b/debian/patches/ubuntu/lp-1847948-vfio-pci-Allow-mmap-of-MSIX-BAR.patch
@@ -0,0 +1,95 @@
+From ae0215b2bb56a9d5321a185dde133bfdd306a4c0 Mon Sep 17 00:00:00 2001
+From: Alexey Kardashevskiy <aik@ozlabs.ru>
+Date: Tue, 13 Mar 2018 11:17:31 -0600
+Subject: [PATCH] vfio-pci: Allow mmap of MSIX BAR
+
+At the moment we unconditionally avoid mapping MSIX data of a BAR and
+emulate MSIX table in QEMU. However it is 1) not always necessary as
+a platform may provide a paravirt interface for MSIX configuration;
+2) can affect the speed of MMIO access by emulating them in QEMU when
+frequently accessed registers share same system page with MSIX data,
+this is particularly a problem for systems with the page size bigger
+than 4KB.
+
+A new capability - VFIO_REGION_INFO_CAP_MSIX_MAPPABLE - has been added
+to the kernel [1] which tells the userspace that mapping of the MSIX data
+is possible now. This makes use of it so from now on QEMU tries mapping
+the entire BAR as a whole and emulate MSIX on top of that.
+
+[1] https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=a32295c612c57990d17fb0f41e7134394b2f35f6
+
+Signed-off-by: Alexey Kardashevskiy <aik@ozlabs.ru>
+Reviewed-by: David Gibson <david@gibson.dropbear.id.au>
+Signed-off-by: Alex Williamson <alex.williamson@redhat.com>
+
+Origin: upstream, https://git.qemu.org/?p=qemu.git;a=commit;h=ae0215b2bb56a9d5321a185dde13
+Bug-Ubuntu: https://bugs.launchpad.net/bugs/1847948
+Last-Update: 2019-10-15
+
+---
+ hw/vfio/common.c              | 15 +++++++++++++++
+ hw/vfio/pci.c                 |  9 +++++++++
+ include/hw/vfio/vfio-common.h |  1 +
+ 3 files changed, 25 insertions(+)
+
+diff --git a/hw/vfio/common.c b/hw/vfio/common.c
+index 07c03d78b6..5e84716218 100644
+--- a/hw/vfio/common.c
++++ b/hw/vfio/common.c
+@@ -1471,6 +1471,21 @@ int vfio_get_dev_region_info(VFIODevice *vbasedev, uint32_t type,
+     return -ENODEV;
+ }
+ 
++bool vfio_has_region_cap(VFIODevice *vbasedev, int region, uint16_t cap_type)
++{
++    struct vfio_region_info *info = NULL;
++    bool ret = false;
++
++    if (!vfio_get_region_info(vbasedev, region, &info)) {
++        if (vfio_get_region_info_cap(info, cap_type)) {
++            ret = true;
++        }
++        g_free(info);
++    }
++
++    return ret;
++}
++
+ /*
+  * Interfaces for IBM EEH (Enhanced Error Handling)
+  */
+diff --git a/hw/vfio/pci.c b/hw/vfio/pci.c
+index b9d2c12b82..02974f4eb9 100644
+--- a/hw/vfio/pci.c
++++ b/hw/vfio/pci.c
+@@ -1294,6 +1294,15 @@ static void vfio_pci_fixup_msix_region(VFIOPCIDevice *vdev)
+     off_t start, end;
+     VFIORegion *region = &vdev->bars[vdev->msix->table_bar].region;
+ 
++    /*
++     * If the host driver allows mapping of a MSIX data, we are going to
++     * do map the entire BAR and emulate MSIX table on top of that.
++     */
++    if (vfio_has_region_cap(&vdev->vbasedev, region->nr,
++                            VFIO_REGION_INFO_CAP_MSIX_MAPPABLE)) {
++        return;
++    }
++
+     /*
+      * We expect to find a single mmap covering the whole BAR, anything else
+      * means it's either unsupported or already setup.
+diff --git a/include/hw/vfio/vfio-common.h b/include/hw/vfio/vfio-common.h
+index c5efa32750..d9360148e6 100644
+--- a/include/hw/vfio/vfio-common.h
++++ b/include/hw/vfio/vfio-common.h
+@@ -193,6 +193,7 @@ int vfio_get_region_info(VFIODevice *vbasedev, int index,
+                          struct vfio_region_info **info);
+ int vfio_get_dev_region_info(VFIODevice *vbasedev, uint32_t type,
+                              uint32_t subtype, struct vfio_region_info **info);
++bool vfio_has_region_cap(VFIODevice *vbasedev, int region, uint16_t cap_type);
+ #endif
+ extern const MemoryListener vfio_prereg_listener;
+ 
+-- 
+2.23.0
+
