blob: 82ac8b9c2f7fac28506378612257d2673b6eda3f [file] [log] [blame]
/*
* Copyright (c) 2024 Raspberry Pi (Trading) Ltd.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
#include "hardware/sync/spin_lock.h"
void spin_locks_reset(void) {
for (uint i = 0; i < NUM_SPIN_LOCKS; i++) {
spin_unlock_unsafe(spin_lock_instance(i));
}
}
spin_lock_t *spin_lock_init(uint lock_num) {
assert(lock_num < NUM_SPIN_LOCKS);
spin_lock_t *lock = spin_lock_instance(lock_num);
spin_unlock_unsafe(lock);
return lock;
}
#if PICO_USE_SW_SPIN_LOCKS
spin_lock_t _sw_spin_locks[NUM_SPIN_LOCKS];
#if __ARM_ARCH_8M_MAIN__ && !PICO_SW_SPIN_LOCKS_NO_EXTEXCLALL
#include "pico/runtime_init.h"
#include "hardware/structs/m33.h"
static void spinlock_set_extexclall(void) {
// Force use of global exclusive monitor for all exclusive load/stores:
// makes multicore exclusives work without adding MPU regions. For
// something more exotic, like having multicore exclusives in internal
// SRAM and also single-core exclusives in external PSRAM (not covered by
// the global monitor on RP2350) you must clear this and add your own
// Shareable regions.
//
// Setting PICO_SW_SPIN_LOCKS_NO_EXTEXCLALL == 1 will disable this code
m33_hw->actlr |= M33_ACTLR_EXTEXCLALL_BITS;
}
// PICO_RUNTIME_INIT_SPIN_LOCKS_RESET is fine as resetting them does not require EXTEXCLALL
PICO_RUNTIME_INIT_FUNC_PER_CORE(spinlock_set_extexclall, PICO_RUNTIME_INIT_SPIN_LOCKS_RESET);
#endif
#endif