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