hw/pci: add PCI resource reserve capability to legacy PCI bridge
Add hint to firmware (e.g. SeaBIOS) to reserve addtional BUS/IO/MEM/PREF resource for legacy pci-pci bridge. Add the resource reserve capability deleting in pci_bridge_dev_exitfn. Signed-off-by: Jing Liu <jing2.liu@linux.intel.com> Reviewed-by: Marcel Apfelbaum<marcel.apfelbaum@gmail.com> Reviewed-by: Michael S. Tsirkin <mst@redhat.com> Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
This commit is contained in:
		
							parent
							
								
									9e8993991e
								
							
						
					
					
						commit
						6755e618d0
					
				@ -46,6 +46,9 @@ struct PCIBridgeDev {
 | 
			
		||||
    uint32_t flags;
 | 
			
		||||
 | 
			
		||||
    OnOffAuto msi;
 | 
			
		||||
 | 
			
		||||
    /* additional resources to reserve */
 | 
			
		||||
    PCIResReserve res_reserve;
 | 
			
		||||
};
 | 
			
		||||
typedef struct PCIBridgeDev PCIBridgeDev;
 | 
			
		||||
 | 
			
		||||
@ -95,6 +98,12 @@ static void pci_bridge_dev_realize(PCIDevice *dev, Error **errp)
 | 
			
		||||
        error_free(local_err);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    err = pci_bridge_qemu_reserve_cap_init(dev, 0,
 | 
			
		||||
                                         bridge_dev->res_reserve, errp);
 | 
			
		||||
    if (err) {
 | 
			
		||||
        goto cap_error;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (shpc_present(dev)) {
 | 
			
		||||
        /* TODO: spec recommends using 64 bit prefetcheable BAR.
 | 
			
		||||
         * Check whether that works well. */
 | 
			
		||||
@ -103,6 +112,8 @@ static void pci_bridge_dev_realize(PCIDevice *dev, Error **errp)
 | 
			
		||||
    }
 | 
			
		||||
    return;
 | 
			
		||||
 | 
			
		||||
cap_error:
 | 
			
		||||
    msi_uninit(dev);
 | 
			
		||||
msi_error:
 | 
			
		||||
    slotid_cap_cleanup(dev);
 | 
			
		||||
slotid_error:
 | 
			
		||||
@ -116,6 +127,8 @@ shpc_error:
 | 
			
		||||
static void pci_bridge_dev_exitfn(PCIDevice *dev)
 | 
			
		||||
{
 | 
			
		||||
    PCIBridgeDev *bridge_dev = PCI_BRIDGE_DEV(dev);
 | 
			
		||||
 | 
			
		||||
    pci_del_capability(dev, PCI_CAP_ID_VNDR, sizeof(PCIBridgeQemuCap));
 | 
			
		||||
    if (msi_present(dev)) {
 | 
			
		||||
        msi_uninit(dev);
 | 
			
		||||
    }
 | 
			
		||||
@ -162,6 +175,17 @@ static Property pci_bridge_dev_properties[] = {
 | 
			
		||||
                            ON_OFF_AUTO_AUTO),
 | 
			
		||||
    DEFINE_PROP_BIT(PCI_BRIDGE_DEV_PROP_SHPC, PCIBridgeDev, flags,
 | 
			
		||||
                    PCI_BRIDGE_DEV_F_SHPC_REQ, true),
 | 
			
		||||
    DEFINE_PROP_UINT32("bus-reserve", PCIBridgeDev,
 | 
			
		||||
                       res_reserve.bus, -1),
 | 
			
		||||
    DEFINE_PROP_SIZE("io-reserve", PCIBridgeDev,
 | 
			
		||||
                     res_reserve.io, -1),
 | 
			
		||||
    DEFINE_PROP_SIZE("mem-reserve", PCIBridgeDev,
 | 
			
		||||
                     res_reserve.mem_non_pref, -1),
 | 
			
		||||
    DEFINE_PROP_SIZE("pref32-reserve", PCIBridgeDev,
 | 
			
		||||
                     res_reserve.mem_pref_32, -1),
 | 
			
		||||
    DEFINE_PROP_SIZE("pref64-reserve", PCIBridgeDev,
 | 
			
		||||
                     res_reserve.mem_pref_64, -1),
 | 
			
		||||
 | 
			
		||||
    DEFINE_PROP_END_OF_LIST(),
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user