[Skiboot] [PATCH skiboot] npu2: Reset PID wildcard and refcounter when mapped to LPID

Alexey Kardashevskiy aik at ozlabs.ru
Thu May 23 14:22:02 AEST 2019

Since 105d80f85b "npu2: Use unfiltered mode in XTS tables" we do not
register every PID in the XTS table so the table has one entry per LPID.
Then we added a reference counter to keep track of the entry use when
switching GPU between the host and guest systems (the "Fixes:" tag below).

The POWERNV platform setup creates such entries and references them
at the boot time when initializing IOMMUs and only removes it when
a GPU is passed through to a guest. This creates a problem as POWERNV
boots via kexec and no defererencing happens; the XTS table state remains
undefined. So when the host kernel boots, skiboot thinks there are valid
XTS entries and does not update the XTS table which breaks ATS.

This adds the reference counter and the XTS entry reset when a GPU is
assigned to LPID and we cannot rely on the kernel to clean that up.

Fixes: ba1d95a1d460 ("npu2: Add XTS_BDF_MAP wildcard refcount")
Signed-off-by: Alexey Kardashevskiy <aik at ozlabs.ru>

Fix for: https://bugzilla.linux.ibm.com/show_bug.cgi?id=177182

 hw/npu2.c | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/hw/npu2.c b/hw/npu2.c
index 97139dd8baed..4e57aad61978 100644
--- a/hw/npu2.c
+++ b/hw/npu2.c
@@ -2233,6 +2233,13 @@ static int opal_npu_map_lpar(uint64_t phb_id, uint64_t bdf, uint64_t lparid,
 	NPU2DBG(p, "XTS_BDF_MAP[%03d] = 0x%08llx\n", id, xts_bdf_lpar);
 	npu2_write(p, NPU2_XTS_BDF_MAP + id*8, xts_bdf_lpar);
+	/* Reset wildcard in the PID map and the refcounter */
+	if (npu2_read(p, NPU2_XTS_PID_MAP + id*0x20) || p->ctx_ref[id]) {
+		prlog(PR_INFO, "Resetting PID MAP for LPID %lld\n", lparid);
+		p->ctx_ref[id] = 0;
+		npu2_write(p, NPU2_XTS_PID_MAP + id*0x20, 0);
+	}
 	return rc;

More information about the Skiboot mailing list