[PATCH 19/22] vfio/igd.c: use QOM casts where appropriate

Mark Cave-Ayland posted 22 patches 4 months ago
Maintainers: Nicholas Piggin <npiggin@gmail.com>, Daniel Henrique Barboza <danielhb413@gmail.com>, Harsh Prateek Bora <harshpb@linux.ibm.com>, Matthew Rosato <mjrosato@linux.ibm.com>, Eric Farman <farman@linux.ibm.com>, Richard Henderson <richard.henderson@linaro.org>, David Hildenbrand <david@redhat.com>, Ilya Leoshkevich <iii@linux.ibm.com>, Thomas Huth <thuth@redhat.com>, Halil Pasic <pasic@linux.ibm.com>, Christian Borntraeger <borntraeger@linux.ibm.com>, John Levon <john.levon@nutanix.com>, Thanos Makatos <thanos.makatos@nutanix.com>, Alex Williamson <alex.williamson@redhat.com>, "Cédric Le Goater" <clg@redhat.com>, Steve Sistare <steven.sistare@oracle.com>, Tomita Moeko <tomitamoeko@gmail.com>
[PATCH 19/22] vfio/igd.c: use QOM casts where appropriate
Posted by Mark Cave-Ayland 4 months ago
Use QOM casts to convert between VFIOPCIDevice and PCIDevice instead of
accessing pdev directly.

Signed-off-by: Mark Cave-Ayland <mark.caveayland@nutanix.com>
---
 hw/vfio/igd.c | 38 +++++++++++++++++++++-----------------
 1 file changed, 21 insertions(+), 17 deletions(-)

diff --git a/hw/vfio/igd.c b/hw/vfio/igd.c
index e7a9d1ffc1..d3ffbe7db6 100644
--- a/hw/vfio/igd.c
+++ b/hw/vfio/igd.c
@@ -199,7 +199,7 @@ static bool vfio_pci_igd_opregion_detect(VFIOPCIDevice *vdev,
     }
 
     /* Hotplugging is not supported for opregion access */
-    if (vdev->pdev.qdev.hotplugged) {
+    if (DEVICE(vdev)->hotplugged) {
         warn_report("IGD device detected, but OpRegion is not supported "
                     "on hotplugged device.");
         return false;
@@ -259,11 +259,12 @@ static int vfio_pci_igd_copy(VFIOPCIDevice *vdev, PCIDevice *pdev,
 static int vfio_pci_igd_host_init(VFIOPCIDevice *vdev,
                                   struct vfio_region_info *info)
 {
+    PCIDevice *pdev = PCI_DEVICE(vdev);
     PCIBus *bus;
     PCIDevice *host_bridge;
     int ret;
 
-    bus = pci_device_root_bus(&vdev->pdev);
+    bus = pci_device_root_bus(pdev);
     host_bridge = pci_find_device(bus, 0, PCI_DEVFN(0, 0));
 
     if (!host_bridge) {
@@ -326,13 +327,14 @@ type_init(vfio_pci_igd_register_types)
 static int vfio_pci_igd_lpc_init(VFIOPCIDevice *vdev,
                                  struct vfio_region_info *info)
 {
+    PCIDevice *pdev = PCI_DEVICE(vdev);
     PCIDevice *lpc_bridge;
     int ret;
 
-    lpc_bridge = pci_find_device(pci_device_root_bus(&vdev->pdev),
+    lpc_bridge = pci_find_device(pci_device_root_bus(pdev),
                                  0, PCI_DEVFN(0x1f, 0));
     if (!lpc_bridge) {
-        lpc_bridge = pci_create_simple(pci_device_root_bus(&vdev->pdev),
+        lpc_bridge = pci_create_simple(pci_device_root_bus(pdev),
                                  PCI_DEVFN(0x1f, 0), "vfio-pci-igd-lpc-bridge");
     }
 
@@ -349,13 +351,14 @@ static bool vfio_pci_igd_setup_lpc_bridge(VFIOPCIDevice *vdev, Error **errp)
 {
     struct vfio_region_info *host = NULL;
     struct vfio_region_info *lpc = NULL;
+    PCIDevice *pdev = PCI_DEVICE(vdev);
     PCIDevice *lpc_bridge;
     int ret;
 
     /*
      * Copying IDs or creating new devices are not supported on hotplug
      */
-    if (vdev->pdev.qdev.hotplugged) {
+    if (DEVICE(vdev)->hotplugged) {
         error_setg(errp, "IGD LPC is not supported on hotplugged device");
         return false;
     }
@@ -365,7 +368,7 @@ static bool vfio_pci_igd_setup_lpc_bridge(VFIOPCIDevice *vdev, Error **errp)
      * can stuff host values into, so if there's already one there and it's not
      * one we can hack on, this quirk is no-go.  Sorry Q35.
      */
-    lpc_bridge = pci_find_device(pci_device_root_bus(&vdev->pdev),
+    lpc_bridge = pci_find_device(pci_device_root_bus(pdev),
                                  0, PCI_DEVFN(0x1f, 0));
     if (lpc_bridge && !object_dynamic_cast(OBJECT(lpc_bridge),
                                            "vfio-pci-igd-lpc-bridge")) {
@@ -509,6 +512,7 @@ void vfio_probe_igd_bar0_quirk(VFIOPCIDevice *vdev, int nr)
 static bool vfio_pci_igd_config_quirk(VFIOPCIDevice *vdev, Error **errp)
 {
     struct vfio_region_info *opregion = NULL;
+    PCIDevice *pdev = PCI_DEVICE(vdev);
     int ret, gen;
     uint64_t gms_size = 0;
     uint64_t *bdsm_size;
@@ -528,7 +532,7 @@ static bool vfio_pci_igd_config_quirk(VFIOPCIDevice *vdev, Error **errp)
     info_report("OpRegion detected on Intel display %x.", vdev->device_id);
 
     gen = igd_gen(vdev);
-    gmch = vfio_pci_read_config(&vdev->pdev, IGD_GMCH, 4);
+    gmch = vfio_pci_read_config(pdev, IGD_GMCH, 4);
 
     /*
      * For backward compatibility, enable legacy mode when
@@ -540,7 +544,7 @@ static bool vfio_pci_igd_config_quirk(VFIOPCIDevice *vdev, Error **errp)
     if ((vdev->igd_legacy_mode != ON_OFF_AUTO_OFF) &&
         (gen >= 6 && gen <= 9) &&
         !strcmp(MACHINE_GET_CLASS(qdev_get_machine())->family, "pc_piix") &&
-        (&vdev->pdev == pci_find_device(pci_device_root_bus(&vdev->pdev),
+        (pdev == pci_find_device(pci_device_root_bus(pdev),
         0, PCI_DEVFN(0x2, 0)))) {
         /*
          * IGD legacy mode requires:
@@ -562,7 +566,7 @@ static bool vfio_pci_igd_config_quirk(VFIOPCIDevice *vdev, Error **errp)
          */
         ret = vfio_device_get_region_info(&vdev->vbasedev,
                                           VFIO_PCI_ROM_REGION_INDEX, &rom);
-        if ((ret || !rom->size) && !vdev->pdev.romfile) {
+        if ((ret || !rom->size) && !pdev->romfile) {
             error_setg(&err, "Device has no ROM");
             goto error;
         }
@@ -605,8 +609,8 @@ static bool vfio_pci_igd_config_quirk(VFIOPCIDevice *vdev, Error **errp)
      * ASLS (OpRegion address) is read-only, emulated
      * It contains HPA, guest firmware need to reprogram it with GPA.
      */
-    pci_set_long(vdev->pdev.config + IGD_ASLS, 0);
-    pci_set_long(vdev->pdev.wmask + IGD_ASLS, ~0);
+    pci_set_long(pdev->config + IGD_ASLS, 0);
+    pci_set_long(pdev->wmask + IGD_ASLS, ~0);
     pci_set_long(vdev->emulated_config_bits + IGD_ASLS, ~0);
 
     /*
@@ -620,8 +624,8 @@ static bool vfio_pci_igd_config_quirk(VFIOPCIDevice *vdev, Error **errp)
         }
 
         /* GMCH is read-only, emulated */
-        pci_set_long(vdev->pdev.config + IGD_GMCH, gmch);
-        pci_set_long(vdev->pdev.wmask + IGD_GMCH, 0);
+        pci_set_long(pdev->config + IGD_GMCH, gmch);
+        pci_set_long(pdev->wmask + IGD_GMCH, 0);
         pci_set_long(vdev->emulated_config_bits + IGD_GMCH, ~0);
     }
 
@@ -630,12 +634,12 @@ static bool vfio_pci_igd_config_quirk(VFIOPCIDevice *vdev, Error **errp)
 
         /* BDSM is read-write, emulated. BIOS needs to be able to write it */
         if (gen < 11) {
-            pci_set_long(vdev->pdev.config + IGD_BDSM, 0);
-            pci_set_long(vdev->pdev.wmask + IGD_BDSM, ~0);
+            pci_set_long(pdev->config + IGD_BDSM, 0);
+            pci_set_long(pdev->wmask + IGD_BDSM, ~0);
             pci_set_long(vdev->emulated_config_bits + IGD_BDSM, ~0);
         } else {
-            pci_set_quad(vdev->pdev.config + IGD_BDSM_GEN11, 0);
-            pci_set_quad(vdev->pdev.wmask + IGD_BDSM_GEN11, ~0);
+            pci_set_quad(pdev->config + IGD_BDSM_GEN11, 0);
+            pci_set_quad(pdev->wmask + IGD_BDSM_GEN11, ~0);
             pci_set_quad(vdev->emulated_config_bits + IGD_BDSM_GEN11, ~0);
         }
     }
-- 
2.43.0
Re: [PATCH 19/22] vfio/igd.c: use QOM casts where appropriate
Posted by Tomita Moeko 3 months, 4 weeks ago
On 7/15/2025 5:25 PM, Mark Cave-Ayland wrote:
> Use QOM casts to convert between VFIOPCIDevice and PCIDevice instead of
> accessing pdev directly.
> 
> Signed-off-by: Mark Cave-Ayland <mark.caveayland@nutanix.com>
> ---
>  hw/vfio/igd.c | 38 +++++++++++++++++++++-----------------
>  1 file changed, 21 insertions(+), 17 deletions(-)
> 
> diff --git a/hw/vfio/igd.c b/hw/vfio/igd.c
> index e7a9d1ffc1..d3ffbe7db6 100644
> --- a/hw/vfio/igd.c
> +++ b/hw/vfio/igd.c
> @@ -199,7 +199,7 @@ static bool vfio_pci_igd_opregion_detect(VFIOPCIDevice *vdev,
>      }
>  
>      /* Hotplugging is not supported for opregion access */
> -    if (vdev->pdev.qdev.hotplugged) {
> +    if (DEVICE(vdev)->hotplugged) {
>          warn_report("IGD device detected, but OpRegion is not supported "
>                      "on hotplugged device.");
>          return false;
> @@ -259,11 +259,12 @@ static int vfio_pci_igd_copy(VFIOPCIDevice *vdev, PCIDevice *pdev,
>  static int vfio_pci_igd_host_init(VFIOPCIDevice *vdev,
>                                    struct vfio_region_info *info)
>  {
> +    PCIDevice *pdev = PCI_DEVICE(vdev);
>      PCIBus *bus;
>      PCIDevice *host_bridge;
>      int ret;
>  
> -    bus = pci_device_root_bus(&vdev->pdev);
> +    bus = pci_device_root_bus(pdev);
>      host_bridge = pci_find_device(bus, 0, PCI_DEVFN(0, 0));
>  
>      if (!host_bridge) {
> @@ -326,13 +327,14 @@ type_init(vfio_pci_igd_register_types)
>  static int vfio_pci_igd_lpc_init(VFIOPCIDevice *vdev,
>                                   struct vfio_region_info *info)
>  {
> +    PCIDevice *pdev = PCI_DEVICE(vdev);
>      PCIDevice *lpc_bridge;
>      int ret;
>  
> -    lpc_bridge = pci_find_device(pci_device_root_bus(&vdev->pdev),
> +    lpc_bridge = pci_find_device(pci_device_root_bus(pdev),
>                                   0, PCI_DEVFN(0x1f, 0));
>      if (!lpc_bridge) {
> -        lpc_bridge = pci_create_simple(pci_device_root_bus(&vdev->pdev),
> +        lpc_bridge = pci_create_simple(pci_device_root_bus(pdev),
>                                   PCI_DEVFN(0x1f, 0), "vfio-pci-igd-lpc-bridge");
>      }
>  
> @@ -349,13 +351,14 @@ static bool vfio_pci_igd_setup_lpc_bridge(VFIOPCIDevice *vdev, Error **errp)
>  {
>      struct vfio_region_info *host = NULL;
>      struct vfio_region_info *lpc = NULL;
> +    PCIDevice *pdev = PCI_DEVICE(vdev);
>      PCIDevice *lpc_bridge;
>      int ret;
>  
>      /*
>       * Copying IDs or creating new devices are not supported on hotplug
>       */
> -    if (vdev->pdev.qdev.hotplugged) {
> +    if (DEVICE(vdev)->hotplugged) {
>          error_setg(errp, "IGD LPC is not supported on hotplugged device");
>          return false;
>      }
> @@ -365,7 +368,7 @@ static bool vfio_pci_igd_setup_lpc_bridge(VFIOPCIDevice *vdev, Error **errp)
>       * can stuff host values into, so if there's already one there and it's not
>       * one we can hack on, this quirk is no-go.  Sorry Q35.
>       */
> -    lpc_bridge = pci_find_device(pci_device_root_bus(&vdev->pdev),
> +    lpc_bridge = pci_find_device(pci_device_root_bus(pdev),
>                                   0, PCI_DEVFN(0x1f, 0));
>      if (lpc_bridge && !object_dynamic_cast(OBJECT(lpc_bridge),
>                                             "vfio-pci-igd-lpc-bridge")) {
> @@ -509,6 +512,7 @@ void vfio_probe_igd_bar0_quirk(VFIOPCIDevice *vdev, int nr)
>  static bool vfio_pci_igd_config_quirk(VFIOPCIDevice *vdev, Error **errp)
>  {
>      struct vfio_region_info *opregion = NULL;
> +    PCIDevice *pdev = PCI_DEVICE(vdev);
>      int ret, gen;
>      uint64_t gms_size = 0;
>      uint64_t *bdsm_size;
> @@ -528,7 +532,7 @@ static bool vfio_pci_igd_config_quirk(VFIOPCIDevice *vdev, Error **errp)
>      info_report("OpRegion detected on Intel display %x.", vdev->device_id);
>  
>      gen = igd_gen(vdev);
> -    gmch = vfio_pci_read_config(&vdev->pdev, IGD_GMCH, 4);
> +    gmch = vfio_pci_read_config(pdev, IGD_GMCH, 4);
>  
>      /*
>       * For backward compatibility, enable legacy mode when
> @@ -540,7 +544,7 @@ static bool vfio_pci_igd_config_quirk(VFIOPCIDevice *vdev, Error **errp)
>      if ((vdev->igd_legacy_mode != ON_OFF_AUTO_OFF) &&
>          (gen >= 6 && gen <= 9) &&
>          !strcmp(MACHINE_GET_CLASS(qdev_get_machine())->family, "pc_piix") &&
> -        (&vdev->pdev == pci_find_device(pci_device_root_bus(&vdev->pdev),
> +        (pdev == pci_find_device(pci_device_root_bus(pdev),
>          0, PCI_DEVFN(0x2, 0)))) {
>          /*
>           * IGD legacy mode requires:
> @@ -562,7 +566,7 @@ static bool vfio_pci_igd_config_quirk(VFIOPCIDevice *vdev, Error **errp)
>           */
>          ret = vfio_device_get_region_info(&vdev->vbasedev,
>                                            VFIO_PCI_ROM_REGION_INDEX, &rom);
> -        if ((ret || !rom->size) && !vdev->pdev.romfile) {
> +        if ((ret || !rom->size) && !pdev->romfile) {
>              error_setg(&err, "Device has no ROM");
>              goto error;
>          }
> @@ -605,8 +609,8 @@ static bool vfio_pci_igd_config_quirk(VFIOPCIDevice *vdev, Error **errp)
>       * ASLS (OpRegion address) is read-only, emulated
>       * It contains HPA, guest firmware need to reprogram it with GPA.
>       */
> -    pci_set_long(vdev->pdev.config + IGD_ASLS, 0);
> -    pci_set_long(vdev->pdev.wmask + IGD_ASLS, ~0);
> +    pci_set_long(pdev->config + IGD_ASLS, 0);
> +    pci_set_long(pdev->wmask + IGD_ASLS, ~0);
>      pci_set_long(vdev->emulated_config_bits + IGD_ASLS, ~0);
>  
>      /*
> @@ -620,8 +624,8 @@ static bool vfio_pci_igd_config_quirk(VFIOPCIDevice *vdev, Error **errp)
>          }
>  
>          /* GMCH is read-only, emulated */
> -        pci_set_long(vdev->pdev.config + IGD_GMCH, gmch);
> -        pci_set_long(vdev->pdev.wmask + IGD_GMCH, 0);
> +        pci_set_long(pdev->config + IGD_GMCH, gmch);
> +        pci_set_long(pdev->wmask + IGD_GMCH, 0);
>          pci_set_long(vdev->emulated_config_bits + IGD_GMCH, ~0);
>      }
>  
> @@ -630,12 +634,12 @@ static bool vfio_pci_igd_config_quirk(VFIOPCIDevice *vdev, Error **errp)
>  
>          /* BDSM is read-write, emulated. BIOS needs to be able to write it */
>          if (gen < 11) {
> -            pci_set_long(vdev->pdev.config + IGD_BDSM, 0);
> -            pci_set_long(vdev->pdev.wmask + IGD_BDSM, ~0);
> +            pci_set_long(pdev->config + IGD_BDSM, 0);
> +            pci_set_long(pdev->wmask + IGD_BDSM, ~0);
>              pci_set_long(vdev->emulated_config_bits + IGD_BDSM, ~0);
>          } else {
> -            pci_set_quad(vdev->pdev.config + IGD_BDSM_GEN11, 0);
> -            pci_set_quad(vdev->pdev.wmask + IGD_BDSM_GEN11, ~0);
> +            pci_set_quad(pdev->config + IGD_BDSM_GEN11, 0);
> +            pci_set_quad(pdev->wmask + IGD_BDSM_GEN11, ~0);
>              pci_set_quad(vdev->emulated_config_bits + IGD_BDSM_GEN11, ~0);
>          }
>      }

Reviewed-by: Tomita Moeko <tomitamoeko@gmail.com>