lkml.org 
[lkml]   [2022]   [Nov]   [21]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v1 8/9] coresight-tpdm: Add nodes to configure pattern match output
    Date
    Add nodes to configure trigger pattern and trigger pattern mask.
    Each DSB subunit TPDM has maximum of n(n<7) XPR registers to
    configure trigger pattern match output. Eight 32 bit registers
    providing DSB interface trigger output pattern match comparison.
    And each DSB subunit TPDM has maximum of m(m<7) XPMR registers to
    configure trigger pattern mask match output. Eight 32 bit
    registers providing DSB interface trigger output pattern match
    mask.

    Signed-off-by: Tao Zhang <quic_taozha@quicinc.com>
    ---
    drivers/hwtracing/coresight/coresight-tpdm.c | 85 ++++++++++++++++++++++++++++
    drivers/hwtracing/coresight/coresight-tpdm.h | 8 +++
    2 files changed, 93 insertions(+)

    diff --git a/drivers/hwtracing/coresight/coresight-tpdm.c b/drivers/hwtracing/coresight/coresight-tpdm.c
    index b0cc161..2a0b8ed 100644
    --- a/drivers/hwtracing/coresight/coresight-tpdm.c
    +++ b/drivers/hwtracing/coresight/coresight-tpdm.c
    @@ -48,6 +48,13 @@ static void tpdm_enable_dsb(struct tpdm_drvdata *drvdata)
    writel_relaxed(drvdata->dsb->edge_ctrl_mask[i],
    drvdata->base + TPDM_DSB_EDCMR(i));

    + for (i = 0; i < TPDM_DSB_MAX_PATT; i++) {
    + writel_relaxed(drvdata->dsb->trig_patt_val[i],
    + drvdata->base + TPDM_DSB_XPR(i));
    + writel_relaxed(drvdata->dsb->trig_patt_mask[i],
    + drvdata->base + TPDM_DSB_XPMR(i));
    + }
    +
    val = readl_relaxed(drvdata->base + TPDM_DSB_TIER);
    /* Set trigger timestamp */
    if (drvdata->dsb->trig_ts)
    @@ -437,6 +444,82 @@ static ssize_t dsb_edge_ctrl_mask_store(struct device *dev,
    }
    static DEVICE_ATTR_RW(dsb_edge_ctrl_mask);

    +static ssize_t dsb_trig_patt_val_show(struct device *dev,
    + struct device_attribute *attr,
    + char *buf)
    +{
    + struct tpdm_drvdata *drvdata = dev_get_drvdata(dev->parent);
    + ssize_t size = 0;
    + int i = 0;
    +
    + spin_lock(&drvdata->spinlock);
    + for (i = 0; i < TPDM_DSB_MAX_PATT; i++) {
    + size += sysfs_emit_at(buf, size,
    + "Index: 0x%x Value: 0x%x\n", i,
    + drvdata->dsb->trig_patt_val[i]);
    + }
    + spin_unlock(&drvdata->spinlock);
    + return size;
    +}
    +
    +static ssize_t dsb_trig_patt_val_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, val;
    +
    + if (sscanf(buf, "%lx %lx", &index, &val) != 2)
    + return -EINVAL;
    + if (index >= TPDM_DSB_MAX_PATT)
    + return -EPERM;
    +
    + spin_lock(&drvdata->spinlock);
    + drvdata->dsb->trig_patt_val[index] = val;
    + spin_unlock(&drvdata->spinlock);
    + return size;
    +}
    +static DEVICE_ATTR_RW(dsb_trig_patt_val);
    +
    +static ssize_t dsb_trig_patt_mask_show(struct device *dev,
    + struct device_attribute *attr,
    + char *buf)
    +{
    + struct tpdm_drvdata *drvdata = dev_get_drvdata(dev->parent);
    + ssize_t size = 0;
    + int i = 0;
    +
    + spin_lock(&drvdata->spinlock);
    + for (i = 0; i < TPDM_DSB_MAX_PATT; i++) {
    + size += sysfs_emit_at(buf, size,
    + "Index: 0x%x Value: 0x%x\n", i,
    + drvdata->dsb->trig_patt_mask[i]);
    + }
    + spin_unlock(&drvdata->spinlock);
    + return size;
    +}
    +
    +static ssize_t dsb_trig_patt_mask_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, val;
    +
    + if (sscanf(buf, "%lx %lx", &index, &val) != 2)
    + return -EINVAL;
    + if (index >= TPDM_DSB_MAX_PATT)
    + return -EPERM;
    +
    + spin_lock(&drvdata->spinlock);
    + drvdata->dsb->trig_patt_mask[index] = val;
    + spin_unlock(&drvdata->spinlock);
    + return size;
    +}
    +static DEVICE_ATTR_RW(dsb_trig_patt_mask);
    +
    static ssize_t dsb_trig_type_show(struct device *dev,
    struct device_attribute *attr,
    char *buf)
    @@ -510,6 +593,8 @@ static struct attribute *tpdm_dsb_attrs[] = {
    &dev_attr_dsb_mode.attr,
    &dev_attr_dsb_edge_ctrl.attr,
    &dev_attr_dsb_edge_ctrl_mask.attr,
    + &dev_attr_dsb_trig_patt_val.attr,
    + &dev_attr_dsb_trig_patt_mask.attr,
    &dev_attr_dsb_trig_ts.attr,
    &dev_attr_dsb_trig_type.attr,
    NULL,
    diff --git a/drivers/hwtracing/coresight/coresight-tpdm.h b/drivers/hwtracing/coresight/coresight-tpdm.h
    index bd9d006..386a0e5 100644
    --- a/drivers/hwtracing/coresight/coresight-tpdm.h
    +++ b/drivers/hwtracing/coresight/coresight-tpdm.h
    @@ -12,6 +12,8 @@
    /* DSB Subunit Registers */
    #define TPDM_DSB_CR (0x780)
    #define TPDM_DSB_TIER (0x784)
    +#define TPDM_DSB_XPR(n) (0x7C8 + (n * 4))
    +#define TPDM_DSB_XPMR(n) (0x7E8 + (n * 4))
    #define TPDM_DSB_EDCR(n) (0x808 + (n * 4))
    #define TPDM_DSB_EDCMR(n) (0x848 + (n * 4))

    @@ -65,12 +67,16 @@
    #define TPDM_DSB_MAX_EDCR 16
    /* MAX number of EDCMR registers */
    #define TPDM_DSB_MAX_EDCMR 8
    +/* MAX number of DSB pattern */
    +#define TPDM_DSB_MAX_PATT 8

    /**
    * struct dsb_dataset - specifics associated to dsb dataset
    * @mode: DSB programming mode
    * @edge_ctrl: Save value for edge control
    * @edge_ctrl_mask: Save value for edge control mask
    + * @trig_patt_val: Save value for trigger pattern
    + * @trig_patt_mask: Save value for trigger pattern mask
    * @trig_ts: Enable/Disable trigger timestamp.
    * @trig_type: Enable/Disable trigger type.
    */
    @@ -78,6 +84,8 @@ struct dsb_dataset {
    u32 mode;
    u32 edge_ctrl[TPDM_DSB_MAX_EDCR];
    u32 edge_ctrl_mask[TPDM_DSB_MAX_EDCMR];
    + u32 trig_patt_val[TPDM_DSB_MAX_PATT];
    + u32 trig_patt_mask[TPDM_DSB_MAX_PATT];
    bool trig_ts;
    bool trig_type;
    };
    --
    2.7.4
    \
     
     \ /
      Last update: 2022-11-21 09:24    [W:2.858 / U:0.168 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site