/* SPDX-License-Identifier: BSD-3-Clause * Copyright(c) 2010-2015 Intel Corporation. * Copyright 2013-2014 6WIND S.A. */ #ifndef _RTE_BUS_PCI_H_ #define _RTE_BUS_PCI_H_ /** * @file * PCI device & driver interface */ #ifdef __cplusplus extern "C" { #endif #include #include #include #include #include #include #include #include #include #include /* Forward declarations */ struct rte_pci_device; struct rte_pci_driver; struct rte_pci_ioport; struct rte_devargs; /** * Map the PCI device resources in user space virtual memory address * * Note that driver should not call this function when flag * RTE_PCI_DRV_NEED_MAPPING is set, as EAL will do that for * you when it's on. * * @param dev * A pointer to a rte_pci_device structure describing the device * to use * * @return * 0 on success, negative on error and positive if no driver * is found for the device. */ int rte_pci_map_device(struct rte_pci_device *dev); /** * Unmap this device * * @param dev * A pointer to a rte_pci_device structure describing the device * to use */ void rte_pci_unmap_device(struct rte_pci_device *dev); /** * Dump the content of the PCI bus. * * @param f * A pointer to a file for output */ void rte_pci_dump(FILE *f); /** * Find device's extended PCI capability. * * @param dev * A pointer to rte_pci_device structure. * * @param cap * Extended capability to be found, which can be any from * RTE_PCI_EXT_CAP_ID_*, defined in librte_pci. * * @return * > 0: The offset of the next matching extended capability structure * within the device's PCI configuration space. * < 0: An error in PCI config space read. * = 0: Device does not support it. */ __rte_experimental off_t rte_pci_find_ext_capability(struct rte_pci_device *dev, uint32_t cap); /** * Enables/Disables Bus Master for device's PCI command register. * * @param dev * A pointer to rte_pci_device structure. * @param enable * Enable or disable Bus Master. * * @return * 0 on success, -1 on error in PCI config space read/write. */ __rte_experimental int rte_pci_set_bus_master(struct rte_pci_device *dev, bool enable); /** * Read PCI config space. * * @param device * A pointer to a rte_pci_device structure describing the device * to use * @param buf * A data buffer where the bytes should be read into * @param len * The length of the data buffer. * @param offset * The offset into PCI config space * @return * Number of bytes read on success, negative on error. */ int rte_pci_read_config(const struct rte_pci_device *device, void *buf, size_t len, off_t offset); /** * Write PCI config space. * * @param device * A pointer to a rte_pci_device structure describing the device * to use * @param buf * A data buffer containing the bytes should be written * @param len * The length of the data buffer. * @param offset * The offset into PCI config space */ int rte_pci_write_config(const struct rte_pci_device *device, const void *buf, size_t len, off_t offset); /** * Initialize a rte_pci_ioport object for a pci device io resource. * * This object is then used to gain access to those io resources (see below). * * @param dev * A pointer to a rte_pci_device structure describing the device * to use. * @param bar * Index of the io pci resource we want to access. * @param p * The rte_pci_ioport object to be initialized. * @return * 0 on success, negative on error. */ int rte_pci_ioport_map(struct rte_pci_device *dev, int bar, struct rte_pci_ioport *p); /** * Release any resources used in a rte_pci_ioport object. * * @param p * The rte_pci_ioport object to be uninitialized. * @return * 0 on success, negative on error. */ int rte_pci_ioport_unmap(struct rte_pci_ioport *p); /** * Read from a io pci resource. * * @param p * The rte_pci_ioport object from which we want to read. * @param data * A data buffer where the bytes should be read into * @param len * The length of the data buffer. * @param offset * The offset into the pci io resource. */ void rte_pci_ioport_read(struct rte_pci_ioport *p, void *data, size_t len, off_t offset); /** * Write to a io pci resource. * * @param p * The rte_pci_ioport object to which we want to write. * @param data * A data buffer where the bytes should be read into * @param len * The length of the data buffer. * @param offset * The offset into the pci io resource. */ void rte_pci_ioport_write(struct rte_pci_ioport *p, const void *data, size_t len, off_t offset); #ifdef __cplusplus } #endif #endif /* _RTE_BUS_PCI_H_ */