Add hint to firmware (e.g. SeaBIOS) to reserve addtional
BUS/IO/MEM/PREF resource for legacy pci-pci bridge.
Signed-off-by: Jing Liu <jing2.liu@linux.intel.com>
---
hw/pci-bridge/pci_bridge_dev.c | 25 +++++++++++++++++++++++++
1 file changed, 25 insertions(+)
diff --git a/hw/pci-bridge/pci_bridge_dev.c b/hw/pci-bridge/pci_bridge_dev.c
index b2d861d..874e618 100644
--- a/hw/pci-bridge/pci_bridge_dev.c
+++ b/hw/pci-bridge/pci_bridge_dev.c
@@ -46,6 +46,8 @@ struct PCIBridgeDev {
uint32_t flags;
OnOffAuto msi;
+
+ PCIResReserve res_reserve;
};
typedef struct PCIBridgeDev PCIBridgeDev;
@@ -95,6 +97,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 +111,10 @@ static void pci_bridge_dev_realize(PCIDevice *dev, Error **errp)
}
return;
+cap_error:
+ if (msi_present(dev)) {
+ msi_uninit(dev);
+ }
msi_error:
slotid_cap_cleanup(dev);
slotid_error:
@@ -116,6 +128,8 @@ shpc_error:
static void pci_bridge_dev_exitfn(PCIDevice *dev)
{
PCIBridgeDev *bridge_dev = PCI_BRIDGE_DEV(dev);
+
+ pci_bridge_qemu_reserve_cap_uninit(dev);
if (msi_present(dev)) {
msi_uninit(dev);
}
@@ -162,6 +176,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_reserve, -1),
+ DEFINE_PROP_SIZE("io-reserve", PCIBridgeDev,
+ res_reserve.io_reserve, -1),
+ DEFINE_PROP_SIZE("mem-reserve", PCIBridgeDev,
+ res_reserve.mem_reserve, -1),
+ DEFINE_PROP_SIZE("pref32-reserve", PCIBridgeDev,
+ res_reserve.pref32_reserve, -1),
+ DEFINE_PROP_SIZE("pref64-reserve", PCIBridgeDev,
+ res_reserve.pref64_reserve, -1),
+
DEFINE_PROP_END_OF_LIST(),
};
--
1.8.3.1
Hi Jing,
On 08/16/2018 12:28 PM, Jing Liu wrote:
> Add hint to firmware (e.g. SeaBIOS) to reserve addtional
> BUS/IO/MEM/PREF resource for legacy pci-pci bridge.
>
> Signed-off-by: Jing Liu <jing2.liu@linux.intel.com>
> ---
> hw/pci-bridge/pci_bridge_dev.c | 25 +++++++++++++++++++++++++
> 1 file changed, 25 insertions(+)
>
> diff --git a/hw/pci-bridge/pci_bridge_dev.c b/hw/pci-bridge/pci_bridge_dev.c
> index b2d861d..874e618 100644Hi
> --- a/hw/pci-bridge/pci_bridge_dev.c
> +++ b/hw/pci-bridge/pci_bridge_dev.c
> @@ -46,6 +46,8 @@ struct PCIBridgeDev {
> uint32_t flags;
>
> OnOffAuto msi;
> +
> + PCIResReserve res_reserve;
> };
> typedef struct PCIBridgeDev PCIBridgeDev;
>
> @@ -95,6 +97,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 +111,10 @@ static void pci_bridge_dev_realize(PCIDevice *dev, Error **errp)
> }
> return;
>
> +cap_error:
> + if (msi_present(dev)) {
> + msi_uninit(dev);
You were right. Since msi_uninit checks msi_present
inside, you don;t need this check, sorry for misleading you.
> + }
> msi_error:
> slotid_cap_cleanup(dev);
> slotid_error:
> @@ -116,6 +128,8 @@ shpc_error:
> static void pci_bridge_dev_exitfn(PCIDevice *dev)
> {
> PCIBridgeDev *bridge_dev = PCI_BRIDGE_DEV(dev);
> +
> + pci_bridge_qemu_reserve_cap_uninit(dev);
Here you should have only the "delete_cap" function.
> if (msi_present(dev)) {
> msi_uninit(dev);
> }
> @@ -162,6 +176,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_reserve, -1),
> + DEFINE_PROP_SIZE("io-reserve", PCIBridgeDev,
> + res_reserve.io_reserve, -1),
> + DEFINE_PROP_SIZE("mem-reserve", PCIBridgeDev,
> + res_reserve.mem_reserve, -1),
> + DEFINE_PROP_SIZE("pref32-reserve", PCIBridgeDev,
> + res_reserve.pref32_reserve, -1),
> + DEFINE_PROP_SIZE("pref64-reserve", PCIBridgeDev,
> + res_reserve.pref64_reserve, -1),
> +
> DEFINE_PROP_END_OF_LIST(),
> };
>
Thanks,
Marcel
© 2016 - 2025 Red Hat, Inc.