11eb35ac7SJim Harris /* SPDX-License-Identifier: BSD-3-Clause 27019dbbdSTomasz Zawadzki * Copyright(c) 2010-2015 Intel Corporation. 31eb35ac7SJim Harris * Copyright 2013-2014 6WIND S.A. 41eb35ac7SJim Harris */ 51eb35ac7SJim Harris 61eb35ac7SJim Harris #ifndef _RTE_BUS_PCI_H_ 71eb35ac7SJim Harris #define _RTE_BUS_PCI_H_ 81eb35ac7SJim Harris 91eb35ac7SJim Harris /** 101eb35ac7SJim Harris * @file 111eb35ac7SJim Harris * PCI device & driver interface 121eb35ac7SJim Harris */ 131eb35ac7SJim Harris 141eb35ac7SJim Harris #ifdef __cplusplus 151eb35ac7SJim Harris extern "C" { 161eb35ac7SJim Harris #endif 171eb35ac7SJim Harris 181eb35ac7SJim Harris #include <stdio.h> 191eb35ac7SJim Harris #include <stdlib.h> 201eb35ac7SJim Harris #include <limits.h> 211eb35ac7SJim Harris #include <errno.h> 221eb35ac7SJim Harris #include <stdint.h> 231eb35ac7SJim Harris #include <inttypes.h> 241eb35ac7SJim Harris 251eb35ac7SJim Harris #include <rte_debug.h> 261eb35ac7SJim Harris #include <rte_interrupts.h> 27*fcbbd17aSTomasz Zawadzki #include "rte_dev.h" 28*fcbbd17aSTomasz Zawadzki #include "rte_bus.h" 291eb35ac7SJim Harris #include <rte_pci.h> 301eb35ac7SJim Harris 311eb35ac7SJim Harris /** Pathname of PCI devices directory. */ 321eb35ac7SJim Harris const char *rte_pci_get_sysfs_path(void); 331eb35ac7SJim Harris 341eb35ac7SJim Harris /* Forward declarations */ 351eb35ac7SJim Harris struct rte_pci_device; 361eb35ac7SJim Harris struct rte_pci_driver; 371eb35ac7SJim Harris 381eb35ac7SJim Harris /** List of PCI devices */ 391eb35ac7SJim Harris RTE_TAILQ_HEAD(rte_pci_device_list, rte_pci_device); 401eb35ac7SJim Harris /** List of PCI drivers */ 411eb35ac7SJim Harris RTE_TAILQ_HEAD(rte_pci_driver_list, rte_pci_driver); 421eb35ac7SJim Harris 431eb35ac7SJim Harris /* PCI Bus iterators */ 441eb35ac7SJim Harris #define FOREACH_DEVICE_ON_PCIBUS(p) \ 451eb35ac7SJim Harris RTE_TAILQ_FOREACH(p, &(rte_pci_bus.device_list), next) 461eb35ac7SJim Harris 471eb35ac7SJim Harris #define FOREACH_DRIVER_ON_PCIBUS(p) \ 481eb35ac7SJim Harris RTE_TAILQ_FOREACH(p, &(rte_pci_bus.driver_list), next) 491eb35ac7SJim Harris 501eb35ac7SJim Harris struct rte_devargs; 511eb35ac7SJim Harris 521eb35ac7SJim Harris enum rte_pci_kernel_driver { 531eb35ac7SJim Harris RTE_PCI_KDRV_UNKNOWN = 0, /* may be misc UIO or bifurcated driver */ 541eb35ac7SJim Harris RTE_PCI_KDRV_IGB_UIO, /* igb_uio for Linux */ 551eb35ac7SJim Harris RTE_PCI_KDRV_VFIO, /* VFIO for Linux */ 561eb35ac7SJim Harris RTE_PCI_KDRV_UIO_GENERIC, /* uio_pci_generic for Linux */ 571eb35ac7SJim Harris RTE_PCI_KDRV_NIC_UIO, /* nic_uio for FreeBSD */ 581eb35ac7SJim Harris RTE_PCI_KDRV_NONE, /* no attached driver */ 591eb35ac7SJim Harris RTE_PCI_KDRV_NET_UIO, /* NetUIO for Windows */ 601eb35ac7SJim Harris }; 611eb35ac7SJim Harris 621eb35ac7SJim Harris /** 631eb35ac7SJim Harris * A structure describing a PCI device. 641eb35ac7SJim Harris */ 651eb35ac7SJim Harris struct rte_pci_device { 661eb35ac7SJim Harris RTE_TAILQ_ENTRY(rte_pci_device) next; /**< Next probed PCI device. */ 671eb35ac7SJim Harris struct rte_device device; /**< Inherit core device */ 681eb35ac7SJim Harris struct rte_pci_addr addr; /**< PCI location. */ 691eb35ac7SJim Harris struct rte_pci_id id; /**< PCI ID. */ 701eb35ac7SJim Harris struct rte_mem_resource mem_resource[PCI_MAX_RESOURCE]; 711eb35ac7SJim Harris /**< PCI Memory Resource */ 721eb35ac7SJim Harris struct rte_intr_handle *intr_handle; /**< Interrupt handle */ 731eb35ac7SJim Harris struct rte_pci_driver *driver; /**< PCI driver used in probing */ 741eb35ac7SJim Harris uint16_t max_vfs; /**< sriov enable if not zero */ 751eb35ac7SJim Harris enum rte_pci_kernel_driver kdrv; /**< Kernel driver passthrough */ 761eb35ac7SJim Harris char name[PCI_PRI_STR_SIZE+1]; /**< PCI location (ASCII) */ 771eb35ac7SJim Harris struct rte_intr_handle *vfio_req_intr_handle; 781eb35ac7SJim Harris /**< Handler of VFIO request interrupt */ 791eb35ac7SJim Harris }; 801eb35ac7SJim Harris 811eb35ac7SJim Harris /** 821eb35ac7SJim Harris * @internal 831eb35ac7SJim Harris * Helper macro for drivers that need to convert to struct rte_pci_device. 841eb35ac7SJim Harris */ 851eb35ac7SJim Harris #define RTE_DEV_TO_PCI(ptr) container_of(ptr, struct rte_pci_device, device) 861eb35ac7SJim Harris 871eb35ac7SJim Harris #define RTE_DEV_TO_PCI_CONST(ptr) \ 881eb35ac7SJim Harris container_of(ptr, const struct rte_pci_device, device) 891eb35ac7SJim Harris 901eb35ac7SJim Harris #define RTE_ETH_DEV_TO_PCI(eth_dev) RTE_DEV_TO_PCI((eth_dev)->device) 911eb35ac7SJim Harris 921eb35ac7SJim Harris #ifdef __cplusplus 931eb35ac7SJim Harris /** C++ macro used to help building up tables of device IDs */ 941eb35ac7SJim Harris #define RTE_PCI_DEVICE(vend, dev) \ 951eb35ac7SJim Harris RTE_CLASS_ANY_ID, \ 961eb35ac7SJim Harris (vend), \ 971eb35ac7SJim Harris (dev), \ 981eb35ac7SJim Harris RTE_PCI_ANY_ID, \ 991eb35ac7SJim Harris RTE_PCI_ANY_ID 1001eb35ac7SJim Harris #else 1011eb35ac7SJim Harris /** Macro used to help building up tables of device IDs */ 1021eb35ac7SJim Harris #define RTE_PCI_DEVICE(vend, dev) \ 1031eb35ac7SJim Harris .class_id = RTE_CLASS_ANY_ID, \ 1041eb35ac7SJim Harris .vendor_id = (vend), \ 1051eb35ac7SJim Harris .device_id = (dev), \ 1061eb35ac7SJim Harris .subsystem_vendor_id = RTE_PCI_ANY_ID, \ 1071eb35ac7SJim Harris .subsystem_device_id = RTE_PCI_ANY_ID 1081eb35ac7SJim Harris #endif 1091eb35ac7SJim Harris 1101eb35ac7SJim Harris /** 1111eb35ac7SJim Harris * Initialisation function for the driver called during PCI probing. 1121eb35ac7SJim Harris */ 1131eb35ac7SJim Harris typedef int (rte_pci_probe_t)(struct rte_pci_driver *, struct rte_pci_device *); 1141eb35ac7SJim Harris 1151eb35ac7SJim Harris /** 1161eb35ac7SJim Harris * Uninitialisation function for the driver called during hotplugging. 1171eb35ac7SJim Harris */ 1181eb35ac7SJim Harris typedef int (rte_pci_remove_t)(struct rte_pci_device *); 1191eb35ac7SJim Harris 1201eb35ac7SJim Harris /** 1211eb35ac7SJim Harris * Driver-specific DMA mapping. After a successful call the device 1221eb35ac7SJim Harris * will be able to read/write from/to this segment. 1231eb35ac7SJim Harris * 1241eb35ac7SJim Harris * @param dev 1251eb35ac7SJim Harris * Pointer to the PCI device. 1261eb35ac7SJim Harris * @param addr 1271eb35ac7SJim Harris * Starting virtual address of memory to be mapped. 1281eb35ac7SJim Harris * @param iova 1291eb35ac7SJim Harris * Starting IOVA address of memory to be mapped. 1301eb35ac7SJim Harris * @param len 1311eb35ac7SJim Harris * Length of memory segment being mapped. 1321eb35ac7SJim Harris * @return 1331eb35ac7SJim Harris * - 0 On success. 1341eb35ac7SJim Harris * - Negative value and rte_errno is set otherwise. 1351eb35ac7SJim Harris */ 1361eb35ac7SJim Harris typedef int (pci_dma_map_t)(struct rte_pci_device *dev, void *addr, 1371eb35ac7SJim Harris uint64_t iova, size_t len); 1381eb35ac7SJim Harris 1391eb35ac7SJim Harris /** 1401eb35ac7SJim Harris * Driver-specific DMA un-mapping. After a successful call the device 1411eb35ac7SJim Harris * will not be able to read/write from/to this segment. 1421eb35ac7SJim Harris * 1431eb35ac7SJim Harris * @param dev 1441eb35ac7SJim Harris * Pointer to the PCI device. 1451eb35ac7SJim Harris * @param addr 1461eb35ac7SJim Harris * Starting virtual address of memory to be unmapped. 1471eb35ac7SJim Harris * @param iova 1481eb35ac7SJim Harris * Starting IOVA address of memory to be unmapped. 1491eb35ac7SJim Harris * @param len 1501eb35ac7SJim Harris * Length of memory segment being unmapped. 1511eb35ac7SJim Harris * @return 1521eb35ac7SJim Harris * - 0 On success. 1531eb35ac7SJim Harris * - Negative value and rte_errno is set otherwise. 1541eb35ac7SJim Harris */ 1551eb35ac7SJim Harris typedef int (pci_dma_unmap_t)(struct rte_pci_device *dev, void *addr, 1561eb35ac7SJim Harris uint64_t iova, size_t len); 1571eb35ac7SJim Harris 1581eb35ac7SJim Harris /** 1591eb35ac7SJim Harris * A structure describing a PCI driver. 1601eb35ac7SJim Harris */ 1611eb35ac7SJim Harris struct rte_pci_driver { 1621eb35ac7SJim Harris RTE_TAILQ_ENTRY(rte_pci_driver) next; /**< Next in list. */ 1631eb35ac7SJim Harris struct rte_driver driver; /**< Inherit core driver. */ 1641eb35ac7SJim Harris struct rte_pci_bus *bus; /**< PCI bus reference. */ 1651eb35ac7SJim Harris rte_pci_probe_t *probe; /**< Device probe function. */ 1661eb35ac7SJim Harris rte_pci_remove_t *remove; /**< Device remove function. */ 1671eb35ac7SJim Harris pci_dma_map_t *dma_map; /**< device dma map function. */ 1681eb35ac7SJim Harris pci_dma_unmap_t *dma_unmap; /**< device dma unmap function. */ 1691eb35ac7SJim Harris const struct rte_pci_id *id_table; /**< ID table, NULL terminated. */ 1701eb35ac7SJim Harris uint32_t drv_flags; /**< Flags RTE_PCI_DRV_*. */ 1711eb35ac7SJim Harris }; 1721eb35ac7SJim Harris 1731eb35ac7SJim Harris /** 1741eb35ac7SJim Harris * Structure describing the PCI bus 1751eb35ac7SJim Harris */ 1761eb35ac7SJim Harris struct rte_pci_bus { 1771eb35ac7SJim Harris struct rte_bus bus; /**< Inherit the generic class */ 1781eb35ac7SJim Harris struct rte_pci_device_list device_list; /**< List of PCI devices */ 1791eb35ac7SJim Harris struct rte_pci_driver_list driver_list; /**< List of PCI drivers */ 1801eb35ac7SJim Harris }; 1811eb35ac7SJim Harris 1821eb35ac7SJim Harris /** Device needs PCI BAR mapping (done with either IGB_UIO or VFIO) */ 1831eb35ac7SJim Harris #define RTE_PCI_DRV_NEED_MAPPING 0x0001 1841eb35ac7SJim Harris /** Device needs PCI BAR mapping with enabled write combining (wc) */ 1851eb35ac7SJim Harris #define RTE_PCI_DRV_WC_ACTIVATE 0x0002 1861eb35ac7SJim Harris /** Device already probed can be probed again to check for new ports. */ 1871eb35ac7SJim Harris #define RTE_PCI_DRV_PROBE_AGAIN 0x0004 1881eb35ac7SJim Harris /** Device driver supports link state interrupt */ 1891eb35ac7SJim Harris #define RTE_PCI_DRV_INTR_LSC 0x0008 1901eb35ac7SJim Harris /** Device driver supports device removal interrupt */ 1911eb35ac7SJim Harris #define RTE_PCI_DRV_INTR_RMV 0x0010 1921eb35ac7SJim Harris /** Device driver needs to keep mapped resources if unsupported dev detected */ 1931eb35ac7SJim Harris #define RTE_PCI_DRV_KEEP_MAPPED_RES 0x0020 1941eb35ac7SJim Harris /** Device driver needs IOVA as VA and cannot work with IOVA as PA */ 1951eb35ac7SJim Harris #define RTE_PCI_DRV_NEED_IOVA_AS_VA 0x0040 1961eb35ac7SJim Harris 1971eb35ac7SJim Harris /** 1981eb35ac7SJim Harris * Map the PCI device resources in user space virtual memory address 1991eb35ac7SJim Harris * 2001eb35ac7SJim Harris * Note that driver should not call this function when flag 2011eb35ac7SJim Harris * RTE_PCI_DRV_NEED_MAPPING is set, as EAL will do that for 2021eb35ac7SJim Harris * you when it's on. 2031eb35ac7SJim Harris * 2041eb35ac7SJim Harris * @param dev 2051eb35ac7SJim Harris * A pointer to a rte_pci_device structure describing the device 2061eb35ac7SJim Harris * to use 2071eb35ac7SJim Harris * 2081eb35ac7SJim Harris * @return 2091eb35ac7SJim Harris * 0 on success, negative on error and positive if no driver 2101eb35ac7SJim Harris * is found for the device. 2111eb35ac7SJim Harris */ 2121eb35ac7SJim Harris int rte_pci_map_device(struct rte_pci_device *dev); 2131eb35ac7SJim Harris 2141eb35ac7SJim Harris /** 2151eb35ac7SJim Harris * Unmap this device 2161eb35ac7SJim Harris * 2171eb35ac7SJim Harris * @param dev 2181eb35ac7SJim Harris * A pointer to a rte_pci_device structure describing the device 2191eb35ac7SJim Harris * to use 2201eb35ac7SJim Harris */ 2211eb35ac7SJim Harris void rte_pci_unmap_device(struct rte_pci_device *dev); 2221eb35ac7SJim Harris 2231eb35ac7SJim Harris /** 2241eb35ac7SJim Harris * Dump the content of the PCI bus. 2251eb35ac7SJim Harris * 2261eb35ac7SJim Harris * @param f 2271eb35ac7SJim Harris * A pointer to a file for output 2281eb35ac7SJim Harris */ 2291eb35ac7SJim Harris void rte_pci_dump(FILE *f); 2301eb35ac7SJim Harris 2311eb35ac7SJim Harris /** 2321eb35ac7SJim Harris * Find device's extended PCI capability. 2331eb35ac7SJim Harris * 2341eb35ac7SJim Harris * @param dev 2351eb35ac7SJim Harris * A pointer to rte_pci_device structure. 2361eb35ac7SJim Harris * 2371eb35ac7SJim Harris * @param cap 2381eb35ac7SJim Harris * Extended capability to be found, which can be any from 2391eb35ac7SJim Harris * RTE_PCI_EXT_CAP_ID_*, defined in librte_pci. 2401eb35ac7SJim Harris * 2411eb35ac7SJim Harris * @return 2421eb35ac7SJim Harris * > 0: The offset of the next matching extended capability structure 2431eb35ac7SJim Harris * within the device's PCI configuration space. 2441eb35ac7SJim Harris * < 0: An error in PCI config space read. 2451eb35ac7SJim Harris * = 0: Device does not support it. 2461eb35ac7SJim Harris */ 2471eb35ac7SJim Harris __rte_experimental 2481eb35ac7SJim Harris off_t rte_pci_find_ext_capability(struct rte_pci_device *dev, uint32_t cap); 2491eb35ac7SJim Harris 2501eb35ac7SJim Harris /** 2511eb35ac7SJim Harris * Enables/Disables Bus Master for device's PCI command register. 2521eb35ac7SJim Harris * 2531eb35ac7SJim Harris * @param dev 2541eb35ac7SJim Harris * A pointer to rte_pci_device structure. 2551eb35ac7SJim Harris * @param enable 2561eb35ac7SJim Harris * Enable or disable Bus Master. 2571eb35ac7SJim Harris * 2581eb35ac7SJim Harris * @return 2591eb35ac7SJim Harris * 0 on success, -1 on error in PCI config space read/write. 2601eb35ac7SJim Harris */ 2611eb35ac7SJim Harris __rte_experimental 2621eb35ac7SJim Harris int rte_pci_set_bus_master(struct rte_pci_device *dev, bool enable); 2631eb35ac7SJim Harris 2641eb35ac7SJim Harris /** 2651eb35ac7SJim Harris * Register a PCI driver. 2661eb35ac7SJim Harris * 2671eb35ac7SJim Harris * @param driver 2681eb35ac7SJim Harris * A pointer to a rte_pci_driver structure describing the driver 2691eb35ac7SJim Harris * to be registered. 2701eb35ac7SJim Harris */ 2711eb35ac7SJim Harris void rte_pci_register(struct rte_pci_driver *driver); 2721eb35ac7SJim Harris 2731eb35ac7SJim Harris /** Helper for PCI device registration from driver (eth, crypto) instance */ 2741eb35ac7SJim Harris #define RTE_PMD_REGISTER_PCI(nm, pci_drv) \ 2751eb35ac7SJim Harris RTE_INIT(pciinitfn_ ##nm) \ 2761eb35ac7SJim Harris {\ 2771eb35ac7SJim Harris (pci_drv).driver.name = RTE_STR(nm);\ 2781eb35ac7SJim Harris rte_pci_register(&pci_drv); \ 2791eb35ac7SJim Harris } \ 2801eb35ac7SJim Harris RTE_PMD_EXPORT_NAME(nm, __COUNTER__) 2811eb35ac7SJim Harris 2821eb35ac7SJim Harris /** 2831eb35ac7SJim Harris * Unregister a PCI driver. 2841eb35ac7SJim Harris * 2851eb35ac7SJim Harris * @param driver 2861eb35ac7SJim Harris * A pointer to a rte_pci_driver structure describing the driver 2871eb35ac7SJim Harris * to be unregistered. 2881eb35ac7SJim Harris */ 2891eb35ac7SJim Harris void rte_pci_unregister(struct rte_pci_driver *driver); 2901eb35ac7SJim Harris 2911eb35ac7SJim Harris /** 2921eb35ac7SJim Harris * Read PCI config space. 2931eb35ac7SJim Harris * 2941eb35ac7SJim Harris * @param device 2951eb35ac7SJim Harris * A pointer to a rte_pci_device structure describing the device 2961eb35ac7SJim Harris * to use 2971eb35ac7SJim Harris * @param buf 2981eb35ac7SJim Harris * A data buffer where the bytes should be read into 2991eb35ac7SJim Harris * @param len 3001eb35ac7SJim Harris * The length of the data buffer. 3011eb35ac7SJim Harris * @param offset 3021eb35ac7SJim Harris * The offset into PCI config space 3031eb35ac7SJim Harris * @return 3041eb35ac7SJim Harris * Number of bytes read on success, negative on error. 3051eb35ac7SJim Harris */ 3061eb35ac7SJim Harris int rte_pci_read_config(const struct rte_pci_device *device, 3071eb35ac7SJim Harris void *buf, size_t len, off_t offset); 3081eb35ac7SJim Harris 3091eb35ac7SJim Harris /** 3101eb35ac7SJim Harris * Write PCI config space. 3111eb35ac7SJim Harris * 3121eb35ac7SJim Harris * @param device 3131eb35ac7SJim Harris * A pointer to a rte_pci_device structure describing the device 3141eb35ac7SJim Harris * to use 3151eb35ac7SJim Harris * @param buf 3161eb35ac7SJim Harris * A data buffer containing the bytes should be written 3171eb35ac7SJim Harris * @param len 3181eb35ac7SJim Harris * The length of the data buffer. 3191eb35ac7SJim Harris * @param offset 3201eb35ac7SJim Harris * The offset into PCI config space 3211eb35ac7SJim Harris */ 3221eb35ac7SJim Harris int rte_pci_write_config(const struct rte_pci_device *device, 3231eb35ac7SJim Harris const void *buf, size_t len, off_t offset); 3241eb35ac7SJim Harris 3251eb35ac7SJim Harris /** 3261eb35ac7SJim Harris * A structure used to access io resources for a pci device. 3271eb35ac7SJim Harris * rte_pci_ioport is arch, os, driver specific, and should not be used outside 3281eb35ac7SJim Harris * of pci ioport api. 3291eb35ac7SJim Harris */ 3301eb35ac7SJim Harris struct rte_pci_ioport { 3311eb35ac7SJim Harris struct rte_pci_device *dev; 3321eb35ac7SJim Harris uint64_t base; 3331eb35ac7SJim Harris uint64_t len; /* only filled for memory mapped ports */ 3341eb35ac7SJim Harris }; 3351eb35ac7SJim Harris 3361eb35ac7SJim Harris /** 3371eb35ac7SJim Harris * Initialize a rte_pci_ioport object for a pci device io resource. 3381eb35ac7SJim Harris * 3391eb35ac7SJim Harris * This object is then used to gain access to those io resources (see below). 3401eb35ac7SJim Harris * 3411eb35ac7SJim Harris * @param dev 3421eb35ac7SJim Harris * A pointer to a rte_pci_device structure describing the device 3431eb35ac7SJim Harris * to use. 3441eb35ac7SJim Harris * @param bar 3451eb35ac7SJim Harris * Index of the io pci resource we want to access. 3461eb35ac7SJim Harris * @param p 3471eb35ac7SJim Harris * The rte_pci_ioport object to be initialized. 3481eb35ac7SJim Harris * @return 3491eb35ac7SJim Harris * 0 on success, negative on error. 3501eb35ac7SJim Harris */ 3511eb35ac7SJim Harris int rte_pci_ioport_map(struct rte_pci_device *dev, int bar, 3521eb35ac7SJim Harris struct rte_pci_ioport *p); 3531eb35ac7SJim Harris 3541eb35ac7SJim Harris /** 3551eb35ac7SJim Harris * Release any resources used in a rte_pci_ioport object. 3561eb35ac7SJim Harris * 3571eb35ac7SJim Harris * @param p 3581eb35ac7SJim Harris * The rte_pci_ioport object to be uninitialized. 3591eb35ac7SJim Harris * @return 3601eb35ac7SJim Harris * 0 on success, negative on error. 3611eb35ac7SJim Harris */ 3621eb35ac7SJim Harris int rte_pci_ioport_unmap(struct rte_pci_ioport *p); 3631eb35ac7SJim Harris 3641eb35ac7SJim Harris /** 3651eb35ac7SJim Harris * Read from a io pci resource. 3661eb35ac7SJim Harris * 3671eb35ac7SJim Harris * @param p 3681eb35ac7SJim Harris * The rte_pci_ioport object from which we want to read. 3691eb35ac7SJim Harris * @param data 3701eb35ac7SJim Harris * A data buffer where the bytes should be read into 3711eb35ac7SJim Harris * @param len 3721eb35ac7SJim Harris * The length of the data buffer. 3731eb35ac7SJim Harris * @param offset 3741eb35ac7SJim Harris * The offset into the pci io resource. 3751eb35ac7SJim Harris */ 3761eb35ac7SJim Harris void rte_pci_ioport_read(struct rte_pci_ioport *p, 3771eb35ac7SJim Harris void *data, size_t len, off_t offset); 3781eb35ac7SJim Harris 3791eb35ac7SJim Harris /** 3801eb35ac7SJim Harris * Write to a io pci resource. 3811eb35ac7SJim Harris * 3821eb35ac7SJim Harris * @param p 3831eb35ac7SJim Harris * The rte_pci_ioport object to which we want to write. 3841eb35ac7SJim Harris * @param data 3851eb35ac7SJim Harris * A data buffer where the bytes should be read into 3861eb35ac7SJim Harris * @param len 3871eb35ac7SJim Harris * The length of the data buffer. 3881eb35ac7SJim Harris * @param offset 3891eb35ac7SJim Harris * The offset into the pci io resource. 3901eb35ac7SJim Harris */ 3911eb35ac7SJim Harris void rte_pci_ioport_write(struct rte_pci_ioport *p, 3921eb35ac7SJim Harris const void *data, size_t len, off_t offset); 3931eb35ac7SJim Harris 3941eb35ac7SJim Harris #ifdef __cplusplus 3951eb35ac7SJim Harris } 3961eb35ac7SJim Harris #endif 3971eb35ac7SJim Harris 3981eb35ac7SJim Harris #endif /* _RTE_BUS_PCI_H_ */ 399