1 /* 2 * Copyright (c) 2020 Raspberry Pi (Trading) Ltd. 3 * 4 * SPDX-License-Identifier: BSD-3-Clause 5 */ 6 7 #include "hardware/sync.h" 8 #include "hardware/platform_defs.h" 9 10 // This is a dummy implementation that is single threaded 11 12 static struct _spin_lock_t { 13 bool locked; 14 } _spinlocks[NUM_SPIN_LOCKS]; 15 PICO_WEAK_FUNCTION_DEF(save_and_disable_interrupts)16PICO_WEAK_FUNCTION_DEF(save_and_disable_interrupts) 17 18 //static uint8_t striped_spin_lock_num; 19 20 uint32_t PICO_WEAK_FUNCTION_IMPL_NAME(save_and_disable_interrupts)() { 21 return 0; 22 } 23 PICO_WEAK_FUNCTION_DEF(restore_interrupts)24PICO_WEAK_FUNCTION_DEF(restore_interrupts) 25 26 void PICO_WEAK_FUNCTION_IMPL_NAME(restore_interrupts)(uint32_t status) { 27 } 28 PICO_WEAK_FUNCTION_DEF(restore_interrupts_from_disabled)29PICO_WEAK_FUNCTION_DEF(restore_interrupts_from_disabled) 30 31 void PICO_WEAK_FUNCTION_IMPL_NAME(restore_interrupts_from_disabled)(uint32_t status) { 32 } 33 34 PICO_WEAK_FUNCTION_DEF(spin_lock_instance)35PICO_WEAK_FUNCTION_DEF(spin_lock_instance) 36 37 spin_lock_t *PICO_WEAK_FUNCTION_IMPL_NAME(spin_lock_instance)(uint lock_num) { 38 assert(lock_num < NUM_SPIN_LOCKS); 39 return &_spinlocks[lock_num]; 40 } 41 PICO_WEAK_FUNCTION_DEF(spin_lock_get_num)42PICO_WEAK_FUNCTION_DEF(spin_lock_get_num) 43 44 uint PICO_WEAK_FUNCTION_IMPL_NAME(spin_lock_get_num)(spin_lock_t *lock) { 45 return lock - _spinlocks; 46 } 47 PICO_WEAK_FUNCTION_DEF(spin_lock_init)48PICO_WEAK_FUNCTION_DEF(spin_lock_init) 49 50 spin_lock_t *PICO_WEAK_FUNCTION_IMPL_NAME(spin_lock_init)(uint lock_num) { 51 spin_lock_t *lock = spin_lock_instance(lock_num); 52 spin_unlock_unsafe(lock); 53 return lock; 54 } 55 PICO_WEAK_FUNCTION_DEF(spin_lock_unsafe_blocking)56PICO_WEAK_FUNCTION_DEF(spin_lock_unsafe_blocking) 57 58 void PICO_WEAK_FUNCTION_IMPL_NAME(spin_lock_unsafe_blocking)(spin_lock_t *lock) { 59 lock->locked = true; 60 } 61 PICO_WEAK_FUNCTION_DEF(spin_lock_blocking)62PICO_WEAK_FUNCTION_DEF(spin_lock_blocking) 63 64 uint32_t PICO_WEAK_FUNCTION_IMPL_NAME(spin_lock_blocking)(spin_lock_t *lock) { 65 spin_lock_unsafe_blocking(lock); 66 return 1; // todo wrong value 67 } 68 PICO_WEAK_FUNCTION_DEF(is_spin_locked)69PICO_WEAK_FUNCTION_DEF(is_spin_locked) 70 71 bool PICO_WEAK_FUNCTION_IMPL_NAME(is_spin_locked)(const spin_lock_t *lock) { 72 return lock->locked; 73 } 74 PICO_WEAK_FUNCTION_DEF(spin_unlock_unsafe)75PICO_WEAK_FUNCTION_DEF(spin_unlock_unsafe) 76 77 void PICO_WEAK_FUNCTION_IMPL_NAME(spin_unlock_unsafe)(spin_lock_t *lock) { 78 lock->locked = false; 79 } 80 PICO_WEAK_FUNCTION_DEF(spin_unlock)81PICO_WEAK_FUNCTION_DEF(spin_unlock) 82 83 void PICO_WEAK_FUNCTION_IMPL_NAME(spin_unlock)(spin_lock_t *lock, uint32_t saved_irq) { 84 spin_unlock_unsafe(lock); 85 } 86 PICO_WEAK_FUNCTION_DEF(__sev)87PICO_WEAK_FUNCTION_DEF(__sev) 88 89 volatile bool event_fired; 90 91 void PICO_WEAK_FUNCTION_IMPL_NAME(__sev)() { 92 event_fired = true; 93 } 94 PICO_WEAK_FUNCTION_DEF(__wfi)95PICO_WEAK_FUNCTION_DEF(__wfi) 96 97 void PICO_WEAK_FUNCTION_IMPL_NAME(__wfi)() { 98 panic("Can't wait on irq for host core0 only implementation"); 99 } 100 PICO_WEAK_FUNCTION_DEF(__wfe)101PICO_WEAK_FUNCTION_DEF(__wfe) 102 103 void PICO_WEAK_FUNCTION_IMPL_NAME(__wfe)() { 104 while (!event_fired) tight_loop_contents(); 105 } 106 PICO_WEAK_FUNCTION_DEF(clear_spin_locks)107PICO_WEAK_FUNCTION_DEF(clear_spin_locks) 108 109 void PICO_WEAK_FUNCTION_IMPL_NAME(clear_spin_locks)(void) { 110 for (uint i = 0; i < NUM_SPIN_LOCKS; i++) { 111 spin_unlock_unsafe(spin_lock_instance(i)); 112 } 113 } 114 PICO_WEAK_FUNCTION_DEF(next_striped_spin_lock_num)115PICO_WEAK_FUNCTION_DEF(next_striped_spin_lock_num) 116 uint PICO_WEAK_FUNCTION_IMPL_NAME(next_striped_spin_lock_num)() { 117 return 0; 118 } 119 PICO_WEAK_FUNCTION_DEF(spin_lock_claim)120PICO_WEAK_FUNCTION_DEF(spin_lock_claim) 121 void PICO_WEAK_FUNCTION_IMPL_NAME(spin_lock_claim)(uint lock_num) { 122 } 123 PICO_WEAK_FUNCTION_DEF(spin_lock_claim_mask)124PICO_WEAK_FUNCTION_DEF(spin_lock_claim_mask) 125 void PICO_WEAK_FUNCTION_IMPL_NAME(spin_lock_claim_mask)(uint32_t mask) { 126 } 127 PICO_WEAK_FUNCTION_DEF(spin_lock_unclaim)128PICO_WEAK_FUNCTION_DEF(spin_lock_unclaim) 129 void PICO_WEAK_FUNCTION_IMPL_NAME(spin_lock_unclaim)(uint lock_num) { 130 } 131 PICO_WEAK_FUNCTION_DEF(spin_lock_claim_unused)132PICO_WEAK_FUNCTION_DEF(spin_lock_claim_unused) 133 int PICO_WEAK_FUNCTION_IMPL_NAME(spin_lock_claim_unused)(bool required) { 134 return 0; 135 } 136 PICO_WEAK_FUNCTION_DEF(spin_lock_num)137PICO_WEAK_FUNCTION_DEF(spin_lock_num) 138 uint PICO_WEAK_FUNCTION_IMPL_NAME(spin_lock_num)(spin_lock_t *lock) { 139 return 0; 140 }