[PATCH] ocxl: Update for AFU descriptor template version 1.1

2019-06-05 Thread Frederic Barrat
From: Alastair D'Silva 

The OpenCAPI discovery and configuration specification has been
updated and introduces version 1.1 of the AFU descriptor template,
with new fields to better define the memory layout of an OpenCAPI
adapter.

The ocxl driver doesn't do much yet to support LPC memory but as we
start seeing (non-LPC) AFU images using the new template, this patch
updates the config space parsing code to avoid spitting a warning.

Signed-off-by: Alastair D'Silva 
Signed-off-by: Frederic Barrat 
---

mpe: this patch is originally from Alastair. I added some minor
tweaking, I hope he won't mind. He has better things to do right now,
and I'd like to see this hit the next merge window.


 drivers/misc/ocxl/config.c | 181 +
 include/misc/ocxl.h|   5 +-
 2 files changed, 165 insertions(+), 21 deletions(-)

diff --git a/drivers/misc/ocxl/config.c b/drivers/misc/ocxl/config.c
index 5e65acb8e134..c8e19bfb5ef9 100644
--- a/drivers/misc/ocxl/config.c
+++ b/drivers/misc/ocxl/config.c
@@ -20,11 +20,14 @@
 #define OCXL_DVSEC_TEMPL_MMIO_GLOBAL_SZ  0x28
 #define OCXL_DVSEC_TEMPL_MMIO_PP 0x30
 #define OCXL_DVSEC_TEMPL_MMIO_PP_SZ  0x38
-#define OCXL_DVSEC_TEMPL_MEM_SZ  0x3C
-#define OCXL_DVSEC_TEMPL_WWID0x40
+#define OCXL_DVSEC_TEMPL_ALL_MEM_SZ  0x3C
+#define OCXL_DVSEC_TEMPL_LPC_MEM_START   0x40
+#define OCXL_DVSEC_TEMPL_WWID0x48
+#define OCXL_DVSEC_TEMPL_LPC_MEM_SZ  0x58
 
 #define OCXL_MAX_AFU_PER_FUNCTION 64
-#define OCXL_TEMPL_LEN0x58
+#define OCXL_TEMPL_LEN_1_00x58
+#define OCXL_TEMPL_LEN_1_10x60
 #define OCXL_TEMPL_NAME_LEN   24
 #define OCXL_CFG_TIMEOUT 3
 
@@ -269,34 +272,72 @@ static int read_afu_info(struct pci_dev *dev, struct 
ocxl_fn_config *fn,
return 0;
 }
 
+/**
+ * Read the template version from the AFU
+ * dev: the device for the AFU
+ * fn: the AFU offsets
+ * len: outputs the template length
+ * version: outputs the major<<8,minor version
+ *
+ * Returns 0 on success, negative on failure
+ */
+static int read_template_version(struct pci_dev *dev, struct ocxl_fn_config 
*fn,
+   u16 *len, u16 *version)
+{
+   u32 val32;
+   u8 major, minor;
+   int rc;
+
+   rc = read_afu_info(dev, fn, OCXL_DVSEC_TEMPL_VERSION, &val32);
+   if (rc)
+   return rc;
+
+   *len = EXTRACT_BITS(val32, 16, 31);
+   major = EXTRACT_BITS(val32, 8, 15);
+   minor = EXTRACT_BITS(val32, 0, 7);
+   *version = (major << 8) + minor;
+   return 0;
+}
+
 int ocxl_config_check_afu_index(struct pci_dev *dev,
struct ocxl_fn_config *fn, int afu_idx)
 {
-   u32 val;
-   int rc, templ_major, templ_minor, len;
+   int rc;
+   u16 templ_version;
+   u16 len, expected_len;
 
pci_write_config_byte(dev,
fn->dvsec_afu_info_pos + OCXL_DVSEC_AFU_INFO_AFU_IDX,
afu_idx);
-   rc = read_afu_info(dev, fn, OCXL_DVSEC_TEMPL_VERSION, &val);
+
+   rc = read_template_version(dev, fn, &len, &templ_version);
if (rc)
return rc;
 
-   /* AFU index map can have holes */
-   if (!val)
+   /* AFU index map can have holes, in which case we read all 0's */
+   if (!templ_version && !len)
return 0;
 
-   templ_major = EXTRACT_BITS(val, 8, 15);
-   templ_minor = EXTRACT_BITS(val, 0, 7);
dev_dbg(&dev->dev, "AFU descriptor template version %d.%d\n",
-   templ_major, templ_minor);
-
-   len = EXTRACT_BITS(val, 16, 31);
-   if (len != OCXL_TEMPL_LEN) {
-   dev_warn(&dev->dev,
-   "Unexpected template length in AFU information (%#x)\n",
-   len);
+   templ_version >> 8, templ_version & 0xFF);
+
+   switch (templ_version) {
+   case 0x0005: // v0.5 was used prior to the spec approval
+   case 0x0100:
+   expected_len = OCXL_TEMPL_LEN_1_0;
+   break;
+   case 0x0101:
+   expected_len = OCXL_TEMPL_LEN_1_1;
+   break;
+   default:
+   dev_warn(&dev->dev, "Unknown AFU template version %#x\n",
+   templ_version);
+   expected_len = len;
}
+   if (len != expected_len)
+   dev_warn(&dev->dev,
+   "Unexpected template length %#x in AFU information, 
expected %#x for version %#x\n",
+   len, expected_len, templ_version);
return 1;
 }
 
@@ -434,6 +475,102 @@ static int validate_afu(struct pci_dev *dev, struct 
ocxl_afu_config *afu)
return 0;
 }
 
+/**
+ * Populate AFU metadata regarding LPC memory
+ * dev: the device for the AFU
+ * fn: the AFU offsets
+ * afu: the AFU struct to populate the LPC metadata into
+ *
+ * Returns 0 on success, negative on failure
+ */
+static int read_afu_lpc_memory_info(struct pci_dev *dev,
+ 

Re: [PATCH] ocxl: Update for AFU descriptor template version 1.1

2019-07-10 Thread Michael Ellerman
On Wed, 2019-06-05 at 11:15:45 UTC, Frederic Barrat wrote:
> From: Alastair D'Silva 
> 
> The OpenCAPI discovery and configuration specification has been
> updated and introduces version 1.1 of the AFU descriptor template,
> with new fields to better define the memory layout of an OpenCAPI
> adapter.
> 
> The ocxl driver doesn't do much yet to support LPC memory but as we
> start seeing (non-LPC) AFU images using the new template, this patch
> updates the config space parsing code to avoid spitting a warning.
> 
> Signed-off-by: Alastair D'Silva 
> Signed-off-by: Frederic Barrat 
> Reviewed-by: Christophe Lombard 
> Acked-by: Andrew Donnellan 

Applied to powerpc next, thanks.

https://git.kernel.org/powerpc/c/73a2b047c81046a7f734a5759ab5fdedbb6968fd

cheers


Re: [PATCH] ocxl: Update for AFU descriptor template version 1.1

2019-06-19 Thread christophe lombard

On 05/06/2019 13:15, Frederic Barrat wrote:

From: Alastair D'Silva 

The OpenCAPI discovery and configuration specification has been
updated and introduces version 1.1 of the AFU descriptor template,
with new fields to better define the memory layout of an OpenCAPI
adapter.

The ocxl driver doesn't do much yet to support LPC memory but as we
start seeing (non-LPC) AFU images using the new template, this patch
updates the config space parsing code to avoid spitting a warning.

Signed-off-by: Alastair D'Silva 
Signed-off-by: Frederic Barrat 
---



The content of the patch sounds good. Thanks.

Reviewed-by: Christophe Lombard 



Re: [PATCH] ocxl: Update for AFU descriptor template version 1.1

2019-06-24 Thread Andrew Donnellan

On 5/6/19 9:15 pm, Frederic Barrat wrote:

From: Alastair D'Silva 

The OpenCAPI discovery and configuration specification has been
updated and introduces version 1.1 of the AFU descriptor template,
with new fields to better define the memory layout of an OpenCAPI
adapter.

The ocxl driver doesn't do much yet to support LPC memory but as we
start seeing (non-LPC) AFU images using the new template, this patch
updates the config space parsing code to avoid spitting a warning.

Signed-off-by: Alastair D'Silva 
Signed-off-by: Frederic Barrat 


Acked-by: Andrew Donnellan 

Alastair: you should fix your editor config :) 
https://openpower.xyz/job/snowpatch/job/snowpatch-linux-checkpatch/7564//artifact/linux/checkpatch.log



--
Andrew Donnellan  OzLabs, ADL Canberra
a...@linux.ibm.com IBM Australia Limited