summaryrefslogtreecommitdiff
path: root/drivers/staging/fsl_dce/flib/bitfield_macros.h
blob: 5df3b8bf37e43070217625dc9dfa1d9ee0f677fd (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
/*
 * Copyright 2013 Freescale Semiconductor, Inc.
 */

#ifndef FL_BITFIELD_MACROS_H
#define FL_BITFIELD_MACROS_H

/*
 *  macro to generate a field. This field can be part of a register or other
 *  defined structure
 */
#define FL_FGEN(field, value) \
	(((value) << field##_SHIFT) & field##_MASK)

/* macro which generates field based on a token value */
#define FL_FGENTK(field, token) \
	FL_FGEN(field, field##_##token)

/**
 * SET_BFXX(v, m, x) - Returns the result of setting value [x] into bit
 * field [m] of value [v]
 *
 * [m] identifies the bit field and it is assumed that there exists
 * two macros: m_MASK and m_SHIFT. The former contains the bit mask;
 * the latter contains the number of least-significant zero bits in
 * the mask.
 * XX idenfies the width of the value and destination
 *
 * _IDX is a variant where a this idenfies an index into a array. The
 * macros expects a define of field_XXIDX to be defined where XX is inline
 * with the XX type (8, 16, 32, 64). This is useful when using dma stuctures.
 */
#define SET_BF64(dest, field, value)	\
	(dest = \
	((dest & ~field##_MASK) | ((((uint64_t)value) << field##_SHIFT) & \
					field##_MASK)))

#define SET_BF64_IDX(dest, field, value)	\
	((*(dest+field##_64IDX)) = \
	(((*(dest+field##_64IDX)) & ~field##_MASK) | \
			(((value) << field##_SHIFT) & field##_MASK)))

#define SET_BF64_TK(dest, field, token)	\
	(dest = \
	((dest & ~field##_MASK) | ((field##_##token << field##_SHIFT) & \
					field##_MASK)))

#define SET_BF64_TK_IDX(dest, field, token)	\
	((*(dest+field##_64IDX)) = \
	(((*(dest+field##_64IDX)) & ~field##_MASK) | \
			((field##_##token << field##_SHIFT) & field##_MASK)))

#define SET_BF32(dest, field, value) \
	(dest = \
	((dest & ~field##_MASK) | (((value) << field##_SHIFT) & field##_MASK)))

#define SET_BF32_IDX(dest, field, value) \
	((*(dest+field##_32IDX)) = \
	(((*(dest+field##_32IDX)) & ~field##_MASK) | \
			(((value) << field##_SHIFT) & field##_MASK)))

#define SET_BF32_TK(dest, field, token)	\
	(dest = \
	((dest & ~field##_MASK) | ((field##_##token << field##_SHIFT) & \
			field##_MASK)))

#define SET_BF32_TK_IDX(dest, field, token)	\
	((*(dest+field##_32IDX)) = \
	(((*(dest+field##_32IDX)) & ~field##_MASK) | \
			((field##_##token << field##_SHIFT) & field##_MASK)))

#define SET_BF16(dest, field, value)	\
	(dest = \
	((dest & ~field##_MASK) | (((value) << field##_SHIFT) & field##_MASK)))

#define SET_BF16_IDX(dest, field, value)	\
	((*(dest+field##_16IDX)) = \
	(((*(dest+field##_16IDX)) & ~field##_MASK) | \
			(((value) << field##_SHIFT) & field##_MASK)))

#define SET_BF16_TK(dest, field, token)	\
	(dest = \
	((dest & ~field##_MASK) | ((field##_##token << field##_SHIFT) & \
			field##_MASK)))

#define SET_BF16_TK_IDX(dest, field, token)	\
	((*(dest+field##_16IDX)) = \
	(((*(dest+field##_16IDX)) & ~field##_MASK) | \
			((field##_##token << field##_SHIFT) & field##_MASK)))

#define SET_BF8(dest, field, value)	\
	(dest = \
	((dest & ~field##_MASK) | (((value) << field##_SHIFT) & field##_MASK)))

#define SET_BF8_IDX(dest, field, value)	\
	((*(dest+field##_8IDX)) = \
	(((*(dest+field##_8IDX)) & ~field##_MASK) | \
			(((value) << field##_SHIFT) & field##_MASK)))

#define SET_BF8_TK(dest, field, token)	\
	(dest = \
	((dest & ~field##_MASK) | ((field##_##token << field##_SHIFT) & \
			field##_MASK)))

#define SET_BF8_TK_IDX(dest, field, token)	\
	((*(dest+field##_8IDX)) = \
	(((*(dest+field##_8IDX)) & ~field##_MASK) | \
			((field##_##token << field##_SHIFT) & field##_MASK)))

/**
 * GET_BF(v, m) - Gets the value in bit field [m] of expression [v]
 *
 * [m] identifies the bit field and it is assumed that there exists
 * two macros: m_MASK and m_SHIFT. The former contains the bit mask;
 * the latter contains the number of least-significant zero bits in
 * the mask.
 */
#define GET_BF64(source, field)	\
	((source & field##_MASK) >> field##_SHIFT)

#define GET_BF64_IDX(source, field) \
	(((*(source+field##_64IDX)) & field##_MASK) >> field##_SHIFT)

#define GET_BF32(source, field)	\
	((source & field##_MASK) >> field##_SHIFT)

#define GET_BF32_IDX(source, field) \
	(((*(source+field##_32IDX)) & field##_MASK) >> field##_SHIFT)

#define GET_BF16(source, field)	\
	((source & field##_MASK) >> field##_SHIFT)

#define GET_BF16_IDX(source, field) \
	(((*(source+field##_16IDX)) & field##_MASK) >> field##_SHIFT)

#define GET_BF8(source, field)	\
	((source & field##_MASK) >> field##_SHIFT)

#define GET_BF8_IDX(source, field) \
	(((*(source+field##_8IDX)) & field##_MASK) >> field##_SHIFT)

/* Register field is-equal based on token (enum) */
#define ISEQ_32FTK(source, reg_field, token) \
	(GET_BF32((source), reg_field) == reg_field##_##token)

#endif		/* FL_BITFIELD_MACROS */