6-PSCI Power Domain Tree Structure
引流關鍵詞: 中斷、同步異常、異步異常、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、安全、內存管理、頁表…
快速鏈接:
.
👉👉👉 個人博客筆記導讀目錄(全部) 👈👈👈
[專欄目錄]-ATF/FF-A/specification學習
6. PSCI 電源域樹結構
6.1。要求
(1) 平臺必須導出plat_get_aff_count()和 plat_get_aff_state()API 以使通用 PSCI 代碼能夠填充描述系統中電源域層次結構的樹。這種方法不靈活,因為更改拓撲需要更改代碼。
平臺在數據結構中描述其電源域樹會簡單得多。
(2) 通用 PSCI 代碼生成 MPIDR 以填充電源域樹。它還使用 MPIDR 在樹中查找節點。平臺將使用與通用 PSCI 代碼生成的完全相同的 MPIDR 的假設是不可擴展的。MPIDR 的使用還將電源域樹中的級別數限制為四個。
因此,需要將 MPIDR 的分配與用于填充電源域拓撲樹的機制分離。
(3) 電源域樹的當前排列需要對特定級別的兄弟節點進行二進制搜索,以找到指定的電源域節點。在功率管理操作期間,樹從“開始”到“結束”功率水平遍歷。需要二分查找來查找每個級別的節點。執行這種遍歷的自然方法是從葉節點開始,跟隨父節點指針到達結束層。
因此,需要定義以促進這種遍歷的方式實現樹的數據結構。
(4) 核心電源域的屬性不同于更高級別的電源域的屬性。例如,只能使用 MPIDR 識別核心電源域。在核心電源域上執行電源管理操作時,不需要執行狀態協調。
因此,需要以一種便于區分葉節點和非葉節點以及任何相關優化的方式來實現樹。
6.2. 設計
6.2.1. 描述電源域樹
為了滿足要求 1.,現有的平臺 API plat_get_aff_count()和plat_get_aff_state()已被刪除。平臺必須定義一個無符號字符數組,以便:
(1) 數組中的第一個條目指定平臺中實現的最高功率級別的功率域數量。這適用于電源域樹沒有單個根節點的平臺,例如,FVP 在最高級別 (1) 有兩個集群電源域。
(2) 每個后續條目對應于一個電源域,并包含作為其直接子級的電源域的數量。
(3) 數組的大小減去第一個條目將等于非葉電源域的數量。
(4) 數組中每個條目中的值用于查找要在下一級考慮的條目數。一個級別的所有條目的值的總和(子項數)指定下一個級別的數組中的條目數。
以下示例電源域拓撲樹將用于進一步描述上述文本。這棵樹中的葉節點和非葉節點已分別編號。
+-+|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| +-+ +-+ +-+ +-+ +-+ +-+ +-+ +-+ +-+ +-+ +--+ +--+ +--+該樹由平臺定義為上述數組,如下所示:
#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. 刪除有關平臺中使用的 MPIDR 的假設
為了滿足要求 2.,假設平臺在每個核心電源域0之間分配一個唯一編號(核心索引)。MPIDR 可以以任何方式分配,不會用于填充樹。PLAT_CORE_COUNT - 1
plat_core_pos_by_mpidr(mpidr)將返回與 MPIDR 對應的核心的核心索引。如果傳遞的 MPIDR 未分配或對應于不存在的核心,它將返回錯誤 (-1)。這個平臺 API 的語義已經改變,因為它需要驗證傳遞的 MPIDR。因此,它已成為強制性 API。
添加了另一個強制性 APIplat_my_core_pos()以返回調用核心的核??心索引。該 API 提供了一種更輕量級的機制來獲取索引,因為不需要驗證調用核心的 MPIDR。
平臺應分配核心索引(如上圖所示),這樣,如果核心節點從左到右編號,則核心域的索引將與該核心返回的索引 plat_core_pos_by_mpidr()相同plat_my_core_pos()。這種關系允許核心節點被分配到一個單獨的數組中(要求 4.)psci_setup(),其順序是核心在數組中的索引與這些 API 的返回值相同。
6.2.2.1。處理 MPIDR 分配中的漏洞?
對于分配的 MPIDR 數量等于核心電源域數量的平臺,例如 Juno 和 FVP,將 MPIDR 轉換為核心索引的邏輯應保持不變。Juno 和 FVP 都使用簡單的防碰撞哈希函數來執行此操作。
在某些平臺上,MPIDR 的分配可能不連續或某些內核已被禁用。這實質上意味著 MPIDR 已被稀疏分配,即平臺使用的 MPIDR 范圍的大小不等于核心電源域的數量。
平臺可以采用以下方法之一來處理這種情況:
(1) 實現更復雜的邏輯以將有效的 MPIDR 轉換為核心索引,同時保持前面描述的關系。這意味著電源域樹描述符不會描述任何被禁用或不存在的核心電源域。不會在樹中為這些域分配條目。
(2) 將未分配的 MPIDR 和禁用的核心視為不存在,但仍在電源域描述符中描述它們,即描述的核心節點數等于分配的 MPIDR 范圍的大小。這種方法將導致內存浪費,因為條目將在樹中分配,但允許使用更簡單的邏輯將 MPIDR 轉換為核心索引。
6.2.3. 遍歷和區分核心和非核心電源域
為了滿足要求 3 和 4,已經定義了單獨的數據結構來表示樹中的葉和非葉功率域節點。
/******************************************************************************** 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;功率域樹被實現為以下數據結構的組合。
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()函數psci_setup.c實現了解析平臺導出的電源域描述符以填充兩個數組的算法。它本質上是廣度優先搜索。從根開始的每一層的節點在 psci_non_cpu_pd_nodes和psci_cpu_pd_nodes數組中依次排列如下:
psci_non_cpu_pd_nodes -> [[Level 3 nodes][Level 2 nodes][Level 1 nodes]] psci_cpu_pd_nodes -> [Level 0 nodes]對于上面所示的示例電源域樹,psci_cpu_pd_nodes 將按如下方式填充。每個條目中的值是父節點的索引。為簡單起見,其他字段已被忽略。
+-------------+ ^ 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數組將按如下方式填充。每個條目中的值是父節點的索引。
+-------------+ ^ PD0 | -1 | |+-------------+ | PD1 | 0 | |+-------------+ | PD2 | 0 | |+-------------+ | PD3 | 1 | | PLAT_NUM_POWER_DOMAINS -+-------------+ | PLATFORM_CORE_COUNT PD4 | 1 | |+-------------+ | PD5 | 2 | |+-------------+ | PD6 | 2 | |+-------------+ v每個核心都可以使用該函數在psci_cpu_pd_nodes數組 中找到它的節點。plat_my_core_pos()當一個核心打開時,普通世界提供一個 MPIDR。該plat_core_pos_by_mpidr()函數用于在使用 MPIDR 查找對應的核心節點之前驗證 MPIDR。非核心功率域節點不需要被識別。
總結
以上是生活随笔為你收集整理的6-PSCI Power Domain Tree Structure的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 5-Interrupt Manageme
- 下一篇: 7-CPU Reset