bl31中的psci架構
bl31為內核提供了一系列運行時服務,psci作為其標準運行時服務的一部分,通過宏DECLARE_RT_SVC注冊到系統中。其相應的定義如下:
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異常處理函數,當內核通過psci接口調用相關服務時,最終將由該函數執行實際的處理流程。
上圖為psci初始化相關的流程,它主要包含內容:(1)前面我們已經介紹過power domain相關的背景,即psci需要協調不同層級的power domain狀態,因此其必須要了解系統的power domain配置情況。以上流程中紅色虛線框的部分主要就是用于初始化系統的power domain拓撲及其狀態
(2)由于psci在執行電源相關接口時,最終需要操作實際的硬件。而它們是與架構相關的,因此其操作函數最終需要注冊到平臺相關的回調中。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操作相應的異常處理流程:

即其會根據function id的值,分別執行相應的電源管理服務,如啟動cpu時會調用psci_cpu_on函數,重啟系統時會調用psci_system_rest函數等。
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。
舉報投訴
-
內核
+關注
關注
4文章
1467瀏覽量
42871 -
cpu
+關注
關注
68文章
11277瀏覽量
224951 -
SMP
+關注
關注
0文章
81瀏覽量
20815
發布評論請先 登錄
相關推薦
熱點推薦
可編程CPU重置地址,單CPU冷啟動配置
如果將BL31用作TF-A入口點而不是BL1,則上圖仍然相關,因為在這種情況下,所有這些操作都將發生在BL31中。有關詳細信息,請參閱第6節“使用B
發表于 12-02 11:00
?1869次閱讀
BL2 在跳轉到 BL31 之前掛起 — 訓練后出現 DDR PHY (0x01400000) 訪問問題,求解
SDK (LSDK 25.06)使用以下調試選項:
調試=1
ddr_debug=是
ddr_phy_debug=是
我目前面臨一個問題,即BL2 在跳到 BL31 之前停止.
為了調查這一點,我將
發表于 03-03 06:34
基于armv8架構對u-boot進行啟動流程分析(一)
Linux kernel;啟動BL1,BL2,BL31,BL32則是一個完整的ATF信任鏈建立流程(ARM Trusted Firmware),像常見的
發表于 05-23 15:59
如何讓BL31的調試信息輸出到S32R45的uart?
我用“DEBUG=1”構建 ATF 映像,uart 可以顯示 BL2 的調試信息,但沒有顯示 BL31 的調試信息。 為什么?BL2到BL31,是不是又設置了控制臺?如何讓
發表于 04-11 08:20
BL31未在Kirkstone上加載的原因?
imx8mm_evk.h 和 imx8mm_evk.c 中的設置時,SPL 打印 do uart3,但它應該顯示:注意:BL31:v2.6(發布
發表于 04-19 11:00
ATF中bl2的啟動
bl2_entrypoint函數最終會觸發安全監控模式調用(smc) ,通知bl1將CPU的控制權限轉交給bl31,然后執行bl31。 該函數會執行 ? 平臺相關的初始化、 ? 獲取
ATF中如何用函數完成bl2的啟動
bl31加載到內存中后會觸發安全監控模式調用(smc)將CPU權限轉交給bl31。 該函數的主要內容和相關注釋如下: ** void bl2_main ( void
ATF中bl2到bl31的跳轉介紹
bl2到bl31的跳轉 在bl2_main函數中最終會調用smc(BL1_SMC_RUN_IMAGE,(unsigned long)next_bl
ATF中bl31函數介紹與使用
runtime_svc_init函數 該函數主要用來建立安全監控模式調用處理函數的索引表,并執行EL3中提供的服務項的初始化操作,獲取TEE OS的入口地址并賦值給bl32_init變量,以備啟動
psci接口規范介紹
由于psci是由linux內核調用bl31中的安全服務,實現cpu電源管理功能的。因此其軟件架構包含三個部分: (1)內核與bl31之間的調
內核中的psci驅動是什么
"; ( 2 ) } (1)用于指定psci版本 (2)根據該psci由bl31處理還是hypervisor處理,可以指定其對應的陷入方式。若由bl31處理為smc,若由hypervi
內核中的psci架構cpu_ops接口
cpu_ops接口 驅動初始化完成后,cpu的cpu_ops就可以調用這些回調實現psci功能的調用。如下所示,當devicetree中cpu的enable-method設置為psci時,該cpu
PSCI處理函數代碼分析
處理函數根據funid來決定服務,可以看到PSCI_CPU_ON_AARCH64為0xc4000003,這正是設備樹中填寫的cpu_on屬性的id,會委托psci_cpu_on來執行核上電任務。下面
bl31中的psci架構介紹
評論