/* * Copyright (c) 2020 Raspberry Pi (Trading) Ltd. * * SPDX-License-Identifier: BSD-3-Clause */ #ifndef _HARDWARE_SYNC_H #define _HARDWARE_SYNC_H #include "pico.h" #ifndef __cplusplus #if (__STDC_VERSION__ >= 201112L) #include #else enum { memory_order_acquire, memory_order_release }; static inline void atomic_thread_fence(uint x) {} #endif #else #include #endif #ifndef PICO_SPINLOCK_ID_TIMER #define PICO_SPINLOCK_ID_TIMER 10 #endif #ifndef PICO_SPINLOCK_ID_STRIPED_FIRST #define PICO_SPINLOCK_ID_STRIPED_FIRST 16 #endif #ifndef PICO_SPINLOCK_ID_STRIPED_LAST #define PICO_SPINLOCK_ID_STRIPED_LAST 23 #endif typedef struct _spin_lock_t spin_lock_t; inline static void __mem_fence_acquire() { #ifndef __cplusplus atomic_thread_fence(memory_order_acquire); #else std::atomic_thread_fence(std::memory_order_acquire); #endif } inline static void __mem_fence_release() { #ifndef __cplusplus atomic_thread_fence(memory_order_release); #else std::atomic_thread_fence(std::memory_order_release); #endif } #ifdef __cplusplus extern "C" { #endif void __sev(); void __wev(); void __wfi(); void __wfe(); uint32_t save_and_disable_interrupts(); void restore_interrupts(uint32_t status); uint spin_lock_get_num(spin_lock_t *lock); spin_lock_t *spin_lock_instance(uint lock_num); void spin_lock_unsafe_blocking(spin_lock_t *lock); void spin_unlock_unsafe(spin_lock_t *lock); uint32_t spin_lock_blocking(spin_lock_t *lock); bool is_spin_locked(const spin_lock_t *lock); void spin_unlock(spin_lock_t *lock, uint32_t saved_irq); spin_lock_t *spin_lock_init(uint lock_num); void clear_spin_locks(void); uint next_striped_spin_lock_num(); void spin_lock_claim(uint lock_num); void spin_lock_claim_mask(uint32_t lock_num_mask); void spin_lock_unclaim(uint lock_num); int spin_lock_claim_unused(bool required); uint spin_lock_num(spin_lock_t *lock); #ifdef __cplusplus } #endif #endif