macio: Make interrupt flags atomic.
So they can be modified by other threads.
This commit is contained in:
parent
9af1b1a720
commit
7007e002e6
|
@ -446,6 +446,12 @@ uint32_t GrandCentral::register_dma_int(IntSrc src_id) {
|
|||
void GrandCentral::ack_int_common(uint32_t irq_id, uint8_t irq_line_state) {
|
||||
// native mode: set IRQ bits in int_events1 on a 0-to-1 transition
|
||||
// emulated mode: set IRQ bits in int_events1 on all transitions
|
||||
#if 1
|
||||
if (irq_id & ~(INT_TO_IRQ_ID(0x12) | INT_TO_IRQ_ID(0x1A)))
|
||||
LOG_F(INTERRUPT, "%s: native interrupt mask:%08x events:%08x levels:%08x change:%08x state:%d",
|
||||
this->name.c_str(), this->int_mask, this->int_events + 0, this->int_levels + 0, irq_id, irq_line_state
|
||||
);
|
||||
#endif
|
||||
if ((this->int_mask & MACIO_INT_MODE) ||
|
||||
(irq_line_state && !(this->int_levels & irq_id))) {
|
||||
this->int_events |= irq_id;
|
||||
|
|
|
@ -443,7 +443,9 @@ void HeathrowIC::ack_int(uint32_t irq_id, uint8_t irq_line_state)
|
|||
if (!IS_INT1(irq_id)) { // does this irq_id belong to the second set?
|
||||
IRQ_ID_TO_INT2_MASK(irq_id);
|
||||
#if 0
|
||||
LOG_F(INFO, "%s: native interrupt events:%08x.%08x levels:%08x.%08x change2:%08x state:%d", this->name.c_str(), this->int_events1, this->int_events2, this->int_levels1, this->int_levels2, irq_id, irq_line_state);
|
||||
LOG_F(INFO, "%s: native interrupt events:%08x.%08x levels:%08x.%08x change2:%08x state:%d",
|
||||
this->name.c_str(), this->int_events1 + 0, this->int_events2 + 0, this->int_levels1 + 0, this->int_levels2 + 0, irq_id, irq_line_state
|
||||
);
|
||||
#endif
|
||||
// native mode: set IRQ bits in int_events2 on a 0-to-1 transition
|
||||
// emulated mode: set IRQ bits in int_events2 on all transitions
|
||||
|
@ -465,7 +467,8 @@ void HeathrowIC::ack_int(uint32_t irq_id, uint8_t irq_line_state)
|
|||
// native mode: set IRQ bits in int_events1 on a 0-to-1 transition
|
||||
// emulated mode: set IRQ bits in int_events1 on all transitions
|
||||
#if 0
|
||||
LOG_F(INFO, "%s: native interrupt events:%08x.%08x levels:%08x.%08x change1:%08x state:%d", this->name.c_str(), this->int_events1, this->int_events2, this->int_levels1, this->int_levels2, irq_id, irq_line_state);
|
||||
LOG_F(INFO, "%s: native interrupt events:%08x.%08x levels:%08x.%08x change1:%08x state:%d",
|
||||
this->name.c_str(), this->int_events1 + 0, this->int_events2 + 0, this->int_levels1 + 0, this->int_levels2 + 0, irq_id, irq_line_state);
|
||||
#endif
|
||||
if ((this->int_mask1 & MACIO_INT_MODE) ||
|
||||
(irq_line_state && !(this->int_levels1 & irq_id))) {
|
||||
|
|
|
@ -162,8 +162,8 @@ private:
|
|||
|
||||
// interrupt state
|
||||
uint32_t int_mask = 0;
|
||||
uint32_t int_levels = 0;
|
||||
uint32_t int_events = 0;
|
||||
std::atomic<uint32_t> int_levels{0};
|
||||
std::atomic<uint32_t> int_events{0};
|
||||
bool cpu_int_latch = false;
|
||||
|
||||
// IOBus devices
|
||||
|
@ -230,8 +230,8 @@ private:
|
|||
|
||||
// interrupt state
|
||||
uint32_t int_mask = 0;
|
||||
uint32_t int_levels = 0;
|
||||
uint32_t int_events = 0;
|
||||
std::atomic<uint32_t> int_levels{0};
|
||||
std::atomic<uint32_t> int_events{0};
|
||||
bool cpu_int_latch = false;
|
||||
|
||||
std::unique_ptr<AwacsScreamer> awacs; // AWACS audio codec instance
|
||||
|
@ -324,12 +324,12 @@ protected:
|
|||
|
||||
private:
|
||||
uint32_t base_addr = 0;
|
||||
uint32_t int_events2 = 0;
|
||||
std::atomic<uint32_t> int_events2{0};
|
||||
uint32_t int_mask2 = 0;
|
||||
uint32_t int_levels2 = 0;
|
||||
uint32_t int_events1 = 0;
|
||||
std::atomic<uint32_t> int_levels2{0};
|
||||
std::atomic<uint32_t> int_events1{0};
|
||||
uint32_t int_mask1 = 0;
|
||||
uint32_t int_levels1 = 0;
|
||||
std::atomic<uint32_t> int_levels1{0};
|
||||
uint32_t feat_ctrl = 0; // features control register
|
||||
uint32_t aux_ctrl = 0; // aux features control register
|
||||
bool cpu_int_latch = false;
|
||||
|
|
|
@ -234,7 +234,9 @@ void OHare::ack_int(uint32_t irq_id, uint8_t irq_line_state)
|
|||
// native mode: set IRQ bits in int_events1 on a 0-to-1 transition
|
||||
// emulated mode: set IRQ bits in int_events1 on all transitions
|
||||
#if 1
|
||||
LOG_F(INTERRUPT, "%s: native interrupt mask:%08x events:%08x levels:%08x change:%08x state:%d", this->name.c_str(), this->int_mask, this->int_events, this->int_levels, irq_id, irq_line_state);
|
||||
LOG_F(INTERRUPT, "%s: native interrupt mask:%08x events:%08x levels:%08x change:%08x state:%d",
|
||||
this->name.c_str(), this->int_mask, this->int_events + 0, this->int_levels + 0, irq_id, irq_line_state
|
||||
);
|
||||
#endif
|
||||
if ((this->int_mask & MACIO_INT_MODE) ||
|
||||
(irq_line_state && !(this->int_levels & irq_id))) {
|
||||
|
|
Loading…
Reference in New Issue