1 /*
2 * Copyright (c) 2020 Raspberry Pi (Trading) Ltd.
3 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 */
6
7 #include "hardware/claim.h"
8
hw_claim_lock()9 uint32_t hw_claim_lock() {
10 return spin_lock_blocking(spin_lock_instance(PICO_SPINLOCK_ID_HARDWARE_CLAIM));
11 }
12
hw_claim_unlock(uint32_t save)13 void hw_claim_unlock(uint32_t save) {
14 spin_unlock(spin_lock_instance(PICO_SPINLOCK_ID_HARDWARE_CLAIM), save);
15 }
16
hw_is_claimed(uint8_t * bits,uint bit_index)17 bool hw_is_claimed(uint8_t *bits, uint bit_index) {
18 bool rc;
19 uint32_t save = hw_claim_lock();
20 if (bits[bit_index >> 3u] & (1u << (bit_index & 7u))) {
21 rc = false;
22 } else {
23 bits[bit_index >> 3u] |= (1u << (bit_index & 7u));
24 rc = true;
25 }
26 hw_claim_unlock(save);
27 return rc;
28 }
29
hw_claim_or_assert(uint8_t * bits,uint bit_index,const char * message)30 void hw_claim_or_assert(uint8_t *bits, uint bit_index, const char *message) {
31 uint32_t save = hw_claim_lock();
32 if (bits[bit_index >> 3u] & (1u << (bit_index & 7u))) {
33 panic(message, bit_index);
34 } else {
35 bits[bit_index >> 3u] |= (1u << (bit_index & 7u));
36 }
37 hw_claim_unlock(save);
38 }
39
hw_claim_unused_from_range(uint8_t * bits,bool required,uint bit_lsb,uint bit_msb,const char * message)40 int hw_claim_unused_from_range(uint8_t *bits, bool required, uint bit_lsb, uint bit_msb, const char *message) {
41 // don't bother check lsb / msb order as if wrong, then it'll fail anyway
42 uint32_t save = hw_claim_lock();
43 int found_bit = -1;
44 for(uint bit=bit_lsb; bit <= bit_msb; bit++) {
45 if (!(bits[bit >> 3u] & (1u << (bit & 7u)))) {
46 bits[bit >> 3u] |= (1u << (bit & 7u));
47 found_bit = bit;
48 break;
49 }
50 }
51 hw_claim_unlock(save);
52 if (found_bit < 0 && required) {
53 panic(message);
54 }
55 return found_bit;
56 }
57
hw_claim_clear(uint8_t * bits,uint bit_index)58 void hw_claim_clear(uint8_t *bits, uint bit_index) {
59 uint32_t save = hw_claim_lock();
60 assert(bits[bit_index >> 3u] & (1u << (bit_index & 7u)));
61 bits[bit_index >> 3u] &= ~(1u << (bit_index & 7u));
62 hw_claim_unlock(save);
63 }
64
65
66