CoreSight 嵌入式交叉触发 (CTI & CTM)。

作者:

Mike Leach <mike.leach@linaro.org>

日期:

2019 年 11 月

硬件描述

CoreSight 交叉触发接口 (CTI) 是一种硬件设备,它接收来自设备的独立输入和输出硬件信号(称为触发器),并通过交叉触发矩阵 (CTM) 将它们通过编号的通道互连到其他设备,以便在设备之间传播事件。

例如:

0000000  in_trigs  :::::::
0 C   0----------->:     :             +======>(other CTI channel IO)
0  P  0<-----------:     :             v
0   U 0  out_trigs :     : Channels  *****      :::::::
0000000            : CTI :<=========>*CTM*<====>: CTI :---+
#######  in_trigs  :     : (id 0-3)  *****      :::::::   v
# ETM #----------->:     :                         ^   #######
#     #<-----------:     :                         +---# ETR #
####### out_trigs  :::::::                             #######

CTI 驱动程序能够编程 CTI,将触发器附加到通道。当输入触发器变为活动状态时,附加的通道将变为活动状态。附加到该通道的任何输出触发器也将变为活动状态。活动通道通过 CTM 传播到其他 CTI,激活那里的连接输出触发器,除非被 CTI 通道门控过滤。

也可以使用系统软件直接编程 CTI 中的寄存器来激活通道。

系统注册 CTI,使其与 CPU 和/或跟踪数据路径上的其他 CoreSight 设备相关联。当启用这些设备时,也会启用附加的 CTI。默认情况下/在电源开启时,CTI 没有编程的触发器/通道连接,因此在明确编程之前不会影响系统。

CTI 和设备之间的硬件触发器连接是实现定义的,除非 CPU/ETM 组合是 v8 架构,在这种情况下,连接具有架构定义的标准布局。

硬件触发信号也可以连接到非 CoreSight 设备(例如 UART),或作为硬件 IO 线传播到芯片外。

所有 CTI 设备都与 CTM 相关联。在许多系统中,将有一个有效的 CTM(一个 CTM,或多个相互连接的 CTM),但系统也可以具有未通过 CTM 相互连接的 CTI+CTM 网络。在这些系统中,声明一个 CTM 索引,以关联通过给定 CTM 相互连接的 CTI 设备。

Sysfs 文件和目录

CTI 设备与其他 CoreSight 设备一起出现在现有的 CoreSight 总线上

>$ ls /sys/bus/coresight/devices
 cti_cpu0  cti_cpu2  cti_sys0  etm0  etm2  funnel0  replicator0  tmc_etr0
 cti_cpu1  cti_cpu3  cti_sys1  etm1  etm3  funnel1  tmc_etf0     tpiu0

名为 cti_cpu<N> 的 CTI 与 CPU 以及该内核使用的任何 ETM 相关联。 cti_sys<N> CTI 是通用的系统基础设施 CTI,可以与其他 CoreSight 设备或其他能够生成或使用触发信号的系统硬件相关联。

>$ ls /sys/bus/coresight/devices/etm0/cti_cpu0
channels  ctmid  enable  nr_trigger_cons mgmt  power powered  regs
connections subsystem triggers0 triggers1  uevent
关键文件项是:-
  • enable:启用/禁用 CTI。读取以确定当前状态。如果此项显示为启用 (1),但 powered 显示为未供电 (0),则启用表示在设备供电时启用请求。

  • ctmid:关联的 CTM - 仅当系统具有多个未相互连接的 CTI+CTM 集群时才相关。

  • nr_trigger_cons:总连接数 - triggers<N> 目录。

  • powered:读取以确定 CTI 当前是否已供电。

子目录:-
  • triggers<N>:包含单个连接的触发器列表。

  • channels:包含通道 API - CTI 主编程接口。

  • regs:允许访问原始可编程 CTI 寄存器。

  • mgmt:标准 CoreSight 管理寄存器。

  • connections:链接到连接的CoreSight 设备。链接数可以为 0 到 nr_trigger_cons。此目录中由 nr_links 给出的实际数量。

triggers<N> 目录

各个触发器连接信息。这描述了 CoreSight 和非 CoreSight 连接的触发信号。

每个触发器目录都有一组参数,描述连接的触发器。

  • name:连接的名称

  • in_signals:此连接中使用的输入触发信号索引。

  • in_types:输入信号的功能类型。

  • out_signals:此连接的输出触发信号。

  • out_types:输出信号的功能类型。

例如

>$ ls ./cti_cpu0/triggers0/
in_signals  in_types  name  out_signals  out_types
>$ cat ./cti_cpu0/triggers0/name
cpu0
>$ cat ./cti_cpu0/triggers0/out_signals
0-2
>$ cat ./cti_cpu0/triggers0/out_types
pe_edbgreq pe_dbgrestart pe_ctiirq
>$ cat ./cti_cpu0/triggers0/in_signals
0-1
>$ cat ./cti_cpu0/triggers0/in_types
pe_dbgtrigger pe_pmuirq

如果连接在“输入”或“输出”触发器中没有信号,则将省略这些参数。

通道 API 目录

这提供了一种将触发器附加到通道的简单方法,而无需直接操作“regs”子目录元素所需的多个寄存器操作。

许多文件提供了此 API

>$ ls ./cti_sys0/channels/
chan_clear         chan_inuse      chan_xtrigs_out     trigin_attach
chan_free          chan_pulse      chan_xtrigs_reset   trigin_detach
chan_gate_disable  chan_set        chan_xtrigs_sel     trigout_attach
chan_gate_enable   chan_xtrigs_in  trig_filter_enable  trigout_detach
trigout_filtered

对这些元素的大多数访问都采用以下形式

echo <chan> [<trigger>] > /<device_path>/<operation>

可选的 <trigger> 仅在 trigXX_attach | detach 操作中需要。

例如:

>$ echo 0 1 > ./cti_sys0/channels/trigout_attach
>$ echo 0 > ./cti_sys0/channels/chan_set

将 trigout(1) 附加到通道 (0),然后激活通道 (0),在 cti_sys0.trigout(1) 上生成一个设置状态

API 操作

  • trigin_attach, trigout_attach:将通道附加到触发信号。

  • trigin_detach, trigout_detach:从触发信号分离通道。

  • chan_set:设置通道 - 设置状态将传播到 CTM 周围的其他连接设备。

  • chan_clear:清除通道。

  • chan_pulse:将通道设置为单个 CoreSight 时钟周期。

  • chan_gate_enable:写入操作设置 CTI 门控,以将通道传播(启用)到其他设备。此操作需要通道号。默认情况下,在电源启动时,所有通道都会启用 CTI 门控。读取以列出门控上当前启用的通道。

  • chan_gate_disable:写入通道号以禁用该通道的门控。

  • chan_inuse:显示当前附加到任何信号的通道

  • chan_free:显示没有附加信号的通道。

  • chan_xtrigs_sel:写入通道号以选择要查看的通道,读取以显示所选的通道号。

  • chan_xtrigs_in:读取以显示附加到所选视图通道的输入触发器。

  • chan_xtrigs_out:读取以显示附加到所选视图通道的输出触发器。

  • trig_filter_enable:默认为启用,禁用以允许设置潜在的危险输出信号。

  • trigout_filtered:如果启用了过滤 trig_filter_enable,则会阻止设置的触发器输出信号。一种用途是防止意外的 EDBGREQ 信号停止内核。

  • chan_xtrigs_reset:写入 1 以清除所有通道/触发器编程。将设备硬件重置为默认状态。

下面的示例将输入触发器索引 1 附加到通道 2,并将输出触发器索引 6 附加到同一通道。然后,它使用适当的 sysfs 属性检查通道/触发器连接的状态。

这些设置意味着,如果输入触发器 1 或通道 2 变为活动状态,则触发器输出 6 将变为活动状态。然后,我们启用 CTI,并使用软件通道控制来激活通道 2。我们在 choutstatus 寄存器上看到活动通道,在 trigoutstatus 寄存器上看到活动信号。最后,清除通道会将其删除。

例如:

.../cti_sys0/channels# echo 2 1 > trigin_attach
.../cti_sys0/channels# echo 2 6 > trigout_attach
.../cti_sys0/channels# cat chan_free
0-1,3
.../cti_sys0/channels# cat chan_inuse
2
.../cti_sys0/channels# echo 2 > chan_xtrigs_sel
.../cti_sys0/channels# cat chan_xtrigs_trigin
1
.../cti_sys0/channels# cat chan_xtrigs_trigout
6
.../cti_sys0/# echo 1 > enable
.../cti_sys0/channels# echo 2 > chan_set
.../cti_sys0/channels# cat ../regs/choutstatus
0x4
.../cti_sys0/channels# cat ../regs/trigoutstatus
0x40
.../cti_sys0/channels# echo 2 > chan_clear
.../cti_sys0/channels# cat ../regs/trigoutstatus
0x0
.../cti_sys0/channels# cat ../regs/choutstatus
0x0