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