This series fixes and improves clock usage in the Arm CoreSight drivers.
Based on the DT binding documents, the trace clock (atclk) is defined in
some CoreSight modules, but support is absent. In most cases, the issue
is hidden because the atclk clock is shared by multiple CoreSight
modules and the clock is enabled anyway by other drivers. The first
three patches address this issue.
The programming clock (pclk) management in CoreSight drivers does not
use the devm_XXX() variant APIs, the drivers needs to manually disable
and release clocks for errors and for normal module exit. However, the
drivers miss to disable clocks during module exit. The atclk may also
not be disabled in CoreSight drivers during module exit. By using devm
APIs, patches 04 and 05 fix clock disabling issues.
Another issue is pclk might be enabled twice in init phase - once by
AMBA bus driver, and again by CoreSight drivers. This is fixed in
patch 06.
Patches 07 to 09 refactor the clock related code. Patch 07 consolidats
the clock initialization into a central place. Patch 08 makes the
clock enabling sequence consistent. Patch 09 removes redundant
condition checks and adds error handling in runtime PM.
This series has been verified on Arm64 Hikey960 and Juno platforms.
Changes from v2:
- Updated subjects for patches 04 and 05 (Anshuman).
- Refined condition checking "if (dev_is_amba(dev))" in patch 07
(Anshuman).
Changes from v1:
- Moved the coresight_get_enable_clocks() function into CoreSight core
layer (James).
- Added comments for clock naming "apb_pclk" and "apb" (James).
- Re-ordered patches for easier understanding (Anshuman).
- Minor improvement for commit log in patch 01 (Anshuman).
Signed-off-by: Leo Yan <leo.yan(a)arm.com>
---
Leo Yan (9):
coresight: tmc: Support atclk
coresight: catu: Support atclk
coresight: etm4x: Support atclk
coresight: Appropriately disable programming clocks
coresight: Appropriately disable trace bus clocks
coresight: Avoid enable programming clock duplicately
coresight: Consolidate clock enabling
coresight: Make clock sequence consistent
coresight: Refactor runtime PM
drivers/hwtracing/coresight/coresight-catu.c | 53 ++++++++---------
drivers/hwtracing/coresight/coresight-catu.h | 1 +
drivers/hwtracing/coresight/coresight-core.c | 45 +++++++++++++++
drivers/hwtracing/coresight/coresight-cpu-debug.c | 41 +++++---------
drivers/hwtracing/coresight/coresight-ctcu-core.c | 24 +++-----
drivers/hwtracing/coresight/coresight-etb10.c | 18 ++----
drivers/hwtracing/coresight/coresight-etm3x-core.c | 17 ++----
drivers/hwtracing/coresight/coresight-etm4x-core.c | 32 ++++++-----
drivers/hwtracing/coresight/coresight-etm4x.h | 4 +-
drivers/hwtracing/coresight/coresight-funnel.c | 66 ++++++++--------------
drivers/hwtracing/coresight/coresight-replicator.c | 63 ++++++++-------------
drivers/hwtracing/coresight/coresight-stm.c | 34 +++++------
drivers/hwtracing/coresight/coresight-tmc-core.c | 48 ++++++++--------
drivers/hwtracing/coresight/coresight-tmc.h | 2 +
drivers/hwtracing/coresight/coresight-tpiu.c | 36 +++++-------
include/linux/coresight.h | 30 +---------
16 files changed, 225 insertions(+), 289 deletions(-)
---
base-commit: 408c97c4a5e0b634dcd15bf8b8808b382e888164
change-id: 20250609-arm_cs_fix_clock_v3_public-d546e8bfc852
Best regards,
--
Leo Yan <leo.yan(a)arm.com>
Cc: coresight lists, Leo, James, Mike L
Hello !
Thanks for the report ! In the future, please use
scripts/get_maintainer.pl for the clear list of people/list
for reporting issues.
Response inline, below.
On 20/06/2025 08:21, Keita Morisaki wrote:
> Hello folks,
>
> I am writing to report a WARN_ON message I'm encountering in the
> CoreSight driver on a multi-core ARM system running a 6.12-based kernel.
> The warning appears consistently when disabling an Embedded Trace
> Extension (ETE) source after it has been active. The issue is not
> reproducible when CPUidle is disabled.
>
> The problem occurs because the driver assumes the CoreSight claim
> register is persistent, but it could be reset by the CPUidle power
> management flow. The section B2.3.2 of Arm CoreSight Architecture
> Specification v3.0[1] indicates that the claim register must reset at
> “reset”. A CPU power-up from an idle state can trigger a Cold reset,
> which might explain this behavior.
>
> My ftrace analysis confirms this. I traced the only two functions that
> modify the claim state: coresight_set_claim_tags (which sets the claim)
> and coresight_clear_claim_tags (which is the only part of the kernel
> that writes to CLAIMCLR). The trace shows the claim being set, followed
> by a CPUidle transition, but no subsequent call to
> coresight_clear_claim_tags.
>
> Here are the steps to reproduce the issue:
>
> modprobecoresight_etm4x
>
> # Enable any relevant sink
>
> echo1>/sys/bus/coresight/devices/ete0/enable_source
>
> echo0>/sys/bus/coresight/devices/ete0/enable_source
>
>
> Here is a relevant snippet from the ftrace log that illustrates the
> sequence:
>
> #tracer:function_graph
>
> #
>
> #CPUDURATIONFUNCTIONCALLS
>
> #|||||||
>
> 0)|coresight_claim_device_unlocked[coresight](){
>
> 0)3.750us|coresight_set_claim_tags[coresight]();//Claimissethere
>
> 0)+20.260us|}
>
> 0)|/*psci_domain_idle_enter:cpu_id=0state={Our PSCI parameter value}*///
> CPUgoesidle
>
> 0)|/*psci_domain_idle_exit:cpu_id=0state={Our PSCI parameter value}*///
> CPUwakesup,causingColdreset
>
> ...
>
> 0)(a)309346.3us|coresight_disclaim_device_unlocked[coresight]();//
> TriggersWARN_ON
>
>
> The following WARN_ON [2] is printed because the CLAIMCLR register has
> already been reset at the time coresight_disclaim_device_unlocked is
> called, contrary to the driver's expectation.
>
We have the ETM driver performing the save/restore of ETM context during
a CPUidle. This is only done when the ETM/ETE is described to be loosing
context over PM operation. If this is not done (via DT), the driver
doesn't do anything. This could be problematic. Could you try adding:
"arm,coresight-loses-context-with-cpu"
property to the ETE nodes and see if it makes a difference ?
Kind regards
Suzuki
[0]
https://elixir.bootlin.com/linux/v6.12/source/Documentation/devicetree/bind…
> [416.354181][C0]WARNING:CPU:0PID:0atdrivers/hwtracing/coresight/
> coresight-core.c:187coresight_disclaim_device_unlocked+0x84/0x9c[coresight]
>
> [416.535454][C0]Calltrace:
>
> [416.538606][C0]coresight_disclaim_device_unlocked+0x84/0x9c[coresight]
>
> [416.549359][C0]etm4_disable_hw+0x2d8/0x374[coresight_etm4x]
>
> [416.623310][C0]do_idle+0x1d4/0x264
>
> (Note on tracing: To get this detailed trace, I made two modifications
> to the kernel. First, since the trace_psci_domain_idle_enter/exit events
> are not available in kernel 6.12, I cherry-picked the upstream patch
> 7b7644831e72 [3] to add them. Second, to specifically trace the claim
> functions, I temporarily replaced their inline compiler hints with
> noinline.)
>
> Given the evidence, it appears the driver's assumption that the claim
> register is persistent across CPU power states is incorrect and may need
> to be addressed.
>
> Could you please provide your guidance on this?
>
> Thank you for your time and assistance.
>
> [1] https://developer.arm.com/documentation/ihi0029/latest/ <https://
> developer.arm.com/documentation/ihi0029/latest/>_
> _[2] https://elixir.bootlin.com/linux/v6.12/source/drivers/hwtracing/
> coresight/coresight-core.c#L187 <https://elixir.bootlin.com/linux/v6.12/
> source/drivers/hwtracing/coresight/coresight-core.c#L187>_
> _[3] https://web.git.kernel.org/pub/scm/linux/kernel/git/torvalds/
> linux.git/commit/?id=7b7644831e7276f52a233ec685d13c965fff09d9 <https://
> web.git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?
> id=7b7644831e7276f52a233ec685d13c965fff09d9>
>
> Best regards,
> Keita
On 19/06/2025 4:07 pm, Chelsy Ratnawat wrote:
> Replace calls to scnprintf() with sysfs_emit() in sysfs show functions.
> These helpers are preferred in sysfs callbacks because they automatically
> handle buffer sizing (PAGE_SIZE) and improve safety and readability.
>
> Signed-off-by: Chelsy Ratnawat <chelsyratnawat2001(a)gmail.com>
> ---
> .../hwtracing/coresight/coresight-etm-perf.c | 4 +-
> .../coresight/coresight-etm3x-sysfs.c | 2 +-
> .../coresight/coresight-etm4x-sysfs.c | 108 +++++++++---------
> drivers/hwtracing/coresight/coresight-stm.c | 8 +-
There's two missing from coresight-sysfs.c. Might as well change those
too while were here.
With those changed:
Reviewed-by: James Clark <james.clark(a)linaro.org>
A branch ocsd-main-v1.6.1-rc1 has been released on the OpenCSD github site
This contains a number of bugfixes for issues relating to ETMv4 ETE
speculative trace. See readme for further information.
This has been released to allow for testing and feedback.
Known issues outstanding:
a) TINFO logging has minor issue on periodic TINFO elements.
b) ETMv3 / PTM regression testss failing on return stack tests. Under
investigation as this code is not part of the update.
--
Mike Leach
Principal Engineer, ARM Ltd.
Manchester Design Centre. UK
The Trace Network On Chip (TNOC) is an integration hierarchy which is a
hardware component that integrates the functionalities of TPDA and
funnels. It collects trace from subsystems and transfers it to coresight
sink.
In addition to the generic TNOC mentioned above, there is also a special type
of TNOC called Interconnect TNOC. Unlike the generic TNOC, the Interconnect
TNOC doesn't need ATID. Its primary function is to connect the source of
subsystems to the Aggregator TNOC. Its driver is different from this patch and
will describe it and upstream its driver separately.
Signed-off-by: Yuanfang Zhang <quic_yuanfang(a)quicinc.com>
---
Changes in v9:
- Mention the binding is only for Aggregator TNOC.
- Link to v8: https://lore.kernel.org/r/20250606-trace-noc-v8-0-833f94712c57@quicinc.com
Changes in v8:
- Add sysfs node to expose atid.
- Link to v7: https://lore.kernel.org/r/20250523-trace-noc-v7-0-d65edbab2997@quicinc.com
Changes in v7:
- Move the content in header file into coresight-tnoc.c.
- Use scoped_guard() to replace spin_lock().
- Invoke coresight_trace_id_put_system_id() for registration failure.
- Link to v6: https://lore.kernel.org/r/20250522-trace-noc-v6-0-f5a9bcae90ee@quicinc.com
Changes in v6:
- Add a newline after return statements.
- Use 'x &= foo' to replace 'x = x & foo'.
- Use 'x |= foo' to replace 'x = x | foo'.
- Link to v5: https://lore.kernel.org/r/20250512-trace-noc-v5-0-f2ef070baee5@quicinc.com
Changes in v5:
- update cover-letter to describe the Interconnect TNOC.
- Link to v4: https://lore.kernel.org/r/20250415-trace-noc-v4-0-979938fedfd8@quicinc.com
Changes in v4:
- Fix dt_binding warning.
- update mask of trace_noc amba_id.
- Modify driver comments.
- rename TRACE_NOC_SYN_VAL to TRACE_NOC_SYNC_INTERVAL.
- Link to v3: https://lore.kernel.org/r/20250411-trace-noc-v3-0-1f19ddf7699b@quicinc.com
Changes in v3:
- Remove unnecessary sysfs nodes.
- update commit messages.
- Use 'writel' instead of 'write_relaxed' when writing to the register for the last time.
- Add trace_id ops.
- Link to v2: https://lore.kernel.org/r/20250226-trace-noc-driver-v2-0-8afc6584afc5@quici…
Changes in v2:
- Modified the format of DT binging file.
- Fix compile warnings.
- Link to v1: https://lore.kernel.org/r/46643089-b88d-49dc-be05-7bf0bb21f847@quicinc.com
---
Yuanfang Zhang (2):
dt-bindings: arm: Add device Trace Network On Chip definition
coresight: add coresight Trace Network On Chip driver
.../bindings/arm/qcom,coresight-tnoc.yaml | 113 ++++++++++
drivers/hwtracing/coresight/Kconfig | 13 ++
drivers/hwtracing/coresight/Makefile | 1 +
drivers/hwtracing/coresight/coresight-tnoc.c | 242 +++++++++++++++++++++
4 files changed, 369 insertions(+)
---
base-commit: a2cc6ff5ec8f91bc463fd3b0c26b61166a07eb11
change-id: 20250403-trace-noc-f8286b30408e
Best regards,
--
Yuanfang Zhang <quic_yuanfang(a)quicinc.com>
The Trace Network On Chip (TNOC) is an integration hierarchy which is a
hardware component that integrates the functionalities of TPDA and
funnels. It collects trace from subsystems and transfers it to coresight
sink.
In addition to the generic TNOC mentioned above, there is also a special type
of TNOC called Interconnect TNOC. Unlike the generic TNOC, the Interconnect
TNOC doesn't need ATID. Its primary function is to connect the source of
subsystems to the Aggregator TNOC. Its driver is different from this patch and
will describe it and upstream its driver separately.
Signed-off-by: Yuanfang Zhang <quic_yuanfang(a)quicinc.com>
---
Changes in v8:
- Add sysfs node to expose atid.
- Link to v7: https://lore.kernel.org/r/20250523-trace-noc-v7-0-d65edbab2997@quicinc.com
Changes in v7:
- Move the content in header file into coresight-tnoc.c.
- Use scoped_guard() to replace spin_lock().
- Invoke coresight_trace_id_put_system_id() for registration failure.
- Link to v6: https://lore.kernel.org/r/20250522-trace-noc-v6-0-f5a9bcae90ee@quicinc.com
Changes in v6:
- Add a newline after return statements.
- Use 'x &= foo' to replace 'x = x & foo'.
- Use 'x |= foo' to replace 'x = x | foo'.
- Link to v5: https://lore.kernel.org/r/20250512-trace-noc-v5-0-f2ef070baee5@quicinc.com
Changes in v5:
- update cover-letter to describe the Interconnect TNOC.
- Link to v4: https://lore.kernel.org/r/20250415-trace-noc-v4-0-979938fedfd8@quicinc.com
Changes in v4:
- Fix dt_binding warning.
- update mask of trace_noc amba_id.
- Modify driver comments.
- rename TRACE_NOC_SYN_VAL to TRACE_NOC_SYNC_INTERVAL.
- Link to v3: https://lore.kernel.org/r/20250411-trace-noc-v3-0-1f19ddf7699b@quicinc.com
Changes in v3:
- Remove unnecessary sysfs nodes.
- update commit messages.
- Use 'writel' instead of 'write_relaxed' when writing to the register for the last time.
- Add trace_id ops.
- Link to v2: https://lore.kernel.org/r/20250226-trace-noc-driver-v2-0-8afc6584afc5@quici…
Changes in v2:
- Modified the format of DT binging file.
- Fix compile warnings.
- Link to v1: https://lore.kernel.org/r/46643089-b88d-49dc-be05-7bf0bb21f847@quicinc.com
---
Yuanfang Zhang (2):
dt-bindings: arm: Add device Trace Network On Chip definition
coresight: add coresight Trace Network On Chip driver
.../bindings/arm/qcom,coresight-tnoc.yaml | 111 ++++++++++
drivers/hwtracing/coresight/Kconfig | 13 ++
drivers/hwtracing/coresight/Makefile | 1 +
drivers/hwtracing/coresight/coresight-tnoc.c | 242 +++++++++++++++++++++
4 files changed, 367 insertions(+)
---
base-commit: a2cc6ff5ec8f91bc463fd3b0c26b61166a07eb11
change-id: 20250403-trace-noc-f8286b30408e
Best regards,
--
Yuanfang Zhang <quic_yuanfang(a)quicinc.com>
The Trace Network On Chip (TNOC) is an integration hierarchy which is a
hardware component that integrates the functionalities of TPDA and
funnels. It collects trace from subsystems and transfers it to coresight
sink.
In addition to the generic TNOC mentioned above, there is also a special type
of TNOC called Interconnect TNOC. Unlike the generic TNOC, the Interconnect
TNOC doesn't need ATID. Its primary function is to connect the source of
subsystems to the Aggregator TNOC. Its driver is different from this patch and
will describe it and upstream its driver separately.
Signed-off-by: Yuanfang Zhang <quic_yuanfang(a)quicinc.com>
---
Changes in v6:
- Add a newline after return statements.
- Use 'x &= foo' to replace 'x = x & foo'.
- Use 'x |= foo' to replace 'x = x | foo'.
- Link to v5: https://lore.kernel.org/r/20250512-trace-noc-v5-0-f2ef070baee5@quicinc.com
Changes in v5:
- update cover-letter to describe the Interconnect TNOC.
- Link to v4: https://lore.kernel.org/r/20250415-trace-noc-v4-0-979938fedfd8@quicinc.com
Changes in v4:
- Fix dt_binding warning.
- update mask of trace_noc amba_id.
- Modify driver comments.
- rename TRACE_NOC_SYN_VAL to TRACE_NOC_SYNC_INTERVAL.
- Link to v3: https://lore.kernel.org/r/20250411-trace-noc-v3-0-1f19ddf7699b@quicinc.com
Changes in v3:
- Remove unnecessary sysfs nodes.
- update commit messages.
- Use 'writel' instead of 'write_relaxed' when writing to the register for the last time.
- Add trace_id ops.
- Link to v2: https://lore.kernel.org/r/20250226-trace-noc-driver-v2-0-8afc6584afc5@quici…
Changes in v2:
- Modified the format of DT binging file.
- Fix compile warnings.
- Link to v1: https://lore.kernel.org/r/46643089-b88d-49dc-be05-7bf0bb21f847@quicinc.com
---
Yuanfang Zhang (2):
dt-bindings: arm: Add device Trace Network On Chip definition
coresight: add coresight Trace Network On Chip driver
.../bindings/arm/qcom,coresight-tnoc.yaml | 111 ++++++++++++
drivers/hwtracing/coresight/Kconfig | 13 ++
drivers/hwtracing/coresight/Makefile | 1 +
drivers/hwtracing/coresight/coresight-tnoc.c | 192 +++++++++++++++++++++
drivers/hwtracing/coresight/coresight-tnoc.h | 34 ++++
5 files changed, 351 insertions(+)
---
base-commit: a2cc6ff5ec8f91bc463fd3b0c26b61166a07eb11
change-id: 20250403-trace-noc-f8286b30408e
Best regards,
--
Yuanfang Zhang <quic_yuanfang(a)quicinc.com>
Hi,
We are looking for console options( output only) for the SCP(system control processor)cores in our SOC other than UART
and was considering STM as an option.
Something like this,
SCP ----> STM ---> ETR ---> DDR <--- Linux
On the Linux system, some user space scripts can retrieve the ETR trace buffers and move it to a file on a periodic basis.
Do you see any basic issue with this approach or have better alternatives to suggest ?
Few issues we could think of,
1. SCP wont be able to route the messages to the STM -> ETR path until those are initialized by
the Linux user space. Hence any messages until Linux comes up need to be buffered in the SCP local memory
and should get flushed once the STM - ETR path is ready.
2. Possible message loss due to buffer overwrite
We might have to reserve the ETR trace buffers only to the SCP and keep sufficiently large buffers to reduce the message loss.
Assume that reserving a STM port for use by an external core can be achieved from the Linux STM sysfs interface.
Thanks,
Linu Cherian.