[Skiboot] [RFC PATCH skiboot] npu2: Clear XTS_BDF_MAP when destroying context for next init_context

Alexey Kardashevskiy aik at ozlabs.ru
Thu Oct 4 19:17:49 AEST 2018

Once programmed into the NPU, the NPU2_XTS_PID_MAP register content does
not change and if we try calling opal_npu_init_context() with a different
MSR (which is going to happen when GPU+NPU virtualization becomes
available), that will fail.

This clears XTS_BDF_MAP when the context is destroyed.

Signed-off-by: Alexey Kardashevskiy <aik at ozlabs.ru>

The alternative would be making opal_npu_destroy_context() a no-op
and making opal_npu_init_context() do this if a new MSR is different
from the already programmed one. Opinions?

This is for:

In particular these two:

 hw/npu2.c | 10 +++++++---
 1 file changed, 7 insertions(+), 3 deletions(-)

diff --git a/hw/npu2.c b/hw/npu2.c
index d7d9435..a8fc021 100644
--- a/hw/npu2.c
+++ b/hw/npu2.c
@@ -2068,7 +2068,7 @@ static int opal_npu_destroy_context(uint64_t phb_id, uint64_t pid __unused,
 	struct phb *phb = pci_get_phb(phb_id);
 	struct npu2 *p;
 	uint64_t xts_bdf;
-	int rc = 0;
+	int rc = 0, id;
 	if (!phb || phb->phb_type != phb_type_npu_v2)
@@ -2085,9 +2085,13 @@ static int opal_npu_destroy_context(uint64_t phb_id, uint64_t pid __unused,
-	 * The bdf/pid table only contains wildcard entries, so we don't
-	 * need to remove anything here.
+	 * The bdf/pid table contains wildcard entries but also contains
+	 * MSR bits which will change when a device is passed through to
+	 * a KVM guest or vice versa so we need to remove the mapping here.
+	NPU2DBG(p, "XTS_PID_MAP[%03d] = 0 (destroy)\n", id);
+	npu2_write(p, NPU2_XTS_PID_MAP + id*0x20, 0);
 	return rc;

More information about the Skiboot mailing list