aboutsummaryrefslogtreecommitdiff
path: root/platform/linux-generic/include/odp/api/plat/event_inlines.h
blob: 8977e67fe6e25319424d18a4ebc2ae66379c2ec9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
/* SPDX-License-Identifier: BSD-3-Clause
 * Copyright (c) 2018 Linaro Limited
 * Copyright (c) 2022-2023 Nokia
 */

#ifndef ODP_PLAT_EVENT_INLINES_H_
#define ODP_PLAT_EVENT_INLINES_H_

#include <odp/api/buffer_types.h>
#include <odp/api/event_types.h>
#include <odp/api/packet_types.h>
#include <odp/api/pool_types.h>
#include <odp/api/timer_types.h>

#include <odp/api/plat/buffer_inline_types.h>
#include <odp/api/plat/debug_inlines.h>
#include <odp/api/plat/event_inline_types.h>
#include <odp/api/plat/event_vector_inline_types.h>
#include <odp/api/plat/packet_inline_types.h>
#include <odp/api/plat/timer_inline_types.h>

/** @cond _ODP_HIDE_FROM_DOXYGEN_ */

#ifndef _ODP_NO_INLINE
	/* Inline functions by default */
	#define _ODP_INLINE static inline
	#define odp_event_type __odp_event_type
	#define odp_event_type_multi __odp_event_type_multi
	#define odp_event_pool __odp_event_pool
	#define odp_event_user_area __odp_event_user_area
	#define odp_event_user_area_and_flag __odp_event_user_area_and_flag
	#define odp_event_subtype __odp_event_subtype
	#define odp_event_types __odp_event_types
	#define odp_event_types_multi __odp_event_types_multi
	#define odp_event_flow_id __odp_event_flow_id
	#define odp_event_flow_id_set __odp_event_flow_id_set
#else
	#define _ODP_INLINE
#endif

static inline odp_event_type_t __odp_event_type_get(odp_event_t event)
{
	int8_t type;

	type = _odp_event_hdr_field(event, int8_t, event_type);

	return (odp_event_type_t)type;
}

static inline odp_event_subtype_t __odp_event_subtype_get(odp_event_t event)
{
	int8_t type;

	type = _odp_event_hdr_field(event, int8_t, subtype);

	return (odp_event_subtype_t)type;
}

_ODP_INLINE odp_event_type_t odp_event_type(odp_event_t event)
{
	return __odp_event_type_get(event);
}

_ODP_INLINE int odp_event_type_multi(const odp_event_t event[], int num,
				     odp_event_type_t *type_out)
{
	int i;
	odp_event_type_t type = __odp_event_type_get(event[0]);

	for (i = 1; i < num; i++) {
		if (__odp_event_type_get(event[i]) != type)
			break;
	}

	*type_out = type;

	return i;
}

_ODP_INLINE odp_pool_t odp_event_pool(odp_event_t event)
{
	const odp_event_type_t type = __odp_event_type_get(event);

	switch (type) {
	case ODP_EVENT_BUFFER:
	case ODP_EVENT_PACKET:
	case ODP_EVENT_PACKET_VECTOR:
		return _odp_event_hdr_field(event, odp_pool_t, pool);
	default:
		return ODP_POOL_INVALID;
	}
}

_ODP_INLINE void *odp_event_user_area(odp_event_t event)
{
	const odp_event_type_t type = __odp_event_type_get(event);

	switch (type) {
	case ODP_EVENT_BUFFER:
	case ODP_EVENT_ML_COMPL:
	case ODP_EVENT_DMA_COMPL:
		return _odp_buffer_get((odp_buffer_t)event, void *, uarea_addr);
	case ODP_EVENT_PACKET:
		return _odp_pkt_get((odp_packet_t)event, void *, user_area);
	case ODP_EVENT_PACKET_VECTOR:
		return _odp_event_vect_get((odp_packet_vector_t)event, void *, uarea_addr);
	case ODP_EVENT_TIMEOUT:
		return _odp_timeout_hdr_field((odp_timeout_t)event, void *, uarea_addr);
	default:
		return NULL;
	}
}

_ODP_INLINE void *odp_event_user_area_and_flag(odp_event_t event, int *flag)
{
	const odp_event_type_t type = __odp_event_type_get(event);

	_ODP_ASSERT(flag != NULL);

	switch (type) {
	case ODP_EVENT_BUFFER:
	case ODP_EVENT_DMA_COMPL:
	case ODP_EVENT_ML_COMPL:
		*flag = -1;
		return _odp_buffer_get((odp_buffer_t)event, void *, uarea_addr);
	case ODP_EVENT_PACKET:
	{
		_odp_packet_flags_t pkt_flags;
		odp_packet_t pkt = (odp_packet_t)event;

		pkt_flags.all_flags = _odp_pkt_get(pkt, uint32_t, flags);
		*flag = pkt_flags.user_flag;

		return _odp_pkt_get(pkt, void *, user_area);
	}
	case ODP_EVENT_PACKET_VECTOR:
	{
		_odp_event_vector_flags_t pktv_flags;
		odp_packet_vector_t pktv = (odp_packet_vector_t)event;

		pktv_flags.all_flags = _odp_event_vect_get(pktv, uint32_t, flags);
		*flag = pktv_flags.user_flag;

		return _odp_event_vect_get(pktv, void *, uarea_addr);
	}
	case ODP_EVENT_TIMEOUT:
		*flag = -1;
		return _odp_timeout_hdr_field((odp_timeout_t)event, void *, uarea_addr);
	default:
		*flag = -1;
		return NULL;
	}
}

_ODP_INLINE odp_event_subtype_t odp_event_subtype(odp_event_t event)
{
	return __odp_event_subtype_get(event);
}

_ODP_INLINE odp_event_type_t odp_event_types(odp_event_t event,
					     odp_event_subtype_t *subtype)
{
	odp_event_type_t event_type = __odp_event_type_get(event);

	*subtype = __odp_event_subtype_get(event);

	return event_type;
}

_ODP_INLINE void odp_event_types_multi(const odp_event_t event[], odp_event_type_t type[],
				       odp_event_subtype_t subtype[], int num)
{
	for (int i = 0; i < num; i++)
		type[i] = __odp_event_type_get(event[i]);

	if (subtype == NULL)
		return;

	for (int i = 0; i < num; i++)
		subtype[i] = __odp_event_subtype_get(event[i]);
}

_ODP_INLINE uint32_t odp_event_flow_id(odp_event_t event)
{
	return _odp_event_hdr_field(event, uint8_t, flow_id);
}

_ODP_INLINE void odp_event_flow_id_set(odp_event_t event, uint32_t id)
{
	uint8_t *flow_id = _odp_event_hdr_ptr(event, uint8_t, flow_id);

	*flow_id = (uint8_t)id;
}

/** @endcond */

#endif