pci: removed the is_express field since a uniform interface was inserted
according to Eduardo Habkost's commit fd3b02c889 all PCIEs now implement
INTERFACE_PCIE_DEVICE so we don't need is_express field anymore.
Devices that implements only INTERFACE_PCIE_DEVICE (is_express == 1)
or
devices that implements only INTERFACE_CONVENTIONAL_PCI_DEVICE (is_express == 0)
where not affected by the change.
The only devices that were affected are those that are hybrid and also
had (is_express == 1) - therefor only:
  - hw/vfio/pci.c
  - hw/usb/hcd-xhci.c
  - hw/xen/xen_pt.c
For those 3 I made sure that QEMU_PCI_CAP_EXPRESS is on in instance_init()
Reviewed-by: Marcel Apfelbaum <marcel@redhat.com>
Reviewed-by: Eduardo Habkost <ehabkost@redhat.com>
Signed-off-by: Yoni Bettan <ybettan@redhat.com>
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
			
			
This commit is contained in:
		
							parent
							
								
									0ebf9a7488
								
							
						
					
					
						commit
						d61a363d3e
					
				| 
						 | 
				
			
			@ -110,5 +110,5 @@ To enable device hot-plug into the bridge on Linux there're 3 ways:
 | 
			
		|||
Implementation
 | 
			
		||||
==============
 | 
			
		||||
The PCIE-PCI bridge is based on PCI-PCI bridge, but also accumulates PCI Express
 | 
			
		||||
features as a PCI Express device (is_express=1).
 | 
			
		||||
features as a PCI Express device.
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1360,7 +1360,6 @@ static void nvme_class_init(ObjectClass *oc, void *data)
 | 
			
		|||
    pc->vendor_id = PCI_VENDOR_ID_INTEL;
 | 
			
		||||
    pc->device_id = 0x5845;
 | 
			
		||||
    pc->revision = 2;
 | 
			
		||||
    pc->is_express = 1;
 | 
			
		||||
 | 
			
		||||
    set_bit(DEVICE_CATEGORY_STORAGE, dc->categories);
 | 
			
		||||
    dc->desc = "Non-Volatile Memory Express";
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -675,7 +675,6 @@ static void e1000e_class_init(ObjectClass *class, void *data)
 | 
			
		|||
    c->revision = 0;
 | 
			
		||||
    c->romfile = "efi-e1000e.rom";
 | 
			
		||||
    c->class_id = PCI_CLASS_NETWORK_ETHERNET;
 | 
			
		||||
    c->is_express = 1;
 | 
			
		||||
 | 
			
		||||
    dc->desc = "Intel 82574L GbE Controller";
 | 
			
		||||
    dc->reset = e1000e_qdev_reset;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -170,7 +170,6 @@ static void pcie_pci_bridge_class_init(ObjectClass *klass, void *data)
 | 
			
		|||
    DeviceClass *dc = DEVICE_CLASS(klass);
 | 
			
		||||
    HotplugHandlerClass *hc = HOTPLUG_HANDLER_CLASS(klass);
 | 
			
		||||
 | 
			
		||||
    k->is_express = 1;
 | 
			
		||||
    k->is_bridge = 1;
 | 
			
		||||
    k->vendor_id = PCI_VENDOR_ID_REDHAT;
 | 
			
		||||
    k->device_id = PCI_DEVICE_ID_REDHAT_PCIE_BRIDGE;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -145,7 +145,6 @@ static void rp_class_init(ObjectClass *klass, void *data)
 | 
			
		|||
    DeviceClass *dc = DEVICE_CLASS(klass);
 | 
			
		||||
    PCIDeviceClass *k = PCI_DEVICE_CLASS(klass);
 | 
			
		||||
 | 
			
		||||
    k->is_express = 1;
 | 
			
		||||
    k->is_bridge = 1;
 | 
			
		||||
    k->config_write = rp_write_config;
 | 
			
		||||
    k->realize = rp_realize;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -178,7 +178,6 @@ static void xio3130_downstream_class_init(ObjectClass *klass, void *data)
 | 
			
		|||
    DeviceClass *dc = DEVICE_CLASS(klass);
 | 
			
		||||
    PCIDeviceClass *k = PCI_DEVICE_CLASS(klass);
 | 
			
		||||
 | 
			
		||||
    k->is_express = 1;
 | 
			
		||||
    k->is_bridge = 1;
 | 
			
		||||
    k->config_write = xio3130_downstream_write_config;
 | 
			
		||||
    k->realize = xio3130_downstream_realize;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -149,7 +149,6 @@ static void xio3130_upstream_class_init(ObjectClass *klass, void *data)
 | 
			
		|||
    DeviceClass *dc = DEVICE_CLASS(klass);
 | 
			
		||||
    PCIDeviceClass *k = PCI_DEVICE_CLASS(klass);
 | 
			
		||||
 | 
			
		||||
    k->is_express = 1;
 | 
			
		||||
    k->is_bridge = 1;
 | 
			
		||||
    k->config_write = xio3130_upstream_write_config;
 | 
			
		||||
    k->realize = xio3130_upstream_realize;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -297,7 +297,6 @@ static void xilinx_pcie_root_class_init(ObjectClass *klass, void *data)
 | 
			
		|||
    k->device_id = 0x7021;
 | 
			
		||||
    k->revision = 0;
 | 
			
		||||
    k->class_id = PCI_CLASS_BRIDGE_HOST;
 | 
			
		||||
    k->is_express = true;
 | 
			
		||||
    k->is_bridge = true;
 | 
			
		||||
    k->realize = xilinx_pcie_root_realize;
 | 
			
		||||
    k->exit = pci_bridge_exitfn;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -2005,11 +2005,15 @@ static void pci_qdev_realize(DeviceState *qdev, Error **errp)
 | 
			
		|||
{
 | 
			
		||||
    PCIDevice *pci_dev = (PCIDevice *)qdev;
 | 
			
		||||
    PCIDeviceClass *pc = PCI_DEVICE_GET_CLASS(pci_dev);
 | 
			
		||||
    ObjectClass *klass = OBJECT_CLASS(pc);
 | 
			
		||||
    Error *local_err = NULL;
 | 
			
		||||
    bool is_default_rom;
 | 
			
		||||
 | 
			
		||||
    /* initialize cap_present for pci_is_express() and pci_config_size() */
 | 
			
		||||
    if (pc->is_express) {
 | 
			
		||||
    /* initialize cap_present for pci_is_express() and pci_config_size(),
 | 
			
		||||
     * Note that hybrid PCIs are not set automatically and need to manage
 | 
			
		||||
     * QEMU_PCI_CAP_EXPRESS manually */
 | 
			
		||||
    if (object_class_dynamic_cast(klass, INTERFACE_PCIE_DEVICE) &&
 | 
			
		||||
       !object_class_dynamic_cast(klass, INTERFACE_CONVENTIONAL_PCI_DEVICE)) {
 | 
			
		||||
        pci_dev->cap_present |= QEMU_PCI_CAP_EXPRESS;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -2447,7 +2447,6 @@ typedef struct MegasasInfo {
 | 
			
		|||
    uint16_t subsystem_id;
 | 
			
		||||
    int ioport_bar;
 | 
			
		||||
    int mmio_bar;
 | 
			
		||||
    bool is_express;
 | 
			
		||||
    int osts;
 | 
			
		||||
    const VMStateDescription *vmsd;
 | 
			
		||||
    Property *props;
 | 
			
		||||
| 
						 | 
				
			
			@ -2465,7 +2464,6 @@ static struct MegasasInfo megasas_devices[] = {
 | 
			
		|||
        .ioport_bar = 2,
 | 
			
		||||
        .mmio_bar = 0,
 | 
			
		||||
        .osts = MFI_1078_RM | 1,
 | 
			
		||||
        .is_express = false,
 | 
			
		||||
        .vmsd = &vmstate_megasas_gen1,
 | 
			
		||||
        .props = megasas_properties_gen1,
 | 
			
		||||
        .interfaces = (InterfaceInfo[]) {
 | 
			
		||||
| 
						 | 
				
			
			@ -2482,7 +2480,6 @@ static struct MegasasInfo megasas_devices[] = {
 | 
			
		|||
        .ioport_bar = 0,
 | 
			
		||||
        .mmio_bar = 1,
 | 
			
		||||
        .osts = MFI_GEN2_RM,
 | 
			
		||||
        .is_express = true,
 | 
			
		||||
        .vmsd = &vmstate_megasas_gen2,
 | 
			
		||||
        .props = megasas_properties_gen2,
 | 
			
		||||
        .interfaces = (InterfaceInfo[]) {
 | 
			
		||||
| 
						 | 
				
			
			@ -2506,7 +2503,6 @@ static void megasas_class_init(ObjectClass *oc, void *data)
 | 
			
		|||
    pc->subsystem_vendor_id = PCI_VENDOR_ID_LSI_LOGIC;
 | 
			
		||||
    pc->subsystem_id = info->subsystem_id;
 | 
			
		||||
    pc->class_id = PCI_CLASS_STORAGE_RAID;
 | 
			
		||||
    pc->is_express = info->is_express;
 | 
			
		||||
    e->mmio_bar = info->mmio_bar;
 | 
			
		||||
    e->ioport_bar = info->ioport_bar;
 | 
			
		||||
    e->osts = info->osts;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -3649,6 +3649,13 @@ static Property xhci_properties[] = {
 | 
			
		|||
    DEFINE_PROP_END_OF_LIST(),
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static void xhci_instance_init(Object *obj)
 | 
			
		||||
{
 | 
			
		||||
    /* QEMU_PCI_CAP_EXPRESS initialization does not depend on QEMU command
 | 
			
		||||
     * line, therefore, no need to wait to realize like other devices */
 | 
			
		||||
    PCI_DEVICE(obj)->cap_present |= QEMU_PCI_CAP_EXPRESS;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void xhci_class_init(ObjectClass *klass, void *data)
 | 
			
		||||
{
 | 
			
		||||
    PCIDeviceClass *k = PCI_DEVICE_CLASS(klass);
 | 
			
		||||
| 
						 | 
				
			
			@ -3661,7 +3668,6 @@ static void xhci_class_init(ObjectClass *klass, void *data)
 | 
			
		|||
    k->realize      = usb_xhci_realize;
 | 
			
		||||
    k->exit         = usb_xhci_exit;
 | 
			
		||||
    k->class_id     = PCI_CLASS_SERIAL_USB;
 | 
			
		||||
    k->is_express   = 1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static const TypeInfo xhci_info = {
 | 
			
		||||
| 
						 | 
				
			
			@ -3669,6 +3675,7 @@ static const TypeInfo xhci_info = {
 | 
			
		|||
    .parent        = TYPE_PCI_DEVICE,
 | 
			
		||||
    .instance_size = sizeof(XHCIState),
 | 
			
		||||
    .class_init    = xhci_class_init,
 | 
			
		||||
    .instance_init = xhci_instance_init,
 | 
			
		||||
    .abstract      = true,
 | 
			
		||||
    .interfaces = (InterfaceInfo[]) {
 | 
			
		||||
        { INTERFACE_PCIE_DEVICE },
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -3113,6 +3113,10 @@ static void vfio_instance_init(Object *obj)
 | 
			
		|||
    vdev->host.function = ~0U;
 | 
			
		||||
 | 
			
		||||
    vdev->nv_gpudirect_clique = 0xFF;
 | 
			
		||||
 | 
			
		||||
    /* QEMU_PCI_CAP_EXPRESS initialization does not depend on QEMU command
 | 
			
		||||
     * line, therefore, no need to wait to realize like other devices */
 | 
			
		||||
    pci_dev->cap_present |= QEMU_PCI_CAP_EXPRESS;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static Property vfio_pci_dev_properties[] = {
 | 
			
		||||
| 
						 | 
				
			
			@ -3171,7 +3175,6 @@ static void vfio_pci_dev_class_init(ObjectClass *klass, void *data)
 | 
			
		|||
    pdc->exit = vfio_exitfn;
 | 
			
		||||
    pdc->config_read = vfio_pci_read_config;
 | 
			
		||||
    pdc->config_write = vfio_pci_write_config;
 | 
			
		||||
    pdc->is_express = 1; /* We might be */
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static const TypeInfo vfio_pci_dev_info = {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -937,6 +937,13 @@ static Property xen_pci_passthrough_properties[] = {
 | 
			
		|||
    DEFINE_PROP_END_OF_LIST(),
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static void xen_pci_passthrough_instance_init(Object *obj)
 | 
			
		||||
{
 | 
			
		||||
    /* QEMU_PCI_CAP_EXPRESS initialization does not depend on QEMU command
 | 
			
		||||
     * line, therefore, no need to wait to realize like other devices */
 | 
			
		||||
    PCI_DEVICE(obj)->cap_present |= QEMU_PCI_CAP_EXPRESS;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void xen_pci_passthrough_class_init(ObjectClass *klass, void *data)
 | 
			
		||||
{
 | 
			
		||||
    DeviceClass *dc = DEVICE_CLASS(klass);
 | 
			
		||||
| 
						 | 
				
			
			@ -946,7 +953,6 @@ static void xen_pci_passthrough_class_init(ObjectClass *klass, void *data)
 | 
			
		|||
    k->exit = xen_pt_unregister_device;
 | 
			
		||||
    k->config_read = xen_pt_pci_read_config;
 | 
			
		||||
    k->config_write = xen_pt_pci_write_config;
 | 
			
		||||
    k->is_express = 1; /* We might be */
 | 
			
		||||
    set_bit(DEVICE_CATEGORY_MISC, dc->categories);
 | 
			
		||||
    dc->desc = "Assign an host PCI device with Xen";
 | 
			
		||||
    dc->props = xen_pci_passthrough_properties;
 | 
			
		||||
| 
						 | 
				
			
			@ -965,6 +971,7 @@ static const TypeInfo xen_pci_passthrough_info = {
 | 
			
		|||
    .instance_size = sizeof(XenPCIPassthroughState),
 | 
			
		||||
    .instance_finalize = xen_pci_passthrough_finalize,
 | 
			
		||||
    .class_init = xen_pci_passthrough_class_init,
 | 
			
		||||
    .instance_init = xen_pci_passthrough_instance_init,
 | 
			
		||||
    .interfaces = (InterfaceInfo[]) {
 | 
			
		||||
        { INTERFACE_CONVENTIONAL_PCI_DEVICE },
 | 
			
		||||
        { INTERFACE_PCIE_DEVICE },
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -236,9 +236,6 @@ typedef struct PCIDeviceClass {
 | 
			
		|||
     */
 | 
			
		||||
    int is_bridge;
 | 
			
		||||
 | 
			
		||||
    /* pcie stuff */
 | 
			
		||||
    int is_express;   /* is this device pci express? */
 | 
			
		||||
 | 
			
		||||
    /* rom bar */
 | 
			
		||||
    const char *romfile;
 | 
			
		||||
} PCIDeviceClass;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue