aboutsummaryrefslogtreecommitdiff
path: root/include/odp_coremask.h
blob: 54e6f9f92f70e9816a04f21f9dbfaffacbbf5967 (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
/* Copyright (c) 2013, Linaro Limited
 * All rights reserved.
 *
 * SPDX-License-Identifier:     BSD-3-Clause
 */


/**
 * @file
 *
 * ODP core masks and enumeration
 */

#ifndef ODP_COREMASK_H_
#define ODP_COREMASK_H_

#ifdef __cplusplus
extern "C" {
#endif



#include <odp_std_types.h>


#define ODP_COREMASK_SIZE_U64  1

/**
 * Core mask
 *
 * Don't access directly, use access functions.
 */
typedef struct odp_coremask_t {
	uint64_t _u64[ODP_COREMASK_SIZE_U64];

} odp_coremask_t;



/**
 * Add core mask bits from a string
 *
 * @param str    Hexadecimal digits in a string. Core #0 is located
 *               at the least significant bit (0x1).
 * @param mask   Core mask to modify
 *
 * @note Supports currently only core indexes upto 63
 */
void odp_coremask_from_str(const char *str, odp_coremask_t *mask);

/**
 * Write core mask as a string of hexadecimal digits
 *
 * @param str    String for output
 * @param len    Size of string length (incl. ending zero)
 * @param mask   Core mask
 *
 * @note Supports currently only core indexes upto 63
 */
void odp_coremask_to_str(char *str, int len, const odp_coremask_t *mask);


/**
 * Add core mask bits from a u64 array
 *
 * In the array core #0 is located at the least significant bit
 * of the first word (u64[0] = 0x1).
 *
 * Examples
 * core 0:  u64[0] = 0x1
 * core 1:  u64[0] = 0x2
 * ...
 * core 63: u64[0] = 0x8000 0000 0000 0000
 * core 64: u64[0] = 0x0, u64[1] = 0x1
 * core 65: u64[0] = 0x0, u64[1] = 0x2
 *
 * @param u64    An array of u64 bit words
 * @param num    Number of u64 words in the array
 * @param mask   Core mask to modify
 *
 * @note Supports currently only core indexes upto 63
 */
void odp_coremask_from_u64(const uint64_t *u64, int num, odp_coremask_t *mask);

/**
 * Clear entire mask
 * @param mask	Core mask to flush with zero value
 */
static inline void odp_coremask_zero(odp_coremask_t *mask)
{
	mask->_u64[0] = 0;
}

/**
 * Add core to mask
 * @param core  Core number
 * @param mask  add core number in core mask
 */
void odp_coremask_set(int core, odp_coremask_t *mask);

/**
 * Remove core from mask
 * @param core  Core number
 * @param mask  clear core number from core mask
 */
void odp_coremask_clr(int core, odp_coremask_t *mask);

/**
 * Test if core is a member of mask
 * @param core  Core number
 * @param mask  Core mask to check if core num set or not
 * return       non-zero if set otherwise 0
 */
int odp_coremask_isset(int core, odp_coremask_t *mask);

/**
 * Count number of cores in mask
 * @param mask  Core mask
 */
int odp_coremask_count(odp_coremask_t *mask);



/**
 * Logical AND over two source masks.
 *
 * @param dest    Destination mask, can be one of the source masks
 * @param src1    Source mask 1
 * @param src2    Source mask 2
 */
static inline void odp_coremask_and(odp_coremask_t *dest, odp_coremask_t *src1,
						odp_coremask_t *src2)
{
	dest->_u64[0] = src1->_u64[0] & src2->_u64[0];
}

/**
 * Logical OR over two source masks.
 *
 * @param dest    Destination mask, can be one of the source masks
 * @param src1    Source mask 1
 * @param src2    Source mask 2
 */
static inline void odp_coremask_or(odp_coremask_t *dest, odp_coremask_t *src1,
					odp_coremask_t *src2)
{
	dest->_u64[0] = src1->_u64[0] | src2->_u64[0];
}

/**
 * Logical XOR over two source masks.
 *
 * @param dest    Destination mask, can be one of the source masks
 * @param src1    Source mask 1
 * @param src2    Source mask 2
 */
static inline void odp_coremask_xor(odp_coremask_t *dest, odp_coremask_t *src1,
					odp_coremask_t *src2)
{
	dest->_u64[0] = src1->_u64[0] ^ src2->_u64[0];
}

/**
 * Test if two masks contain the same cores
 */
static inline int odp_coremask_equal(odp_coremask_t *mask1,
					odp_coremask_t *mask2)
{
	return (mask1->_u64[0] == mask2->_u64[0]);
}

#ifdef __cplusplus
}
#endif

#endif