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