[Skiboot] [PATCH 02/11] xive: Add opal_xive_sync() to sync IRQ sources and queues
Benjamin Herrenschmidt
benh at kernel.crashing.org
Wed Mar 15 20:58:51 AEDT 2017
For now support two sync options, source and target queue, we'll
add sync'ing the presentation layer later.
Signed-off-by: Benjamin Herrenschmidt <benh at kernel.crashing.org>
---
hw/xive.c | 47 ++++++++++++++++++++++++++++++++++++++++++++++-
include/opal-api.h | 7 +++++++
2 files changed, 53 insertions(+), 1 deletion(-)
diff --git a/hw/xive.c b/hw/xive.c
index 9ccf7e7..6553e9b 100644
--- a/hw/xive.c
+++ b/hw/xive.c
@@ -2330,7 +2330,7 @@ static void xive_update_irq_mask(struct xive_src *s, uint32_t idx, bool masked)
in_be64(mmio_base + offset);
}
-static void xive_sync(struct xive *x)
+static int64_t xive_sync(struct xive *x)
{
uint64_t r;
void *p;
@@ -2367,6 +2367,8 @@ static void xive_sync(struct xive *x)
xive_regr(x, VC_GLOBAL_CONFIG);
unlock(&x->lock);
+
+ return 0;
}
static int64_t xive_source_set_xive(struct irq_source *is, uint32_t isn,
@@ -4228,6 +4230,48 @@ static int64_t opal_xive_dump_emu(uint32_t pir)
return OPAL_SUCCESS;
}
+static int64_t opal_xive_sync_irq_src(uint32_t girq)
+{
+ struct xive *x = xive_from_isn(girq);
+
+ if (!x)
+ return OPAL_PARAMETER;
+ return xive_sync(x);
+}
+
+static int64_t opal_xive_sync_irq_target(uint32_t girq)
+{
+ uint32_t target, vp_blk;
+ struct xive *x;
+
+ if (!xive_get_irq_targetting(girq, &target, NULL, NULL))
+ return OPAL_PARAMETER;
+ if (!xive_decode_vp(target, &vp_blk, NULL, NULL, NULL))
+ return OPAL_PARAMETER;
+ x = xive_from_pc_blk(vp_blk);
+ if (!x)
+ return OPAL_PARAMETER;
+ return xive_sync(x);
+}
+
+static int64_t opal_xive_sync(uint32_t type, uint32_t id)
+{
+ int64_t rc = OPAL_SUCCESS;;
+
+ if (type & XIVE_SYNC_EAS)
+ rc = opal_xive_sync_irq_src(id);
+ if (rc)
+ return rc;
+ if (type & XIVE_SYNC_QUEUE)
+ rc = opal_xive_sync_irq_target(id);
+ if (rc)
+ return rc;
+
+ /* Add more ... */
+
+ return rc;
+}
+
static int64_t opal_xive_dump(uint32_t type, uint32_t id)
{
switch (type) {
@@ -4328,6 +4372,7 @@ void init_xive(void)
opal_register(OPAL_XIVE_FREE_VP_BLOCK, opal_xive_free_vp_block, 1);
opal_register(OPAL_XIVE_GET_VP_INFO, opal_xive_get_vp_info, 5);
opal_register(OPAL_XIVE_SET_VP_INFO, opal_xive_set_vp_info, 3);
+ opal_register(OPAL_XIVE_SYNC, opal_xive_sync, 2);
opal_register(OPAL_XIVE_DUMP, opal_xive_dump, 2);
}
diff --git a/include/opal-api.h b/include/opal-api.h
index b814060..6adb564 100644
--- a/include/opal-api.h
+++ b/include/opal-api.h
@@ -1128,6 +1128,13 @@ enum {
OPAL_XIVE_ANY_CHIP = 0xffffffff,
};
+/* Xive sync options */
+enum {
+ /* This bits are cumulative, arg is a girq */
+ XIVE_SYNC_EAS = 0x00000001, /* Sync irq source */
+ XIVE_SYNC_QUEUE = 0x00000002, /* Sync irq target */
+};
+
/* Dump options */
enum {
XIVE_DUMP_TM_HYP = 0,
--
2.9.3
More information about the Skiboot
mailing list