[PATCH v2 21/38] cxlflash: Setup function OCXL link

Frederic Barrat fbarrat at linux.vnet.ibm.com
Fri Mar 23 04:31:40 AEDT 2018



Le 26/02/2018 à 23:22, Uma Krishnan a écrit :
> After reading and modifying the function configuration, setup the OCXL
> link using the OCXL provider services. The link is released when the
> adapter is unconfigured.
> 
> Signed-off-by: Uma Krishnan <ukrishn at linux.vnet.ibm.com>
> Acked-by: Matthew R. Ochs <mrochs at linux.vnet.ibm.com>
> ---


Reviewed-by: Frederic Barrat <fbarrat at linux.vnet.ibm.com>


>   drivers/scsi/cxlflash/ocxl_hw.c | 25 ++++++++++++++++++++++---
>   drivers/scsi/cxlflash/ocxl_hw.h |  1 +
>   2 files changed, 23 insertions(+), 3 deletions(-)
> 
> diff --git a/drivers/scsi/cxlflash/ocxl_hw.c b/drivers/scsi/cxlflash/ocxl_hw.c
> index a1d58fc..ea2906d 100644
> --- a/drivers/scsi/cxlflash/ocxl_hw.c
> +++ b/drivers/scsi/cxlflash/ocxl_hw.c
> @@ -412,11 +412,28 @@ static int ocxlflash_config_fn(struct pci_dev *pdev, struct ocxl_hw_afu *afu)
>   	ocxl_config_set_actag(pdev, fcfg->dvsec_function_pos, base, enabled);
>   	dev_dbg(dev, "%s: Function acTag range base=%u enabled=%u\n",
>   		__func__, base, enabled);
> +
> +	rc = ocxl_link_setup(pdev, 0, &afu->link_token);
> +	if (unlikely(rc)) {
> +		dev_err(dev, "%s: ocxl_link_setup failed rc=%d\n",
> +			__func__, rc);
> +		goto out;
> +	}
>   out:
>   	return rc;
>   }
> 
>   /**
> + * ocxlflash_unconfig_fn() - unconfigure the host function
> + * @pdev:	PCI device associated with the host.
> + * @afu:	AFU associated with the host.
> + */
> +static void ocxlflash_unconfig_fn(struct pci_dev *pdev, struct ocxl_hw_afu *afu)
> +{
> +	ocxl_link_release(pdev, afu->link_token);
> +}
> +
> +/**
>    * ocxlflash_map_mmio() - map the AFU MMIO space
>    * @afu: AFU associated with the host.
>    *
> @@ -552,7 +569,7 @@ static void *ocxlflash_create_afu(struct pci_dev *pdev)
>   	if (unlikely(rc)) {
>   		dev_err(dev, "%s: AFU configuration failed rc=%d\n",
>   			__func__, rc);
> -		goto err1;
> +		goto err2;
>   	}
> 
>   	ctx = ocxlflash_dev_context_init(pdev, afu);
> @@ -560,15 +577,17 @@ static void *ocxlflash_create_afu(struct pci_dev *pdev)
>   		rc = PTR_ERR(ctx);
>   		dev_err(dev, "%s: ocxlflash_dev_context_init failed rc=%d\n",
>   			__func__, rc);
> -		goto err2;
> +		goto err3;
>   	}
> 
>   	idr_init(&afu->idr);
>   	afu->ocxl_ctx = ctx;
>   out:
>   	return afu;
> -err2:
> +err3:
>   	ocxlflash_unconfig_afu(afu);
> +err2:
> +	ocxlflash_unconfig_fn(pdev, afu);
>   err1:
>   	kfree(afu);
>   	afu = NULL;
> diff --git a/drivers/scsi/cxlflash/ocxl_hw.h b/drivers/scsi/cxlflash/ocxl_hw.h
> index 18f402a..4d43650 100644
> --- a/drivers/scsi/cxlflash/ocxl_hw.h
> +++ b/drivers/scsi/cxlflash/ocxl_hw.h
> @@ -31,6 +31,7 @@ struct ocxl_hw_afu {
>   	phys_addr_t gmmio_phys;		/* Global AFU MMIO space */
>   	void __iomem *gmmio_virt;	/* Global MMIO map */
> 
> +	void *link_token;		/* Link token for the SPA */
>   	struct idr idr;			/* IDR to manage contexts */
>   	int max_pasid;			/* Maximum number of contexts */
>   };
> 



More information about the Linuxppc-dev mailing list