From: Suzuki K Poulose <suzuki.poulose@arm.com>
To: Tao Zhang <quic_taozha@quicinc.com>,
Mathieu Poirier <mathieu.poirier@linaro.org>,
Alexander Shishkin <alexander.shishkin@linux.intel.com>,
Konrad Dybcio <konradybcio@gmail.com>,
Mike Leach <mike.leach@linaro.org>,
Rob Herring <robh+dt@kernel.org>,
Krzysztof Kozlowski <krzysztof.kozlowski+dt@linaro.org>
Cc: Jinlong Mao <quic_jinlmao@quicinc.com>,
Leo Yan <leo.yan@linaro.org>,
Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
coresight@lists.linaro.org, linux-arm-kernel@lists.infradead.org,
linux-kernel@vger.kernel.org, devicetree@vger.kernel.org,
Tingwei Zhang <quic_tingweiz@quicinc.com>,
Yuanfang Zhang <quic_yuanfang@quicinc.com>,
Trilok Soni <quic_tsoni@quicinc.com>,
Hao Zhang <quic_hazha@quicinc.com>,
linux-arm-msm@vger.kernel.org, andersson@kernel.org
Subject: Re: [PATCH v7 13/13] coresight-tpdm: Add nodes for dsb msr support
Date: Fri, 18 Aug 2023 17:25:48 +0100 [thread overview]
Message-ID: <33939efa-c84f-e50d-3fe8-ae5b015ecc14@arm.com> (raw)
In-Reply-To: <29a2cbfa-200d-3092-e827-b590a1ca1a30@quicinc.com>
On 18/08/2023 16:44, Tao Zhang wrote:
>
> On 8/7/2023 7:35 PM, Suzuki K Poulose wrote:
>> On 25/07/2023 08:15, Tao Zhang wrote:
>>> Add the nodes for DSB subunit MSR(mux select register) support.
>>> The TPDM MSR (mux select register) interface is an optional
>>> interface and associated bank of registers per TPDM subunit.
>>> The intent of mux select registers is to control muxing structures
>>> driving the TPDM’s’ various subunit interfaces.
>>>
>>> Signed-off-by: Tao Zhang <quic_taozha@quicinc.com>
>>> ---
>>> .../ABI/testing/sysfs-bus-coresight-devices-tpdm | 19 ++++-
>>> drivers/hwtracing/coresight/coresight-tpdm.c | 98
>>> ++++++++++++++++++++++
>>> drivers/hwtracing/coresight/coresight-tpdm.h | 7 ++
>>> 3 files changed, 123 insertions(+), 1 deletion(-)
>>>
>>> diff --git
>>> a/Documentation/ABI/testing/sysfs-bus-coresight-devices-tpdm
>>> b/Documentation/ABI/testing/sysfs-bus-coresight-devices-tpdm
>>> index 74a0126..ee41a14 100644
>>> --- a/Documentation/ABI/testing/sysfs-bus-coresight-devices-tpdm
>>> +++ b/Documentation/ABI/testing/sysfs-bus-coresight-devices-tpdm
>>> @@ -185,4 +185,21 @@ Description:
>>> Accepts only one of the 2 values - 0 or 1.
>>> 0 : Set the DSB pattern type to value.
>>> - 1 : Set the DSB pattern type to toggle.
>>> \ No newline at end of file
>>> + 1 : Set the DSB pattern type to toggle.
>>> +
>>> +What: /sys/bus/coresight/devices/<tpdm-name>/dsb_msr_idx
>>> +Date: March 2023
>>> +KernelVersion 6.5
>>> +Contact: Jinlong Mao (QUIC) <quic_jinlmao@quicinc.com>, Tao Zhang
>>> (QUIC) <quic_taozha@quicinc.com>
>>> +Description:
>>> + Read/Write the index number of MSR(mux select register) on DSB
>>> + TPDM. This index number should not be greater than the number
>>> + of MSR supported by this DSB TPDM.
>>
>> How does a user find it ? Why don't we expose it ? Scratch all of
>> that, you could create a register file per exising msr.
>>
>> dsb_msrs/msr0 ... msrN
>>
>> You may :
>>
>> 1. either dynamically add files as you find the number
>>
>> OR
>>
>> 2. If there is a hard limit, create that many files and control
>> visibility based on the dynamic number.
>>
> Hi Suzuki,
>
>
> With regards to your suggestions, would you mind if you provide some
> sample code for my reference?
>
> 1. How to dynamically add files to the sysfs as I find the number?
>
> 2. The hard limit of MSR should be 32. How can I control visibility
> based on the dynamic number?
You could add attributes via dev_ext_attribute, storing the "idx" as
the data field for 0-31. And use the is_visible() hook for the
attribute_group, just like you do for DSB related checks.
Some skeleton code, untested :
static ssize_t dsb_msr_read(struct device *dev,
struct device_attribute *attr, char *buf)
{
struct dev_ext_attribute *eattr = container_of(attr,
struct dev_ext_attribute, attr);
int idx = (int)(unsigned long)eattr->var;
/* Read the MSR at IDX */
}
/* Similarly for dsb_msr_write() */
#define DSB_MSR_ATTR(idx) \
&((struct dev_ext_attribute[]) { \
{ \
__ATTR("msr"#idx, <RW>, dsb_msr_read, dsb_msr_write), \
(void *)idx } \
})[0].attr.attr
#define DSB_MSR_ATTRS \
DSB_MSR_ATTR(0), \
DSB_MSR_ATTR(1), \
...
DSB_MSR_ATTR(31)
static struct attribute * dsb_msr_attrs[] = {
DSB_MSR_ATTRS,
NULL,
};
static umode_t
dsb_msr_is_visible(struct kobject *kobj,
struct attribute *attr, int unuse)
{
struct device *dev = kobject_to_dev(kobj);
/* From dev, get drvdata */
/* Then decide if it should be made visible, if yes R/W permissions */
}
static const struct attribute_group dsb_msr_group = {
.is_visible = dsb_msr_is_visible,
.attrs = dsb_msr_attrs,
.name = "dsb_msr",
};
See : drivers/.../coresight-etm4x-sysfs.c:
coresight_etmv4_mgmt_attrs & coresight_etmv4_mgmt_group
for an example.
Suzuki
>
>>
>>
>>> +
>>> +What: /sys/bus/coresight/devices/<tpdm-name>/dsb_msr
>>> +Date: March 2023
>>> +KernelVersion 6.5
>>> +Contact: Jinlong Mao (QUIC) <quic_jinlmao@quicinc.com>, Tao Zhang
>>> (QUIC) <quic_taozha@quicinc.com>
>>> +Description:
>>> + (Write) Set the MSR(mux select register) of DSB tpdm. Read
>>> + the MSR(mux select register) of DSB tpdm.
>>
>> (RW)
> Sure, I will update this in the next patch series.
>>
>>> \ No newline at end of file
>>> diff --git a/drivers/hwtracing/coresight/coresight-tpdm.c
>>> b/drivers/hwtracing/coresight/coresight-tpdm.c
>>> index f9e5a1d..be7776b 100644
>>> --- a/drivers/hwtracing/coresight/coresight-tpdm.c
>>> +++ b/drivers/hwtracing/coresight/coresight-tpdm.c
>>> @@ -90,6 +90,18 @@ static void set_dsb_tier(struct tpdm_drvdata
>>> *drvdata, u32 *val)
>>> }
>>> +static void set_dsb_msr(struct tpdm_drvdata *drvdata)
>>> +{
>>> + int i;
>>> +
>>
>>
>>> + if (drvdata->dsb->msr_num == 0)
>>> + return;
>>> +
>>> + for (i = 0; i < drvdata->dsb->msr_num; i++)
>>> + writel_relaxed(drvdata->dsb->msr[i],
>>> + drvdata->base + TPDM_DSB_MSR(i));
>>> +}
>>> +
>>> static void tpdm_enable_dsb(struct tpdm_drvdata *drvdata)
>>> {
>>> u32 val, i;
>>> @@ -116,6 +128,8 @@ static void tpdm_enable_dsb(struct tpdm_drvdata
>>> *drvdata)
>>> set_dsb_tier(drvdata, &val);
>>> writel_relaxed(val, drvdata->base + TPDM_DSB_TIER);
>>> + set_dsb_msr(drvdata);
>>> +
>>> val = readl_relaxed(drvdata->base + TPDM_DSB_CR);
>>> /* Set the test accurate mode */
>>> set_dsb_test_mode(drvdata, &val);
>>> @@ -234,6 +248,14 @@ static int tpdm_datasets_setup(struct
>>> tpdm_drvdata *drvdata)
>>> if (!drvdata->dsb)
>>> return -ENOMEM;
>>> }
>>> + if (!of_property_read_u32(drvdata->dev->of_node,
>>> + "qcom,dsb_msr_num", &drvdata->dsb->msr_num)) {
>>> + drvdata->dsb->msr = devm_kzalloc(drvdata->dev, > +
>>> (drvdata->dsb->msr_num * sizeof(*drvdata->dsb->msr)),
>>
>> devm_kcalloc() ?
> Sure, I will update this in the next patch series.
>>
>>> + GFP_KERNEL);
>>> + if (!drvdata->dsb->msr)
>>> + return -ENOMEM;
>>> + }
>>> }
>>> return 0;
>>> @@ -830,6 +852,80 @@ static ssize_t dsb_trig_ts_store(struct device
>>> *dev,
>>> }
>>> static DEVICE_ATTR_RW(dsb_trig_ts);
>>> +static ssize_t dsb_msr_idx_show(struct device *dev,
>>> + struct device_attribute *attr,
>>> + char *buf)
>>> +{
>>> + struct tpdm_drvdata *drvdata = dev_get_drvdata(dev->parent);
>>> +
>>> + return sysfs_emit(buf, "%u\n",
>>> + (unsigned int)drvdata->dsb->msr_idx);
>>> +
>>> +}
>>> +
>>> +static ssize_t dsb_msr_idx_store(struct device *dev,
>>> + struct device_attribute *attr,
>>> + const char *buf,
>>> + size_t size)
>>> +{
>>> + struct tpdm_drvdata *drvdata = dev_get_drvdata(dev->parent);
>>> + unsigned long index;
>>> +
>>> + if (kstrtoul(buf, 0, &index))
>>> + return -EINVAL;
>>> + if (index >= drvdata->dsb->msr_num)
>>> + return -EPERM;
>>> +
>>> + spin_lock(&drvdata->spinlock);
>>> + drvdata->dsb->msr_idx = index;
>>> + spin_unlock(&drvdata->spinlock);
>>> + return size;
>>> +}
>>> +static DEVICE_ATTR_RW(dsb_msr_idx);
>>> +
>>> +static ssize_t dsb_msr_show(struct device *dev,
>>> + struct device_attribute *attr,
>>> + char *buf)
>>> +{
>>> + struct tpdm_drvdata *drvdata = dev_get_drvdata(dev->parent);
>>> + unsigned int i;
>>> + unsigned long bytes;
>>> + ssize_t size = 0;
>>> +
>>> + if (drvdata->dsb->msr_num == 0)
>>> + return -EINVAL;
>>> +
>>> + spin_lock(&drvdata->spinlock);
>>> + for (i = 0; i < drvdata->dsb->msr_num; i++) {
>>> + bytes = sysfs_emit_at(buf, size,
>>> + "0x%x\n", drvdata->dsb->msr[i]);
>>
>> Single value per single file.
>
> Sure, I will update this in the next patch series.
>
>
> Best,
>
> Tao
>
>>
>> Suzuki
>>
>>
>>> + if (bytes <= 0)
>>> + break;
>>> + size += bytes;
>>> + }
>>> + spin_unlock(&drvdata->spinlock);
>>> +
>>> + return size;
>>> +}
>>> +
>>> +static ssize_t dsb_msr_store(struct device *dev,
>>> + struct device_attribute *attr,
>>> + const char *buf,
>>> + size_t size)
>>> +{
>>> + struct tpdm_drvdata *drvdata = dev_get_drvdata(dev->parent);
>>> + unsigned long val;
>>> +
>>> + if (kstrtoul(buf, 0, &val))
>>> + return -EINVAL;
>>> +
>>> + spin_lock(&drvdata->spinlock);
>>> + drvdata->dsb->msr[drvdata->dsb->msr_idx] = val;
>>> + spin_unlock(&drvdata->spinlock);
>>> + return size;
>>> +}
>>> +static DEVICE_ATTR_RW(dsb_msr);
>>> +
>>> static struct attribute *tpdm_dsb_attrs[] = {
>>> &dev_attr_dsb_mode.attr,
>>> &dev_attr_dsb_edge_ctrl_idx.attr,
>>> @@ -845,6 +941,8 @@ static struct attribute *tpdm_dsb_attrs[] = {
>>> &dev_attr_dsb_trig_patt_mask.attr,
>>> &dev_attr_dsb_trig_ts.attr,
>>> &dev_attr_dsb_trig_type.attr,
>>> + &dev_attr_dsb_msr_idx.attr,
>>> + &dev_attr_dsb_msr.attr,
>>> NULL,
>>> };
>>> diff --git a/drivers/hwtracing/coresight/coresight-tpdm.h
>>> b/drivers/hwtracing/coresight/coresight-tpdm.h
>>> index 7c52cf4..7b70db3 100644
>>> --- a/drivers/hwtracing/coresight/coresight-tpdm.h
>>> +++ b/drivers/hwtracing/coresight/coresight-tpdm.h
>>> @@ -18,6 +18,7 @@
>>> #define TPDM_DSB_XPMR(n) (0x7E8 + (n * 4))
>>> #define TPDM_DSB_EDCR(n) (0x808 + (n * 4))
>>> #define TPDM_DSB_EDCMR(n) (0x848 + (n * 4))
>>> +#define TPDM_DSB_MSR(n) (0x980 + (n * 4))
>>> /* Enable bit for DSB subunit */
>>> #define TPDM_DSB_CR_ENA BIT(0)
>>> @@ -100,6 +101,9 @@
>>> * @patt_mask: Save value for pattern mask
>>> * @trig_patt: Save value for trigger pattern
>>> * @trig_patt_mask: Save value for trigger pattern mask
>>> + * @msr_num Number of MSR supported by DSB TPDM
>>> + * @msr_idx Index number of the MSR
>>> + * @msr Save value for MSR
>>> * @patt_ts: Enable/Disable pattern timestamp
>>> * @patt_type: Set pattern type
>>> * @trig_ts: Enable/Disable trigger timestamp.
>>> @@ -116,6 +120,9 @@ struct dsb_dataset {
>>> u32 patt_mask[TPDM_DSB_MAX_PATT];
>>> u32 trig_patt[TPDM_DSB_MAX_PATT];
>>> u32 trig_patt_mask[TPDM_DSB_MAX_PATT];
>>> + u32 msr_num;
>>> + u32 msr_idx;
>>> + u32 *msr;
>>> bool patt_ts;
>>> bool patt_type;
>>> bool trig_ts;
>>
WARNING: multiple messages have this Message-ID (diff)
From: Suzuki K Poulose <suzuki.poulose@arm.com>
To: Tao Zhang <quic_taozha@quicinc.com>,
Mathieu Poirier <mathieu.poirier@linaro.org>,
Alexander Shishkin <alexander.shishkin@linux.intel.com>,
Konrad Dybcio <konradybcio@gmail.com>,
Mike Leach <mike.leach@linaro.org>,
Rob Herring <robh+dt@kernel.org>,
Krzysztof Kozlowski <krzysztof.kozlowski+dt@linaro.org>
Cc: Jinlong Mao <quic_jinlmao@quicinc.com>,
Leo Yan <leo.yan@linaro.org>,
Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
coresight@lists.linaro.org, linux-arm-kernel@lists.infradead.org,
linux-kernel@vger.kernel.org, devicetree@vger.kernel.org,
Tingwei Zhang <quic_tingweiz@quicinc.com>,
Yuanfang Zhang <quic_yuanfang@quicinc.com>,
Trilok Soni <quic_tsoni@quicinc.com>,
Hao Zhang <quic_hazha@quicinc.com>,
linux-arm-msm@vger.kernel.org, andersson@kernel.org
Subject: Re: [PATCH v7 13/13] coresight-tpdm: Add nodes for dsb msr support
Date: Fri, 18 Aug 2023 17:25:48 +0100 [thread overview]
Message-ID: <33939efa-c84f-e50d-3fe8-ae5b015ecc14@arm.com> (raw)
In-Reply-To: <29a2cbfa-200d-3092-e827-b590a1ca1a30@quicinc.com>
On 18/08/2023 16:44, Tao Zhang wrote:
>
> On 8/7/2023 7:35 PM, Suzuki K Poulose wrote:
>> On 25/07/2023 08:15, Tao Zhang wrote:
>>> Add the nodes for DSB subunit MSR(mux select register) support.
>>> The TPDM MSR (mux select register) interface is an optional
>>> interface and associated bank of registers per TPDM subunit.
>>> The intent of mux select registers is to control muxing structures
>>> driving the TPDM’s’ various subunit interfaces.
>>>
>>> Signed-off-by: Tao Zhang <quic_taozha@quicinc.com>
>>> ---
>>> .../ABI/testing/sysfs-bus-coresight-devices-tpdm | 19 ++++-
>>> drivers/hwtracing/coresight/coresight-tpdm.c | 98
>>> ++++++++++++++++++++++
>>> drivers/hwtracing/coresight/coresight-tpdm.h | 7 ++
>>> 3 files changed, 123 insertions(+), 1 deletion(-)
>>>
>>> diff --git
>>> a/Documentation/ABI/testing/sysfs-bus-coresight-devices-tpdm
>>> b/Documentation/ABI/testing/sysfs-bus-coresight-devices-tpdm
>>> index 74a0126..ee41a14 100644
>>> --- a/Documentation/ABI/testing/sysfs-bus-coresight-devices-tpdm
>>> +++ b/Documentation/ABI/testing/sysfs-bus-coresight-devices-tpdm
>>> @@ -185,4 +185,21 @@ Description:
>>> Accepts only one of the 2 values - 0 or 1.
>>> 0 : Set the DSB pattern type to value.
>>> - 1 : Set the DSB pattern type to toggle.
>>> \ No newline at end of file
>>> + 1 : Set the DSB pattern type to toggle.
>>> +
>>> +What: /sys/bus/coresight/devices/<tpdm-name>/dsb_msr_idx
>>> +Date: March 2023
>>> +KernelVersion 6.5
>>> +Contact: Jinlong Mao (QUIC) <quic_jinlmao@quicinc.com>, Tao Zhang
>>> (QUIC) <quic_taozha@quicinc.com>
>>> +Description:
>>> + Read/Write the index number of MSR(mux select register) on DSB
>>> + TPDM. This index number should not be greater than the number
>>> + of MSR supported by this DSB TPDM.
>>
>> How does a user find it ? Why don't we expose it ? Scratch all of
>> that, you could create a register file per exising msr.
>>
>> dsb_msrs/msr0 ... msrN
>>
>> You may :
>>
>> 1. either dynamically add files as you find the number
>>
>> OR
>>
>> 2. If there is a hard limit, create that many files and control
>> visibility based on the dynamic number.
>>
> Hi Suzuki,
>
>
> With regards to your suggestions, would you mind if you provide some
> sample code for my reference?
>
> 1. How to dynamically add files to the sysfs as I find the number?
>
> 2. The hard limit of MSR should be 32. How can I control visibility
> based on the dynamic number?
You could add attributes via dev_ext_attribute, storing the "idx" as
the data field for 0-31. And use the is_visible() hook for the
attribute_group, just like you do for DSB related checks.
Some skeleton code, untested :
static ssize_t dsb_msr_read(struct device *dev,
struct device_attribute *attr, char *buf)
{
struct dev_ext_attribute *eattr = container_of(attr,
struct dev_ext_attribute, attr);
int idx = (int)(unsigned long)eattr->var;
/* Read the MSR at IDX */
}
/* Similarly for dsb_msr_write() */
#define DSB_MSR_ATTR(idx) \
&((struct dev_ext_attribute[]) { \
{ \
__ATTR("msr"#idx, <RW>, dsb_msr_read, dsb_msr_write), \
(void *)idx } \
})[0].attr.attr
#define DSB_MSR_ATTRS \
DSB_MSR_ATTR(0), \
DSB_MSR_ATTR(1), \
...
DSB_MSR_ATTR(31)
static struct attribute * dsb_msr_attrs[] = {
DSB_MSR_ATTRS,
NULL,
};
static umode_t
dsb_msr_is_visible(struct kobject *kobj,
struct attribute *attr, int unuse)
{
struct device *dev = kobject_to_dev(kobj);
/* From dev, get drvdata */
/* Then decide if it should be made visible, if yes R/W permissions */
}
static const struct attribute_group dsb_msr_group = {
.is_visible = dsb_msr_is_visible,
.attrs = dsb_msr_attrs,
.name = "dsb_msr",
};
See : drivers/.../coresight-etm4x-sysfs.c:
coresight_etmv4_mgmt_attrs & coresight_etmv4_mgmt_group
for an example.
Suzuki
>
>>
>>
>>> +
>>> +What: /sys/bus/coresight/devices/<tpdm-name>/dsb_msr
>>> +Date: March 2023
>>> +KernelVersion 6.5
>>> +Contact: Jinlong Mao (QUIC) <quic_jinlmao@quicinc.com>, Tao Zhang
>>> (QUIC) <quic_taozha@quicinc.com>
>>> +Description:
>>> + (Write) Set the MSR(mux select register) of DSB tpdm. Read
>>> + the MSR(mux select register) of DSB tpdm.
>>
>> (RW)
> Sure, I will update this in the next patch series.
>>
>>> \ No newline at end of file
>>> diff --git a/drivers/hwtracing/coresight/coresight-tpdm.c
>>> b/drivers/hwtracing/coresight/coresight-tpdm.c
>>> index f9e5a1d..be7776b 100644
>>> --- a/drivers/hwtracing/coresight/coresight-tpdm.c
>>> +++ b/drivers/hwtracing/coresight/coresight-tpdm.c
>>> @@ -90,6 +90,18 @@ static void set_dsb_tier(struct tpdm_drvdata
>>> *drvdata, u32 *val)
>>> }
>>> +static void set_dsb_msr(struct tpdm_drvdata *drvdata)
>>> +{
>>> + int i;
>>> +
>>
>>
>>> + if (drvdata->dsb->msr_num == 0)
>>> + return;
>>> +
>>> + for (i = 0; i < drvdata->dsb->msr_num; i++)
>>> + writel_relaxed(drvdata->dsb->msr[i],
>>> + drvdata->base + TPDM_DSB_MSR(i));
>>> +}
>>> +
>>> static void tpdm_enable_dsb(struct tpdm_drvdata *drvdata)
>>> {
>>> u32 val, i;
>>> @@ -116,6 +128,8 @@ static void tpdm_enable_dsb(struct tpdm_drvdata
>>> *drvdata)
>>> set_dsb_tier(drvdata, &val);
>>> writel_relaxed(val, drvdata->base + TPDM_DSB_TIER);
>>> + set_dsb_msr(drvdata);
>>> +
>>> val = readl_relaxed(drvdata->base + TPDM_DSB_CR);
>>> /* Set the test accurate mode */
>>> set_dsb_test_mode(drvdata, &val);
>>> @@ -234,6 +248,14 @@ static int tpdm_datasets_setup(struct
>>> tpdm_drvdata *drvdata)
>>> if (!drvdata->dsb)
>>> return -ENOMEM;
>>> }
>>> + if (!of_property_read_u32(drvdata->dev->of_node,
>>> + "qcom,dsb_msr_num", &drvdata->dsb->msr_num)) {
>>> + drvdata->dsb->msr = devm_kzalloc(drvdata->dev, > +
>>> (drvdata->dsb->msr_num * sizeof(*drvdata->dsb->msr)),
>>
>> devm_kcalloc() ?
> Sure, I will update this in the next patch series.
>>
>>> + GFP_KERNEL);
>>> + if (!drvdata->dsb->msr)
>>> + return -ENOMEM;
>>> + }
>>> }
>>> return 0;
>>> @@ -830,6 +852,80 @@ static ssize_t dsb_trig_ts_store(struct device
>>> *dev,
>>> }
>>> static DEVICE_ATTR_RW(dsb_trig_ts);
>>> +static ssize_t dsb_msr_idx_show(struct device *dev,
>>> + struct device_attribute *attr,
>>> + char *buf)
>>> +{
>>> + struct tpdm_drvdata *drvdata = dev_get_drvdata(dev->parent);
>>> +
>>> + return sysfs_emit(buf, "%u\n",
>>> + (unsigned int)drvdata->dsb->msr_idx);
>>> +
>>> +}
>>> +
>>> +static ssize_t dsb_msr_idx_store(struct device *dev,
>>> + struct device_attribute *attr,
>>> + const char *buf,
>>> + size_t size)
>>> +{
>>> + struct tpdm_drvdata *drvdata = dev_get_drvdata(dev->parent);
>>> + unsigned long index;
>>> +
>>> + if (kstrtoul(buf, 0, &index))
>>> + return -EINVAL;
>>> + if (index >= drvdata->dsb->msr_num)
>>> + return -EPERM;
>>> +
>>> + spin_lock(&drvdata->spinlock);
>>> + drvdata->dsb->msr_idx = index;
>>> + spin_unlock(&drvdata->spinlock);
>>> + return size;
>>> +}
>>> +static DEVICE_ATTR_RW(dsb_msr_idx);
>>> +
>>> +static ssize_t dsb_msr_show(struct device *dev,
>>> + struct device_attribute *attr,
>>> + char *buf)
>>> +{
>>> + struct tpdm_drvdata *drvdata = dev_get_drvdata(dev->parent);
>>> + unsigned int i;
>>> + unsigned long bytes;
>>> + ssize_t size = 0;
>>> +
>>> + if (drvdata->dsb->msr_num == 0)
>>> + return -EINVAL;
>>> +
>>> + spin_lock(&drvdata->spinlock);
>>> + for (i = 0; i < drvdata->dsb->msr_num; i++) {
>>> + bytes = sysfs_emit_at(buf, size,
>>> + "0x%x\n", drvdata->dsb->msr[i]);
>>
>> Single value per single file.
>
> Sure, I will update this in the next patch series.
>
>
> Best,
>
> Tao
>
>>
>> Suzuki
>>
>>
>>> + if (bytes <= 0)
>>> + break;
>>> + size += bytes;
>>> + }
>>> + spin_unlock(&drvdata->spinlock);
>>> +
>>> + return size;
>>> +}
>>> +
>>> +static ssize_t dsb_msr_store(struct device *dev,
>>> + struct device_attribute *attr,
>>> + const char *buf,
>>> + size_t size)
>>> +{
>>> + struct tpdm_drvdata *drvdata = dev_get_drvdata(dev->parent);
>>> + unsigned long val;
>>> +
>>> + if (kstrtoul(buf, 0, &val))
>>> + return -EINVAL;
>>> +
>>> + spin_lock(&drvdata->spinlock);
>>> + drvdata->dsb->msr[drvdata->dsb->msr_idx] = val;
>>> + spin_unlock(&drvdata->spinlock);
>>> + return size;
>>> +}
>>> +static DEVICE_ATTR_RW(dsb_msr);
>>> +
>>> static struct attribute *tpdm_dsb_attrs[] = {
>>> &dev_attr_dsb_mode.attr,
>>> &dev_attr_dsb_edge_ctrl_idx.attr,
>>> @@ -845,6 +941,8 @@ static struct attribute *tpdm_dsb_attrs[] = {
>>> &dev_attr_dsb_trig_patt_mask.attr,
>>> &dev_attr_dsb_trig_ts.attr,
>>> &dev_attr_dsb_trig_type.attr,
>>> + &dev_attr_dsb_msr_idx.attr,
>>> + &dev_attr_dsb_msr.attr,
>>> NULL,
>>> };
>>> diff --git a/drivers/hwtracing/coresight/coresight-tpdm.h
>>> b/drivers/hwtracing/coresight/coresight-tpdm.h
>>> index 7c52cf4..7b70db3 100644
>>> --- a/drivers/hwtracing/coresight/coresight-tpdm.h
>>> +++ b/drivers/hwtracing/coresight/coresight-tpdm.h
>>> @@ -18,6 +18,7 @@
>>> #define TPDM_DSB_XPMR(n) (0x7E8 + (n * 4))
>>> #define TPDM_DSB_EDCR(n) (0x808 + (n * 4))
>>> #define TPDM_DSB_EDCMR(n) (0x848 + (n * 4))
>>> +#define TPDM_DSB_MSR(n) (0x980 + (n * 4))
>>> /* Enable bit for DSB subunit */
>>> #define TPDM_DSB_CR_ENA BIT(0)
>>> @@ -100,6 +101,9 @@
>>> * @patt_mask: Save value for pattern mask
>>> * @trig_patt: Save value for trigger pattern
>>> * @trig_patt_mask: Save value for trigger pattern mask
>>> + * @msr_num Number of MSR supported by DSB TPDM
>>> + * @msr_idx Index number of the MSR
>>> + * @msr Save value for MSR
>>> * @patt_ts: Enable/Disable pattern timestamp
>>> * @patt_type: Set pattern type
>>> * @trig_ts: Enable/Disable trigger timestamp.
>>> @@ -116,6 +120,9 @@ struct dsb_dataset {
>>> u32 patt_mask[TPDM_DSB_MAX_PATT];
>>> u32 trig_patt[TPDM_DSB_MAX_PATT];
>>> u32 trig_patt_mask[TPDM_DSB_MAX_PATT];
>>> + u32 msr_num;
>>> + u32 msr_idx;
>>> + u32 *msr;
>>> bool patt_ts;
>>> bool patt_type;
>>> bool trig_ts;
>>
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
next prev parent reply other threads:[~2023-08-18 16:26 UTC|newest]
Thread overview: 66+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-07-25 7:15 [PATCH v7 00/13] Add support to configure TPDM DSB subunit Tao Zhang
2023-07-25 7:15 ` [PATCH v7 01/13] coresight-tpdm: Remove the unnecessary lock Tao Zhang
2023-07-25 7:15 ` [PATCH v7 02/13] dt-bindings: arm: Add support for DSB element size Tao Zhang
2023-07-25 7:15 ` [PATCH v7 03/13] coresight-tpdm: Introduce TPDM subtype to TPDM driver Tao Zhang
2023-07-25 7:15 ` [PATCH v7 04/13] coresight-tpda: Add DSB dataset support Tao Zhang
2023-08-04 15:02 ` Suzuki K Poulose
2023-08-04 15:02 ` Suzuki K Poulose
2023-08-07 9:12 ` Suzuki K Poulose
2023-08-07 9:12 ` Suzuki K Poulose
2023-08-09 6:14 ` Tao Zhang
2023-08-09 6:14 ` Tao Zhang
2023-08-09 6:13 ` Tao Zhang
2023-08-09 6:13 ` Tao Zhang
2023-07-25 7:15 ` [PATCH v7 05/13] coresight-tpdm: Initialize DSB subunit configuration Tao Zhang
2023-08-07 9:28 ` Suzuki K Poulose
2023-08-07 9:28 ` Suzuki K Poulose
2023-08-09 6:29 ` Tao Zhang
2023-08-09 6:29 ` Tao Zhang
2023-07-25 7:15 ` [PATCH v7 06/13] coresight-tpdm: Add reset node to TPDM node Tao Zhang
2023-08-07 9:36 ` Suzuki K Poulose
2023-08-07 9:36 ` Suzuki K Poulose
2023-08-09 6:35 ` Tao Zhang
2023-08-09 6:35 ` Tao Zhang
2023-08-13 15:38 ` Tao Zhang
2023-08-13 15:38 ` Tao Zhang
[not found] ` <ce14e453-50da-02c2-9147-f094ed8aa10f@quicinc.com>
2023-08-14 9:45 ` Suzuki K Poulose
2023-08-14 9:45 ` Suzuki K Poulose
2023-07-25 7:15 ` [PATCH v7 07/13] coresight-tpdm: Add nodes to set trigger timestamp and type Tao Zhang
2023-08-07 9:42 ` Suzuki K Poulose
2023-08-07 9:42 ` Suzuki K Poulose
2023-08-09 6:55 ` Tao Zhang
2023-08-09 6:55 ` Tao Zhang
2023-07-25 7:15 ` [PATCH v7 08/13] coresight-tpdm: Add node to set dsb programming mode Tao Zhang
2023-07-25 19:46 ` kernel test robot
2023-08-07 10:00 ` Suzuki K Poulose
2023-08-07 10:00 ` Suzuki K Poulose
2023-08-14 7:03 ` Tao Zhang
2023-08-14 7:03 ` Tao Zhang
2023-07-25 7:15 ` [PATCH v7 09/13] coresight-tpdm: Add nodes for dsb edge control Tao Zhang
2023-07-25 12:27 ` kernel test robot
2023-07-25 22:00 ` kernel test robot
2023-08-07 9:24 ` Suzuki K Poulose
2023-08-07 9:24 ` Suzuki K Poulose
2023-08-09 6:57 ` Tao Zhang
2023-08-09 6:57 ` Tao Zhang
2023-08-07 10:58 ` Suzuki K Poulose
2023-08-07 10:58 ` Suzuki K Poulose
2023-08-09 6:59 ` Tao Zhang
2023-08-09 6:59 ` Tao Zhang
2023-07-25 7:15 ` [PATCH v7 10/13] coresight-tpdm: Add nodes to configure pattern match output Tao Zhang
2023-08-07 11:15 ` Suzuki K Poulose
2023-08-07 11:15 ` Suzuki K Poulose
2023-07-25 7:15 ` [PATCH v7 11/13] coresight-tpdm: Add nodes for timestamp request Tao Zhang
2023-08-07 11:27 ` Suzuki K Poulose
2023-08-07 11:27 ` Suzuki K Poulose
2023-07-25 7:15 ` [PATCH v7 12/13] dt-bindings: arm: Add support for DSB MSR register Tao Zhang
2023-07-26 15:16 ` Rob Herring
2023-07-25 7:15 ` [PATCH v7 13/13] coresight-tpdm: Add nodes for dsb msr support Tao Zhang
2023-08-07 11:35 ` Suzuki K Poulose
2023-08-07 11:35 ` Suzuki K Poulose
2023-08-18 15:44 ` Tao Zhang
2023-08-18 15:44 ` Tao Zhang
2023-08-18 16:25 ` Suzuki K Poulose [this message]
2023-08-18 16:25 ` Suzuki K Poulose
2023-08-19 12:37 ` Tao Zhang
2023-08-19 12:37 ` Tao Zhang
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=33939efa-c84f-e50d-3fe8-ae5b015ecc14@arm.com \
--to=suzuki.poulose@arm.com \
--cc=alexander.shishkin@linux.intel.com \
--cc=andersson@kernel.org \
--cc=coresight@lists.linaro.org \
--cc=devicetree@vger.kernel.org \
--cc=gregkh@linuxfoundation.org \
--cc=konradybcio@gmail.com \
--cc=krzysztof.kozlowski+dt@linaro.org \
--cc=leo.yan@linaro.org \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-arm-msm@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=mathieu.poirier@linaro.org \
--cc=mike.leach@linaro.org \
--cc=quic_hazha@quicinc.com \
--cc=quic_jinlmao@quicinc.com \
--cc=quic_taozha@quicinc.com \
--cc=quic_tingweiz@quicinc.com \
--cc=quic_tsoni@quicinc.com \
--cc=quic_yuanfang@quicinc.com \
--cc=robh+dt@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.