|  | 
| 23 | 23 | #endif | 
| 24 | 24 | #endif | 
| 25 | 25 | 
 | 
| 26 |  | -// note that these are not reset by core reset, however for now, I think people resetting cores | 
| 27 |  | -// and then relying on multicore_lockout for that core without re-initializing, is probably | 
| 28 |  | -// something we can live with breaking. | 
| 29 |  | -// | 
| 30 |  | -// whilst we could clear this in core 1 reset path, that doesn't necessarily catch all, | 
| 31 |  | -// and means pulling in this array even if multicore_lockout is not used. | 
|  | 26 | +// Note that there is no automatic way for us to clear these flags when a particular core is reset, and yet | 
|  | 27 | +// we DO ideally want to clear them, as the `multicore_lockout_victim_init()` checks the flag for the current core | 
|  | 28 | +// and is a no-op if set. We DO have a new `multicore_lockout_victim_deinit()` method, which can be called in a pinch after | 
|  | 29 | +// the reset before calling `multicore_lockout_victim_init()` again, so that is good. We will reset the flag | 
|  | 30 | +// for core1 in `multicore_reset_core1()` though as a convenience since most people will use that to reset core 1. | 
| 32 | 31 | static bool lockout_victim_initialized[NUM_CORES]; | 
| 33 | 32 | 
 | 
| 34 | 33 | void multicore_fifo_push_blocking(uint32_t data) { | 
| @@ -118,6 +117,9 @@ void multicore_reset_core1(void) { | 
| 118 | 117 |     bool enabled = irq_is_enabled(irq_num); | 
| 119 | 118 |     irq_set_enabled(irq_num, false); | 
| 120 | 119 | 
 | 
|  | 120 | +    // Core 1 will be in un-initialized state | 
|  | 121 | +    lockout_victim_initialized[1] = false; | 
|  | 122 | + | 
| 121 | 123 |     // Bring core 1 back out of reset. It will drain its own mailbox FIFO, then push | 
| 122 | 124 |     // a 0 to our mailbox to tell us it has done this. | 
| 123 | 125 |     *power_off_clr = PSM_FRCE_OFF_PROC1_BITS; | 
| @@ -243,6 +245,18 @@ void multicore_lockout_victim_init(void) { | 
| 243 | 245 |     lockout_victim_initialized[core_num] = true; | 
| 244 | 246 | } | 
| 245 | 247 | 
 | 
|  | 248 | +void multicore_lockout_victim_deinit(void) { | 
|  | 249 | +    uint core_num = get_core_num(); | 
|  | 250 | +    if (lockout_victim_initialized[core_num]) { | 
|  | 251 | +        // On platforms other than RP2040, these are actually the same IRQ number | 
|  | 252 | +        // (each core only sees its own IRQ, always at the same IRQ number). | 
|  | 253 | +        uint fifo_irq_this_core = SIO_FIFO_IRQ_NUM(core_num); | 
|  | 254 | +        irq_remove_handler(fifo_irq_this_core, multicore_lockout_handler); | 
|  | 255 | +        irq_set_enabled(fifo_irq_this_core, false); | 
|  | 256 | +        lockout_victim_initialized[core_num] = false; | 
|  | 257 | +    } | 
|  | 258 | +} | 
|  | 259 | + | 
| 246 | 260 | static bool multicore_lockout_handshake(uint32_t magic, absolute_time_t until) { | 
| 247 | 261 |     uint irq_num = SIO_FIFO_IRQ_NUM(get_core_num()); | 
| 248 | 262 |     bool enabled = irq_is_enabled(irq_num); | 
|  | 
0 commit comments