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_ */
136