|
@@ -106,6 +106,15 @@ static void grlib_irqmp_check_irqs(IRQMPState *state)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+static void grlib_irqmp_ack_mask(IRQMPState *state, uint32_t mask)
|
|
|
|
+{
|
|
|
|
+ /* Clear registers */
|
|
|
|
+ state->pending &= ~mask;
|
|
|
|
+ state->force[0] &= ~mask; /* Only CPU 0 (No SMP support) */
|
|
|
|
+
|
|
|
|
+ grlib_irqmp_check_irqs(state);
|
|
|
|
+}
|
|
|
|
+
|
|
void grlib_irqmp_ack(DeviceState *dev, int intno)
|
|
void grlib_irqmp_ack(DeviceState *dev, int intno)
|
|
{
|
|
{
|
|
IRQMP *irqmp = GRLIB_IRQMP(dev);
|
|
IRQMP *irqmp = GRLIB_IRQMP(dev);
|
|
@@ -120,11 +129,7 @@ void grlib_irqmp_ack(DeviceState *dev, int intno)
|
|
|
|
|
|
trace_grlib_irqmp_ack(intno);
|
|
trace_grlib_irqmp_ack(intno);
|
|
|
|
|
|
- /* Clear registers */
|
|
|
|
- state->pending &= ~mask;
|
|
|
|
- state->force[0] &= ~mask; /* Only CPU 0 (No SMP support) */
|
|
|
|
-
|
|
|
|
- grlib_irqmp_check_irqs(state);
|
|
|
|
|
|
+ grlib_irqmp_ack_mask(state, mask);
|
|
}
|
|
}
|
|
|
|
|
|
void grlib_irqmp_set_irq(void *opaque, int irq, int level)
|
|
void grlib_irqmp_set_irq(void *opaque, int irq, int level)
|
|
@@ -251,7 +256,7 @@ static void grlib_irqmp_write(void *opaque, hwaddr addr,
|
|
|
|
|
|
case CLEAR_OFFSET:
|
|
case CLEAR_OFFSET:
|
|
value &= ~1; /* clean up the value */
|
|
value &= ~1; /* clean up the value */
|
|
- state->pending &= ~value;
|
|
|
|
|
|
+ grlib_irqmp_ack_mask(state, value);
|
|
return;
|
|
return;
|
|
|
|
|
|
case MP_STATUS_OFFSET:
|
|
case MP_STATUS_OFFSET:
|