diff mbox series

[v4,05/10] coresight-tpdm: Add integration test support

Message ID 20220324121734.21531-6-quic_jinlmao@quicinc.com (mailing list archive)
State Superseded
Headers show
Series Coresight: Add support for TPDM and TPDA | expand

Commit Message

Mao Jinlong March 24, 2022, 12:17 p.m. UTC
Integration test for tpdm can help to generate the data for
verification of the topology during TPDM software bring up.

Sample:
echo 1 > /sys/bus/coresight/devices/tmc_etf0/enable_sink
echo 1 > /sys/bus/coresight/devices/tpdm1/enable_source
echo 1 > /sys/bus/coresight/devices/tpdm1/integration_test
echo 2 > /sys/bus/coresight/devices/tpdm1/integration_test
cat /dev/tmc_etf0 > /data/etf-tpdm1.bin

Signed-off-by: Tao Zhang <quic_taozha@quicinc.com>
Signed-off-by: Mao Jinlong <quic_jinlmao@quicinc.com>
---
 drivers/hwtracing/coresight/Kconfig          |  9 ++++
 drivers/hwtracing/coresight/coresight-tpdm.c | 56 +++++++++++++++++++-
 drivers/hwtracing/coresight/coresight-tpdm.h |  8 +++
 3 files changed, 72 insertions(+), 1 deletion(-)

Comments

Greg Kroah-Hartman March 24, 2022, 12:28 p.m. UTC | #1
On Thu, Mar 24, 2022 at 08:17:29PM +0800, Mao Jinlong wrote:
> Integration test for tpdm can help to generate the data for
> verification of the topology during TPDM software bring up.
> 
> Sample:
> echo 1 > /sys/bus/coresight/devices/tmc_etf0/enable_sink
> echo 1 > /sys/bus/coresight/devices/tpdm1/enable_source
> echo 1 > /sys/bus/coresight/devices/tpdm1/integration_test
> echo 2 > /sys/bus/coresight/devices/tpdm1/integration_test
> cat /dev/tmc_etf0 > /data/etf-tpdm1.bin
> 
> Signed-off-by: Tao Zhang <quic_taozha@quicinc.com>
> Signed-off-by: Mao Jinlong <quic_jinlmao@quicinc.com>
> ---
>  drivers/hwtracing/coresight/Kconfig          |  9 ++++
>  drivers/hwtracing/coresight/coresight-tpdm.c | 56 +++++++++++++++++++-
>  drivers/hwtracing/coresight/coresight-tpdm.h |  8 +++
>  3 files changed, 72 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/hwtracing/coresight/Kconfig b/drivers/hwtracing/coresight/Kconfig
> index 5c506a1cd08f..60248fef4089 100644
> --- a/drivers/hwtracing/coresight/Kconfig
> +++ b/drivers/hwtracing/coresight/Kconfig
> @@ -214,4 +214,13 @@ config CORESIGHT_TPDM
>  	  To compile this driver as a module, choose M here: the module will be
>  	  called coresight-tpdm.
>  
> +config CORESIGHT_TPDM_INTEGRATION_TEST
> +	bool "Enable CoreSight Integration Test For TPDM"
> +	depends on CORESIGHT_TPDM
> +	help
> +	  This option adds support for the CoreSight integration test on this
> +	  devie. Coresight architecture provides integration control modes of
> +	  operation to facilitate integration testing and software bringup
> +	  and/or to instrument topology discovery. The TPDM utilizes integration
> +	  mode to accomplish integration testing and software bringup.

Why is this a Kconfig option?  Why would you never not want this?

>  endif
> diff --git a/drivers/hwtracing/coresight/coresight-tpdm.c b/drivers/hwtracing/coresight/coresight-tpdm.c
> index a8d257a591f3..cddd398be0cd 100644
> --- a/drivers/hwtracing/coresight/coresight-tpdm.c
> +++ b/drivers/hwtracing/coresight/coresight-tpdm.c
> @@ -124,7 +124,60 @@ static void tpdm_init_default_data(struct tpdm_drvdata *drvdata)
>  			__set_bit(i, drvdata->datasets);
>  	}
>  	CS_LOCK(drvdata->base);
> - }
> +}
> +
> +#ifdef CONFIG_CORESIGHT_TPDM_INTEGRATION_TEST

Try to keep #ifdefs out of .c files please.

> +static ssize_t integration_test_store(struct device *dev,
> +					  struct device_attribute *attr,
> +					  const char *buf,
> +					  size_t size)
> +{
> +	int i, ret = 0;
> +	unsigned long val;
> +	struct tpdm_drvdata *drvdata = dev_get_drvdata(dev->parent);
> +
> +	ret = kstrtoul(buf, 10, &val);
> +	if (ret)
> +		return ret;
> +
> +	if (val != 1 && val != 2)
> +		return -EINVAL;
> +
> +	if (!drvdata->enable)
> +		return -EINVAL;
> +
> +	if (val == 1)
> +		val = ATBCNTRL_VAL_64;
> +	else
> +		val = ATBCNTRL_VAL_32;
> +	CS_UNLOCK(drvdata->base);
> +	writel_relaxed(0x1, drvdata->base + TPDM_ITCNTRL);
> +
> +	for (i = 1; i < 5; i++)
> +		writel_relaxed(val, drvdata->base + TPDM_ITATBCNTRL);
> +
> +	writel_relaxed(0, drvdata->base + TPDM_ITCNTRL);
> +	CS_LOCK(drvdata->base);
> +	return size;
> +}
> +static DEVICE_ATTR_WO(integration_test);
> +#endif /* CORESIGHT_TPDM_INTEGRATION_TEST */
> +
> +static struct attribute *tpdm_attrs[] = {
> +#ifdef CONFIG_CORESIGHT_TPDM_INTEGRATION_TEST
> +	&dev_attr_integration_test.attr,
> +#endif /* CORESIGHT_TPDM_INTEGRATION_TEST */
> +	NULL,
> +};
> +
> +static struct attribute_group tpdm_attr_grp = {
> +	.attrs = tpdm_attrs,
> +};
> +
> +static const struct attribute_group *tpdm_attr_grps[] = {
> +	&tpdm_attr_grp,
> +	NULL,
> +};

ATTRIBUTE_GROUPS()?

thanks,

greg k-h
Mao Jinlong March 24, 2022, 2:30 p.m. UTC | #2
Hi Greg,

On 3/24/2022 8:28 PM, Greg Kroah-Hartman wrote:
> On Thu, Mar 24, 2022 at 08:17:29PM +0800, Mao Jinlong wrote:
>> Integration test for tpdm can help to generate the data for
>> verification of the topology during TPDM software bring up.
>>
>> Sample:
>> echo 1 > /sys/bus/coresight/devices/tmc_etf0/enable_sink
>> echo 1 > /sys/bus/coresight/devices/tpdm1/enable_source
>> echo 1 > /sys/bus/coresight/devices/tpdm1/integration_test
>> echo 2 > /sys/bus/coresight/devices/tpdm1/integration_test
>> cat /dev/tmc_etf0 > /data/etf-tpdm1.bin
>>
>> Signed-off-by: Tao Zhang <quic_taozha@quicinc.com>
>> Signed-off-by: Mao Jinlong <quic_jinlmao@quicinc.com>
>> ---
>>   drivers/hwtracing/coresight/Kconfig          |  9 ++++
>>   drivers/hwtracing/coresight/coresight-tpdm.c | 56 +++++++++++++++++++-
>>   drivers/hwtracing/coresight/coresight-tpdm.h |  8 +++
>>   3 files changed, 72 insertions(+), 1 deletion(-)
>>
>> diff --git a/drivers/hwtracing/coresight/Kconfig b/drivers/hwtracing/coresight/Kconfig
>> index 5c506a1cd08f..60248fef4089 100644
>> --- a/drivers/hwtracing/coresight/Kconfig
>> +++ b/drivers/hwtracing/coresight/Kconfig
>> @@ -214,4 +214,13 @@ config CORESIGHT_TPDM
>>   	  To compile this driver as a module, choose M here: the module will be
>>   	  called coresight-tpdm.
>>   
>> +config CORESIGHT_TPDM_INTEGRATION_TEST
>> +	bool "Enable CoreSight Integration Test For TPDM"
>> +	depends on CORESIGHT_TPDM
>> +	help
>> +	  This option adds support for the CoreSight integration test on this
>> +	  devie. Coresight architecture provides integration control modes of
>> +	  operation to facilitate integration testing and software bringup
>> +	  and/or to instrument topology discovery. The TPDM utilizes integration
>> +	  mode to accomplish integration testing and software bringup.
> Why is this a Kconfig option?  Why would you never not want this?
I refer to "CONFIG_CORESIGHT_CTI_INTEGRATION_REGS" for integration mode.
>
>>   endif
>> diff --git a/drivers/hwtracing/coresight/coresight-tpdm.c b/drivers/hwtracing/coresight/coresight-tpdm.c
>> index a8d257a591f3..cddd398be0cd 100644
>> --- a/drivers/hwtracing/coresight/coresight-tpdm.c
>> +++ b/drivers/hwtracing/coresight/coresight-tpdm.c
>> @@ -124,7 +124,60 @@ static void tpdm_init_default_data(struct tpdm_drvdata *drvdata)
>>   			__set_bit(i, drvdata->datasets);
>>   	}
>>   	CS_LOCK(drvdata->base);
>> - }
>> +}
>> +
>> +#ifdef CONFIG_CORESIGHT_TPDM_INTEGRATION_TEST
> Try to keep #ifdefs out of .c files please.
I will check to see if it is possible for the integration test function.
>> +static ssize_t integration_test_store(struct device *dev,
>> +					  struct device_attribute *attr,
>> +					  const char *buf,
>> +					  size_t size)
>> +{
>> +	int i, ret = 0;
>> +	unsigned long val;
>> +	struct tpdm_drvdata *drvdata = dev_get_drvdata(dev->parent);
>> +
>> +	ret = kstrtoul(buf, 10, &val);
>> +	if (ret)
>> +		return ret;
>> +
>> +	if (val != 1 && val != 2)
>> +		return -EINVAL;
>> +
>> +	if (!drvdata->enable)
>> +		return -EINVAL;
>> +
>> +	if (val == 1)
>> +		val = ATBCNTRL_VAL_64;
>> +	else
>> +		val = ATBCNTRL_VAL_32;
>> +	CS_UNLOCK(drvdata->base);
>> +	writel_relaxed(0x1, drvdata->base + TPDM_ITCNTRL);
>> +
>> +	for (i = 1; i < 5; i++)
>> +		writel_relaxed(val, drvdata->base + TPDM_ITATBCNTRL);
>> +
>> +	writel_relaxed(0, drvdata->base + TPDM_ITCNTRL);
>> +	CS_LOCK(drvdata->base);
>> +	return size;
>> +}
>> +static DEVICE_ATTR_WO(integration_test);
>> +#endif /* CORESIGHT_TPDM_INTEGRATION_TEST */
>> +
>> +static struct attribute *tpdm_attrs[] = {
>> +#ifdef CONFIG_CORESIGHT_TPDM_INTEGRATION_TEST
>> +	&dev_attr_integration_test.attr,
>> +#endif /* CORESIGHT_TPDM_INTEGRATION_TEST */
>> +	NULL,
>> +};
>> +
>> +static struct attribute_group tpdm_attr_grp = {
>> +	.attrs = tpdm_attrs,
>> +};
>> +
>> +static const struct attribute_group *tpdm_attr_grps[] = {
>> +	&tpdm_attr_grp,
>> +	NULL,
>> +};
> ATTRIBUTE_GROUPS()?
>
> thanks,
>
> greg k-h

Thanks

Jinlong Mao
diff mbox series

Patch

diff --git a/drivers/hwtracing/coresight/Kconfig b/drivers/hwtracing/coresight/Kconfig
index 5c506a1cd08f..60248fef4089 100644
--- a/drivers/hwtracing/coresight/Kconfig
+++ b/drivers/hwtracing/coresight/Kconfig
@@ -214,4 +214,13 @@  config CORESIGHT_TPDM
 	  To compile this driver as a module, choose M here: the module will be
 	  called coresight-tpdm.
 
+config CORESIGHT_TPDM_INTEGRATION_TEST
+	bool "Enable CoreSight Integration Test For TPDM"
+	depends on CORESIGHT_TPDM
+	help
+	  This option adds support for the CoreSight integration test on this
+	  devie. Coresight architecture provides integration control modes of
+	  operation to facilitate integration testing and software bringup
+	  and/or to instrument topology discovery. The TPDM utilizes integration
+	  mode to accomplish integration testing and software bringup.
 endif
diff --git a/drivers/hwtracing/coresight/coresight-tpdm.c b/drivers/hwtracing/coresight/coresight-tpdm.c
index a8d257a591f3..cddd398be0cd 100644
--- a/drivers/hwtracing/coresight/coresight-tpdm.c
+++ b/drivers/hwtracing/coresight/coresight-tpdm.c
@@ -124,7 +124,60 @@  static void tpdm_init_default_data(struct tpdm_drvdata *drvdata)
 			__set_bit(i, drvdata->datasets);
 	}
 	CS_LOCK(drvdata->base);
- }
+}
+
+#ifdef CONFIG_CORESIGHT_TPDM_INTEGRATION_TEST
+static ssize_t integration_test_store(struct device *dev,
+					  struct device_attribute *attr,
+					  const char *buf,
+					  size_t size)
+{
+	int i, ret = 0;
+	unsigned long val;
+	struct tpdm_drvdata *drvdata = dev_get_drvdata(dev->parent);
+
+	ret = kstrtoul(buf, 10, &val);
+	if (ret)
+		return ret;
+
+	if (val != 1 && val != 2)
+		return -EINVAL;
+
+	if (!drvdata->enable)
+		return -EINVAL;
+
+	if (val == 1)
+		val = ATBCNTRL_VAL_64;
+	else
+		val = ATBCNTRL_VAL_32;
+	CS_UNLOCK(drvdata->base);
+	writel_relaxed(0x1, drvdata->base + TPDM_ITCNTRL);
+
+	for (i = 1; i < 5; i++)
+		writel_relaxed(val, drvdata->base + TPDM_ITATBCNTRL);
+
+	writel_relaxed(0, drvdata->base + TPDM_ITCNTRL);
+	CS_LOCK(drvdata->base);
+	return size;
+}
+static DEVICE_ATTR_WO(integration_test);
+#endif /* CORESIGHT_TPDM_INTEGRATION_TEST */
+
+static struct attribute *tpdm_attrs[] = {
+#ifdef CONFIG_CORESIGHT_TPDM_INTEGRATION_TEST
+	&dev_attr_integration_test.attr,
+#endif /* CORESIGHT_TPDM_INTEGRATION_TEST */
+	NULL,
+};
+
+static struct attribute_group tpdm_attr_grp = {
+	.attrs = tpdm_attrs,
+};
+
+static const struct attribute_group *tpdm_attr_grps[] = {
+	&tpdm_attr_grp,
+	NULL,
+};
 
 static int tpdm_probe(struct amba_device *adev, const struct amba_id *id)
 {
@@ -160,6 +213,7 @@  static int tpdm_probe(struct amba_device *adev, const struct amba_id *id)
 	desc.ops = &tpdm_cs_ops;
 	desc.pdata = adev->dev.platform_data;
 	desc.dev = &adev->dev;
+	desc.groups = tpdm_attr_grps;
 	drvdata->csdev = coresight_register(&desc);
 	if (IS_ERR(drvdata->csdev))
 		return PTR_ERR(drvdata->csdev);
diff --git a/drivers/hwtracing/coresight/coresight-tpdm.h b/drivers/hwtracing/coresight/coresight-tpdm.h
index 0a410795dce9..e4adcbbb10b5 100644
--- a/drivers/hwtracing/coresight/coresight-tpdm.h
+++ b/drivers/hwtracing/coresight/coresight-tpdm.h
@@ -12,6 +12,14 @@ 
 /* DSB Subunit Registers */
 #define TPDM_DSB_CR		(0x780)
 
+/* TPDM integration test registers */
+#define TPDM_ITATBCNTRL		(0xEF0)
+#define TPDM_ITCNTRL		(0xF00)
+
+/* Register value for integration test */
+#define ATBCNTRL_VAL_32		0xC00F1409
+#define ATBCNTRL_VAL_64		0xC01F1409
+
 /**
  * This enum is for PERIPHIDR0 register of TPDM.
  * The fields [6:0] of PERIPHIDR0 are used to determine what