6-PSCI Power Domain Tree Structure
引流關(guān)鍵詞: 中斷、同步異常、異步異常、irq、fiq、BL1,BL2,BL3,BL31,BL32,BL33,AP_BL1,AP_BL2,AP_BL3,AP_BL31,AP_BL32,AP_BL33,SCP_BL1,SCP_BL2,BL0,BL30, optee、ATF、TF-A、Trustzone、optee3.14、MMU、VMSA、cache、TLB、arm、armv8、armv9、TEE、安全、內(nèi)存管理、頁(yè)表…
快速鏈接:
.
👉👉👉 個(gè)人博客筆記導(dǎo)讀目錄(全部) 👈👈👈
[專欄目錄]-ATF/FF-A/specification學(xué)習(xí)
6. PSCI 電源域樹結(jié)構(gòu)
6.1。要求
(1) 平臺(tái)必須導(dǎo)出plat_get_aff_count()和 plat_get_aff_state()API 以使通用 PSCI 代碼能夠填充描述系統(tǒng)中電源域?qū)哟谓Y(jié)構(gòu)的樹。這種方法不靈活,因?yàn)楦耐負(fù)湫枰拇a。
平臺(tái)在數(shù)據(jù)結(jié)構(gòu)中描述其電源域樹會(huì)簡(jiǎn)單得多。
(2) 通用 PSCI 代碼生成 MPIDR 以填充電源域樹。它還使用 MPIDR 在樹中查找節(jié)點(diǎn)。平臺(tái)將使用與通用 PSCI 代碼生成的完全相同的 MPIDR 的假設(shè)是不可擴(kuò)展的。MPIDR 的使用還將電源域樹中的級(jí)別數(shù)限制為四個(gè)。
因此,需要將 MPIDR 的分配與用于填充電源域拓?fù)錁涞臋C(jī)制分離。
(3) 電源域樹的當(dāng)前排列需要對(duì)特定級(jí)別的兄弟節(jié)點(diǎn)進(jìn)行二進(jìn)制搜索,以找到指定的電源域節(jié)點(diǎn)。在功率管理操作期間,樹從“開始”到“結(jié)束”功率水平遍歷。需要二分查找來查找每個(gè)級(jí)別的節(jié)點(diǎn)。執(zhí)行這種遍歷的自然方法是從葉節(jié)點(diǎn)開始,跟隨父節(jié)點(diǎn)指針到達(dá)結(jié)束層。
因此,需要定義以促進(jìn)這種遍歷的方式實(shí)現(xiàn)樹的數(shù)據(jù)結(jié)構(gòu)。
(4) 核心電源域的屬性不同于更高級(jí)別的電源域的屬性。例如,只能使用 MPIDR 識(shí)別核心電源域。在核心電源域上執(zhí)行電源管理操作時(shí),不需要執(zhí)行狀態(tài)協(xié)調(diào)。
因此,需要以一種便于區(qū)分葉節(jié)點(diǎn)和非葉節(jié)點(diǎn)以及任何相關(guān)優(yōu)化的方式來實(shí)現(xiàn)樹。
6.2. 設(shè)計(jì)
6.2.1. 描述電源域樹
為了滿足要求 1.,現(xiàn)有的平臺(tái) API plat_get_aff_count()和plat_get_aff_state()已被刪除。平臺(tái)必須定義一個(gè)無符號(hào)字符數(shù)組,以便:
(1) 數(shù)組中的第一個(gè)條目指定平臺(tái)中實(shí)現(xiàn)的最高功率級(jí)別的功率域數(shù)量。這適用于電源域樹沒有單個(gè)根節(jié)點(diǎn)的平臺(tái),例如,FVP 在最高級(jí)別 (1) 有兩個(gè)集群電源域。
(2) 每個(gè)后續(xù)條目對(duì)應(yīng)于一個(gè)電源域,并包含作為其直接子級(jí)的電源域的數(shù)量。
(3) 數(shù)組的大小減去第一個(gè)條目將等于非葉電源域的數(shù)量。
(4) 數(shù)組中每個(gè)條目中的值用于查找要在下一級(jí)考慮的條目數(shù)。一個(gè)級(jí)別的所有條目的值的總和(子項(xiàng)數(shù))指定下一個(gè)級(jí)別的數(shù)組中的條目數(shù)。
以下示例電源域拓?fù)錁鋵⒂糜谶M(jìn)一步描述上述文本。這棵樹中的葉節(jié)點(diǎn)和非葉節(jié)點(diǎn)已分別編號(hào)。
+-+|0|+-+/ \/ \/ \/ \/ \/ \/ \/ \/ \/ \+-+ +-+|1| |2|+-+ +-+/ \ / \/ \ / \/ \ / \/ \ / \+-+ +-+ +-+ +-+|3| |4| |5| |6|+-+ +-+ +-+ +-++---+-----+ +----+----| +----+----+ +----+-----+-----+| | | | | | | | | | | | || | | | | | | | | | | | |v v v v v v v v v v v v v +-+ +-+ +-+ +-+ +-+ +-+ +-+ +-+ +-+ +-+ +--+ +--+ +--+ |0| |1| |2| |3| |4| |5| |6| |7| |8| |9| |10| |11| |12| +-+ +-+ +-+ +-+ +-+ +-+ +-+ +-+ +-+ +-+ +--+ +--+ +--+該樹由平臺(tái)定義為上述數(shù)組,如下所示:
#define PLAT_NUM_POWER_DOMAINS 20 #define PLATFORM_CORE_COUNT 13 #define PSCI_NUM_NON_CPU_PWR_DOMAINS \(PLAT_NUM_POWER_DOMAINS - PLATFORM_CORE_COUNT)unsigned char plat_power_domain_tree_desc[] = { 1, 2, 2, 2, 3, 3, 3, 4};6.2.2. 刪除有關(guān)平臺(tái)中使用的 MPIDR 的假設(shè)
為了滿足要求 2.,假設(shè)平臺(tái)在每個(gè)核心電源域0之間分配一個(gè)唯一編號(hào)(核心索引)。MPIDR 可以以任何方式分配,不會(huì)用于填充樹。PLAT_CORE_COUNT - 1
plat_core_pos_by_mpidr(mpidr)將返回與 MPIDR 對(duì)應(yīng)的核心的核心索引。如果傳遞的 MPIDR 未分配或?qū)?yīng)于不存在的核心,它將返回錯(cuò)誤 (-1)。這個(gè)平臺(tái) API 的語(yǔ)義已經(jīng)改變,因?yàn)樗枰?yàn)證傳遞的 MPIDR。因此,它已成為強(qiáng)制性 API。
添加了另一個(gè)強(qiáng)制性 APIplat_my_core_pos()以返回調(diào)用核心的核??心索引。該 API 提供了一種更輕量級(jí)的機(jī)制來獲取索引,因?yàn)椴恍枰?yàn)證調(diào)用核心的 MPIDR。
平臺(tái)應(yīng)分配核心索引(如上圖所示),這樣,如果核心節(jié)點(diǎn)從左到右編號(hào),則核心域的索引將與該核心返回的索引 plat_core_pos_by_mpidr()相同plat_my_core_pos()。這種關(guān)系允許核心節(jié)點(diǎn)被分配到一個(gè)單獨(dú)的數(shù)組中(要求 4.)psci_setup(),其順序是核心在數(shù)組中的索引與這些 API 的返回值相同。
6.2.2.1。處理 MPIDR 分配中的漏洞?
對(duì)于分配的 MPIDR 數(shù)量等于核心電源域數(shù)量的平臺(tái),例如 Juno 和 FVP,將 MPIDR 轉(zhuǎn)換為核心索引的邏輯應(yīng)保持不變。Juno 和 FVP 都使用簡(jiǎn)單的防碰撞哈希函數(shù)來執(zhí)行此操作。
在某些平臺(tái)上,MPIDR 的分配可能不連續(xù)或某些內(nèi)核已被禁用。這實(shí)質(zhì)上意味著 MPIDR 已被稀疏分配,即平臺(tái)使用的 MPIDR 范圍的大小不等于核心電源域的數(shù)量。
平臺(tái)可以采用以下方法之一來處理這種情況:
(1) 實(shí)現(xiàn)更復(fù)雜的邏輯以將有效的 MPIDR 轉(zhuǎn)換為核心索引,同時(shí)保持前面描述的關(guān)系。這意味著電源域樹描述符不會(huì)描述任何被禁用或不存在的核心電源域。不會(huì)在樹中為這些域分配條目。
(2) 將未分配的 MPIDR 和禁用的核心視為不存在,但仍在電源域描述符中描述它們,即描述的核心節(jié)點(diǎn)數(shù)等于分配的 MPIDR 范圍的大小。這種方法將導(dǎo)致內(nèi)存浪費(fèi),因?yàn)闂l目將在樹中分配,但允許使用更簡(jiǎn)單的邏輯將 MPIDR 轉(zhuǎn)換為核心索引。
6.2.3. 遍歷和區(qū)分核心和非核心電源域
為了滿足要求 3 和 4,已經(jīng)定義了單獨(dú)的數(shù)據(jù)結(jié)構(gòu)來表示樹中的葉和非葉功率域節(jié)點(diǎn)。
/******************************************************************************** The following two data structures implement the power domain tree. The tree* is used to track the state of all the nodes i.e. power domain instances* described by the platform. The tree consists of nodes that describe CPU power* domains i.e. leaf nodes and all other power domains which are parents of a* CPU power domain i.e. non-leaf nodes.******************************************************************************/ typedef struct non_cpu_pwr_domain_node {/** Index of the first CPU power domain node level 0 which has this node* as its parent.*/unsigned int cpu_start_idx;/** Number of CPU power domains which are siblings of the domain indexed* by 'cpu_start_idx' i.e. all the domains in the range 'cpu_start_idx* -> cpu_start_idx + ncpus' have this node as their parent.*/unsigned int ncpus;/* Index of the parent power domain node */unsigned int parent_node;----- } non_cpu_pd_node_t;typedef struct cpu_pwr_domain_node {u_register_t mpidr;/* Index of the parent power domain node */unsigned int parent_node;----- } cpu_pd_node_t;功率域樹被實(shí)現(xiàn)為以下數(shù)據(jù)結(jié)構(gòu)的組合。
non_cpu_pd_node_t psci_non_cpu_pd_nodes[PSCI_NUM_NON_CPU_PWR_DOMAINS]; cpu_pd_node_t psci_cpu_pd_nodes[PLATFORM_CORE_COUNT];6.2.4. 填充電源域樹
中的populate_power_domain_tree()函數(shù)psci_setup.c實(shí)現(xiàn)了解析平臺(tái)導(dǎo)出的電源域描述符以填充兩個(gè)數(shù)組的算法。它本質(zhì)上是廣度優(yōu)先搜索。從根開始的每一層的節(jié)點(diǎn)在 psci_non_cpu_pd_nodes和psci_cpu_pd_nodes數(shù)組中依次排列如下:
psci_non_cpu_pd_nodes -> [[Level 3 nodes][Level 2 nodes][Level 1 nodes]] psci_cpu_pd_nodes -> [Level 0 nodes]對(duì)于上面所示的示例電源域樹,psci_cpu_pd_nodes 將按如下方式填充。每個(gè)條目中的值是父節(jié)點(diǎn)的索引。為簡(jiǎn)單起見,其他字段已被忽略。
+-------------+ ^ CPU0 | 3 | |+-------------+ | CPU1 | 3 | |+-------------+ | CPU2 | 3 | |+-------------+ | CPU3 | 4 | |+-------------+ | CPU4 | 4 | |+-------------+ | CPU5 | 4 | | PLATFORM_CORE_COUNT+-------------+ | CPU6 | 5 | |+-------------+ | CPU7 | 5 | |+-------------+ | CPU8 | 5 | |+-------------+ | CPU9 | 6 | |+-------------+ | CPU10 | 6 | |+-------------+ | CPU11 | 6 | |+-------------+ | CPU12 | 6 | v+-------------+該psci_non_cpu_pd_nodes數(shù)組將按如下方式填充。每個(gè)條目中的值是父節(jié)點(diǎn)的索引。
+-------------+ ^ PD0 | -1 | |+-------------+ | PD1 | 0 | |+-------------+ | PD2 | 0 | |+-------------+ | PD3 | 1 | | PLAT_NUM_POWER_DOMAINS -+-------------+ | PLATFORM_CORE_COUNT PD4 | 1 | |+-------------+ | PD5 | 2 | |+-------------+ | PD6 | 2 | |+-------------+ v每個(gè)核心都可以使用該函數(shù)在psci_cpu_pd_nodes數(shù)組 中找到它的節(jié)點(diǎn)。plat_my_core_pos()當(dāng)一個(gè)核心打開時(shí),普通世界提供一個(gè) MPIDR。該plat_core_pos_by_mpidr()函數(shù)用于在使用 MPIDR 查找對(duì)應(yīng)的核心節(jié)點(diǎn)之前驗(yàn)證 MPIDR。非核心功率域節(jié)點(diǎn)不需要被識(shí)別。
總結(jié)
以上是生活随笔為你收集整理的6-PSCI Power Domain Tree Structure的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 5-Interrupt Manageme
- 下一篇: 7-CPU Reset