DPDK  17.11.10
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_config.h>
51 #include <rte_eal.h>
52 #include <rte_lcore.h>
53 #include <rte_pci.h>
54 #include <rte_bus_pci.h>
55 
56 #include "rte_eventdev_pmd.h"
57 
58 typedef int (*eventdev_pmd_pci_callback_t)(struct rte_eventdev *dev);
59 
65 static inline int
66 rte_event_pmd_pci_probe(struct rte_pci_driver *pci_drv,
67  struct rte_pci_device *pci_dev,
68  size_t private_data_size,
69  eventdev_pmd_pci_callback_t devinit)
70 {
71  struct rte_eventdev *eventdev;
72 
73  char eventdev_name[RTE_EVENTDEV_NAME_MAX_LEN];
74 
75  int retval;
76 
77  if (devinit == NULL)
78  return -EINVAL;
79 
80  rte_pci_device_name(&pci_dev->addr, eventdev_name,
81  sizeof(eventdev_name));
82 
83  eventdev = rte_event_pmd_allocate(eventdev_name,
84  pci_dev->device.numa_node);
85  if (eventdev == NULL)
86  return -ENOMEM;
87 
88  if (rte_eal_process_type() == RTE_PROC_PRIMARY) {
89  eventdev->data->dev_private =
91  "eventdev private structure",
92  private_data_size,
93  RTE_CACHE_LINE_SIZE,
94  rte_socket_id());
95 
96  if (eventdev->data->dev_private == NULL)
97  rte_panic("Cannot allocate memzone for private "
98  "device data");
99  }
100 
101  eventdev->dev = &pci_dev->device;
102 
103  /* Invoke PMD device initialization function */
104  retval = devinit(eventdev);
105  if (retval == 0)
106  return 0;
107 
108  RTE_EDEV_LOG_ERR("driver %s: (vendor_id=0x%x device_id=0x%x)"
109  " failed", pci_drv->driver.name,
110  (unsigned int) pci_dev->id.vendor_id,
111  (unsigned int) pci_dev->id.device_id);
112 
113  rte_event_pmd_release(eventdev);
114 
115  return -ENXIO;
116 }
117 
118 
124 static inline int
125 rte_event_pmd_pci_remove(struct rte_pci_device *pci_dev,
126  eventdev_pmd_pci_callback_t devuninit)
127 {
128  struct rte_eventdev *eventdev;
129  char eventdev_name[RTE_EVENTDEV_NAME_MAX_LEN];
130  int ret = 0;
131 
132  if (pci_dev == NULL)
133  return -EINVAL;
134 
135  rte_pci_device_name(&pci_dev->addr, eventdev_name,
136  sizeof(eventdev_name));
137 
138  eventdev = rte_event_pmd_get_named_dev(eventdev_name);
139  if (eventdev == NULL)
140  return -ENODEV;
141 
142  ret = rte_event_dev_close(eventdev->data->dev_id);
143  if (ret < 0)
144  return ret;
145 
146  /* Invoke PMD device un-init function */
147  if (devuninit)
148  ret = devuninit(eventdev);
149  if (ret)
150  return ret;
151 
152  /* Free event device */
153  rte_event_pmd_release(eventdev);
154 
155  eventdev->dev = NULL;
156 
157  return 0;
158 }
159 
160 #ifdef __cplusplus
161 }
162 #endif
163 
164 #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)