summaryrefslogtreecommitdiffstats
path: root/hw/intc/xive.c
diff options
context:
space:
mode:
authorCédric Le Goater2019-07-18 13:54:08 +0200
committerDavid Gibson2019-08-21 09:17:39 +0200
commitb4e3066684ea9379e09c8c6b0902eceb939fa97c (patch)
treed6dc7179e1cdc14bca8bcf56d3f30afb8a8a2ce5 /hw/intc/xive.c
parentppc/xive: Provide backlog support (diff)
downloadqemu-b4e3066684ea9379e09c8c6b0902eceb939fa97c.tar.gz
qemu-b4e3066684ea9379e09c8c6b0902eceb939fa97c.tar.xz
qemu-b4e3066684ea9379e09c8c6b0902eceb939fa97c.zip
ppc/xive: Provide escalation support
If the XIVE presenter can not find the NVT dispatched on any of the HW threads, it can not deliver the interrupt. XIVE offers an escalation mechanism to handle such scenarios and inform the hypervisor that an action should be taken. Escalation is configured by setting the 'e' bit and the EAS in word 4 & 5 to let the HW look for the escalation END on which to trigger a new event. Signed-off-by: Cédric Le Goater <clg@kaod.org> Message-Id: <20190718115420.19919-6-clg@kaod.org> Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
Diffstat (limited to 'hw/intc/xive.c')
-rw-r--r--hw/intc/xive.c16
1 files changed, 16 insertions, 0 deletions
diff --git a/hw/intc/xive.c b/hw/intc/xive.c
index f27b4e3328..12f0d09df6 100644
--- a/hw/intc/xive.c
+++ b/hw/intc/xive.c
@@ -1549,6 +1549,22 @@ static void xive_router_end_notify(XiveRouter *xrtr, uint8_t end_blk,
* On HW, follows a "Broadcast Backlog" to IVPEs
*/
}
+
+ /*
+ * If activated, escalate notification using the ESe PQ bits and
+ * the EAS in w4-5
+ */
+ if (!xive_end_is_escalate(&end)) {
+ return;
+ }
+
+ /*
+ * The END trigger becomes an Escalation trigger
+ */
+ xive_router_end_notify(xrtr,
+ xive_get_field32(END_W4_ESC_END_BLOCK, end.w4),
+ xive_get_field32(END_W4_ESC_END_INDEX, end.w4),
+ xive_get_field32(END_W5_ESC_END_DATA, end.w5));
}
void xive_router_notify(XiveNotifier *xn, uint32_t lisn)