All of lore.kernel.org
 help / color / mirror / Atom feed
From: Jie Gan <jie.gan@oss.qualcomm.com>
To: Yingchao Deng <yingchao.deng@oss.qualcomm.com>, mike.leach@linaro.org
Cc: alexander.shishkin@linux.intel.com, coresight@lists.linaro.org,
	james.clark@linaro.org, jinlong.mao@oss.qualcomm.com,
	leo.yan@arm.com, linux-arm-kernel@lists.infradead.org,
	linux-arm-msm@vger.kernel.org, linux-kernel@vger.kernel.org,
	quic_jinlmao@quicinc.com, quic_yingdeng@quicinc.com,
	suzuki.poulose@arm.com, tingwei.zhang@oss.qualcomm.com
Subject: Re: [PATCH v6 2/2] coresight: cti: Add Qualcomm extended CTI support
Date: Tue, 9 Dec 2025 19:03:51 +0800	[thread overview]
Message-ID: <d55ed203-b0f4-4453-81cf-1d8dcd6494ed@oss.qualcomm.com> (raw)
In-Reply-To: <20251209081649.105623-1-yingchao.deng@oss.qualcomm.com>



On 12/9/2025 4:16 PM, Yingchao Deng wrote:
> Hi Leo & Mike
> 
> Based on Leo’s suggestions, I created a new patch, but there are three points that do not fully align with his recommendations:
> 
>      1. The helper function for returning the register address now returns only the offset, because returning the full address would conflict with cti_write_single_reg.
>      2. For registers such as triginstatus1...3, I defined additional macros CTITRIGINSTATUS1...3. This is because CTITRIGINSTATUS + 0x4 equals CTITRIGOUTSTATUS, and to avoid conflicts with existing macros, I chose numbers starting from 0x1000 for the new definitions.
>      3. Regarding the visibility of attributes for triginstatus1...3, since coresight_cti_reg produces an anonymous variable that cannot be directly referenced, I used coresight_cti_regs_attrs[i] to obtain the attribute corresponding to triginstatus1.
> 
> I appreciate both suggestions. After reviewing them, I lean toward Mike's approach.
> 
> Signed-off-by: Yingchao Deng <yingchao.deng@oss.qualcomm.com>
> ---
>   .../hwtracing/coresight/coresight-cti-core.c  |  52 +++++--
>   .../hwtracing/coresight/coresight-cti-sysfs.c |  72 ++++++++--
>   drivers/hwtracing/coresight/coresight-cti.h   |   3 +-
>   drivers/hwtracing/coresight/qcom-cti.h        | 136 ++++++++++++++++++
>   4 files changed, 238 insertions(+), 25 deletions(-)
>   create mode 100644 drivers/hwtracing/coresight/qcom-cti.h
> 
> diff --git a/drivers/hwtracing/coresight/coresight-cti-core.c b/drivers/hwtracing/coresight/coresight-cti-core.c
> index f9970e40dd59..d2b0b46f2846 100644
> --- a/drivers/hwtracing/coresight/coresight-cti-core.c
> +++ b/drivers/hwtracing/coresight/coresight-cti-core.c
> @@ -21,7 +21,7 @@
> 
>   #include "coresight-priv.h"
>   #include "coresight-cti.h"
> -
> +#include "qcom-cti.h"
>   /*
>    * CTI devices can be associated with a PE, or be connected to CoreSight
>    * hardware. We have a list of all CTIs irrespective of CPU bound or
> @@ -70,15 +70,16 @@ void cti_write_all_hw_regs(struct cti_drvdata *drvdata)
> 
>       /* write the CTI trigger registers */
>       for (i = 0; i < config->nr_trig_max; i++) {
> -        writel_relaxed(config->ctiinen[i], drvdata->base + CTIINEN(i));
> +        writel_relaxed(config->ctiinen[i],
> +                drvdata->base + cti_reg_addr_with_nr(drvdata, CTIINEN(0), i));
>           writel_relaxed(config->ctiouten[i],
> -                   drvdata->base + CTIOUTEN(i));
> +                drvdata->base + cti_reg_addr_with_nr(drvdata, CTIOUTEN(0), i));
>       }
> 
>       /* other regs */
> -    writel_relaxed(config->ctigate, drvdata->base + CTIGATE);
> -    writel_relaxed(config->asicctl, drvdata->base + ASICCTL);
> -    writel_relaxed(config->ctiappset, drvdata->base + CTIAPPSET);
> +    writel_relaxed(config->ctigate, drvdata->base + cti_reg_addr(drvdata, CTIGATE));
> +    writel_relaxed(config->asicctl, drvdata->base + cti_reg_addr(drvdata, ASICCTL));
> +    writel_relaxed(config->ctiappset, drvdata->base + cti_reg_addr(drvdata, CTIAPPSET));
> 
>       /* re-enable CTI */
>       writel_relaxed(1, drvdata->base + CTICONTROL);
> @@ -201,7 +202,7 @@ void cti_write_intack(struct device *dev, u32 ackval)
>       raw_spin_lock(&drvdata->spinlock);
>       /* write if enabled */
>       if (cti_active(config))
> -        cti_write_single_reg(drvdata, CTIINTACK, ackval);
> +        cti_write_single_reg(drvdata, cti_reg_addr(drvdata, CTIINTACK), ackval);
>       raw_spin_unlock(&drvdata->spinlock);
>   }
> 
> @@ -214,6 +215,9 @@ void cti_write_intack(struct device *dev, u32 ackval)
>   /* DEVID[19:16] - number of CTM channels */
>   #define CTI_DEVID_CTMCHANNELS(devid_val) ((int) BMVAL(devid_val, 16, 19))
> 
> +/* DEVARCH[31:21] - ARCHITECT */
> +#define CTI_DEVARCH_ARCHITECT(devarch_val) ((int)BMVAL(devarch_val, 21, 31))
> +
>   static int cti_set_default_config(struct device *dev,
>                     struct cti_drvdata *drvdata)
>   {
> @@ -394,9 +398,8 @@ int cti_channel_trig_op(struct device *dev, enum cti_chan_op op,
> 
>       /* update the local register values */
>       chan_bitmask = BIT(channel_idx);
> -    reg_offset = (direction == CTI_TRIG_IN ? CTIINEN(trigger_idx) :
> -              CTIOUTEN(trigger_idx));
> -
> +    reg_offset = (direction == CTI_TRIG_IN ? cti_reg_addr_with_nr(drvdata, CTIINEN(0), trigger_idx):
> +                         cti_reg_addr_with_nr(drvdata, CTIOUTEN(0), trigger_idx));
>       raw_spin_lock(&drvdata->spinlock);
> 
>       /* read - modify write - the trigger / channel enable value */
> @@ -452,7 +455,7 @@ int cti_channel_gate_op(struct device *dev, enum cti_chan_gate_op op,
>       if (err == 0) {
>           config->ctigate = reg_value;
>           if (cti_active(config))
> -            cti_write_single_reg(drvdata, CTIGATE, reg_value);
> +            cti_write_single_reg(drvdata, cti_reg_addr(drvdata, CTIGATE), reg_value);
>       }
>       raw_spin_unlock(&drvdata->spinlock);
>       return err;
> @@ -479,19 +482,19 @@ int cti_channel_setop(struct device *dev, enum cti_chan_set_op op,
>       case CTI_CHAN_SET:
>           config->ctiappset |= chan_bitmask;
>           reg_value  = config->ctiappset;
> -        reg_offset = CTIAPPSET;
> +        reg_offset = cti_reg_addr(drvdata, CTIAPPSET);
>           break;
> 
>       case CTI_CHAN_CLR:
>           config->ctiappset &= ~chan_bitmask;
>           reg_value = chan_bitmask;
> -        reg_offset = CTIAPPCLEAR;
> +        reg_offset = cti_reg_addr(drvdata, CTIAPPCLEAR);
>           break;
> 
>       case CTI_CHAN_PULSE:
>           config->ctiappset &= ~chan_bitmask;
>           reg_value = chan_bitmask;
> -        reg_offset = CTIAPPPULSE;
> +        reg_offset = cti_reg_addr(drvdata, CTIAPPPULSE);
>           break;
> 
>       default:
> @@ -895,6 +898,7 @@ static int cti_probe(struct amba_device *adev, const struct amba_id *id)
>       struct coresight_desc cti_desc;
>       struct coresight_platform_data *pdata = NULL;
>       struct resource *res = &adev->res;
> +    u32 devarch;
> 
>       /* driver data*/
>       drvdata = devm_kzalloc(dev, sizeof(*drvdata), GFP_KERNEL);
> @@ -981,9 +985,27 @@ static int cti_probe(struct amba_device *adev, const struct amba_id *id)
>       drvdata->csdev_release = drvdata->csdev->dev.release;
>       drvdata->csdev->dev.release = cti_device_release;
> 
> +    /* check architect value*/
> +    devarch = readl_relaxed(drvdata->base + CORESIGHT_DEVARCH);
> +    if (CTI_DEVARCH_ARCHITECT(devarch) == ARCHITECT_QCOM) {
> +        drvdata->is_qcom_cti = 1;
> +
> +        /*
> +         * QCOM CTI does not implement Claimtag functionality as
> +         * per CoreSight specification, but its CLAIMSET register
> +         * is incorrectly initialized to 0xF. This can mislead
> +         * tools or drivers into thinking the component is claimed.
> +         *
> +         * Reset CLAIMSET to 0 to reflect that no claims are active.
> +         */
> +        drvdata->csdev->claim_tag_info = CS_CLAIM_TAG_NOT_IMPL;
> +        //writel_relaxed(0, drvdata->base + CORESIGHT_CLAIMSET);
> +    }
> +
>       /* all done - dec pm refcount */
>       pm_runtime_put(&adev->dev);
> -    dev_info(&drvdata->csdev->dev, "CTI initialized\n");
> +    dev_info(&drvdata->csdev->dev, "%s CTI initialized\n",
> +                    drvdata->is_qcom_cti ? "QCOM" : "");
>       return 0;
> 
>   pm_release:
> diff --git a/drivers/hwtracing/coresight/coresight-cti-sysfs.c b/drivers/hwtracing/coresight/coresight-cti-sysfs.c
> index a9df77215141..5d23a138b4a7 100644
> --- a/drivers/hwtracing/coresight/coresight-cti-sysfs.c
> +++ b/drivers/hwtracing/coresight/coresight-cti-sysfs.c
> @@ -13,7 +13,7 @@
>   #include <linux/sysfs.h>
> 
>   #include "coresight-cti.h"
> -
> +#include "qcom-cti.h"
>   /*
>    * Declare the number of static declared attribute groups
>    * Value includes groups + NULL value at end of table.
> @@ -183,7 +183,7 @@ static ssize_t coresight_cti_reg_show(struct device *dev,
>       pm_runtime_get_sync(dev->parent);
>       raw_spin_lock(&drvdata->spinlock);
>       if (drvdata->config.hw_powered)
> -        val = readl_relaxed(drvdata->base + cti_attr->off);
> +        val = readl_relaxed(drvdata->base + cti_reg_addr(drvdata, cti_attr->off));
>       raw_spin_unlock(&drvdata->spinlock);
>       pm_runtime_put_sync(dev->parent);
>       return sysfs_emit(buf, "0x%x\n", val);
> @@ -204,7 +204,7 @@ static __maybe_unused ssize_t coresight_cti_reg_store(struct device *dev,
>       pm_runtime_get_sync(dev->parent);
>       raw_spin_lock(&drvdata->spinlock);
>       if (drvdata->config.hw_powered)
> -        cti_write_single_reg(drvdata, cti_attr->off, val);
> +        cti_write_single_reg(drvdata,  cti_reg_addr(drvdata, cti_attr->off), val);
>       raw_spin_unlock(&drvdata->spinlock);
>       pm_runtime_put_sync(dev->parent);
>       return size;
> @@ -267,7 +267,7 @@ static ssize_t cti_reg32_show(struct device *dev, char *buf,
>       raw_spin_lock(&drvdata->spinlock);
>       if ((reg_offset >= 0) && cti_active(config)) {
>           CS_UNLOCK(drvdata->base);
> -        val = readl_relaxed(drvdata->base + reg_offset);
> +        val = readl_relaxed(drvdata->base + cti_reg_addr(drvdata, reg_offset));
>           if (pcached_val)
>               *pcached_val = val;
>           CS_LOCK(drvdata->base);
> @@ -300,7 +300,7 @@ static ssize_t cti_reg32_store(struct device *dev, const char *buf,
> 
>       /* write through if offset and enabled */
>       if ((reg_offset >= 0) && cti_active(config))
> -        cti_write_single_reg(drvdata, reg_offset, val);
> +        cti_write_single_reg(drvdata,  cti_reg_addr(drvdata, reg_offset), val);
>       raw_spin_unlock(&drvdata->spinlock);
>       return size;
>   }
> @@ -389,7 +389,7 @@ static ssize_t inen_store(struct device *dev,
> 
>       /* write through if enabled */
>       if (cti_active(config))
> -        cti_write_single_reg(drvdata, CTIINEN(index), val);
> +        cti_write_single_reg(drvdata, cti_reg_addr_with_nr(drvdata, CTIINEN(0), index), val);
>       raw_spin_unlock(&drvdata->spinlock);
>       return size;
>   }
> @@ -428,7 +428,7 @@ static ssize_t outen_store(struct device *dev,
> 
>       /* write through if enabled */
>       if (cti_active(config))
> -        cti_write_single_reg(drvdata, CTIOUTEN(index), val);
> +        cti_write_single_reg(drvdata, cti_reg_addr_with_nr(drvdata, CTIOUTEN(0), index), val);
>       raw_spin_unlock(&drvdata->spinlock);
>       return size;
>   }
> @@ -470,7 +470,7 @@ static ssize_t appclear_store(struct device *dev,
> 
>       /* write through if enabled */
>       if (cti_active(config))
> -        cti_write_single_reg(drvdata, CTIAPPCLEAR, val);
> +        cti_write_single_reg(drvdata,  cti_reg_addr(drvdata, CTIAPPCLEAR), val);
>       raw_spin_unlock(&drvdata->spinlock);
>       return size;
>   }
> @@ -491,7 +491,7 @@ static ssize_t apppulse_store(struct device *dev,
> 
>       /* write through if enabled */
>       if (cti_active(config))
> -        cti_write_single_reg(drvdata, CTIAPPPULSE, val);
> +        cti_write_single_reg(drvdata,  cti_reg_addr(drvdata, CTIAPPPULSE), val);
>       raw_spin_unlock(&drvdata->spinlock);
>       return size;
>   }
> @@ -513,18 +513,36 @@ static struct attribute *coresight_cti_regs_attrs[] = {
>       &dev_attr_appclear.attr,
>       &dev_attr_apppulse.attr,
>       coresight_cti_reg(triginstatus, CTITRIGINSTATUS),
> +    coresight_cti_reg(triginstatus1, CTITRIGINSTATUS1),
> +    coresight_cti_reg(triginstatus2, CTITRIGINSTATUS2),
> +    coresight_cti_reg(triginstatus3, CTITRIGINSTATUS3),
>       coresight_cti_reg(trigoutstatus, CTITRIGOUTSTATUS),
> +    coresight_cti_reg(trigoutstatus1, CTITRIGOUTSTATUS1),
> +    coresight_cti_reg(trigoutstatus2, CTITRIGOUTSTATUS2),
> +    coresight_cti_reg(trigoutstatus3, CTITRIGOUTSTATUS3),
>       coresight_cti_reg(chinstatus, CTICHINSTATUS),
>       coresight_cti_reg(choutstatus, CTICHOUTSTATUS),
>   #ifdef CONFIG_CORESIGHT_CTI_INTEGRATION_REGS
>       coresight_cti_reg_rw(itctrl, CORESIGHT_ITCTRL),
>       coresight_cti_reg(ittrigin, ITTRIGIN),
> +    coresight_cti_reg(ittrigin1, ITTRIGIN1),
> +    coresight_cti_reg(ittrigin2, ITTRIGIN2),
> +    coresight_cti_reg(ittrigin3, ITTRIGIN3),
>       coresight_cti_reg(itchin, ITCHIN),
>       coresight_cti_reg_rw(ittrigout, ITTRIGOUT),
> +    coresight_cti_reg_rw(ittrigout1, ITTRIGOUT1),
> +    coresight_cti_reg_rw(ittrigout2, ITTRIGOUT2),
> +    coresight_cti_reg_rw(ittrigout3, ITTRIGOUT3),
>       coresight_cti_reg_rw(itchout, ITCHOUT),
>       coresight_cti_reg(itchoutack, ITCHOUTACK),
>       coresight_cti_reg(ittrigoutack, ITTRIGOUTACK),
> +    coresight_cti_reg(ittrigoutack1, ITTRIGOUTACK1),
> +    coresight_cti_reg(ittrigoutack2, ITTRIGOUTACK2),
> +    coresight_cti_reg(ittrigoutack3, ITTRIGOUTACK3),
>       coresight_cti_reg_wo(ittriginack, ITTRIGINACK),
> +    coresight_cti_reg_wo(ittriginack1, ITTRIGINACK1),
> +    coresight_cti_reg_wo(ittriginack2, ITTRIGINACK2),
> +    coresight_cti_reg_wo(ittriginack3, ITTRIGINACK3),
>       coresight_cti_reg_wo(itchinack, ITCHINACK),
>   #endif
>       NULL,
> @@ -1153,6 +1171,41 @@ int cti_create_cons_sysfs(struct device *dev, struct cti_drvdata *drvdata)
>       return err;
>   }
> 
> +  static umode_t coresight_cti_regs_is_visible(struct kobject *kobj,
> +                  struct attribute *attr, int n)
> +  {

I was thinking can we create a separate attribute_group for added Qcom 
regs? Let devarch to determine whether to create these sysfs nodes?

Thanks,
Jie

> +    struct device *dev = container_of(kobj, struct device, kobj);
> +    struct cti_drvdata *drvdata = dev_get_drvdata(dev->parent);
> +
> +    /* Mute QCOM CTI registers for standard CTI module */
> +    if (!drvdata->is_qcom_cti) {
> +        if (attr == coresight_cti_regs_attrs[10]
> +         || attr == coresight_cti_regs_attrs[11]
> +         || attr == coresight_cti_regs_attrs[12]
> +         || attr == coresight_cti_regs_attrs[14]
> +         || attr == coresight_cti_regs_attrs[15]
> +         || attr == coresight_cti_regs_attrs[16]
> +#ifdef CONFIG_CORESIGHT_CTI_INTEGRATION_REGS
> +         || attr == coresight_cti_regs_attrs[21]
> +         || attr == coresight_cti_regs_attrs[22]
> +         || attr == coresight_cti_regs_attrs[23]
> +         || attr == coresight_cti_regs_attrs[26]
> +         || attr == coresight_cti_regs_attrs[27]
> +         || attr == coresight_cti_regs_attrs[28]
> +         || attr == coresight_cti_regs_attrs[32]
> +         || attr == coresight_cti_regs_attrs[33]
> +         || attr == coresight_cti_regs_attrs[34]
> +         || attr == coresight_cti_regs_attrs[36]
> +         || attr == coresight_cti_regs_attrs[37]
> +         || attr == coresight_cti_regs_attrs[38]
> +#endif
> +         )
> +                  return 0;
> +          }
> +
> +          return attr->mode;
> +  }
> +
>   /* attribute and group sysfs tables. */
>   static const struct attribute_group coresight_cti_group = {
>       .attrs = coresight_cti_attrs,
> @@ -1166,6 +1219,7 @@ static const struct attribute_group coresight_cti_mgmt_group = {
>   static const struct attribute_group coresight_cti_regs_group = {
>       .attrs = coresight_cti_regs_attrs,
>       .name = "regs",
> +    .is_visible = coresight_cti_regs_is_visible,
>   };
> 
>   static const struct attribute_group coresight_cti_channels_group = {
> diff --git a/drivers/hwtracing/coresight/coresight-cti.h b/drivers/hwtracing/coresight/coresight-cti.h
> index e7b88b07cffe..413d5ef483e8 100644
> --- a/drivers/hwtracing/coresight/coresight-cti.h
> +++ b/drivers/hwtracing/coresight/coresight-cti.h
> @@ -57,7 +57,7 @@ struct fwnode_handle;
>    * Max of in and out defined in the DEVID register.
>    * - pick up actual number used from .dts parameters if present.
>    */
> -#define CTIINOUTEN_MAX        32
> +#define CTIINOUTEN_MAX        128
> 
>   /**
>    * Group of related trigger signals
> @@ -181,6 +181,7 @@ struct cti_drvdata {
>       struct cti_config config;
>       struct list_head node;
>       void (*csdev_release)(struct device *dev);
> +    bool is_qcom_cti;
>   };
> 
>   /*
> diff --git a/drivers/hwtracing/coresight/qcom-cti.h b/drivers/hwtracing/coresight/qcom-cti.h
> new file mode 100644
> index 000000000000..aa41f9425b36
> --- /dev/null
> +++ b/drivers/hwtracing/coresight/qcom-cti.h
> @@ -0,0 +1,136 @@
> +/* SPDX-License-Identifier: GPL-2.0-only */
> +/*
> + * Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries.
> + */
> +#include "coresight-cti.h"
> +
> +#define ARCHITECT_QCOM 0x477
> +
> +#define CTITRIGINSTATUS1 0x1000
> +#define CTITRIGINSTATUS2 0x1001
> +#define CTITRIGINSTATUS3 0x1002
> +
> +#define CTITRIGOUTSTATUS1 0x1003
> +#define CTITRIGOUTSTATUS2 0x1004
> +#define CTITRIGOUTSTATUS3 0x1005
> +
> +#define ITTRIGIN1 0x1006
> +#define ITTRIGIN2 0x1007
> +#define ITTRIGIN3 0x1008
> +
> +#define ITTRIGOUT1 0x1009
> +#define ITTRIGOUT2 0x100A
> +#define ITTRIGOUT3 0x100B
> +
> +#define ITTRIGINACK1 0x100C
> +#define ITTRIGINACK2 0x100D
> +#define ITTRIGINACK3 0x100E
> +
> +#define ITTRIGOUTACK1 0x100F
> +#define ITTRIGOUTACK2 0x1010
> +#define ITTRIGOUTACK3 0x1011
> +/* CTI programming registers */
> +#define    QCOM_CTIINTACK        0x020
> +#define    QCOM_CTIAPPSET        0x004
> +#define    QCOM_CTIAPPCLEAR    0x008
> +#define    QCOM_CTIAPPPULSE    0x00C
> +#define    QCOM_CTIINEN        0x400
> +#define    QCOM_CTIOUTEN        0x800
> +#define    QCOM_CTITRIGINSTATUS    0x040
> +#define    QCOM_CTITRIGINSTATUS1    0x044
> +#define    QCOM_CTITRIGINSTATUS2    0x048
> +#define    QCOM_CTITRIGINSTATUS3    0x04C
> +#define    QCOM_CTITRIGOUTSTATUS    0x060
> +#define    QCOM_CTITRIGOUTSTATUS1    0x064
> +#define    QCOM_CTITRIGOUTSTATUS2    0x068
> +#define    QCOM_CTITRIGOUTSTATUS3    0x06C
> +#define    QCOM_CTICHINSTATUS    0x080
> +#define    QCOM_CTICHOUTSTATUS    0x084
> +#define    QCOM_CTIGATE        0x088
> +#define    QCOM_ASICCTL        0x08c
> +/* Integration test registers */
> +#define    QCOM_ITCHINACK        0xE70
> +#define    QCOM_ITTRIGINACK    0xE80
> +#define    QCOM_ITTRIGINACK1    0xE84
> +#define    QCOM_ITTRIGINACK2    0xE88
> +#define    QCOM_ITTRIGINACK3    0xE8C
> +#define    QCOM_ITCHOUT        0xE74
> +#define    QCOM_ITTRIGOUT        0xEA0
> +#define    QCOM_ITTRIGOUT1        0xEA4
> +#define    QCOM_ITTRIGOUT2        0xEA8
> +#define    QCOM_ITTRIGOUT3        0xEAC
> +#define    QCOM_ITCHOUTACK        0xE78
> +#define    QCOM_ITTRIGOUTACK    0xEC0
> +#define    QCOM_ITTRIGOUTACK1    0xEC4
> +#define    QCOM_ITTRIGOUTACK2    0xEC8
> +#define    QCOM_ITTRIGOUTACK3    0xECC
> +#define    QCOM_ITCHIN        0xE7C
> +#define    QCOM_ITTRIGIN        0xEE0
> +#define    QCOM_ITTRIGIN1        0xEE4
> +#define    QCOM_ITTRIGIN2        0xEE8
> +#define    QCOM_ITTRIGIN3        0xEEC
> +
> +static noinline u32 cti_qcom_reg_off(u32 offset)
> +{
> +    switch (offset) {
> +        case CTIINTACK:        return QCOM_CTIINTACK;
> +        case CTIAPPSET:        return QCOM_CTIAPPSET;
> +        case CTIAPPCLEAR:    return QCOM_CTIAPPCLEAR;
> +        case CTIAPPPULSE:    return QCOM_CTIAPPPULSE;
> +        case CTIINEN(0):    return QCOM_CTIINEN;
> +        case CTIOUTEN(0):    return QCOM_CTIOUTEN;
> +        case CTITRIGINSTATUS:    return QCOM_CTITRIGINSTATUS;
> +        case CTITRIGINSTATUS1:    return QCOM_CTITRIGINSTATUS1;
> +        case CTITRIGINSTATUS2:    return QCOM_CTITRIGINSTATUS2;
> +        case CTITRIGINSTATUS3:    return QCOM_CTITRIGINSTATUS3;
> +        case CTITRIGOUTSTATUS:    return QCOM_CTITRIGOUTSTATUS;
> +        case CTITRIGOUTSTATUS1:    return QCOM_CTITRIGOUTSTATUS1;
> +        case CTITRIGOUTSTATUS2:    return QCOM_CTITRIGOUTSTATUS2;
> +        case CTITRIGOUTSTATUS3:    return QCOM_CTITRIGOUTSTATUS3;
> +        case CTICHINSTATUS:        return QCOM_CTICHINSTATUS;
> +        case CTICHOUTSTATUS:    return QCOM_CTICHOUTSTATUS;
> +        case CTIGATE:        return QCOM_CTIGATE;
> +        case ASICCTL:        return QCOM_ASICCTL;
> +        case ITCHINACK:        return QCOM_ITCHINACK;
> +        case ITTRIGINACK:    return QCOM_ITTRIGINACK;
> +        case ITTRIGINACK1:    return QCOM_ITTRIGINACK1;
> +        case ITTRIGINACK2:    return QCOM_ITTRIGINACK2;
> +        case ITTRIGINACK3:    return QCOM_ITTRIGINACK3;
> +        case ITCHOUT:        return QCOM_ITCHOUT;
> +        case ITTRIGOUT:        return QCOM_ITTRIGOUT;
> +        case ITTRIGOUT1:    return QCOM_ITTRIGOUT1;
> +        case ITTRIGOUT2:    return QCOM_ITTRIGOUT2;
> +        case ITTRIGOUT3:    return QCOM_ITTRIGOUT3;
> +        case ITCHOUTACK:    return QCOM_ITCHOUTACK;
> +        case ITTRIGOUTACK:    return QCOM_ITTRIGOUTACK;
> +        case ITTRIGOUTACK1:    return QCOM_ITTRIGOUTACK1;
> +        case ITTRIGOUTACK2:    return QCOM_ITTRIGOUTACK2;
> +        case ITTRIGOUTACK3:    return QCOM_ITTRIGOUTACK3;
> +        case ITCHIN:               return QCOM_ITCHIN;
> +        case ITTRIGIN:            return QCOM_ITTRIGIN;
> +        case ITTRIGIN1:        return QCOM_ITTRIGIN1;
> +        case ITTRIGIN2:        return QCOM_ITTRIGIN2;
> +        case ITTRIGIN3:        return QCOM_ITTRIGIN3;
> +        default:
> +                    WARN(1, "Unknown offset=%u\n", offset);
> +                    return 0;
> +    }
> +
> +    return 0;
> +}
> +
> +static u32 cti_reg_addr_with_nr(struct cti_drvdata *drvdata,
> +                                          u32 reg, u32 nr)
> +{
> +    /* convert to qcom specific offset */
> +    if (unlikely(drvdata->is_qcom_cti))
> +        reg = cti_qcom_reg_off(reg);
> +
> +    return reg + sizeof(u32) * nr;
> +}
> +
> +static u32 cti_reg_addr(struct cti_drvdata *drvdata, u32 reg)
> +{
> +        return cti_reg_addr_with_nr(drvdata, reg, 0);
> +}
> +
> 
> 



  parent reply	other threads:[~2025-12-09 11:04 UTC|newest]

Thread overview: 26+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-12-02  6:42 [PATCH v6 0/2] Add Qualcomm extended CTI support Yingchao Deng
2025-12-02  6:42 ` [PATCH v6 1/2] coresight: cti: Convert trigger usage fields to dynamic bitmaps and arrays Yingchao Deng
2025-12-04  9:54   ` Mike Leach
2025-12-02  6:42 ` [PATCH v6 2/2] coresight: cti: Add Qualcomm extended CTI support Yingchao Deng
2025-12-03 18:29   ` Leo Yan
2025-12-04  8:38     ` Leo Yan
2025-12-04  9:04       ` Mike Leach
2025-12-04 10:02         ` Leo Yan
2025-12-04  9:07     ` Mike Leach
2025-12-04 10:31       ` Leo Yan
2025-12-04 16:17         ` Mike Leach
2025-12-05 10:04           ` Leo Yan
2025-12-08 14:47             ` Mike Leach
2025-12-09  8:16               ` Yingchao Deng
2025-12-09  9:40                 ` Jie Gan
2025-12-09 11:03                 ` Jie Gan [this message]
2025-12-09 12:42                   ` Yingchao Deng (Consultant)
2025-12-09 12:19                 ` Leo Yan
2025-12-09 12:51                   ` Yingchao Deng (Consultant)
2025-12-09 14:24                     ` Leo Yan
2025-12-09 13:59               ` Leo Yan
2025-12-04  9:15     ` Mike Leach
2025-12-04 10:47       ` Leo Yan
2025-12-04 15:07         ` Mike Leach
2025-12-05 10:27           ` Leo Yan
2025-12-08 14:25             ` Mike Leach

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=d55ed203-b0f4-4453-81cf-1d8dcd6494ed@oss.qualcomm.com \
    --to=jie.gan@oss.qualcomm.com \
    --cc=alexander.shishkin@linux.intel.com \
    --cc=coresight@lists.linaro.org \
    --cc=james.clark@linaro.org \
    --cc=jinlong.mao@oss.qualcomm.com \
    --cc=leo.yan@arm.com \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-arm-msm@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mike.leach@linaro.org \
    --cc=quic_jinlmao@quicinc.com \
    --cc=quic_yingdeng@quicinc.com \
    --cc=suzuki.poulose@arm.com \
    --cc=tingwei.zhang@oss.qualcomm.com \
    --cc=yingchao.deng@oss.qualcomm.com \
    /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.