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),或者作为硬件 I/O 线在芯片外传播。

所有 CTI 设备都与一个 CTM 相关联。在许多系统中,只有一个有效的 CTM(一个 CTM,或多个 CTM 全部互连),但系统可能存在 CTI+CTM 网络,它们之间没有通过 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

如果连接的“in”或“out”触发器中信号为零,则这些参数将被省略。

通道 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) 连接到 channel(0),然后激活 channel(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