libqos: allow qpci_iomap to return BAR mapping size

This patch allows qpci_iomap to return the size of the
BAR mapping that it created, to allow driver applications
(e.g, ahci-test) to make determinations about the suitability
or the mapping size, or in the specific case of AHCI, how
many ports are supported by the HBA.

Signed-off-by: John Snow <jsnow@redhat.com>
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
master
John Snow 2014-08-04 17:11:24 -04:00 committed by Stefan Hajnoczi
parent 7f2a5ae6c1
commit 6ce7100e7f
5 changed files with 10 additions and 7 deletions

View File

@ -146,7 +146,7 @@ static QPCIDevice *get_pci_device(uint16_t *bmdma_base)
g_assert(device_id == PCI_DEVICE_ID_INTEL_82371SB_1); g_assert(device_id == PCI_DEVICE_ID_INTEL_82371SB_1);
/* Map bmdma BAR */ /* Map bmdma BAR */
*bmdma_base = (uint16_t)(uintptr_t) qpci_iomap(dev, 4); *bmdma_base = (uint16_t)(uintptr_t) qpci_iomap(dev, 4, NULL);
qpci_device_enable(dev); qpci_device_enable(dev);

View File

@ -144,7 +144,7 @@ static void qpci_pc_config_writel(QPCIBus *bus, int devfn, uint8_t offset, uint3
outl(0xcfc, value); outl(0xcfc, value);
} }
static void *qpci_pc_iomap(QPCIBus *bus, QPCIDevice *dev, int barno) static void *qpci_pc_iomap(QPCIBus *bus, QPCIDevice *dev, int barno, uint64_t *sizeptr)
{ {
QPCIBusPC *s = container_of(bus, QPCIBusPC, bus); QPCIBusPC *s = container_of(bus, QPCIBusPC, bus);
static const int bar_reg_map[] = { static const int bar_reg_map[] = {
@ -173,6 +173,9 @@ static void *qpci_pc_iomap(QPCIBus *bus, QPCIDevice *dev, int barno)
if (size == 0) { if (size == 0) {
return NULL; return NULL;
} }
if (sizeptr) {
*sizeptr = size;
}
if (io_type == PCI_BASE_ADDRESS_SPACE_IO) { if (io_type == PCI_BASE_ADDRESS_SPACE_IO) {
uint16_t loc; uint16_t loc;

View File

@ -138,9 +138,9 @@ void qpci_io_writel(QPCIDevice *dev, void *data, uint32_t value)
dev->bus->io_writel(dev->bus, data, value); dev->bus->io_writel(dev->bus, data, value);
} }
void *qpci_iomap(QPCIDevice *dev, int barno) void *qpci_iomap(QPCIDevice *dev, int barno, uint64_t *sizeptr)
{ {
return dev->bus->iomap(dev->bus, dev, barno); return dev->bus->iomap(dev->bus, dev, barno, sizeptr);
} }
void qpci_iounmap(QPCIDevice *dev, void *data) void qpci_iounmap(QPCIDevice *dev, void *data)

View File

@ -41,7 +41,7 @@ struct QPCIBus
void (*config_writel)(QPCIBus *bus, int devfn, void (*config_writel)(QPCIBus *bus, int devfn,
uint8_t offset, uint32_t value); uint8_t offset, uint32_t value);
void *(*iomap)(QPCIBus *bus, QPCIDevice *dev, int barno); void *(*iomap)(QPCIBus *bus, QPCIDevice *dev, int barno, uint64_t *sizeptr);
void (*iounmap)(QPCIBus *bus, void *data); void (*iounmap)(QPCIBus *bus, void *data);
}; };
@ -74,7 +74,7 @@ void qpci_io_writeb(QPCIDevice *dev, void *data, uint8_t value);
void qpci_io_writew(QPCIDevice *dev, void *data, uint16_t value); void qpci_io_writew(QPCIDevice *dev, void *data, uint16_t value);
void qpci_io_writel(QPCIDevice *dev, void *data, uint32_t value); void qpci_io_writel(QPCIDevice *dev, void *data, uint32_t value);
void *qpci_iomap(QPCIDevice *dev, int barno); void *qpci_iomap(QPCIDevice *dev, int barno, uint64_t *sizeptr);
void qpci_iounmap(QPCIDevice *dev, void *data); void qpci_iounmap(QPCIDevice *dev, void *data);
#endif #endif

View File

@ -34,7 +34,7 @@ static void pci_init_one(struct qhc *hc, uint32_t devfn, int bar)
hc->dev = qpci_device_find(pcibus, devfn); hc->dev = qpci_device_find(pcibus, devfn);
g_assert(hc->dev != NULL); g_assert(hc->dev != NULL);
qpci_device_enable(hc->dev); qpci_device_enable(hc->dev);
hc->base = qpci_iomap(hc->dev, bar); hc->base = qpci_iomap(hc->dev, bar, NULL);
g_assert(hc->base != NULL); g_assert(hc->base != NULL);
} }