New upstream version 17.11.1
[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_config.h>
50 #include <rte_debug.h>
51 #include <rte_eal.h>
52 #include <rte_bus_vdev.h>
53
54 #include "rte_eventdev_pmd.h"
55
56 /**
57  * @internal
58  * Creates a new virtual event device and returns the pointer to that device.
59  *
60  * @param name
61  *   PMD type name
62  * @param dev_private_size
63  *   Size of event PMDs private data
64  * @param socket_id
65  *   Socket to allocate resources on.
66  *
67  * @return
68  *   - Eventdev pointer if device is successfully created.
69  *   - NULL if device cannot be created.
70  */
71 static inline struct rte_eventdev *
72 rte_event_pmd_vdev_init(const char *name, size_t dev_private_size,
73                 int socket_id)
74 {
75
76         struct rte_eventdev *eventdev;
77
78         /* Allocate device structure */
79         eventdev = rte_event_pmd_allocate(name, socket_id);
80         if (eventdev == NULL)
81                 return NULL;
82
83         /* Allocate private device structure */
84         if (rte_eal_process_type() == RTE_PROC_PRIMARY) {
85                 eventdev->data->dev_private =
86                                 rte_zmalloc_socket("eventdev device private",
87                                                 dev_private_size,
88                                                 RTE_CACHE_LINE_SIZE,
89                                                 socket_id);
90
91                 if (eventdev->data->dev_private == NULL)
92                         rte_panic("Cannot allocate memzone for private device"
93                                         " data");
94         }
95
96         return eventdev;
97 }
98
99 /**
100  * @internal
101  * Destroy the given virtual event device
102  *
103  * @param name
104  *   PMD type name
105  * @return
106  *   - 0 on success, negative on error
107  */
108 static inline int
109 rte_event_pmd_vdev_uninit(const char *name)
110 {
111         int ret;
112         struct rte_eventdev *eventdev;
113
114         if (name == NULL)
115                 return -EINVAL;
116
117         eventdev = rte_event_pmd_get_named_dev(name);
118         if (eventdev == NULL)
119                 return -ENODEV;
120
121         ret = rte_event_dev_close(eventdev->data->dev_id);
122         if (ret < 0)
123                 return ret;
124
125         /* Free the event device */
126         rte_event_pmd_release(eventdev);
127
128         return 0;
129 }
130
131 #ifdef __cplusplus
132 }
133 #endif
134
135 #endif /* _RTE_EVENTDEV_PMD_VDEV_H_ */