int_id = getHPPIR0();
// avoid activation for special interrupts
- if (int_id < Gicv3::INTID_SECURE) {
+ if (int_id < Gicv3::INTID_SECURE ||
+ int_id >= Gicv3Redistributor::SMALLEST_LPI_ID) {
activateIRQ(int_id, hppi.group);
}
} else {
int_id = getHPPIR1();
// avoid activation for special interrupts
- if (int_id < Gicv3::INTID_SECURE) {
+ if (int_id < Gicv3::INTID_SECURE ||
+ int_id >= Gicv3Redistributor::SMALLEST_LPI_ID) {
activateIRQ(int_id, hppi.group);
}
} else {
int int_id = val & 0xffffff;
// avoid activation for special interrupts
- if (int_id >= Gicv3::INTID_SECURE) {
+ if (int_id >= Gicv3::INTID_SECURE &&
+ int_id <= Gicv3::INTID_SPURIOUS) {
return;
}
int int_id = val & 0xffffff;
// avoid deactivation for special interrupts
- if (int_id >= Gicv3::INTID_SECURE) {
+ if (int_id >= Gicv3::INTID_SECURE &&
+ int_id <= Gicv3::INTID_SPURIOUS) {
return;
}
// SPI, distributor
distributor->activateIRQ(int_id);
distributor->updateAndInformCPUInterfaces();
+ } else if (int_id >= Gicv3Redistributor::SMALLEST_LPI_ID) {
+ // LPI, Redistributor
+ redistributor->setClrLPI(int_id, false);
}
}
distributor->deactivateIRQ(int_id);
distributor->updateAndInformCPUInterfaces();
} else {
- return;
+ // LPI, redistributor, shouldn't deactivate
+ redistributor->updateAndInformCPUInterface();
}
}