xref: /spdk/lib/env_dpdk/22.07/rte_bus_pci.h (revision 181143cc7ab96b96ac6aad830c7bb232910a605a)
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