On 22/02/2019 05:49, Gerd Hoffmann wrote:
This allows configure the display resolution which the vgpu should use.

"configure" -> "configuration of" or "us to configure" ?

The information will be passed to the guest using EDID, so the mdev
driver must support the vfio edid region for this to work.

Signed-off-by: Gerd Hoffmann <kra...@redhat.com>


Reviewed-by: Liam Merwick <liam.merw...@oracle.com>


---
  hw/vfio/pci.h     |  2 ++
  hw/vfio/display.c | 12 ++++++++++--
  hw/vfio/pci.c     | 12 ++++++++++++
  3 files changed, 24 insertions(+), 2 deletions(-)

diff --git a/hw/vfio/pci.h b/hw/vfio/pci.h
index b1ae4c07549a..c11c3f167070 100644
--- a/hw/vfio/pci.h
+++ b/hw/vfio/pci.h
@@ -149,6 +149,8 @@ typedef struct VFIOPCIDevice {
  #define VFIO_FEATURE_ENABLE_IGD_OPREGION \
                                  (1 << VFIO_FEATURE_ENABLE_IGD_OPREGION_BIT)
      OnOffAuto display;
+    uint32_t display_xres;
+    uint32_t display_yres;
      int32_t bootindex;
      uint32_t igd_gms;
      OffAutoPCIBAR msix_relo;
diff --git a/hw/vfio/display.c b/hw/vfio/display.c
index f59fcc487128..8bf7c890be96 100644
--- a/hw/vfio/display.c
+++ b/hw/vfio/display.c
@@ -46,8 +46,8 @@ static void vfio_display_edid_update(VFIOPCIDevice *vdev, 
bool enabled,
      qemu_edid_info edid = {
          .maxx  = dpy->edid_regs->max_xres,
          .maxy  = dpy->edid_regs->max_yres,
-        .prefx = prefx,
-        .prefy = prefy,
+        .prefx = prefx ?: vdev->display_xres,
+        .prefy = prefy ?: vdev->display_yres,
      };
dpy->edid_regs->link_state = VFIO_DEVICE_GFX_LINK_STATE_DOWN;
@@ -128,6 +128,14 @@ static void vfio_display_edid_init(VFIOPCIDevice *vdev)
      pread_field(fd, dpy->edid_info, dpy->edid_regs, max_yres);
      dpy->edid_blob = g_malloc0(dpy->edid_regs->edid_max_size);
+ /* if xres + yres properties are unset use the maximum resolution */
+    if (!vdev->display_xres) {
+        vdev->display_xres = dpy->edid_regs->max_xres;
+    }
+    if (!vdev->display_yres) {
+        vdev->display_yres = dpy->edid_regs->max_yres;
+    }
+
      vfio_display_edid_update(vdev, true, 0, 0);
      return;
diff --git a/hw/vfio/pci.c b/hw/vfio/pci.c
index dd12f363915d..504019c4582b 100644
--- a/hw/vfio/pci.c
+++ b/hw/vfio/pci.c
@@ -3068,6 +3068,16 @@ static void vfio_realize(PCIDevice *pdev, Error **errp)
          error_setg(errp, "ramfb=on requires display=on");
          goto out_teardown;
      }
+    if (vdev->display_xres || vdev->display_yres) {
+        if (vdev->dpy == NULL) {
+            error_setg(errp, "xres and yres properties require display=on");
+            goto out_teardown;
+        }
+        if (vdev->dpy->edid_regs == NULL) {
+            error_setg(errp, "xres and yres properties need edid support");
+            goto out_teardown;
+        }
+    }
vfio_register_err_notifier(vdev);
      vfio_register_req_notifier(vdev);
@@ -3182,6 +3192,8 @@ static Property vfio_pci_dev_properties[] = {
      DEFINE_PROP_STRING("sysfsdev", VFIOPCIDevice, vbasedev.sysfsdev),
      DEFINE_PROP_ON_OFF_AUTO("display", VFIOPCIDevice,
                              display, ON_OFF_AUTO_OFF),
+    DEFINE_PROP_UINT32("xres", VFIOPCIDevice, display_xres, 0),
+    DEFINE_PROP_UINT32("yres", VFIOPCIDevice, display_yres, 0),
      DEFINE_PROP_UINT32("x-intx-mmap-timeout-ms", VFIOPCIDevice,
                         intx.mmap_timeout, 1100),
      DEFINE_PROP_BIT("x-vga", VFIOPCIDevice, features,



Reply via email to