net/ipn3ke: fix null pointer dereference
[dpdk.git] / drivers / bus / pci / rte_bus_pci.h
1 /* SPDX-License-Identifier: BSD-3-Clause
2  * Copyright(c) 2010-2015 Intel Corporation.
3  * Copyright 2013-2014 6WIND S.A.
4  */
5
6 #ifndef _RTE_BUS_PCI_H_
7 #define _RTE_BUS_PCI_H_
8
9 /**
10  * @file
11  *
12  * RTE PCI Bus Interface
13  */
14
15 #ifdef __cplusplus
16 extern "C" {
17 #endif
18
19 #include <stdio.h>
20 #include <stdlib.h>
21 #include <limits.h>
22 #include <errno.h>
23 #include <sys/queue.h>
24 #include <stdint.h>
25 #include <inttypes.h>
26
27 #include <rte_debug.h>
28 #include <rte_interrupts.h>
29 #include <rte_dev.h>
30 #include <rte_bus.h>
31 #include <rte_pci.h>
32
33 /** Pathname of PCI devices directory. */
34 const char *rte_pci_get_sysfs_path(void);
35
36 /* Forward declarations */
37 struct rte_pci_device;
38 struct rte_pci_driver;
39
40 /** List of PCI devices */
41 TAILQ_HEAD(rte_pci_device_list, rte_pci_device);
42 /** List of PCI drivers */
43 TAILQ_HEAD(rte_pci_driver_list, rte_pci_driver);
44
45 /* PCI Bus iterators */
46 #define FOREACH_DEVICE_ON_PCIBUS(p)     \
47                 TAILQ_FOREACH(p, &(rte_pci_bus.device_list), next)
48
49 #define FOREACH_DRIVER_ON_PCIBUS(p)     \
50                 TAILQ_FOREACH(p, &(rte_pci_bus.driver_list), next)
51
52 struct rte_devargs;
53
54 /**
55  * A structure describing a PCI device.
56  */
57 struct rte_pci_device {
58         TAILQ_ENTRY(rte_pci_device) next;   /**< Next probed PCI device. */
59         struct rte_device device;           /**< Inherit core device */
60         struct rte_pci_addr addr;           /**< PCI location. */
61         struct rte_pci_id id;               /**< PCI ID. */
62         struct rte_mem_resource mem_resource[PCI_MAX_RESOURCE];
63                                             /**< PCI Memory Resource */
64         struct rte_intr_handle intr_handle; /**< Interrupt handle */
65         struct rte_pci_driver *driver;      /**< PCI driver used in probing */
66         uint16_t max_vfs;                   /**< sriov enable if not zero */
67         enum rte_kernel_driver kdrv;        /**< Kernel driver passthrough */
68         char name[PCI_PRI_STR_SIZE+1];      /**< PCI location (ASCII) */
69         struct rte_intr_handle vfio_req_intr_handle;
70                                 /**< Handler of VFIO request interrupt */
71 };
72
73 /**
74  * @internal
75  * Helper macro for drivers that need to convert to struct rte_pci_device.
76  */
77 #define RTE_DEV_TO_PCI(ptr) container_of(ptr, struct rte_pci_device, device)
78
79 #define RTE_DEV_TO_PCI_CONST(ptr) \
80         container_of(ptr, const struct rte_pci_device, device)
81
82 #define RTE_ETH_DEV_TO_PCI(eth_dev)     RTE_DEV_TO_PCI((eth_dev)->device)
83
84 /** Any PCI device identifier (vendor, device, ...) */
85 #define PCI_ANY_ID (0xffff)
86 #define RTE_CLASS_ANY_ID (0xffffff)
87
88 #ifdef __cplusplus
89 /** C++ macro used to help building up tables of device IDs */
90 #define RTE_PCI_DEVICE(vend, dev) \
91         RTE_CLASS_ANY_ID,         \
92         (vend),                   \
93         (dev),                    \
94         PCI_ANY_ID,               \
95         PCI_ANY_ID
96 #else
97 /** Macro used to help building up tables of device IDs */
98 #define RTE_PCI_DEVICE(vend, dev)          \
99         .class_id = RTE_CLASS_ANY_ID,      \
100         .vendor_id = (vend),               \
101         .device_id = (dev),                \
102         .subsystem_vendor_id = PCI_ANY_ID, \
103         .subsystem_device_id = PCI_ANY_ID
104 #endif
105
106 /**
107  * Initialisation function for the driver called during PCI probing.
108  */
109 typedef int (pci_probe_t)(struct rte_pci_driver *, struct rte_pci_device *);
110
111 /**
112  * Uninitialisation function for the driver called during hotplugging.
113  */
114 typedef int (pci_remove_t)(struct rte_pci_device *);
115
116 /**
117  * Driver-specific DMA mapping. After a successful call the device
118  * will be able to read/write from/to this segment.
119  *
120  * @param dev
121  *   Pointer to the PCI device.
122  * @param addr
123  *   Starting virtual address of memory to be mapped.
124  * @param iova
125  *   Starting IOVA address of memory to be mapped.
126  * @param len
127  *   Length of memory segment being mapped.
128  * @return
129  *   - 0 On success.
130  *   - Negative value and rte_errno is set otherwise.
131  */
132 typedef int (pci_dma_map_t)(struct rte_pci_device *dev, void *addr,
133                             uint64_t iova, size_t len);
134
135 /**
136  * Driver-specific DMA un-mapping. After a successful call the device
137  * will not be able to read/write from/to this segment.
138  *
139  * @param dev
140  *   Pointer to the PCI device.
141  * @param addr
142  *   Starting virtual address of memory to be unmapped.
143  * @param iova
144  *   Starting IOVA address of memory to be unmapped.
145  * @param len
146  *   Length of memory segment being unmapped.
147  * @return
148  *   - 0 On success.
149  *   - Negative value and rte_errno is set otherwise.
150  */
151 typedef int (pci_dma_unmap_t)(struct rte_pci_device *dev, void *addr,
152                               uint64_t iova, size_t len);
153
154 /**
155  * A structure describing a PCI driver.
156  */
157 struct rte_pci_driver {
158         TAILQ_ENTRY(rte_pci_driver) next;  /**< Next in list. */
159         struct rte_driver driver;          /**< Inherit core driver. */
160         struct rte_pci_bus *bus;           /**< PCI bus reference. */
161         pci_probe_t *probe;                /**< Device Probe function. */
162         pci_remove_t *remove;              /**< Device Remove function. */
163         pci_dma_map_t *dma_map;            /**< device dma map function. */
164         pci_dma_unmap_t *dma_unmap;        /**< device dma unmap function. */
165         const struct rte_pci_id *id_table; /**< ID table, NULL terminated. */
166         uint32_t drv_flags;                /**< Flags RTE_PCI_DRV_*. */
167 };
168
169 /**
170  * Structure describing the PCI bus
171  */
172 struct rte_pci_bus {
173         struct rte_bus bus;               /**< Inherit the generic class */
174         struct rte_pci_device_list device_list;  /**< List of PCI devices */
175         struct rte_pci_driver_list driver_list;  /**< List of PCI drivers */
176 };
177
178 /** Device needs PCI BAR mapping (done with either IGB_UIO or VFIO) */
179 #define RTE_PCI_DRV_NEED_MAPPING 0x0001
180 /** Device needs PCI BAR mapping with enabled write combining (wc) */
181 #define RTE_PCI_DRV_WC_ACTIVATE 0x0002
182 /** Device already probed can be probed again to check for new ports. */
183 #define RTE_PCI_DRV_PROBE_AGAIN 0x0004
184 /** Device driver supports link state interrupt */
185 #define RTE_PCI_DRV_INTR_LSC    0x0008
186 /** Device driver supports device removal interrupt */
187 #define RTE_PCI_DRV_INTR_RMV 0x0010
188 /** Device driver needs to keep mapped resources if unsupported dev detected */
189 #define RTE_PCI_DRV_KEEP_MAPPED_RES 0x0020
190 /** Device driver supports IOVA as VA */
191 #define RTE_PCI_DRV_IOVA_AS_VA 0X0040
192
193 /**
194  * Map the PCI device resources in user space virtual memory address
195  *
196  * Note that driver should not call this function when flag
197  * RTE_PCI_DRV_NEED_MAPPING is set, as EAL will do that for
198  * you when it's on.
199  *
200  * @param dev
201  *   A pointer to a rte_pci_device structure describing the device
202  *   to use
203  *
204  * @return
205  *   0 on success, negative on error and positive if no driver
206  *   is found for the device.
207  */
208 int rte_pci_map_device(struct rte_pci_device *dev);
209
210 /**
211  * Unmap this device
212  *
213  * @param dev
214  *   A pointer to a rte_pci_device structure describing the device
215  *   to use
216  */
217 void rte_pci_unmap_device(struct rte_pci_device *dev);
218
219 /**
220  * Dump the content of the PCI bus.
221  *
222  * @param f
223  *   A pointer to a file for output
224  */
225 void rte_pci_dump(FILE *f);
226
227 /**
228  * Register a PCI driver.
229  *
230  * @param driver
231  *   A pointer to a rte_pci_driver structure describing the driver
232  *   to be registered.
233  */
234 void rte_pci_register(struct rte_pci_driver *driver);
235
236 /** Helper for PCI device registration from driver (eth, crypto) instance */
237 #define RTE_PMD_REGISTER_PCI(nm, pci_drv) \
238 RTE_INIT(pciinitfn_ ##nm) \
239 {\
240         (pci_drv).driver.name = RTE_STR(nm);\
241         rte_pci_register(&pci_drv); \
242 } \
243 RTE_PMD_EXPORT_NAME(nm, __COUNTER__)
244
245 /**
246  * Unregister a PCI driver.
247  *
248  * @param driver
249  *   A pointer to a rte_pci_driver structure describing the driver
250  *   to be unregistered.
251  */
252 void rte_pci_unregister(struct rte_pci_driver *driver);
253
254 /**
255  * Read PCI config space.
256  *
257  * @param device
258  *   A pointer to a rte_pci_device structure describing the device
259  *   to use
260  * @param buf
261  *   A data buffer where the bytes should be read into
262  * @param len
263  *   The length of the data buffer.
264  * @param offset
265  *   The offset into PCI config space
266  * @return
267  *  Number of bytes read on success, negative on error.
268  */
269 int rte_pci_read_config(const struct rte_pci_device *device,
270                 void *buf, size_t len, off_t offset);
271
272 /**
273  * Write PCI config space.
274  *
275  * @param device
276  *   A pointer to a rte_pci_device structure describing the device
277  *   to use
278  * @param buf
279  *   A data buffer containing the bytes should be written
280  * @param len
281  *   The length of the data buffer.
282  * @param offset
283  *   The offset into PCI config space
284  */
285 int rte_pci_write_config(const struct rte_pci_device *device,
286                 const void *buf, size_t len, off_t offset);
287
288 /**
289  * A structure used to access io resources for a pci device.
290  * rte_pci_ioport is arch, os, driver specific, and should not be used outside
291  * of pci ioport api.
292  */
293 struct rte_pci_ioport {
294         struct rte_pci_device *dev;
295         uint64_t base;
296         uint64_t len; /* only filled for memory mapped ports */
297 };
298
299 /**
300  * Initialize a rte_pci_ioport object for a pci device io resource.
301  *
302  * This object is then used to gain access to those io resources (see below).
303  *
304  * @param dev
305  *   A pointer to a rte_pci_device structure describing the device
306  *   to use.
307  * @param bar
308  *   Index of the io pci resource we want to access.
309  * @param p
310  *   The rte_pci_ioport object to be initialized.
311  * @return
312  *  0 on success, negative on error.
313  */
314 int rte_pci_ioport_map(struct rte_pci_device *dev, int bar,
315                 struct rte_pci_ioport *p);
316
317 /**
318  * Release any resources used in a rte_pci_ioport object.
319  *
320  * @param p
321  *   The rte_pci_ioport object to be uninitialized.
322  * @return
323  *  0 on success, negative on error.
324  */
325 int rte_pci_ioport_unmap(struct rte_pci_ioport *p);
326
327 /**
328  * Read from a io pci resource.
329  *
330  * @param p
331  *   The rte_pci_ioport object from which we want to read.
332  * @param data
333  *   A data buffer where the bytes should be read into
334  * @param len
335  *   The length of the data buffer.
336  * @param offset
337  *   The offset into the pci io resource.
338  */
339 void rte_pci_ioport_read(struct rte_pci_ioport *p,
340                 void *data, size_t len, off_t offset);
341
342 /**
343  * Write to a io pci resource.
344  *
345  * @param p
346  *   The rte_pci_ioport object to which we want to write.
347  * @param data
348  *   A data buffer where the bytes should be read into
349  * @param len
350  *   The length of the data buffer.
351  * @param offset
352  *   The offset into the pci io resource.
353  */
354 void rte_pci_ioport_write(struct rte_pci_ioport *p,
355                 const void *data, size_t len, off_t offset);
356
357 #ifdef __cplusplus
358 }
359 #endif
360
361 #endif /* _RTE_BUS_PCI_H_ */