• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2020 HiSilicon (Shanghai) Technologies CO., LIMITED.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  * Description: types header.
15  * This file should be changed only infrequently and with great care.
16  */
17 
18 #ifndef __TD_BASE_H__
19 #define __TD_BASE_H__
20 
21 #ifndef __KERNEL__
22 #include <stdbool.h>
23 #include <stddef.h>
24 #include <stdint.h>
25 #endif
26 #include "td_type.h"
27 #include "soc_errno.h"
28 
29 #define TD_CONST            const
30 #define TD_REG              register
31 
32 #define TD_U64_MAX          0xFFFFFFFFFFFFFFFFUL
33 #define TD_U32_MAX          0xFFFFFFFF
34 #define TD_U16_MAX          0xFFFF
35 #define TD_U8_MAX           0xFF
36 #define TD_U4_MAX           0x0f
37 #define TD_S32_MAX          (~(~0 << (32 - 1)))
38 #define TD_S16_MAX          0x7FFF
39 #define TD_S8_MAX           0x7F
40 #define TD_S32_MIN          (-0x80000000)
41 #define TD_S16_MIN          (-0x8000)
42 #define TD_S8_MIN           (-0x80)
43 
44 #define TD_U32_BITS         32
45 #define TD_S32_BITS         32
46 #define TD_U24_BITS         24
47 #define TD_U16_BITS         16
48 #define TD_U8_BITS          8
49 #define TD_U4_BITS          4
50 
51 #define TD_U8_BIT_INDEX_MAX 7
52 
53 #define TD_PUBLIC            extern
54 
55 #if defined(__BUILD_IN_ROM__) || defined(CONFIG_FEATURE_UT)
56 #define TD_PRV
57 #else
58 #define TD_PRV static
59 #endif
60 
61 #define TD_INLINE             inline
62 #define TD_API
63 #define TD_EXTERN             extern
64 #ifdef __cplusplus
65 # define TD_CPP_START    extern "C" {
66 # define TD_CPP_END      }
67 #else
68 # define TD_CPP_START
69 # define TD_CPP_END
70 #endif
71 
72 #ifdef NDEBUG
73 #define TD_ASSERT(ignore)   ((void)0)
74 #else
75 #define TD_ASSERT(x)        ((void)0)
76 #endif
77 
78 #define TD_START_HEADER     TD_CPP_START
79 #define TD_END_HEADER       TD_CPP_END
80 
81 #undef TD_OUT
82 #undef TD_IN
83 #undef TD_INOUT
84 #define TD_OUT
85 #define TD_IN
86 #define TD_INOUT
87 
88 #ifndef CACHE_ALIGNED_SIZE
89 #define CACHE_ALIGNED_SIZE        32
90 #endif
91 
92 #define TD_ALWAYS_INLINE __attribute__((always_inline)) inline
93 #define TD_ALWAYS_STAIC_INLINE __attribute__((always_inline)) static inline
94 
95 #define uapi_array_size(_array)  (sizeof(_array) / sizeof((_array)[0]))
96 
97 #define uapi_unused(var) \
98     do { \
99         (void)(var); \
100     } while (0)
101 
102 #define uapi_align_4(x)             ((unsigned int)((x) + 0x3) & (~0x3)) /* 构造4字节地址对齐 */
103 #define uapi_is_align_u32(x)        (!((x) & 3))                         /* 判断是否为4字节对齐 */
104 #define uapi_is_unalign_u32(x)   ((x) & 3)                            /* 判断是否为4字节对齐 */
105 
106 #if defined(HAVE_PCLINT_CHECK)
107 #define uapi_fieldoffset(s, m)   (0) /* 结构成员偏移 */
108 #else
109 #define uapi_fieldoffset(s, m)   ((td_u32) & (((s*)0)->m)) /* 结构成员偏移 */
110 #endif
111 
112 #define TD_CHAR_CR                  '\r' /* 0x0D */
113 #define TD_CHAR_LF               '\n' /* 0x0A */
114 #define uapi_tolower(x)          ((x) | 0x20)  /* Works only for digits and letters, but small and fast */
115 
116 #define uapi_makeu16(a, b)       ((td_u16)(((td_u8)(a)) | ((td_u16)((td_u8)(b))) << 8))
117 #define uapi_makeu32(a, b)       ((td_u32)(((td_u16)(a)) | ((td_u32)((td_u16)(b))) << 16))
118 #define uapi_makeu64(a, b)       ((td_u64)(((td_u32)(a)) | ((td_u64)((td_u32)(b))) <<32))
119 #define uapi_joinu32(a, b, c, d) ((a) | ((td_u32)(b) << 8) | ((td_u32)(c) << 16) | ((td_u32)(d) << 24))
120 
121 #define uapi_hiu32(l)              ((td_u32)(((td_u64)(l) >> 32) & 0xFFFFFFFF))
122 #define uapi_lou32(l)              ((td_u32)(l))
123 #define uapi_hiu16(l)              ((td_u16)(((td_u32)(l) >> 16) & 0xFFFF))
124 #define uapi_lou16(l)              ((td_u16)(l))
125 #define uapi_hiu8(l)               ((td_u8)(((td_u16)(l) >> 8) & 0xFF))
126 #define uapi_lou8(l)               ((td_u8)(l))
127 
128 #define uapi_max(a, b)                           (((a) > (b)) ? (a) : (b))
129 #define uapi_min(a, b)                           (((a) < (b)) ? (a) : (b))
130 #define uapi_sub(a, b)                           (((a) > (b)) ? ((a) - (b)) : 0)
131 #define uapi_abs(a)                              (((a) > 0) ? (a) : (- (a)))
132 #define uapi_abs_sub(a, b)                       (((a) > (b)) ? ((a) - (b)) : ((b) - (a)))
133 #define uapi_byte_align(value, align)            (((value) + (align) - 1) & (~((align) -1)))
134 #define uapi_is_byte_align(value, align)         (((td_u32)(value) & ((align) - 1))== 0)
135 
136 #define uapi_set_bit_i(val, n)                   ((val) |= (1 << (n)))
137 #define uapi_clr_bit_i(val, n)                   ((val) &= ~(1 << (n)))
138 #define uapi_is_bit_set_i(val, n)                ((val) & (1 << (n)))
139 #define uapi_is_bit_clr_i(val, n)                (~((val) & (1 << (n))))
140 #define uapi_switch_bit_i(val, n)                ((val) ^= (1 << (n)))
141 #define uapi_get_bit_i(val, n)                   (((val) >> (n)) & 1)
142 
143 #define td_u8_bit_val(b7, b6, b5, b4, b3, b2, b1, b0) \
144     (((b7) << 7) | ((b6) << 6) | ((b5) << 5) | ((b4) << 4) | ((b3) << 3) | ((b2) << 2) | ((b1) << 1) | ((b0) << 0))
145 
146 #define td_u16_bit_val(b12, b11, b10, b9, b8, b7, b6, b5, b4, b3, b2, b1, b0) \
147     (td_u16)(((b12) << 12) | ((b11) << 11) | ((b10) << 10) | ((b9) << 9) | ((b8) << 8) | ((b7) << 7) | \
148     ((b6) << 6) | ((b5) << 5) | ((b4) << 4) | ((b3) << 3) | ((b2) << 2) | ((b1) << 1) | ((b0) << 0))
149 
150 #define uapi_set_u32_ptr_val(ptr, offset, val)  (*((td_u32*)(((td_u8*)(ptr)) + (offset))) = (val))
151 #define uapi_get_u32_ptr_val(ptr, offset)      *((td_u32*)(((td_u8*)(ptr)) + (offset)))
152 
153 #ifndef bit
154 #define bit(x)                         (1UL << (x))
155 #endif
156 #ifndef BIT0
157 #define BIT31                          ((td_u32)(1UL << 31))
158 #define BIT30                          ((td_u32)(1 << 30))
159 #define BIT29                          ((td_u32)(1 << 29))
160 #define BIT28                          ((td_u32)(1 << 28))
161 #define BIT27                          ((td_u32)(1 << 27))
162 #define BIT26                          ((td_u32)(1 << 26))
163 #define BIT25                          ((td_u32)(1 << 25))
164 #define BIT24                          ((td_u32)(1 << 24))
165 #define BIT23                          ((td_u32)(1 << 23))
166 #define BIT22                          ((td_u32)(1 << 22))
167 #define BIT21                          ((td_u32)(1 << 21))
168 #define BIT20                          ((td_u32)(1 << 20))
169 #define BIT19                          ((td_u32)(1 << 19))
170 #define BIT18                          ((td_u32)(1 << 18))
171 #define BIT17                          ((td_u32)(1 << 17))
172 #define BIT16                          ((td_u32)(1 << 16))
173 #define BIT15                          ((td_u32)(1 << 15))
174 #define BIT14                          ((td_u32)(1 << 14))
175 #define BIT13                          ((td_u32)(1 << 13))
176 #define BIT12                          ((td_u32)(1 << 12))
177 #define BIT11                          ((td_u32)(1 << 11))
178 #define BIT10                          ((td_u32)(1 << 10))
179 #define BIT9                           ((td_u32)(1 << 9))
180 #define BIT8                           ((td_u32)(1 << 8))
181 #define BIT7                           ((td_u32)(1 << 7))
182 #define BIT6                           ((td_u32)(1 << 6))
183 #define BIT5                           ((td_u32)(1 << 5))
184 #define BIT4                           ((td_u32)(1 << 4))
185 #define BIT3                           ((td_u32)(1 << 3))
186 #define BIT2                           ((td_u32)(1 << 2))
187 #define BIT1                           ((td_u32)(1 << 1))
188 #define BIT0                           ((td_u32)(1 << 0))
189 #endif
190 
191 #define HALFWORD_BIT_WIDTH             16
192 
193 #define BYTE_WIDTH                        1
194 #define HALF_WIDTH                     2
195 #define WORD_WIDTH                     4
196 
197 #define uapi_reg_write(addr, val)              (*(volatile unsigned int *)(uintptr_t)(addr) = (val))
198 #define uapi_reg_read(addr, val)               ((val) = *(volatile unsigned int *)(uintptr_t)(addr))
199 #define uapi_reg_write32(addr, val)            (*(volatile unsigned int *)(uintptr_t)(addr) = (val))
200 #define uapi_reg_read32(addr, val)             ((val) = *(volatile unsigned int *)(uintptr_t)(addr))
201 #define uapi_reg_read_val32(addr)              (*(volatile unsigned int*)(uintptr_t)(addr))
202 #define uapi_reg_setbitmsk(addr, msk)          ((uapi_reg_read_val32(addr)) |= (msk))
203 #define uapi_reg_clrbitmsk(addr, msk)          ((uapi_reg_read_val32(addr)) &= ~(msk))
204 #define uapi_reg_clrbit(addr, pos)             ((uapi_reg_read_val32(addr)) &= ~((unsigned int)(1) << (pos)))
205 #define uapi_reg_setbit(addr, pos)             ((uapi_reg_read_val32(addr)) |= ((unsigned int)(1) << (pos)))
206 #define uapi_reg_clrbits(addr, pos, bits)      (uapi_reg_read_val32(addr) &= ~((((unsigned int)1 << (bits)) - 1) << (pos)))
207 #define uapi_reg_setbits(addr, pos, bits, val) (uapi_reg_read_val32(addr) =           \
208     (uapi_reg_read_val32(addr) & (~((((unsigned int)1 << (bits)) - 1) << (pos)))) | \
209     ((unsigned int)((val) & (((unsigned int)1 << (bits)) - 1)) << (pos)))
210 #define uapi_reg_getbits(addr, pos, bits)      ((uapi_reg_read_val32(addr) >> (pos)) & (((unsigned int)1 << (bits)) - 1))
211 
212 #define uapi_reg_write16(addr, val)        (*(volatile unsigned short *)(uintptr_t)(addr) = (val))
213 #define uapi_reg_read16(addr, val)         ((val) = *(volatile unsigned short *)(uintptr_t)(addr))
214 #define uapi_reg_read_val16(addr)          (*(volatile unsigned short*)(uintptr_t)(addr))
215 #define uapi_reg_clrbit16(addr, pos)       ((uapi_reg_read_val16(addr)) &= ~((unsigned short)(1) << (pos)))
216 #define uapi_reg_setbit16(addr, pos)       ((uapi_reg_read_val16(addr)) |= ((unsigned short)(1) << (pos)))
217 #define uapi_reg_clrbits16(addr, pos, bits) (uapi_reg_read_val16(addr) &= ~((((unsigned short)1 << (bits)) - 1) << (pos)))
218 #define uapi_reg_setbits16(addr, pos, bits, val) (uapi_reg_read_val16(addr) =           \
219     (uapi_reg_read_val16(addr) & (~((((unsigned short)1 << (bits)) - 1) << (pos)))) | \
220     ((unsigned short)((val) & (((unsigned short)1 << (bits)) - 1)) << (pos)))
221 #define uapi_reg_getbits16(addr, pos, bits) ((uapi_reg_read_val16(addr) >> (pos)) & (((unsigned short)1 << (bits)) - 1))
222 
223 #define uapi_reg_write8(addr, val)        (*(volatile unsigned char *)(uintptr_t)(addr) = (val))
224 #define uapi_reg_read8(addr, val)         ((val) = *(volatile unsigned char *)(uintptr_t)(addr))
225 #define uapi_reg_read_val8(addr)          (*(volatile unsigned char*)(uintptr_t)(addr))
226 #define uapi_reg_clrbit8(addr, pos)       ((uapi_reg_read_val8(addr)) &= ~((unsigned char)(1) << (pos)))
227 #define uapi_reg_setbit8(addr, pos)       ((uapi_reg_read_val8(addr)) |= ((unsigned char)(1) << (pos)))
228 #define uapi_reg_clrbits8(addr, pos, bits) (uapi_reg_read_val8(addr) &= ~((((unsigned char)1 << (bits)) - 1) << (pos)))
229 #define uapi_reg_setbits8(addr, pos, bits, val) (uapi_reg_read_val8(addr) =           \
230     (uapi_reg_read_val8(addr) & (~((((unsigned char)1 << (bits)) - 1) << (pos)))) | \
231     ((unsigned char)((val) & (((unsigned char)1 << (bits)) - 1)) << (pos)))
232 #define uapi_reg_getbits8(addr, pos, bits) ((uapi_reg_read_val8(addr) >> (pos)) & (((unsigned char)1 << (bits)) - 1))
233 #ifndef align_next
234 #define align_next(val, a)          ((((val) + ((a) - 1)) & (~((a) - 1))))
235 #define align_length(val, a)        align_next(val, a)
236 #endif
237 #define BITS_PER_BYTE               8
238 #define HEXADECIMAL                 16
239 #define DECIMAL                     10
240 
241 #define osal_padding(x, size) (((x) + (size) - 1) & (~((size) - 1)))
242 
243 #define osal_round_down(value, boundary) ((value) & (~((boundary) - 1)))
244 #define osal_round_up(value, boundary) ((((value) - 1) | ((boundary) - 1)) + 1)
245 
246 /* Is val aligned to "align" ("align" must be power of 2) */
247 #ifndef IS_ALIGNED
248 #define osal_is_aligned(val, align) (((osal_u32)(val) & ((align) - 1)) == 0)
249 #else
250 #define osal_is_aligned IS_ALIGNED
251 #endif
252 
253 #ifndef MAX
254 #define MAX(a, b) (((a) > (b)) ? (a) : (b))
255 #endif
256 
257 #ifndef MIN
258 #define MIN(a, b) (((a) < (b)) ? (a) : (b))
259 #endif
260 
261 #define SZ_1KB                         1024
262 #define SZ_1MB                         (SZ_1KB * SZ_1KB)
263 #define SZ_4KB                         4096
264 #define TD_SYS_WAIT_FOREVER         0xFFFFFFFF
265 
266 typedef td_void  (*td_void_callback)(td_void);
267 typedef struct {
268     td_mem_handle_t mem_handle;
269     td_mem_size_t   addr_offset;
270 } ext_mem_handle;
271 
272 typedef struct {
273     td_s32 x;
274     td_s32 y;
275     td_u32 width;
276     td_u32 height;
277 } ext_rect;
278 
279 #ifdef HAVE_PCLINT_CHECK
280 #define uapi_likely(x)    (x)
281 #define uapi_unlikely(x)  (x)
282 #else
283 #define uapi_likely(x) __builtin_expect(!!(x), 1)
284 #define uapi_unlikely(x) __builtin_expect(!!(x), 0)
285 #endif
286 
287 #endif /* __TD_BASE_H__ */
288 
289