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