bl31中的psci架構(gòu)
bl31為內(nèi)核提供了一系列運(yùn)行時(shí)服務(wù),psci作為其標(biāo)準(zhǔn)運(yùn)行時(shí)服務(wù)的一部分,通過宏DECLARE_RT_SVC注冊到系統(tǒng)中。其相應(yī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會(huì)在bl31啟動(dòng)流程中被調(diào)用,以用于初始化該服務(wù)相關(guān)的配置。而std_svc_smc_handler為其smc異常處理函數(shù),當(dāng)內(nèi)核通過psci接口調(diào)用相關(guān)服務(wù)時(shí),最終將由該函數(shù)執(zhí)行實(shí)際的處理流程。
上圖為psci初始化相關(guān)的流程,它主要包含內(nèi)容:(1)前面我們已經(jīng)介紹過power domain相關(guān)的背景,即psci需要協(xié)調(diào)不同層級(jí)的power domain狀態(tài),因此其必須要了解系統(tǒng)的power domain配置情況。以上流程中紅色虛線框的部分主要就是用于初始化系統(tǒng)的power domain拓?fù)浼捌錉顟B(tài)
(2)由于psci在執(zhí)行電源相關(guān)接口時(shí),最終需要操作實(shí)際的硬件。而它們是與架構(gòu)相關(guān)的,因此其操作函數(shù)最終需要注冊到平臺(tái)相關(guān)的回調(diào)中。plat_setup_psci_ops即用于注冊特定平臺(tái)的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操作相應(yīng)的異常處理流程:
即其會(huì)根據(jù)function id的值,分別執(zhí)行相應(yīng)的電源管理服務(wù),如啟動(dòng)cpu時(shí)會(huì)調(diào)用psci_cpu_on函數(shù),重啟系統(tǒng)時(shí)會(huì)調(diào)用psci_system_rest函數(shù)等。
-
內(nèi)核
+關(guān)注
關(guān)注
3文章
1383瀏覽量
40442 -
cpu
+關(guān)注
關(guān)注
68文章
10911瀏覽量
213140 -
SMP
+關(guān)注
關(guān)注
0文章
76瀏覽量
19758
發(fā)布評論請先 登錄
相關(guān)推薦
可編程CPU重置地址,單CPU冷啟動(dòng)配置
![可編程CPU重置地址,單CPU冷啟動(dòng)配置](https://file1.elecfans.com/web2/M00/B2/4F/wKgaomVqnsSANrdoAAA02X7m5Qk325.png)
基于armv8架構(gòu)對u-boot進(jìn)行啟動(dòng)流程分析(一)
如何讓BL31的調(diào)試信息輸出到S32R45的uart?
BL31未在Kirkstone上加載的原因?
ATF中bl2的啟動(dòng)
![ATF<b class='flag-5'>中</b><b class='flag-5'>bl</b>2的啟動(dòng)](https://file1.elecfans.com/web2/M00/AE/A8/wKgZomVJ7RCAb8ygAAIWfxK47aU906.jpg)
ATF中如何用函數(shù)完成bl2的啟動(dòng)
ATF中bl2到bl31的跳轉(zhuǎn)介紹
ATF中bl31的啟動(dòng)
![ATF<b class='flag-5'>中</b><b class='flag-5'>bl31</b>的啟動(dòng)](https://file1.elecfans.com/web2/M00/AC/DC/wKgaomVJ8KaAM_dEAAJ1Lv_7AeQ050.jpg)
ATF中bl31函數(shù)介紹與使用
Bl31中斷處理流程概述
![<b class='flag-5'>Bl31</b><b class='flag-5'>中</b>斷處理流程概述](https://file1.elecfans.com/web2/M00/AC/E2/wKgaomVKBaiAYlxYAAHpE1HlogE232.jpg)
psci接口規(guī)范介紹
內(nèi)核中的psci驅(qū)動(dòng)是什么
![內(nèi)核<b class='flag-5'>中</b>的<b class='flag-5'>psci</b>驅(qū)動(dòng)是什么](https://file1.elecfans.com/web2/M00/B2/AF/wKgaomVu5Q2APT6ZAAGUCF-LhVY534.jpg)
內(nèi)核中的psci架構(gòu)cpu_ops接口
PSCI處理函數(shù)代碼分析
armv8 u-boot的啟動(dòng)介紹
![armv8 u-boot的啟動(dòng)<b class='flag-5'>介紹</b>](https://file1.elecfans.com/web2/M00/B3/0C/wKgaomVxNu-AIvqcAAIPpgxwPoE779.jpg)
評論