TPDM device need a node to reset the configurations and status of
it. This change provides a node to reset the configurations and
disable the TPDM if it has been enabled.
Signed-off-by: Tao Zhang <quic_taozha@quicinc.com>
---
drivers/hwtracing/coresight/coresight-tpdm.c | 32 ++++++++++++++++++++++++++++
1 file changed, 32 insertions(+)
diff --git a/drivers/hwtracing/coresight/coresight-tpdm.c b/drivers/hwtracing/coresight/coresight-tpdm.c
index 69ea453..74cc653 100644
--- a/drivers/hwtracing/coresight/coresight-tpdm.c
+++ b/drivers/hwtracing/coresight/coresight-tpdm.c
@@ -152,6 +152,37 @@ static void tpdm_init_default_data(struct tpdm_drvdata *drvdata)
}
}
+static ssize_t reset_store(struct device *dev,
+ struct device_attribute *attr,
+ const char *buf,
+ size_t size)
+{
+ int ret = 0;
+ unsigned long val;
+ struct tpdm_drvdata *drvdata = dev_get_drvdata(dev->parent);
+
+ ret = kstrtoul(buf, 10, &val);
+ if (ret)
+ return ret;
+
+ spin_lock(&drvdata->spinlock);
+ /* Reset all datasets to ZERO */
+ if (drvdata->dsb != NULL)
+ memset(drvdata->dsb, 0, sizeof(struct dsb_dataset));
+
+ /* Init the default data */
+ tpdm_init_default_data(drvdata);
+
+ spin_unlock(&drvdata->spinlock);
+
+ /* Disable tpdm if enabled */
+ if (drvdata->enable)
+ coresight_disable(drvdata->csdev);
+
+ return size;
+}
+static DEVICE_ATTR_WO(reset);
+
/*
* value 1: 64 bits test data
* value 2: 32 bits test data
@@ -192,6 +223,7 @@ static ssize_t integration_test_store(struct device *dev,
static DEVICE_ATTR_WO(integration_test);
static struct attribute *tpdm_attrs[] = {
+ &dev_attr_reset.attr,
&dev_attr_integration_test.attr,
NULL,
};
--
2.7.4
On 08/09/2022 09:45, Tao Zhang wrote:
> TPDM device need a node to reset the configurations and status of
> it. This change provides a node to reset the configurations and
> disable the TPDM if it has been enabled.
It is not clear to me *why* this is needed. Please could you
elaborate on the use case of this ? See my questions below.
>
> Signed-off-by: Tao Zhang <quic_taozha@quicinc.com>
> ---
> drivers/hwtracing/coresight/coresight-tpdm.c | 32 ++++++++++++++++++++++++++++
> 1 file changed, 32 insertions(+)
>
> diff --git a/drivers/hwtracing/coresight/coresight-tpdm.c b/drivers/hwtracing/coresight/coresight-tpdm.c
> index 69ea453..74cc653 100644
> --- a/drivers/hwtracing/coresight/coresight-tpdm.c
> +++ b/drivers/hwtracing/coresight/coresight-tpdm.c
> @@ -152,6 +152,37 @@ static void tpdm_init_default_data(struct tpdm_drvdata *drvdata)
> }
> }
>
> +static ssize_t reset_store(struct device *dev,
> + struct device_attribute *attr,
> + const char *buf,
> + size_t size)
minor nit: Alignment
> +{
> + int ret = 0;
> + unsigned long val;
> + struct tpdm_drvdata *drvdata = dev_get_drvdata(dev->parent);
> +
> + ret = kstrtoul(buf, 10, &val);
So, any integer value written to the sysfs knob triggers the rest ?
It may be better to restrict this to "1".
> + if (ret)
> + return ret;
> +
> + spin_lock(&drvdata->spinlock);
> + /* Reset all datasets to ZERO */
> + if (drvdata->dsb != NULL)
> + memset(drvdata->dsb, 0, sizeof(struct dsb_dataset));
> +
> + /* Init the default data */
> + tpdm_init_default_data(drvdata);
Why is this needed ? Does the DSB device configuration change
on the fly ?
> +
> + spin_unlock(&drvdata->spinlock);
> +
> + /* Disable tpdm if enabled */
> + if (drvdata->enable)
> + coresight_disable(drvdata->csdev);
Why is this needed ? Isn't this supposed to be triggered from the "path"
when the trace session is complete ?
Suzuki
> +
> + return size;
> +}
> +static DEVICE_ATTR_WO(reset);
> +
> /*
> * value 1: 64 bits test data
> * value 2: 32 bits test data
> @@ -192,6 +223,7 @@ static ssize_t integration_test_store(struct device *dev,
> static DEVICE_ATTR_WO(integration_test);
>
> static struct attribute *tpdm_attrs[] = {
> + &dev_attr_reset.attr,
> &dev_attr_integration_test.attr,
> NULL,
> };
Hi Suzuki,
在 10/24/2022 6:10 PM, Suzuki K Poulose 写道:
> On 08/09/2022 09:45, Tao Zhang wrote:
>> TPDM device need a node to reset the configurations and status of
>> it. This change provides a node to reset the configurations and
>> disable the TPDM if it has been enabled.
>
> It is not clear to me *why* this is needed. Please could you
> elaborate on the use case of this ? See my questions below.
For example, we usually reset the configuration through the "reset"
node before using a TPDM, so as to avoid the previous configuration
affecting the current use. And in some scenarios, it may be necessary
to reset the TPDM configuration to complete the verification of certain
function.
>>
>> Signed-off-by: Tao Zhang <quic_taozha@quicinc.com>
>> ---
>> drivers/hwtracing/coresight/coresight-tpdm.c | 32
>> ++++++++++++++++++++++++++++
>> 1 file changed, 32 insertions(+)
>>
>> diff --git a/drivers/hwtracing/coresight/coresight-tpdm.c
>> b/drivers/hwtracing/coresight/coresight-tpdm.c
>> index 69ea453..74cc653 100644
>> --- a/drivers/hwtracing/coresight/coresight-tpdm.c
>> +++ b/drivers/hwtracing/coresight/coresight-tpdm.c
>> @@ -152,6 +152,37 @@ static void tpdm_init_default_data(struct
>> tpdm_drvdata *drvdata)
>> }
>> }
>> +static ssize_t reset_store(struct device *dev,
>> + struct device_attribute *attr,
>> + const char *buf,
>> + size_t size)
>
> minor nit: Alignment
>
I will update this in the next patch series.
>> +{
>> + int ret = 0;
>> + unsigned long val;
>> + struct tpdm_drvdata *drvdata = dev_get_drvdata(dev->parent);
>> +
>> + ret = kstrtoul(buf, 10, &val);
>
> So, any integer value written to the sysfs knob triggers the rest ?
> It may be better to restrict this to "1".
>
Make sense, I will update this in the next patch series.
>
>> + if (ret)
>> + return ret;
>> +
>> + spin_lock(&drvdata->spinlock);
>> + /* Reset all datasets to ZERO */
>> + if (drvdata->dsb != NULL)
>> + memset(drvdata->dsb, 0, sizeof(struct dsb_dataset));
>> +
>> + /* Init the default data */
>> + tpdm_init_default_data(drvdata);
>
> Why is this needed ? Does the DSB device configuration change
> on the fly ?
>
We usually reset the configuration through the "reset" node at the
beginning of using a TPDM. DSB related elements need to be initialized
before configuring them.
The TPDM is usually to be used by the following sequence.
Reset(initialization) -> Configure -> Enable to use
>> +
>> + spin_unlock(&drvdata->spinlock);
>> +
>> + /* Disable tpdm if enabled */
>> + if (drvdata->enable)
>> + coresight_disable(drvdata->csdev);
>
> Why is this needed ? Isn't this supposed to be triggered from the "path"
> when the trace session is complete ?
>
In some scenarios, it may be necessary to reset the TPDM configuration
in the process of verification and re-configure the TPDM. If this is the
case, we need to disable the TPDM first, and re-configure before enabling
it again.
>
> Suzuki
>
>> +
>> + return size;
>> +}
>> +static DEVICE_ATTR_WO(reset);
>> +
>> /*
>> * value 1: 64 bits test data
>> * value 2: 32 bits test data
>> @@ -192,6 +223,7 @@ static ssize_t integration_test_store(struct
>> device *dev,
>> static DEVICE_ATTR_WO(integration_test);
>> static struct attribute *tpdm_attrs[] = {
>> + &dev_attr_reset.attr,
>> &dev_attr_integration_test.attr,
>> NULL,
>> };
>
Best Regards
Tao
© 2016 - 2026 Red Hat, Inc.