The self hosted claim tag will be reset on device probe in a later
commit. We'll want to do this before coresight_register() is called so
won't have a coresight_device and have to use cs_access instead.
Signed-off-by: James Clark <james.clark@linaro.org>
---
drivers/hwtracing/coresight/coresight-catu.c | 2 +-
drivers/hwtracing/coresight/coresight-core.c | 45 ++++++++-----------
.../hwtracing/coresight/coresight-cti-core.c | 6 +--
drivers/hwtracing/coresight/coresight-etb10.c | 2 +-
.../coresight/coresight-etm3x-core.c | 4 +-
.../coresight/coresight-etm4x-core.c | 2 +-
.../hwtracing/coresight/coresight-funnel.c | 2 +-
.../coresight/coresight-replicator.c | 4 +-
.../hwtracing/coresight/coresight-tmc-etf.c | 8 ++--
.../hwtracing/coresight/coresight-tmc-etr.c | 4 +-
include/linux/coresight.h | 4 +-
11 files changed, 38 insertions(+), 45 deletions(-)
diff --git a/drivers/hwtracing/coresight/coresight-catu.c b/drivers/hwtracing/coresight/coresight-catu.c
index 275cc0d9f505..d9259c0b6e64 100644
--- a/drivers/hwtracing/coresight/coresight-catu.c
+++ b/drivers/hwtracing/coresight/coresight-catu.c
@@ -474,7 +474,7 @@ static int catu_disable_hw(struct catu_drvdata *drvdata)
struct coresight_device *csdev = drvdata->csdev;
catu_write_control(drvdata, 0);
- coresight_disclaim_device_unlocked(csdev);
+ coresight_disclaim_device_unlocked(&csdev->access);
if (catu_wait_for_ready(drvdata)) {
dev_info(dev, "Timeout while waiting for READY\n");
rc = -EAGAIN;
diff --git a/drivers/hwtracing/coresight/coresight-core.c b/drivers/hwtracing/coresight/coresight-core.c
index 523dbb381f90..a669872b4118 100644
--- a/drivers/hwtracing/coresight/coresight-core.c
+++ b/drivers/hwtracing/coresight/coresight-core.c
@@ -127,31 +127,31 @@ coresight_find_out_connection(struct coresight_device *csdev,
return ERR_PTR(-ENODEV);
}
-static inline u32 coresight_read_claim_tags(struct coresight_device *csdev)
+static inline u32 coresight_read_claim_tags(struct csdev_access *csa)
{
- return csdev_access_relaxed_read32(&csdev->access, CORESIGHT_CLAIMCLR);
+ return csdev_access_relaxed_read32(csa, CORESIGHT_CLAIMCLR);
}
-static inline bool coresight_is_claimed_self_hosted(struct coresight_device *csdev)
+static inline bool coresight_is_claimed_self_hosted(struct csdev_access *csa)
{
- return coresight_read_claim_tags(csdev) == CORESIGHT_CLAIM_SELF_HOSTED;
+ return coresight_read_claim_tags(csa) == CORESIGHT_CLAIM_SELF_HOSTED;
}
static inline bool coresight_is_claimed_any(struct coresight_device *csdev)
{
- return coresight_read_claim_tags(csdev) != 0;
+ return coresight_read_claim_tags(&csdev->access) != 0;
}
-static inline void coresight_set_self_claim_tag(struct coresight_device *csdev)
+static inline void coresight_set_self_claim_tag(struct csdev_access *csa)
{
- csdev_access_relaxed_write32(&csdev->access, CORESIGHT_CLAIM_SELF_HOSTED,
+ csdev_access_relaxed_write32(csa, CORESIGHT_CLAIM_SELF_HOSTED,
CORESIGHT_CLAIMSET);
isb();
}
-static inline void coresight_clear_self_claim_tag(struct coresight_device *csdev)
+static inline void coresight_clear_self_claim_tag(struct csdev_access *csa)
{
- csdev_access_relaxed_write32(&csdev->access, CORESIGHT_CLAIM_SELF_HOSTED,
+ csdev_access_relaxed_write32(csa, CORESIGHT_CLAIM_SELF_HOSTED,
CORESIGHT_CLAIMCLR);
isb();
}
@@ -174,11 +174,11 @@ int coresight_claim_device_unlocked(struct coresight_device *csdev)
if (coresight_is_claimed_any(csdev))
return -EBUSY;
- coresight_set_self_claim_tag(csdev);
- if (coresight_is_claimed_self_hosted(csdev))
+ coresight_set_self_claim_tag(&csdev->access);
+ if (coresight_is_claimed_self_hosted(&csdev->access))
return 0;
/* There was a race setting the tag, clean up and fail */
- coresight_clear_self_claim_tag(csdev);
+ coresight_clear_self_claim_tag(&csdev->access);
return -EBUSY;
}
EXPORT_SYMBOL_GPL(coresight_claim_device_unlocked);
@@ -202,14 +202,10 @@ EXPORT_SYMBOL_GPL(coresight_claim_device);
* coresight_disclaim_device_unlocked : Clear the claim tag for the device.
* Called with CS_UNLOCKed for the component.
*/
-void coresight_disclaim_device_unlocked(struct coresight_device *csdev)
+void coresight_disclaim_device_unlocked(struct csdev_access *csa)
{
-
- if (WARN_ON(!csdev))
- return;
-
- if (coresight_is_claimed_self_hosted(csdev))
- coresight_clear_self_claim_tag(csdev);
+ if (coresight_is_claimed_self_hosted(csa))
+ coresight_clear_self_claim_tag(csa);
else
/*
* The external agent may have not honoured our claim
@@ -220,14 +216,11 @@ void coresight_disclaim_device_unlocked(struct coresight_device *csdev)
}
EXPORT_SYMBOL_GPL(coresight_disclaim_device_unlocked);
-void coresight_disclaim_device(struct coresight_device *csdev)
+void coresight_disclaim_device(struct csdev_access *csa)
{
- if (WARN_ON(!csdev))
- return;
-
- CS_UNLOCK(csdev->access.base);
- coresight_disclaim_device_unlocked(csdev);
- CS_LOCK(csdev->access.base);
+ CS_UNLOCK(csa->base);
+ coresight_disclaim_device_unlocked(csa);
+ CS_LOCK(csa->base);
}
EXPORT_SYMBOL_GPL(coresight_disclaim_device);
diff --git a/drivers/hwtracing/coresight/coresight-cti-core.c b/drivers/hwtracing/coresight/coresight-cti-core.c
index d2b5a5718c29..073f67a41af9 100644
--- a/drivers/hwtracing/coresight/coresight-cti-core.c
+++ b/drivers/hwtracing/coresight/coresight-cti-core.c
@@ -175,7 +175,7 @@ static int cti_disable_hw(struct cti_drvdata *drvdata)
writel_relaxed(0, drvdata->base + CTICONTROL);
config->hw_enabled = false;
- coresight_disclaim_device_unlocked(csdev);
+ coresight_disclaim_device_unlocked(&csdev->access);
CS_LOCK(drvdata->base);
spin_unlock(&drvdata->spinlock);
return ret;
@@ -683,7 +683,7 @@ static int cti_cpu_pm_notify(struct notifier_block *nb, unsigned long cmd,
/* CTI regs all static - we have a copy & nothing to save */
drvdata->config.hw_powered = false;
if (drvdata->config.hw_enabled)
- coresight_disclaim_device(csdev);
+ coresight_disclaim_device(&csdev->access);
break;
case CPU_PM_ENTER_FAILED:
@@ -746,7 +746,7 @@ static int cti_dying_cpu(unsigned int cpu)
spin_lock(&drvdata->spinlock);
drvdata->config.hw_powered = false;
if (drvdata->config.hw_enabled)
- coresight_disclaim_device(drvdata->csdev);
+ coresight_disclaim_device(&drvdata->csdev->access);
spin_unlock(&drvdata->spinlock);
return 0;
}
diff --git a/drivers/hwtracing/coresight/coresight-etb10.c b/drivers/hwtracing/coresight/coresight-etb10.c
index aea9ac9c4bd0..d8bc3e776c88 100644
--- a/drivers/hwtracing/coresight/coresight-etb10.c
+++ b/drivers/hwtracing/coresight/coresight-etb10.c
@@ -344,7 +344,7 @@ static void etb_disable_hw(struct etb_drvdata *drvdata)
{
__etb_disable_hw(drvdata);
etb_dump_hw(drvdata);
- coresight_disclaim_device(drvdata->csdev);
+ coresight_disclaim_device(&drvdata->csdev->access);
}
static int etb_disable(struct coresight_device *csdev)
diff --git a/drivers/hwtracing/coresight/coresight-etm3x-core.c b/drivers/hwtracing/coresight/coresight-etm3x-core.c
index c103f4c70f5d..509f53b69e42 100644
--- a/drivers/hwtracing/coresight/coresight-etm3x-core.c
+++ b/drivers/hwtracing/coresight/coresight-etm3x-core.c
@@ -599,7 +599,7 @@ static void etm_disable_hw(void *info)
config->cntr_val[i] = etm_readl(drvdata, ETMCNTVRn(i));
etm_set_pwrdwn(drvdata);
- coresight_disclaim_device_unlocked(csdev);
+ coresight_disclaim_device_unlocked(&csdev->access);
CS_LOCK(drvdata->base);
@@ -624,7 +624,7 @@ static void etm_disable_perf(struct coresight_device *csdev)
* power down the tracer.
*/
etm_set_pwrdwn(drvdata);
- coresight_disclaim_device_unlocked(csdev);
+ coresight_disclaim_device_unlocked(&csdev->access);
CS_LOCK(drvdata->base);
diff --git a/drivers/hwtracing/coresight/coresight-etm4x-core.c b/drivers/hwtracing/coresight/coresight-etm4x-core.c
index dd8c74f893db..45b30a4b3eba 100644
--- a/drivers/hwtracing/coresight/coresight-etm4x-core.c
+++ b/drivers/hwtracing/coresight/coresight-etm4x-core.c
@@ -922,7 +922,7 @@ static void etm4_disable_hw(void *info)
etm4x_relaxed_read32(csa, TRCCNTVRn(i));
}
- coresight_disclaim_device_unlocked(csdev);
+ coresight_disclaim_device_unlocked(&csdev->access);
etm4_cs_lock(drvdata, csa);
dev_dbg(&drvdata->csdev->dev,
diff --git a/drivers/hwtracing/coresight/coresight-funnel.c b/drivers/hwtracing/coresight/coresight-funnel.c
index 8faf51469bb8..e986922d555b 100644
--- a/drivers/hwtracing/coresight/coresight-funnel.c
+++ b/drivers/hwtracing/coresight/coresight-funnel.c
@@ -116,7 +116,7 @@ static void dynamic_funnel_disable_hw(struct funnel_drvdata *drvdata,
/* Disclaim the device if none of the slaves are now active */
if (!(functl & FUNNEL_ENSx_MASK))
- coresight_disclaim_device_unlocked(csdev);
+ coresight_disclaim_device_unlocked(&csdev->access);
CS_LOCK(drvdata->base);
}
diff --git a/drivers/hwtracing/coresight/coresight-replicator.c b/drivers/hwtracing/coresight/coresight-replicator.c
index a1181c9048c0..5d42a9a8c460 100644
--- a/drivers/hwtracing/coresight/coresight-replicator.c
+++ b/drivers/hwtracing/coresight/coresight-replicator.c
@@ -54,7 +54,7 @@ static void dynamic_replicator_reset(struct replicator_drvdata *drvdata)
if (!coresight_claim_device_unlocked(csdev)) {
writel_relaxed(0xff, drvdata->base + REPLICATOR_IDFILTER0);
writel_relaxed(0xff, drvdata->base + REPLICATOR_IDFILTER1);
- coresight_disclaim_device_unlocked(csdev);
+ coresight_disclaim_device_unlocked(&csdev->access);
}
CS_LOCK(drvdata->base);
@@ -167,7 +167,7 @@ static void dynamic_replicator_disable(struct replicator_drvdata *drvdata,
if ((readl_relaxed(drvdata->base + REPLICATOR_IDFILTER0) == 0xff) &&
(readl_relaxed(drvdata->base + REPLICATOR_IDFILTER1) == 0xff))
- coresight_disclaim_device_unlocked(csdev);
+ coresight_disclaim_device_unlocked(&csdev->access);
CS_LOCK(drvdata->base);
}
diff --git a/drivers/hwtracing/coresight/coresight-tmc-etf.c b/drivers/hwtracing/coresight/coresight-tmc-etf.c
index d4f641cd9de6..1e4d874a8448 100644
--- a/drivers/hwtracing/coresight/coresight-tmc-etf.c
+++ b/drivers/hwtracing/coresight/coresight-tmc-etf.c
@@ -53,7 +53,7 @@ static int tmc_etb_enable_hw(struct tmc_drvdata *drvdata)
rc = __tmc_etb_enable_hw(drvdata);
if (rc)
- coresight_disclaim_device(drvdata->csdev);
+ coresight_disclaim_device(&drvdata->csdev->access);
return rc;
}
@@ -99,7 +99,7 @@ static void __tmc_etb_disable_hw(struct tmc_drvdata *drvdata)
static void tmc_etb_disable_hw(struct tmc_drvdata *drvdata)
{
__tmc_etb_disable_hw(drvdata);
- coresight_disclaim_device(drvdata->csdev);
+ coresight_disclaim_device(&drvdata->csdev->access);
}
static int __tmc_etf_enable_hw(struct tmc_drvdata *drvdata)
@@ -136,7 +136,7 @@ static int tmc_etf_enable_hw(struct tmc_drvdata *drvdata)
rc = __tmc_etf_enable_hw(drvdata);
if (rc)
- coresight_disclaim_device(drvdata->csdev);
+ coresight_disclaim_device(&drvdata->csdev->access);
return rc;
}
@@ -148,7 +148,7 @@ static void tmc_etf_disable_hw(struct tmc_drvdata *drvdata)
tmc_flush_and_stop(drvdata);
tmc_disable_hw(drvdata);
- coresight_disclaim_device_unlocked(csdev);
+ coresight_disclaim_device_unlocked(&csdev->access);
CS_LOCK(drvdata->base);
}
diff --git a/drivers/hwtracing/coresight/coresight-tmc-etr.c b/drivers/hwtracing/coresight/coresight-tmc-etr.c
index a48bb85d0e7f..7ba4f79191de 100644
--- a/drivers/hwtracing/coresight/coresight-tmc-etr.c
+++ b/drivers/hwtracing/coresight/coresight-tmc-etr.c
@@ -1066,7 +1066,7 @@ static int tmc_etr_enable_hw(struct tmc_drvdata *drvdata,
rc = __tmc_etr_enable_hw(drvdata);
if (rc) {
drvdata->etr_buf = NULL;
- coresight_disclaim_device(drvdata->csdev);
+ coresight_disclaim_device(&drvdata->csdev->access);
}
}
@@ -1156,7 +1156,7 @@ static void __tmc_etr_disable_hw(struct tmc_drvdata *drvdata)
void tmc_etr_disable_hw(struct tmc_drvdata *drvdata)
{
__tmc_etr_disable_hw(drvdata);
- coresight_disclaim_device(drvdata->csdev);
+ coresight_disclaim_device(&drvdata->csdev->access);
/* Reset the ETR buf used by hardware */
drvdata->etr_buf = NULL;
}
diff --git a/include/linux/coresight.h b/include/linux/coresight.h
index 17276965ff1d..937931d107e0 100644
--- a/include/linux/coresight.h
+++ b/include/linux/coresight.h
@@ -653,8 +653,8 @@ extern int coresight_timeout(struct csdev_access *csa, u32 offset,
extern int coresight_claim_device(struct coresight_device *csdev);
extern int coresight_claim_device_unlocked(struct coresight_device *csdev);
-extern void coresight_disclaim_device(struct coresight_device *csdev);
-extern void coresight_disclaim_device_unlocked(struct coresight_device *csdev);
+extern void coresight_disclaim_device(struct csdev_access *csa);
+extern void coresight_disclaim_device_unlocked(struct csdev_access *csa);
extern char *coresight_alloc_device_name(struct coresight_dev_list *devs,
struct device *dev);
--
2.34.1
On Tue, Feb 11, 2025 at 10:39:38AM +0000, James Clark wrote:
[...]
> static inline bool coresight_is_claimed_any(struct coresight_device *csdev)
> {
> - return coresight_read_claim_tags(csdev) != 0;
> + return coresight_read_claim_tags(&csdev->access) != 0;
> }
Likewise other claim functions, can coresight_is_claimed_any() change its
argument type from struct coresight_device to struct csdev_access?
Thanks,
Leo
On 13/03/2025 2:54 pm, Leo Yan wrote:
> On Tue, Feb 11, 2025 at 10:39:38AM +0000, James Clark wrote:
>
> [...]
>
>> static inline bool coresight_is_claimed_any(struct coresight_device *csdev)
>> {
>> - return coresight_read_claim_tags(csdev) != 0;
>> + return coresight_read_claim_tags(&csdev->access) != 0;
>> }
>
> Likewise other claim functions, can coresight_is_claimed_any() change its
> argument type from struct coresight_device to struct csdev_access?
>
> Thanks,
> Leo
I only wanted to change the ones that I had to. I think we should
prioritize passing csdev as much as possible in the coresight framework
to make everything consistent. Otherwise it's extra churn for no
benefit, and if we need something from csdev here in the future we'll
have to change this one back again.
On Mon, Mar 17, 2025 at 11:36:40AM +0000, James Clark wrote:
>
>
> On 13/03/2025 2:54 pm, Leo Yan wrote:
> > On Tue, Feb 11, 2025 at 10:39:38AM +0000, James Clark wrote:
> >
> > [...]
> >
> > > static inline bool coresight_is_claimed_any(struct coresight_device *csdev)
> > > {
> > > - return coresight_read_claim_tags(csdev) != 0;
> > > + return coresight_read_claim_tags(&csdev->access) != 0;
> > > }
> >
> > Likewise other claim functions, can coresight_is_claimed_any() change its
> > argument type from struct coresight_device to struct csdev_access?
>
> I only wanted to change the ones that I had to. I think we should prioritize
> passing csdev as much as possible in the coresight framework to make
> everything consistent. Otherwise it's extra churn for no benefit, and if we
> need something from csdev here in the future we'll have to change this one
> back again.
The function coresight_is_claimed_any() has been deleted in a later
patch. So this is fine for me.
In theory, claim tags are low level operations and don't need a
CoreSight device context, I prefer we can keep them as simple as
possible.
With this series, we can see coresight_claim_device() and
coresight_disclaim_device() are inconsistent for their parameters:
one is using "struct coresight_device *" and another is
"struct csdev_access *". Maybe we just proceed to use csdev_access
for all claim tag functions?
If later we need to use a CoreSight device context when operating
claim tags, it means we might have different scenarios and we can
handle that separately.
Thanks,
Leo
On 17/03/2025 6:29 pm, Leo Yan wrote:
> On Mon, Mar 17, 2025 at 11:36:40AM +0000, James Clark wrote:
>>
>>
>> On 13/03/2025 2:54 pm, Leo Yan wrote:
>>> On Tue, Feb 11, 2025 at 10:39:38AM +0000, James Clark wrote:
>>>
>>> [...]
>>>
>>>> static inline bool coresight_is_claimed_any(struct coresight_device *csdev)
>>>> {
>>>> - return coresight_read_claim_tags(csdev) != 0;
>>>> + return coresight_read_claim_tags(&csdev->access) != 0;
>>>> }
>>>
>>> Likewise other claim functions, can coresight_is_claimed_any() change its
>>> argument type from struct coresight_device to struct csdev_access?
>>
>> I only wanted to change the ones that I had to. I think we should prioritize
>> passing csdev as much as possible in the coresight framework to make
>> everything consistent. Otherwise it's extra churn for no benefit, and if we
>> need something from csdev here in the future we'll have to change this one
>> back again.
>
> The function coresight_is_claimed_any() has been deleted in a later
> patch. So this is fine for me.
>
> In theory, claim tags are low level operations and don't need a
> CoreSight device context, I prefer we can keep them as simple as
> possible.
>
> With this series, we can see coresight_claim_device() and
> coresight_disclaim_device() are inconsistent for their parameters:
> one is using "struct coresight_device *" and another is
> "struct csdev_access *". Maybe we just proceed to use csdev_access
> for all claim tag functions?
>
That's because coresight_claim_device() has logging which requires the
device name to make it useful. If anything, coresight_disclaim_device()
should actually take a csdev and then print a better log message. I
don't think there's a way to make it consistent when there are different
requirements for each level of operations. The ones with logging need a
csdev and the lower level ones used on probe need to work with only csa.
> If later we need to use a CoreSight device context when operating
> claim tags, it means we might have different scenarios and we can
> handle that separately.
>
> Thanks,
> Leo
© 2016 - 2025 Red Hat, Inc.