[PATCH v8 08/15] coresight: cti: Enable CTI associated with devices.

Suzuki Kuruppassery Poulose suzuki.poulose at arm.com
Wed Jan 15 03:14:39 PST 2020


On 13/01/2020 21:31, Mike Leach wrote:
> The CoreSight subsystem enables a path of devices from source to sink.
> Any CTI devices associated with the path devices must be enabled at the
> same time.
> 
> This patch adds an associated coresight_device element to the main
> coresight device structure, and uses this to create associations between
> the CTI and other devices based on the device tree data. The associated
> device element is used to enable CTI in conjunction with the path elements.
> 
> CTI devices are reference counted so where a single CTI is associated with
> multiple elements on the path, it will be enabled on the first associated
> device enable, and disabled with the last associated device disable.
> 
> Signed-off-by: Mike Leach <mike.leach at linaro.org>
> Reviewed-by: Mathieu Poirier <mathieu.poirier at linaro.org>
> ---
>   drivers/hwtracing/coresight/coresight-cti.c   | 129 ++++++++++++++++++
>   drivers/hwtracing/coresight/coresight-cti.h   |   1 +
>   .../hwtracing/coresight/coresight-platform.c  |   1 +
>   drivers/hwtracing/coresight/coresight-priv.h  |  12 ++
>   drivers/hwtracing/coresight/coresight.c       |  71 +++++++++-
>   include/linux/coresight.h                     |   4 +
>   6 files changed, 213 insertions(+), 5 deletions(-)
> 
> diff --git a/drivers/hwtracing/coresight/coresight-cti.c b/drivers/hwtracing/coresight/coresight-cti.c
> index 77c2af247917..2be1b310e854 100644
> --- a/drivers/hwtracing/coresight/coresight-cti.c
> +++ b/drivers/hwtracing/coresight/coresight-cti.c
> @@ -4,6 +4,7 @@
>    * Author: Mike Leach <mike.leach at linaro.org>
>    */
>   
> +#include <linux/property.h>
>   #include "coresight-cti.h"
>   
>   /**
> @@ -440,6 +441,131 @@ int cti_channel_setop(struct device *dev, enum cti_chan_set_op op,
>   	return err;
>   }
>   
> +/*
> + * Look for a matching connection device name in the list of connections.
> + * If found then swap in the csdev name, set trig con association pointer
> + * and return found.
> + */
> +static bool
> +cti_match_fixup_csdev(struct cti_device *ctidev, const char *node_name,
> +		      struct coresight_device *csdev)
> +{
> +	struct cti_trig_con *trig_con;

super minor nit: Please use "struct cti_trig_con *tc;" consistent with
the naming everywhere else. Helps a lot in reading the code, especially
which has a lot of different structures.

> +	const char *csdev_name;
> +
> +	list_for_each_entry(trig_con, &ctidev->trig_cons, node) {
> +		if (trig_con->con_dev_name) {

This was allocated via devm_* and ...

> +			if (!strcmp(node_name, trig_con->con_dev_name)) {
> +				/* match: so swap in csdev name & dev */
> +				kfree(trig_con->con_dev_name);

... we free it here using kfree() without devm_ being aware. This could
cause double-free when the device is removed. This should either be
devm_kfree() or simply overwritten with the new string and leave
the device cleanup to free it.

> +				csdev_name = dev_name(&csdev->dev);
> +				trig_con->con_dev_name =
> +					kstrdup(csdev_name, GFP_KERNEL);

Please use devm_kstrdup() here on the CTI device to have a consistent
allocation.


> +				trig_con->con_dev = csdev;
> +				return true;
> +			}
> +		}
> +	}
> +	return false;
> +}
> 


> +/*
> + * Removing the associated devices is easier.
> + * A CTI will not have a value for csdev->ect_dev.
> + */
> +void cti_remove_assoc_from_csdev(struct coresight_device *csdev)
> +{
> +	struct cti_drvdata *ctidrv;
> +	struct cti_trig_con *tc;
> +	struct cti_device *ctidev;
> +
> +	mutex_lock(&ect_mutex);
> +	if (csdev->ect_dev) {
> +		ctidrv = csdev_to_cti_drvdata(csdev->ect_dev);
> +		ctidev = &ctidrv->ctidev;
> +		list_for_each_entry(tc, &ctidev->trig_cons, node) {
> +			if (tc->con_dev == csdev->ect_dev) {
> +				tc->con_dev = NULL;

Should we clear/free the name too ?

> +				break;
> +			}
> +		}
> +		csdev->ect_dev = NULL;
> +	}
> +	mutex_unlock(&ect_mutex);
> +}
> +EXPORT_SYMBOL_GPL(cti_remove_assoc_from_csdev);
> +

...

> diff --git a/drivers/hwtracing/coresight/coresight-cti.h b/drivers/hwtracing/coresight/coresight-cti.h
> index 469a06a1bb78..578d7e9ac67e 100644
> --- a/drivers/hwtracing/coresight/coresight-cti.h
> +++ b/drivers/hwtracing/coresight/coresight-cti.h
> @@ -216,6 +216,7 @@ int cti_channel_setop(struct device *dev, enum cti_chan_set_op op,
>   		      u32 channel_idx);
>   struct coresight_platform_data *
>   coresight_cti_get_platform_data(struct device *dev);
> +const char *cti_plat_get_node_name(struct fwnode_handle *fwnode);
>   
>   /* cti powered and enabled */
>   static inline bool cti_active(struct cti_config *cfg)
> diff --git a/drivers/hwtracing/coresight/coresight-platform.c b/drivers/hwtracing/coresight/coresight-platform.c
> index 43418a2126ff..421d4fc95f41 100644
> --- a/drivers/hwtracing/coresight/coresight-platform.c
> +++ b/drivers/hwtracing/coresight/coresight-platform.c
> @@ -313,6 +313,7 @@ static int of_get_coresight_platform_data(struct device *dev,
>   
>   	return 0;
>   }
> +

nit : spurious hunk ?

>   #else
>   static inline int
>   of_get_coresight_platform_data(struct device *dev,

Otherwise looks good to me

Suzuki



More information about the linux-arm-kernel mailing list