Skip to content

Commit

Permalink
libqos: Change PCI accessors to take opaque BAR handle
Browse files Browse the repository at this point in the history
The usual use model for the libqos PCI functions is to map a specific PCI
BAR using qpci_iomap() then pass the returned token into IO accessor
functions.  This, and the fact that iomap() returns a (void *) which
actually contains a PCI space address, kind of suggests that the return
value from iomap is supposed to be an opaque token.

..except that the callers expect to be able to add offsets to it.  Which
also assumes the compiler will support pointer arithmetic on a (void *),
and treat it as working with byte offsets.

To clarify this situation change iomap() and the IO accessors to take
a definitely opaque BAR handle (enforced with a wrapper struct) along with
an offset within the BAR.  This changes both the functions and all the
callers.

There were a number of places that checked if iomap() returned non-NULL,
and or initialized it to NULL before hand.  Since iomap() already assert()s
if it fails to map the BAR, these tests were mostly pointless and are
removed.

Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
Reviewed-by: Greg Kurz <groug@kaod.org>
  • Loading branch information
dgibson committed Oct 27, 2016
1 parent e7c8526 commit b4ba67d
Show file tree
Hide file tree
Showing 14 changed files with 300 additions and 309 deletions.
7 changes: 3 additions & 4 deletions tests/e1000e-test.c
Expand Up @@ -87,7 +87,7 @@

typedef struct e1000e_device {
QPCIDevice *pci_dev;
void *mac_regs;
QPCIBar mac_regs;

uint64_t tx_ring;
uint64_t rx_ring;
Expand Down Expand Up @@ -119,12 +119,12 @@ static QPCIDevice *e1000e_device_find(QPCIBus *bus)

static void e1000e_macreg_write(e1000e_device *d, uint32_t reg, uint32_t val)
{
qpci_io_writel(d->pci_dev, d->mac_regs + reg, val);
qpci_io_writel(d->pci_dev, d->mac_regs, reg, val);
}

static uint32_t e1000e_macreg_read(e1000e_device *d, uint32_t reg)
{
return qpci_io_readl(d->pci_dev, d->mac_regs + reg);
return qpci_io_readl(d->pci_dev, d->mac_regs, reg);
}

static void e1000e_device_init(QPCIBus *bus, e1000e_device *d)
Expand All @@ -138,7 +138,6 @@ static void e1000e_device_init(QPCIBus *bus, e1000e_device *d)

/* Map BAR0 (mac registers) */
d->mac_regs = qpci_iomap(d->pci_dev, 0, NULL);
g_assert_nonnull(d->mac_regs);

/* Reset the device */
val = e1000e_macreg_read(d, E1000E_CTRL);
Expand Down

0 comments on commit b4ba67d

Please sign in to comment.