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