@@ -2106,8 +2106,6 @@ int pci_add_capability(PCIDevice *pdev, uint8_t cap_id,
memset(pdev->wmask + offset, 0, size);
/* Check capability by default */
memset(pdev->cmask + offset, 0xFF, size);
-
-
return offset;
}
@@ -2125,9 +2123,14 @@ void pci_del_capability(PCIDevice *pdev, uint8_t cap_id, uint8_t size)
memset(pdev->cmask + offset, 0, size);
memset(pdev->used + offset, 0, size);
- if (!pdev->config[PCI_CAPABILITY_LIST]) {
+ if (!pdev->config[PCI_CAPABILITY_LIST])
pdev->config[PCI_STATUS] &= ~PCI_STATUS_CAP_LIST;
- }
+}
+
+/* Reserve space for capability at a known offset (to call after load). */
+void pci_reserve_capability(PCIDevice *pdev, uint8_t offset, uint8_t size)
+{
+ memset(pdev->used + offset, 0xff, size);
}
uint8_t pci_find_capability(PCIDevice *pdev, uint8_t cap_id)
@@ -147,7 +147,7 @@ struct PCIDevice {
/* Used to implement RW1C(Write 1 to Clear) bytes */
uint8_t *w1cmask;
- /* Used to allocate config space and track capabilities. */
+ /* Used to allocate config space for capabilities. */
uint8_t *used;
/* the following fields are read only */
@@ -230,8 +230,11 @@ int pci_add_capability(PCIDevice *pdev, uint8_t cap_id,
void pci_del_capability(PCIDevice *pci_dev, uint8_t cap_id, uint8_t cap_size);
+void pci_reserve_capability(PCIDevice *pci_dev, uint8_t offset, uint8_t size);
+
uint8_t pci_find_capability(PCIDevice *pci_dev, uint8_t cap_id);
+
uint32_t pci_default_read_config(PCIDevice *d,
uint32_t address, int len);
void pci_default_write_config(PCIDevice *d,
Resolve all unneeded deviations from upstream code. No functional changes. Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com> --- hw/pci.c | 11 +++++++---- hw/pci.h | 5 ++++- 2 files changed, 11 insertions(+), 5 deletions(-)