Uh oh!
There was an error while loading. Please reload this page.
- Notifications
You must be signed in to change notification settings - Fork 367
Add mt8195 platform specific changes#4725
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Uh oh!
There was an error while loading. Please reload this page.
Changes from all commits
File filter
Filter by extension
Conversations
Uh oh!
There was an error while loading. Please reload this page.
Jump to
Uh oh!
There was an error while loading. Please reload this page.
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -11,6 +11,10 @@ | ||
| #define __ARCH_ATOMIC_H__ | ||
| #include <stdint.h> | ||
| #if XCHAL_HAVE_EXCLUSIVE && CONFIG_XTENSA_EXCLUSIVE && __XCC__ | ||
| #include <xtensa/tie/xt_core.h> | ||
kuanhsuncheng marked this conversation as resolved.
Outdated
Uh oh!There was an error while loading. Please reload this page. | ||
| #endif | ||
| #include <xtensa/config/core-isa.h> | ||
| typedef struct { | ||
| volatile int32_t value; | ||
| @@ -31,6 +35,42 @@ static inline void arch_atomic_init(atomic_t *a, int32_t value) | ||
| arch_atomic_set(a, value); | ||
| } | ||
| #if XCHAL_HAVE_EXCLUSIVE && CONFIG_XTENSA_EXCLUSIVE && __XCC__ | ||
| /* Use exclusive instructions */ | ||
| static inline int32_t arch_atomic_add(atomic_t *a, int32_t value) | ||
| { | ||
| /*reference xtos : xipc_misc.h*/ | ||
| int32_t result = 0; | ||
| int32_t current; | ||
| while (!result) { | ||
| current = XT_L32EX((int32_t *)a); | ||
| result = current + value; | ||
| XT_S32EX(result, (int32_t *)a); | ||
| XT_GETEX(result); | ||
| } | ||
| return current; | ||
| } | ||
| static inline int32_t arch_atomic_sub(atomic_t *a, int32_t value) | ||
| { | ||
| /*reference xtos : xipc_misc.h*/ | ||
| int32_t current; | ||
| int32_t result = 0; | ||
| while (!result) { | ||
| current = XT_L32EX((int *)a); | ||
| result = current - value; | ||
| XT_S32EX(result, (int *)a); | ||
| XT_GETEX(result); | ||
| } | ||
| return current; | ||
| } | ||
| #elif XCHAL_HAVE_S32C1I | ||
| /* Use S32C1I instructions */ | ||
| static inline int32_t arch_atomic_add(atomic_t *a, int32_t value) | ||
| { | ||
| int32_t result, current; | ||
| @@ -65,6 +105,42 @@ static inline int32_t arch_atomic_sub(atomic_t *a, int32_t value) | ||
| return current; | ||
| } | ||
| #else | ||
| #if CONFIG_CORE_COUNT > 1 | ||
| #error No atomic ISA for SMP configuration | ||
| #endif | ||
Member There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Need to put a comment here (and a similar one in spinlock.h) that says | ||
| /* | ||
| * The ISA has no atomic operations so use integer arithmetic on uniprocessor systems. | ||
| * This helps support GCC and qemu emulation of certain targets. | ||
| */ | ||
| /* integer arithmetic methods */ | ||
| static inline int32_t arch_atomic_add(atomic_t *a, int32_t value) | ||
| { | ||
| int32_t result, current; | ||
| current = arch_atomic_read(a); | ||
| result = current + value; | ||
| arch_atomic_set(a, result); | ||
| return current; | ||
| } | ||
| static inline int32_t arch_atomic_sub(atomic_t *a, int32_t value) | ||
| { | ||
| int32_t result, current; | ||
| current = arch_atomic_read(a); | ||
| result = current - value; | ||
| arch_atomic_set(a, result); | ||
| return current; | ||
| } | ||
| #endif /* XCHAL_HAVE_EXCLUSIVE && CONFIG_XTENSA_EXCLUSIVE && __XCC__ */ | ||
| #endif /* __ARCH_ATOMIC_H__ */ | ||
| #else | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -11,6 +11,7 @@ | ||
| #define __ARCH_SPINLOCK_H__ | ||
| #include <stdint.h> | ||
| #include <xtensa/config/core-isa.h> | ||
| typedef struct { | ||
| volatile uint32_t lock; | ||
| @@ -24,6 +25,44 @@ static inline void arch_spinlock_init(spinlock_t *lock) | ||
| lock->lock = 0; | ||
| } | ||
| #if XCHAL_HAVE_EXCLUSIVE && CONFIG_XTENSA_EXCLUSIVE && __XCC__ | ||
| static inline void arch_spin_lock(spinlock_t *lock) | ||
| { | ||
| uint32_t result; | ||
| __asm__ __volatile__( | ||
| " movi %0, 0\n" | ||
| " l32ex %0, %1\n" | ||
| "1: movi %0, 1\n" | ||
| " s32ex %0, %1\n" | ||
| " getex %0\n" | ||
| " bnez %0, 1b\n" | ||
| : "=&a" (result) | ||
| : "a" (&lock->lock) | ||
| : "memory"); | ||
| } | ||
| static inline int arch_try_lock(spinlock_t *lock) | ||
| { | ||
| uint32_t result; | ||
| __asm__ __volatile__( | ||
| " movi %0, 0\n" | ||
| " l32ex %0, %1\n" | ||
| " movi %0, 1\n" | ||
| " s32ex %0, %1\n" | ||
| " getex %0\n" | ||
| : "=&a" (result) | ||
| : "a" (&lock->lock) | ||
| : "memory"); | ||
| /* return 0 for failed lock, 1 otherwise */ | ||
| return result ? 0 : 1; | ||
| } | ||
| #elif XCHAL_HAVE_S32C1I | ||
| static inline void arch_spin_lock(spinlock_t *lock) | ||
| { | ||
| uint32_t result; | ||
| @@ -60,6 +99,47 @@ static inline int arch_try_lock(spinlock_t *lock) | ||
| return result ? 0 : 1; | ||
| } | ||
| #else | ||
| #if CONFIG_CORE_COUNT > 1 | ||
| #error No atomic ISA for SMP configuration | ||
| #endif /* CONFIG_CORE_COUNT > 1 */ | ||
| /* | ||
| * The ISA has no atomic operations so use integer arithmetic on uniprocessor systems. | ||
| * This helps support GCC and qemu emulation of certain targets. | ||
| */ | ||
| static inline void arch_spin_lock(spinlock_t *lock) | ||
| { | ||
| uint32_t result; | ||
| do { | ||
| if (lock->lock == 0) { | ||
| lock->lock = 1; | ||
| result = 1; | ||
| } | ||
| } while (!result); | ||
| } | ||
| static inline int arch_try_lock(spinlock_t *lock) | ||
| { | ||
| uint32_t result; | ||
| if (lock->lock == 0) { | ||
| lock->lock = 1; | ||
| result = 1; | ||
| } | ||
| /* return 0 for failed lock, 1 otherwise */ | ||
| return result ? 0 : 1; | ||
| } | ||
| #endif /* XCHAL_HAVE_EXCLUSIVE && CONFIG_XTENSA_EXCLUSIVE && __XCC__ */ | ||
| #if XCHAL_HAVE_EXCLUSIVE || XCHAL_HAVE_S32C1I | ||
| static inline void arch_spin_unlock(spinlock_t *lock) | ||
| { | ||
| uint32_t result; | ||
| @@ -72,6 +152,28 @@ static inline void arch_spin_unlock(spinlock_t *lock) | ||
| : "memory"); | ||
| } | ||
| #else | ||
| #if CONFIG_CORE_COUNT > 1 | ||
| #error No atomic ISA for SMP configuration | ||
| #endif /* CONFIG_CORE_COUNT > 1 */ | ||
| /* | ||
| * The ISA has no atomic operations so use integer arithmetic on uniprocessor systems. | ||
| * This helps support GCC and qemu emulation of certain targets. | ||
| */ | ||
| static inline void arch_spin_unlock(spinlock_t *lock) | ||
| { | ||
| uint32_t result; | ||
| lock->lock = 0; | ||
| result = 1; | ||
Collaborator There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Unused | ||
| } | ||
| #endif /* XCHAL_HAVE_EXCLUSIVE || XCHAL_HAVE_S32C1I */ | ||
| #endif /* __ARCH_SPINLOCK_H__ */ | ||
| #else | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -37,6 +37,11 @@ | ||
| #include <xtensa/xtruntime-core-state.h> | ||
| #include "xtos-internal.h" | ||
| #if XCHAL_HAVE_MPU | ||
lgirdwood marked this conversation as resolved.
Outdated
Uh oh!There was an error while loading. Please reload this page. | ||
| /* for mpu_write_map opcode */ | ||
| #include <xtensa/mpuasm.h> | ||
| #endif | ||
| // The following reset vector avoids initializing certain registers already | ||
| // initialized by processor reset. But it does initialize some of them | ||
| // anyway, for minimal support of warm restart (restarting in software by | ||
| @@ -360,6 +365,31 @@ _ResetHandler: | ||
| * protection mechanism, the following code has no effect.) | ||
| */ | ||
| #if XCHAL_HAVE_MPU | ||
| // If there is a user-provided MPU table, then we will program the MPU | ||
| // with it now. Can't call xthal_write_map_raw() because code sections | ||
| // haven't been unpacked yet. For romable images, the MPU table values | ||
| // and the table size must reside in a section that does not need to be | ||
| // unpacked (.ResetHandler.text or .srom.text). | ||
| // NOTE: This will set CACHEADRDIS to all zeros, because computing a | ||
| // useful nonzero value from the user settings is too complex and slow | ||
| // to implement here. | ||
| .weak __xt_mpu_init_table // Table of MPU entries | ||
| .weak __xt_mpu_init_table_size // Number of entries in table | ||
| movi a2, __xt_mpu_init_table // non-zero if user defined | ||
| movi a3, __xt_mpu_init_table_size // non-zero if user defined | ||
| beqz a2, .Lno_user_mpu | ||
| beqz a3, .Lno_user_mpu | ||
| l32i a3, a3, 0 | ||
| beqz a3, .Lno_user_mpu // skip if size = 0 | ||
| mpu_write_map a2, a3, a12, a13, a14, a15 | ||
| j .Lno_default_mpu | ||
| .Lno_user_mpu: | ||
| // If there's an empty background map, setup foreground maps to mimic | ||
| // region protection. | ||
| /* If there's an empty background map, setup foreground maps to mimic region protection: */ | ||
| # if XCHAL_MPU_ENTRIES >= 8 && XCHAL_MPU_BACKGROUND_ENTRIES <= 2 | ||
| // We assume reset state: all MPU entries zeroed and disabled. | ||
| @@ -394,6 +424,7 @@ _ResetHandler: | ||
| movi a9, XCHAL_MPU_BG_CACHEADRDIS // default value of CACHEADRDIS for bgnd map | ||
| # endif | ||
| wsr.cacheadrdis a9 // update cacheadrdis | ||
| .Lno_default_mpu: | ||
| #elif XCHAL_HAVE_CACHEATTR || XCHAL_HAVE_MIMIC_CACHEATTR || XCHAL_HAVE_XLT_CACHEATTR \ | ||
| || (XCHAL_HAVE_PTP_MMU && XCHAL_HAVE_SPANNING_WAY) | ||
| movi a2, _memmap_cacheattr_reset /* note: absolute symbol, not a ptr */ | ||
Uh oh!
There was an error while loading. Please reload this page.