[PATCH] cxl: Rework the implementation of cxl_stop_trace_psl9()

Frederic Barrat fbarrat at linux.vnet.ibm.com
Thu Oct 19 21:07:35 AEDT 2017



Le 11/10/2017 à 14:30, Vaibhav Jain a écrit :
> Presently the PSL9 specific cxl_stop_trace_psl9() only stops the RX0
> traces on the CXL adapter when a PSL error irq is triggered. The patch
> updates the function to stop all the traces arrays and move them to
> the FIN state. The implementation issues the mmio to TRACECFG register
> to stop the trace array iff it already not in FIN state. This prevents
> the issue of trace data being reset in case of multiple stop mmio
> issued for a single trace array.
> 
> Also the patch does some refactoring of existing cxl_stop_trace_psl9()
> and cxl_stop_trace_psl8() functions by moving them to 'pci.c' from
> 'debugfs.c' file and marking them as static.
> 
> Signed-off-by: Vaibhav Jain <vaibhav at linux.vnet.ibm.com>
> ---

Looks ok to me.
Acked-by: Frederic Barrat <fbarrat at linux.vnet.ibm.com>


>   drivers/misc/cxl/cxl.h     | 14 ++++----------
>   drivers/misc/cxl/debugfs.c | 22 ----------------------
>   drivers/misc/cxl/pci.c     | 38 ++++++++++++++++++++++++++++++++++++++
>   3 files changed, 42 insertions(+), 32 deletions(-)
> 
> diff --git a/drivers/misc/cxl/cxl.h b/drivers/misc/cxl/cxl.h
> index 111c689b1771..d064ec24cdca 100644
> --- a/drivers/misc/cxl/cxl.h
> +++ b/drivers/misc/cxl/cxl.h
> @@ -114,6 +114,7 @@ static const cxl_p1_reg_t CXL_PSL9_TRACECFG = {0x0368};
>   static const cxl_p1_reg_t CXL_PSL9_APCDEDALLOC = {0x0378};
>   static const cxl_p1_reg_t CXL_PSL9_APCDEDTYPE = {0x0380};
>   static const cxl_p1_reg_t CXL_PSL9_TNR_ADDR = {0x0388};
> +static const cxl_p1_reg_t CXL_PSL9_CTCCFG = {0x0390};
>   static const cxl_p1_reg_t CXL_PSL9_GP_CT = {0x0398};
>   static const cxl_p1_reg_t CXL_XSL9_IERAT = {0x0588};
>   static const cxl_p1_reg_t CXL_XSL9_ILPP  = {0x0590};
> @@ -416,6 +417,9 @@ static const cxl_p2n_reg_t CXL_PSL_WED_An     = {0x0A0};
>   #define CXL_CARD_MINOR(adapter) (adapter->adapter_num * CXL_DEV_MINORS)
>   #define CXL_DEVT_ADAPTER(dev) (MINOR(dev) / CXL_DEV_MINORS)
> 
> +#define CXL_PSL9_TRACEID_MAX 0xAU
> +#define CXL_PSL9_TRACESTATE_FIN 0x3U
> +
>   enum cxl_context_status {
>   	CLOSED,
>   	OPENED,
> @@ -940,8 +944,6 @@ int cxl_debugfs_adapter_add(struct cxl *adapter);
>   void cxl_debugfs_adapter_remove(struct cxl *adapter);
>   int cxl_debugfs_afu_add(struct cxl_afu *afu);
>   void cxl_debugfs_afu_remove(struct cxl_afu *afu);
> -void cxl_stop_trace_psl9(struct cxl *cxl);
> -void cxl_stop_trace_psl8(struct cxl *cxl);
>   void cxl_debugfs_add_adapter_regs_psl9(struct cxl *adapter, struct dentry *dir);
>   void cxl_debugfs_add_adapter_regs_psl8(struct cxl *adapter, struct dentry *dir);
>   void cxl_debugfs_add_adapter_regs_xsl(struct cxl *adapter, struct dentry *dir);
> @@ -977,14 +979,6 @@ static inline void cxl_debugfs_afu_remove(struct cxl_afu *afu)
>   {
>   }
> 
> -static inline void cxl_stop_trace_psl9(struct cxl *cxl)
> -{
> -}
> -
> -static inline void cxl_stop_trace_psl8(struct cxl *cxl)
> -{
> -}
> -
>   static inline void cxl_debugfs_add_adapter_regs_psl9(struct cxl *adapter,
>   						    struct dentry *dir)
>   {
> diff --git a/drivers/misc/cxl/debugfs.c b/drivers/misc/cxl/debugfs.c
> index 52e3d97db114..cf4ee3114ab1 100644
> --- a/drivers/misc/cxl/debugfs.c
> +++ b/drivers/misc/cxl/debugfs.c
> @@ -15,28 +15,6 @@
> 
>   static struct dentry *cxl_debugfs;
> 
> -void cxl_stop_trace_psl9(struct cxl *adapter)
> -{
> -	/* Stop the trace */
> -	cxl_p1_write(adapter, CXL_PSL9_TRACECFG, 0x4480000000000000ULL);
> -}
> -
> -void cxl_stop_trace_psl8(struct cxl *adapter)
> -{
> -	int slice;
> -
> -	/* Stop the trace */
> -	cxl_p1_write(adapter, CXL_PSL_TRACE, 0x8000000000000017LL);
> -
> -	/* Stop the slice traces */
> -	spin_lock(&adapter->afu_list_lock);
> -	for (slice = 0; slice < adapter->slices; slice++) {
> -		if (adapter->afu[slice])
> -			cxl_p1n_write(adapter->afu[slice], CXL_PSL_SLICE_TRACE, 0x8000000000000000LL);
> -	}
> -	spin_unlock(&adapter->afu_list_lock);
> -}
> -
>   /* Helpers to export CXL mmaped IO registers via debugfs */
>   static int debugfs_io_u64_get(void *data, u64 *val)
>   {
> diff --git a/drivers/misc/cxl/pci.c b/drivers/misc/cxl/pci.c
> index d185b47eb536..bb7fd3f4edab 100644
> --- a/drivers/misc/cxl/pci.c
> +++ b/drivers/misc/cxl/pci.c
> @@ -1747,6 +1747,44 @@ static void cxl_deconfigure_adapter(struct cxl *adapter)
>   	pci_disable_device(pdev);
>   }
> 
> +static void cxl_stop_trace_psl9(struct cxl *adapter)
> +{
> +	int traceid;
> +	u64 trace_state, trace_mask;
> +	struct pci_dev *dev = to_pci_dev(adapter->dev.parent);
> +
> +	/* read each tracearray state and issue mmio to stop them is needed */
> +	for (traceid = 0; traceid <= CXL_PSL9_TRACEID_MAX; ++traceid) {
> +		trace_state = cxl_p1_read(adapter, CXL_PSL9_CTCCFG);
> +		trace_mask = (0x3ULL << (62 - traceid * 2));
> +		trace_state = (trace_state & trace_mask) >> (62 - traceid * 2);
> +		dev_dbg(&dev->dev, "cxl: Traceid-%d trace_state=0x%0llX\n",
> +			traceid, trace_state);
> +
> +		/* issue mmio if the trace array isn't in FIN state */
> +		if (trace_state != CXL_PSL9_TRACESTATE_FIN)
> +			cxl_p1_write(adapter, CXL_PSL9_TRACECFG,
> +				     0x8400000000000000ULL | traceid);
> +	}
> +}
> +
> +static void cxl_stop_trace_psl8(struct cxl *adapter)
> +{
> +	int slice;
> +
> +	/* Stop the trace */
> +	cxl_p1_write(adapter, CXL_PSL_TRACE, 0x8000000000000017LL);
> +
> +	/* Stop the slice traces */
> +	spin_lock(&adapter->afu_list_lock);
> +	for (slice = 0; slice < adapter->slices; slice++) {
> +		if (adapter->afu[slice])
> +			cxl_p1n_write(adapter->afu[slice], CXL_PSL_SLICE_TRACE,
> +				      0x8000000000000000LL);
> +	}
> +	spin_unlock(&adapter->afu_list_lock);
> +}
> +
>   static const struct cxl_service_layer_ops psl9_ops = {
>   	.adapter_regs_init = init_implementation_adapter_regs_psl9,
>   	.invalidate_all = cxl_invalidate_all_psl9,
> 



More information about the Linuxppc-dev mailing list