bl31中的psci架構
bl31為內(nèi)核提供了一系列運行時服務,psci作為其標準運行時服務的一部分,通過宏DECLARE_RT_SVC注冊到系統(tǒng)中。其相應的定義如下:
DECLARE_RT_SVC(
std_svc,
OEN_STD_START,
OEN_STD_END,
SMC_TYPE_FAST,
std_svc_setup,
std_svc_smc_handler
)
其中std_svc_setup會在bl31啟動流程中被調(diào)用,以用于初始化該服務相關的配置。而std_svc_smc_handler為其smc異常處理函數(shù),當內(nèi)核通過psci接口調(diào)用相關服務時,最終將由該函數(shù)執(zhí)行實際的處理流程。
上圖為psci初始化相關的流程,它主要包含內(nèi)容:(1)前面我們已經(jīng)介紹過power domain相關的背景,即psci需要協(xié)調(diào)不同層級的power domain狀態(tài),因此其必須要了解系統(tǒng)的power domain配置情況。以上流程中紅色虛線框的部分主要就是用于初始化系統(tǒng)的power domain拓撲及其狀態(tài)
(2)由于psci在執(zhí)行電源相關接口時,最終需要操作實際的硬件。而它們是與架構相關的,因此其操作函數(shù)最終需要注冊到平臺相關的回調(diào)中。plat_setup_psci_ops即用于注冊特定平臺的psci_ops回調(diào),其格式如下:
typedef struct plat_psci_ops {
void (*cpu_standby)(plat_local_state_t cpu_state);
int (*pwr_domain_on)(u_register_t mpidr);
void (*pwr_domain_off)(const psci_power_state_t *target_state);
void (*pwr_domain_suspend_pwrdown_early)(
const psci_power_state_t *target_state);
void (*pwr_domain_suspend)(const psci_power_state_t *target_state);
void (*pwr_domain_on_finish)(const psci_power_state_t *target_state);
void (*pwr_domain_on_finish_late)(
const psci_power_state_t *target_state);
void (*pwr_domain_suspend_finish)(
const psci_power_state_t *target_state);
void __dead2 (*pwr_domain_pwr_down_wfi)(
const psci_power_state_t *target_state);
void __dead2 (*system_off)(void);
void __dead2 (*system_reset)(void);
int (*validate_power_state)(unsigned int power_state,
psci_power_state_t *req_state);
int (*validate_ns_entrypoint)(uintptr_t ns_entrypoint);
void (*get_sys_suspend_power_state)(
psci_power_state_t *req_state);
int (*get_pwr_lvl_state_idx)(plat_local_state_t pwr_domain_state,
int pwrlvl);
int (*translate_power_state_by_mpidr)(u_register_t mpidr,
unsigned int power_state,
psci_power_state_t *output_state);
int (*get_node_hw_state)(u_register_t mpidr, unsigned int power_level);
int (*mem_protect_chk)(uintptr_t base, u_register_t length);
int (*read_mem_protect)(int *val);
int (*write_mem_protect)(int val);
int (*system_reset2)(int is_vendor,
int reset_type, u_register_t cookie);
}
最后我們再看一下psci操作相應的異常處理流程:

即其會根據(jù)function id的值,分別執(zhí)行相應的電源管理服務,如啟動cpu時會調(diào)用psci_cpu_on函數(shù),重啟系統(tǒng)時會調(diào)用psci_system_rest函數(shù)等。
-
內(nèi)核
+關注
關注
4文章
1468瀏覽量
42880 -
cpu
+關注
關注
68文章
11279瀏覽量
225015 -
SMP
+關注
關注
0文章
81瀏覽量
20828
發(fā)布評論請先 登錄
可編程CPU重置地址,單CPU冷啟動配置
BL2 在跳轉(zhuǎn)到 BL31 之前掛起 — 訓練后出現(xiàn) DDR PHY (0x01400000) 訪問問題,求解
基于armv8架構對u-boot進行啟動流程分析(一)
如何讓BL31的調(diào)試信息輸出到S32R45的uart?
BL31未在Kirkstone上加載的原因?
ATF中bl2的啟動
ATF中如何用函數(shù)完成bl2的啟動
ATF中bl2到bl31的跳轉(zhuǎn)介紹
ATF中bl31的啟動
ATF中bl31函數(shù)介紹與使用
psci接口規(guī)范介紹
內(nèi)核中的psci驅(qū)動是什么
bl31中的psci架構介紹
評論