Message ID | 20201124095838.18665-4-clombard@linux.vnet.ibm.com (mailing list archive) |
---|---|
State | Changes Requested |
Headers | show |
Series | ocxl: Mmio invalidation support | expand |
Context | Check | Description |
---|---|---|
snowpatch_ozlabs/apply_patch | success | Successfully applied on branch powerpc/merge (7c94b5d4e9d328a69d43a11d7e3dfd7a6d762cb6) |
snowpatch_ozlabs/checkpatch | success | total: 0 errors, 0 warnings, 0 checks, 78 lines checked |
snowpatch_ozlabs/needsstable | success | Patch has no Fixes tags |
On 24/11/2020 10:58, Christophe Lombard wrote: > 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 <clombard@linux.vnet.ibm.com> > --- LGTM Acked-by: Frederic Barrat <fbarrat@linux.ibm.com> > drivers/misc/ocxl/context.c | 4 +++- > drivers/misc/ocxl/link.c | 4 +++- > drivers/misc/ocxl/ocxl_internal.h | 9 ++++++--- > drivers/scsi/cxlflash/ocxl_hw.c | 6 ++++-- > include/misc/ocxl.h | 2 +- > 5 files changed, 17 insertions(+), 8 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..77381dda2c45 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, u16 bdf, struct mm_struct *mm, > 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_be16(bdf); > 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..10125a22d5a5 100644 > --- a/drivers/misc/ocxl/ocxl_internal.h > +++ b/drivers/misc/ocxl/ocxl_internal.h > @@ -84,13 +84,16 @@ struct ocxl_context { > > struct ocxl_process_element { > __be64 config_state; > - __be32 reserved1[11]; > + __be32 pasid; > + __be16 bdf; > + __be16 reserved1; > + __be32 reserved2[9]; > __be32 lpid; > __be32 tid; > __be32 pid; > - __be32 reserved2[10]; > + __be32 reserved3[10]; > __be64 amr; > - __be32 reserved3[3]; > + __be32 reserved4[3]; > __be32 software_state; > }; > > 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..3ed736da02c8 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, u16 bdf, struct mm_struct *mm, > void (*xsl_err_cb)(void *data, u64 addr, u64 dsisr), > void *xsl_err_data); >
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..77381dda2c45 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, u16 bdf, struct mm_struct *mm, 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_be16(bdf); 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..10125a22d5a5 100644 --- a/drivers/misc/ocxl/ocxl_internal.h +++ b/drivers/misc/ocxl/ocxl_internal.h @@ -84,13 +84,16 @@ struct ocxl_context { struct ocxl_process_element { __be64 config_state; - __be32 reserved1[11]; + __be32 pasid; + __be16 bdf; + __be16 reserved1; + __be32 reserved2[9]; __be32 lpid; __be32 tid; __be32 pid; - __be32 reserved2[10]; + __be32 reserved3[10]; __be64 amr; - __be32 reserved3[3]; + __be32 reserved4[3]; __be32 software_state; }; 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..3ed736da02c8 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, u16 bdf, struct mm_struct *mm, void (*xsl_err_cb)(void *data, u64 addr, u64 dsisr), void *xsl_err_data);
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 <clombard@linux.vnet.ibm.com> --- drivers/misc/ocxl/context.c | 4 +++- drivers/misc/ocxl/link.c | 4 +++- drivers/misc/ocxl/ocxl_internal.h | 9 ++++++--- drivers/scsi/cxlflash/ocxl_hw.c | 6 ++++-- include/misc/ocxl.h | 2 +- 5 files changed, 17 insertions(+), 8 deletions(-)