All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 0/5] include/hw/pci include/hw/cxl: Clean up includes
@ 2022-12-09 13:47 Markus Armbruster
  2022-12-09 13:47 ` [PATCH 1/5] include/hw/pci: Clean up superfluous inclusion of pci*/*.h cxl/*.h Markus Armbruster
                   ` (6 more replies)
  0 siblings, 7 replies; 23+ messages in thread
From: Markus Armbruster @ 2022-12-09 13:47 UTC (permalink / raw)
  To: qemu-devel; +Cc: mst, marcel.apfelbaum, ben.widawsky, jonathan.cameron, philmd

Back in 2016, we discussed[1] rules for headers, and these were
generally liked:

1. Have a carefully curated header that's included everywhere first.  We
   got that already thanks to Peter: osdep.h.

2. Headers should normally include everything they need beyond osdep.h.
   If exceptions are needed for some reason, they must be documented in
   the header.  If all that's needed from a header is typedefs, put
   those into qemu/typedefs.h instead of including the header.

3. Cyclic inclusion is forbidden.

After this series, include/hw/pci and include/hw/cxl conform to these
rules.

It is based on

    [PATCH 0/3] block: Clean up includes
    [PATCH 0/4] coroutine: Clean up includes

[1] Message-ID: <87h9g8j57d.fsf@blackfin.pond.sub.org>
    https://lists.nongnu.org/archive/html/qemu-devel/2016-03/msg03345.html

Based-on: <20221208143939.2775453-1-armbru@redhat.com>

Markus Armbruster (5):
  include/hw/pci: Clean up superfluous inclusion of pci*/*.h cxl/*.h
  include/hw/cxl: Include hw/cxl/*.h where needed
  include/hw/pci: Clean up a few things checkpatch.pl would flag
  include/hw/pci: Split pci_device.h off pci.h
  include/hw/pci: Include hw/pci/pci.h where needed

 hw/alpha/alpha_sys.h              |   1 -
 hw/display/ati_int.h              |   2 +-
 hw/display/qxl.h                  |   3 +-
 hw/ide/ahci_internal.h            |   2 +-
 hw/net/vmxnet3_defs.h             |   2 +-
 hw/nvme/nvme.h                    |   2 +-
 hw/rdma/rdma_utils.h              |   1 -
 hw/rdma/vmw/pvrdma.h              |   2 +-
 hw/scsi/mptsas.h                  |   2 +-
 hw/usb/hcd-ehci.h                 |   3 +-
 hw/usb/hcd-uhci.h                 |   2 +-
 hw/usb/hcd-xhci-pci.h             |   1 +
 hw/vfio/pci.h                     |   2 +-
 hw/xen/xen_pt.h                   |   1 -
 include/hw/acpi/piix4.h           |   2 +-
 include/hw/arm/allwinner-a10.h    |   1 +
 include/hw/cxl/cxl.h              |   1 -
 include/hw/cxl/cxl_cdat.h         |   1 +
 include/hw/cxl/cxl_component.h    |   1 +
 include/hw/cxl/cxl_device.h       |   2 +
 include/hw/cxl/cxl_pci.h          |   2 -
 include/hw/i386/ich9.h            |   4 -
 include/hw/i386/x86-iommu.h       |   1 -
 include/hw/ide/pci.h              |   2 +-
 include/hw/isa/vt82c686.h         |   1 -
 include/hw/misc/macio/macio.h     |   2 +-
 include/hw/pci-host/designware.h  |   3 -
 include/hw/pci-host/gpex.h        |   2 +-
 include/hw/pci-host/i440fx.h      |   2 +-
 include/hw/pci-host/ls7a.h        |   2 -
 include/hw/pci-host/pnv_phb3.h    |   2 -
 include/hw/pci-host/pnv_phb4.h    |   3 +-
 include/hw/pci-host/q35.h         |   2 +-
 include/hw/pci-host/sabre.h       |   2 +-
 include/hw/pci-host/xilinx-pcie.h |   1 -
 include/hw/pci/msi.h              |   2 +-
 include/hw/pci/pci.h              | 352 -----------------------------
 include/hw/pci/pci_bridge.h       |   2 +-
 include/hw/pci/pci_device.h       | 361 ++++++++++++++++++++++++++++++
 include/hw/pci/pcie.h             |   1 -
 include/hw/pci/pcie_port.h        |   1 +
 include/hw/pci/pcie_sriov.h       |   2 +
 include/hw/pci/shpc.h             |   2 +-
 include/hw/remote/iohub.h         |   2 +-
 include/hw/remote/proxy.h         |   2 +-
 include/hw/sd/sdhci.h             |   2 +-
 include/hw/southbridge/piix.h     |   3 +-
 include/hw/virtio/virtio-scsi.h   |   1 -
 include/hw/xen/xen_common.h       |   2 +-
 hw/acpi/erst.c                    |   2 +-
 hw/alpha/pci.c                    |   1 +
 hw/alpha/typhoon.c                |   2 +-
 hw/audio/ac97.c                   |   2 +-
 hw/audio/es1370.c                 |   2 +-
 hw/audio/via-ac97.c               |   2 +-
 hw/char/serial-pci-multi.c        |   2 +-
 hw/char/serial-pci.c              |   2 +-
 hw/core/qdev-properties-system.c  |   1 +
 hw/display/bochs-display.c        |   2 +-
 hw/display/cirrus_vga.c           |   2 +-
 hw/display/sm501.c                |   2 +-
 hw/display/vga-pci.c              |   2 +-
 hw/display/vmware_vga.c           |   2 +-
 hw/i386/acpi-build.c              |   2 +-
 hw/i386/xen/xen_pvdevice.c        |   2 +-
 hw/ipack/tpci200.c                |   2 +-
 hw/ipmi/pci_ipmi_bt.c             |   2 +-
 hw/ipmi/pci_ipmi_kcs.c            |   2 +-
 hw/isa/i82378.c                   |   2 +-
 hw/mips/gt64xxx_pci.c             |   2 +-
 hw/misc/pci-testdev.c             |   2 +-
 hw/misc/pvpanic-pci.c             |   2 +-
 hw/net/can/can_kvaser_pci.c       |   2 +-
 hw/net/can/can_mioe3680_pci.c     |   2 +-
 hw/net/can/can_pcm3680_pci.c      |   2 +-
 hw/net/can/ctucan_pci.c           |   2 +-
 hw/net/e1000.c                    |   2 +-
 hw/net/e1000x_common.c            |   2 +-
 hw/net/eepro100.c                 |   2 +-
 hw/net/ne2000-pci.c               |   2 +-
 hw/net/net_tx_pkt.c               |   2 +-
 hw/net/pcnet-pci.c                |   2 +-
 hw/net/rocker/rocker.c            |   2 +-
 hw/net/rocker/rocker_desc.c       |   2 +-
 hw/net/rtl8139.c                  |   2 +-
 hw/net/sungem.c                   |   2 +-
 hw/net/sunhme.c                   |   2 +-
 hw/net/tulip.c                    |   2 +-
 hw/net/virtio-net.c               |   2 +-
 hw/pci-bridge/i82801b11.c         |   2 +-
 hw/pci-host/bonito.c              |   2 +-
 hw/pci-host/dino.c                |   2 +-
 hw/pci-host/grackle.c             |   2 +-
 hw/pci-host/mv64361.c             |   2 +-
 hw/pci-host/ppce500.c             |   2 +-
 hw/pci-host/raven.c               |   2 +-
 hw/pci-host/sh_pci.c              |   2 +-
 hw/pci-host/uninorth.c            |   2 +-
 hw/pci-host/versatile.c           |   2 +-
 hw/pci/pcie_host.c                |   2 +-
 hw/pci/pcie_sriov.c               |   2 +-
 hw/pci/slotid_cap.c               |   2 +-
 hw/ppc/ppc440_pcix.c              |   2 +-
 hw/ppc/ppc4xx_pci.c               |   2 +-
 hw/ppc/spapr_pci_vfio.c           |   1 +
 hw/rdma/rdma_utils.c              |   1 +
 hw/s390x/s390-pci-inst.c          |   1 +
 hw/scsi/esp-pci.c                 |   2 +-
 hw/scsi/lsi53c895a.c              |   2 +-
 hw/scsi/virtio-scsi.c             |   1 +
 hw/smbios/smbios.c                |   1 +
 hw/usb/hcd-ohci-pci.c             |   2 +-
 hw/watchdog/wdt_i6300esb.c        |   2 +-
 ui/util.c                         |   2 +-
 114 files changed, 461 insertions(+), 462 deletions(-)
 create mode 100644 include/hw/pci/pci_device.h

-- 
2.37.3



^ permalink raw reply	[flat|nested] 23+ messages in thread

* [PATCH 1/5] include/hw/pci: Clean up superfluous inclusion of pci*/*.h cxl/*.h
  2022-12-09 13:47 [PATCH 0/5] include/hw/pci include/hw/cxl: Clean up includes Markus Armbruster
@ 2022-12-09 13:47 ` Markus Armbruster
  2022-12-09 17:03   ` Michael S. Tsirkin
  2022-12-12 10:41   ` Jonathan Cameron via
  2022-12-09 13:47 ` [PATCH 2/5] include/hw/cxl: Include hw/cxl/*.h where needed Markus Armbruster
                   ` (5 subsequent siblings)
  6 siblings, 2 replies; 23+ messages in thread
From: Markus Armbruster @ 2022-12-09 13:47 UTC (permalink / raw)
  To: qemu-devel; +Cc: mst, marcel.apfelbaum, ben.widawsky, jonathan.cameron, philmd

Signed-off-by: Markus Armbruster <armbru@redhat.com>
---
 hw/alpha/alpha_sys.h              | 1 -
 hw/rdma/rdma_utils.h              | 1 -
 hw/rdma/vmw/pvrdma.h              | 1 -
 hw/usb/hcd-ehci.h                 | 1 -
 hw/xen/xen_pt.h                   | 1 -
 include/hw/cxl/cxl.h              | 1 -
 include/hw/cxl/cxl_cdat.h         | 1 +
 include/hw/cxl/cxl_device.h       | 1 +
 include/hw/cxl/cxl_pci.h          | 2 --
 include/hw/i386/ich9.h            | 4 ----
 include/hw/i386/x86-iommu.h       | 1 -
 include/hw/isa/vt82c686.h         | 1 -
 include/hw/pci-host/designware.h  | 3 ---
 include/hw/pci-host/i440fx.h      | 2 +-
 include/hw/pci-host/ls7a.h        | 2 --
 include/hw/pci-host/pnv_phb3.h    | 2 --
 include/hw/pci-host/pnv_phb4.h    | 3 +--
 include/hw/pci-host/xilinx-pcie.h | 1 -
 include/hw/pci/pcie.h             | 1 -
 include/hw/virtio/virtio-scsi.h   | 1 -
 hw/alpha/pci.c                    | 1 +
 hw/alpha/typhoon.c                | 2 +-
 hw/i386/acpi-build.c              | 2 +-
 hw/pci-bridge/i82801b11.c         | 2 +-
 hw/rdma/rdma_utils.c              | 1 +
 hw/scsi/virtio-scsi.c             | 1 +
 26 files changed, 10 insertions(+), 30 deletions(-)

diff --git a/hw/alpha/alpha_sys.h b/hw/alpha/alpha_sys.h
index 2263e821da..a303c58438 100644
--- a/hw/alpha/alpha_sys.h
+++ b/hw/alpha/alpha_sys.h
@@ -5,7 +5,6 @@
 
 #include "target/alpha/cpu-qom.h"
 #include "hw/pci/pci.h"
-#include "hw/pci/pci_host.h"
 #include "hw/boards.h"
 #include "hw/intc/i8259.h"
 
diff --git a/hw/rdma/rdma_utils.h b/hw/rdma/rdma_utils.h
index 0c6414e7e0..54e4f56edd 100644
--- a/hw/rdma/rdma_utils.h
+++ b/hw/rdma/rdma_utils.h
@@ -18,7 +18,6 @@
 #define RDMA_UTILS_H
 
 #include "qemu/error-report.h"
-#include "hw/pci/pci.h"
 #include "sysemu/dma.h"
 
 #define rdma_error_report(fmt, ...) \
diff --git a/hw/rdma/vmw/pvrdma.h b/hw/rdma/vmw/pvrdma.h
index d08965d3e2..0caf95ede8 100644
--- a/hw/rdma/vmw/pvrdma.h
+++ b/hw/rdma/vmw/pvrdma.h
@@ -18,7 +18,6 @@
 
 #include "qemu/units.h"
 #include "qemu/notify.h"
-#include "hw/pci/pci.h"
 #include "hw/pci/msix.h"
 #include "chardev/char-fe.h"
 #include "hw/net/vmxnet3_defs.h"
diff --git a/hw/usb/hcd-ehci.h b/hw/usb/hcd-ehci.h
index a173707d9b..4d4b2830b7 100644
--- a/hw/usb/hcd-ehci.h
+++ b/hw/usb/hcd-ehci.h
@@ -23,7 +23,6 @@
 #include "sysemu/dma.h"
 #include "hw/pci/pci.h"
 #include "hw/sysbus.h"
-#include "qom/object.h"
 
 #ifndef EHCI_DEBUG
 #define EHCI_DEBUG   0
diff --git a/hw/xen/xen_pt.h b/hw/xen/xen_pt.h
index e7c4316a7d..cf10fc7bbf 100644
--- a/hw/xen/xen_pt.h
+++ b/hw/xen/xen_pt.h
@@ -2,7 +2,6 @@
 #define XEN_PT_H
 
 #include "hw/xen/xen_common.h"
-#include "hw/pci/pci.h"
 #include "xen-host-pci-device.h"
 #include "qom/object.h"
 
diff --git a/include/hw/cxl/cxl.h b/include/hw/cxl/cxl.h
index 38e0e271d5..5129557bee 100644
--- a/include/hw/cxl/cxl.h
+++ b/include/hw/cxl/cxl.h
@@ -13,7 +13,6 @@
 
 #include "qapi/qapi-types-machine.h"
 #include "qapi/qapi-visit-machine.h"
-#include "hw/pci/pci_bridge.h"
 #include "hw/pci/pci_host.h"
 #include "cxl_pci.h"
 #include "cxl_component.h"
diff --git a/include/hw/cxl/cxl_cdat.h b/include/hw/cxl/cxl_cdat.h
index e9eda00142..7f67638685 100644
--- a/include/hw/cxl/cxl_cdat.h
+++ b/include/hw/cxl/cxl_cdat.h
@@ -11,6 +11,7 @@
 #define CXL_CDAT_H
 
 #include "hw/cxl/cxl_pci.h"
+#include "hw/pci/pcie_doe.h"
 
 /*
  * Reference:
diff --git a/include/hw/cxl/cxl_device.h b/include/hw/cxl/cxl_device.h
index 449b0edfe9..fd475b947b 100644
--- a/include/hw/cxl/cxl_device.h
+++ b/include/hw/cxl/cxl_device.h
@@ -10,6 +10,7 @@
 #ifndef CXL_DEVICE_H
 #define CXL_DEVICE_H
 
+#include "hw/pci/pci.h"
 #include "hw/register.h"
 
 /*
diff --git a/include/hw/cxl/cxl_pci.h b/include/hw/cxl/cxl_pci.h
index 3cb79eca1e..aca14845ab 100644
--- a/include/hw/cxl/cxl_pci.h
+++ b/include/hw/cxl/cxl_pci.h
@@ -11,8 +11,6 @@
 #define CXL_PCI_H
 
 #include "qemu/compiler.h"
-#include "hw/pci/pci.h"
-#include "hw/pci/pcie.h"
 #include "hw/cxl/cxl_cdat.h"
 
 #define CXL_VENDOR_ID 0x1e98
diff --git a/include/hw/i386/ich9.h b/include/hw/i386/ich9.h
index 23ee8e371b..222781e8b9 100644
--- a/include/hw/i386/ich9.h
+++ b/include/hw/i386/ich9.h
@@ -5,12 +5,8 @@
 #include "hw/sysbus.h"
 #include "hw/i386/pc.h"
 #include "hw/isa/apm.h"
-#include "hw/pci/pci.h"
-#include "hw/pci/pcie_host.h"
-#include "hw/pci/pci_bridge.h"
 #include "hw/acpi/acpi.h"
 #include "hw/acpi/ich9.h"
-#include "hw/pci/pci_bus.h"
 #include "qom/object.h"
 
 void ich9_lpc_set_irq(void *opaque, int irq_num, int level);
diff --git a/include/hw/i386/x86-iommu.h b/include/hw/i386/x86-iommu.h
index 7637edb430..8d8d53b18b 100644
--- a/include/hw/i386/x86-iommu.h
+++ b/include/hw/i386/x86-iommu.h
@@ -21,7 +21,6 @@
 #define HW_I386_X86_IOMMU_H
 
 #include "hw/sysbus.h"
-#include "hw/pci/pci.h"
 #include "hw/pci/msi.h"
 #include "qom/object.h"
 
diff --git a/include/hw/isa/vt82c686.h b/include/hw/isa/vt82c686.h
index eaa07881c5..e273cd38dc 100644
--- a/include/hw/isa/vt82c686.h
+++ b/include/hw/isa/vt82c686.h
@@ -1,7 +1,6 @@
 #ifndef HW_VT82C686_H
 #define HW_VT82C686_H
 
-#include "hw/pci/pci.h"
 
 #define TYPE_VT82C686B_ISA "vt82c686b-isa"
 #define TYPE_VT82C686B_USB_UHCI "vt82c686b-usb-uhci"
diff --git a/include/hw/pci-host/designware.h b/include/hw/pci-host/designware.h
index 6d9b51ae67..908f3d946b 100644
--- a/include/hw/pci-host/designware.h
+++ b/include/hw/pci-host/designware.h
@@ -22,9 +22,6 @@
 #define DESIGNWARE_H
 
 #include "hw/sysbus.h"
-#include "hw/pci/pci.h"
-#include "hw/pci/pci_bus.h"
-#include "hw/pci/pcie_host.h"
 #include "hw/pci/pci_bridge.h"
 #include "qom/object.h"
 
diff --git a/include/hw/pci-host/i440fx.h b/include/hw/pci-host/i440fx.h
index d02bf1ed6b..fc93e22732 100644
--- a/include/hw/pci-host/i440fx.h
+++ b/include/hw/pci-host/i440fx.h
@@ -11,7 +11,7 @@
 #ifndef HW_PCI_I440FX_H
 #define HW_PCI_I440FX_H
 
-#include "hw/pci/pci_bus.h"
+#include "hw/pci/pci.h"
 #include "hw/pci-host/pam.h"
 #include "qom/object.h"
 
diff --git a/include/hw/pci-host/ls7a.h b/include/hw/pci-host/ls7a.h
index df7fa55a30..b27db8e2ca 100644
--- a/include/hw/pci-host/ls7a.h
+++ b/include/hw/pci-host/ls7a.h
@@ -8,8 +8,6 @@
 #ifndef HW_LS7A_H
 #define HW_LS7A_H
 
-#include "hw/pci/pci.h"
-#include "hw/pci/pcie_host.h"
 #include "hw/pci-host/pam.h"
 #include "qemu/units.h"
 #include "qemu/range.h"
diff --git a/include/hw/pci-host/pnv_phb3.h b/include/hw/pci-host/pnv_phb3.h
index 4854f6d2f6..f791ebda9b 100644
--- a/include/hw/pci-host/pnv_phb3.h
+++ b/include/hw/pci-host/pnv_phb3.h
@@ -10,8 +10,6 @@
 #ifndef PCI_HOST_PNV_PHB3_H
 #define PCI_HOST_PNV_PHB3_H
 
-#include "hw/pci/pcie_host.h"
-#include "hw/pci/pcie_port.h"
 #include "hw/ppc/xics.h"
 #include "qom/object.h"
 #include "hw/pci-host/pnv_phb.h"
diff --git a/include/hw/pci-host/pnv_phb4.h b/include/hw/pci-host/pnv_phb4.h
index 50d4faa001..d9cea3f952 100644
--- a/include/hw/pci-host/pnv_phb4.h
+++ b/include/hw/pci-host/pnv_phb4.h
@@ -10,8 +10,7 @@
 #ifndef PCI_HOST_PNV_PHB4_H
 #define PCI_HOST_PNV_PHB4_H
 
-#include "hw/pci/pcie_host.h"
-#include "hw/pci/pcie_port.h"
+#include "hw/pci/pci_bus.h"
 #include "hw/ppc/xive.h"
 #include "qom/object.h"
 
diff --git a/include/hw/pci-host/xilinx-pcie.h b/include/hw/pci-host/xilinx-pcie.h
index 89be88d87f..e1b3c1c280 100644
--- a/include/hw/pci-host/xilinx-pcie.h
+++ b/include/hw/pci-host/xilinx-pcie.h
@@ -21,7 +21,6 @@
 #define HW_XILINX_PCIE_H
 
 #include "hw/sysbus.h"
-#include "hw/pci/pci.h"
 #include "hw/pci/pci_bridge.h"
 #include "hw/pci/pcie_host.h"
 #include "qom/object.h"
diff --git a/include/hw/pci/pcie.h b/include/hw/pci/pcie.h
index 698d3de851..798a262a0a 100644
--- a/include/hw/pci/pcie.h
+++ b/include/hw/pci/pcie.h
@@ -26,7 +26,6 @@
 #include "hw/pci/pcie_aer.h"
 #include "hw/pci/pcie_sriov.h"
 #include "hw/hotplug.h"
-#include "hw/pci/pcie_doe.h"
 
 typedef enum {
     /* for attention and power indicator */
diff --git a/include/hw/virtio/virtio-scsi.h b/include/hw/virtio/virtio-scsi.h
index a36aad9c86..37b75e15e3 100644
--- a/include/hw/virtio/virtio-scsi.h
+++ b/include/hw/virtio/virtio-scsi.h
@@ -20,7 +20,6 @@
 #define VIRTIO_SCSI_SENSE_SIZE 0
 #include "standard-headers/linux/virtio_scsi.h"
 #include "hw/virtio/virtio.h"
-#include "hw/pci/pci.h"
 #include "hw/scsi/scsi.h"
 #include "chardev/char-fe.h"
 #include "sysemu/iothread.h"
diff --git a/hw/alpha/pci.c b/hw/alpha/pci.c
index 72251fcdf0..7c18297177 100644
--- a/hw/alpha/pci.c
+++ b/hw/alpha/pci.c
@@ -7,6 +7,7 @@
  */
 
 #include "qemu/osdep.h"
+#include "hw/pci/pci_host.h"
 #include "alpha_sys.h"
 #include "qemu/log.h"
 #include "trace.h"
diff --git a/hw/alpha/typhoon.c b/hw/alpha/typhoon.c
index bd39c8ca86..49a80550c5 100644
--- a/hw/alpha/typhoon.c
+++ b/hw/alpha/typhoon.c
@@ -10,10 +10,10 @@
 #include "qemu/module.h"
 #include "qemu/units.h"
 #include "qapi/error.h"
+#include "hw/pci/pci_host.h"
 #include "cpu.h"
 #include "hw/irq.h"
 #include "alpha_sys.h"
-#include "qom/object.h"
 
 
 #define TYPE_TYPHOON_PCI_HOST_BRIDGE "typhoon-pcihost"
diff --git a/hw/i386/acpi-build.c b/hw/i386/acpi-build.c
index d9eaa5fc4d..b75d1507f9 100644
--- a/hw/i386/acpi-build.c
+++ b/hw/i386/acpi-build.c
@@ -27,7 +27,7 @@
 #include "acpi-common.h"
 #include "qemu/bitmap.h"
 #include "qemu/error-report.h"
-#include "hw/pci/pci.h"
+#include "hw/pci/pci_bridge.h"
 #include "hw/cxl/cxl.h"
 #include "hw/core/cpu.h"
 #include "target/i386/cpu.h"
diff --git a/hw/pci-bridge/i82801b11.c b/hw/pci-bridge/i82801b11.c
index f28181e210..06f704a2e1 100644
--- a/hw/pci-bridge/i82801b11.c
+++ b/hw/pci-bridge/i82801b11.c
@@ -42,7 +42,7 @@
  */
 
 #include "qemu/osdep.h"
-#include "hw/pci/pci.h"
+#include "hw/pci/pci_bridge.h"
 #include "migration/vmstate.h"
 #include "qemu/module.h"
 #include "hw/i386/ich9.h"
diff --git a/hw/rdma/rdma_utils.c b/hw/rdma/rdma_utils.c
index 5a7ef63ad2..77008552f4 100644
--- a/hw/rdma/rdma_utils.c
+++ b/hw/rdma/rdma_utils.c
@@ -14,6 +14,7 @@
  */
 
 #include "qemu/osdep.h"
+#include "hw/pci/pci.h"
 #include "trace.h"
 #include "rdma_utils.h"
 
diff --git a/hw/scsi/virtio-scsi.c b/hw/scsi/virtio-scsi.c
index 6f6e2e32ba..2b649ca976 100644
--- a/hw/scsi/virtio-scsi.c
+++ b/hw/scsi/virtio-scsi.c
@@ -22,6 +22,7 @@
 #include "qemu/iov.h"
 #include "qemu/module.h"
 #include "sysemu/block-backend.h"
+#include "sysemu/dma.h"
 #include "hw/qdev-properties.h"
 #include "hw/scsi/scsi.h"
 #include "scsi/constants.h"
-- 
2.37.3



^ permalink raw reply related	[flat|nested] 23+ messages in thread

* [PATCH 2/5] include/hw/cxl: Include hw/cxl/*.h where needed
  2022-12-09 13:47 [PATCH 0/5] include/hw/pci include/hw/cxl: Clean up includes Markus Armbruster
  2022-12-09 13:47 ` [PATCH 1/5] include/hw/pci: Clean up superfluous inclusion of pci*/*.h cxl/*.h Markus Armbruster
@ 2022-12-09 13:47 ` Markus Armbruster
  2022-12-12 10:33   ` Jonathan Cameron via
  2022-12-09 13:48 ` [PATCH 3/5] include/hw/pci: Clean up a few things checkpatch.pl would flag Markus Armbruster
                   ` (4 subsequent siblings)
  6 siblings, 1 reply; 23+ messages in thread
From: Markus Armbruster @ 2022-12-09 13:47 UTC (permalink / raw)
  To: qemu-devel; +Cc: mst, marcel.apfelbaum, ben.widawsky, jonathan.cameron, philmd

hw/cxl/cxl_component.h needs CDATObject from hw/cxl/cxl_cdat.h.

hw/cxl/cxl_device.h needs CXLComponentState from
hw/cxl/cxl_component.h.

Signed-off-by: Markus Armbruster <armbru@redhat.com>
---
 include/hw/cxl/cxl_component.h | 1 +
 include/hw/cxl/cxl_device.h    | 1 +
 2 files changed, 2 insertions(+)

diff --git a/include/hw/cxl/cxl_component.h b/include/hw/cxl/cxl_component.h
index 34075cfb72..5dca21e95b 100644
--- a/include/hw/cxl/cxl_component.h
+++ b/include/hw/cxl/cxl_component.h
@@ -18,6 +18,7 @@
 #include "qemu/compiler.h"
 #include "qemu/range.h"
 #include "qemu/typedefs.h"
+#include "hw/cxl/cxl_cdat.h"
 #include "hw/register.h"
 #include "qapi/error.h"
 
diff --git a/include/hw/cxl/cxl_device.h b/include/hw/cxl/cxl_device.h
index fd475b947b..3f91969db0 100644
--- a/include/hw/cxl/cxl_device.h
+++ b/include/hw/cxl/cxl_device.h
@@ -10,6 +10,7 @@
 #ifndef CXL_DEVICE_H
 #define CXL_DEVICE_H
 
+#include "hw/cxl/cxl_component.h"
 #include "hw/pci/pci.h"
 #include "hw/register.h"
 
-- 
2.37.3



^ permalink raw reply related	[flat|nested] 23+ messages in thread

* [PATCH 3/5] include/hw/pci: Clean up a few things checkpatch.pl would flag
  2022-12-09 13:47 [PATCH 0/5] include/hw/pci include/hw/cxl: Clean up includes Markus Armbruster
  2022-12-09 13:47 ` [PATCH 1/5] include/hw/pci: Clean up superfluous inclusion of pci*/*.h cxl/*.h Markus Armbruster
  2022-12-09 13:47 ` [PATCH 2/5] include/hw/cxl: Include hw/cxl/*.h where needed Markus Armbruster
@ 2022-12-09 13:48 ` Markus Armbruster
  2022-12-09 14:15   ` Philippe Mathieu-Daudé
  2022-12-09 13:48 ` [PATCH 4/5] include/hw/pci: Split pci_device.h off pci.h Markus Armbruster
                   ` (3 subsequent siblings)
  6 siblings, 1 reply; 23+ messages in thread
From: Markus Armbruster @ 2022-12-09 13:48 UTC (permalink / raw)
  To: qemu-devel; +Cc: mst, marcel.apfelbaum, ben.widawsky, jonathan.cameron, philmd

Fix a few style violations so that checkpatch.pl won't complain when I
move this code.

Signed-off-by: Markus Armbruster <armbru@redhat.com>
---
 include/hw/pci/pci.h | 17 ++++++++++-------
 1 file changed, 10 insertions(+), 7 deletions(-)

diff --git a/include/hw/pci/pci.h b/include/hw/pci/pci.h
index 6ccaaf5154..016e28a2a8 100644
--- a/include/hw/pci/pci.h
+++ b/include/hw/pci/pci.h
@@ -292,8 +292,10 @@ struct PCIDevice {
     /* PCI config space */
     uint8_t *config;
 
-    /* Used to enable config checks on load. Note that writable bits are
-     * never checked even if set in cmask. */
+    /*
+     * Used to enable config checks on load. Note that writable bits are
+     * never checked even if set in cmask.
+     */
     uint8_t *cmask;
 
     /* Used to implement R/W bytes */
@@ -307,10 +309,11 @@ struct PCIDevice {
 
     /* the following fields are read only */
     int32_t devfn;
-    /* Cached device to fetch requester ID from, to avoid the PCI
-     * tree walking every time we invoke PCI request (e.g.,
-     * MSI). For conventional PCI root complex, this field is
-     * meaningless. */
+    /*
+     * Cached device to fetch requester ID from, to avoid the PCI tree
+     * walking every time we invoke PCI request (e.g., MSI). For
+     * conventional PCI root complex, this field is meaningless.
+     */
     PCIReqIDCache requester_id_cache;
     char name[64];
     PCIIORegion io_regions[PCI_NUM_REGIONS];
@@ -954,7 +957,7 @@ extern const VMStateDescription vmstate_pci_device;
     .name       = (stringify(_field)),                               \
     .size       = sizeof(PCIDevice),                                 \
     .vmsd       = &vmstate_pci_device,                               \
-    .flags      = VMS_STRUCT|VMS_POINTER,                            \
+    .flags      = VMS_STRUCT | VMS_POINTER,                          \
     .offset     = vmstate_offset_pointer(_state, _field, PCIDevice), \
 }
 
-- 
2.37.3



^ permalink raw reply related	[flat|nested] 23+ messages in thread

* [PATCH 4/5] include/hw/pci: Split pci_device.h off pci.h
  2022-12-09 13:47 [PATCH 0/5] include/hw/pci include/hw/cxl: Clean up includes Markus Armbruster
                   ` (2 preceding siblings ...)
  2022-12-09 13:48 ` [PATCH 3/5] include/hw/pci: Clean up a few things checkpatch.pl would flag Markus Armbruster
@ 2022-12-09 13:48 ` Markus Armbruster
  2022-12-21 11:33   ` Michael S. Tsirkin
  2022-12-09 13:48 ` [PATCH 5/5] include/hw/pci: Include hw/pci/pci.h where needed Markus Armbruster
                   ` (2 subsequent siblings)
  6 siblings, 1 reply; 23+ messages in thread
From: Markus Armbruster @ 2022-12-09 13:48 UTC (permalink / raw)
  To: qemu-devel; +Cc: mst, marcel.apfelbaum, ben.widawsky, jonathan.cameron, philmd

PCIDeviceClass and PCIDevice are defined in pci.h.  Many users of the
header don't actually need them.  Similar structs live in their own
headers: PCIBusClass and PCIBus in pci_bus.h, PCIBridge in
pci_bridge.h, PCIHostBridgeClass and PCIHostState in pci_host.h,
PCIExpressHost in pcie_host.h, and PCIERootPortClass, PCIEPort, and
PCIESlot in pcie_port.h.

Move PCIDeviceClass and PCIDeviceClass to new pci_device.h, along with
the code that needs them.  Adjust include directives.

This also enables the next commit.

Signed-off-by: Markus Armbruster <armbru@redhat.com>
---
 hw/display/ati_int.h             |   2 +-
 hw/display/qxl.h                 |   3 +-
 hw/ide/ahci_internal.h           |   2 +-
 hw/net/vmxnet3_defs.h            |   2 +-
 hw/nvme/nvme.h                   |   2 +-
 hw/rdma/vmw/pvrdma.h             |   1 +
 hw/scsi/mptsas.h                 |   2 +-
 hw/usb/hcd-ehci.h                |   2 +-
 hw/usb/hcd-uhci.h                |   2 +-
 hw/usb/hcd-xhci-pci.h            |   1 +
 hw/vfio/pci.h                    |   2 +-
 include/hw/acpi/piix4.h          |   2 +-
 include/hw/arm/allwinner-a10.h   |   1 +
 include/hw/cxl/cxl_device.h      |   2 +-
 include/hw/ide/pci.h             |   2 +-
 include/hw/misc/macio/macio.h    |   2 +-
 include/hw/pci-host/gpex.h       |   2 +-
 include/hw/pci-host/i440fx.h     |   2 +-
 include/hw/pci-host/q35.h        |   2 +-
 include/hw/pci-host/sabre.h      |   2 +-
 include/hw/pci/msi.h             |   2 +-
 include/hw/pci/pci.h             | 355 ------------------------------
 include/hw/pci/pci_bridge.h      |   2 +-
 include/hw/pci/pci_device.h      | 361 +++++++++++++++++++++++++++++++
 include/hw/pci/pcie_port.h       |   1 +
 include/hw/pci/shpc.h            |   2 +-
 include/hw/remote/iohub.h        |   2 +-
 include/hw/remote/proxy.h        |   2 +-
 include/hw/sd/sdhci.h            |   2 +-
 include/hw/southbridge/piix.h    |   3 +-
 include/hw/xen/xen_common.h      |   2 +-
 hw/acpi/erst.c                   |   2 +-
 hw/audio/ac97.c                  |   2 +-
 hw/audio/es1370.c                |   2 +-
 hw/audio/via-ac97.c              |   2 +-
 hw/char/serial-pci-multi.c       |   2 +-
 hw/char/serial-pci.c             |   2 +-
 hw/core/qdev-properties-system.c |   1 +
 hw/display/bochs-display.c       |   2 +-
 hw/display/cirrus_vga.c          |   2 +-
 hw/display/sm501.c               |   2 +-
 hw/display/vga-pci.c             |   2 +-
 hw/display/vmware_vga.c          |   2 +-
 hw/i386/xen/xen_pvdevice.c       |   2 +-
 hw/ipack/tpci200.c               |   2 +-
 hw/ipmi/pci_ipmi_bt.c            |   2 +-
 hw/ipmi/pci_ipmi_kcs.c           |   2 +-
 hw/isa/i82378.c                  |   2 +-
 hw/mips/gt64xxx_pci.c            |   2 +-
 hw/misc/pci-testdev.c            |   2 +-
 hw/misc/pvpanic-pci.c            |   2 +-
 hw/net/can/can_kvaser_pci.c      |   2 +-
 hw/net/can/can_mioe3680_pci.c    |   2 +-
 hw/net/can/can_pcm3680_pci.c     |   2 +-
 hw/net/can/ctucan_pci.c          |   2 +-
 hw/net/e1000.c                   |   2 +-
 hw/net/e1000x_common.c           |   2 +-
 hw/net/eepro100.c                |   2 +-
 hw/net/ne2000-pci.c              |   2 +-
 hw/net/net_tx_pkt.c              |   2 +-
 hw/net/pcnet-pci.c               |   2 +-
 hw/net/rocker/rocker.c           |   2 +-
 hw/net/rocker/rocker_desc.c      |   2 +-
 hw/net/rtl8139.c                 |   2 +-
 hw/net/sungem.c                  |   2 +-
 hw/net/sunhme.c                  |   2 +-
 hw/net/tulip.c                   |   2 +-
 hw/net/virtio-net.c              |   2 +-
 hw/pci-host/bonito.c             |   2 +-
 hw/pci-host/dino.c               |   2 +-
 hw/pci-host/grackle.c            |   2 +-
 hw/pci-host/mv64361.c            |   2 +-
 hw/pci-host/ppce500.c            |   2 +-
 hw/pci-host/raven.c              |   2 +-
 hw/pci-host/sh_pci.c             |   2 +-
 hw/pci-host/uninorth.c           |   2 +-
 hw/pci-host/versatile.c          |   2 +-
 hw/pci/pcie_host.c               |   2 +-
 hw/pci/pcie_sriov.c              |   2 +-
 hw/pci/slotid_cap.c              |   2 +-
 hw/ppc/ppc440_pcix.c             |   2 +-
 hw/ppc/ppc4xx_pci.c              |   2 +-
 hw/ppc/spapr_pci_vfio.c          |   1 +
 hw/rdma/rdma_utils.c             |   2 +-
 hw/s390x/s390-pci-inst.c         |   1 +
 hw/scsi/esp-pci.c                |   2 +-
 hw/scsi/lsi53c895a.c             |   2 +-
 hw/smbios/smbios.c               |   1 +
 hw/usb/hcd-ohci-pci.c            |   2 +-
 hw/watchdog/wdt_i6300esb.c       |   2 +-
 ui/util.c                        |   2 +-
 91 files changed, 450 insertions(+), 438 deletions(-)
 create mode 100644 include/hw/pci/pci_device.h

diff --git a/hw/display/ati_int.h b/hw/display/ati_int.h
index 8acb9c7466..e8d3c7af75 100644
--- a/hw/display/ati_int.h
+++ b/hw/display/ati_int.h
@@ -10,7 +10,7 @@
 #define ATI_INT_H
 
 #include "qemu/timer.h"
-#include "hw/pci/pci.h"
+#include "hw/pci/pci_device.h"
 #include "hw/i2c/bitbang_i2c.h"
 #include "vga_int.h"
 #include "qom/object.h"
diff --git a/hw/display/qxl.h b/hw/display/qxl.h
index 7894bd5134..cd82c7a6fe 100644
--- a/hw/display/qxl.h
+++ b/hw/display/qxl.h
@@ -1,8 +1,7 @@
 #ifndef HW_QXL_H
 #define HW_QXL_H
 
-
-#include "hw/pci/pci.h"
+#include "hw/pci/pci_device.h"
 #include "vga_int.h"
 #include "qemu/thread.h"
 
diff --git a/hw/ide/ahci_internal.h b/hw/ide/ahci_internal.h
index 109de9e2d1..303fcd7235 100644
--- a/hw/ide/ahci_internal.h
+++ b/hw/ide/ahci_internal.h
@@ -26,7 +26,7 @@
 
 #include "hw/ide/ahci.h"
 #include "hw/ide/internal.h"
-#include "hw/pci/pci.h"
+#include "hw/pci/pci_device.h"
 
 #define AHCI_MEM_BAR_SIZE         0x1000
 #define AHCI_MAX_PORTS            32
diff --git a/hw/net/vmxnet3_defs.h b/hw/net/vmxnet3_defs.h
index 71440509ca..64034af6d5 100644
--- a/hw/net/vmxnet3_defs.h
+++ b/hw/net/vmxnet3_defs.h
@@ -19,7 +19,7 @@
 
 #include "net/net.h"
 #include "hw/net/vmxnet3.h"
-#include "qom/object.h"
+#include "hw/pci/pci_device.h"
 
 #define TYPE_VMXNET3 "vmxnet3"
 typedef struct VMXNET3State VMXNET3State;
diff --git a/hw/nvme/nvme.h b/hw/nvme/nvme.h
index 7adf042ec3..16da27a69b 100644
--- a/hw/nvme/nvme.h
+++ b/hw/nvme/nvme.h
@@ -19,7 +19,7 @@
 #define HW_NVME_NVME_H
 
 #include "qemu/uuid.h"
-#include "hw/pci/pci.h"
+#include "hw/pci/pci_device.h"
 #include "hw/block/block.h"
 
 #include "block/nvme.h"
diff --git a/hw/rdma/vmw/pvrdma.h b/hw/rdma/vmw/pvrdma.h
index 0caf95ede8..4cbc10c980 100644
--- a/hw/rdma/vmw/pvrdma.h
+++ b/hw/rdma/vmw/pvrdma.h
@@ -19,6 +19,7 @@
 #include "qemu/units.h"
 #include "qemu/notify.h"
 #include "hw/pci/msix.h"
+#include "hw/pci/pci_device.h"
 #include "chardev/char-fe.h"
 #include "hw/net/vmxnet3_defs.h"
 
diff --git a/hw/scsi/mptsas.h b/hw/scsi/mptsas.h
index c046497db7..04e97ce3af 100644
--- a/hw/scsi/mptsas.h
+++ b/hw/scsi/mptsas.h
@@ -2,7 +2,7 @@
 #define MPTSAS_H
 
 #include "mpi.h"
-#include "qom/object.h"
+#include "hw/pci/pci_device.h"
 
 #define MPTSAS_NUM_PORTS 8
 #define MPTSAS_MAX_FRAMES 2048     /* Firmware limit at 65535 */
diff --git a/hw/usb/hcd-ehci.h b/hw/usb/hcd-ehci.h
index 4d4b2830b7..2cd821f49e 100644
--- a/hw/usb/hcd-ehci.h
+++ b/hw/usb/hcd-ehci.h
@@ -21,7 +21,7 @@
 #include "qemu/timer.h"
 #include "hw/usb.h"
 #include "sysemu/dma.h"
-#include "hw/pci/pci.h"
+#include "hw/pci/pci_device.h"
 #include "hw/sysbus.h"
 
 #ifndef EHCI_DEBUG
diff --git a/hw/usb/hcd-uhci.h b/hw/usb/hcd-uhci.h
index c85ab7868e..5843af504a 100644
--- a/hw/usb/hcd-uhci.h
+++ b/hw/usb/hcd-uhci.h
@@ -30,7 +30,7 @@
 
 #include "exec/memory.h"
 #include "qemu/timer.h"
-#include "hw/pci/pci.h"
+#include "hw/pci/pci_device.h"
 #include "hw/usb.h"
 
 typedef struct UHCIQueue UHCIQueue;
diff --git a/hw/usb/hcd-xhci-pci.h b/hw/usb/hcd-xhci-pci.h
index c193f79443..08f70ce97c 100644
--- a/hw/usb/hcd-xhci-pci.h
+++ b/hw/usb/hcd-xhci-pci.h
@@ -24,6 +24,7 @@
 #ifndef HW_USB_HCD_XHCI_PCI_H
 #define HW_USB_HCD_XHCI_PCI_H
 
+#include "hw/pci/pci_device.h"
 #include "hw/usb.h"
 #include "hcd-xhci.h"
 
diff --git a/hw/vfio/pci.h b/hw/vfio/pci.h
index 7c236a52f4..177abcc8fb 100644
--- a/hw/vfio/pci.h
+++ b/hw/vfio/pci.h
@@ -13,7 +13,7 @@
 #define HW_VFIO_VFIO_PCI_H
 
 #include "exec/memory.h"
-#include "hw/pci/pci.h"
+#include "hw/pci/pci_device.h"
 #include "hw/vfio/vfio-common.h"
 #include "qemu/event_notifier.h"
 #include "qemu/queue.h"
diff --git a/include/hw/acpi/piix4.h b/include/hw/acpi/piix4.h
index 32686a75c5..be1f8ea80e 100644
--- a/include/hw/acpi/piix4.h
+++ b/include/hw/acpi/piix4.h
@@ -22,7 +22,7 @@
 #ifndef HW_ACPI_PIIX4_H
 #define HW_ACPI_PIIX4_H
 
-#include "hw/pci/pci.h"
+#include "hw/pci/pci_device.h"
 #include "hw/acpi/acpi.h"
 #include "hw/acpi/cpu_hotplug.h"
 #include "hw/acpi/memory_hotplug.h"
diff --git a/include/hw/arm/allwinner-a10.h b/include/hw/arm/allwinner-a10.h
index a76dc7b84d..f9240ffa64 100644
--- a/include/hw/arm/allwinner-a10.h
+++ b/include/hw/arm/allwinner-a10.h
@@ -4,6 +4,7 @@
 #include "qemu/error-report.h"
 #include "hw/char/serial.h"
 #include "hw/arm/boot.h"
+#include "hw/pci/pci_device.h"
 #include "hw/timer/allwinner-a10-pit.h"
 #include "hw/intc/allwinner-a10-pic.h"
 #include "hw/net/allwinner_emac.h"
diff --git a/include/hw/cxl/cxl_device.h b/include/hw/cxl/cxl_device.h
index 3f91969db0..250adf18b2 100644
--- a/include/hw/cxl/cxl_device.h
+++ b/include/hw/cxl/cxl_device.h
@@ -11,7 +11,7 @@
 #define CXL_DEVICE_H
 
 #include "hw/cxl/cxl_component.h"
-#include "hw/pci/pci.h"
+#include "hw/pci/pci_device.h"
 #include "hw/register.h"
 
 /*
diff --git a/include/hw/ide/pci.h b/include/hw/ide/pci.h
index d8384e1c42..2a6284acac 100644
--- a/include/hw/ide/pci.h
+++ b/include/hw/ide/pci.h
@@ -2,7 +2,7 @@
 #define HW_IDE_PCI_H
 
 #include "hw/ide/internal.h"
-#include "hw/pci/pci.h"
+#include "hw/pci/pci_device.h"
 #include "qom/object.h"
 
 #define BM_STATUS_DMAING 0x01
diff --git a/include/hw/misc/macio/macio.h b/include/hw/misc/macio/macio.h
index 95d30a1745..86df2c2b60 100644
--- a/include/hw/misc/macio/macio.h
+++ b/include/hw/misc/macio/macio.h
@@ -27,7 +27,7 @@
 #define MACIO_H
 
 #include "hw/char/escc.h"
-#include "hw/pci/pci.h"
+#include "hw/pci/pci_device.h"
 #include "hw/ide/internal.h"
 #include "hw/intc/heathrow_pic.h"
 #include "hw/misc/macio/cuda.h"
diff --git a/include/hw/pci-host/gpex.h b/include/hw/pci-host/gpex.h
index fcf8b63820..b0240bd768 100644
--- a/include/hw/pci-host/gpex.h
+++ b/include/hw/pci-host/gpex.h
@@ -22,7 +22,7 @@
 
 #include "exec/hwaddr.h"
 #include "hw/sysbus.h"
-#include "hw/pci/pci.h"
+#include "hw/pci/pci_device.h"
 #include "hw/pci/pcie_host.h"
 #include "qom/object.h"
 
diff --git a/include/hw/pci-host/i440fx.h b/include/hw/pci-host/i440fx.h
index fc93e22732..bf57216c78 100644
--- a/include/hw/pci-host/i440fx.h
+++ b/include/hw/pci-host/i440fx.h
@@ -11,7 +11,7 @@
 #ifndef HW_PCI_I440FX_H
 #define HW_PCI_I440FX_H
 
-#include "hw/pci/pci.h"
+#include "hw/pci/pci_device.h"
 #include "hw/pci-host/pam.h"
 #include "qom/object.h"
 
diff --git a/include/hw/pci-host/q35.h b/include/hw/pci-host/q35.h
index ab989698ef..e89329c51e 100644
--- a/include/hw/pci-host/q35.h
+++ b/include/hw/pci-host/q35.h
@@ -22,7 +22,7 @@
 #ifndef HW_Q35_H
 #define HW_Q35_H
 
-#include "hw/pci/pci.h"
+#include "hw/pci/pci_device.h"
 #include "hw/pci/pcie_host.h"
 #include "hw/pci-host/pam.h"
 #include "qemu/units.h"
diff --git a/include/hw/pci-host/sabre.h b/include/hw/pci-host/sabre.h
index 01190241bb..d12de84ea2 100644
--- a/include/hw/pci-host/sabre.h
+++ b/include/hw/pci-host/sabre.h
@@ -1,7 +1,7 @@
 #ifndef HW_PCI_HOST_SABRE_H
 #define HW_PCI_HOST_SABRE_H
 
-#include "hw/pci/pci.h"
+#include "hw/pci/pci_device.h"
 #include "hw/pci/pci_host.h"
 #include "hw/sparc/sun4u_iommu.h"
 #include "qom/object.h"
diff --git a/include/hw/pci/msi.h b/include/hw/pci/msi.h
index 58aa576215..ee8ee469a6 100644
--- a/include/hw/pci/msi.h
+++ b/include/hw/pci/msi.h
@@ -21,7 +21,7 @@
 #ifndef QEMU_MSI_H
 #define QEMU_MSI_H
 
-#include "hw/pci/pci.h"
+#include "hw/pci/pci_device.h"
 
 struct MSIMessage {
     uint64_t address;
diff --git a/include/hw/pci/pci.h b/include/hw/pci/pci.h
index 016e28a2a8..7048a373d1 100644
--- a/include/hw/pci/pci.h
+++ b/include/hw/pci/pci.h
@@ -166,7 +166,6 @@ enum {
 #define QEMU_PCI_VGA_IO_HI_SIZE 0x20
 
 #include "hw/pci/pci_regs.h"
-#include "hw/pci/pcie.h"
 
 /* PCI HEADER_TYPE */
 #define  PCI_HEADER_TYPE_MULTI_FUNCTION 0x80
@@ -210,23 +209,6 @@ enum {
     QEMU_PCIE_CAP_CXL = (1 << QEMU_PCIE_CXL_BITNR),
 };
 
-#define TYPE_PCI_DEVICE "pci-device"
-typedef struct PCIDeviceClass PCIDeviceClass;
-DECLARE_OBJ_CHECKERS(PCIDevice, PCIDeviceClass,
-                     PCI_DEVICE, TYPE_PCI_DEVICE)
-
-/*
- * Implemented by devices that can be plugged on CXL buses. In the spec, this is
- * actually a "CXL Component, but we name it device to match the PCI naming.
- */
-#define INTERFACE_CXL_DEVICE "cxl-device"
-
-/* Implemented by devices that can be plugged on PCI Express buses */
-#define INTERFACE_PCIE_DEVICE "pci-express-device"
-
-/* Implemented by devices that can be plugged on Conventional PCI buses */
-#define INTERFACE_CONVENTIONAL_PCI_DEVICE "conventional-pci-device"
-
 typedef struct PCIINTxRoute {
     enum {
         PCI_INTX_ENABLED,
@@ -236,32 +218,6 @@ typedef struct PCIINTxRoute {
     int irq;
 } PCIINTxRoute;
 
-struct PCIDeviceClass {
-    DeviceClass parent_class;
-
-    void (*realize)(PCIDevice *dev, Error **errp);
-    PCIUnregisterFunc *exit;
-    PCIConfigReadFunc *config_read;
-    PCIConfigWriteFunc *config_write;
-
-    uint16_t vendor_id;
-    uint16_t device_id;
-    uint8_t revision;
-    uint16_t class_id;
-    uint16_t subsystem_vendor_id;       /* only for header type = 0 */
-    uint16_t subsystem_id;              /* only for header type = 0 */
-
-    /*
-     * pci-to-pci bridge or normal device.
-     * This doesn't mean pci host switch.
-     * When card bus bridge is supported, this would be enhanced.
-     */
-    bool is_bridge;
-
-    /* rom bar */
-    const char *romfile;
-};
-
 typedef void (*PCIINTxRoutingNotifier)(PCIDevice *dev);
 typedef int (*MSIVectorUseNotifier)(PCIDevice *dev, unsigned int vector,
                                       MSIMessage msg);
@@ -270,129 +226,6 @@ typedef void (*MSIVectorPollNotifier)(PCIDevice *dev,
                                       unsigned int vector_start,
                                       unsigned int vector_end);
 
-enum PCIReqIDType {
-    PCI_REQ_ID_INVALID = 0,
-    PCI_REQ_ID_BDF,
-    PCI_REQ_ID_SECONDARY_BUS,
-    PCI_REQ_ID_MAX,
-};
-typedef enum PCIReqIDType PCIReqIDType;
-
-struct PCIReqIDCache {
-    PCIDevice *dev;
-    PCIReqIDType type;
-};
-typedef struct PCIReqIDCache PCIReqIDCache;
-
-struct PCIDevice {
-    DeviceState qdev;
-    bool partially_hotplugged;
-    bool has_power;
-
-    /* PCI config space */
-    uint8_t *config;
-
-    /*
-     * Used to enable config checks on load. Note that writable bits are
-     * never checked even if set in cmask.
-     */
-    uint8_t *cmask;
-
-    /* Used to implement R/W bytes */
-    uint8_t *wmask;
-
-    /* Used to implement RW1C(Write 1 to Clear) bytes */
-    uint8_t *w1cmask;
-
-    /* Used to allocate config space for capabilities. */
-    uint8_t *used;
-
-    /* the following fields are read only */
-    int32_t devfn;
-    /*
-     * Cached device to fetch requester ID from, to avoid the PCI tree
-     * walking every time we invoke PCI request (e.g., MSI). For
-     * conventional PCI root complex, this field is meaningless.
-     */
-    PCIReqIDCache requester_id_cache;
-    char name[64];
-    PCIIORegion io_regions[PCI_NUM_REGIONS];
-    AddressSpace bus_master_as;
-    MemoryRegion bus_master_container_region;
-    MemoryRegion bus_master_enable_region;
-
-    /* do not access the following fields */
-    PCIConfigReadFunc *config_read;
-    PCIConfigWriteFunc *config_write;
-
-    /* Legacy PCI VGA regions */
-    MemoryRegion *vga_regions[QEMU_PCI_VGA_NUM_REGIONS];
-    bool has_vga;
-
-    /* Current IRQ levels.  Used internally by the generic PCI code.  */
-    uint8_t irq_state;
-
-    /* Capability bits */
-    uint32_t cap_present;
-
-    /* Offset of MSI-X capability in config space */
-    uint8_t msix_cap;
-
-    /* MSI-X entries */
-    int msix_entries_nr;
-
-    /* Space to store MSIX table & pending bit array */
-    uint8_t *msix_table;
-    uint8_t *msix_pba;
-
-    /* May be used by INTx or MSI during interrupt notification */
-    void *irq_opaque;
-
-    MSITriggerFunc *msi_trigger;
-    MSIPrepareMessageFunc *msi_prepare_message;
-    MSIxPrepareMessageFunc *msix_prepare_message;
-
-    /* MemoryRegion container for msix exclusive BAR setup */
-    MemoryRegion msix_exclusive_bar;
-    /* Memory Regions for MSIX table and pending bit entries. */
-    MemoryRegion msix_table_mmio;
-    MemoryRegion msix_pba_mmio;
-    /* Reference-count for entries actually in use by driver. */
-    unsigned *msix_entry_used;
-    /* MSIX function mask set or MSIX disabled */
-    bool msix_function_masked;
-    /* Version id needed for VMState */
-    int32_t version_id;
-
-    /* Offset of MSI capability in config space */
-    uint8_t msi_cap;
-
-    /* PCI Express */
-    PCIExpressDevice exp;
-
-    /* SHPC */
-    SHPCDevice *shpc;
-
-    /* Location of option rom */
-    char *romfile;
-    uint32_t romsize;
-    bool has_rom;
-    MemoryRegion rom;
-    uint32_t rom_bar;
-
-    /* INTx routing notifier */
-    PCIINTxRoutingNotifier intx_routing_notifier;
-
-    /* MSI-X notifiers */
-    MSIVectorUseNotifier msix_vector_use_notifier;
-    MSIVectorReleaseNotifier msix_vector_release_notifier;
-    MSIVectorPollNotifier msix_vector_poll_notifier;
-
-    /* ID of standby device in net_failover pair */
-    char *failover_pair_id;
-    uint32_t acpi_index;
-};
-
 void pci_register_bar(PCIDevice *pci_dev, int region_num,
                       uint8_t attr, MemoryRegion *memory);
 void pci_register_vga(PCIDevice *pci_dev, MemoryRegion *mem,
@@ -753,11 +586,6 @@ void lsi53c8xx_handle_legacy_cmdline(DeviceState *lsi_dev);
 qemu_irq pci_allocate_irq(PCIDevice *pci_dev);
 void pci_set_irq(PCIDevice *pci_dev, int level);
 
-static inline int pci_intx(PCIDevice *pci_dev)
-{
-    return pci_get_byte(pci_dev->config + PCI_INTERRUPT_PIN) - 1;
-}
-
 static inline void pci_irq_assert(PCIDevice *pci_dev)
 {
     pci_set_irq(pci_dev, 1);
@@ -778,189 +606,6 @@ static inline void pci_irq_pulse(PCIDevice *pci_dev)
     pci_irq_deassert(pci_dev);
 }
 
-static inline int pci_is_cxl(const PCIDevice *d)
-{
-    return d->cap_present & QEMU_PCIE_CAP_CXL;
-}
-
-static inline int pci_is_express(const PCIDevice *d)
-{
-    return d->cap_present & QEMU_PCI_CAP_EXPRESS;
-}
-
-static inline int pci_is_express_downstream_port(const PCIDevice *d)
-{
-    uint8_t type;
-
-    if (!pci_is_express(d) || !d->exp.exp_cap) {
-        return 0;
-    }
-
-    type = pcie_cap_get_type(d);
-
-    return type == PCI_EXP_TYPE_DOWNSTREAM || type == PCI_EXP_TYPE_ROOT_PORT;
-}
-
-static inline int pci_is_vf(const PCIDevice *d)
-{
-    return d->exp.sriov_vf.pf != NULL;
-}
-
-static inline uint32_t pci_config_size(const PCIDevice *d)
-{
-    return pci_is_express(d) ? PCIE_CONFIG_SPACE_SIZE : PCI_CONFIG_SPACE_SIZE;
-}
-
-static inline uint16_t pci_get_bdf(PCIDevice *dev)
-{
-    return PCI_BUILD_BDF(pci_bus_num(pci_get_bus(dev)), dev->devfn);
-}
-
-uint16_t pci_requester_id(PCIDevice *dev);
-
-/* DMA access functions */
-static inline AddressSpace *pci_get_address_space(PCIDevice *dev)
-{
-    return &dev->bus_master_as;
-}
-
-/**
- * pci_dma_rw: Read from or write to an address space from PCI device.
- *
- * Return a MemTxResult indicating whether the operation succeeded
- * or failed (eg unassigned memory, device rejected the transaction,
- * IOMMU fault).
- *
- * @dev: #PCIDevice doing the memory access
- * @addr: address within the #PCIDevice address space
- * @buf: buffer with the data transferred
- * @len: the number of bytes to read or write
- * @dir: indicates the transfer direction
- */
-static inline MemTxResult pci_dma_rw(PCIDevice *dev, dma_addr_t addr,
-                                     void *buf, dma_addr_t len,
-                                     DMADirection dir, MemTxAttrs attrs)
-{
-    return dma_memory_rw(pci_get_address_space(dev), addr, buf, len,
-                         dir, attrs);
-}
-
-/**
- * pci_dma_read: Read from an address space from PCI device.
- *
- * Return a MemTxResult indicating whether the operation succeeded
- * or failed (eg unassigned memory, device rejected the transaction,
- * IOMMU fault).  Called within RCU critical section.
- *
- * @dev: #PCIDevice doing the memory access
- * @addr: address within the #PCIDevice address space
- * @buf: buffer with the data transferred
- * @len: length of the data transferred
- */
-static inline MemTxResult pci_dma_read(PCIDevice *dev, dma_addr_t addr,
-                                       void *buf, dma_addr_t len)
-{
-    return pci_dma_rw(dev, addr, buf, len,
-                      DMA_DIRECTION_TO_DEVICE, MEMTXATTRS_UNSPECIFIED);
-}
-
-/**
- * pci_dma_write: Write to address space from PCI device.
- *
- * Return a MemTxResult indicating whether the operation succeeded
- * or failed (eg unassigned memory, device rejected the transaction,
- * IOMMU fault).
- *
- * @dev: #PCIDevice doing the memory access
- * @addr: address within the #PCIDevice address space
- * @buf: buffer with the data transferred
- * @len: the number of bytes to write
- */
-static inline MemTxResult pci_dma_write(PCIDevice *dev, dma_addr_t addr,
-                                        const void *buf, dma_addr_t len)
-{
-    return pci_dma_rw(dev, addr, (void *) buf, len,
-                      DMA_DIRECTION_FROM_DEVICE, MEMTXATTRS_UNSPECIFIED);
-}
-
-#define PCI_DMA_DEFINE_LDST(_l, _s, _bits) \
-    static inline MemTxResult ld##_l##_pci_dma(PCIDevice *dev, \
-                                               dma_addr_t addr, \
-                                               uint##_bits##_t *val, \
-                                               MemTxAttrs attrs) \
-    { \
-        return ld##_l##_dma(pci_get_address_space(dev), addr, val, attrs); \
-    } \
-    static inline MemTxResult st##_s##_pci_dma(PCIDevice *dev, \
-                                               dma_addr_t addr, \
-                                               uint##_bits##_t val, \
-                                               MemTxAttrs attrs) \
-    { \
-        return st##_s##_dma(pci_get_address_space(dev), addr, val, attrs); \
-    }
-
-PCI_DMA_DEFINE_LDST(ub, b, 8);
-PCI_DMA_DEFINE_LDST(uw_le, w_le, 16)
-PCI_DMA_DEFINE_LDST(l_le, l_le, 32);
-PCI_DMA_DEFINE_LDST(q_le, q_le, 64);
-PCI_DMA_DEFINE_LDST(uw_be, w_be, 16)
-PCI_DMA_DEFINE_LDST(l_be, l_be, 32);
-PCI_DMA_DEFINE_LDST(q_be, q_be, 64);
-
-#undef PCI_DMA_DEFINE_LDST
-
-/**
- * pci_dma_map: Map device PCI address space range into host virtual address
- * @dev: #PCIDevice to be accessed
- * @addr: address within that device's address space
- * @plen: pointer to length of buffer; updated on return to indicate
- *        if only a subset of the requested range has been mapped
- * @dir: indicates the transfer direction
- *
- * Return: A host pointer, or %NULL if the resources needed to
- *         perform the mapping are exhausted (in that case *@plen
- *         is set to zero).
- */
-static inline void *pci_dma_map(PCIDevice *dev, dma_addr_t addr,
-                                dma_addr_t *plen, DMADirection dir)
-{
-    void *buf;
-
-    buf = dma_memory_map(pci_get_address_space(dev), addr, plen, dir,
-                         MEMTXATTRS_UNSPECIFIED);
-    return buf;
-}
-
-static inline void pci_dma_unmap(PCIDevice *dev, void *buffer, dma_addr_t len,
-                                 DMADirection dir, dma_addr_t access_len)
-{
-    dma_memory_unmap(pci_get_address_space(dev), buffer, len, dir, access_len);
-}
-
-static inline void pci_dma_sglist_init(QEMUSGList *qsg, PCIDevice *dev,
-                                       int alloc_hint)
-{
-    qemu_sglist_init(qsg, DEVICE(dev), alloc_hint, pci_get_address_space(dev));
-}
-
-extern const VMStateDescription vmstate_pci_device;
-
-#define VMSTATE_PCI_DEVICE(_field, _state) {                         \
-    .name       = (stringify(_field)),                               \
-    .size       = sizeof(PCIDevice),                                 \
-    .vmsd       = &vmstate_pci_device,                               \
-    .flags      = VMS_STRUCT,                                        \
-    .offset     = vmstate_offset_value(_state, _field, PCIDevice),   \
-}
-
-#define VMSTATE_PCI_DEVICE_POINTER(_field, _state) {                 \
-    .name       = (stringify(_field)),                               \
-    .size       = sizeof(PCIDevice),                                 \
-    .vmsd       = &vmstate_pci_device,                               \
-    .flags      = VMS_STRUCT | VMS_POINTER,                          \
-    .offset     = vmstate_offset_pointer(_state, _field, PCIDevice), \
-}
-
 MSIMessage pci_get_msi_message(PCIDevice *dev, int vector);
 void pci_set_power(PCIDevice *pci_dev, bool state);
 
diff --git a/include/hw/pci/pci_bridge.h b/include/hw/pci/pci_bridge.h
index ba4bafac7c..22e8472de2 100644
--- a/include/hw/pci/pci_bridge.h
+++ b/include/hw/pci/pci_bridge.h
@@ -26,7 +26,7 @@
 #ifndef QEMU_PCI_BRIDGE_H
 #define QEMU_PCI_BRIDGE_H
 
-#include "hw/pci/pci.h"
+#include "hw/pci/pci_device.h"
 #include "hw/pci/pci_bus.h"
 #include "hw/cxl/cxl.h"
 #include "qom/object.h"
diff --git a/include/hw/pci/pci_device.h b/include/hw/pci/pci_device.h
new file mode 100644
index 0000000000..b82a379f6f
--- /dev/null
+++ b/include/hw/pci/pci_device.h
@@ -0,0 +1,361 @@
+#ifndef QEMU_PCI_DEVICE_H
+#define QEMU_PCI_DEVICE_H
+
+#include "hw/pci/pci.h"
+#include "hw/pci/pcie.h"
+
+#define TYPE_PCI_DEVICE "pci-device"
+typedef struct PCIDeviceClass PCIDeviceClass;
+DECLARE_OBJ_CHECKERS(PCIDevice, PCIDeviceClass,
+                     PCI_DEVICE, TYPE_PCI_DEVICE)
+
+/*
+ * Implemented by devices that can be plugged on CXL buses. In the spec, this is
+ * actually a "CXL Component, but we name it device to match the PCI naming.
+ */
+#define INTERFACE_CXL_DEVICE "cxl-device"
+
+/* Implemented by devices that can be plugged on PCI Express buses */
+#define INTERFACE_PCIE_DEVICE "pci-express-device"
+
+/* Implemented by devices that can be plugged on Conventional PCI buses */
+#define INTERFACE_CONVENTIONAL_PCI_DEVICE "conventional-pci-device"
+
+struct PCIDeviceClass {
+    DeviceClass parent_class;
+
+    void (*realize)(PCIDevice *dev, Error **errp);
+    PCIUnregisterFunc *exit;
+    PCIConfigReadFunc *config_read;
+    PCIConfigWriteFunc *config_write;
+
+    uint16_t vendor_id;
+    uint16_t device_id;
+    uint8_t revision;
+    uint16_t class_id;
+    uint16_t subsystem_vendor_id;       /* only for header type = 0 */
+    uint16_t subsystem_id;              /* only for header type = 0 */
+
+    /*
+     * pci-to-pci bridge or normal device.
+     * This doesn't mean pci host switch.
+     * When card bus bridge is supported, this would be enhanced.
+     */
+    bool is_bridge;
+
+    /* rom bar */
+    const char *romfile;
+};
+
+enum PCIReqIDType {
+    PCI_REQ_ID_INVALID = 0,
+    PCI_REQ_ID_BDF,
+    PCI_REQ_ID_SECONDARY_BUS,
+    PCI_REQ_ID_MAX,
+};
+typedef enum PCIReqIDType PCIReqIDType;
+
+struct PCIReqIDCache {
+    PCIDevice *dev;
+    PCIReqIDType type;
+};
+typedef struct PCIReqIDCache PCIReqIDCache;
+
+struct PCIDevice {
+    DeviceState qdev;
+    bool partially_hotplugged;
+    bool has_power;
+
+    /* PCI config space */
+    uint8_t *config;
+
+    /*
+     * Used to enable config checks on load. Note that writable bits are
+     * never checked even if set in cmask.
+     */
+    uint8_t *cmask;
+
+    /* Used to implement R/W bytes */
+    uint8_t *wmask;
+
+    /* Used to implement RW1C(Write 1 to Clear) bytes */
+    uint8_t *w1cmask;
+
+    /* Used to allocate config space for capabilities. */
+    uint8_t *used;
+
+    /* the following fields are read only */
+    int32_t devfn;
+    /*
+     * Cached device to fetch requester ID from, to avoid the PCI tree
+     * walking every time we invoke PCI request (e.g., MSI). For
+     * conventional PCI root complex, this field is meaningless.
+     */
+    PCIReqIDCache requester_id_cache;
+    char name[64];
+    PCIIORegion io_regions[PCI_NUM_REGIONS];
+    AddressSpace bus_master_as;
+    MemoryRegion bus_master_container_region;
+    MemoryRegion bus_master_enable_region;
+
+    /* do not access the following fields */
+    PCIConfigReadFunc *config_read;
+    PCIConfigWriteFunc *config_write;
+
+    /* Legacy PCI VGA regions */
+    MemoryRegion *vga_regions[QEMU_PCI_VGA_NUM_REGIONS];
+    bool has_vga;
+
+    /* Current IRQ levels.  Used internally by the generic PCI code.  */
+    uint8_t irq_state;
+
+    /* Capability bits */
+    uint32_t cap_present;
+
+    /* Offset of MSI-X capability in config space */
+    uint8_t msix_cap;
+
+    /* MSI-X entries */
+    int msix_entries_nr;
+
+    /* Space to store MSIX table & pending bit array */
+    uint8_t *msix_table;
+    uint8_t *msix_pba;
+
+    /* May be used by INTx or MSI during interrupt notification */
+    void *irq_opaque;
+
+    MSITriggerFunc *msi_trigger;
+    MSIPrepareMessageFunc *msi_prepare_message;
+    MSIxPrepareMessageFunc *msix_prepare_message;
+
+    /* MemoryRegion container for msix exclusive BAR setup */
+    MemoryRegion msix_exclusive_bar;
+    /* Memory Regions for MSIX table and pending bit entries. */
+    MemoryRegion msix_table_mmio;
+    MemoryRegion msix_pba_mmio;
+    /* Reference-count for entries actually in use by driver. */
+    unsigned *msix_entry_used;
+    /* MSIX function mask set or MSIX disabled */
+    bool msix_function_masked;
+    /* Version id needed for VMState */
+    int32_t version_id;
+
+    /* Offset of MSI capability in config space */
+    uint8_t msi_cap;
+
+    /* PCI Express */
+    PCIExpressDevice exp;
+
+    /* SHPC */
+    SHPCDevice *shpc;
+
+    /* Location of option rom */
+    char *romfile;
+    uint32_t romsize;
+    bool has_rom;
+    MemoryRegion rom;
+    uint32_t rom_bar;
+
+    /* INTx routing notifier */
+    PCIINTxRoutingNotifier intx_routing_notifier;
+
+    /* MSI-X notifiers */
+    MSIVectorUseNotifier msix_vector_use_notifier;
+    MSIVectorReleaseNotifier msix_vector_release_notifier;
+    MSIVectorPollNotifier msix_vector_poll_notifier;
+
+    /* ID of standby device in net_failover pair */
+    char *failover_pair_id;
+    uint32_t acpi_index;
+};
+
+static inline int pci_intx(PCIDevice *pci_dev)
+{
+    return pci_get_byte(pci_dev->config + PCI_INTERRUPT_PIN) - 1;
+}
+
+static inline int pci_is_cxl(const PCIDevice *d)
+{
+    return d->cap_present & QEMU_PCIE_CAP_CXL;
+}
+
+static inline int pci_is_express(const PCIDevice *d)
+{
+    return d->cap_present & QEMU_PCI_CAP_EXPRESS;
+}
+
+static inline int pci_is_express_downstream_port(const PCIDevice *d)
+{
+    uint8_t type;
+
+    if (!pci_is_express(d) || !d->exp.exp_cap) {
+        return 0;
+    }
+
+    type = pcie_cap_get_type(d);
+
+    return type == PCI_EXP_TYPE_DOWNSTREAM || type == PCI_EXP_TYPE_ROOT_PORT;
+}
+
+static inline int pci_is_vf(const PCIDevice *d)
+{
+    return d->exp.sriov_vf.pf != NULL;
+}
+
+static inline uint32_t pci_config_size(const PCIDevice *d)
+{
+    return pci_is_express(d) ? PCIE_CONFIG_SPACE_SIZE : PCI_CONFIG_SPACE_SIZE;
+}
+
+static inline uint16_t pci_get_bdf(PCIDevice *dev)
+{
+    return PCI_BUILD_BDF(pci_bus_num(pci_get_bus(dev)), dev->devfn);
+}
+
+uint16_t pci_requester_id(PCIDevice *dev);
+
+/* DMA access functions */
+static inline AddressSpace *pci_get_address_space(PCIDevice *dev)
+{
+    return &dev->bus_master_as;
+}
+
+/**
+ * pci_dma_rw: Read from or write to an address space from PCI device.
+ *
+ * Return a MemTxResult indicating whether the operation succeeded
+ * or failed (eg unassigned memory, device rejected the transaction,
+ * IOMMU fault).
+ *
+ * @dev: #PCIDevice doing the memory access
+ * @addr: address within the #PCIDevice address space
+ * @buf: buffer with the data transferred
+ * @len: the number of bytes to read or write
+ * @dir: indicates the transfer direction
+ */
+static inline MemTxResult pci_dma_rw(PCIDevice *dev, dma_addr_t addr,
+                                     void *buf, dma_addr_t len,
+                                     DMADirection dir, MemTxAttrs attrs)
+{
+    return dma_memory_rw(pci_get_address_space(dev), addr, buf, len,
+                         dir, attrs);
+}
+
+/**
+ * pci_dma_read: Read from an address space from PCI device.
+ *
+ * Return a MemTxResult indicating whether the operation succeeded
+ * or failed (eg unassigned memory, device rejected the transaction,
+ * IOMMU fault).  Called within RCU critical section.
+ *
+ * @dev: #PCIDevice doing the memory access
+ * @addr: address within the #PCIDevice address space
+ * @buf: buffer with the data transferred
+ * @len: length of the data transferred
+ */
+static inline MemTxResult pci_dma_read(PCIDevice *dev, dma_addr_t addr,
+                                       void *buf, dma_addr_t len)
+{
+    return pci_dma_rw(dev, addr, buf, len,
+                      DMA_DIRECTION_TO_DEVICE, MEMTXATTRS_UNSPECIFIED);
+}
+
+/**
+ * pci_dma_write: Write to address space from PCI device.
+ *
+ * Return a MemTxResult indicating whether the operation succeeded
+ * or failed (eg unassigned memory, device rejected the transaction,
+ * IOMMU fault).
+ *
+ * @dev: #PCIDevice doing the memory access
+ * @addr: address within the #PCIDevice address space
+ * @buf: buffer with the data transferred
+ * @len: the number of bytes to write
+ */
+static inline MemTxResult pci_dma_write(PCIDevice *dev, dma_addr_t addr,
+                                        const void *buf, dma_addr_t len)
+{
+    return pci_dma_rw(dev, addr, (void *) buf, len,
+                      DMA_DIRECTION_FROM_DEVICE, MEMTXATTRS_UNSPECIFIED);
+}
+
+#define PCI_DMA_DEFINE_LDST(_l, _s, _bits) \
+    static inline MemTxResult ld##_l##_pci_dma(PCIDevice *dev, \
+                                               dma_addr_t addr, \
+                                               uint##_bits##_t *val, \
+                                               MemTxAttrs attrs) \
+    { \
+        return ld##_l##_dma(pci_get_address_space(dev), addr, val, attrs); \
+    } \
+    static inline MemTxResult st##_s##_pci_dma(PCIDevice *dev, \
+                                               dma_addr_t addr, \
+                                               uint##_bits##_t val, \
+                                               MemTxAttrs attrs) \
+    { \
+        return st##_s##_dma(pci_get_address_space(dev), addr, val, attrs); \
+    }
+
+PCI_DMA_DEFINE_LDST(ub, b, 8);
+PCI_DMA_DEFINE_LDST(uw_le, w_le, 16)
+PCI_DMA_DEFINE_LDST(l_le, l_le, 32);
+PCI_DMA_DEFINE_LDST(q_le, q_le, 64);
+PCI_DMA_DEFINE_LDST(uw_be, w_be, 16)
+PCI_DMA_DEFINE_LDST(l_be, l_be, 32);
+PCI_DMA_DEFINE_LDST(q_be, q_be, 64);
+
+#undef PCI_DMA_DEFINE_LDST
+
+/**
+ * pci_dma_map: Map device PCI address space range into host virtual address
+ * @dev: #PCIDevice to be accessed
+ * @addr: address within that device's address space
+ * @plen: pointer to length of buffer; updated on return to indicate
+ *        if only a subset of the requested range has been mapped
+ * @dir: indicates the transfer direction
+ *
+ * Return: A host pointer, or %NULL if the resources needed to
+ *         perform the mapping are exhausted (in that case *@plen
+ *         is set to zero).
+ */
+static inline void *pci_dma_map(PCIDevice *dev, dma_addr_t addr,
+                                dma_addr_t *plen, DMADirection dir)
+{
+    void *buf;
+
+    buf = dma_memory_map(pci_get_address_space(dev), addr, plen, dir,
+                         MEMTXATTRS_UNSPECIFIED);
+    return buf;
+}
+
+static inline void pci_dma_unmap(PCIDevice *dev, void *buffer, dma_addr_t len,
+                                 DMADirection dir, dma_addr_t access_len)
+{
+    dma_memory_unmap(pci_get_address_space(dev), buffer, len, dir, access_len);
+}
+
+static inline void pci_dma_sglist_init(QEMUSGList *qsg, PCIDevice *dev,
+                                       int alloc_hint)
+{
+    qemu_sglist_init(qsg, DEVICE(dev), alloc_hint, pci_get_address_space(dev));
+}
+
+extern const VMStateDescription vmstate_pci_device;
+
+#define VMSTATE_PCI_DEVICE(_field, _state) {                         \
+    .name       = (stringify(_field)),                               \
+    .size       = sizeof(PCIDevice),                                 \
+    .vmsd       = &vmstate_pci_device,                               \
+    .flags      = VMS_STRUCT,                                        \
+    .offset     = vmstate_offset_value(_state, _field, PCIDevice),   \
+}
+
+#define VMSTATE_PCI_DEVICE_POINTER(_field, _state) {                 \
+    .name       = (stringify(_field)),                               \
+    .size       = sizeof(PCIDevice),                                 \
+    .vmsd       = &vmstate_pci_device,                               \
+    .flags      = VMS_STRUCT | VMS_POINTER,                          \
+    .offset     = vmstate_offset_pointer(_state, _field, PCIDevice), \
+}
+
+#endif
diff --git a/include/hw/pci/pcie_port.h b/include/hw/pci/pcie_port.h
index 7b8193061a..5bf420a122 100644
--- a/include/hw/pci/pcie_port.h
+++ b/include/hw/pci/pcie_port.h
@@ -23,6 +23,7 @@
 
 #include "hw/pci/pci_bridge.h"
 #include "hw/pci/pci_bus.h"
+#include "hw/pci/pci_device.h"
 #include "qom/object.h"
 
 #define TYPE_PCIE_PORT "pcie-port"
diff --git a/include/hw/pci/shpc.h b/include/hw/pci/shpc.h
index d5683b7399..89c7a3b7fa 100644
--- a/include/hw/pci/shpc.h
+++ b/include/hw/pci/shpc.h
@@ -3,7 +3,7 @@
 
 #include "exec/memory.h"
 #include "hw/hotplug.h"
-#include "hw/pci/pci.h"
+#include "hw/pci/pci_device.h"
 #include "migration/vmstate.h"
 
 struct SHPCDevice {
diff --git a/include/hw/remote/iohub.h b/include/hw/remote/iohub.h
index 0bf98e0d78..6a8444f9a9 100644
--- a/include/hw/remote/iohub.h
+++ b/include/hw/remote/iohub.h
@@ -11,7 +11,7 @@
 #ifndef REMOTE_IOHUB_H
 #define REMOTE_IOHUB_H
 
-#include "hw/pci/pci.h"
+#include "hw/pci/pci_device.h"
 #include "qemu/event_notifier.h"
 #include "qemu/thread-posix.h"
 #include "hw/remote/mpqemu-link.h"
diff --git a/include/hw/remote/proxy.h b/include/hw/remote/proxy.h
index 741def71f1..0cfd9665be 100644
--- a/include/hw/remote/proxy.h
+++ b/include/hw/remote/proxy.h
@@ -9,7 +9,7 @@
 #ifndef PROXY_H
 #define PROXY_H
 
-#include "hw/pci/pci.h"
+#include "hw/pci/pci_device.h"
 #include "io/channel.h"
 #include "hw/remote/proxy-memory-listener.h"
 #include "qemu/event_notifier.h"
diff --git a/include/hw/sd/sdhci.h b/include/hw/sd/sdhci.h
index 01a64c5442..8460d6462b 100644
--- a/include/hw/sd/sdhci.h
+++ b/include/hw/sd/sdhci.h
@@ -25,7 +25,7 @@
 #ifndef SDHCI_H
 #define SDHCI_H
 
-#include "hw/pci/pci.h"
+#include "hw/pci/pci_device.h"
 #include "hw/sysbus.h"
 #include "hw/sd/sd.h"
 #include "qom/object.h"
diff --git a/include/hw/southbridge/piix.h b/include/hw/southbridge/piix.h
index 2693778b23..0bf48e936d 100644
--- a/include/hw/southbridge/piix.h
+++ b/include/hw/southbridge/piix.h
@@ -12,8 +12,7 @@
 #ifndef HW_SOUTHBRIDGE_PIIX_H
 #define HW_SOUTHBRIDGE_PIIX_H
 
-#include "hw/pci/pci.h"
-#include "qom/object.h"
+#include "hw/pci/pci_device.h"
 
 /* PIRQRC[A:D]: PIRQx Route Control Registers */
 #define PIIX_PIRQCA 0x60
diff --git a/include/hw/xen/xen_common.h b/include/hw/xen/xen_common.h
index 77ce17d8a4..9a13a756ae 100644
--- a/include/hw/xen/xen_common.h
+++ b/include/hw/xen/xen_common.h
@@ -15,7 +15,7 @@
 #include "hw/xen/interface/io/xenbus.h"
 
 #include "hw/xen/xen.h"
-#include "hw/pci/pci.h"
+#include "hw/pci/pci_device.h"
 #include "hw/xen/trace.h"
 
 extern xc_interface *xen_xc;
diff --git a/hw/acpi/erst.c b/hw/acpi/erst.c
index aefcc03ad6..35007d8017 100644
--- a/hw/acpi/erst.c
+++ b/hw/acpi/erst.c
@@ -14,7 +14,7 @@
 #include "hw/qdev-core.h"
 #include "exec/memory.h"
 #include "qom/object.h"
-#include "hw/pci/pci.h"
+#include "hw/pci/pci_device.h"
 #include "qom/object_interfaces.h"
 #include "qemu/error-report.h"
 #include "migration/vmstate.h"
diff --git a/hw/audio/ac97.c b/hw/audio/ac97.c
index be2dd701a4..364cdfa733 100644
--- a/hw/audio/ac97.c
+++ b/hw/audio/ac97.c
@@ -20,7 +20,7 @@
 #include "qemu/osdep.h"
 #include "hw/audio/soundhw.h"
 #include "audio/audio.h"
-#include "hw/pci/pci.h"
+#include "hw/pci/pci_device.h"
 #include "hw/qdev-properties.h"
 #include "migration/vmstate.h"
 #include "qemu/module.h"
diff --git a/hw/audio/es1370.c b/hw/audio/es1370.c
index 6904589814..54cc19a637 100644
--- a/hw/audio/es1370.c
+++ b/hw/audio/es1370.c
@@ -29,7 +29,7 @@
 #include "qemu/osdep.h"
 #include "hw/audio/soundhw.h"
 #include "audio/audio.h"
-#include "hw/pci/pci.h"
+#include "hw/pci/pci_device.h"
 #include "migration/vmstate.h"
 #include "qemu/module.h"
 #include "sysemu/dma.h"
diff --git a/hw/audio/via-ac97.c b/hw/audio/via-ac97.c
index 6d556f74fc..d1a856f63d 100644
--- a/hw/audio/via-ac97.c
+++ b/hw/audio/via-ac97.c
@@ -11,7 +11,7 @@
 
 #include "qemu/osdep.h"
 #include "hw/isa/vt82c686.h"
-#include "hw/pci/pci.h"
+#include "hw/pci/pci_device.h"
 
 static void via_ac97_realize(PCIDevice *pci_dev, Error **errp)
 {
diff --git a/hw/char/serial-pci-multi.c b/hw/char/serial-pci-multi.c
index 3a9f96c2d1..f18b8dcce5 100644
--- a/hw/char/serial-pci-multi.c
+++ b/hw/char/serial-pci-multi.c
@@ -31,7 +31,7 @@
 #include "qapi/error.h"
 #include "hw/char/serial.h"
 #include "hw/irq.h"
-#include "hw/pci/pci.h"
+#include "hw/pci/pci_device.h"
 #include "hw/qdev-properties.h"
 #include "hw/qdev-properties-system.h"
 #include "migration/vmstate.h"
diff --git a/hw/char/serial-pci.c b/hw/char/serial-pci.c
index 93d6f99244..801b769aba 100644
--- a/hw/char/serial-pci.c
+++ b/hw/char/serial-pci.c
@@ -30,7 +30,7 @@
 #include "qemu/module.h"
 #include "hw/char/serial.h"
 #include "hw/irq.h"
-#include "hw/pci/pci.h"
+#include "hw/pci/pci_device.h"
 #include "hw/qdev-properties.h"
 #include "migration/vmstate.h"
 #include "qom/object.h"
diff --git a/hw/core/qdev-properties-system.c b/hw/core/qdev-properties-system.c
index a91f60567a..fccf41f4cd 100644
--- a/hw/core/qdev-properties-system.c
+++ b/hw/core/qdev-properties-system.c
@@ -32,6 +32,7 @@
 #include "sysemu/blockdev.h"
 #include "net/net.h"
 #include "hw/pci/pci.h"
+#include "hw/pci/pcie.h"
 #include "util/block-helpers.h"
 
 static bool check_prop_still_unset(Object *obj, const char *name,
diff --git a/hw/display/bochs-display.c b/hw/display/bochs-display.c
index 8ed734b195..e7ec268184 100644
--- a/hw/display/bochs-display.c
+++ b/hw/display/bochs-display.c
@@ -8,7 +8,7 @@
 #include "qemu/osdep.h"
 #include "qemu/module.h"
 #include "qemu/units.h"
-#include "hw/pci/pci.h"
+#include "hw/pci/pci_device.h"
 #include "hw/qdev-properties.h"
 #include "migration/vmstate.h"
 #include "hw/display/bochs-vbe.h"
diff --git a/hw/display/cirrus_vga.c b/hw/display/cirrus_vga.c
index 6e8c747c46..55c32e3e40 100644
--- a/hw/display/cirrus_vga.c
+++ b/hw/display/cirrus_vga.c
@@ -39,7 +39,7 @@
 #include "sysemu/reset.h"
 #include "qapi/error.h"
 #include "trace.h"
-#include "hw/pci/pci.h"
+#include "hw/pci/pci_device.h"
 #include "hw/qdev-properties.h"
 #include "migration/vmstate.h"
 #include "ui/pixel_ops.h"
diff --git a/hw/display/sm501.c b/hw/display/sm501.c
index 663c37e7f2..52e42585af 100644
--- a/hw/display/sm501.c
+++ b/hw/display/sm501.c
@@ -32,7 +32,7 @@
 #include "ui/console.h"
 #include "hw/sysbus.h"
 #include "migration/vmstate.h"
-#include "hw/pci/pci.h"
+#include "hw/pci/pci_device.h"
 #include "hw/qdev-properties.h"
 #include "hw/i2c/i2c.h"
 #include "hw/display/i2c-ddc.h"
diff --git a/hw/display/vga-pci.c b/hw/display/vga-pci.c
index df23dbf3a0..b351b8f299 100644
--- a/hw/display/vga-pci.c
+++ b/hw/display/vga-pci.c
@@ -25,7 +25,7 @@
  */
 
 #include "qemu/osdep.h"
-#include "hw/pci/pci.h"
+#include "hw/pci/pci_device.h"
 #include "hw/qdev-properties.h"
 #include "migration/vmstate.h"
 #include "vga_int.h"
diff --git a/hw/display/vmware_vga.c b/hw/display/vmware_vga.c
index 53949d2539..59ae7f74b8 100644
--- a/hw/display/vmware_vga.c
+++ b/hw/display/vmware_vga.c
@@ -29,7 +29,7 @@
 #include "qemu/log.h"
 #include "hw/loader.h"
 #include "trace.h"
-#include "hw/pci/pci.h"
+#include "hw/pci/pci_device.h"
 #include "hw/qdev-properties.h"
 #include "migration/vmstate.h"
 #include "qom/object.h"
diff --git a/hw/i386/xen/xen_pvdevice.c b/hw/i386/xen/xen_pvdevice.c
index 1ea95fa601..e62e06622b 100644
--- a/hw/i386/xen/xen_pvdevice.c
+++ b/hw/i386/xen/xen_pvdevice.c
@@ -32,7 +32,7 @@
 #include "qemu/osdep.h"
 #include "qapi/error.h"
 #include "qemu/module.h"
-#include "hw/pci/pci.h"
+#include "hw/pci/pci_device.h"
 #include "hw/qdev-properties.h"
 #include "migration/vmstate.h"
 #include "trace.h"
diff --git a/hw/ipack/tpci200.c b/hw/ipack/tpci200.c
index 1f764fc85b..6b3edbf017 100644
--- a/hw/ipack/tpci200.c
+++ b/hw/ipack/tpci200.c
@@ -12,7 +12,7 @@
 #include "qemu/units.h"
 #include "hw/ipack/ipack.h"
 #include "hw/irq.h"
-#include "hw/pci/pci.h"
+#include "hw/pci/pci_device.h"
 #include "migration/vmstate.h"
 #include "qemu/bitops.h"
 #include "qemu/module.h"
diff --git a/hw/ipmi/pci_ipmi_bt.c b/hw/ipmi/pci_ipmi_bt.c
index b6e52730d3..633931b825 100644
--- a/hw/ipmi/pci_ipmi_bt.c
+++ b/hw/ipmi/pci_ipmi_bt.c
@@ -25,7 +25,7 @@
 #include "migration/vmstate.h"
 #include "qapi/error.h"
 #include "hw/ipmi/ipmi_bt.h"
-#include "hw/pci/pci.h"
+#include "hw/pci/pci_device.h"
 #include "qom/object.h"
 
 #define TYPE_PCI_IPMI_BT "pci-ipmi-bt"
diff --git a/hw/ipmi/pci_ipmi_kcs.c b/hw/ipmi/pci_ipmi_kcs.c
index de13418862..1a581413c2 100644
--- a/hw/ipmi/pci_ipmi_kcs.c
+++ b/hw/ipmi/pci_ipmi_kcs.c
@@ -25,7 +25,7 @@
 #include "migration/vmstate.h"
 #include "qapi/error.h"
 #include "hw/ipmi/ipmi_kcs.h"
-#include "hw/pci/pci.h"
+#include "hw/pci/pci_device.h"
 #include "qom/object.h"
 
 #define TYPE_PCI_IPMI_KCS "pci-ipmi-kcs"
diff --git a/hw/isa/i82378.c b/hw/isa/i82378.c
index 2a2ff05b93..e3322e03bf 100644
--- a/hw/isa/i82378.c
+++ b/hw/isa/i82378.c
@@ -18,7 +18,7 @@
  */
 
 #include "qemu/osdep.h"
-#include "hw/pci/pci.h"
+#include "hw/pci/pci_device.h"
 #include "hw/irq.h"
 #include "hw/intc/i8259.h"
 #include "hw/timer/i8254.h"
diff --git a/hw/mips/gt64xxx_pci.c b/hw/mips/gt64xxx_pci.c
index 19d0d9889f..164866cf3e 100644
--- a/hw/mips/gt64xxx_pci.c
+++ b/hw/mips/gt64xxx_pci.c
@@ -26,7 +26,7 @@
 #include "qapi/error.h"
 #include "qemu/units.h"
 #include "qemu/log.h"
-#include "hw/pci/pci.h"
+#include "hw/pci/pci_device.h"
 #include "hw/pci/pci_host.h"
 #include "migration/vmstate.h"
 #include "hw/intc/i8259.h"
diff --git a/hw/misc/pci-testdev.c b/hw/misc/pci-testdev.c
index 03845c8de3..49303134e4 100644
--- a/hw/misc/pci-testdev.c
+++ b/hw/misc/pci-testdev.c
@@ -19,7 +19,7 @@
  */
 
 #include "qemu/osdep.h"
-#include "hw/pci/pci.h"
+#include "hw/pci/pci_device.h"
 #include "hw/qdev-properties.h"
 #include "qemu/event_notifier.h"
 #include "qemu/module.h"
diff --git a/hw/misc/pvpanic-pci.c b/hw/misc/pvpanic-pci.c
index 99cf7e2041..fbcaa50731 100644
--- a/hw/misc/pvpanic-pci.c
+++ b/hw/misc/pvpanic-pci.c
@@ -20,7 +20,7 @@
 #include "migration/vmstate.h"
 #include "hw/misc/pvpanic.h"
 #include "qom/object.h"
-#include "hw/pci/pci.h"
+#include "hw/pci/pci_device.h"
 #include "standard-headers/linux/pvpanic.h"
 
 OBJECT_DECLARE_SIMPLE_TYPE(PVPanicPCIState, PVPANIC_PCI_DEVICE)
diff --git a/hw/net/can/can_kvaser_pci.c b/hw/net/can/can_kvaser_pci.c
index 94b3a534f8..2cd90cef1e 100644
--- a/hw/net/can/can_kvaser_pci.c
+++ b/hw/net/can/can_kvaser_pci.c
@@ -37,7 +37,7 @@
 #include "qapi/error.h"
 #include "chardev/char.h"
 #include "hw/irq.h"
-#include "hw/pci/pci.h"
+#include "hw/pci/pci_device.h"
 #include "hw/qdev-properties.h"
 #include "migration/vmstate.h"
 #include "net/can_emu.h"
diff --git a/hw/net/can/can_mioe3680_pci.c b/hw/net/can/can_mioe3680_pci.c
index 29dc696f7c..b9918773b3 100644
--- a/hw/net/can/can_mioe3680_pci.c
+++ b/hw/net/can/can_mioe3680_pci.c
@@ -33,7 +33,7 @@
 #include "qapi/error.h"
 #include "chardev/char.h"
 #include "hw/irq.h"
-#include "hw/pci/pci.h"
+#include "hw/pci/pci_device.h"
 #include "hw/qdev-properties.h"
 #include "migration/vmstate.h"
 #include "net/can_emu.h"
diff --git a/hw/net/can/can_pcm3680_pci.c b/hw/net/can/can_pcm3680_pci.c
index e8e57f4f33..8ef3e4659c 100644
--- a/hw/net/can/can_pcm3680_pci.c
+++ b/hw/net/can/can_pcm3680_pci.c
@@ -33,7 +33,7 @@
 #include "qapi/error.h"
 #include "chardev/char.h"
 #include "hw/irq.h"
-#include "hw/pci/pci.h"
+#include "hw/pci/pci_device.h"
 #include "hw/qdev-properties.h"
 #include "migration/vmstate.h"
 #include "net/can_emu.h"
diff --git a/hw/net/can/ctucan_pci.c b/hw/net/can/ctucan_pci.c
index 50f4ea6cd6..ea079e2af5 100644
--- a/hw/net/can/ctucan_pci.c
+++ b/hw/net/can/ctucan_pci.c
@@ -34,7 +34,7 @@
 #include "qapi/error.h"
 #include "chardev/char.h"
 #include "hw/irq.h"
-#include "hw/pci/pci.h"
+#include "hw/pci/pci_device.h"
 #include "hw/qdev-properties.h"
 #include "migration/vmstate.h"
 #include "net/can_emu.h"
diff --git a/hw/net/e1000.c b/hw/net/e1000.c
index e26e0a64c1..7efb8a4c52 100644
--- a/hw/net/e1000.c
+++ b/hw/net/e1000.c
@@ -26,7 +26,7 @@
 
 
 #include "qemu/osdep.h"
-#include "hw/pci/pci.h"
+#include "hw/pci/pci_device.h"
 #include "hw/qdev-properties.h"
 #include "migration/vmstate.h"
 #include "net/eth.h"
diff --git a/hw/net/e1000x_common.c b/hw/net/e1000x_common.c
index a8d93870b5..2f43e8cd13 100644
--- a/hw/net/e1000x_common.c
+++ b/hw/net/e1000x_common.c
@@ -24,7 +24,7 @@
 
 #include "qemu/osdep.h"
 #include "qemu/units.h"
-#include "hw/pci/pci.h"
+#include "hw/pci/pci_device.h"
 #include "net/net.h"
 
 #include "e1000x_common.h"
diff --git a/hw/net/eepro100.c b/hw/net/eepro100.c
index 679f52f80f..dc07984ae9 100644
--- a/hw/net/eepro100.c
+++ b/hw/net/eepro100.c
@@ -42,7 +42,7 @@
 
 #include "qemu/osdep.h"
 #include "qemu/units.h"
-#include "hw/pci/pci.h"
+#include "hw/pci/pci_device.h"
 #include "hw/qdev-properties.h"
 #include "migration/vmstate.h"
 #include "net/net.h"
diff --git a/hw/net/ne2000-pci.c b/hw/net/ne2000-pci.c
index 9e5d10859a..edc6689d33 100644
--- a/hw/net/ne2000-pci.c
+++ b/hw/net/ne2000-pci.c
@@ -24,7 +24,7 @@
 
 #include "qemu/osdep.h"
 #include "hw/irq.h"
-#include "hw/pci/pci.h"
+#include "hw/pci/pci_device.h"
 #include "hw/qdev-properties.h"
 #include "migration/vmstate.h"
 #include "ne2000.h"
diff --git a/hw/net/net_tx_pkt.c b/hw/net/net_tx_pkt.c
index 1cb1125d9f..2533ea2700 100644
--- a/hw/net/net_tx_pkt.c
+++ b/hw/net/net_tx_pkt.c
@@ -21,7 +21,7 @@
 #include "net/checksum.h"
 #include "net/tap.h"
 #include "net/net.h"
-#include "hw/pci/pci.h"
+#include "hw/pci/pci_device.h"
 
 enum {
     NET_TX_PKT_VHDR_FRAG = 0,
diff --git a/hw/net/pcnet-pci.c b/hw/net/pcnet-pci.c
index 95d27102aa..96a302c141 100644
--- a/hw/net/pcnet-pci.c
+++ b/hw/net/pcnet-pci.c
@@ -29,7 +29,7 @@
 
 #include "qemu/osdep.h"
 #include "hw/irq.h"
-#include "hw/pci/pci.h"
+#include "hw/pci/pci_device.h"
 #include "hw/qdev-properties.h"
 #include "migration/vmstate.h"
 #include "net/net.h"
diff --git a/hw/net/rocker/rocker.c b/hw/net/rocker/rocker.c
index 281d43e6cf..cf54ddf49d 100644
--- a/hw/net/rocker/rocker.c
+++ b/hw/net/rocker/rocker.c
@@ -16,7 +16,7 @@
  */
 
 #include "qemu/osdep.h"
-#include "hw/pci/pci.h"
+#include "hw/pci/pci_device.h"
 #include "hw/qdev-properties.h"
 #include "hw/qdev-properties-system.h"
 #include "migration/vmstate.h"
diff --git a/hw/net/rocker/rocker_desc.c b/hw/net/rocker/rocker_desc.c
index 01845f1157..f3068c9250 100644
--- a/hw/net/rocker/rocker_desc.c
+++ b/hw/net/rocker/rocker_desc.c
@@ -16,7 +16,7 @@
 
 #include "qemu/osdep.h"
 #include "net/net.h"
-#include "hw/pci/pci.h"
+#include "hw/pci/pci_device.h"
 
 #include "rocker.h"
 #include "rocker_hw.h"
diff --git a/hw/net/rtl8139.c b/hw/net/rtl8139.c
index 700b1b66b6..5a5aaf868d 100644
--- a/hw/net/rtl8139.c
+++ b/hw/net/rtl8139.c
@@ -53,7 +53,7 @@
 #include "qemu/osdep.h"
 #include <zlib.h>
 
-#include "hw/pci/pci.h"
+#include "hw/pci/pci_device.h"
 #include "hw/qdev-properties.h"
 #include "migration/vmstate.h"
 #include "sysemu/dma.h"
diff --git a/hw/net/sungem.c b/hw/net/sungem.c
index 3684a4d733..eb01520790 100644
--- a/hw/net/sungem.c
+++ b/hw/net/sungem.c
@@ -8,7 +8,7 @@
  */
 
 #include "qemu/osdep.h"
-#include "hw/pci/pci.h"
+#include "hw/pci/pci_device.h"
 #include "hw/qdev-properties.h"
 #include "migration/vmstate.h"
 #include "qemu/log.h"
diff --git a/hw/net/sunhme.c b/hw/net/sunhme.c
index fc34905f87..1f3d8011ae 100644
--- a/hw/net/sunhme.c
+++ b/hw/net/sunhme.c
@@ -23,7 +23,7 @@
  */
 
 #include "qemu/osdep.h"
-#include "hw/pci/pci.h"
+#include "hw/pci/pci_device.h"
 #include "hw/qdev-properties.h"
 #include "migration/vmstate.h"
 #include "hw/net/mii.h"
diff --git a/hw/net/tulip.c b/hw/net/tulip.c
index c2b3b1bdfa..915e5fb595 100644
--- a/hw/net/tulip.c
+++ b/hw/net/tulip.c
@@ -9,7 +9,7 @@
 #include "qemu/osdep.h"
 #include "qemu/log.h"
 #include "hw/irq.h"
-#include "hw/pci/pci.h"
+#include "hw/pci/pci_device.h"
 #include "hw/qdev-properties.h"
 #include "hw/nvram/eeprom93xx.h"
 #include "migration/vmstate.h"
diff --git a/hw/net/virtio-net.c b/hw/net/virtio-net.c
index aba12759d5..ee0af784f9 100644
--- a/hw/net/virtio-net.c
+++ b/hw/net/virtio-net.c
@@ -42,7 +42,7 @@
 #include "sysemu/sysemu.h"
 #include "trace.h"
 #include "monitor/qdev.h"
-#include "hw/pci/pci.h"
+#include "hw/pci/pci_device.h"
 #include "net_rx_pkt.h"
 #include "hw/virtio/vhost.h"
 #include "sysemu/qtest.h"
diff --git a/hw/pci-host/bonito.c b/hw/pci-host/bonito.c
index a57e81e3a9..f04f3ad668 100644
--- a/hw/pci-host/bonito.c
+++ b/hw/pci-host/bonito.c
@@ -42,7 +42,7 @@
 #include "qemu/units.h"
 #include "qapi/error.h"
 #include "qemu/error-report.h"
-#include "hw/pci/pci.h"
+#include "hw/pci/pci_device.h"
 #include "hw/irq.h"
 #include "hw/mips/mips.h"
 #include "hw/pci/pci_host.h"
diff --git a/hw/pci-host/dino.c b/hw/pci-host/dino.c
index f257c24e64..e8eaebca54 100644
--- a/hw/pci-host/dino.c
+++ b/hw/pci-host/dino.c
@@ -15,7 +15,7 @@
 #include "qemu/units.h"
 #include "qapi/error.h"
 #include "hw/irq.h"
-#include "hw/pci/pci.h"
+#include "hw/pci/pci_device.h"
 #include "hw/pci/pci_bus.h"
 #include "hw/qdev-properties.h"
 #include "hw/pci-host/dino.h"
diff --git a/hw/pci-host/grackle.c b/hw/pci-host/grackle.c
index 95945ac0f4..8cf318cb80 100644
--- a/hw/pci-host/grackle.c
+++ b/hw/pci-host/grackle.c
@@ -25,7 +25,7 @@
 
 #include "qemu/osdep.h"
 #include "hw/qdev-properties.h"
-#include "hw/pci/pci.h"
+#include "hw/pci/pci_device.h"
 #include "hw/irq.h"
 #include "qapi/error.h"
 #include "qemu/module.h"
diff --git a/hw/pci-host/mv64361.c b/hw/pci-host/mv64361.c
index cc9c4d6d3b..015b92bd5f 100644
--- a/hw/pci-host/mv64361.c
+++ b/hw/pci-host/mv64361.c
@@ -13,7 +13,7 @@
 #include "qapi/error.h"
 #include "hw/hw.h"
 #include "hw/sysbus.h"
-#include "hw/pci/pci.h"
+#include "hw/pci/pci_device.h"
 #include "hw/pci/pci_host.h"
 #include "hw/irq.h"
 #include "hw/intc/i8259.h"
diff --git a/hw/pci-host/ppce500.c b/hw/pci-host/ppce500.c
index 89c1b53dd7..568849e930 100644
--- a/hw/pci-host/ppce500.c
+++ b/hw/pci-host/ppce500.c
@@ -19,7 +19,7 @@
 #include "hw/ppc/e500-ccsr.h"
 #include "hw/qdev-properties.h"
 #include "migration/vmstate.h"
-#include "hw/pci/pci.h"
+#include "hw/pci/pci_device.h"
 #include "hw/pci/pci_host.h"
 #include "qemu/bswap.h"
 #include "qemu/module.h"
diff --git a/hw/pci-host/raven.c b/hw/pci-host/raven.c
index 7a105e4a63..2c96ddf8fe 100644
--- a/hw/pci-host/raven.c
+++ b/hw/pci-host/raven.c
@@ -28,7 +28,7 @@
 #include "qemu/units.h"
 #include "qemu/log.h"
 #include "qapi/error.h"
-#include "hw/pci/pci.h"
+#include "hw/pci/pci_device.h"
 #include "hw/pci/pci_bus.h"
 #include "hw/pci/pci_host.h"
 #include "hw/qdev-properties.h"
diff --git a/hw/pci-host/sh_pci.c b/hw/pci-host/sh_pci.c
index 719d6ca2a6..77e7bbc65f 100644
--- a/hw/pci-host/sh_pci.c
+++ b/hw/pci-host/sh_pci.c
@@ -26,7 +26,7 @@
 #include "hw/sysbus.h"
 #include "hw/sh4/sh.h"
 #include "hw/irq.h"
-#include "hw/pci/pci.h"
+#include "hw/pci/pci_device.h"
 #include "hw/pci/pci_host.h"
 #include "qemu/bswap.h"
 #include "qemu/module.h"
diff --git a/hw/pci-host/uninorth.c b/hw/pci-host/uninorth.c
index aebd44d265..8f7a300a32 100644
--- a/hw/pci-host/uninorth.c
+++ b/hw/pci-host/uninorth.c
@@ -26,7 +26,7 @@
 #include "hw/irq.h"
 #include "hw/qdev-properties.h"
 #include "qemu/module.h"
-#include "hw/pci/pci.h"
+#include "hw/pci/pci_device.h"
 #include "hw/pci/pci_host.h"
 #include "hw/pci-host/uninorth.h"
 #include "trace.h"
diff --git a/hw/pci-host/versatile.c b/hw/pci-host/versatile.c
index f66384fa02..0d50ea4cc0 100644
--- a/hw/pci-host/versatile.c
+++ b/hw/pci-host/versatile.c
@@ -12,7 +12,7 @@
 #include "hw/sysbus.h"
 #include "migration/vmstate.h"
 #include "hw/irq.h"
-#include "hw/pci/pci.h"
+#include "hw/pci/pci_device.h"
 #include "hw/pci/pci_bus.h"
 #include "hw/pci/pci_host.h"
 #include "hw/qdev-properties.h"
diff --git a/hw/pci/pcie_host.c b/hw/pci/pcie_host.c
index 5abbe83220..3717e1a086 100644
--- a/hw/pci/pcie_host.c
+++ b/hw/pci/pcie_host.c
@@ -20,7 +20,7 @@
  */
 
 #include "qemu/osdep.h"
-#include "hw/pci/pci.h"
+#include "hw/pci/pci_device.h"
 #include "hw/pci/pcie_host.h"
 #include "qemu/module.h"
 
diff --git a/hw/pci/pcie_sriov.c b/hw/pci/pcie_sriov.c
index 8e3faf1f59..f0bd72e069 100644
--- a/hw/pci/pcie_sriov.c
+++ b/hw/pci/pcie_sriov.c
@@ -11,7 +11,7 @@
  */
 
 #include "qemu/osdep.h"
-#include "hw/pci/pci.h"
+#include "hw/pci/pci_device.h"
 #include "hw/pci/pcie.h"
 #include "hw/pci/pci_bus.h"
 #include "hw/qdev-properties.h"
diff --git a/hw/pci/slotid_cap.c b/hw/pci/slotid_cap.c
index 36d021b4a6..8372d05d9e 100644
--- a/hw/pci/slotid_cap.c
+++ b/hw/pci/slotid_cap.c
@@ -1,6 +1,6 @@
 #include "qemu/osdep.h"
 #include "hw/pci/slotid_cap.h"
-#include "hw/pci/pci.h"
+#include "hw/pci/pci_device.h"
 #include "qemu/error-report.h"
 #include "qapi/error.h"
 
diff --git a/hw/ppc/ppc440_pcix.c b/hw/ppc/ppc440_pcix.c
index 788d25514a..f10f93c533 100644
--- a/hw/ppc/ppc440_pcix.c
+++ b/hw/ppc/ppc440_pcix.c
@@ -26,7 +26,7 @@
 #include "hw/irq.h"
 #include "hw/ppc/ppc.h"
 #include "hw/ppc/ppc4xx.h"
-#include "hw/pci/pci.h"
+#include "hw/pci/pci_device.h"
 #include "hw/pci/pci_host.h"
 #include "trace.h"
 #include "qom/object.h"
diff --git a/hw/ppc/ppc4xx_pci.c b/hw/ppc/ppc4xx_pci.c
index 8642b96455..1d4a50fa7c 100644
--- a/hw/ppc/ppc4xx_pci.c
+++ b/hw/ppc/ppc4xx_pci.c
@@ -29,7 +29,7 @@
 #include "migration/vmstate.h"
 #include "qemu/module.h"
 #include "sysemu/reset.h"
-#include "hw/pci/pci.h"
+#include "hw/pci/pci_device.h"
 #include "hw/pci/pci_host.h"
 #include "trace.h"
 #include "qom/object.h"
diff --git a/hw/ppc/spapr_pci_vfio.c b/hw/ppc/spapr_pci_vfio.c
index 2a76b4e0b5..d8aeee0b7e 100644
--- a/hw/ppc/spapr_pci_vfio.c
+++ b/hw/ppc/spapr_pci_vfio.c
@@ -22,6 +22,7 @@
 #include "hw/ppc/spapr.h"
 #include "hw/pci-host/spapr.h"
 #include "hw/pci/msix.h"
+#include "hw/pci/pci_device.h"
 #include "hw/vfio/vfio.h"
 #include "qemu/error-report.h"
 
diff --git a/hw/rdma/rdma_utils.c b/hw/rdma/rdma_utils.c
index 77008552f4..c948baf052 100644
--- a/hw/rdma/rdma_utils.c
+++ b/hw/rdma/rdma_utils.c
@@ -14,7 +14,7 @@
  */
 
 #include "qemu/osdep.h"
-#include "hw/pci/pci.h"
+#include "hw/pci/pci_device.h"
 #include "trace.h"
 #include "rdma_utils.h"
 
diff --git a/hw/s390x/s390-pci-inst.c b/hw/s390x/s390-pci-inst.c
index 7cc4bcf850..f81e6810b2 100644
--- a/hw/s390x/s390-pci-inst.c
+++ b/hw/s390x/s390-pci-inst.c
@@ -16,6 +16,7 @@
 #include "exec/memory-internal.h"
 #include "qemu/error-report.h"
 #include "sysemu/hw_accel.h"
+#include "hw/pci/pci_device.h"
 #include "hw/s390x/s390-pci-inst.h"
 #include "hw/s390x/s390-pci-bus.h"
 #include "hw/s390x/s390-pci-kvm.h"
diff --git a/hw/scsi/esp-pci.c b/hw/scsi/esp-pci.c
index 1792f84cea..2f7f11e70b 100644
--- a/hw/scsi/esp-pci.c
+++ b/hw/scsi/esp-pci.c
@@ -24,7 +24,7 @@
  */
 
 #include "qemu/osdep.h"
-#include "hw/pci/pci.h"
+#include "hw/pci/pci_device.h"
 #include "hw/irq.h"
 #include "hw/nvram/eeprom93xx.h"
 #include "hw/scsi/esp.h"
diff --git a/hw/scsi/lsi53c895a.c b/hw/scsi/lsi53c895a.c
index 50979640c3..af93557a9a 100644
--- a/hw/scsi/lsi53c895a.c
+++ b/hw/scsi/lsi53c895a.c
@@ -16,7 +16,7 @@
 #include "qemu/osdep.h"
 
 #include "hw/irq.h"
-#include "hw/pci/pci.h"
+#include "hw/pci/pci_device.h"
 #include "hw/scsi/scsi.h"
 #include "migration/vmstate.h"
 #include "sysemu/dma.h"
diff --git a/hw/smbios/smbios.c b/hw/smbios/smbios.c
index b4243de735..4869566cf5 100644
--- a/hw/smbios/smbios.c
+++ b/hw/smbios/smbios.c
@@ -28,6 +28,7 @@
 #include "hw/loader.h"
 #include "hw/boards.h"
 #include "hw/pci/pci_bus.h"
+#include "hw/pci/pci_device.h"
 #include "smbios_build.h"
 
 /* legacy structures and constants for <= 2.0 machines */
diff --git a/hw/usb/hcd-ohci-pci.c b/hw/usb/hcd-ohci-pci.c
index 8e1146b862..6b630d35a7 100644
--- a/hw/usb/hcd-ohci-pci.c
+++ b/hw/usb/hcd-ohci-pci.c
@@ -23,7 +23,7 @@
 #include "qemu/timer.h"
 #include "hw/usb.h"
 #include "migration/vmstate.h"
-#include "hw/pci/pci.h"
+#include "hw/pci/pci_device.h"
 #include "hw/sysbus.h"
 #include "hw/qdev-dma.h"
 #include "hw/qdev-properties.h"
diff --git a/hw/watchdog/wdt_i6300esb.c b/hw/watchdog/wdt_i6300esb.c
index 5693ec6a09..54c167cd35 100644
--- a/hw/watchdog/wdt_i6300esb.c
+++ b/hw/watchdog/wdt_i6300esb.c
@@ -24,7 +24,7 @@
 #include "qemu/module.h"
 #include "qemu/timer.h"
 #include "sysemu/watchdog.h"
-#include "hw/pci/pci.h"
+#include "hw/pci/pci_device.h"
 #include "migration/vmstate.h"
 #include "qom/object.h"
 
diff --git a/ui/util.c b/ui/util.c
index 7e8fc1ea53..f5a2499110 100644
--- a/ui/util.c
+++ b/ui/util.c
@@ -17,7 +17,7 @@
 
 #include "qemu/osdep.h"
 
-#include "hw/pci/pci.h"
+#include "hw/pci/pci_device.h"
 #include "hw/pci/pci_bus.h"
 #include "qapi/error.h"
 #include "ui/console.h"
-- 
2.37.3



^ permalink raw reply related	[flat|nested] 23+ messages in thread

* [PATCH 5/5] include/hw/pci: Include hw/pci/pci.h where needed
  2022-12-09 13:47 [PATCH 0/5] include/hw/pci include/hw/cxl: Clean up includes Markus Armbruster
                   ` (3 preceding siblings ...)
  2022-12-09 13:48 ` [PATCH 4/5] include/hw/pci: Split pci_device.h off pci.h Markus Armbruster
@ 2022-12-09 13:48 ` Markus Armbruster
  2022-12-09 14:17   ` Philippe Mathieu-Daudé
  2022-12-09 15:11 ` [PATCH 6/5] include/hw/cxl: Break inclusion loop Markus Armbruster
  2022-12-21 11:34 ` [PATCH 0/5] include/hw/pci include/hw/cxl: Clean up includes Michael S. Tsirkin
  6 siblings, 1 reply; 23+ messages in thread
From: Markus Armbruster @ 2022-12-09 13:48 UTC (permalink / raw)
  To: qemu-devel; +Cc: mst, marcel.apfelbaum, ben.widawsky, jonathan.cameron, philmd

hw/pci/pcie_sriov.h needs PCI_NUM_REGIONS.  Without the previous
commit, this would close an inclusion loop: hw/pci/pci.h used to
include hw/pci/pcie.h for PCIExpressDevice, which includes
pcie_sriov.h for PCIESriovPF, which now includes hw/pci/pci.h for
PCI_NUM_REGIONS.

Signed-off-by: Markus Armbruster <armbru@redhat.com>
---
 include/hw/pci/pcie_sriov.h | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/include/hw/pci/pcie_sriov.h b/include/hw/pci/pcie_sriov.h
index 80f5c84e75..96cc743309 100644
--- a/include/hw/pci/pcie_sriov.h
+++ b/include/hw/pci/pcie_sriov.h
@@ -13,6 +13,8 @@
 #ifndef QEMU_PCIE_SRIOV_H
 #define QEMU_PCIE_SRIOV_H
 
+#include "hw/pci/pci.h"
+
 struct PCIESriovPF {
     uint16_t num_vfs;   /* Number of virtual functions created */
     uint8_t vf_bar_type[PCI_NUM_REGIONS];   /* Store type for each VF bar */
-- 
2.37.3



^ permalink raw reply related	[flat|nested] 23+ messages in thread

* Re: [PATCH 3/5] include/hw/pci: Clean up a few things checkpatch.pl would flag
  2022-12-09 13:48 ` [PATCH 3/5] include/hw/pci: Clean up a few things checkpatch.pl would flag Markus Armbruster
@ 2022-12-09 14:15   ` Philippe Mathieu-Daudé
  0 siblings, 0 replies; 23+ messages in thread
From: Philippe Mathieu-Daudé @ 2022-12-09 14:15 UTC (permalink / raw)
  To: Markus Armbruster, qemu-devel
  Cc: mst, marcel.apfelbaum, ben.widawsky, jonathan.cameron

On 9/12/22 14:48, Markus Armbruster wrote:
> Fix a few style violations so that checkpatch.pl won't complain when I
> move this code.
> 
> Signed-off-by: Markus Armbruster <armbru@redhat.com>
> ---
>   include/hw/pci/pci.h | 17 ++++++++++-------
>   1 file changed, 10 insertions(+), 7 deletions(-)

Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>



^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: [PATCH 5/5] include/hw/pci: Include hw/pci/pci.h where needed
  2022-12-09 13:48 ` [PATCH 5/5] include/hw/pci: Include hw/pci/pci.h where needed Markus Armbruster
@ 2022-12-09 14:17   ` Philippe Mathieu-Daudé
  0 siblings, 0 replies; 23+ messages in thread
From: Philippe Mathieu-Daudé @ 2022-12-09 14:17 UTC (permalink / raw)
  To: Markus Armbruster, qemu-devel
  Cc: mst, marcel.apfelbaum, ben.widawsky, jonathan.cameron

On 9/12/22 14:48, Markus Armbruster wrote:
> hw/pci/pcie_sriov.h needs PCI_NUM_REGIONS.  Without the previous
> commit, this would close an inclusion loop: hw/pci/pci.h used to
> include hw/pci/pcie.h for PCIExpressDevice, which includes
> pcie_sriov.h for PCIESriovPF, which now includes hw/pci/pci.h for
> PCI_NUM_REGIONS.
> 
> Signed-off-by: Markus Armbruster <armbru@redhat.com>
> ---
>   include/hw/pci/pcie_sriov.h | 2 ++
>   1 file changed, 2 insertions(+)

Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>



^ permalink raw reply	[flat|nested] 23+ messages in thread

* [PATCH 6/5] include/hw/cxl: Break inclusion loop
  2022-12-09 13:47 [PATCH 0/5] include/hw/pci include/hw/cxl: Clean up includes Markus Armbruster
                   ` (4 preceding siblings ...)
  2022-12-09 13:48 ` [PATCH 5/5] include/hw/pci: Include hw/pci/pci.h where needed Markus Armbruster
@ 2022-12-09 15:11 ` Markus Armbruster
  2022-12-10  7:09   ` Markus Armbruster
  2022-12-21 11:34 ` [PATCH 0/5] include/hw/pci include/hw/cxl: Clean up includes Michael S. Tsirkin
  6 siblings, 1 reply; 23+ messages in thread
From: Markus Armbruster @ 2022-12-09 15:11 UTC (permalink / raw)
  To: qemu-devel; +Cc: mst, marcel.apfelbaum, ben.widawsky, jonathan.cameron, philmd

hw/cxl/cxl_pci.h and hw/cxl/cxl_cdat.h include each other.  Neither
header actually needs the other one.  Drop both #include directives.

Signed-off-by: Markus Armbruster <armbru@redhat.com>
---
 include/hw/cxl/cxl_cdat.h | 1 -
 include/hw/cxl/cxl_pci.h  | 1 -
 2 files changed, 2 deletions(-)

diff --git a/include/hw/cxl/cxl_cdat.h b/include/hw/cxl/cxl_cdat.h
index 7f67638685..e3fd737f9d 100644
--- a/include/hw/cxl/cxl_cdat.h
+++ b/include/hw/cxl/cxl_cdat.h
@@ -10,7 +10,6 @@
 #ifndef CXL_CDAT_H
 #define CXL_CDAT_H
 
-#include "hw/cxl/cxl_pci.h"
 #include "hw/pci/pcie_doe.h"
 
 /*
diff --git a/include/hw/cxl/cxl_pci.h b/include/hw/cxl/cxl_pci.h
index aca14845ab..01e15ed5b4 100644
--- a/include/hw/cxl/cxl_pci.h
+++ b/include/hw/cxl/cxl_pci.h
@@ -11,7 +11,6 @@
 #define CXL_PCI_H
 
 #include "qemu/compiler.h"
-#include "hw/cxl/cxl_cdat.h"
 
 #define CXL_VENDOR_ID 0x1e98
 
-- 
2.37.3



^ permalink raw reply related	[flat|nested] 23+ messages in thread

* Re: [PATCH 1/5] include/hw/pci: Clean up superfluous inclusion of pci*/*.h cxl/*.h
  2022-12-09 13:47 ` [PATCH 1/5] include/hw/pci: Clean up superfluous inclusion of pci*/*.h cxl/*.h Markus Armbruster
@ 2022-12-09 17:03   ` Michael S. Tsirkin
  2022-12-10  7:25     ` Markus Armbruster
  2022-12-12 10:41   ` Jonathan Cameron via
  1 sibling, 1 reply; 23+ messages in thread
From: Michael S. Tsirkin @ 2022-12-09 17:03 UTC (permalink / raw)
  To: Markus Armbruster
  Cc: qemu-devel, marcel.apfelbaum, ben.widawsky, jonathan.cameron, philmd

On Fri, Dec 09, 2022 at 02:47:58PM +0100, Markus Armbruster wrote:
> Signed-off-by: Markus Armbruster <armbru@redhat.com>

Thanks!
How can I verify this is correct, i.e. that none
of the headers that we remove is actually needed?


> ---
>  hw/alpha/alpha_sys.h              | 1 -
>  hw/rdma/rdma_utils.h              | 1 -
>  hw/rdma/vmw/pvrdma.h              | 1 -
>  hw/usb/hcd-ehci.h                 | 1 -
>  hw/xen/xen_pt.h                   | 1 -
>  include/hw/cxl/cxl.h              | 1 -
>  include/hw/cxl/cxl_cdat.h         | 1 +
>  include/hw/cxl/cxl_device.h       | 1 +
>  include/hw/cxl/cxl_pci.h          | 2 --
>  include/hw/i386/ich9.h            | 4 ----
>  include/hw/i386/x86-iommu.h       | 1 -
>  include/hw/isa/vt82c686.h         | 1 -
>  include/hw/pci-host/designware.h  | 3 ---
>  include/hw/pci-host/i440fx.h      | 2 +-
>  include/hw/pci-host/ls7a.h        | 2 --
>  include/hw/pci-host/pnv_phb3.h    | 2 --
>  include/hw/pci-host/pnv_phb4.h    | 3 +--
>  include/hw/pci-host/xilinx-pcie.h | 1 -
>  include/hw/pci/pcie.h             | 1 -
>  include/hw/virtio/virtio-scsi.h   | 1 -
>  hw/alpha/pci.c                    | 1 +
>  hw/alpha/typhoon.c                | 2 +-
>  hw/i386/acpi-build.c              | 2 +-
>  hw/pci-bridge/i82801b11.c         | 2 +-
>  hw/rdma/rdma_utils.c              | 1 +
>  hw/scsi/virtio-scsi.c             | 1 +
>  26 files changed, 10 insertions(+), 30 deletions(-)
> 
> diff --git a/hw/alpha/alpha_sys.h b/hw/alpha/alpha_sys.h
> index 2263e821da..a303c58438 100644
> --- a/hw/alpha/alpha_sys.h
> +++ b/hw/alpha/alpha_sys.h
> @@ -5,7 +5,6 @@
>  
>  #include "target/alpha/cpu-qom.h"
>  #include "hw/pci/pci.h"
> -#include "hw/pci/pci_host.h"
>  #include "hw/boards.h"
>  #include "hw/intc/i8259.h"
>  
> diff --git a/hw/rdma/rdma_utils.h b/hw/rdma/rdma_utils.h
> index 0c6414e7e0..54e4f56edd 100644
> --- a/hw/rdma/rdma_utils.h
> +++ b/hw/rdma/rdma_utils.h
> @@ -18,7 +18,6 @@
>  #define RDMA_UTILS_H
>  
>  #include "qemu/error-report.h"
> -#include "hw/pci/pci.h"
>  #include "sysemu/dma.h"
>  
>  #define rdma_error_report(fmt, ...) \
> diff --git a/hw/rdma/vmw/pvrdma.h b/hw/rdma/vmw/pvrdma.h
> index d08965d3e2..0caf95ede8 100644
> --- a/hw/rdma/vmw/pvrdma.h
> +++ b/hw/rdma/vmw/pvrdma.h
> @@ -18,7 +18,6 @@
>  
>  #include "qemu/units.h"
>  #include "qemu/notify.h"
> -#include "hw/pci/pci.h"
>  #include "hw/pci/msix.h"
>  #include "chardev/char-fe.h"
>  #include "hw/net/vmxnet3_defs.h"
> diff --git a/hw/usb/hcd-ehci.h b/hw/usb/hcd-ehci.h
> index a173707d9b..4d4b2830b7 100644
> --- a/hw/usb/hcd-ehci.h
> +++ b/hw/usb/hcd-ehci.h
> @@ -23,7 +23,6 @@
>  #include "sysemu/dma.h"
>  #include "hw/pci/pci.h"
>  #include "hw/sysbus.h"
> -#include "qom/object.h"
>  
>  #ifndef EHCI_DEBUG
>  #define EHCI_DEBUG   0
> diff --git a/hw/xen/xen_pt.h b/hw/xen/xen_pt.h
> index e7c4316a7d..cf10fc7bbf 100644
> --- a/hw/xen/xen_pt.h
> +++ b/hw/xen/xen_pt.h
> @@ -2,7 +2,6 @@
>  #define XEN_PT_H
>  
>  #include "hw/xen/xen_common.h"
> -#include "hw/pci/pci.h"
>  #include "xen-host-pci-device.h"
>  #include "qom/object.h"
>  
> diff --git a/include/hw/cxl/cxl.h b/include/hw/cxl/cxl.h
> index 38e0e271d5..5129557bee 100644
> --- a/include/hw/cxl/cxl.h
> +++ b/include/hw/cxl/cxl.h
> @@ -13,7 +13,6 @@
>  
>  #include "qapi/qapi-types-machine.h"
>  #include "qapi/qapi-visit-machine.h"
> -#include "hw/pci/pci_bridge.h"
>  #include "hw/pci/pci_host.h"
>  #include "cxl_pci.h"
>  #include "cxl_component.h"
> diff --git a/include/hw/cxl/cxl_cdat.h b/include/hw/cxl/cxl_cdat.h
> index e9eda00142..7f67638685 100644
> --- a/include/hw/cxl/cxl_cdat.h
> +++ b/include/hw/cxl/cxl_cdat.h
> @@ -11,6 +11,7 @@
>  #define CXL_CDAT_H
>  
>  #include "hw/cxl/cxl_pci.h"
> +#include "hw/pci/pcie_doe.h"
>  
>  /*
>   * Reference:
> diff --git a/include/hw/cxl/cxl_device.h b/include/hw/cxl/cxl_device.h
> index 449b0edfe9..fd475b947b 100644
> --- a/include/hw/cxl/cxl_device.h
> +++ b/include/hw/cxl/cxl_device.h
> @@ -10,6 +10,7 @@
>  #ifndef CXL_DEVICE_H
>  #define CXL_DEVICE_H
>  
> +#include "hw/pci/pci.h"
>  #include "hw/register.h"
>  
>  /*
> diff --git a/include/hw/cxl/cxl_pci.h b/include/hw/cxl/cxl_pci.h
> index 3cb79eca1e..aca14845ab 100644
> --- a/include/hw/cxl/cxl_pci.h
> +++ b/include/hw/cxl/cxl_pci.h
> @@ -11,8 +11,6 @@
>  #define CXL_PCI_H
>  
>  #include "qemu/compiler.h"
> -#include "hw/pci/pci.h"
> -#include "hw/pci/pcie.h"
>  #include "hw/cxl/cxl_cdat.h"
>  
>  #define CXL_VENDOR_ID 0x1e98
> diff --git a/include/hw/i386/ich9.h b/include/hw/i386/ich9.h
> index 23ee8e371b..222781e8b9 100644
> --- a/include/hw/i386/ich9.h
> +++ b/include/hw/i386/ich9.h
> @@ -5,12 +5,8 @@
>  #include "hw/sysbus.h"
>  #include "hw/i386/pc.h"
>  #include "hw/isa/apm.h"
> -#include "hw/pci/pci.h"
> -#include "hw/pci/pcie_host.h"
> -#include "hw/pci/pci_bridge.h"
>  #include "hw/acpi/acpi.h"
>  #include "hw/acpi/ich9.h"
> -#include "hw/pci/pci_bus.h"
>  #include "qom/object.h"
>  
>  void ich9_lpc_set_irq(void *opaque, int irq_num, int level);
> diff --git a/include/hw/i386/x86-iommu.h b/include/hw/i386/x86-iommu.h
> index 7637edb430..8d8d53b18b 100644
> --- a/include/hw/i386/x86-iommu.h
> +++ b/include/hw/i386/x86-iommu.h
> @@ -21,7 +21,6 @@
>  #define HW_I386_X86_IOMMU_H
>  
>  #include "hw/sysbus.h"
> -#include "hw/pci/pci.h"
>  #include "hw/pci/msi.h"
>  #include "qom/object.h"
>  
> diff --git a/include/hw/isa/vt82c686.h b/include/hw/isa/vt82c686.h
> index eaa07881c5..e273cd38dc 100644
> --- a/include/hw/isa/vt82c686.h
> +++ b/include/hw/isa/vt82c686.h
> @@ -1,7 +1,6 @@
>  #ifndef HW_VT82C686_H
>  #define HW_VT82C686_H
>  
> -#include "hw/pci/pci.h"
>  
>  #define TYPE_VT82C686B_ISA "vt82c686b-isa"
>  #define TYPE_VT82C686B_USB_UHCI "vt82c686b-usb-uhci"
> diff --git a/include/hw/pci-host/designware.h b/include/hw/pci-host/designware.h
> index 6d9b51ae67..908f3d946b 100644
> --- a/include/hw/pci-host/designware.h
> +++ b/include/hw/pci-host/designware.h
> @@ -22,9 +22,6 @@
>  #define DESIGNWARE_H
>  
>  #include "hw/sysbus.h"
> -#include "hw/pci/pci.h"
> -#include "hw/pci/pci_bus.h"
> -#include "hw/pci/pcie_host.h"
>  #include "hw/pci/pci_bridge.h"
>  #include "qom/object.h"
>  
> diff --git a/include/hw/pci-host/i440fx.h b/include/hw/pci-host/i440fx.h
> index d02bf1ed6b..fc93e22732 100644
> --- a/include/hw/pci-host/i440fx.h
> +++ b/include/hw/pci-host/i440fx.h
> @@ -11,7 +11,7 @@
>  #ifndef HW_PCI_I440FX_H
>  #define HW_PCI_I440FX_H
>  
> -#include "hw/pci/pci_bus.h"
> +#include "hw/pci/pci.h"
>  #include "hw/pci-host/pam.h"
>  #include "qom/object.h"
>  
> diff --git a/include/hw/pci-host/ls7a.h b/include/hw/pci-host/ls7a.h
> index df7fa55a30..b27db8e2ca 100644
> --- a/include/hw/pci-host/ls7a.h
> +++ b/include/hw/pci-host/ls7a.h
> @@ -8,8 +8,6 @@
>  #ifndef HW_LS7A_H
>  #define HW_LS7A_H
>  
> -#include "hw/pci/pci.h"
> -#include "hw/pci/pcie_host.h"
>  #include "hw/pci-host/pam.h"
>  #include "qemu/units.h"
>  #include "qemu/range.h"
> diff --git a/include/hw/pci-host/pnv_phb3.h b/include/hw/pci-host/pnv_phb3.h
> index 4854f6d2f6..f791ebda9b 100644
> --- a/include/hw/pci-host/pnv_phb3.h
> +++ b/include/hw/pci-host/pnv_phb3.h
> @@ -10,8 +10,6 @@
>  #ifndef PCI_HOST_PNV_PHB3_H
>  #define PCI_HOST_PNV_PHB3_H
>  
> -#include "hw/pci/pcie_host.h"
> -#include "hw/pci/pcie_port.h"
>  #include "hw/ppc/xics.h"
>  #include "qom/object.h"
>  #include "hw/pci-host/pnv_phb.h"
> diff --git a/include/hw/pci-host/pnv_phb4.h b/include/hw/pci-host/pnv_phb4.h
> index 50d4faa001..d9cea3f952 100644
> --- a/include/hw/pci-host/pnv_phb4.h
> +++ b/include/hw/pci-host/pnv_phb4.h
> @@ -10,8 +10,7 @@
>  #ifndef PCI_HOST_PNV_PHB4_H
>  #define PCI_HOST_PNV_PHB4_H
>  
> -#include "hw/pci/pcie_host.h"
> -#include "hw/pci/pcie_port.h"
> +#include "hw/pci/pci_bus.h"
>  #include "hw/ppc/xive.h"
>  #include "qom/object.h"
>  
> diff --git a/include/hw/pci-host/xilinx-pcie.h b/include/hw/pci-host/xilinx-pcie.h
> index 89be88d87f..e1b3c1c280 100644
> --- a/include/hw/pci-host/xilinx-pcie.h
> +++ b/include/hw/pci-host/xilinx-pcie.h
> @@ -21,7 +21,6 @@
>  #define HW_XILINX_PCIE_H
>  
>  #include "hw/sysbus.h"
> -#include "hw/pci/pci.h"
>  #include "hw/pci/pci_bridge.h"
>  #include "hw/pci/pcie_host.h"
>  #include "qom/object.h"
> diff --git a/include/hw/pci/pcie.h b/include/hw/pci/pcie.h
> index 698d3de851..798a262a0a 100644
> --- a/include/hw/pci/pcie.h
> +++ b/include/hw/pci/pcie.h
> @@ -26,7 +26,6 @@
>  #include "hw/pci/pcie_aer.h"
>  #include "hw/pci/pcie_sriov.h"
>  #include "hw/hotplug.h"
> -#include "hw/pci/pcie_doe.h"
>  
>  typedef enum {
>      /* for attention and power indicator */
> diff --git a/include/hw/virtio/virtio-scsi.h b/include/hw/virtio/virtio-scsi.h
> index a36aad9c86..37b75e15e3 100644
> --- a/include/hw/virtio/virtio-scsi.h
> +++ b/include/hw/virtio/virtio-scsi.h
> @@ -20,7 +20,6 @@
>  #define VIRTIO_SCSI_SENSE_SIZE 0
>  #include "standard-headers/linux/virtio_scsi.h"
>  #include "hw/virtio/virtio.h"
> -#include "hw/pci/pci.h"
>  #include "hw/scsi/scsi.h"
>  #include "chardev/char-fe.h"
>  #include "sysemu/iothread.h"
> diff --git a/hw/alpha/pci.c b/hw/alpha/pci.c
> index 72251fcdf0..7c18297177 100644
> --- a/hw/alpha/pci.c
> +++ b/hw/alpha/pci.c
> @@ -7,6 +7,7 @@
>   */
>  
>  #include "qemu/osdep.h"
> +#include "hw/pci/pci_host.h"
>  #include "alpha_sys.h"
>  #include "qemu/log.h"
>  #include "trace.h"
> diff --git a/hw/alpha/typhoon.c b/hw/alpha/typhoon.c
> index bd39c8ca86..49a80550c5 100644
> --- a/hw/alpha/typhoon.c
> +++ b/hw/alpha/typhoon.c
> @@ -10,10 +10,10 @@
>  #include "qemu/module.h"
>  #include "qemu/units.h"
>  #include "qapi/error.h"
> +#include "hw/pci/pci_host.h"
>  #include "cpu.h"
>  #include "hw/irq.h"
>  #include "alpha_sys.h"
> -#include "qom/object.h"
>  
>  
>  #define TYPE_TYPHOON_PCI_HOST_BRIDGE "typhoon-pcihost"
> diff --git a/hw/i386/acpi-build.c b/hw/i386/acpi-build.c
> index d9eaa5fc4d..b75d1507f9 100644
> --- a/hw/i386/acpi-build.c
> +++ b/hw/i386/acpi-build.c
> @@ -27,7 +27,7 @@
>  #include "acpi-common.h"
>  #include "qemu/bitmap.h"
>  #include "qemu/error-report.h"
> -#include "hw/pci/pci.h"
> +#include "hw/pci/pci_bridge.h"
>  #include "hw/cxl/cxl.h"
>  #include "hw/core/cpu.h"
>  #include "target/i386/cpu.h"
> diff --git a/hw/pci-bridge/i82801b11.c b/hw/pci-bridge/i82801b11.c
> index f28181e210..06f704a2e1 100644
> --- a/hw/pci-bridge/i82801b11.c
> +++ b/hw/pci-bridge/i82801b11.c
> @@ -42,7 +42,7 @@
>   */
>  
>  #include "qemu/osdep.h"
> -#include "hw/pci/pci.h"
> +#include "hw/pci/pci_bridge.h"
>  #include "migration/vmstate.h"
>  #include "qemu/module.h"
>  #include "hw/i386/ich9.h"
> diff --git a/hw/rdma/rdma_utils.c b/hw/rdma/rdma_utils.c
> index 5a7ef63ad2..77008552f4 100644
> --- a/hw/rdma/rdma_utils.c
> +++ b/hw/rdma/rdma_utils.c
> @@ -14,6 +14,7 @@
>   */
>  
>  #include "qemu/osdep.h"
> +#include "hw/pci/pci.h"
>  #include "trace.h"
>  #include "rdma_utils.h"
>  
> diff --git a/hw/scsi/virtio-scsi.c b/hw/scsi/virtio-scsi.c
> index 6f6e2e32ba..2b649ca976 100644
> --- a/hw/scsi/virtio-scsi.c
> +++ b/hw/scsi/virtio-scsi.c
> @@ -22,6 +22,7 @@
>  #include "qemu/iov.h"
>  #include "qemu/module.h"
>  #include "sysemu/block-backend.h"
> +#include "sysemu/dma.h"
>  #include "hw/qdev-properties.h"
>  #include "hw/scsi/scsi.h"
>  #include "scsi/constants.h"
> -- 
> 2.37.3



^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: [PATCH 6/5] include/hw/cxl: Break inclusion loop
  2022-12-09 15:11 ` [PATCH 6/5] include/hw/cxl: Break inclusion loop Markus Armbruster
@ 2022-12-10  7:09   ` Markus Armbruster
  2022-12-12 10:54     ` Jonathan Cameron via
  0 siblings, 1 reply; 23+ messages in thread
From: Markus Armbruster @ 2022-12-10  7:09 UTC (permalink / raw)
  To: Markus Armbruster
  Cc: qemu-devel, mst, marcel.apfelbaum, ben.widawsky,
	jonathan.cameron, philmd

Markus Armbruster <armbru@redhat.com> writes:

> hw/cxl/cxl_pci.h and hw/cxl/cxl_cdat.h include each other.  Neither
> header actually needs the other one.  Drop both #include directives.
>
> Signed-off-by: Markus Armbruster <armbru@redhat.com>
> ---
>  include/hw/cxl/cxl_cdat.h | 1 -
>  include/hw/cxl/cxl_pci.h  | 1 -
>  2 files changed, 2 deletions(-)
>
> diff --git a/include/hw/cxl/cxl_cdat.h b/include/hw/cxl/cxl_cdat.h
> index 7f67638685..e3fd737f9d 100644
> --- a/include/hw/cxl/cxl_cdat.h
> +++ b/include/hw/cxl/cxl_cdat.h
> @@ -10,7 +10,6 @@
>  #ifndef CXL_CDAT_H
>  #define CXL_CDAT_H
>  
> -#include "hw/cxl/cxl_pci.h"
>  #include "hw/pci/pcie_doe.h"
>  
>  /*
> diff --git a/include/hw/cxl/cxl_pci.h b/include/hw/cxl/cxl_pci.h
> index aca14845ab..01e15ed5b4 100644
> --- a/include/hw/cxl/cxl_pci.h
> +++ b/include/hw/cxl/cxl_pci.h
> @@ -11,7 +11,6 @@
>  #define CXL_PCI_H
>  
>  #include "qemu/compiler.h"
> -#include "hw/cxl/cxl_cdat.h"
>  
>  #define CXL_VENDOR_ID 0x1e98

Friday afternoon post with insufficient testing...  Everything still
builds fine, but cxl_component.h is no longer self-contained.  I'll
squash in the appended patch and revise the commit message.


diff --git a/include/hw/cxl/cxl_component.h b/include/hw/cxl/cxl_component.h
index 5dca21e95b..78f83ed742 100644
--- a/include/hw/cxl/cxl_component.h
+++ b/include/hw/cxl/cxl_component.h
@@ -19,6 +19,7 @@
 #include "qemu/range.h"
 #include "qemu/typedefs.h"
 #include "hw/cxl/cxl_cdat.h"
+#include "hw/cxl/cxl_pci.h"
 #include "hw/register.h"
 #include "qapi/error.h"
 



^ permalink raw reply related	[flat|nested] 23+ messages in thread

* Re: [PATCH 1/5] include/hw/pci: Clean up superfluous inclusion of pci*/*.h cxl/*.h
  2022-12-09 17:03   ` Michael S. Tsirkin
@ 2022-12-10  7:25     ` Markus Armbruster
  0 siblings, 0 replies; 23+ messages in thread
From: Markus Armbruster @ 2022-12-10  7:25 UTC (permalink / raw)
  To: Michael S. Tsirkin; +Cc: qemu-devel, marcel.apfelbaum, jonathan.cameron, philmd

"Michael S. Tsirkin" <mst@redhat.com> writes:

> On Fri, Dec 09, 2022 at 02:47:58PM +0100, Markus Armbruster wrote:
>> Signed-off-by: Markus Armbruster <armbru@redhat.com>
>
> Thanks!
> How can I verify this is correct, i.e. that none
> of the headers that we remove is actually needed?

I think the pragmatic way forward is to let the compiler check.

"But how can we be confident the compiler's check is complete?" you
might ask.  So let's consider how it could be incomplete.

Any .c that (transitively) includes one of the headers that now include
less could be affected.

* Test builds fail to compile such a .c.

  To actually miss a problem, the code not covered must use something
  from a header that is no longer included.

* Test builds compile such a .c, but fail to cover all build
  configurations.

  To actually miss a problem, the conditional code not covered must use
  something from a header that is no longer included.

* Test builds silently miscompile such a .c, i.e. the build succeeds,
  "make check" passes, but the generated code is wrong.

  For this, the code must use something from a header that is no longer
  included *and* it still needs to make sense to the compiler.  Seems
  far-fetched to me, except for #ifdef FOO where FOO comes from such a
  header.

In my opinion, breaking something not covered by CI and in a way that is
trivial to fix doesn't really matter.

In addition to building various configurations, I tested that each
affected header compiles on its own, by compiling

    #include "qemu/osdep.h"
    #include THE_HEADER

There are two failures, hw/cxl/cxl_device.h and include/hw/pci/pcie.h,
but they both fail before this patch as well, and they don't fail
anymore at the end of this series.

Anything else you'd like me to do?



^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: [PATCH 2/5] include/hw/cxl: Include hw/cxl/*.h where needed
  2022-12-09 13:47 ` [PATCH 2/5] include/hw/cxl: Include hw/cxl/*.h where needed Markus Armbruster
@ 2022-12-12 10:33   ` Jonathan Cameron via
  0 siblings, 0 replies; 23+ messages in thread
From: Jonathan Cameron via @ 2022-12-12 10:33 UTC (permalink / raw)
  To: Markus Armbruster; +Cc: qemu-devel, mst, marcel.apfelbaum, ben.widawsky, philmd

On Fri,  9 Dec 2022 14:47:59 +0100
Markus Armbruster <armbru@redhat.com> wrote:

> hw/cxl/cxl_component.h needs CDATObject from hw/cxl/cxl_cdat.h.
> 
> hw/cxl/cxl_device.h needs CXLComponentState from
> hw/cxl/cxl_component.h.
> 
> Signed-off-by: Markus Armbruster <armbru@redhat.com>

Acked-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>

Thanks,

> ---
>  include/hw/cxl/cxl_component.h | 1 +
>  include/hw/cxl/cxl_device.h    | 1 +
>  2 files changed, 2 insertions(+)
> 
> diff --git a/include/hw/cxl/cxl_component.h b/include/hw/cxl/cxl_component.h
> index 34075cfb72..5dca21e95b 100644
> --- a/include/hw/cxl/cxl_component.h
> +++ b/include/hw/cxl/cxl_component.h
> @@ -18,6 +18,7 @@
>  #include "qemu/compiler.h"
>  #include "qemu/range.h"
>  #include "qemu/typedefs.h"
> +#include "hw/cxl/cxl_cdat.h"
>  #include "hw/register.h"
>  #include "qapi/error.h"
>  
> diff --git a/include/hw/cxl/cxl_device.h b/include/hw/cxl/cxl_device.h
> index fd475b947b..3f91969db0 100644
> --- a/include/hw/cxl/cxl_device.h
> +++ b/include/hw/cxl/cxl_device.h
> @@ -10,6 +10,7 @@
>  #ifndef CXL_DEVICE_H
>  #define CXL_DEVICE_H
>  
> +#include "hw/cxl/cxl_component.h"
>  #include "hw/pci/pci.h"
>  #include "hw/register.h"
>  



^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: [PATCH 1/5] include/hw/pci: Clean up superfluous inclusion of pci*/*.h cxl/*.h
  2022-12-09 13:47 ` [PATCH 1/5] include/hw/pci: Clean up superfluous inclusion of pci*/*.h cxl/*.h Markus Armbruster
  2022-12-09 17:03   ` Michael S. Tsirkin
@ 2022-12-12 10:41   ` Jonathan Cameron via
  2022-12-15  7:14     ` Markus Armbruster
  1 sibling, 1 reply; 23+ messages in thread
From: Jonathan Cameron via @ 2022-12-12 10:41 UTC (permalink / raw)
  To: Markus Armbruster; +Cc: qemu-devel, mst, marcel.apfelbaum, ben.widawsky, philmd

On Fri,  9 Dec 2022 14:47:58 +0100
Markus Armbruster <armbru@redhat.com> wrote:

Hi Markus,

One comment on the CXL ones.  Others CXL related changes
all looks fine to me.

Thanks for cleaning these up.

Jonathan


> diff --git a/include/hw/cxl/cxl.h b/include/hw/cxl/cxl.h
> index 38e0e271d5..5129557bee 100644
> --- a/include/hw/cxl/cxl.h
> +++ b/include/hw/cxl/cxl.h
> @@ -13,7 +13,6 @@
>  
>  #include "qapi/qapi-types-machine.h"
>  #include "qapi/qapi-visit-machine.h"
> -#include "hw/pci/pci_bridge.h"

If we drop this, we probably want a forwards def of
struct PXBDev

I should probably be using the typedef in here as well rather
than struct PXBDev * in CXLFixed Window so we'd need
to deal with making that visible too.

>  #include "hw/pci/pci_host.h"
>  #include "cxl_pci.h"
>  #include "cxl_component.h"

>  #define CXL_VENDOR_ID 0x1e98


^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: [PATCH 6/5] include/hw/cxl: Break inclusion loop
  2022-12-10  7:09   ` Markus Armbruster
@ 2022-12-12 10:54     ` Jonathan Cameron via
  2022-12-15  7:34       ` Markus Armbruster
  0 siblings, 1 reply; 23+ messages in thread
From: Jonathan Cameron via @ 2022-12-12 10:54 UTC (permalink / raw)
  To: Markus Armbruster; +Cc: qemu-devel, mst, marcel.apfelbaum, ben.widawsky, philmd

On Sat, 10 Dec 2022 08:09:06 +0100
Markus Armbruster <armbru@redhat.com> wrote:

> Markus Armbruster <armbru@redhat.com> writes:
> 
> > hw/cxl/cxl_pci.h and hw/cxl/cxl_cdat.h include each other.  Neither
> > header actually needs the other one.  Drop both #include directives.
> >
> > Signed-off-by: Markus Armbruster <armbru@redhat.com>
> > ---
> >  include/hw/cxl/cxl_cdat.h | 1 -
> >  include/hw/cxl/cxl_pci.h  | 1 -
> >  2 files changed, 2 deletions(-)
> >
> > diff --git a/include/hw/cxl/cxl_cdat.h b/include/hw/cxl/cxl_cdat.h
> > index 7f67638685..e3fd737f9d 100644
> > --- a/include/hw/cxl/cxl_cdat.h
> > +++ b/include/hw/cxl/cxl_cdat.h
> > @@ -10,7 +10,6 @@
> >  #ifndef CXL_CDAT_H
> >  #define CXL_CDAT_H
> >  
> > -#include "hw/cxl/cxl_pci.h"
> >  #include "hw/pci/pcie_doe.h"

The include was to get to CXL_VENDOR_ID which is in hw/cxl/cxl_pci.h
Can move that elsewhere perhaps, though I don't think we need to
if we break the loop by dropping the other one.


> >  
> >  /*
> > diff --git a/include/hw/cxl/cxl_pci.h b/include/hw/cxl/cxl_pci.h
> > index aca14845ab..01e15ed5b4 100644
> > --- a/include/hw/cxl/cxl_pci.h
> > +++ b/include/hw/cxl/cxl_pci.h
> > @@ -11,7 +11,6 @@
> >  #define CXL_PCI_H
> >  
> >  #include "qemu/compiler.h"
> > -#include "hw/cxl/cxl_cdat.h"
Guess that's a left over of some earlier refactoring. Good to get rid
of this one.

> >  
> >  #define CXL_VENDOR_ID 0x1e98  
> 
> Friday afternoon post with insufficient testing...  Everything still
> builds fine, but cxl_component.h is no longer self-contained.  I'll
> squash in the appended patch and revise the commit message.

By staring at the code rather than any automation I'm failing to spot
what it needs from cxl_pci.h.  Can you add that info to the commit message?

> 
> 
> diff --git a/include/hw/cxl/cxl_component.h b/include/hw/cxl/cxl_component.h
> index 5dca21e95b..78f83ed742 100644
> --- a/include/hw/cxl/cxl_component.h
> +++ b/include/hw/cxl/cxl_component.h
> @@ -19,6 +19,7 @@
>  #include "qemu/range.h"
>  #include "qemu/typedefs.h"
>  #include "hw/cxl/cxl_cdat.h"
> +#include "hw/cxl/cxl_pci.h"
>  #include "hw/register.h"
>  #include "qapi/error.h"
>  
> 



^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: [PATCH 1/5] include/hw/pci: Clean up superfluous inclusion of pci*/*.h cxl/*.h
  2022-12-12 10:41   ` Jonathan Cameron via
@ 2022-12-15  7:14     ` Markus Armbruster
  2022-12-15 17:38       ` Jonathan Cameron via
  0 siblings, 1 reply; 23+ messages in thread
From: Markus Armbruster @ 2022-12-15  7:14 UTC (permalink / raw)
  To: Jonathan Cameron; +Cc: qemu-devel, mst, marcel.apfelbaum, ben.widawsky, philmd

Jonathan Cameron <Jonathan.Cameron@Huawei.com> writes:

> On Fri,  9 Dec 2022 14:47:58 +0100
> Markus Armbruster <armbru@redhat.com> wrote:
>
> Hi Markus,
>
> One comment on the CXL ones.  Others CXL related changes
> all looks fine to me.
>
> Thanks for cleaning these up.
>
> Jonathan
>
>
>> diff --git a/include/hw/cxl/cxl.h b/include/hw/cxl/cxl.h
>> index 38e0e271d5..5129557bee 100644
>> --- a/include/hw/cxl/cxl.h
>> +++ b/include/hw/cxl/cxl.h
>> @@ -13,7 +13,6 @@
>>  
>>  #include "qapi/qapi-types-machine.h"
>>  #include "qapi/qapi-visit-machine.h"
>> -#include "hw/pci/pci_bridge.h"
>
> If we drop this, we probably want a forwards def of
> struct PXBDev

Why?  Because it's used in the header?

> I should probably be using the typedef in here as well rather
> than struct PXBDev * in CXLFixed Window so we'd need
> to deal with making that visible too.

We have two typedef struct PXBDev PXBDev, one n pci_bridge.h, and one in
pci_expander_bridge.c.  Both include cxl.h.  Move it to cxl.h?

>>  #include "hw/pci/pci_host.h"
>>  #include "cxl_pci.h"
>>  #include "cxl_component.h"
>
>>  #define CXL_VENDOR_ID 0x1e98



^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: [PATCH 6/5] include/hw/cxl: Break inclusion loop
  2022-12-12 10:54     ` Jonathan Cameron via
@ 2022-12-15  7:34       ` Markus Armbruster
  2022-12-15 17:45         ` Jonathan Cameron via
  0 siblings, 1 reply; 23+ messages in thread
From: Markus Armbruster @ 2022-12-15  7:34 UTC (permalink / raw)
  To: Jonathan Cameron; +Cc: qemu-devel, mst, marcel.apfelbaum, philmd

Jonathan Cameron <Jonathan.Cameron@Huawei.com> writes:

> On Sat, 10 Dec 2022 08:09:06 +0100
> Markus Armbruster <armbru@redhat.com> wrote:
>
>> Markus Armbruster <armbru@redhat.com> writes:
>> 
>> > hw/cxl/cxl_pci.h and hw/cxl/cxl_cdat.h include each other.  Neither
>> > header actually needs the other one.  Drop both #include directives.
>> >
>> > Signed-off-by: Markus Armbruster <armbru@redhat.com>
>> > ---
>> >  include/hw/cxl/cxl_cdat.h | 1 -
>> >  include/hw/cxl/cxl_pci.h  | 1 -
>> >  2 files changed, 2 deletions(-)
>> >
>> > diff --git a/include/hw/cxl/cxl_cdat.h b/include/hw/cxl/cxl_cdat.h
>> > index 7f67638685..e3fd737f9d 100644
>> > --- a/include/hw/cxl/cxl_cdat.h
>> > +++ b/include/hw/cxl/cxl_cdat.h
>> > @@ -10,7 +10,6 @@
>> >  #ifndef CXL_CDAT_H
>> >  #define CXL_CDAT_H
>> >  
>> > -#include "hw/cxl/cxl_pci.h"
>> >  #include "hw/pci/pcie_doe.h"
>
> The include was to get to CXL_VENDOR_ID which is in hw/cxl/cxl_pci.h
> Can move that elsewhere perhaps, though I don't think we need to
> if we break the loop by dropping the other one.

It's used only in a macro.  If you use the macro, you need to include
cxl_pci.h.

Would you like me to keep this #include?

>> >  /*
>> > diff --git a/include/hw/cxl/cxl_pci.h b/include/hw/cxl/cxl_pci.h
>> > index aca14845ab..01e15ed5b4 100644
>> > --- a/include/hw/cxl/cxl_pci.h
>> > +++ b/include/hw/cxl/cxl_pci.h
>> > @@ -11,7 +11,6 @@
>> >  #define CXL_PCI_H
>> >  
>> >  #include "qemu/compiler.h"
>> > -#include "hw/cxl/cxl_cdat.h"
> Guess that's a left over of some earlier refactoring. Good to get rid
> of this one.
>
>> >  
>> >  #define CXL_VENDOR_ID 0x1e98  
>> 
>> Friday afternoon post with insufficient testing...  Everything still
>> builds fine, but cxl_component.h is no longer self-contained.  I'll
>> squash in the appended patch and revise the commit message.
>
> By staring at the code rather than any automation I'm failing to spot
> what it needs from cxl_pci.h.  Can you add that info to the commit message?

It's CXL20_MAX_DVSEC.

>> diff --git a/include/hw/cxl/cxl_component.h b/include/hw/cxl/cxl_component.h
>> index 5dca21e95b..78f83ed742 100644
>> --- a/include/hw/cxl/cxl_component.h
>> +++ b/include/hw/cxl/cxl_component.h
>> @@ -19,6 +19,7 @@
>>  #include "qemu/range.h"
>>  #include "qemu/typedefs.h"
>>  #include "hw/cxl/cxl_cdat.h"
>> +#include "hw/cxl/cxl_pci.h"
>>  #include "hw/register.h"
>>  #include "qapi/error.h"
>>  
>> 



^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: [PATCH 1/5] include/hw/pci: Clean up superfluous inclusion of pci*/*.h cxl/*.h
  2022-12-15  7:14     ` Markus Armbruster
@ 2022-12-15 17:38       ` Jonathan Cameron via
  0 siblings, 0 replies; 23+ messages in thread
From: Jonathan Cameron via @ 2022-12-15 17:38 UTC (permalink / raw)
  To: Markus Armbruster; +Cc: qemu-devel, mst, marcel.apfelbaum, ben.widawsky, philmd

On Thu, 15 Dec 2022 08:14:52 +0100
Markus Armbruster <armbru@redhat.com> wrote:

> Jonathan Cameron <Jonathan.Cameron@Huawei.com> writes:
> 
> > On Fri,  9 Dec 2022 14:47:58 +0100
> > Markus Armbruster <armbru@redhat.com> wrote:
> >
> > Hi Markus,
> >
> > One comment on the CXL ones.  Others CXL related changes
> > all looks fine to me.
> >
> > Thanks for cleaning these up.
> >
> > Jonathan
> >
> >  
> >> diff --git a/include/hw/cxl/cxl.h b/include/hw/cxl/cxl.h
> >> index 38e0e271d5..5129557bee 100644
> >> --- a/include/hw/cxl/cxl.h
> >> +++ b/include/hw/cxl/cxl.h
> >> @@ -13,7 +13,6 @@
> >>  
> >>  #include "qapi/qapi-types-machine.h"
> >>  #include "qapi/qapi-visit-machine.h"
> >> -#include "hw/pci/pci_bridge.h"  
> >
> > If we drop this, we probably want a forwards def of
> > struct PXBDev  
> 
> Why?  Because it's used in the header?
> 
> > I should probably be using the typedef in here as well rather
> > than struct PXBDev * in CXLFixed Window so we'd need
> > to deal with making that visible too.  
> 
> We have two typedef struct PXBDev PXBDev, one n pci_bridge.h, and one in
> pci_expander_bridge.c.  Both include cxl.h.  Move it to cxl.h?

Sure.

> 
> >>  #include "hw/pci/pci_host.h"
> >>  #include "cxl_pci.h"
> >>  #include "cxl_component.h"  
> >  
> >>  #define CXL_VENDOR_ID 0x1e98  
> 



^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: [PATCH 6/5] include/hw/cxl: Break inclusion loop
  2022-12-15  7:34       ` Markus Armbruster
@ 2022-12-15 17:45         ` Jonathan Cameron via
  0 siblings, 0 replies; 23+ messages in thread
From: Jonathan Cameron via @ 2022-12-15 17:45 UTC (permalink / raw)
  To: Markus Armbruster; +Cc: qemu-devel, mst, marcel.apfelbaum, philmd

On Thu, 15 Dec 2022 08:34:10 +0100
Markus Armbruster <armbru@redhat.com> wrote:

> Jonathan Cameron <Jonathan.Cameron@Huawei.com> writes:
> 
> > On Sat, 10 Dec 2022 08:09:06 +0100
> > Markus Armbruster <armbru@redhat.com> wrote:
> >  
> >> Markus Armbruster <armbru@redhat.com> writes:
> >>   
> >> > hw/cxl/cxl_pci.h and hw/cxl/cxl_cdat.h include each other.  Neither
> >> > header actually needs the other one.  Drop both #include directives.
> >> >
> >> > Signed-off-by: Markus Armbruster <armbru@redhat.com>
> >> > ---
> >> >  include/hw/cxl/cxl_cdat.h | 1 -
> >> >  include/hw/cxl/cxl_pci.h  | 1 -
> >> >  2 files changed, 2 deletions(-)
> >> >
> >> > diff --git a/include/hw/cxl/cxl_cdat.h b/include/hw/cxl/cxl_cdat.h
> >> > index 7f67638685..e3fd737f9d 100644
> >> > --- a/include/hw/cxl/cxl_cdat.h
> >> > +++ b/include/hw/cxl/cxl_cdat.h
> >> > @@ -10,7 +10,6 @@
> >> >  #ifndef CXL_CDAT_H
> >> >  #define CXL_CDAT_H
> >> >  
> >> > -#include "hw/cxl/cxl_pci.h"
> >> >  #include "hw/pci/pcie_doe.h"  
> >
> > The include was to get to CXL_VENDOR_ID which is in hw/cxl/cxl_pci.h
> > Can move that elsewhere perhaps, though I don't think we need to
> > if we break the loop by dropping the other one.  
> 
> It's used only in a macro.  If you use the macro, you need to include
> cxl_pci.h.
> 
> Would you like me to keep this #include?

yes. That would be my preference.

> 
> >> >  /*
> >> > diff --git a/include/hw/cxl/cxl_pci.h b/include/hw/cxl/cxl_pci.h
> >> > index aca14845ab..01e15ed5b4 100644
> >> > --- a/include/hw/cxl/cxl_pci.h
> >> > +++ b/include/hw/cxl/cxl_pci.h
> >> > @@ -11,7 +11,6 @@
> >> >  #define CXL_PCI_H
> >> >  
> >> >  #include "qemu/compiler.h"
> >> > -#include "hw/cxl/cxl_cdat.h"  
> > Guess that's a left over of some earlier refactoring. Good to get rid
> > of this one.
> >  
> >> >  
> >> >  #define CXL_VENDOR_ID 0x1e98    
> >> 
> >> Friday afternoon post with insufficient testing...  Everything still
> >> builds fine, but cxl_component.h is no longer self-contained.  I'll
> >> squash in the appended patch and revise the commit message.  
> >
> > By staring at the code rather than any automation I'm failing to spot
> > what it needs from cxl_pci.h.  Can you add that info to the commit message?  
> 
> It's CXL20_MAX_DVSEC.
ah. Make sense. Thanks.
> 
> >> diff --git a/include/hw/cxl/cxl_component.h b/include/hw/cxl/cxl_component.h
> >> index 5dca21e95b..78f83ed742 100644
> >> --- a/include/hw/cxl/cxl_component.h
> >> +++ b/include/hw/cxl/cxl_component.h
> >> @@ -19,6 +19,7 @@
> >>  #include "qemu/range.h"
> >>  #include "qemu/typedefs.h"
> >>  #include "hw/cxl/cxl_cdat.h"
> >> +#include "hw/cxl/cxl_pci.h"
> >>  #include "hw/register.h"
> >>  #include "qapi/error.h"
> >>  
> >>   
> 



^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: [PATCH 4/5] include/hw/pci: Split pci_device.h off pci.h
  2022-12-09 13:48 ` [PATCH 4/5] include/hw/pci: Split pci_device.h off pci.h Markus Armbruster
@ 2022-12-21 11:33   ` Michael S. Tsirkin
  2022-12-22  9:35     ` Markus Armbruster
  0 siblings, 1 reply; 23+ messages in thread
From: Michael S. Tsirkin @ 2022-12-21 11:33 UTC (permalink / raw)
  To: Markus Armbruster
  Cc: qemu-devel, marcel.apfelbaum, ben.widawsky, jonathan.cameron, philmd

On Fri, Dec 09, 2022 at 02:48:01PM +0100, Markus Armbruster wrote:
> PCIDeviceClass and PCIDevice are defined in pci.h.  Many users of the
> header don't actually need them.  Similar structs live in their own
> headers: PCIBusClass and PCIBus in pci_bus.h, PCIBridge in
> pci_bridge.h, PCIHostBridgeClass and PCIHostState in pci_host.h,
> PCIExpressHost in pcie_host.h, and PCIERootPortClass, PCIEPort, and
> PCIESlot in pcie_port.h.
> 
> Move PCIDeviceClass and PCIDeviceClass to new pci_device.h, along with
> the code that needs them.  Adjust include directives.
> 
> This also enables the next commit.
> 
> Signed-off-by: Markus Armbruster <armbru@redhat.com>


checkpatch is unhappy:

./scripts/checkpatch.pl /tmp/patch 
WARNING: added, moved or deleted file(s), does MAINTAINERS need updating?
#707: 
new file mode 100644

ERROR: spaces required around that '*' (ctx:WxV)
#997: FILE: include/hw/pci/pci_device.h:286:
+                                               uint##_bits##_t *val, \
                                                                ^

It's right - we need a MAINTAINERS entry.
Not sure how to fix the error - any idea?

> ---
>  hw/display/ati_int.h             |   2 +-
>  hw/display/qxl.h                 |   3 +-
>  hw/ide/ahci_internal.h           |   2 +-
>  hw/net/vmxnet3_defs.h            |   2 +-
>  hw/nvme/nvme.h                   |   2 +-
>  hw/rdma/vmw/pvrdma.h             |   1 +
>  hw/scsi/mptsas.h                 |   2 +-
>  hw/usb/hcd-ehci.h                |   2 +-
>  hw/usb/hcd-uhci.h                |   2 +-
>  hw/usb/hcd-xhci-pci.h            |   1 +
>  hw/vfio/pci.h                    |   2 +-
>  include/hw/acpi/piix4.h          |   2 +-
>  include/hw/arm/allwinner-a10.h   |   1 +
>  include/hw/cxl/cxl_device.h      |   2 +-
>  include/hw/ide/pci.h             |   2 +-
>  include/hw/misc/macio/macio.h    |   2 +-
>  include/hw/pci-host/gpex.h       |   2 +-
>  include/hw/pci-host/i440fx.h     |   2 +-
>  include/hw/pci-host/q35.h        |   2 +-
>  include/hw/pci-host/sabre.h      |   2 +-
>  include/hw/pci/msi.h             |   2 +-
>  include/hw/pci/pci.h             | 355 ------------------------------
>  include/hw/pci/pci_bridge.h      |   2 +-
>  include/hw/pci/pci_device.h      | 361 +++++++++++++++++++++++++++++++
>  include/hw/pci/pcie_port.h       |   1 +
>  include/hw/pci/shpc.h            |   2 +-
>  include/hw/remote/iohub.h        |   2 +-
>  include/hw/remote/proxy.h        |   2 +-
>  include/hw/sd/sdhci.h            |   2 +-
>  include/hw/southbridge/piix.h    |   3 +-
>  include/hw/xen/xen_common.h      |   2 +-
>  hw/acpi/erst.c                   |   2 +-
>  hw/audio/ac97.c                  |   2 +-
>  hw/audio/es1370.c                |   2 +-
>  hw/audio/via-ac97.c              |   2 +-
>  hw/char/serial-pci-multi.c       |   2 +-
>  hw/char/serial-pci.c             |   2 +-
>  hw/core/qdev-properties-system.c |   1 +
>  hw/display/bochs-display.c       |   2 +-
>  hw/display/cirrus_vga.c          |   2 +-
>  hw/display/sm501.c               |   2 +-
>  hw/display/vga-pci.c             |   2 +-
>  hw/display/vmware_vga.c          |   2 +-
>  hw/i386/xen/xen_pvdevice.c       |   2 +-
>  hw/ipack/tpci200.c               |   2 +-
>  hw/ipmi/pci_ipmi_bt.c            |   2 +-
>  hw/ipmi/pci_ipmi_kcs.c           |   2 +-
>  hw/isa/i82378.c                  |   2 +-
>  hw/mips/gt64xxx_pci.c            |   2 +-
>  hw/misc/pci-testdev.c            |   2 +-
>  hw/misc/pvpanic-pci.c            |   2 +-
>  hw/net/can/can_kvaser_pci.c      |   2 +-
>  hw/net/can/can_mioe3680_pci.c    |   2 +-
>  hw/net/can/can_pcm3680_pci.c     |   2 +-
>  hw/net/can/ctucan_pci.c          |   2 +-
>  hw/net/e1000.c                   |   2 +-
>  hw/net/e1000x_common.c           |   2 +-
>  hw/net/eepro100.c                |   2 +-
>  hw/net/ne2000-pci.c              |   2 +-
>  hw/net/net_tx_pkt.c              |   2 +-
>  hw/net/pcnet-pci.c               |   2 +-
>  hw/net/rocker/rocker.c           |   2 +-
>  hw/net/rocker/rocker_desc.c      |   2 +-
>  hw/net/rtl8139.c                 |   2 +-
>  hw/net/sungem.c                  |   2 +-
>  hw/net/sunhme.c                  |   2 +-
>  hw/net/tulip.c                   |   2 +-
>  hw/net/virtio-net.c              |   2 +-
>  hw/pci-host/bonito.c             |   2 +-
>  hw/pci-host/dino.c               |   2 +-
>  hw/pci-host/grackle.c            |   2 +-
>  hw/pci-host/mv64361.c            |   2 +-
>  hw/pci-host/ppce500.c            |   2 +-
>  hw/pci-host/raven.c              |   2 +-
>  hw/pci-host/sh_pci.c             |   2 +-
>  hw/pci-host/uninorth.c           |   2 +-
>  hw/pci-host/versatile.c          |   2 +-
>  hw/pci/pcie_host.c               |   2 +-
>  hw/pci/pcie_sriov.c              |   2 +-
>  hw/pci/slotid_cap.c              |   2 +-
>  hw/ppc/ppc440_pcix.c             |   2 +-
>  hw/ppc/ppc4xx_pci.c              |   2 +-
>  hw/ppc/spapr_pci_vfio.c          |   1 +
>  hw/rdma/rdma_utils.c             |   2 +-
>  hw/s390x/s390-pci-inst.c         |   1 +
>  hw/scsi/esp-pci.c                |   2 +-
>  hw/scsi/lsi53c895a.c             |   2 +-
>  hw/smbios/smbios.c               |   1 +
>  hw/usb/hcd-ohci-pci.c            |   2 +-
>  hw/watchdog/wdt_i6300esb.c       |   2 +-
>  ui/util.c                        |   2 +-
>  91 files changed, 450 insertions(+), 438 deletions(-)
>  create mode 100644 include/hw/pci/pci_device.h
> 
> diff --git a/hw/display/ati_int.h b/hw/display/ati_int.h
> index 8acb9c7466..e8d3c7af75 100644
> --- a/hw/display/ati_int.h
> +++ b/hw/display/ati_int.h
> @@ -10,7 +10,7 @@
>  #define ATI_INT_H
>  
>  #include "qemu/timer.h"
> -#include "hw/pci/pci.h"
> +#include "hw/pci/pci_device.h"
>  #include "hw/i2c/bitbang_i2c.h"
>  #include "vga_int.h"
>  #include "qom/object.h"
> diff --git a/hw/display/qxl.h b/hw/display/qxl.h
> index 7894bd5134..cd82c7a6fe 100644
> --- a/hw/display/qxl.h
> +++ b/hw/display/qxl.h
> @@ -1,8 +1,7 @@
>  #ifndef HW_QXL_H
>  #define HW_QXL_H
>  
> -
> -#include "hw/pci/pci.h"
> +#include "hw/pci/pci_device.h"
>  #include "vga_int.h"
>  #include "qemu/thread.h"
>  
> diff --git a/hw/ide/ahci_internal.h b/hw/ide/ahci_internal.h
> index 109de9e2d1..303fcd7235 100644
> --- a/hw/ide/ahci_internal.h
> +++ b/hw/ide/ahci_internal.h
> @@ -26,7 +26,7 @@
>  
>  #include "hw/ide/ahci.h"
>  #include "hw/ide/internal.h"
> -#include "hw/pci/pci.h"
> +#include "hw/pci/pci_device.h"
>  
>  #define AHCI_MEM_BAR_SIZE         0x1000
>  #define AHCI_MAX_PORTS            32
> diff --git a/hw/net/vmxnet3_defs.h b/hw/net/vmxnet3_defs.h
> index 71440509ca..64034af6d5 100644
> --- a/hw/net/vmxnet3_defs.h
> +++ b/hw/net/vmxnet3_defs.h
> @@ -19,7 +19,7 @@
>  
>  #include "net/net.h"
>  #include "hw/net/vmxnet3.h"
> -#include "qom/object.h"
> +#include "hw/pci/pci_device.h"
>  
>  #define TYPE_VMXNET3 "vmxnet3"
>  typedef struct VMXNET3State VMXNET3State;
> diff --git a/hw/nvme/nvme.h b/hw/nvme/nvme.h
> index 7adf042ec3..16da27a69b 100644
> --- a/hw/nvme/nvme.h
> +++ b/hw/nvme/nvme.h
> @@ -19,7 +19,7 @@
>  #define HW_NVME_NVME_H
>  
>  #include "qemu/uuid.h"
> -#include "hw/pci/pci.h"
> +#include "hw/pci/pci_device.h"
>  #include "hw/block/block.h"
>  
>  #include "block/nvme.h"
> diff --git a/hw/rdma/vmw/pvrdma.h b/hw/rdma/vmw/pvrdma.h
> index 0caf95ede8..4cbc10c980 100644
> --- a/hw/rdma/vmw/pvrdma.h
> +++ b/hw/rdma/vmw/pvrdma.h
> @@ -19,6 +19,7 @@
>  #include "qemu/units.h"
>  #include "qemu/notify.h"
>  #include "hw/pci/msix.h"
> +#include "hw/pci/pci_device.h"
>  #include "chardev/char-fe.h"
>  #include "hw/net/vmxnet3_defs.h"
>  
> diff --git a/hw/scsi/mptsas.h b/hw/scsi/mptsas.h
> index c046497db7..04e97ce3af 100644
> --- a/hw/scsi/mptsas.h
> +++ b/hw/scsi/mptsas.h
> @@ -2,7 +2,7 @@
>  #define MPTSAS_H
>  
>  #include "mpi.h"
> -#include "qom/object.h"
> +#include "hw/pci/pci_device.h"
>  
>  #define MPTSAS_NUM_PORTS 8
>  #define MPTSAS_MAX_FRAMES 2048     /* Firmware limit at 65535 */
> diff --git a/hw/usb/hcd-ehci.h b/hw/usb/hcd-ehci.h
> index 4d4b2830b7..2cd821f49e 100644
> --- a/hw/usb/hcd-ehci.h
> +++ b/hw/usb/hcd-ehci.h
> @@ -21,7 +21,7 @@
>  #include "qemu/timer.h"
>  #include "hw/usb.h"
>  #include "sysemu/dma.h"
> -#include "hw/pci/pci.h"
> +#include "hw/pci/pci_device.h"
>  #include "hw/sysbus.h"
>  
>  #ifndef EHCI_DEBUG
> diff --git a/hw/usb/hcd-uhci.h b/hw/usb/hcd-uhci.h
> index c85ab7868e..5843af504a 100644
> --- a/hw/usb/hcd-uhci.h
> +++ b/hw/usb/hcd-uhci.h
> @@ -30,7 +30,7 @@
>  
>  #include "exec/memory.h"
>  #include "qemu/timer.h"
> -#include "hw/pci/pci.h"
> +#include "hw/pci/pci_device.h"
>  #include "hw/usb.h"
>  
>  typedef struct UHCIQueue UHCIQueue;
> diff --git a/hw/usb/hcd-xhci-pci.h b/hw/usb/hcd-xhci-pci.h
> index c193f79443..08f70ce97c 100644
> --- a/hw/usb/hcd-xhci-pci.h
> +++ b/hw/usb/hcd-xhci-pci.h
> @@ -24,6 +24,7 @@
>  #ifndef HW_USB_HCD_XHCI_PCI_H
>  #define HW_USB_HCD_XHCI_PCI_H
>  
> +#include "hw/pci/pci_device.h"
>  #include "hw/usb.h"
>  #include "hcd-xhci.h"
>  
> diff --git a/hw/vfio/pci.h b/hw/vfio/pci.h
> index 7c236a52f4..177abcc8fb 100644
> --- a/hw/vfio/pci.h
> +++ b/hw/vfio/pci.h
> @@ -13,7 +13,7 @@
>  #define HW_VFIO_VFIO_PCI_H
>  
>  #include "exec/memory.h"
> -#include "hw/pci/pci.h"
> +#include "hw/pci/pci_device.h"
>  #include "hw/vfio/vfio-common.h"
>  #include "qemu/event_notifier.h"
>  #include "qemu/queue.h"
> diff --git a/include/hw/acpi/piix4.h b/include/hw/acpi/piix4.h
> index 32686a75c5..be1f8ea80e 100644
> --- a/include/hw/acpi/piix4.h
> +++ b/include/hw/acpi/piix4.h
> @@ -22,7 +22,7 @@
>  #ifndef HW_ACPI_PIIX4_H
>  #define HW_ACPI_PIIX4_H
>  
> -#include "hw/pci/pci.h"
> +#include "hw/pci/pci_device.h"
>  #include "hw/acpi/acpi.h"
>  #include "hw/acpi/cpu_hotplug.h"
>  #include "hw/acpi/memory_hotplug.h"
> diff --git a/include/hw/arm/allwinner-a10.h b/include/hw/arm/allwinner-a10.h
> index a76dc7b84d..f9240ffa64 100644
> --- a/include/hw/arm/allwinner-a10.h
> +++ b/include/hw/arm/allwinner-a10.h
> @@ -4,6 +4,7 @@
>  #include "qemu/error-report.h"
>  #include "hw/char/serial.h"
>  #include "hw/arm/boot.h"
> +#include "hw/pci/pci_device.h"
>  #include "hw/timer/allwinner-a10-pit.h"
>  #include "hw/intc/allwinner-a10-pic.h"
>  #include "hw/net/allwinner_emac.h"
> diff --git a/include/hw/cxl/cxl_device.h b/include/hw/cxl/cxl_device.h
> index 3f91969db0..250adf18b2 100644
> --- a/include/hw/cxl/cxl_device.h
> +++ b/include/hw/cxl/cxl_device.h
> @@ -11,7 +11,7 @@
>  #define CXL_DEVICE_H
>  
>  #include "hw/cxl/cxl_component.h"
> -#include "hw/pci/pci.h"
> +#include "hw/pci/pci_device.h"
>  #include "hw/register.h"
>  
>  /*
> diff --git a/include/hw/ide/pci.h b/include/hw/ide/pci.h
> index d8384e1c42..2a6284acac 100644
> --- a/include/hw/ide/pci.h
> +++ b/include/hw/ide/pci.h
> @@ -2,7 +2,7 @@
>  #define HW_IDE_PCI_H
>  
>  #include "hw/ide/internal.h"
> -#include "hw/pci/pci.h"
> +#include "hw/pci/pci_device.h"
>  #include "qom/object.h"
>  
>  #define BM_STATUS_DMAING 0x01
> diff --git a/include/hw/misc/macio/macio.h b/include/hw/misc/macio/macio.h
> index 95d30a1745..86df2c2b60 100644
> --- a/include/hw/misc/macio/macio.h
> +++ b/include/hw/misc/macio/macio.h
> @@ -27,7 +27,7 @@
>  #define MACIO_H
>  
>  #include "hw/char/escc.h"
> -#include "hw/pci/pci.h"
> +#include "hw/pci/pci_device.h"
>  #include "hw/ide/internal.h"
>  #include "hw/intc/heathrow_pic.h"
>  #include "hw/misc/macio/cuda.h"
> diff --git a/include/hw/pci-host/gpex.h b/include/hw/pci-host/gpex.h
> index fcf8b63820..b0240bd768 100644
> --- a/include/hw/pci-host/gpex.h
> +++ b/include/hw/pci-host/gpex.h
> @@ -22,7 +22,7 @@
>  
>  #include "exec/hwaddr.h"
>  #include "hw/sysbus.h"
> -#include "hw/pci/pci.h"
> +#include "hw/pci/pci_device.h"
>  #include "hw/pci/pcie_host.h"
>  #include "qom/object.h"
>  
> diff --git a/include/hw/pci-host/i440fx.h b/include/hw/pci-host/i440fx.h
> index fc93e22732..bf57216c78 100644
> --- a/include/hw/pci-host/i440fx.h
> +++ b/include/hw/pci-host/i440fx.h
> @@ -11,7 +11,7 @@
>  #ifndef HW_PCI_I440FX_H
>  #define HW_PCI_I440FX_H
>  
> -#include "hw/pci/pci.h"
> +#include "hw/pci/pci_device.h"
>  #include "hw/pci-host/pam.h"
>  #include "qom/object.h"
>  
> diff --git a/include/hw/pci-host/q35.h b/include/hw/pci-host/q35.h
> index ab989698ef..e89329c51e 100644
> --- a/include/hw/pci-host/q35.h
> +++ b/include/hw/pci-host/q35.h
> @@ -22,7 +22,7 @@
>  #ifndef HW_Q35_H
>  #define HW_Q35_H
>  
> -#include "hw/pci/pci.h"
> +#include "hw/pci/pci_device.h"
>  #include "hw/pci/pcie_host.h"
>  #include "hw/pci-host/pam.h"
>  #include "qemu/units.h"
> diff --git a/include/hw/pci-host/sabre.h b/include/hw/pci-host/sabre.h
> index 01190241bb..d12de84ea2 100644
> --- a/include/hw/pci-host/sabre.h
> +++ b/include/hw/pci-host/sabre.h
> @@ -1,7 +1,7 @@
>  #ifndef HW_PCI_HOST_SABRE_H
>  #define HW_PCI_HOST_SABRE_H
>  
> -#include "hw/pci/pci.h"
> +#include "hw/pci/pci_device.h"
>  #include "hw/pci/pci_host.h"
>  #include "hw/sparc/sun4u_iommu.h"
>  #include "qom/object.h"
> diff --git a/include/hw/pci/msi.h b/include/hw/pci/msi.h
> index 58aa576215..ee8ee469a6 100644
> --- a/include/hw/pci/msi.h
> +++ b/include/hw/pci/msi.h
> @@ -21,7 +21,7 @@
>  #ifndef QEMU_MSI_H
>  #define QEMU_MSI_H
>  
> -#include "hw/pci/pci.h"
> +#include "hw/pci/pci_device.h"
>  
>  struct MSIMessage {
>      uint64_t address;
> diff --git a/include/hw/pci/pci.h b/include/hw/pci/pci.h
> index 016e28a2a8..7048a373d1 100644
> --- a/include/hw/pci/pci.h
> +++ b/include/hw/pci/pci.h
> @@ -166,7 +166,6 @@ enum {
>  #define QEMU_PCI_VGA_IO_HI_SIZE 0x20
>  
>  #include "hw/pci/pci_regs.h"
> -#include "hw/pci/pcie.h"
>  
>  /* PCI HEADER_TYPE */
>  #define  PCI_HEADER_TYPE_MULTI_FUNCTION 0x80
> @@ -210,23 +209,6 @@ enum {
>      QEMU_PCIE_CAP_CXL = (1 << QEMU_PCIE_CXL_BITNR),
>  };
>  
> -#define TYPE_PCI_DEVICE "pci-device"
> -typedef struct PCIDeviceClass PCIDeviceClass;
> -DECLARE_OBJ_CHECKERS(PCIDevice, PCIDeviceClass,
> -                     PCI_DEVICE, TYPE_PCI_DEVICE)
> -
> -/*
> - * Implemented by devices that can be plugged on CXL buses. In the spec, this is
> - * actually a "CXL Component, but we name it device to match the PCI naming.
> - */
> -#define INTERFACE_CXL_DEVICE "cxl-device"
> -
> -/* Implemented by devices that can be plugged on PCI Express buses */
> -#define INTERFACE_PCIE_DEVICE "pci-express-device"
> -
> -/* Implemented by devices that can be plugged on Conventional PCI buses */
> -#define INTERFACE_CONVENTIONAL_PCI_DEVICE "conventional-pci-device"
> -
>  typedef struct PCIINTxRoute {
>      enum {
>          PCI_INTX_ENABLED,
> @@ -236,32 +218,6 @@ typedef struct PCIINTxRoute {
>      int irq;
>  } PCIINTxRoute;
>  
> -struct PCIDeviceClass {
> -    DeviceClass parent_class;
> -
> -    void (*realize)(PCIDevice *dev, Error **errp);
> -    PCIUnregisterFunc *exit;
> -    PCIConfigReadFunc *config_read;
> -    PCIConfigWriteFunc *config_write;
> -
> -    uint16_t vendor_id;
> -    uint16_t device_id;
> -    uint8_t revision;
> -    uint16_t class_id;
> -    uint16_t subsystem_vendor_id;       /* only for header type = 0 */
> -    uint16_t subsystem_id;              /* only for header type = 0 */
> -
> -    /*
> -     * pci-to-pci bridge or normal device.
> -     * This doesn't mean pci host switch.
> -     * When card bus bridge is supported, this would be enhanced.
> -     */
> -    bool is_bridge;
> -
> -    /* rom bar */
> -    const char *romfile;
> -};
> -
>  typedef void (*PCIINTxRoutingNotifier)(PCIDevice *dev);
>  typedef int (*MSIVectorUseNotifier)(PCIDevice *dev, unsigned int vector,
>                                        MSIMessage msg);
> @@ -270,129 +226,6 @@ typedef void (*MSIVectorPollNotifier)(PCIDevice *dev,
>                                        unsigned int vector_start,
>                                        unsigned int vector_end);
>  
> -enum PCIReqIDType {
> -    PCI_REQ_ID_INVALID = 0,
> -    PCI_REQ_ID_BDF,
> -    PCI_REQ_ID_SECONDARY_BUS,
> -    PCI_REQ_ID_MAX,
> -};
> -typedef enum PCIReqIDType PCIReqIDType;
> -
> -struct PCIReqIDCache {
> -    PCIDevice *dev;
> -    PCIReqIDType type;
> -};
> -typedef struct PCIReqIDCache PCIReqIDCache;
> -
> -struct PCIDevice {
> -    DeviceState qdev;
> -    bool partially_hotplugged;
> -    bool has_power;
> -
> -    /* PCI config space */
> -    uint8_t *config;
> -
> -    /*
> -     * Used to enable config checks on load. Note that writable bits are
> -     * never checked even if set in cmask.
> -     */
> -    uint8_t *cmask;
> -
> -    /* Used to implement R/W bytes */
> -    uint8_t *wmask;
> -
> -    /* Used to implement RW1C(Write 1 to Clear) bytes */
> -    uint8_t *w1cmask;
> -
> -    /* Used to allocate config space for capabilities. */
> -    uint8_t *used;
> -
> -    /* the following fields are read only */
> -    int32_t devfn;
> -    /*
> -     * Cached device to fetch requester ID from, to avoid the PCI tree
> -     * walking every time we invoke PCI request (e.g., MSI). For
> -     * conventional PCI root complex, this field is meaningless.
> -     */
> -    PCIReqIDCache requester_id_cache;
> -    char name[64];
> -    PCIIORegion io_regions[PCI_NUM_REGIONS];
> -    AddressSpace bus_master_as;
> -    MemoryRegion bus_master_container_region;
> -    MemoryRegion bus_master_enable_region;
> -
> -    /* do not access the following fields */
> -    PCIConfigReadFunc *config_read;
> -    PCIConfigWriteFunc *config_write;
> -
> -    /* Legacy PCI VGA regions */
> -    MemoryRegion *vga_regions[QEMU_PCI_VGA_NUM_REGIONS];
> -    bool has_vga;
> -
> -    /* Current IRQ levels.  Used internally by the generic PCI code.  */
> -    uint8_t irq_state;
> -
> -    /* Capability bits */
> -    uint32_t cap_present;
> -
> -    /* Offset of MSI-X capability in config space */
> -    uint8_t msix_cap;
> -
> -    /* MSI-X entries */
> -    int msix_entries_nr;
> -
> -    /* Space to store MSIX table & pending bit array */
> -    uint8_t *msix_table;
> -    uint8_t *msix_pba;
> -
> -    /* May be used by INTx or MSI during interrupt notification */
> -    void *irq_opaque;
> -
> -    MSITriggerFunc *msi_trigger;
> -    MSIPrepareMessageFunc *msi_prepare_message;
> -    MSIxPrepareMessageFunc *msix_prepare_message;
> -
> -    /* MemoryRegion container for msix exclusive BAR setup */
> -    MemoryRegion msix_exclusive_bar;
> -    /* Memory Regions for MSIX table and pending bit entries. */
> -    MemoryRegion msix_table_mmio;
> -    MemoryRegion msix_pba_mmio;
> -    /* Reference-count for entries actually in use by driver. */
> -    unsigned *msix_entry_used;
> -    /* MSIX function mask set or MSIX disabled */
> -    bool msix_function_masked;
> -    /* Version id needed for VMState */
> -    int32_t version_id;
> -
> -    /* Offset of MSI capability in config space */
> -    uint8_t msi_cap;
> -
> -    /* PCI Express */
> -    PCIExpressDevice exp;
> -
> -    /* SHPC */
> -    SHPCDevice *shpc;
> -
> -    /* Location of option rom */
> -    char *romfile;
> -    uint32_t romsize;
> -    bool has_rom;
> -    MemoryRegion rom;
> -    uint32_t rom_bar;
> -
> -    /* INTx routing notifier */
> -    PCIINTxRoutingNotifier intx_routing_notifier;
> -
> -    /* MSI-X notifiers */
> -    MSIVectorUseNotifier msix_vector_use_notifier;
> -    MSIVectorReleaseNotifier msix_vector_release_notifier;
> -    MSIVectorPollNotifier msix_vector_poll_notifier;
> -
> -    /* ID of standby device in net_failover pair */
> -    char *failover_pair_id;
> -    uint32_t acpi_index;
> -};
> -
>  void pci_register_bar(PCIDevice *pci_dev, int region_num,
>                        uint8_t attr, MemoryRegion *memory);
>  void pci_register_vga(PCIDevice *pci_dev, MemoryRegion *mem,
> @@ -753,11 +586,6 @@ void lsi53c8xx_handle_legacy_cmdline(DeviceState *lsi_dev);
>  qemu_irq pci_allocate_irq(PCIDevice *pci_dev);
>  void pci_set_irq(PCIDevice *pci_dev, int level);
>  
> -static inline int pci_intx(PCIDevice *pci_dev)
> -{
> -    return pci_get_byte(pci_dev->config + PCI_INTERRUPT_PIN) - 1;
> -}
> -
>  static inline void pci_irq_assert(PCIDevice *pci_dev)
>  {
>      pci_set_irq(pci_dev, 1);
> @@ -778,189 +606,6 @@ static inline void pci_irq_pulse(PCIDevice *pci_dev)
>      pci_irq_deassert(pci_dev);
>  }
>  
> -static inline int pci_is_cxl(const PCIDevice *d)
> -{
> -    return d->cap_present & QEMU_PCIE_CAP_CXL;
> -}
> -
> -static inline int pci_is_express(const PCIDevice *d)
> -{
> -    return d->cap_present & QEMU_PCI_CAP_EXPRESS;
> -}
> -
> -static inline int pci_is_express_downstream_port(const PCIDevice *d)
> -{
> -    uint8_t type;
> -
> -    if (!pci_is_express(d) || !d->exp.exp_cap) {
> -        return 0;
> -    }
> -
> -    type = pcie_cap_get_type(d);
> -
> -    return type == PCI_EXP_TYPE_DOWNSTREAM || type == PCI_EXP_TYPE_ROOT_PORT;
> -}
> -
> -static inline int pci_is_vf(const PCIDevice *d)
> -{
> -    return d->exp.sriov_vf.pf != NULL;
> -}
> -
> -static inline uint32_t pci_config_size(const PCIDevice *d)
> -{
> -    return pci_is_express(d) ? PCIE_CONFIG_SPACE_SIZE : PCI_CONFIG_SPACE_SIZE;
> -}
> -
> -static inline uint16_t pci_get_bdf(PCIDevice *dev)
> -{
> -    return PCI_BUILD_BDF(pci_bus_num(pci_get_bus(dev)), dev->devfn);
> -}
> -
> -uint16_t pci_requester_id(PCIDevice *dev);
> -
> -/* DMA access functions */
> -static inline AddressSpace *pci_get_address_space(PCIDevice *dev)
> -{
> -    return &dev->bus_master_as;
> -}
> -
> -/**
> - * pci_dma_rw: Read from or write to an address space from PCI device.
> - *
> - * Return a MemTxResult indicating whether the operation succeeded
> - * or failed (eg unassigned memory, device rejected the transaction,
> - * IOMMU fault).
> - *
> - * @dev: #PCIDevice doing the memory access
> - * @addr: address within the #PCIDevice address space
> - * @buf: buffer with the data transferred
> - * @len: the number of bytes to read or write
> - * @dir: indicates the transfer direction
> - */
> -static inline MemTxResult pci_dma_rw(PCIDevice *dev, dma_addr_t addr,
> -                                     void *buf, dma_addr_t len,
> -                                     DMADirection dir, MemTxAttrs attrs)
> -{
> -    return dma_memory_rw(pci_get_address_space(dev), addr, buf, len,
> -                         dir, attrs);
> -}
> -
> -/**
> - * pci_dma_read: Read from an address space from PCI device.
> - *
> - * Return a MemTxResult indicating whether the operation succeeded
> - * or failed (eg unassigned memory, device rejected the transaction,
> - * IOMMU fault).  Called within RCU critical section.
> - *
> - * @dev: #PCIDevice doing the memory access
> - * @addr: address within the #PCIDevice address space
> - * @buf: buffer with the data transferred
> - * @len: length of the data transferred
> - */
> -static inline MemTxResult pci_dma_read(PCIDevice *dev, dma_addr_t addr,
> -                                       void *buf, dma_addr_t len)
> -{
> -    return pci_dma_rw(dev, addr, buf, len,
> -                      DMA_DIRECTION_TO_DEVICE, MEMTXATTRS_UNSPECIFIED);
> -}
> -
> -/**
> - * pci_dma_write: Write to address space from PCI device.
> - *
> - * Return a MemTxResult indicating whether the operation succeeded
> - * or failed (eg unassigned memory, device rejected the transaction,
> - * IOMMU fault).
> - *
> - * @dev: #PCIDevice doing the memory access
> - * @addr: address within the #PCIDevice address space
> - * @buf: buffer with the data transferred
> - * @len: the number of bytes to write
> - */
> -static inline MemTxResult pci_dma_write(PCIDevice *dev, dma_addr_t addr,
> -                                        const void *buf, dma_addr_t len)
> -{
> -    return pci_dma_rw(dev, addr, (void *) buf, len,
> -                      DMA_DIRECTION_FROM_DEVICE, MEMTXATTRS_UNSPECIFIED);
> -}
> -
> -#define PCI_DMA_DEFINE_LDST(_l, _s, _bits) \
> -    static inline MemTxResult ld##_l##_pci_dma(PCIDevice *dev, \
> -                                               dma_addr_t addr, \
> -                                               uint##_bits##_t *val, \
> -                                               MemTxAttrs attrs) \
> -    { \
> -        return ld##_l##_dma(pci_get_address_space(dev), addr, val, attrs); \
> -    } \
> -    static inline MemTxResult st##_s##_pci_dma(PCIDevice *dev, \
> -                                               dma_addr_t addr, \
> -                                               uint##_bits##_t val, \
> -                                               MemTxAttrs attrs) \
> -    { \
> -        return st##_s##_dma(pci_get_address_space(dev), addr, val, attrs); \
> -    }
> -
> -PCI_DMA_DEFINE_LDST(ub, b, 8);
> -PCI_DMA_DEFINE_LDST(uw_le, w_le, 16)
> -PCI_DMA_DEFINE_LDST(l_le, l_le, 32);
> -PCI_DMA_DEFINE_LDST(q_le, q_le, 64);
> -PCI_DMA_DEFINE_LDST(uw_be, w_be, 16)
> -PCI_DMA_DEFINE_LDST(l_be, l_be, 32);
> -PCI_DMA_DEFINE_LDST(q_be, q_be, 64);
> -
> -#undef PCI_DMA_DEFINE_LDST
> -
> -/**
> - * pci_dma_map: Map device PCI address space range into host virtual address
> - * @dev: #PCIDevice to be accessed
> - * @addr: address within that device's address space
> - * @plen: pointer to length of buffer; updated on return to indicate
> - *        if only a subset of the requested range has been mapped
> - * @dir: indicates the transfer direction
> - *
> - * Return: A host pointer, or %NULL if the resources needed to
> - *         perform the mapping are exhausted (in that case *@plen
> - *         is set to zero).
> - */
> -static inline void *pci_dma_map(PCIDevice *dev, dma_addr_t addr,
> -                                dma_addr_t *plen, DMADirection dir)
> -{
> -    void *buf;
> -
> -    buf = dma_memory_map(pci_get_address_space(dev), addr, plen, dir,
> -                         MEMTXATTRS_UNSPECIFIED);
> -    return buf;
> -}
> -
> -static inline void pci_dma_unmap(PCIDevice *dev, void *buffer, dma_addr_t len,
> -                                 DMADirection dir, dma_addr_t access_len)
> -{
> -    dma_memory_unmap(pci_get_address_space(dev), buffer, len, dir, access_len);
> -}
> -
> -static inline void pci_dma_sglist_init(QEMUSGList *qsg, PCIDevice *dev,
> -                                       int alloc_hint)
> -{
> -    qemu_sglist_init(qsg, DEVICE(dev), alloc_hint, pci_get_address_space(dev));
> -}
> -
> -extern const VMStateDescription vmstate_pci_device;
> -
> -#define VMSTATE_PCI_DEVICE(_field, _state) {                         \
> -    .name       = (stringify(_field)),                               \
> -    .size       = sizeof(PCIDevice),                                 \
> -    .vmsd       = &vmstate_pci_device,                               \
> -    .flags      = VMS_STRUCT,                                        \
> -    .offset     = vmstate_offset_value(_state, _field, PCIDevice),   \
> -}
> -
> -#define VMSTATE_PCI_DEVICE_POINTER(_field, _state) {                 \
> -    .name       = (stringify(_field)),                               \
> -    .size       = sizeof(PCIDevice),                                 \
> -    .vmsd       = &vmstate_pci_device,                               \
> -    .flags      = VMS_STRUCT | VMS_POINTER,                          \
> -    .offset     = vmstate_offset_pointer(_state, _field, PCIDevice), \
> -}
> -
>  MSIMessage pci_get_msi_message(PCIDevice *dev, int vector);
>  void pci_set_power(PCIDevice *pci_dev, bool state);
>  
> diff --git a/include/hw/pci/pci_bridge.h b/include/hw/pci/pci_bridge.h
> index ba4bafac7c..22e8472de2 100644
> --- a/include/hw/pci/pci_bridge.h
> +++ b/include/hw/pci/pci_bridge.h
> @@ -26,7 +26,7 @@
>  #ifndef QEMU_PCI_BRIDGE_H
>  #define QEMU_PCI_BRIDGE_H
>  
> -#include "hw/pci/pci.h"
> +#include "hw/pci/pci_device.h"
>  #include "hw/pci/pci_bus.h"
>  #include "hw/cxl/cxl.h"
>  #include "qom/object.h"
> diff --git a/include/hw/pci/pci_device.h b/include/hw/pci/pci_device.h
> new file mode 100644
> index 0000000000..b82a379f6f
> --- /dev/null
> +++ b/include/hw/pci/pci_device.h
> @@ -0,0 +1,361 @@
> +#ifndef QEMU_PCI_DEVICE_H
> +#define QEMU_PCI_DEVICE_H
> +
> +#include "hw/pci/pci.h"
> +#include "hw/pci/pcie.h"
> +
> +#define TYPE_PCI_DEVICE "pci-device"
> +typedef struct PCIDeviceClass PCIDeviceClass;
> +DECLARE_OBJ_CHECKERS(PCIDevice, PCIDeviceClass,
> +                     PCI_DEVICE, TYPE_PCI_DEVICE)
> +
> +/*
> + * Implemented by devices that can be plugged on CXL buses. In the spec, this is
> + * actually a "CXL Component, but we name it device to match the PCI naming.
> + */
> +#define INTERFACE_CXL_DEVICE "cxl-device"
> +
> +/* Implemented by devices that can be plugged on PCI Express buses */
> +#define INTERFACE_PCIE_DEVICE "pci-express-device"
> +
> +/* Implemented by devices that can be plugged on Conventional PCI buses */
> +#define INTERFACE_CONVENTIONAL_PCI_DEVICE "conventional-pci-device"
> +
> +struct PCIDeviceClass {
> +    DeviceClass parent_class;
> +
> +    void (*realize)(PCIDevice *dev, Error **errp);
> +    PCIUnregisterFunc *exit;
> +    PCIConfigReadFunc *config_read;
> +    PCIConfigWriteFunc *config_write;
> +
> +    uint16_t vendor_id;
> +    uint16_t device_id;
> +    uint8_t revision;
> +    uint16_t class_id;
> +    uint16_t subsystem_vendor_id;       /* only for header type = 0 */
> +    uint16_t subsystem_id;              /* only for header type = 0 */
> +
> +    /*
> +     * pci-to-pci bridge or normal device.
> +     * This doesn't mean pci host switch.
> +     * When card bus bridge is supported, this would be enhanced.
> +     */
> +    bool is_bridge;
> +
> +    /* rom bar */
> +    const char *romfile;
> +};
> +
> +enum PCIReqIDType {
> +    PCI_REQ_ID_INVALID = 0,
> +    PCI_REQ_ID_BDF,
> +    PCI_REQ_ID_SECONDARY_BUS,
> +    PCI_REQ_ID_MAX,
> +};
> +typedef enum PCIReqIDType PCIReqIDType;
> +
> +struct PCIReqIDCache {
> +    PCIDevice *dev;
> +    PCIReqIDType type;
> +};
> +typedef struct PCIReqIDCache PCIReqIDCache;
> +
> +struct PCIDevice {
> +    DeviceState qdev;
> +    bool partially_hotplugged;
> +    bool has_power;
> +
> +    /* PCI config space */
> +    uint8_t *config;
> +
> +    /*
> +     * Used to enable config checks on load. Note that writable bits are
> +     * never checked even if set in cmask.
> +     */
> +    uint8_t *cmask;
> +
> +    /* Used to implement R/W bytes */
> +    uint8_t *wmask;
> +
> +    /* Used to implement RW1C(Write 1 to Clear) bytes */
> +    uint8_t *w1cmask;
> +
> +    /* Used to allocate config space for capabilities. */
> +    uint8_t *used;
> +
> +    /* the following fields are read only */
> +    int32_t devfn;
> +    /*
> +     * Cached device to fetch requester ID from, to avoid the PCI tree
> +     * walking every time we invoke PCI request (e.g., MSI). For
> +     * conventional PCI root complex, this field is meaningless.
> +     */
> +    PCIReqIDCache requester_id_cache;
> +    char name[64];
> +    PCIIORegion io_regions[PCI_NUM_REGIONS];
> +    AddressSpace bus_master_as;
> +    MemoryRegion bus_master_container_region;
> +    MemoryRegion bus_master_enable_region;
> +
> +    /* do not access the following fields */
> +    PCIConfigReadFunc *config_read;
> +    PCIConfigWriteFunc *config_write;
> +
> +    /* Legacy PCI VGA regions */
> +    MemoryRegion *vga_regions[QEMU_PCI_VGA_NUM_REGIONS];
> +    bool has_vga;
> +
> +    /* Current IRQ levels.  Used internally by the generic PCI code.  */
> +    uint8_t irq_state;
> +
> +    /* Capability bits */
> +    uint32_t cap_present;
> +
> +    /* Offset of MSI-X capability in config space */
> +    uint8_t msix_cap;
> +
> +    /* MSI-X entries */
> +    int msix_entries_nr;
> +
> +    /* Space to store MSIX table & pending bit array */
> +    uint8_t *msix_table;
> +    uint8_t *msix_pba;
> +
> +    /* May be used by INTx or MSI during interrupt notification */
> +    void *irq_opaque;
> +
> +    MSITriggerFunc *msi_trigger;
> +    MSIPrepareMessageFunc *msi_prepare_message;
> +    MSIxPrepareMessageFunc *msix_prepare_message;
> +
> +    /* MemoryRegion container for msix exclusive BAR setup */
> +    MemoryRegion msix_exclusive_bar;
> +    /* Memory Regions for MSIX table and pending bit entries. */
> +    MemoryRegion msix_table_mmio;
> +    MemoryRegion msix_pba_mmio;
> +    /* Reference-count for entries actually in use by driver. */
> +    unsigned *msix_entry_used;
> +    /* MSIX function mask set or MSIX disabled */
> +    bool msix_function_masked;
> +    /* Version id needed for VMState */
> +    int32_t version_id;
> +
> +    /* Offset of MSI capability in config space */
> +    uint8_t msi_cap;
> +
> +    /* PCI Express */
> +    PCIExpressDevice exp;
> +
> +    /* SHPC */
> +    SHPCDevice *shpc;
> +
> +    /* Location of option rom */
> +    char *romfile;
> +    uint32_t romsize;
> +    bool has_rom;
> +    MemoryRegion rom;
> +    uint32_t rom_bar;
> +
> +    /* INTx routing notifier */
> +    PCIINTxRoutingNotifier intx_routing_notifier;
> +
> +    /* MSI-X notifiers */
> +    MSIVectorUseNotifier msix_vector_use_notifier;
> +    MSIVectorReleaseNotifier msix_vector_release_notifier;
> +    MSIVectorPollNotifier msix_vector_poll_notifier;
> +
> +    /* ID of standby device in net_failover pair */
> +    char *failover_pair_id;
> +    uint32_t acpi_index;
> +};
> +
> +static inline int pci_intx(PCIDevice *pci_dev)
> +{
> +    return pci_get_byte(pci_dev->config + PCI_INTERRUPT_PIN) - 1;
> +}
> +
> +static inline int pci_is_cxl(const PCIDevice *d)
> +{
> +    return d->cap_present & QEMU_PCIE_CAP_CXL;
> +}
> +
> +static inline int pci_is_express(const PCIDevice *d)
> +{
> +    return d->cap_present & QEMU_PCI_CAP_EXPRESS;
> +}
> +
> +static inline int pci_is_express_downstream_port(const PCIDevice *d)
> +{
> +    uint8_t type;
> +
> +    if (!pci_is_express(d) || !d->exp.exp_cap) {
> +        return 0;
> +    }
> +
> +    type = pcie_cap_get_type(d);
> +
> +    return type == PCI_EXP_TYPE_DOWNSTREAM || type == PCI_EXP_TYPE_ROOT_PORT;
> +}
> +
> +static inline int pci_is_vf(const PCIDevice *d)
> +{
> +    return d->exp.sriov_vf.pf != NULL;
> +}
> +
> +static inline uint32_t pci_config_size(const PCIDevice *d)
> +{
> +    return pci_is_express(d) ? PCIE_CONFIG_SPACE_SIZE : PCI_CONFIG_SPACE_SIZE;
> +}
> +
> +static inline uint16_t pci_get_bdf(PCIDevice *dev)
> +{
> +    return PCI_BUILD_BDF(pci_bus_num(pci_get_bus(dev)), dev->devfn);
> +}
> +
> +uint16_t pci_requester_id(PCIDevice *dev);
> +
> +/* DMA access functions */
> +static inline AddressSpace *pci_get_address_space(PCIDevice *dev)
> +{
> +    return &dev->bus_master_as;
> +}
> +
> +/**
> + * pci_dma_rw: Read from or write to an address space from PCI device.
> + *
> + * Return a MemTxResult indicating whether the operation succeeded
> + * or failed (eg unassigned memory, device rejected the transaction,
> + * IOMMU fault).
> + *
> + * @dev: #PCIDevice doing the memory access
> + * @addr: address within the #PCIDevice address space
> + * @buf: buffer with the data transferred
> + * @len: the number of bytes to read or write
> + * @dir: indicates the transfer direction
> + */
> +static inline MemTxResult pci_dma_rw(PCIDevice *dev, dma_addr_t addr,
> +                                     void *buf, dma_addr_t len,
> +                                     DMADirection dir, MemTxAttrs attrs)
> +{
> +    return dma_memory_rw(pci_get_address_space(dev), addr, buf, len,
> +                         dir, attrs);
> +}
> +
> +/**
> + * pci_dma_read: Read from an address space from PCI device.
> + *
> + * Return a MemTxResult indicating whether the operation succeeded
> + * or failed (eg unassigned memory, device rejected the transaction,
> + * IOMMU fault).  Called within RCU critical section.
> + *
> + * @dev: #PCIDevice doing the memory access
> + * @addr: address within the #PCIDevice address space
> + * @buf: buffer with the data transferred
> + * @len: length of the data transferred
> + */
> +static inline MemTxResult pci_dma_read(PCIDevice *dev, dma_addr_t addr,
> +                                       void *buf, dma_addr_t len)
> +{
> +    return pci_dma_rw(dev, addr, buf, len,
> +                      DMA_DIRECTION_TO_DEVICE, MEMTXATTRS_UNSPECIFIED);
> +}
> +
> +/**
> + * pci_dma_write: Write to address space from PCI device.
> + *
> + * Return a MemTxResult indicating whether the operation succeeded
> + * or failed (eg unassigned memory, device rejected the transaction,
> + * IOMMU fault).
> + *
> + * @dev: #PCIDevice doing the memory access
> + * @addr: address within the #PCIDevice address space
> + * @buf: buffer with the data transferred
> + * @len: the number of bytes to write
> + */
> +static inline MemTxResult pci_dma_write(PCIDevice *dev, dma_addr_t addr,
> +                                        const void *buf, dma_addr_t len)
> +{
> +    return pci_dma_rw(dev, addr, (void *) buf, len,
> +                      DMA_DIRECTION_FROM_DEVICE, MEMTXATTRS_UNSPECIFIED);
> +}
> +
> +#define PCI_DMA_DEFINE_LDST(_l, _s, _bits) \
> +    static inline MemTxResult ld##_l##_pci_dma(PCIDevice *dev, \
> +                                               dma_addr_t addr, \
> +                                               uint##_bits##_t *val, \
> +                                               MemTxAttrs attrs) \
> +    { \
> +        return ld##_l##_dma(pci_get_address_space(dev), addr, val, attrs); \
> +    } \
> +    static inline MemTxResult st##_s##_pci_dma(PCIDevice *dev, \
> +                                               dma_addr_t addr, \
> +                                               uint##_bits##_t val, \
> +                                               MemTxAttrs attrs) \
> +    { \
> +        return st##_s##_dma(pci_get_address_space(dev), addr, val, attrs); \
> +    }
> +
> +PCI_DMA_DEFINE_LDST(ub, b, 8);
> +PCI_DMA_DEFINE_LDST(uw_le, w_le, 16)
> +PCI_DMA_DEFINE_LDST(l_le, l_le, 32);
> +PCI_DMA_DEFINE_LDST(q_le, q_le, 64);
> +PCI_DMA_DEFINE_LDST(uw_be, w_be, 16)
> +PCI_DMA_DEFINE_LDST(l_be, l_be, 32);
> +PCI_DMA_DEFINE_LDST(q_be, q_be, 64);
> +
> +#undef PCI_DMA_DEFINE_LDST
> +
> +/**
> + * pci_dma_map: Map device PCI address space range into host virtual address
> + * @dev: #PCIDevice to be accessed
> + * @addr: address within that device's address space
> + * @plen: pointer to length of buffer; updated on return to indicate
> + *        if only a subset of the requested range has been mapped
> + * @dir: indicates the transfer direction
> + *
> + * Return: A host pointer, or %NULL if the resources needed to
> + *         perform the mapping are exhausted (in that case *@plen
> + *         is set to zero).
> + */
> +static inline void *pci_dma_map(PCIDevice *dev, dma_addr_t addr,
> +                                dma_addr_t *plen, DMADirection dir)
> +{
> +    void *buf;
> +
> +    buf = dma_memory_map(pci_get_address_space(dev), addr, plen, dir,
> +                         MEMTXATTRS_UNSPECIFIED);
> +    return buf;
> +}
> +
> +static inline void pci_dma_unmap(PCIDevice *dev, void *buffer, dma_addr_t len,
> +                                 DMADirection dir, dma_addr_t access_len)
> +{
> +    dma_memory_unmap(pci_get_address_space(dev), buffer, len, dir, access_len);
> +}
> +
> +static inline void pci_dma_sglist_init(QEMUSGList *qsg, PCIDevice *dev,
> +                                       int alloc_hint)
> +{
> +    qemu_sglist_init(qsg, DEVICE(dev), alloc_hint, pci_get_address_space(dev));
> +}
> +
> +extern const VMStateDescription vmstate_pci_device;
> +
> +#define VMSTATE_PCI_DEVICE(_field, _state) {                         \
> +    .name       = (stringify(_field)),                               \
> +    .size       = sizeof(PCIDevice),                                 \
> +    .vmsd       = &vmstate_pci_device,                               \
> +    .flags      = VMS_STRUCT,                                        \
> +    .offset     = vmstate_offset_value(_state, _field, PCIDevice),   \
> +}
> +
> +#define VMSTATE_PCI_DEVICE_POINTER(_field, _state) {                 \
> +    .name       = (stringify(_field)),                               \
> +    .size       = sizeof(PCIDevice),                                 \
> +    .vmsd       = &vmstate_pci_device,                               \
> +    .flags      = VMS_STRUCT | VMS_POINTER,                          \
> +    .offset     = vmstate_offset_pointer(_state, _field, PCIDevice), \
> +}
> +
> +#endif
> diff --git a/include/hw/pci/pcie_port.h b/include/hw/pci/pcie_port.h
> index 7b8193061a..5bf420a122 100644
> --- a/include/hw/pci/pcie_port.h
> +++ b/include/hw/pci/pcie_port.h
> @@ -23,6 +23,7 @@
>  
>  #include "hw/pci/pci_bridge.h"
>  #include "hw/pci/pci_bus.h"
> +#include "hw/pci/pci_device.h"
>  #include "qom/object.h"
>  
>  #define TYPE_PCIE_PORT "pcie-port"
> diff --git a/include/hw/pci/shpc.h b/include/hw/pci/shpc.h
> index d5683b7399..89c7a3b7fa 100644
> --- a/include/hw/pci/shpc.h
> +++ b/include/hw/pci/shpc.h
> @@ -3,7 +3,7 @@
>  
>  #include "exec/memory.h"
>  #include "hw/hotplug.h"
> -#include "hw/pci/pci.h"
> +#include "hw/pci/pci_device.h"
>  #include "migration/vmstate.h"
>  
>  struct SHPCDevice {
> diff --git a/include/hw/remote/iohub.h b/include/hw/remote/iohub.h
> index 0bf98e0d78..6a8444f9a9 100644
> --- a/include/hw/remote/iohub.h
> +++ b/include/hw/remote/iohub.h
> @@ -11,7 +11,7 @@
>  #ifndef REMOTE_IOHUB_H
>  #define REMOTE_IOHUB_H
>  
> -#include "hw/pci/pci.h"
> +#include "hw/pci/pci_device.h"
>  #include "qemu/event_notifier.h"
>  #include "qemu/thread-posix.h"
>  #include "hw/remote/mpqemu-link.h"
> diff --git a/include/hw/remote/proxy.h b/include/hw/remote/proxy.h
> index 741def71f1..0cfd9665be 100644
> --- a/include/hw/remote/proxy.h
> +++ b/include/hw/remote/proxy.h
> @@ -9,7 +9,7 @@
>  #ifndef PROXY_H
>  #define PROXY_H
>  
> -#include "hw/pci/pci.h"
> +#include "hw/pci/pci_device.h"
>  #include "io/channel.h"
>  #include "hw/remote/proxy-memory-listener.h"
>  #include "qemu/event_notifier.h"
> diff --git a/include/hw/sd/sdhci.h b/include/hw/sd/sdhci.h
> index 01a64c5442..8460d6462b 100644
> --- a/include/hw/sd/sdhci.h
> +++ b/include/hw/sd/sdhci.h
> @@ -25,7 +25,7 @@
>  #ifndef SDHCI_H
>  #define SDHCI_H
>  
> -#include "hw/pci/pci.h"
> +#include "hw/pci/pci_device.h"
>  #include "hw/sysbus.h"
>  #include "hw/sd/sd.h"
>  #include "qom/object.h"
> diff --git a/include/hw/southbridge/piix.h b/include/hw/southbridge/piix.h
> index 2693778b23..0bf48e936d 100644
> --- a/include/hw/southbridge/piix.h
> +++ b/include/hw/southbridge/piix.h
> @@ -12,8 +12,7 @@
>  #ifndef HW_SOUTHBRIDGE_PIIX_H
>  #define HW_SOUTHBRIDGE_PIIX_H
>  
> -#include "hw/pci/pci.h"
> -#include "qom/object.h"
> +#include "hw/pci/pci_device.h"
>  
>  /* PIRQRC[A:D]: PIRQx Route Control Registers */
>  #define PIIX_PIRQCA 0x60
> diff --git a/include/hw/xen/xen_common.h b/include/hw/xen/xen_common.h
> index 77ce17d8a4..9a13a756ae 100644
> --- a/include/hw/xen/xen_common.h
> +++ b/include/hw/xen/xen_common.h
> @@ -15,7 +15,7 @@
>  #include "hw/xen/interface/io/xenbus.h"
>  
>  #include "hw/xen/xen.h"
> -#include "hw/pci/pci.h"
> +#include "hw/pci/pci_device.h"
>  #include "hw/xen/trace.h"
>  
>  extern xc_interface *xen_xc;
> diff --git a/hw/acpi/erst.c b/hw/acpi/erst.c
> index aefcc03ad6..35007d8017 100644
> --- a/hw/acpi/erst.c
> +++ b/hw/acpi/erst.c
> @@ -14,7 +14,7 @@
>  #include "hw/qdev-core.h"
>  #include "exec/memory.h"
>  #include "qom/object.h"
> -#include "hw/pci/pci.h"
> +#include "hw/pci/pci_device.h"
>  #include "qom/object_interfaces.h"
>  #include "qemu/error-report.h"
>  #include "migration/vmstate.h"
> diff --git a/hw/audio/ac97.c b/hw/audio/ac97.c
> index be2dd701a4..364cdfa733 100644
> --- a/hw/audio/ac97.c
> +++ b/hw/audio/ac97.c
> @@ -20,7 +20,7 @@
>  #include "qemu/osdep.h"
>  #include "hw/audio/soundhw.h"
>  #include "audio/audio.h"
> -#include "hw/pci/pci.h"
> +#include "hw/pci/pci_device.h"
>  #include "hw/qdev-properties.h"
>  #include "migration/vmstate.h"
>  #include "qemu/module.h"
> diff --git a/hw/audio/es1370.c b/hw/audio/es1370.c
> index 6904589814..54cc19a637 100644
> --- a/hw/audio/es1370.c
> +++ b/hw/audio/es1370.c
> @@ -29,7 +29,7 @@
>  #include "qemu/osdep.h"
>  #include "hw/audio/soundhw.h"
>  #include "audio/audio.h"
> -#include "hw/pci/pci.h"
> +#include "hw/pci/pci_device.h"
>  #include "migration/vmstate.h"
>  #include "qemu/module.h"
>  #include "sysemu/dma.h"
> diff --git a/hw/audio/via-ac97.c b/hw/audio/via-ac97.c
> index 6d556f74fc..d1a856f63d 100644
> --- a/hw/audio/via-ac97.c
> +++ b/hw/audio/via-ac97.c
> @@ -11,7 +11,7 @@
>  
>  #include "qemu/osdep.h"
>  #include "hw/isa/vt82c686.h"
> -#include "hw/pci/pci.h"
> +#include "hw/pci/pci_device.h"
>  
>  static void via_ac97_realize(PCIDevice *pci_dev, Error **errp)
>  {
> diff --git a/hw/char/serial-pci-multi.c b/hw/char/serial-pci-multi.c
> index 3a9f96c2d1..f18b8dcce5 100644
> --- a/hw/char/serial-pci-multi.c
> +++ b/hw/char/serial-pci-multi.c
> @@ -31,7 +31,7 @@
>  #include "qapi/error.h"
>  #include "hw/char/serial.h"
>  #include "hw/irq.h"
> -#include "hw/pci/pci.h"
> +#include "hw/pci/pci_device.h"
>  #include "hw/qdev-properties.h"
>  #include "hw/qdev-properties-system.h"
>  #include "migration/vmstate.h"
> diff --git a/hw/char/serial-pci.c b/hw/char/serial-pci.c
> index 93d6f99244..801b769aba 100644
> --- a/hw/char/serial-pci.c
> +++ b/hw/char/serial-pci.c
> @@ -30,7 +30,7 @@
>  #include "qemu/module.h"
>  #include "hw/char/serial.h"
>  #include "hw/irq.h"
> -#include "hw/pci/pci.h"
> +#include "hw/pci/pci_device.h"
>  #include "hw/qdev-properties.h"
>  #include "migration/vmstate.h"
>  #include "qom/object.h"
> diff --git a/hw/core/qdev-properties-system.c b/hw/core/qdev-properties-system.c
> index a91f60567a..fccf41f4cd 100644
> --- a/hw/core/qdev-properties-system.c
> +++ b/hw/core/qdev-properties-system.c
> @@ -32,6 +32,7 @@
>  #include "sysemu/blockdev.h"
>  #include "net/net.h"
>  #include "hw/pci/pci.h"
> +#include "hw/pci/pcie.h"
>  #include "util/block-helpers.h"
>  
>  static bool check_prop_still_unset(Object *obj, const char *name,
> diff --git a/hw/display/bochs-display.c b/hw/display/bochs-display.c
> index 8ed734b195..e7ec268184 100644
> --- a/hw/display/bochs-display.c
> +++ b/hw/display/bochs-display.c
> @@ -8,7 +8,7 @@
>  #include "qemu/osdep.h"
>  #include "qemu/module.h"
>  #include "qemu/units.h"
> -#include "hw/pci/pci.h"
> +#include "hw/pci/pci_device.h"
>  #include "hw/qdev-properties.h"
>  #include "migration/vmstate.h"
>  #include "hw/display/bochs-vbe.h"
> diff --git a/hw/display/cirrus_vga.c b/hw/display/cirrus_vga.c
> index 6e8c747c46..55c32e3e40 100644
> --- a/hw/display/cirrus_vga.c
> +++ b/hw/display/cirrus_vga.c
> @@ -39,7 +39,7 @@
>  #include "sysemu/reset.h"
>  #include "qapi/error.h"
>  #include "trace.h"
> -#include "hw/pci/pci.h"
> +#include "hw/pci/pci_device.h"
>  #include "hw/qdev-properties.h"
>  #include "migration/vmstate.h"
>  #include "ui/pixel_ops.h"
> diff --git a/hw/display/sm501.c b/hw/display/sm501.c
> index 663c37e7f2..52e42585af 100644
> --- a/hw/display/sm501.c
> +++ b/hw/display/sm501.c
> @@ -32,7 +32,7 @@
>  #include "ui/console.h"
>  #include "hw/sysbus.h"
>  #include "migration/vmstate.h"
> -#include "hw/pci/pci.h"
> +#include "hw/pci/pci_device.h"
>  #include "hw/qdev-properties.h"
>  #include "hw/i2c/i2c.h"
>  #include "hw/display/i2c-ddc.h"
> diff --git a/hw/display/vga-pci.c b/hw/display/vga-pci.c
> index df23dbf3a0..b351b8f299 100644
> --- a/hw/display/vga-pci.c
> +++ b/hw/display/vga-pci.c
> @@ -25,7 +25,7 @@
>   */
>  
>  #include "qemu/osdep.h"
> -#include "hw/pci/pci.h"
> +#include "hw/pci/pci_device.h"
>  #include "hw/qdev-properties.h"
>  #include "migration/vmstate.h"
>  #include "vga_int.h"
> diff --git a/hw/display/vmware_vga.c b/hw/display/vmware_vga.c
> index 53949d2539..59ae7f74b8 100644
> --- a/hw/display/vmware_vga.c
> +++ b/hw/display/vmware_vga.c
> @@ -29,7 +29,7 @@
>  #include "qemu/log.h"
>  #include "hw/loader.h"
>  #include "trace.h"
> -#include "hw/pci/pci.h"
> +#include "hw/pci/pci_device.h"
>  #include "hw/qdev-properties.h"
>  #include "migration/vmstate.h"
>  #include "qom/object.h"
> diff --git a/hw/i386/xen/xen_pvdevice.c b/hw/i386/xen/xen_pvdevice.c
> index 1ea95fa601..e62e06622b 100644
> --- a/hw/i386/xen/xen_pvdevice.c
> +++ b/hw/i386/xen/xen_pvdevice.c
> @@ -32,7 +32,7 @@
>  #include "qemu/osdep.h"
>  #include "qapi/error.h"
>  #include "qemu/module.h"
> -#include "hw/pci/pci.h"
> +#include "hw/pci/pci_device.h"
>  #include "hw/qdev-properties.h"
>  #include "migration/vmstate.h"
>  #include "trace.h"
> diff --git a/hw/ipack/tpci200.c b/hw/ipack/tpci200.c
> index 1f764fc85b..6b3edbf017 100644
> --- a/hw/ipack/tpci200.c
> +++ b/hw/ipack/tpci200.c
> @@ -12,7 +12,7 @@
>  #include "qemu/units.h"
>  #include "hw/ipack/ipack.h"
>  #include "hw/irq.h"
> -#include "hw/pci/pci.h"
> +#include "hw/pci/pci_device.h"
>  #include "migration/vmstate.h"
>  #include "qemu/bitops.h"
>  #include "qemu/module.h"
> diff --git a/hw/ipmi/pci_ipmi_bt.c b/hw/ipmi/pci_ipmi_bt.c
> index b6e52730d3..633931b825 100644
> --- a/hw/ipmi/pci_ipmi_bt.c
> +++ b/hw/ipmi/pci_ipmi_bt.c
> @@ -25,7 +25,7 @@
>  #include "migration/vmstate.h"
>  #include "qapi/error.h"
>  #include "hw/ipmi/ipmi_bt.h"
> -#include "hw/pci/pci.h"
> +#include "hw/pci/pci_device.h"
>  #include "qom/object.h"
>  
>  #define TYPE_PCI_IPMI_BT "pci-ipmi-bt"
> diff --git a/hw/ipmi/pci_ipmi_kcs.c b/hw/ipmi/pci_ipmi_kcs.c
> index de13418862..1a581413c2 100644
> --- a/hw/ipmi/pci_ipmi_kcs.c
> +++ b/hw/ipmi/pci_ipmi_kcs.c
> @@ -25,7 +25,7 @@
>  #include "migration/vmstate.h"
>  #include "qapi/error.h"
>  #include "hw/ipmi/ipmi_kcs.h"
> -#include "hw/pci/pci.h"
> +#include "hw/pci/pci_device.h"
>  #include "qom/object.h"
>  
>  #define TYPE_PCI_IPMI_KCS "pci-ipmi-kcs"
> diff --git a/hw/isa/i82378.c b/hw/isa/i82378.c
> index 2a2ff05b93..e3322e03bf 100644
> --- a/hw/isa/i82378.c
> +++ b/hw/isa/i82378.c
> @@ -18,7 +18,7 @@
>   */
>  
>  #include "qemu/osdep.h"
> -#include "hw/pci/pci.h"
> +#include "hw/pci/pci_device.h"
>  #include "hw/irq.h"
>  #include "hw/intc/i8259.h"
>  #include "hw/timer/i8254.h"
> diff --git a/hw/mips/gt64xxx_pci.c b/hw/mips/gt64xxx_pci.c
> index 19d0d9889f..164866cf3e 100644
> --- a/hw/mips/gt64xxx_pci.c
> +++ b/hw/mips/gt64xxx_pci.c
> @@ -26,7 +26,7 @@
>  #include "qapi/error.h"
>  #include "qemu/units.h"
>  #include "qemu/log.h"
> -#include "hw/pci/pci.h"
> +#include "hw/pci/pci_device.h"
>  #include "hw/pci/pci_host.h"
>  #include "migration/vmstate.h"
>  #include "hw/intc/i8259.h"
> diff --git a/hw/misc/pci-testdev.c b/hw/misc/pci-testdev.c
> index 03845c8de3..49303134e4 100644
> --- a/hw/misc/pci-testdev.c
> +++ b/hw/misc/pci-testdev.c
> @@ -19,7 +19,7 @@
>   */
>  
>  #include "qemu/osdep.h"
> -#include "hw/pci/pci.h"
> +#include "hw/pci/pci_device.h"
>  #include "hw/qdev-properties.h"
>  #include "qemu/event_notifier.h"
>  #include "qemu/module.h"
> diff --git a/hw/misc/pvpanic-pci.c b/hw/misc/pvpanic-pci.c
> index 99cf7e2041..fbcaa50731 100644
> --- a/hw/misc/pvpanic-pci.c
> +++ b/hw/misc/pvpanic-pci.c
> @@ -20,7 +20,7 @@
>  #include "migration/vmstate.h"
>  #include "hw/misc/pvpanic.h"
>  #include "qom/object.h"
> -#include "hw/pci/pci.h"
> +#include "hw/pci/pci_device.h"
>  #include "standard-headers/linux/pvpanic.h"
>  
>  OBJECT_DECLARE_SIMPLE_TYPE(PVPanicPCIState, PVPANIC_PCI_DEVICE)
> diff --git a/hw/net/can/can_kvaser_pci.c b/hw/net/can/can_kvaser_pci.c
> index 94b3a534f8..2cd90cef1e 100644
> --- a/hw/net/can/can_kvaser_pci.c
> +++ b/hw/net/can/can_kvaser_pci.c
> @@ -37,7 +37,7 @@
>  #include "qapi/error.h"
>  #include "chardev/char.h"
>  #include "hw/irq.h"
> -#include "hw/pci/pci.h"
> +#include "hw/pci/pci_device.h"
>  #include "hw/qdev-properties.h"
>  #include "migration/vmstate.h"
>  #include "net/can_emu.h"
> diff --git a/hw/net/can/can_mioe3680_pci.c b/hw/net/can/can_mioe3680_pci.c
> index 29dc696f7c..b9918773b3 100644
> --- a/hw/net/can/can_mioe3680_pci.c
> +++ b/hw/net/can/can_mioe3680_pci.c
> @@ -33,7 +33,7 @@
>  #include "qapi/error.h"
>  #include "chardev/char.h"
>  #include "hw/irq.h"
> -#include "hw/pci/pci.h"
> +#include "hw/pci/pci_device.h"
>  #include "hw/qdev-properties.h"
>  #include "migration/vmstate.h"
>  #include "net/can_emu.h"
> diff --git a/hw/net/can/can_pcm3680_pci.c b/hw/net/can/can_pcm3680_pci.c
> index e8e57f4f33..8ef3e4659c 100644
> --- a/hw/net/can/can_pcm3680_pci.c
> +++ b/hw/net/can/can_pcm3680_pci.c
> @@ -33,7 +33,7 @@
>  #include "qapi/error.h"
>  #include "chardev/char.h"
>  #include "hw/irq.h"
> -#include "hw/pci/pci.h"
> +#include "hw/pci/pci_device.h"
>  #include "hw/qdev-properties.h"
>  #include "migration/vmstate.h"
>  #include "net/can_emu.h"
> diff --git a/hw/net/can/ctucan_pci.c b/hw/net/can/ctucan_pci.c
> index 50f4ea6cd6..ea079e2af5 100644
> --- a/hw/net/can/ctucan_pci.c
> +++ b/hw/net/can/ctucan_pci.c
> @@ -34,7 +34,7 @@
>  #include "qapi/error.h"
>  #include "chardev/char.h"
>  #include "hw/irq.h"
> -#include "hw/pci/pci.h"
> +#include "hw/pci/pci_device.h"
>  #include "hw/qdev-properties.h"
>  #include "migration/vmstate.h"
>  #include "net/can_emu.h"
> diff --git a/hw/net/e1000.c b/hw/net/e1000.c
> index e26e0a64c1..7efb8a4c52 100644
> --- a/hw/net/e1000.c
> +++ b/hw/net/e1000.c
> @@ -26,7 +26,7 @@
>  
>  
>  #include "qemu/osdep.h"
> -#include "hw/pci/pci.h"
> +#include "hw/pci/pci_device.h"
>  #include "hw/qdev-properties.h"
>  #include "migration/vmstate.h"
>  #include "net/eth.h"
> diff --git a/hw/net/e1000x_common.c b/hw/net/e1000x_common.c
> index a8d93870b5..2f43e8cd13 100644
> --- a/hw/net/e1000x_common.c
> +++ b/hw/net/e1000x_common.c
> @@ -24,7 +24,7 @@
>  
>  #include "qemu/osdep.h"
>  #include "qemu/units.h"
> -#include "hw/pci/pci.h"
> +#include "hw/pci/pci_device.h"
>  #include "net/net.h"
>  
>  #include "e1000x_common.h"
> diff --git a/hw/net/eepro100.c b/hw/net/eepro100.c
> index 679f52f80f..dc07984ae9 100644
> --- a/hw/net/eepro100.c
> +++ b/hw/net/eepro100.c
> @@ -42,7 +42,7 @@
>  
>  #include "qemu/osdep.h"
>  #include "qemu/units.h"
> -#include "hw/pci/pci.h"
> +#include "hw/pci/pci_device.h"
>  #include "hw/qdev-properties.h"
>  #include "migration/vmstate.h"
>  #include "net/net.h"
> diff --git a/hw/net/ne2000-pci.c b/hw/net/ne2000-pci.c
> index 9e5d10859a..edc6689d33 100644
> --- a/hw/net/ne2000-pci.c
> +++ b/hw/net/ne2000-pci.c
> @@ -24,7 +24,7 @@
>  
>  #include "qemu/osdep.h"
>  #include "hw/irq.h"
> -#include "hw/pci/pci.h"
> +#include "hw/pci/pci_device.h"
>  #include "hw/qdev-properties.h"
>  #include "migration/vmstate.h"
>  #include "ne2000.h"
> diff --git a/hw/net/net_tx_pkt.c b/hw/net/net_tx_pkt.c
> index 1cb1125d9f..2533ea2700 100644
> --- a/hw/net/net_tx_pkt.c
> +++ b/hw/net/net_tx_pkt.c
> @@ -21,7 +21,7 @@
>  #include "net/checksum.h"
>  #include "net/tap.h"
>  #include "net/net.h"
> -#include "hw/pci/pci.h"
> +#include "hw/pci/pci_device.h"
>  
>  enum {
>      NET_TX_PKT_VHDR_FRAG = 0,
> diff --git a/hw/net/pcnet-pci.c b/hw/net/pcnet-pci.c
> index 95d27102aa..96a302c141 100644
> --- a/hw/net/pcnet-pci.c
> +++ b/hw/net/pcnet-pci.c
> @@ -29,7 +29,7 @@
>  
>  #include "qemu/osdep.h"
>  #include "hw/irq.h"
> -#include "hw/pci/pci.h"
> +#include "hw/pci/pci_device.h"
>  #include "hw/qdev-properties.h"
>  #include "migration/vmstate.h"
>  #include "net/net.h"
> diff --git a/hw/net/rocker/rocker.c b/hw/net/rocker/rocker.c
> index 281d43e6cf..cf54ddf49d 100644
> --- a/hw/net/rocker/rocker.c
> +++ b/hw/net/rocker/rocker.c
> @@ -16,7 +16,7 @@
>   */
>  
>  #include "qemu/osdep.h"
> -#include "hw/pci/pci.h"
> +#include "hw/pci/pci_device.h"
>  #include "hw/qdev-properties.h"
>  #include "hw/qdev-properties-system.h"
>  #include "migration/vmstate.h"
> diff --git a/hw/net/rocker/rocker_desc.c b/hw/net/rocker/rocker_desc.c
> index 01845f1157..f3068c9250 100644
> --- a/hw/net/rocker/rocker_desc.c
> +++ b/hw/net/rocker/rocker_desc.c
> @@ -16,7 +16,7 @@
>  
>  #include "qemu/osdep.h"
>  #include "net/net.h"
> -#include "hw/pci/pci.h"
> +#include "hw/pci/pci_device.h"
>  
>  #include "rocker.h"
>  #include "rocker_hw.h"
> diff --git a/hw/net/rtl8139.c b/hw/net/rtl8139.c
> index 700b1b66b6..5a5aaf868d 100644
> --- a/hw/net/rtl8139.c
> +++ b/hw/net/rtl8139.c
> @@ -53,7 +53,7 @@
>  #include "qemu/osdep.h"
>  #include <zlib.h>
>  
> -#include "hw/pci/pci.h"
> +#include "hw/pci/pci_device.h"
>  #include "hw/qdev-properties.h"
>  #include "migration/vmstate.h"
>  #include "sysemu/dma.h"
> diff --git a/hw/net/sungem.c b/hw/net/sungem.c
> index 3684a4d733..eb01520790 100644
> --- a/hw/net/sungem.c
> +++ b/hw/net/sungem.c
> @@ -8,7 +8,7 @@
>   */
>  
>  #include "qemu/osdep.h"
> -#include "hw/pci/pci.h"
> +#include "hw/pci/pci_device.h"
>  #include "hw/qdev-properties.h"
>  #include "migration/vmstate.h"
>  #include "qemu/log.h"
> diff --git a/hw/net/sunhme.c b/hw/net/sunhme.c
> index fc34905f87..1f3d8011ae 100644
> --- a/hw/net/sunhme.c
> +++ b/hw/net/sunhme.c
> @@ -23,7 +23,7 @@
>   */
>  
>  #include "qemu/osdep.h"
> -#include "hw/pci/pci.h"
> +#include "hw/pci/pci_device.h"
>  #include "hw/qdev-properties.h"
>  #include "migration/vmstate.h"
>  #include "hw/net/mii.h"
> diff --git a/hw/net/tulip.c b/hw/net/tulip.c
> index c2b3b1bdfa..915e5fb595 100644
> --- a/hw/net/tulip.c
> +++ b/hw/net/tulip.c
> @@ -9,7 +9,7 @@
>  #include "qemu/osdep.h"
>  #include "qemu/log.h"
>  #include "hw/irq.h"
> -#include "hw/pci/pci.h"
> +#include "hw/pci/pci_device.h"
>  #include "hw/qdev-properties.h"
>  #include "hw/nvram/eeprom93xx.h"
>  #include "migration/vmstate.h"
> diff --git a/hw/net/virtio-net.c b/hw/net/virtio-net.c
> index aba12759d5..ee0af784f9 100644
> --- a/hw/net/virtio-net.c
> +++ b/hw/net/virtio-net.c
> @@ -42,7 +42,7 @@
>  #include "sysemu/sysemu.h"
>  #include "trace.h"
>  #include "monitor/qdev.h"
> -#include "hw/pci/pci.h"
> +#include "hw/pci/pci_device.h"
>  #include "net_rx_pkt.h"
>  #include "hw/virtio/vhost.h"
>  #include "sysemu/qtest.h"
> diff --git a/hw/pci-host/bonito.c b/hw/pci-host/bonito.c
> index a57e81e3a9..f04f3ad668 100644
> --- a/hw/pci-host/bonito.c
> +++ b/hw/pci-host/bonito.c
> @@ -42,7 +42,7 @@
>  #include "qemu/units.h"
>  #include "qapi/error.h"
>  #include "qemu/error-report.h"
> -#include "hw/pci/pci.h"
> +#include "hw/pci/pci_device.h"
>  #include "hw/irq.h"
>  #include "hw/mips/mips.h"
>  #include "hw/pci/pci_host.h"
> diff --git a/hw/pci-host/dino.c b/hw/pci-host/dino.c
> index f257c24e64..e8eaebca54 100644
> --- a/hw/pci-host/dino.c
> +++ b/hw/pci-host/dino.c
> @@ -15,7 +15,7 @@
>  #include "qemu/units.h"
>  #include "qapi/error.h"
>  #include "hw/irq.h"
> -#include "hw/pci/pci.h"
> +#include "hw/pci/pci_device.h"
>  #include "hw/pci/pci_bus.h"
>  #include "hw/qdev-properties.h"
>  #include "hw/pci-host/dino.h"
> diff --git a/hw/pci-host/grackle.c b/hw/pci-host/grackle.c
> index 95945ac0f4..8cf318cb80 100644
> --- a/hw/pci-host/grackle.c
> +++ b/hw/pci-host/grackle.c
> @@ -25,7 +25,7 @@
>  
>  #include "qemu/osdep.h"
>  #include "hw/qdev-properties.h"
> -#include "hw/pci/pci.h"
> +#include "hw/pci/pci_device.h"
>  #include "hw/irq.h"
>  #include "qapi/error.h"
>  #include "qemu/module.h"
> diff --git a/hw/pci-host/mv64361.c b/hw/pci-host/mv64361.c
> index cc9c4d6d3b..015b92bd5f 100644
> --- a/hw/pci-host/mv64361.c
> +++ b/hw/pci-host/mv64361.c
> @@ -13,7 +13,7 @@
>  #include "qapi/error.h"
>  #include "hw/hw.h"
>  #include "hw/sysbus.h"
> -#include "hw/pci/pci.h"
> +#include "hw/pci/pci_device.h"
>  #include "hw/pci/pci_host.h"
>  #include "hw/irq.h"
>  #include "hw/intc/i8259.h"
> diff --git a/hw/pci-host/ppce500.c b/hw/pci-host/ppce500.c
> index 89c1b53dd7..568849e930 100644
> --- a/hw/pci-host/ppce500.c
> +++ b/hw/pci-host/ppce500.c
> @@ -19,7 +19,7 @@
>  #include "hw/ppc/e500-ccsr.h"
>  #include "hw/qdev-properties.h"
>  #include "migration/vmstate.h"
> -#include "hw/pci/pci.h"
> +#include "hw/pci/pci_device.h"
>  #include "hw/pci/pci_host.h"
>  #include "qemu/bswap.h"
>  #include "qemu/module.h"
> diff --git a/hw/pci-host/raven.c b/hw/pci-host/raven.c
> index 7a105e4a63..2c96ddf8fe 100644
> --- a/hw/pci-host/raven.c
> +++ b/hw/pci-host/raven.c
> @@ -28,7 +28,7 @@
>  #include "qemu/units.h"
>  #include "qemu/log.h"
>  #include "qapi/error.h"
> -#include "hw/pci/pci.h"
> +#include "hw/pci/pci_device.h"
>  #include "hw/pci/pci_bus.h"
>  #include "hw/pci/pci_host.h"
>  #include "hw/qdev-properties.h"
> diff --git a/hw/pci-host/sh_pci.c b/hw/pci-host/sh_pci.c
> index 719d6ca2a6..77e7bbc65f 100644
> --- a/hw/pci-host/sh_pci.c
> +++ b/hw/pci-host/sh_pci.c
> @@ -26,7 +26,7 @@
>  #include "hw/sysbus.h"
>  #include "hw/sh4/sh.h"
>  #include "hw/irq.h"
> -#include "hw/pci/pci.h"
> +#include "hw/pci/pci_device.h"
>  #include "hw/pci/pci_host.h"
>  #include "qemu/bswap.h"
>  #include "qemu/module.h"
> diff --git a/hw/pci-host/uninorth.c b/hw/pci-host/uninorth.c
> index aebd44d265..8f7a300a32 100644
> --- a/hw/pci-host/uninorth.c
> +++ b/hw/pci-host/uninorth.c
> @@ -26,7 +26,7 @@
>  #include "hw/irq.h"
>  #include "hw/qdev-properties.h"
>  #include "qemu/module.h"
> -#include "hw/pci/pci.h"
> +#include "hw/pci/pci_device.h"
>  #include "hw/pci/pci_host.h"
>  #include "hw/pci-host/uninorth.h"
>  #include "trace.h"
> diff --git a/hw/pci-host/versatile.c b/hw/pci-host/versatile.c
> index f66384fa02..0d50ea4cc0 100644
> --- a/hw/pci-host/versatile.c
> +++ b/hw/pci-host/versatile.c
> @@ -12,7 +12,7 @@
>  #include "hw/sysbus.h"
>  #include "migration/vmstate.h"
>  #include "hw/irq.h"
> -#include "hw/pci/pci.h"
> +#include "hw/pci/pci_device.h"
>  #include "hw/pci/pci_bus.h"
>  #include "hw/pci/pci_host.h"
>  #include "hw/qdev-properties.h"
> diff --git a/hw/pci/pcie_host.c b/hw/pci/pcie_host.c
> index 5abbe83220..3717e1a086 100644
> --- a/hw/pci/pcie_host.c
> +++ b/hw/pci/pcie_host.c
> @@ -20,7 +20,7 @@
>   */
>  
>  #include "qemu/osdep.h"
> -#include "hw/pci/pci.h"
> +#include "hw/pci/pci_device.h"
>  #include "hw/pci/pcie_host.h"
>  #include "qemu/module.h"
>  
> diff --git a/hw/pci/pcie_sriov.c b/hw/pci/pcie_sriov.c
> index 8e3faf1f59..f0bd72e069 100644
> --- a/hw/pci/pcie_sriov.c
> +++ b/hw/pci/pcie_sriov.c
> @@ -11,7 +11,7 @@
>   */
>  
>  #include "qemu/osdep.h"
> -#include "hw/pci/pci.h"
> +#include "hw/pci/pci_device.h"
>  #include "hw/pci/pcie.h"
>  #include "hw/pci/pci_bus.h"
>  #include "hw/qdev-properties.h"
> diff --git a/hw/pci/slotid_cap.c b/hw/pci/slotid_cap.c
> index 36d021b4a6..8372d05d9e 100644
> --- a/hw/pci/slotid_cap.c
> +++ b/hw/pci/slotid_cap.c
> @@ -1,6 +1,6 @@
>  #include "qemu/osdep.h"
>  #include "hw/pci/slotid_cap.h"
> -#include "hw/pci/pci.h"
> +#include "hw/pci/pci_device.h"
>  #include "qemu/error-report.h"
>  #include "qapi/error.h"
>  
> diff --git a/hw/ppc/ppc440_pcix.c b/hw/ppc/ppc440_pcix.c
> index 788d25514a..f10f93c533 100644
> --- a/hw/ppc/ppc440_pcix.c
> +++ b/hw/ppc/ppc440_pcix.c
> @@ -26,7 +26,7 @@
>  #include "hw/irq.h"
>  #include "hw/ppc/ppc.h"
>  #include "hw/ppc/ppc4xx.h"
> -#include "hw/pci/pci.h"
> +#include "hw/pci/pci_device.h"
>  #include "hw/pci/pci_host.h"
>  #include "trace.h"
>  #include "qom/object.h"
> diff --git a/hw/ppc/ppc4xx_pci.c b/hw/ppc/ppc4xx_pci.c
> index 8642b96455..1d4a50fa7c 100644
> --- a/hw/ppc/ppc4xx_pci.c
> +++ b/hw/ppc/ppc4xx_pci.c
> @@ -29,7 +29,7 @@
>  #include "migration/vmstate.h"
>  #include "qemu/module.h"
>  #include "sysemu/reset.h"
> -#include "hw/pci/pci.h"
> +#include "hw/pci/pci_device.h"
>  #include "hw/pci/pci_host.h"
>  #include "trace.h"
>  #include "qom/object.h"
> diff --git a/hw/ppc/spapr_pci_vfio.c b/hw/ppc/spapr_pci_vfio.c
> index 2a76b4e0b5..d8aeee0b7e 100644
> --- a/hw/ppc/spapr_pci_vfio.c
> +++ b/hw/ppc/spapr_pci_vfio.c
> @@ -22,6 +22,7 @@
>  #include "hw/ppc/spapr.h"
>  #include "hw/pci-host/spapr.h"
>  #include "hw/pci/msix.h"
> +#include "hw/pci/pci_device.h"
>  #include "hw/vfio/vfio.h"
>  #include "qemu/error-report.h"
>  
> diff --git a/hw/rdma/rdma_utils.c b/hw/rdma/rdma_utils.c
> index 77008552f4..c948baf052 100644
> --- a/hw/rdma/rdma_utils.c
> +++ b/hw/rdma/rdma_utils.c
> @@ -14,7 +14,7 @@
>   */
>  
>  #include "qemu/osdep.h"
> -#include "hw/pci/pci.h"
> +#include "hw/pci/pci_device.h"
>  #include "trace.h"
>  #include "rdma_utils.h"
>  
> diff --git a/hw/s390x/s390-pci-inst.c b/hw/s390x/s390-pci-inst.c
> index 7cc4bcf850..f81e6810b2 100644
> --- a/hw/s390x/s390-pci-inst.c
> +++ b/hw/s390x/s390-pci-inst.c
> @@ -16,6 +16,7 @@
>  #include "exec/memory-internal.h"
>  #include "qemu/error-report.h"
>  #include "sysemu/hw_accel.h"
> +#include "hw/pci/pci_device.h"
>  #include "hw/s390x/s390-pci-inst.h"
>  #include "hw/s390x/s390-pci-bus.h"
>  #include "hw/s390x/s390-pci-kvm.h"
> diff --git a/hw/scsi/esp-pci.c b/hw/scsi/esp-pci.c
> index 1792f84cea..2f7f11e70b 100644
> --- a/hw/scsi/esp-pci.c
> +++ b/hw/scsi/esp-pci.c
> @@ -24,7 +24,7 @@
>   */
>  
>  #include "qemu/osdep.h"
> -#include "hw/pci/pci.h"
> +#include "hw/pci/pci_device.h"
>  #include "hw/irq.h"
>  #include "hw/nvram/eeprom93xx.h"
>  #include "hw/scsi/esp.h"
> diff --git a/hw/scsi/lsi53c895a.c b/hw/scsi/lsi53c895a.c
> index 50979640c3..af93557a9a 100644
> --- a/hw/scsi/lsi53c895a.c
> +++ b/hw/scsi/lsi53c895a.c
> @@ -16,7 +16,7 @@
>  #include "qemu/osdep.h"
>  
>  #include "hw/irq.h"
> -#include "hw/pci/pci.h"
> +#include "hw/pci/pci_device.h"
>  #include "hw/scsi/scsi.h"
>  #include "migration/vmstate.h"
>  #include "sysemu/dma.h"
> diff --git a/hw/smbios/smbios.c b/hw/smbios/smbios.c
> index b4243de735..4869566cf5 100644
> --- a/hw/smbios/smbios.c
> +++ b/hw/smbios/smbios.c
> @@ -28,6 +28,7 @@
>  #include "hw/loader.h"
>  #include "hw/boards.h"
>  #include "hw/pci/pci_bus.h"
> +#include "hw/pci/pci_device.h"
>  #include "smbios_build.h"
>  
>  /* legacy structures and constants for <= 2.0 machines */
> diff --git a/hw/usb/hcd-ohci-pci.c b/hw/usb/hcd-ohci-pci.c
> index 8e1146b862..6b630d35a7 100644
> --- a/hw/usb/hcd-ohci-pci.c
> +++ b/hw/usb/hcd-ohci-pci.c
> @@ -23,7 +23,7 @@
>  #include "qemu/timer.h"
>  #include "hw/usb.h"
>  #include "migration/vmstate.h"
> -#include "hw/pci/pci.h"
> +#include "hw/pci/pci_device.h"
>  #include "hw/sysbus.h"
>  #include "hw/qdev-dma.h"
>  #include "hw/qdev-properties.h"
> diff --git a/hw/watchdog/wdt_i6300esb.c b/hw/watchdog/wdt_i6300esb.c
> index 5693ec6a09..54c167cd35 100644
> --- a/hw/watchdog/wdt_i6300esb.c
> +++ b/hw/watchdog/wdt_i6300esb.c
> @@ -24,7 +24,7 @@
>  #include "qemu/module.h"
>  #include "qemu/timer.h"
>  #include "sysemu/watchdog.h"
> -#include "hw/pci/pci.h"
> +#include "hw/pci/pci_device.h"
>  #include "migration/vmstate.h"
>  #include "qom/object.h"
>  
> diff --git a/ui/util.c b/ui/util.c
> index 7e8fc1ea53..f5a2499110 100644
> --- a/ui/util.c
> +++ b/ui/util.c
> @@ -17,7 +17,7 @@
>  
>  #include "qemu/osdep.h"
>  
> -#include "hw/pci/pci.h"
> +#include "hw/pci/pci_device.h"
>  #include "hw/pci/pci_bus.h"
>  #include "qapi/error.h"
>  #include "ui/console.h"
> -- 
> 2.37.3



^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: [PATCH 0/5] include/hw/pci include/hw/cxl: Clean up includes
  2022-12-09 13:47 [PATCH 0/5] include/hw/pci include/hw/cxl: Clean up includes Markus Armbruster
                   ` (5 preceding siblings ...)
  2022-12-09 15:11 ` [PATCH 6/5] include/hw/cxl: Break inclusion loop Markus Armbruster
@ 2022-12-21 11:34 ` Michael S. Tsirkin
  2022-12-22  7:02   ` Markus Armbruster
  6 siblings, 1 reply; 23+ messages in thread
From: Michael S. Tsirkin @ 2022-12-21 11:34 UTC (permalink / raw)
  To: Markus Armbruster
  Cc: qemu-devel, marcel.apfelbaum, ben.widawsky, jonathan.cameron, philmd

On Fri, Dec 09, 2022 at 02:47:57PM +0100, Markus Armbruster wrote:
> Back in 2016, we discussed[1] rules for headers, and these were
> generally liked:
> 
> 1. Have a carefully curated header that's included everywhere first.  We
>    got that already thanks to Peter: osdep.h.
> 
> 2. Headers should normally include everything they need beyond osdep.h.
>    If exceptions are needed for some reason, they must be documented in
>    the header.  If all that's needed from a header is typedefs, put
>    those into qemu/typedefs.h instead of including the header.
> 
> 3. Cyclic inclusion is forbidden.

Looks like this breaks fuzzer build:

https://gitlab.com/mstredhat/qemu/-/jobs/3506121308



> After this series, include/hw/pci and include/hw/cxl conform to these
> rules.
> 
> It is based on
> 
>     [PATCH 0/3] block: Clean up includes
>     [PATCH 0/4] coroutine: Clean up includes
> 
> [1] Message-ID: <87h9g8j57d.fsf@blackfin.pond.sub.org>
>     https://lists.nongnu.org/archive/html/qemu-devel/2016-03/msg03345.html
> 
> Based-on: <20221208143939.2775453-1-armbru@redhat.com>
> 
> Markus Armbruster (5):
>   include/hw/pci: Clean up superfluous inclusion of pci*/*.h cxl/*.h
>   include/hw/cxl: Include hw/cxl/*.h where needed
>   include/hw/pci: Clean up a few things checkpatch.pl would flag
>   include/hw/pci: Split pci_device.h off pci.h
>   include/hw/pci: Include hw/pci/pci.h where needed
> 
>  hw/alpha/alpha_sys.h              |   1 -
>  hw/display/ati_int.h              |   2 +-
>  hw/display/qxl.h                  |   3 +-
>  hw/ide/ahci_internal.h            |   2 +-
>  hw/net/vmxnet3_defs.h             |   2 +-
>  hw/nvme/nvme.h                    |   2 +-
>  hw/rdma/rdma_utils.h              |   1 -
>  hw/rdma/vmw/pvrdma.h              |   2 +-
>  hw/scsi/mptsas.h                  |   2 +-
>  hw/usb/hcd-ehci.h                 |   3 +-
>  hw/usb/hcd-uhci.h                 |   2 +-
>  hw/usb/hcd-xhci-pci.h             |   1 +
>  hw/vfio/pci.h                     |   2 +-
>  hw/xen/xen_pt.h                   |   1 -
>  include/hw/acpi/piix4.h           |   2 +-
>  include/hw/arm/allwinner-a10.h    |   1 +
>  include/hw/cxl/cxl.h              |   1 -
>  include/hw/cxl/cxl_cdat.h         |   1 +
>  include/hw/cxl/cxl_component.h    |   1 +
>  include/hw/cxl/cxl_device.h       |   2 +
>  include/hw/cxl/cxl_pci.h          |   2 -
>  include/hw/i386/ich9.h            |   4 -
>  include/hw/i386/x86-iommu.h       |   1 -
>  include/hw/ide/pci.h              |   2 +-
>  include/hw/isa/vt82c686.h         |   1 -
>  include/hw/misc/macio/macio.h     |   2 +-
>  include/hw/pci-host/designware.h  |   3 -
>  include/hw/pci-host/gpex.h        |   2 +-
>  include/hw/pci-host/i440fx.h      |   2 +-
>  include/hw/pci-host/ls7a.h        |   2 -
>  include/hw/pci-host/pnv_phb3.h    |   2 -
>  include/hw/pci-host/pnv_phb4.h    |   3 +-
>  include/hw/pci-host/q35.h         |   2 +-
>  include/hw/pci-host/sabre.h       |   2 +-
>  include/hw/pci-host/xilinx-pcie.h |   1 -
>  include/hw/pci/msi.h              |   2 +-
>  include/hw/pci/pci.h              | 352 -----------------------------
>  include/hw/pci/pci_bridge.h       |   2 +-
>  include/hw/pci/pci_device.h       | 361 ++++++++++++++++++++++++++++++
>  include/hw/pci/pcie.h             |   1 -
>  include/hw/pci/pcie_port.h        |   1 +
>  include/hw/pci/pcie_sriov.h       |   2 +
>  include/hw/pci/shpc.h             |   2 +-
>  include/hw/remote/iohub.h         |   2 +-
>  include/hw/remote/proxy.h         |   2 +-
>  include/hw/sd/sdhci.h             |   2 +-
>  include/hw/southbridge/piix.h     |   3 +-
>  include/hw/virtio/virtio-scsi.h   |   1 -
>  include/hw/xen/xen_common.h       |   2 +-
>  hw/acpi/erst.c                    |   2 +-
>  hw/alpha/pci.c                    |   1 +
>  hw/alpha/typhoon.c                |   2 +-
>  hw/audio/ac97.c                   |   2 +-
>  hw/audio/es1370.c                 |   2 +-
>  hw/audio/via-ac97.c               |   2 +-
>  hw/char/serial-pci-multi.c        |   2 +-
>  hw/char/serial-pci.c              |   2 +-
>  hw/core/qdev-properties-system.c  |   1 +
>  hw/display/bochs-display.c        |   2 +-
>  hw/display/cirrus_vga.c           |   2 +-
>  hw/display/sm501.c                |   2 +-
>  hw/display/vga-pci.c              |   2 +-
>  hw/display/vmware_vga.c           |   2 +-
>  hw/i386/acpi-build.c              |   2 +-
>  hw/i386/xen/xen_pvdevice.c        |   2 +-
>  hw/ipack/tpci200.c                |   2 +-
>  hw/ipmi/pci_ipmi_bt.c             |   2 +-
>  hw/ipmi/pci_ipmi_kcs.c            |   2 +-
>  hw/isa/i82378.c                   |   2 +-
>  hw/mips/gt64xxx_pci.c             |   2 +-
>  hw/misc/pci-testdev.c             |   2 +-
>  hw/misc/pvpanic-pci.c             |   2 +-
>  hw/net/can/can_kvaser_pci.c       |   2 +-
>  hw/net/can/can_mioe3680_pci.c     |   2 +-
>  hw/net/can/can_pcm3680_pci.c      |   2 +-
>  hw/net/can/ctucan_pci.c           |   2 +-
>  hw/net/e1000.c                    |   2 +-
>  hw/net/e1000x_common.c            |   2 +-
>  hw/net/eepro100.c                 |   2 +-
>  hw/net/ne2000-pci.c               |   2 +-
>  hw/net/net_tx_pkt.c               |   2 +-
>  hw/net/pcnet-pci.c                |   2 +-
>  hw/net/rocker/rocker.c            |   2 +-
>  hw/net/rocker/rocker_desc.c       |   2 +-
>  hw/net/rtl8139.c                  |   2 +-
>  hw/net/sungem.c                   |   2 +-
>  hw/net/sunhme.c                   |   2 +-
>  hw/net/tulip.c                    |   2 +-
>  hw/net/virtio-net.c               |   2 +-
>  hw/pci-bridge/i82801b11.c         |   2 +-
>  hw/pci-host/bonito.c              |   2 +-
>  hw/pci-host/dino.c                |   2 +-
>  hw/pci-host/grackle.c             |   2 +-
>  hw/pci-host/mv64361.c             |   2 +-
>  hw/pci-host/ppce500.c             |   2 +-
>  hw/pci-host/raven.c               |   2 +-
>  hw/pci-host/sh_pci.c              |   2 +-
>  hw/pci-host/uninorth.c            |   2 +-
>  hw/pci-host/versatile.c           |   2 +-
>  hw/pci/pcie_host.c                |   2 +-
>  hw/pci/pcie_sriov.c               |   2 +-
>  hw/pci/slotid_cap.c               |   2 +-
>  hw/ppc/ppc440_pcix.c              |   2 +-
>  hw/ppc/ppc4xx_pci.c               |   2 +-
>  hw/ppc/spapr_pci_vfio.c           |   1 +
>  hw/rdma/rdma_utils.c              |   1 +
>  hw/s390x/s390-pci-inst.c          |   1 +
>  hw/scsi/esp-pci.c                 |   2 +-
>  hw/scsi/lsi53c895a.c              |   2 +-
>  hw/scsi/virtio-scsi.c             |   1 +
>  hw/smbios/smbios.c                |   1 +
>  hw/usb/hcd-ohci-pci.c             |   2 +-
>  hw/watchdog/wdt_i6300esb.c        |   2 +-
>  ui/util.c                         |   2 +-
>  114 files changed, 461 insertions(+), 462 deletions(-)
>  create mode 100644 include/hw/pci/pci_device.h
> 
> -- 
> 2.37.3



^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: [PATCH 0/5] include/hw/pci include/hw/cxl: Clean up includes
  2022-12-21 11:34 ` [PATCH 0/5] include/hw/pci include/hw/cxl: Clean up includes Michael S. Tsirkin
@ 2022-12-22  7:02   ` Markus Armbruster
  0 siblings, 0 replies; 23+ messages in thread
From: Markus Armbruster @ 2022-12-22  7:02 UTC (permalink / raw)
  To: Michael S. Tsirkin
  Cc: qemu-devel, marcel.apfelbaum, ben.widawsky, jonathan.cameron, philmd

"Michael S. Tsirkin" <mst@redhat.com> writes:

> On Fri, Dec 09, 2022 at 02:47:57PM +0100, Markus Armbruster wrote:
>> Back in 2016, we discussed[1] rules for headers, and these were
>> generally liked:
>> 
>> 1. Have a carefully curated header that's included everywhere first.  We
>>    got that already thanks to Peter: osdep.h.
>> 
>> 2. Headers should normally include everything they need beyond osdep.h.
>>    If exceptions are needed for some reason, they must be documented in
>>    the header.  If all that's needed from a header is typedefs, put
>>    those into qemu/typedefs.h instead of including the header.
>> 
>> 3. Cyclic inclusion is forbidden.
>
> Looks like this breaks fuzzer build:
>
> https://gitlab.com/mstredhat/qemu/-/jobs/3506121308

Will be fixed in v2, thanks!



^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: [PATCH 4/5] include/hw/pci: Split pci_device.h off pci.h
  2022-12-21 11:33   ` Michael S. Tsirkin
@ 2022-12-22  9:35     ` Markus Armbruster
  0 siblings, 0 replies; 23+ messages in thread
From: Markus Armbruster @ 2022-12-22  9:35 UTC (permalink / raw)
  To: Michael S. Tsirkin
  Cc: qemu-devel, marcel.apfelbaum, ben.widawsky, jonathan.cameron, philmd

"Michael S. Tsirkin" <mst@redhat.com> writes:

> On Fri, Dec 09, 2022 at 02:48:01PM +0100, Markus Armbruster wrote:
>> PCIDeviceClass and PCIDevice are defined in pci.h.  Many users of the
>> header don't actually need them.  Similar structs live in their own
>> headers: PCIBusClass and PCIBus in pci_bus.h, PCIBridge in
>> pci_bridge.h, PCIHostBridgeClass and PCIHostState in pci_host.h,
>> PCIExpressHost in pcie_host.h, and PCIERootPortClass, PCIEPort, and
>> PCIESlot in pcie_port.h.
>> 
>> Move PCIDeviceClass and PCIDeviceClass to new pci_device.h, along with
>> the code that needs them.  Adjust include directives.
>> 
>> This also enables the next commit.
>> 
>> Signed-off-by: Markus Armbruster <armbru@redhat.com>
>
>
> checkpatch is unhappy:
>
> ./scripts/checkpatch.pl /tmp/patch 
> WARNING: added, moved or deleted file(s), does MAINTAINERS need updating?
> #707: 
> new file mode 100644

We're good:

    $ scripts/get_maintainer.pl -f include/hw/pci/pci_device.h 
    "Michael S. Tsirkin" <mst@redhat.com> (supporter:PCI)
    Marcel Apfelbaum <marcel.apfelbaum@gmail.com> (supporter:PCI)
    qemu-devel@nongnu.org (open list:All patches CC here)

But checkpatch is too simple-minded to see that.

> ERROR: spaces required around that '*' (ctx:WxV)
> #997: FILE: include/hw/pci/pci_device.h:286:
> +                                               uint##_bits##_t *val, \
>                                                                 ^

False positive.

  #define PCI_DMA_DEFINE_LDST(_l, _s, _bits) \
      static inline MemTxResult ld##_l##_pci_dma(PCIDevice *dev, \
                                                 dma_addr_t addr, \
--->                                             uint##_bits##_t *val, \
                                                 MemTxAttrs attrs) \
      { \
          return ld##_l##_dma(pci_get_address_space(dev), addr, val, attrs); \
      } \
      static inline MemTxResult st##_s##_pci_dma(PCIDevice *dev, \
                                                 dma_addr_t addr, \
                                                 uint##_bits##_t val, \
                                                 MemTxAttrs attrs) \
      { \
          return st##_s##_dma(pci_get_address_space(dev), addr, val, attrs); \
      }

The part checkpatch objects to is actually a parameter declaration of
the form

    TYPE *NAME

The use of spaces is fine.  Not fine would be

    TYPE * NAME

Having a macro expand into a function definition confuses checkpatch.

> It's right - we need a MAINTAINERS entry.
> Not sure how to fix the error - any idea?

There is nothing to fix :)



^ permalink raw reply	[flat|nested] 23+ messages in thread

end of thread, other threads:[~2022-12-22  9:36 UTC | newest]

Thread overview: 23+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-12-09 13:47 [PATCH 0/5] include/hw/pci include/hw/cxl: Clean up includes Markus Armbruster
2022-12-09 13:47 ` [PATCH 1/5] include/hw/pci: Clean up superfluous inclusion of pci*/*.h cxl/*.h Markus Armbruster
2022-12-09 17:03   ` Michael S. Tsirkin
2022-12-10  7:25     ` Markus Armbruster
2022-12-12 10:41   ` Jonathan Cameron via
2022-12-15  7:14     ` Markus Armbruster
2022-12-15 17:38       ` Jonathan Cameron via
2022-12-09 13:47 ` [PATCH 2/5] include/hw/cxl: Include hw/cxl/*.h where needed Markus Armbruster
2022-12-12 10:33   ` Jonathan Cameron via
2022-12-09 13:48 ` [PATCH 3/5] include/hw/pci: Clean up a few things checkpatch.pl would flag Markus Armbruster
2022-12-09 14:15   ` Philippe Mathieu-Daudé
2022-12-09 13:48 ` [PATCH 4/5] include/hw/pci: Split pci_device.h off pci.h Markus Armbruster
2022-12-21 11:33   ` Michael S. Tsirkin
2022-12-22  9:35     ` Markus Armbruster
2022-12-09 13:48 ` [PATCH 5/5] include/hw/pci: Include hw/pci/pci.h where needed Markus Armbruster
2022-12-09 14:17   ` Philippe Mathieu-Daudé
2022-12-09 15:11 ` [PATCH 6/5] include/hw/cxl: Break inclusion loop Markus Armbruster
2022-12-10  7:09   ` Markus Armbruster
2022-12-12 10:54     ` Jonathan Cameron via
2022-12-15  7:34       ` Markus Armbruster
2022-12-15 17:45         ` Jonathan Cameron via
2022-12-21 11:34 ` [PATCH 0/5] include/hw/pci include/hw/cxl: Clean up includes Michael S. Tsirkin
2022-12-22  7:02   ` Markus Armbruster

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.