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)16 PICO_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)24 PICO_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)29 PICO_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)35 PICO_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)42 PICO_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)48 PICO_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)56 PICO_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)62 PICO_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)69 PICO_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)75 PICO_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)81 PICO_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)87 PICO_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)95 PICO_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)101 PICO_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)107 PICO_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)115 PICO_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)120 PICO_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)124 PICO_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)128 PICO_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)132 PICO_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)137 PICO_WEAK_FUNCTION_DEF(spin_lock_num)
138 uint PICO_WEAK_FUNCTION_IMPL_NAME(spin_lock_num)(spin_lock_t *lock) {
139     return 0;
140 }