135e8b803915675fffd137cea29ae4aeca7233d1
[deb_dpdk.git] / lib / librte_eventdev / rte_eventdev_pmd_vdev.h
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_VDEV_H_
33 #define _RTE_EVENTDEV_PMD_VDEV_H_
34
35 /** @file
36  * RTE Eventdev VDEV PMD APIs
37  *
38  * @note
39  * These API are from event VDEV PMD only and user applications should not call
40  * them directly.
41  */
42
43 #ifdef __cplusplus
44 extern "C" {
45 #endif
46
47 #include <string.h>
48
49 #include <rte_debug.h>
50 #include <rte_eal.h>
51 #include <rte_vdev.h>
52
53 #include "rte_eventdev_pmd.h"
54
55 /**
56  * @internal
57  * Creates a new virtual event device and returns the pointer to that device.
58  *
59  * @param name
60  *   PMD type name
61  * @param dev_private_size
62  *   Size of event PMDs private data
63  * @param socket_id
64  *   Socket to allocate resources on.
65  *
66  * @return
67  *   - Eventdev pointer if device is successfully created.
68  *   - NULL if device cannot be created.
69  */
70 static inline struct rte_eventdev *
71 rte_event_pmd_vdev_init(const char *name, size_t dev_private_size,
72                 int socket_id)
73 {
74
75         struct rte_eventdev *eventdev;
76
77         /* Allocate device structure */
78         eventdev = rte_event_pmd_allocate(name, socket_id);
79         if (eventdev == NULL)
80                 return NULL;
81
82         /* Allocate private device structure */
83         if (rte_eal_process_type() == RTE_PROC_PRIMARY) {
84                 eventdev->data->dev_private =
85                                 rte_zmalloc_socket("eventdev device private",
86                                                 dev_private_size,
87                                                 RTE_CACHE_LINE_SIZE,
88                                                 socket_id);
89
90                 if (eventdev->data->dev_private == NULL)
91                         rte_panic("Cannot allocate memzone for private device"
92                                         " data");
93         }
94
95         return eventdev;
96 }
97
98 /**
99  * @internal
100  * Destroy the given virtual event device
101  *
102  * @param name
103  *   PMD type name
104  * @return
105  *   - 0 on success, negative on error
106  */
107 static inline int
108 rte_event_pmd_vdev_uninit(const char *name)
109 {
110         int ret;
111         struct rte_eventdev *eventdev;
112
113         if (name == NULL)
114                 return -EINVAL;
115
116         eventdev = rte_event_pmd_get_named_dev(name);
117         if (eventdev == NULL)
118                 return -ENODEV;
119
120         ret = rte_event_dev_close(eventdev->data->dev_id);
121         if (ret < 0)
122                 return ret;
123
124         /* Free the event device */
125         rte_event_pmd_release(eventdev);
126
127         return 0;
128 }
129
130 #ifdef __cplusplus
131 }
132 #endif
133
134 #endif /* _RTE_EVENTDEV_PMD_VDEV_H_ */