bl31中的psci架構
bl31為內核提供了一系列運行時服務,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啟動流程中被調用,以用于初始化該服務相關的配置。而std_svc_smc_handler為其smc異常處理函數(shù),當內核通過psci接口調用相關服務時,最終將由該函數(shù)執(zhí)行實際的處理流程。
上圖為psci初始化相關的流程,它主要包含內容:(1)前面我們已經(jīng)介紹過power domain相關的背景,即psci需要協(xié)調不同層級的power domain狀態(tài),因此其必須要了解系統(tǒng)的power domain配置情況。以上流程中紅色虛線框的部分主要就是用于初始化系統(tǒng)的power domain拓撲及其狀態(tài)
(2)由于psci在執(zhí)行電源相關接口時,最終需要操作實際的硬件。而它們是與架構相關的,因此其操作函數(shù)最終需要注冊到平臺相關的回調中。plat_setup_psci_ops即用于注冊特定平臺的psci_ops回調,其格式如下:
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時會調用psci_cpu_on函數(shù),重啟系統(tǒng)時會調用psci_system_rest函數(shù)等。
-
內核
+關注
關注
4文章
1476瀏覽量
43101 -
cpu
+關注
關注
68文章
11333瀏覽量
226005 -
SMP
+關注
關注
0文章
82瀏覽量
20969
發(fā)布評論請先 登錄
可編程CPU重置地址,單CPU冷啟動配置
BL2 在跳轉到 BL31 之前掛起 — 訓練后出現(xiàn) DDR PHY (0x01400000) 訪問問題,求解
如何使 i.MX93 上的 U-Boot SPL 和 ATF/BL31輸出靜音呢?
如何讓BL31的調試信息輸出到S32R45的uart?
BL31未在Kirkstone上加載的原因?
ATF中bl2的啟動
ATF中如何用函數(shù)完成bl2的啟動
ATF中bl2到bl31的跳轉介紹
ATF中bl31的啟動
ATF中bl31函數(shù)介紹與使用
psci接口規(guī)范介紹
內核中的psci驅動是什么
bl31中的psci架構介紹
評論