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