52 #include <sys/queue.h> 65 #define PCI_PRI_FMT "%.4" PRIx16 ":%.2" PRIx8 ":%.2" PRIx8 ".%" PRIx8 66 #define PCI_PRI_STR_SIZE sizeof("XXXXXXXX:XX:XX.X") 69 #define PCI_SHORT_PRI_FMT "%.2" PRIx8 ":%.2" PRIx8 ".%" PRIx8 72 #define PCI_FMT_NVAL 4 75 #define PCI_RESOURCE_FMT_NVAL 3 78 #define PCI_MAX_RESOURCE 6 90 #define FOREACH_DEVICE_ON_PCIBUS(p) \ 91 TAILQ_FOREACH(p, &(rte_pci_bus.device_list), next) 93 #define FOREACH_DRIVER_ON_PCIBUS(p) \ 94 TAILQ_FOREACH(p, &(rte_pci_bus.driver_list), next) 130 struct rte_intr_handle intr_handle;
134 char name[PCI_PRI_STR_SIZE+1];
141 #define RTE_DEV_TO_PCI(ptr) container_of(ptr, struct rte_pci_device, device) 144 #define PCI_ANY_ID (0xffff) 145 #define RTE_CLASS_ANY_ID (0xffffff) 149 #define RTE_PCI_DEVICE(vend, dev) \ 157 #define RTE_PCI_DEVICE(vend, dev) \ 158 .class_id = RTE_CLASS_ANY_ID, \ 159 .vendor_id = (vend), \ 160 .device_id = (dev), \ 161 .subsystem_vendor_id = PCI_ANY_ID, \ 162 .subsystem_device_id = PCI_ANY_ID 193 struct rte_pci_device_list device_list;
194 struct rte_pci_driver_list driver_list;
198 #define RTE_PCI_DRV_NEED_MAPPING 0x0001 200 #define RTE_PCI_DRV_INTR_LSC 0x0008 202 #define RTE_PCI_DRV_INTR_RMV 0x0010 204 #define RTE_PCI_DRV_KEEP_MAPPED_RES 0x0020 228 struct pci_map maps[PCI_MAX_RESOURCE];
235 #define GET_PCIADDR_FIELD(in, fd, lim, dlm) \ 240 val = strtoul((in), &end, 16); \ 241 if (errno != 0 || end[0] != (dlm) || val > (lim)) \ 243 (fd) = (typeof (fd))val; \ 264 GET_PCIADDR_FIELD(input, dev_addr->
bus, UINT8_MAX,
':');
265 GET_PCIADDR_FIELD(input, dev_addr->
devid, UINT8_MAX,
'.');
266 GET_PCIADDR_FIELD(input, dev_addr->
function, UINT8_MAX, 0);
285 GET_PCIADDR_FIELD(input, dev_addr->
domain, UINT16_MAX,
':');
286 GET_PCIADDR_FIELD(input, dev_addr->
bus, UINT8_MAX,
':');
287 GET_PCIADDR_FIELD(input, dev_addr->
devid, UINT8_MAX,
'.');
288 GET_PCIADDR_FIELD(input, dev_addr->
function, UINT8_MAX, 0);
291 #undef GET_PCIADDR_FIELD 307 char *output,
size_t size)
309 RTE_VERIFY(size >= PCI_PRI_STR_SIZE);
332 uint64_t dev_addr, dev_addr2;
334 if ((addr == NULL) || (addr2 == NULL))
337 dev_addr = ((uint64_t)addr->
domain << 24) |
339 dev_addr2 = ((uint64_t)addr2->
domain << 24) |
342 if (dev_addr > dev_addr2)
344 else if (dev_addr < dev_addr2)
413 void *pci_map_resource(
void *requested_addr,
int fd, off_t offset,
414 size_t size,
int additional_flags);
425 void pci_unmap_resource(
void *requested_addr,
size_t size);
475 #define RTE_PMD_REGISTER_PCI(nm, pci_drv) \ 476 RTE_INIT(pciinitfn_ ##nm); \ 477 static void pciinitfn_ ##nm(void) \ 479 (pci_drv).driver.name = RTE_STR(nm);\ 480 rte_pci_register(&pci_drv); \ 482 RTE_PMD_EXPORT_NAME(nm, __COUNTER__) 507 void *buf,
size_t len, off_t offset);
523 const void *buf,
size_t len, off_t offset);
577 void *data,
size_t len, off_t offset);
592 const void *data,
size_t len, off_t offset);
struct rte_pci_driver * driver
int rte_pci_probe_one(const struct rte_pci_addr *addr)
void rte_pci_ioport_write(struct rte_pci_ioport *p, const void *data, size_t len, off_t offset)
int() pci_probe_t(struct rte_pci_driver *, struct rte_pci_device *)
int() pci_remove_t(struct rte_pci_device *)
static int eal_parse_pci_DomBDF(const char *input, struct rte_pci_addr *dev_addr)
static int eal_parse_pci_BDF(const char *input, struct rte_pci_addr *dev_addr)
const struct rte_pci_id * id_table
uint16_t subsystem_device_id
void rte_pci_register(struct rte_pci_driver *driver)
void rte_pci_unmap_device(struct rte_pci_device *dev)
int rte_pci_map_device(struct rte_pci_device *dev)
void rte_pci_dump(FILE *f)
int rte_pci_detach(const struct rte_pci_addr *addr)
int rte_pci_write_config(const struct rte_pci_device *device, const void *buf, size_t len, off_t offset)
int rte_pci_ioport_unmap(struct rte_pci_ioport *p)
int rte_pci_ioport_map(struct rte_pci_device *dev, int bar, struct rte_pci_ioport *p)
TAILQ_HEAD(rte_pci_device_list, rte_pci_device)
int rte_pci_read_config(const struct rte_pci_device *device, void *buf, size_t len, off_t offset)
void rte_pci_unregister(struct rte_pci_driver *driver)
uint16_t subsystem_vendor_id
static void rte_pci_device_name(const struct rte_pci_addr *addr, char *output, size_t size)
void rte_pci_ioport_read(struct rte_pci_ioport *p, void *data, size_t len, off_t offset)
const char * pci_get_sysfs_path(void)
static int rte_eal_compare_pci_addr(const struct rte_pci_addr *addr, const struct rte_pci_addr *addr2)