--- src/freebsd_pci.c.ORIGINAL 2012-04-09 13:02:57.000000000 -0400 +++ src/freebsd_pci.c 2013-04-15 23:35:33.000000000 -0400 @@ -561,6 +561,92 @@ freebsd_pci_sys = NULL; } +#if defined(__i386__) || defined(__amd64__) +#include +#include + +static struct pci_io_handle * +pci_device_freebsd_open_legacy_io(struct pci_io_handle *ret, + struct pci_device *dev, pciaddr_t base, pciaddr_t size) +{ + + if (i386_set_ioperm (base, size, 1) != 0) + return NULL; + + ret->base = base; + ret->size = size; + return ret; +} + +static uint32_t +pci_device_freebsd_read32(struct pci_io_handle *handle, uint32_t reg) +{ + return inl(handle->base + reg); +} + +static uint16_t +pci_device_freebsd_read16(struct pci_io_handle *handle, uint32_t reg) +{ + return inw(handle->base + reg); +} + +static uint8_t +pci_device_freebsd_read8(struct pci_io_handle *handle, uint32_t reg) +{ + return inb(handle->base + reg); +} + +static void +pci_device_freebsd_write32(struct pci_io_handle *handle, uint32_t reg, + uint32_t data) +{ + outl(handle->base + reg, data); +} + +static void +pci_device_freebsd_write16(struct pci_io_handle *handle, uint32_t reg, + uint16_t data) +{ + outw(handle->base + reg, data); +} + +static void +pci_device_freebsd_write8(struct pci_io_handle *handle, uint32_t reg, + uint8_t data) +{ + outb(handle->base + reg, data); +} +#endif + +static int +pci_device_freebsd_map_legacy(struct pci_device *dev, pciaddr_t base, + pciaddr_t size, unsigned map_flags, void **addr) +{ + struct pci_device_mapping map; + int err; + + map.base = base; + map.size = size; + map.flags = map_flags; + map.memory = NULL; + err = pci_device_freebsd_map_range(dev, &map); + *addr = map.memory; + + return err; +} + +static int +pci_device_freebsd_unmap_legacy(struct pci_device *dev, void *addr, + pciaddr_t size) +{ + struct pci_device_mapping map; + + map.memory = addr; + map.size = size; + map.flags = 0; + return pci_device_freebsd_unmap_range(dev, &map); +} + static const struct pci_system_methods freebsd_pci_methods = { .destroy = pci_system_freebsd_destroy, .destroy_device = NULL, /* nothing to do for this */ @@ -571,6 +657,17 @@ .read = pci_device_freebsd_read, .write = pci_device_freebsd_write, .fill_capabilities = pci_fill_capabilities_generic, +#if defined(__i386__) || defined(__amd64__) + .open_legacy_io = pci_device_freebsd_open_legacy_io, + .read32 = pci_device_freebsd_read32, + .read16 = pci_device_freebsd_read16, + .read8 = pci_device_freebsd_read8, + .write32 = pci_device_freebsd_write32, + .write16 = pci_device_freebsd_write16, + .write8 = pci_device_freebsd_write8, +#endif + .map_legacy = pci_device_freebsd_map_legacy, + .unmap_legacy = pci_device_freebsd_unmap_legacy, }; /**