[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH v2 6/6] spapr/xive: Introduce a new CAS value for the StoreEOI ca
From: |
Cédric Le Goater |
Subject: |
[PATCH v2 6/6] spapr/xive: Introduce a new CAS value for the StoreEOI capability |
Date: |
Mon, 5 Oct 2020 18:51:47 +0200 |
When the StoreEOI capability is set to "cas", let CAS decide when
StoreEOI should be advertised. StoreEOI is safe to use with a P10
compat machine because the OS enforces load-after-store ordering but
not with P9 compat.
The question now is : should we make "cas" the default at the machine
level ?
Signed-off-by: Cédric Le Goater <clg@kaod.org>
---
include/hw/ppc/spapr.h | 1 +
include/hw/ppc/spapr_xive.h | 1 +
hw/intc/spapr_xive.c | 9 +++++++++
hw/ppc/spapr_caps.c | 21 +++++++++++++++++----
hw/ppc/spapr_hcall.c | 7 +++++++
5 files changed, 35 insertions(+), 4 deletions(-)
diff --git a/include/hw/ppc/spapr.h b/include/hw/ppc/spapr.h
index b701c14b4e09..17e7d873e8dc 100644
--- a/include/hw/ppc/spapr.h
+++ b/include/hw/ppc/spapr.h
@@ -87,6 +87,7 @@ typedef enum {
#define SPAPR_CAP_ON 0x01
/* Custom Caps */
+#define SPAPR_CAP_CAS 0x02
/* Generic */
#define SPAPR_CAP_BROKEN 0x00
diff --git a/include/hw/ppc/spapr_xive.h b/include/hw/ppc/spapr_xive.h
index 26c8d90d7196..8b8aa586e44f 100644
--- a/include/hw/ppc/spapr_xive.h
+++ b/include/hw/ppc/spapr_xive.h
@@ -75,6 +75,7 @@ void spapr_xive_map_mmio(SpaprXive *xive);
int spapr_xive_end_to_target(uint8_t end_blk, uint32_t end_idx,
uint32_t *out_server, uint8_t *out_prio);
+void spapr_xive_enable_store_eoi(SpaprXive *xive, bool enable);
/*
* KVM XIVE device helpers
diff --git a/hw/intc/spapr_xive.c b/hw/intc/spapr_xive.c
index 41f2719ff93a..f57a2681dd91 100644
--- a/hw/intc/spapr_xive.c
+++ b/hw/intc/spapr_xive.c
@@ -1802,3 +1802,12 @@ void spapr_xive_hcall_init(SpaprMachineState *spapr)
spapr_register_hypercall(H_INT_SYNC, h_int_sync);
spapr_register_hypercall(H_INT_RESET, h_int_reset);
}
+
+void spapr_xive_enable_store_eoi(SpaprXive *xive, bool enable)
+{
+ if (enable) {
+ xive->source.esb_flags |= XIVE_SRC_STORE_EOI;
+ } else {
+ xive->source.esb_flags &= ~XIVE_SRC_STORE_EOI;
+ }
+}
diff --git a/hw/ppc/spapr_caps.c b/hw/ppc/spapr_caps.c
index 9251badbdc27..c55e1fccb9bc 100644
--- a/hw/ppc/spapr_caps.c
+++ b/hw/ppc/spapr_caps.c
@@ -524,6 +524,13 @@ static void cap_fwnmi_apply(SpaprMachineState *spapr,
uint8_t val,
}
}
+SpaprCapPossible cap_storeeoi_possible = {
+ .num = 3,
+ .vals = { "off", "on", "cas" },
+ .help = "off - no StoreEOI, on - StoreEOI, "
+ "cas - negotiated at CAS (POWER10 compat only)",
+};
+
static void cap_storeeoi_apply(SpaprMachineState *spapr, uint8_t val,
Error **errp)
{
@@ -550,6 +557,11 @@ static void cap_storeeoi_apply(SpaprMachineState *spapr,
uint8_t val,
return;
}
+ /* CAS will decide to advertise StoreEOI (P10 compat kernels only) */
+ if (val == SPAPR_CAP_CAS) {
+ return;
+ }
+
/*
* load-after-store ordering is not enforced on POWER9 CPUs
* and StoreEOI can be racy.
@@ -671,11 +683,12 @@ SpaprCapabilityInfo capability_table[SPAPR_CAP_NUM] = {
},
[SPAPR_CAP_STOREEOI] = {
.name = "storeeoi",
- .description = "Implements XIVE StoreEOI feature",
+ .description = "Implements XIVE StoreEOI feature (off, on, cas)",
.index = SPAPR_CAP_STOREEOI,
- .get = spapr_cap_get_bool,
- .set = spapr_cap_set_bool,
- .type = "bool",
+ .get = spapr_cap_get_string,
+ .set = spapr_cap_set_string,
+ .type = "string",
+ .possible = &cap_storeeoi_possible,
.apply = cap_storeeoi_apply,
},
};
diff --git a/hw/ppc/spapr_hcall.c b/hw/ppc/spapr_hcall.c
index 607740150fa2..158b122b9192 100644
--- a/hw/ppc/spapr_hcall.c
+++ b/hw/ppc/spapr_hcall.c
@@ -1804,6 +1804,13 @@ target_ulong do_client_architecture_support(PowerPCCPU
*cpu,
"Guest requested unavailable interrupt mode (XIVE), try the ic-mode=xive or
ic-mode=dual machine property");
exit(EXIT_FAILURE);
}
+
+ /* Advertise StoreEOI for a P10 compat guest. */
+ if (spapr_get_cap(spapr, SPAPR_CAP_STOREEOI) == SPAPR_CAP_CAS) {
+ bool enable = ppc_check_compat(cpu, CPU_POWERPC_LOGICAL_3_10, 0,
+ cpu->compat_pvr);
+ spapr_xive_enable_store_eoi(spapr->xive, enable);
+ }
} else {
if (!spapr->irq->xics) {
error_report(
--
2.25.4
[PATCH v2 5/6] spapr/xive: Activate StoreEOI at the source level, Cédric Le Goater, 2020/10/05
[PATCH v2 4/6] spapr/xive: Enforce load-after-store ordering, Cédric Le Goater, 2020/10/05