81 #include <sys/queue.h> 94 #define PCI_PRI_FMT "%.4" PRIx16 ":%.2" PRIx8 ":%.2" PRIx8 ".%" PRIx8 95 #define PCI_PRI_STR_SIZE sizeof("XXXX:XX:XX.X") 98 #define PCI_SHORT_PRI_FMT "%.2" PRIx8 ":%.2" PRIx8 ".%" PRIx8 101 #define PCI_FMT_NVAL 4 104 #define PCI_RESOURCE_FMT_NVAL 3 107 #define PCI_MAX_RESOURCE 6 110 #define PCI_BUS_NAME "PCI" 122 #define FOREACH_DEVICE_ON_PCIBUS(p) \ 123 TAILQ_FOREACH(p, &(rte_pci_bus.device_list), next) 125 #define FOREACH_DRIVER_ON_PCIBUS(p) \ 126 TAILQ_FOREACH(p, &(rte_pci_bus.driver_list), next) 152 enum rte_kernel_driver {
153 RTE_KDRV_UNKNOWN = 0,
156 RTE_KDRV_UIO_GENERIC,
171 struct rte_intr_handle intr_handle;
174 enum rte_kernel_driver kdrv;
175 char name[PCI_PRI_STR_SIZE+1];
182 #define RTE_DEV_TO_PCI(ptr) container_of(ptr, struct rte_pci_device, device) 185 #define PCI_ANY_ID (0xffff) 186 #define RTE_CLASS_ANY_ID (0xffffff) 190 #define RTE_PCI_DEVICE(vend, dev) \ 198 #define RTE_PCI_DEVICE(vend, dev) \ 199 .class_id = RTE_CLASS_ANY_ID, \ 200 .vendor_id = (vend), \ 201 .device_id = (dev), \ 202 .subsystem_vendor_id = PCI_ANY_ID, \ 203 .subsystem_device_id = PCI_ANY_ID 234 struct rte_pci_device_list device_list;
235 struct rte_pci_driver_list driver_list;
239 #define RTE_PCI_DRV_NEED_MAPPING 0x0001 241 #define RTE_PCI_DRV_INTR_LSC 0x0008 243 #define RTE_PCI_DRV_INTR_RMV 0x0010 245 #define RTE_PCI_DRV_KEEP_MAPPED_RES 0x0020 269 struct pci_map maps[PCI_MAX_RESOURCE];
276 #define GET_PCIADDR_FIELD(in, fd, lim, dlm) \ 281 val = strtoul((in), &end, 16); \ 282 if (errno != 0 || end[0] != (dlm) || val > (lim)) \ 284 (fd) = (typeof (fd))val; \ 305 GET_PCIADDR_FIELD(input, dev_addr->
bus, UINT8_MAX,
':');
306 GET_PCIADDR_FIELD(input, dev_addr->
devid, UINT8_MAX,
'.');
307 GET_PCIADDR_FIELD(input, dev_addr->
function, UINT8_MAX, 0);
326 GET_PCIADDR_FIELD(input, dev_addr->
domain, UINT16_MAX,
':');
327 GET_PCIADDR_FIELD(input, dev_addr->
bus, UINT8_MAX,
':');
328 GET_PCIADDR_FIELD(input, dev_addr->
devid, UINT8_MAX,
'.');
329 GET_PCIADDR_FIELD(input, dev_addr->
function, UINT8_MAX, 0);
332 #undef GET_PCIADDR_FIELD 348 char *output,
size_t size)
350 RTE_VERIFY(size >= PCI_PRI_STR_SIZE);
373 uint64_t dev_addr, dev_addr2;
375 if ((addr == NULL) || (addr2 == NULL))
378 dev_addr = (addr->
domain << 24) | (addr->
bus << 16) |
380 dev_addr2 = (addr2->
domain << 24) | (addr2->
bus << 16) |
383 if (dev_addr > dev_addr2)
385 else if (dev_addr < dev_addr2)
454 void *pci_map_resource(
void *requested_addr,
int fd, off_t offset,
455 size_t size,
int additional_flags);
466 void pci_unmap_resource(
void *requested_addr,
size_t size);
516 #define RTE_PMD_REGISTER_PCI(nm, pci_drv) \ 517 RTE_INIT(pciinitfn_ ##nm); \ 518 static void pciinitfn_ ##nm(void) \ 520 (pci_drv).driver.name = RTE_STR(nm);\ 521 rte_pci_register(&pci_drv); \ 523 RTE_PMD_EXPORT_NAME(nm, __COUNTER__) 548 void *buf,
size_t len, off_t offset);
564 const void *buf,
size_t len, off_t offset);
618 void *data,
size_t len, off_t offset);
633 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)