1
2
3
4
5#ifndef _RTE_EVENTDEV_PMD_PCI_H_
6#define _RTE_EVENTDEV_PMD_PCI_H_
7
8#ifdef __cplusplus
9extern "C" {
10#endif
11
12
13
14
15
16
17
18
19
20#include <string.h>
21
22#include <rte_compat.h>
23#include <rte_config.h>
24#include <rte_eal.h>
25#include <rte_lcore.h>
26#include <rte_pci.h>
27#include <bus_pci_driver.h>
28
29#include "eventdev_pmd.h"
30
31typedef int (*eventdev_pmd_pci_callback_t)(struct rte_eventdev *dev);
32
33
34
35
36
37
38
39__rte_internal
40static inline int
41rte_event_pmd_pci_probe_named(struct rte_pci_driver *pci_drv,
42 struct rte_pci_device *pci_dev,
43 size_t private_data_size,
44 eventdev_pmd_pci_callback_t devinit,
45 const char *name)
46{
47 struct rte_eventdev *eventdev;
48 int retval;
49
50 if (devinit == NULL)
51 return -EINVAL;
52
53 eventdev = rte_event_pmd_allocate(name,
54 pci_dev->device.numa_node);
55 if (eventdev == NULL)
56 return -ENOMEM;
57
58 if (rte_eal_process_type() == RTE_PROC_PRIMARY) {
59 eventdev->data->dev_private =
60 rte_zmalloc_socket(
61 "eventdev private structure",
62 private_data_size,
63 RTE_CACHE_LINE_SIZE,
64 rte_socket_id());
65
66 if (eventdev->data->dev_private == NULL)
67 rte_panic("Cannot allocate memzone for private "
68 "device data");
69 }
70
71 eventdev->dev = &pci_dev->device;
72
73
74 retval = devinit(eventdev);
75 if (retval == 0) {
76 event_dev_probing_finish(eventdev);
77 return 0;
78 }
79
80 RTE_EDEV_LOG_ERR("driver %s: (vendor_id=0x%x device_id=0x%x)"
81 " failed", pci_drv->driver.name,
82 (unsigned int) pci_dev->id.vendor_id,
83 (unsigned int) pci_dev->id.device_id);
84
85 rte_event_pmd_release(eventdev);
86
87 return -ENXIO;
88}
89
90
91
92
93
94
95__rte_internal
96static inline int
97rte_event_pmd_pci_probe(struct rte_pci_driver *pci_drv,
98 struct rte_pci_device *pci_dev,
99 size_t private_data_size,
100 eventdev_pmd_pci_callback_t devinit)
101{
102 char eventdev_name[RTE_EVENTDEV_NAME_MAX_LEN];
103
104 rte_pci_device_name(&pci_dev->addr, eventdev_name,
105 sizeof(eventdev_name));
106
107 return rte_event_pmd_pci_probe_named(pci_drv,
108 pci_dev,
109 private_data_size,
110 devinit,
111 eventdev_name);
112}
113
114
115
116
117
118
119__rte_internal
120static inline int
121rte_event_pmd_pci_remove(struct rte_pci_device *pci_dev,
122 eventdev_pmd_pci_callback_t devuninit)
123{
124 struct rte_eventdev *eventdev;
125 char eventdev_name[RTE_EVENTDEV_NAME_MAX_LEN];
126 int ret = 0;
127
128 if (pci_dev == NULL)
129 return -EINVAL;
130
131 rte_pci_device_name(&pci_dev->addr, eventdev_name,
132 sizeof(eventdev_name));
133
134 eventdev = rte_event_pmd_get_named_dev(eventdev_name);
135 if (eventdev == NULL)
136 return -ENODEV;
137
138 if (rte_eal_process_type() == RTE_PROC_PRIMARY) {
139 ret = rte_event_dev_close(eventdev->data->dev_id);
140 if (ret < 0)
141 return ret;
142 }
143
144
145 if (devuninit)
146 ret = devuninit(eventdev);
147 if (ret)
148 return ret;
149
150
151 rte_event_pmd_release(eventdev);
152
153 eventdev->dev = NULL;
154
155 return 0;
156}
157
158#ifdef __cplusplus
159}
160#endif
161
162#endif
163