diff --git a/hw/xive.c b/hw/xive.c index 1237cd9e9120..a9150edfc1e6 100644 --- a/hw/xive.c +++ b/hw/xive.c @@ -1295,6 +1295,25 @@ uint32_t xive_alloc_ipi_irqs(uint32_t chip_id, uint32_t count, uint32_t align) return base; } +void *xive_get_trigger_port(uint32_t girq) +{ + struct xive *x; + uint32_t idx; + + /* Find XIVE on which the IVE resides */ + x = xive_from_isn(girq); + if (!x) + return NULL; + + /* Make sure it's an IPI on that chip */ + if (girq < x->int_base || + girq >= x->int_ipi_top) + return NULL; + + idx = girq - x->int_base; + return x->esb_mmio + idx * 0x20000; +} + uint64_t xive_get_notify_port(uint32_t chip_id, uint32_t ent) { struct proc_chip *chip = get_chip(chip_id); diff --git a/include/xive.h b/include/xive.h index 775ddd7d089c..367daec21e72 100644 --- a/include/xive.h +++ b/include/xive.h @@ -382,4 +382,9 @@ void xive_register_source(uint32_t base, uint32_t count, uint32_t shift, void xive_cpu_callin(struct cpu_thread *cpu); +/* Get the trigger page address for an interrupt allocated with + * xive_alloc_ipi_irqs() + */ +void *xive_get_trigger_port(uint32_t girq); + #endif /* __XIVE_H__ */