通用系統互連子系統

簡介

此框架旨在提供一個標準的核心介面來控制 SoC 上互連的設定。這些設定可以是多個互連裝置或功能塊之間的吞吐量、延遲和優先順序。 可以動態地控制這一點,以便節省功率或提供最佳效能。

互連匯流排是具有可配置引數的硬體,可以根據從各種驅動程式收到的請求在資料路徑上設定引數。 互連匯流排的一個示例是晶片組中各個元件或功能塊之間的互連。 SoC 上可以有多個互連,可以是多層的。

下面是真實世界 SoC 互連匯流排拓撲的簡化圖。

+----------------+    +----------------+
| HW Accelerator |--->|      M NoC     |<---------------+
+----------------+    +----------------+                |
                        |      |                    +------------+
 +-----+  +-------------+      V       +------+     |            |
 | DDR |  |                +--------+  | PCIe |     |            |
 +-----+  |                | Slaves |  +------+     |            |
   ^ ^    |                +--------+     |         |   C NoC    |
   | |    V                               V         |            |
+------------------+   +------------------------+   |            |   +-----+
|                  |-->|                        |-->|            |-->| CPU |
|                  |-->|                        |<--|            |   +-----+
|     Mem NoC      |   |         S NoC          |   +------------+
|                  |<--|                        |---------+    |
|                  |<--|                        |<------+ |    |   +--------+
+------------------+   +------------------------+       | |    +-->| Slaves |
  ^  ^    ^    ^          ^                             | |        +--------+
  |  |    |    |          |                             | V
+------+  |  +-----+   +-----+  +---------+   +----------------+   +--------+
| CPUs |  |  | GPU |   | DSP |  | Masters |-->|       P NoC    |-->| Slaves |
+------+  |  +-----+   +-----+  +---------+   +----------------+   +--------+
          |
      +-------+
      | Modem |
      +-------+

術語

互連提供者是互連硬體的軟體定義。 上圖中的互連提供者為 M NoC、S NoC、C NoC、P NoC 和 Mem NoC。

互連節點是互連硬體埠的軟體定義。 每個互連提供者由多個互連節點組成,這些節點連線到其他 SoC 元件,包括其他互連提供者。 圖中 CPU 連線到記憶體的點稱為互連節點,屬於 Mem NoC 互連提供者。

互連端點是路徑的第一個或最後一個元素。 每個端點都是一個節點,但並非每個節點都是一個端點。

互連路徑是兩個端點之間的所有內容,包括必須遍歷才能從源節點到達目標節點的所有節點。 它可能包括跨多個互連提供者的多個主從對。

互連使用者是利用提供者公開的資料路徑的實體。 使用者向提供者傳送請求,請求各種吞吐量、延遲和優先順序。 通常,使用者是裝置驅動程式,它們根據自己的需要傳送請求。 使用者的一個例子是支援各種格式和影像大小的影片解碼器。

互連提供者

互連提供者是一個實現初始化和配置互連匯流排硬體的方法的實體。 互連提供者驅動程式應在互連提供者核心中註冊。

struct icc_node_data

icc 節點資料

定義:

struct icc_node_data {
    struct icc_node *node;
    u32 tag;
};

成員

node

icc 節點

tag

tag

struct icc_onecell_data

onecell 互連提供者的驅動程式資料

定義:

struct icc_onecell_data {
    unsigned int num_nodes;
    struct icc_node *nodes[] ;
};

成員

num_nodes

此裝置中的節點數

nodes

指向此裝置中節點的指標陣列

struct icc_provider

互連提供者(控制器)實體,可以提供多個互連控制

定義:

struct icc_provider {
    struct list_head        provider_list;
    struct list_head        nodes;
    int (*set)(struct icc_node *src, struct icc_node *dst);
    int (*aggregate)(struct icc_node *node, u32 tag, u32 avg_bw, u32 peak_bw, u32 *agg_avg, u32 *agg_peak);
    void (*pre_aggregate)(struct icc_node *node);
    int (*get_bw)(struct icc_node *node, u32 *avg, u32 *peak);
    struct icc_node* (*xlate)(const struct of_phandle_args *spec, void *data);
    struct icc_node_data* (*xlate_extended)(const struct of_phandle_args *spec, void *data);
    struct device           *dev;
    int users;
    bool inter_set;
    void *data;
};

成員

provider_list

已註冊的互連提供者的列表

nodes

互連提供者節點的內部列表

set

指向裝置特定設定操作函式的指標

aggregate

指向裝置特定聚合操作函式的指標

pre_aggregate

指向在聚合開始之前呼叫的裝置特定函式的指標(可選)

get_bw

指向裝置特定函式以獲取當前頻寬的指標

xlate

用於從 phandle 引數對映節點的提供者特定回撥

xlate_extended

用於從 phandle 引數對映節點資料的供應商特定回撥

dev

此互連提供者所屬的裝置

users

活動使用者的計數

inter_set

是否將使用 set 配置提供者間對

data

指向私有資料的指標

struct icc_node

作為互連拓撲一部分的實體

定義:

struct icc_node {
    int id;
    const char              *name;
    struct icc_node         **links;
    size_t num_links;
    struct icc_provider     *provider;
    struct list_head        node_list;
    struct list_head        search_list;
    struct icc_node         *reverse;
    u8 is_traversed:1;
    struct hlist_head       req_list;
    u32 avg_bw;
    u32 peak_bw;
    u32 init_avg;
    u32 init_peak;
    void *data;
};

成員

id

平臺特定節點 ID

name

在 debugfs 中使用的節點名稱

links

指向遍歷時可以轉到的下一個目標的列表

num_links

與其他互連節點的連結數

provider

指向此節點的互連提供者

node_list

父提供程式的“節點”列表中的列表條目

search_list

在遍歷節點圖時使用的列表

reverse

在遍歷節點圖時指向前一個節點的指標

is_traversed

在遍歷節點圖時使用的標誌

req_list

與此節點關聯的 QoS 約束請求列表

avg_bw

來自所有使用者的平均頻寬請求的聚合值

peak_bw

來自所有使用者的峰值頻寬請求的聚合值

init_avg

在初始化期間從硬體讀取的平均頻寬值

init_peak

在初始化期間從硬體讀取的峰值頻寬值

data

指向私有資料的指標

互連使用者

互連使用者是使用互連 API 來獲取端點之間的路徑並設定這些互連路徑的頻寬/延遲/QoS 要求的客戶端。 這些介面目前沒有記錄。

互連 debugfs 介面

像其他幾個子系統一樣,互連將建立一些檔案以用於除錯和內省。 debugfs 中的檔案不被視為 ABI,因此應用程式軟體不應依賴於核心版本之間格式細節的更改。

/sys/kernel/debug/interconnect/interconnect_summary:

顯示系統中所有互連節點及其聚合頻寬請求。 在每個節點下縮排顯示來自每個裝置的頻寬請求。

/sys/kernel/debug/interconnect/interconnect_graph:

以 graphviz dot 格式顯示互連圖。 它顯示了系統中所有的互連節點和連結,並將來自同一提供者的節點分組為子圖。 該格式是人類可讀的,也可以透過 dot 管道傳輸以生成多種圖形格式的圖表。

$ cat /sys/kernel/debug/interconnect/interconnect_graph | \
        dot -Tsvg > interconnect_graph.svg

test-client 目錄提供了用於向任何任意路徑發出 BW 請求的介面。 請注意,出於安全原因,預設情況下停用此功能,而無需 Kconfig 啟用它。 啟用它需要程式碼更改為 #define INTERCONNECT_ALLOW_WRITE_DEBUGFS。 用法示例

cd /sys/kernel/debug/interconnect/test-client/

# Configure node endpoints for the path from CPU to DDR on
# qcom/sm8550.
echo chm_apps > src_node
echo ebi > dst_node

# Get path between src_node and dst_node. This is only
# necessary after updating the node endpoints.
echo 1 > get

# Set desired BW to 1GBps avg and 2GBps peak.
echo 1000000 > avg_bw
echo 2000000 > peak_bw

# Vote for avg_bw and peak_bw on the latest path from "get".
# Voting for multiple paths is possible by repeating this
# process for different nodes endpoints.
echo 1 > commit