Michal Suchanek c6a99b
From 5632874311dbf432c698fcbe0cf7a49e01ebf324 Mon Sep 17 00:00:00 2001
Michal Suchanek c6a99b
From: Christophe Lombard <clombard@linux.vnet.ibm.com>
Michal Suchanek c6a99b
Date: Fri, 8 Sep 2017 15:52:11 +0200
Michal Suchanek c6a99b
Subject: [PATCH] cxl: Add support for POWER9 DD2
Michal Suchanek c6a99b
Michal Suchanek c6a99b
References: bsc#1055014
Michal Suchanek c6a99b
Patch-mainline: queued
Michal Suchanek c6a99b
Git-repo: https://git.kernel.org/pub/scm/linux/kernel/git/powerpc/linux.git
Michal Suchanek c6a99b
Git-commit: 5632874311dbf432c698fcbe0cf7a49e01ebf324
Michal Suchanek c6a99b
Michal Suchanek c6a99b
The PSL initialization sequence has been updated to DD2.
Michal Suchanek c6a99b
This patch adapts to the changes, retaining compatibility with DD1.
Michal Suchanek c6a99b
The patch includes some changes to DD1 fix-ups as well.
Michal Suchanek c6a99b
Michal Suchanek c6a99b
Tests performed on some of the old/new hardware.
Michal Suchanek c6a99b
Michal Suchanek c6a99b
The function is_page_fault(), for POWER9, lists the Translation Checkout
Michal Suchanek c6a99b
Responses where the page fault will be handled by copro_handle_mm_fault().
Michal Suchanek c6a99b
This list is too restrictive and not necessary.
Michal Suchanek c6a99b
Michal Suchanek c6a99b
This patches removes this restriction and all page faults, whatever the
Michal Suchanek c6a99b
reason, will be handled. In this case, the interruption is always
Michal Suchanek c6a99b
acknowledged.
Michal Suchanek c6a99b
Michal Suchanek c6a99b
The following features will be added soon:
Michal Suchanek c6a99b
- phb reset when switching to capi mode.
Michal Suchanek c6a99b
- cxllib update to support new functions.
Michal Suchanek c6a99b
Michal Suchanek c6a99b
Signed-off-by: Christophe Lombard <clombard@linux.vnet.ibm.com>
Michal Suchanek c6a99b
Michal Suchanek c6a99b
Acked-by: Frederic Barrat <fbarrat@linux.vnet.ibm.com>
Michal Suchanek c6a99b
Reviewed-by: Vaibhav Jain <vaibhav@linux.vnet.ibm.com>
Michal Suchanek c6a99b
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Michal Suchanek c6a99b
Acked-by: Michal Suchanek <msuchanek@suse.de>
Michal Suchanek c6a99b
---
Michal Suchanek c6a99b
 drivers/misc/cxl/cxl.h   |  2 ++
Michal Suchanek c6a99b
 drivers/misc/cxl/fault.c | 15 ++-------------
Michal Suchanek c6a99b
 drivers/misc/cxl/pci.c   | 47 ++++++++++++++++++++++++-----------------------
Michal Suchanek c6a99b
 3 files changed, 28 insertions(+), 36 deletions(-)
Michal Suchanek c6a99b
Michal Suchanek c6a99b
diff --git a/drivers/misc/cxl/cxl.h b/drivers/misc/cxl/cxl.h
Michal Suchanek c6a99b
index b1afeccbb97f..0167df81df62 100644
Michal Suchanek c6a99b
--- a/drivers/misc/cxl/cxl.h
Michal Suchanek c6a99b
+++ b/drivers/misc/cxl/cxl.h
Michal Suchanek c6a99b
@@ -100,6 +100,8 @@ static const cxl_p1_reg_t CXL_XSL_FEC       = {0x0158};
Michal Suchanek c6a99b
 static const cxl_p1_reg_t CXL_XSL_DSNCTL    = {0x0168};
Michal Suchanek c6a99b
 /* PSL registers - CAIA 2 */
Michal Suchanek c6a99b
 static const cxl_p1_reg_t CXL_PSL9_CONTROL  = {0x0020};
Michal Suchanek c6a99b
+static const cxl_p1_reg_t CXL_XSL9_INV      = {0x0110};
Michal Suchanek c6a99b
+static const cxl_p1_reg_t CXL_XSL9_DEF      = {0x0140};
Michal Suchanek c6a99b
 static const cxl_p1_reg_t CXL_XSL9_DSNCTL   = {0x0168};
Michal Suchanek c6a99b
 static const cxl_p1_reg_t CXL_PSL9_FIR1     = {0x0300};
Michal Suchanek c6a99b
 static const cxl_p1_reg_t CXL_PSL9_FIR2     = {0x0308};
Michal Suchanek c6a99b
diff --git a/drivers/misc/cxl/fault.c b/drivers/misc/cxl/fault.c
Michal Suchanek c6a99b
index f17f72ea0545..70dbb6de102c 100644
Michal Suchanek c6a99b
--- a/drivers/misc/cxl/fault.c
Michal Suchanek c6a99b
+++ b/drivers/misc/cxl/fault.c
Michal Suchanek c6a99b
@@ -220,22 +220,11 @@ static bool cxl_is_segment_miss(struct cxl_context *ctx, u64 dsisr)
Michal Suchanek c6a99b
 
Michal Suchanek c6a99b
 static bool cxl_is_page_fault(struct cxl_context *ctx, u64 dsisr)
Michal Suchanek c6a99b
 {
Michal Suchanek c6a99b
-	u64 crs; /* Translation Checkout Response Status */
Michal Suchanek c6a99b
-
Michal Suchanek c6a99b
 	if ((cxl_is_power8()) && (dsisr & CXL_PSL_DSISR_An_DM))
Michal Suchanek c6a99b
 		return true;
Michal Suchanek c6a99b
 
Michal Suchanek c6a99b
-	if (cxl_is_power9()) {
Michal Suchanek c6a99b
-		crs = (dsisr & CXL_PSL9_DSISR_An_CO_MASK);
Michal Suchanek c6a99b
-		if ((crs == CXL_PSL9_DSISR_An_PF_SLR) ||
Michal Suchanek c6a99b
-		    (crs == CXL_PSL9_DSISR_An_PF_RGC) ||
Michal Suchanek c6a99b
-		    (crs == CXL_PSL9_DSISR_An_PF_RGP) ||
Michal Suchanek c6a99b
-		    (crs == CXL_PSL9_DSISR_An_PF_HRH) ||
Michal Suchanek c6a99b
-		    (crs == CXL_PSL9_DSISR_An_PF_STEG) ||
Michal Suchanek c6a99b
-		    (crs == CXL_PSL9_DSISR_An_URTCH)) {
Michal Suchanek c6a99b
-			return true;
Michal Suchanek c6a99b
-		}
Michal Suchanek c6a99b
-	}
Michal Suchanek c6a99b
+	if (cxl_is_power9())
Michal Suchanek c6a99b
+		return true;
Michal Suchanek c6a99b
 
Michal Suchanek c6a99b
 	return false;
Michal Suchanek c6a99b
 }
Michal Suchanek c6a99b
diff --git a/drivers/misc/cxl/pci.c b/drivers/misc/cxl/pci.c
Michal Suchanek c6a99b
index 3ba04f371380..b4ce9ea113a9 100644
Michal Suchanek c6a99b
--- a/drivers/misc/cxl/pci.c
Michal Suchanek c6a99b
+++ b/drivers/misc/cxl/pci.c
Michal Suchanek c6a99b
@@ -401,7 +401,8 @@ int cxl_calc_capp_routing(struct pci_dev *dev, u64 *chipid,
Michal Suchanek c6a99b
 	*capp_unit_id = get_capp_unit_id(np, *phb_index);
Michal Suchanek c6a99b
 	of_node_put(np);
Michal Suchanek c6a99b
 	if (!*capp_unit_id) {
Michal Suchanek c6a99b
-		pr_err("cxl: invalid capp unit id\n");
Michal Suchanek c6a99b
+		pr_err("cxl: invalid capp unit id (phb_index: %d)\n",
Michal Suchanek c6a99b
+		       *phb_index);
Michal Suchanek c6a99b
 		return -ENODEV;
Michal Suchanek c6a99b
 	}
Michal Suchanek c6a99b
 
Michal Suchanek c6a99b
@@ -475,37 +476,37 @@ static int init_implementation_adapter_regs_psl9(struct cxl *adapter,
Michal Suchanek c6a99b
 	psl_fircntl |= 0x1ULL; /* ce_thresh */
Michal Suchanek c6a99b
 	cxl_p1_write(adapter, CXL_PSL9_FIR_CNTL, psl_fircntl);
Michal Suchanek c6a99b
 
Michal Suchanek c6a99b
-	/* vccredits=0x1  pcklat=0x4 */
Michal Suchanek c6a99b
-	cxl_p1_write(adapter, CXL_PSL9_DSNDCTL, 0x0000000000001810ULL);
Michal Suchanek c6a99b
-
Michal Suchanek c6a99b
-	/*
Michal Suchanek c6a99b
-	 * For debugging with trace arrays.
Michal Suchanek c6a99b
-	 * Configure RX trace 0 segmented mode.
Michal Suchanek c6a99b
-	 * Configure CT trace 0 segmented mode.
Michal Suchanek c6a99b
-	 * Configure LA0 trace 0 segmented mode.
Michal Suchanek c6a99b
-	 * Configure LA1 trace 0 segmented mode.
Michal Suchanek c6a99b
+	/* Setup the PSL to transmit packets on the PCIe before the
Michal Suchanek c6a99b
+	 * CAPP is enabled
Michal Suchanek c6a99b
 	 */
Michal Suchanek c6a99b
-	cxl_p1_write(adapter, CXL_PSL9_TRACECFG, 0x8040800080000000ULL);
Michal Suchanek c6a99b
-	cxl_p1_write(adapter, CXL_PSL9_TRACECFG, 0x8040800080000003ULL);
Michal Suchanek c6a99b
-	cxl_p1_write(adapter, CXL_PSL9_TRACECFG, 0x8040800080000005ULL);
Michal Suchanek c6a99b
-	cxl_p1_write(adapter, CXL_PSL9_TRACECFG, 0x8040800080000006ULL);
Michal Suchanek c6a99b
+	cxl_p1_write(adapter, CXL_PSL9_DSNDCTL, 0x0001001000002A10ULL);
Michal Suchanek c6a99b
 
Michal Suchanek c6a99b
 	/*
Michal Suchanek c6a99b
 	 * A response to an ASB_Notify request is returned by the
Michal Suchanek c6a99b
 	 * system as an MMIO write to the address defined in
Michal Suchanek c6a99b
-	 * the PSL_TNR_ADDR register
Michal Suchanek c6a99b
+	 * the PSL_TNR_ADDR register.
Michal Suchanek c6a99b
+	 * keep the Reset Value: 0x00020000E0000000
Michal Suchanek c6a99b
 	 */
Michal Suchanek c6a99b
-	/* PSL_TNR_ADDR */
Michal Suchanek c6a99b
 
Michal Suchanek c6a99b
-	/* NORST */
Michal Suchanek c6a99b
-	cxl_p1_write(adapter, CXL_PSL9_DEBUG, 0x8000000000000000ULL);
Michal Suchanek c6a99b
+	/* Enable XSL rty limit */
Michal Suchanek c6a99b
+	cxl_p1_write(adapter, CXL_XSL9_DEF, 0x51F8000000000005ULL);
Michal Suchanek c6a99b
+
Michal Suchanek c6a99b
+	/* Change XSL_INV dummy read threshold */
Michal Suchanek c6a99b
+	cxl_p1_write(adapter, CXL_XSL9_INV, 0x0000040007FFC200ULL);
Michal Suchanek c6a99b
+
Michal Suchanek c6a99b
+	if (phb_index == 3) {
Michal Suchanek c6a99b
+		/* disable machines 31-47 and 20-27 for DMA */
Michal Suchanek c6a99b
+		cxl_p1_write(adapter, CXL_PSL9_APCDEDTYPE, 0x40000FF3FFFF0000ULL);
Michal Suchanek c6a99b
+	}
Michal Suchanek c6a99b
 
Michal Suchanek c6a99b
-	/* allocate the apc machines */
Michal Suchanek c6a99b
-	cxl_p1_write(adapter, CXL_PSL9_APCDEDTYPE, 0x40000003FFFF0000ULL);
Michal Suchanek c6a99b
+	/* Snoop machines */
Michal Suchanek c6a99b
+	cxl_p1_write(adapter, CXL_PSL9_APCDEDALLOC, 0x800F000200000000ULL);
Michal Suchanek c6a99b
 
Michal Suchanek c6a99b
-	/* Disable vc dd1 fix */
Michal Suchanek c6a99b
-	if (cxl_is_power9_dd1())
Michal Suchanek c6a99b
-		cxl_p1_write(adapter, CXL_PSL9_GP_CT, 0x0400000000000001ULL);
Michal Suchanek c6a99b
+	if (cxl_is_power9_dd1()) {
Michal Suchanek c6a99b
+		/* Disabling deadlock counter CAR */
Michal Suchanek c6a99b
+		cxl_p1_write(adapter, CXL_PSL9_GP_CT, 0x0020000000000001ULL);
Michal Suchanek c6a99b
+	} else
Michal Suchanek c6a99b
+		cxl_p1_write(adapter, CXL_PSL9_DEBUG, 0x4000000000000000ULL);
Michal Suchanek c6a99b
 
Michal Suchanek c6a99b
 	return 0;
Michal Suchanek c6a99b
 }
Michal Suchanek c6a99b
-- 
Michal Suchanek c6a99b
2.10.2
Michal Suchanek c6a99b