Line data Source code
1 0 : /* 2 : * Copyright (c) 2016 Cadence Design Systems, Inc. 3 : * Copyright (c) 2019 Stephanos Ioannidis <root@stephanos.io> 4 : * 5 : * SPDX-License-Identifier: Apache-2.0 6 : */ 7 : 8 : #ifndef ZEPHYR_INCLUDE_ARCH_XTENSA_ARCH_INLINES_H_ 9 : #define ZEPHYR_INCLUDE_ARCH_XTENSA_ARCH_INLINES_H_ 10 : 11 : #ifndef _ASMLANGUAGE 12 : 13 : #include <zephyr/kernel_structs.h> 14 : #include <zephyr/zsr.h> 15 : 16 : /** 17 : * @brief Read a special register. 18 : * 19 : * @param sr Name of special register. 20 : * 21 : * @return Value of special register. 22 : */ 23 1 : #define XTENSA_RSR(sr) \ 24 : ({uint32_t v; \ 25 : __asm__ volatile ("rsr." sr " %0" : "=a"(v)); \ 26 : v; }) 27 : 28 : /** 29 : * @brief Write to a special register. 30 : * 31 : * @param sr Name of special register. 32 : * @param v Value to be written to special register. 33 : */ 34 1 : #define XTENSA_WSR(sr, v) \ 35 : do { \ 36 : __asm__ volatile ("wsr." sr " %0" : : "r"(v)); \ 37 : } while (false) 38 : 39 : /** 40 : * @brief Read a user register. 41 : * 42 : * @param ur Name of user register. 43 : * 44 : * @return Value of user register. 45 : */ 46 1 : #define XTENSA_RUR(ur) \ 47 : ({uint32_t v; \ 48 : __asm__ volatile ("rur." ur " %0" : "=a"(v)); \ 49 : v; }) 50 : 51 : /** 52 : * @brief Write to a user register. 53 : * 54 : * @param ur Name of user register. 55 : * @param v Value to be written to user register. 56 : */ 57 1 : #define XTENSA_WUR(ur, v) \ 58 : do { \ 59 : __asm__ volatile ("wur." ur " %0" : : "r"(v)); \ 60 : } while (false) 61 : 62 : /** Implementation of @ref arch_curr_cpu. */ 63 1 : static ALWAYS_INLINE _cpu_t *arch_curr_cpu(void) 64 : { 65 : _cpu_t *cpu; 66 : 67 : cpu = (_cpu_t *)XTENSA_RSR(ZSR_CPU_STR); 68 : 69 : return cpu; 70 : } 71 : 72 : /** Implementation of @ref arch_proc_id. */ 73 1 : static ALWAYS_INLINE uint32_t arch_proc_id(void) 74 : { 75 : uint32_t prid; 76 : 77 : __asm__ volatile("rsr %0, PRID" : "=r"(prid)); 78 : return prid; 79 : } 80 : 81 : #ifdef CONFIG_SOC_HAS_RUNTIME_NUM_CPUS 82 : extern unsigned int soc_num_cpus; 83 : #endif 84 : 85 : /** Implementation of @ref arch_num_cpus. */ 86 1 : static ALWAYS_INLINE unsigned int arch_num_cpus(void) 87 : { 88 : #ifdef CONFIG_SOC_HAS_RUNTIME_NUM_CPUS 89 : return soc_num_cpus; 90 : #else 91 : return CONFIG_MP_MAX_NUM_CPUS; 92 : #endif 93 : } 94 : 95 : #endif /* !_ASMLANGUAGE */ 96 : 97 : #endif /* ZEPHYR_INCLUDE_ARCH_XTENSA_ARCH_INLINES_H_ */