1*2bfe3f2eSlogwang /*
2*2bfe3f2eSlogwang  *
3*2bfe3f2eSlogwang  *   Copyright(c) 2016-2017 Cavium, Inc. All rights reserved.
4*2bfe3f2eSlogwang  *
5*2bfe3f2eSlogwang  *   Redistribution and use in source and binary forms, with or without
6*2bfe3f2eSlogwang  *   modification, are permitted provided that the following conditions
7*2bfe3f2eSlogwang  *   are met:
8*2bfe3f2eSlogwang  *
9*2bfe3f2eSlogwang  *     * Redistributions of source code must retain the above copyright
10*2bfe3f2eSlogwang  *       notice, this list of conditions and the following disclaimer.
11*2bfe3f2eSlogwang  *     * Redistributions in binary form must reproduce the above copyright
12*2bfe3f2eSlogwang  *       notice, this list of conditions and the following disclaimer in
13*2bfe3f2eSlogwang  *       the documentation and/or other materials provided with the
14*2bfe3f2eSlogwang  *       distribution.
15*2bfe3f2eSlogwang  *     * Neither the name of Cavium, Inc nor the names of its
16*2bfe3f2eSlogwang  *       contributors may be used to endorse or promote products derived
17*2bfe3f2eSlogwang  *       from this software without specific prior written permission.
18*2bfe3f2eSlogwang  *
19*2bfe3f2eSlogwang  *   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20*2bfe3f2eSlogwang  *   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21*2bfe3f2eSlogwang  *   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
22*2bfe3f2eSlogwang  *   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
23*2bfe3f2eSlogwang  *   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24*2bfe3f2eSlogwang  *   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
25*2bfe3f2eSlogwang  *   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26*2bfe3f2eSlogwang  *   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27*2bfe3f2eSlogwang  *   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28*2bfe3f2eSlogwang  *   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29*2bfe3f2eSlogwang  *   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30*2bfe3f2eSlogwang  */
31*2bfe3f2eSlogwang 
32*2bfe3f2eSlogwang #ifndef _RTE_EVENTDEV_PMD_VDEV_H_
33*2bfe3f2eSlogwang #define _RTE_EVENTDEV_PMD_VDEV_H_
34*2bfe3f2eSlogwang 
35*2bfe3f2eSlogwang /** @file
36*2bfe3f2eSlogwang  * RTE Eventdev VDEV PMD APIs
37*2bfe3f2eSlogwang  *
38*2bfe3f2eSlogwang  * @note
39*2bfe3f2eSlogwang  * These API are from event VDEV PMD only and user applications should not call
40*2bfe3f2eSlogwang  * them directly.
41*2bfe3f2eSlogwang  */
42*2bfe3f2eSlogwang 
43*2bfe3f2eSlogwang #ifdef __cplusplus
44*2bfe3f2eSlogwang extern "C" {
45*2bfe3f2eSlogwang #endif
46*2bfe3f2eSlogwang 
47*2bfe3f2eSlogwang #include <string.h>
48*2bfe3f2eSlogwang 
49*2bfe3f2eSlogwang #include <rte_config.h>
50*2bfe3f2eSlogwang #include <rte_debug.h>
51*2bfe3f2eSlogwang #include <rte_eal.h>
52*2bfe3f2eSlogwang #include <rte_bus_vdev.h>
53*2bfe3f2eSlogwang 
54*2bfe3f2eSlogwang #include "rte_eventdev_pmd.h"
55*2bfe3f2eSlogwang 
56*2bfe3f2eSlogwang /**
57*2bfe3f2eSlogwang  * @internal
58*2bfe3f2eSlogwang  * Creates a new virtual event device and returns the pointer to that device.
59*2bfe3f2eSlogwang  *
60*2bfe3f2eSlogwang  * @param name
61*2bfe3f2eSlogwang  *   PMD type name
62*2bfe3f2eSlogwang  * @param dev_private_size
63*2bfe3f2eSlogwang  *   Size of event PMDs private data
64*2bfe3f2eSlogwang  * @param socket_id
65*2bfe3f2eSlogwang  *   Socket to allocate resources on.
66*2bfe3f2eSlogwang  *
67*2bfe3f2eSlogwang  * @return
68*2bfe3f2eSlogwang  *   - Eventdev pointer if device is successfully created.
69*2bfe3f2eSlogwang  *   - NULL if device cannot be created.
70*2bfe3f2eSlogwang  */
71*2bfe3f2eSlogwang static inline struct rte_eventdev *
72*2bfe3f2eSlogwang rte_event_pmd_vdev_init(const char *name, size_t dev_private_size,
73*2bfe3f2eSlogwang 		int socket_id)
74*2bfe3f2eSlogwang {
75*2bfe3f2eSlogwang 
76*2bfe3f2eSlogwang 	struct rte_eventdev *eventdev;
77*2bfe3f2eSlogwang 
78*2bfe3f2eSlogwang 	/* Allocate device structure */
79*2bfe3f2eSlogwang 	eventdev = rte_event_pmd_allocate(name, socket_id);
80*2bfe3f2eSlogwang 	if (eventdev == NULL)
81*2bfe3f2eSlogwang 		return NULL;
82*2bfe3f2eSlogwang 
83*2bfe3f2eSlogwang 	/* Allocate private device structure */
84*2bfe3f2eSlogwang 	if (rte_eal_process_type() == RTE_PROC_PRIMARY) {
85*2bfe3f2eSlogwang 		eventdev->data->dev_private =
86*2bfe3f2eSlogwang 				rte_zmalloc_socket("eventdev device private",
87*2bfe3f2eSlogwang 						dev_private_size,
88*2bfe3f2eSlogwang 						RTE_CACHE_LINE_SIZE,
89*2bfe3f2eSlogwang 						socket_id);
90*2bfe3f2eSlogwang 
91*2bfe3f2eSlogwang 		if (eventdev->data->dev_private == NULL)
92*2bfe3f2eSlogwang 			rte_panic("Cannot allocate memzone for private device"
93*2bfe3f2eSlogwang 					" data");
94*2bfe3f2eSlogwang 	}
95*2bfe3f2eSlogwang 
96*2bfe3f2eSlogwang 	return eventdev;
97*2bfe3f2eSlogwang }
98*2bfe3f2eSlogwang 
99*2bfe3f2eSlogwang /**
100*2bfe3f2eSlogwang  * @internal
101*2bfe3f2eSlogwang  * Destroy the given virtual event device
102*2bfe3f2eSlogwang  *
103*2bfe3f2eSlogwang  * @param name
104*2bfe3f2eSlogwang  *   PMD type name
105*2bfe3f2eSlogwang  * @return
106*2bfe3f2eSlogwang  *   - 0 on success, negative on error
107*2bfe3f2eSlogwang  */
108*2bfe3f2eSlogwang static inline int
109*2bfe3f2eSlogwang rte_event_pmd_vdev_uninit(const char *name)
110*2bfe3f2eSlogwang {
111*2bfe3f2eSlogwang 	int ret;
112*2bfe3f2eSlogwang 	struct rte_eventdev *eventdev;
113*2bfe3f2eSlogwang 
114*2bfe3f2eSlogwang 	if (name == NULL)
115*2bfe3f2eSlogwang 		return -EINVAL;
116*2bfe3f2eSlogwang 
117*2bfe3f2eSlogwang 	eventdev = rte_event_pmd_get_named_dev(name);
118*2bfe3f2eSlogwang 	if (eventdev == NULL)
119*2bfe3f2eSlogwang 		return -ENODEV;
120*2bfe3f2eSlogwang 
121*2bfe3f2eSlogwang 	ret = rte_event_dev_close(eventdev->data->dev_id);
122*2bfe3f2eSlogwang 	if (ret < 0)
123*2bfe3f2eSlogwang 		return ret;
124*2bfe3f2eSlogwang 
125*2bfe3f2eSlogwang 	/* Free the event device */
126*2bfe3f2eSlogwang 	rte_event_pmd_release(eventdev);
127*2bfe3f2eSlogwang 
128*2bfe3f2eSlogwang 	return 0;
129*2bfe3f2eSlogwang }
130*2bfe3f2eSlogwang 
131*2bfe3f2eSlogwang #ifdef __cplusplus
132*2bfe3f2eSlogwang }
133*2bfe3f2eSlogwang #endif
134*2bfe3f2eSlogwang 
135*2bfe3f2eSlogwang #endif /* _RTE_EVENTDEV_PMD_VDEV_H_ */
136