DPDK  17.11.0
rte_eventdev_pmd_pci.h
Go to the documentation of this file.
1 /*
2  *
3  * Copyright(c) 2016-2017 Cavium, Inc. All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  *
9  * * Redistributions of source code must retain the above copyright
10  * notice, this list of conditions and the following disclaimer.
11  * * Redistributions in binary form must reproduce the above copyright
12  * notice, this list of conditions and the following disclaimer in
13  * the documentation and/or other materials provided with the
14  * distribution.
15  * * Neither the name of Cavium, Inc nor the names of its
16  * contributors may be used to endorse or promote products derived
17  * from this software without specific prior written permission.
18  *
19  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
22  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
23  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
25  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30  */
31 
32 #ifndef _RTE_EVENTDEV_PMD_PCI_H_
33 #define _RTE_EVENTDEV_PMD_PCI_H_
34 
44 #ifdef __cplusplus
45 extern "C" {
46 #endif
47 
48 #include <string.h>
49 
50 #include <rte_eal.h>
51 #include <rte_lcore.h>
52 #include <rte_pci.h>
53 #include <rte_bus_pci.h>
54 
55 #include "rte_eventdev_pmd.h"
56 
57 typedef int (*eventdev_pmd_pci_callback_t)(struct rte_eventdev *dev);
58 
64 static inline int
65 rte_event_pmd_pci_probe(struct rte_pci_driver *pci_drv,
66  struct rte_pci_device *pci_dev,
67  size_t private_data_size,
68  eventdev_pmd_pci_callback_t devinit)
69 {
70  struct rte_eventdev *eventdev;
71 
72  char eventdev_name[RTE_EVENTDEV_NAME_MAX_LEN];
73 
74  int retval;
75 
76  if (devinit == NULL)
77  return -EINVAL;
78 
79  rte_pci_device_name(&pci_dev->addr, eventdev_name,
80  sizeof(eventdev_name));
81 
82  eventdev = rte_event_pmd_allocate(eventdev_name,
83  pci_dev->device.numa_node);
84  if (eventdev == NULL)
85  return -ENOMEM;
86 
87  if (rte_eal_process_type() == RTE_PROC_PRIMARY) {
88  eventdev->data->dev_private =
90  "eventdev private structure",
91  private_data_size,
92  RTE_CACHE_LINE_SIZE,
93  rte_socket_id());
94 
95  if (eventdev->data->dev_private == NULL)
96  rte_panic("Cannot allocate memzone for private "
97  "device data");
98  }
99 
100  eventdev->dev = &pci_dev->device;
101 
102  /* Invoke PMD device initialization function */
103  retval = devinit(eventdev);
104  if (retval == 0)
105  return 0;
106 
107  RTE_EDEV_LOG_ERR("driver %s: (vendor_id=0x%x device_id=0x%x)"
108  " failed", pci_drv->driver.name,
109  (unsigned int) pci_dev->id.vendor_id,
110  (unsigned int) pci_dev->id.device_id);
111 
112  rte_event_pmd_release(eventdev);
113 
114  return -ENXIO;
115 }
116 
117 
123 static inline int
124 rte_event_pmd_pci_remove(struct rte_pci_device *pci_dev,
125  eventdev_pmd_pci_callback_t devuninit)
126 {
127  struct rte_eventdev *eventdev;
128  char eventdev_name[RTE_EVENTDEV_NAME_MAX_LEN];
129  int ret = 0;
130 
131  if (pci_dev == NULL)
132  return -EINVAL;
133 
134  rte_pci_device_name(&pci_dev->addr, eventdev_name,
135  sizeof(eventdev_name));
136 
137  eventdev = rte_event_pmd_get_named_dev(eventdev_name);
138  if (eventdev == NULL)
139  return -ENODEV;
140 
141  ret = rte_event_dev_close(eventdev->data->dev_id);
142  if (ret < 0)
143  return ret;
144 
145  /* Invoke PMD device un-init function */
146  if (devuninit)
147  ret = devuninit(eventdev);
148  if (ret)
149  return ret;
150 
151  /* Free event device */
152  rte_event_pmd_release(eventdev);
153 
154  eventdev->dev = NULL;
155 
156  return 0;
157 }
158 
159 #ifdef __cplusplus
160 }
161 #endif
162 
163 #endif /* _RTE_EVENTDEV_PMD_PCI_H_ */
enum rte_proc_type_t rte_eal_process_type(void)
int rte_event_pmd_release(struct rte_eventdev *eventdev)
struct rte_eventdev * rte_event_pmd_allocate(const char *name, int socket_id)
static struct rte_eventdev * rte_event_pmd_get_named_dev(const char *name)
#define rte_panic(...)
Definition: rte_debug.h:79
void * rte_zmalloc_socket(const char *type, size_t size, unsigned align, int socket)
int rte_event_dev_close(uint8_t dev_id)
void rte_pci_device_name(const struct rte_pci_addr *addr, char *output, size_t size)
unsigned rte_socket_id(void)