Thread (13 messages) 13 messages, 4 authors, 2020-11-24

Re: [PATCH V2 3/5] ocxl: Update the Process Element Entry

From: Frederic Barrat <hidden>
Date: 2020-11-23 10:41:49


On 20/11/2020 18:32, Christophe Lombard wrote:
quoted hunk ↗ jump to hunk
To complete the MMIO based mechanism, the fields: PASID, bus, device and
function of the Process Element Entry have to be filled. (See
OpenCAPI Power Platform Architecture document)

                    Hypervisor Process Element Entry
Word
     0 1 .... 7  8  ...... 12  13 ..15  16.... 19  20 ........... 31
0                  OSL Configuration State (0:31)
1                  OSL Configuration State (32:63)
2               PASID                      |    Reserved
3       Bus   |   Device    |Function |        Reserved
4                             Reserved
5                             Reserved
6                               ....

Signed-off-by: Christophe Lombard <redacted>
---
  drivers/misc/ocxl/context.c       | 4 +++-
  drivers/misc/ocxl/link.c          | 4 +++-
  drivers/misc/ocxl/ocxl_internal.h | 4 +++-
  drivers/scsi/cxlflash/ocxl_hw.c   | 6 ++++--
  include/misc/ocxl.h               | 2 +-
  5 files changed, 14 insertions(+), 6 deletions(-)
diff --git a/drivers/misc/ocxl/context.c b/drivers/misc/ocxl/context.c
index c21f65a5c762..9eb0d93b01c6 100644
--- a/drivers/misc/ocxl/context.c
+++ b/drivers/misc/ocxl/context.c
@@ -70,6 +70,7 @@ int ocxl_context_attach(struct ocxl_context *ctx, u64 amr, struct mm_struct *mm)
  {
  	int rc;
  	unsigned long pidr = 0;
+	struct pci_dev *dev;

  	// Locks both status & tidr
  	mutex_lock(&ctx->status_mutex);
@@ -81,8 +82,9 @@ int ocxl_context_attach(struct ocxl_context *ctx, u64 amr, struct mm_struct *mm)
  	if (mm)
  		pidr = mm->context.id;

+	dev = to_pci_dev(ctx->afu->fn->dev.parent);
  	rc = ocxl_link_add_pe(ctx->afu->fn->link, ctx->pasid, pidr, ctx->tidr,
-			      amr, mm, xsl_fault_error, ctx);
+			      amr, pci_dev_id(dev), mm, xsl_fault_error, ctx);
  	if (rc)
  		goto out;
diff --git a/drivers/misc/ocxl/link.c b/drivers/misc/ocxl/link.c
index fd73d3bc0eb6..20444db8a2bb 100644
--- a/drivers/misc/ocxl/link.c
+++ b/drivers/misc/ocxl/link.c
@@ -494,7 +494,7 @@ static u64 calculate_cfg_state(bool kernel)
  }

  int ocxl_link_add_pe(void *link_handle, int pasid, u32 pidr, u32 tidr,
-		u64 amr, struct mm_struct *mm,
+		u64 amr, u64 bdf, struct mm_struct *mm,

bdf could/should be a u16, since that's per the PCI spec.

   Fred

quoted hunk ↗ jump to hunk
  		void (*xsl_err_cb)(void *data, u64 addr, u64 dsisr),
  		void *xsl_err_data)
  {
@@ -529,6 +529,8 @@ int ocxl_link_add_pe(void *link_handle, int pasid, u32 pidr, u32 tidr,

  	memset(pe, 0, sizeof(struct ocxl_process_element));
  	pe->config_state = cpu_to_be64(calculate_cfg_state(pidr == 0));
+	pe->pasid = cpu_to_be32(pasid << (31 - 19));
+	pe->bdf = cpu_to_be32(bdf << (31 - 15));
  	pe->lpid = cpu_to_be32(mfspr(SPRN_LPID));
  	pe->pid = cpu_to_be32(pidr);
  	pe->tid = cpu_to_be32(tidr);
diff --git a/drivers/misc/ocxl/ocxl_internal.h b/drivers/misc/ocxl/ocxl_internal.h
index 0bad0a123af6..c9ce2af21d6f 100644
--- a/drivers/misc/ocxl/ocxl_internal.h
+++ b/drivers/misc/ocxl/ocxl_internal.h
@@ -84,7 +84,9 @@ struct ocxl_context {

  struct ocxl_process_element {
  	__be64 config_state;
-	__be32 reserved1[11];
+	__be32 pasid;
+	__be32 bdf;
+	__be32 reserved1[9];
  	__be32 lpid;
  	__be32 tid;
  	__be32 pid;
diff --git a/drivers/scsi/cxlflash/ocxl_hw.c b/drivers/scsi/cxlflash/ocxl_hw.c
index e4e0d767b98e..244fc27215dc 100644
--- a/drivers/scsi/cxlflash/ocxl_hw.c
+++ b/drivers/scsi/cxlflash/ocxl_hw.c
@@ -329,6 +329,7 @@ static int start_context(struct ocxlflash_context *ctx)
  	struct ocxl_hw_afu *afu = ctx->hw_afu;
  	struct ocxl_afu_config *acfg = &afu->acfg;
  	void *link_token = afu->link_token;
+	struct pci_dev *pdev = afu->pdev;
  	struct device *dev = afu->dev;
  	bool master = ctx->master;
  	struct mm_struct *mm;
@@ -360,8 +361,9 @@ static int start_context(struct ocxlflash_context *ctx)
  		mm = current->mm;
  	}

-	rc = ocxl_link_add_pe(link_token, ctx->pe, pid, 0, 0, mm,
-			      ocxlflash_xsl_fault, ctx);
+	rc = ocxl_link_add_pe(link_token, ctx->pe, pid, 0, 0,
+			      pci_dev_id(pdev), mm, ocxlflash_xsl_fault,
+			      ctx);
  	if (unlikely(rc)) {
  		dev_err(dev, "%s: ocxl_link_add_pe failed rc=%d\n",
  			__func__, rc);
diff --git a/include/misc/ocxl.h b/include/misc/ocxl.h
index e013736e275d..d0f101f428dd 100644
--- a/include/misc/ocxl.h
+++ b/include/misc/ocxl.h
@@ -447,7 +447,7 @@ void ocxl_link_release(struct pci_dev *dev, void *link_handle);
   * defined
   */
  int ocxl_link_add_pe(void *link_handle, int pasid, u32 pidr, u32 tidr,
-		u64 amr, struct mm_struct *mm,
+		u64 amr, u64 bdf, struct mm_struct *mm,
  		void (*xsl_err_cb)(void *data, u64 addr, u64 dsisr),
  		void *xsl_err_data);
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help