? ?在現代SoC芯片中CPU只能說是皇帝,掌握資源命脈的還得是太上皇?SCP?。
講SoC前我們先看下傳統的PC構架,當你去買電腦的時候,首先決定價位的就是?CPU?,然后就是顯卡、聲卡、無線網卡等各種配件,最后電腦攢出來了,一個機箱個頭不小啊,耗電也是響當當的。家里插電還可以用,但是對于手機、汽車等移動設備來說,電池供電再這么搞是不行了,系統對省電、體積、功能有更高的要求,需要越來越多的模塊,解決方案就是?SoC?。
隨著芯片的集成化程度提升,很多模塊都做到芯片的內部,比如isp、dsp、gpu,這樣做成?片上系統?(Systemon Chip,簡稱?SoC?),好處是整個系統功能更內聚,板級面積會減少,但是芯片的體積卻越來越大。大的芯片面積造成芯片成本和功耗增加,但是整體功耗相對減小,隨著芯片制造工藝的提高,可以提高能耗比和降低成本。
SoC誕生后,一個問題愈發的嚴重,就像“?一個和尚挑水吃,兩個和尚抬水吃,三個和尚沒水吃?”,模塊多了就會有資源的爭奪。CPU上的OS軟件之前一直是皇帝般的存在,硬件之上都自己掌控,現在不同了,出現了藩王,像GPU各種人工智能專屬的NPU,地平線自己還命名了一個BPU,總之各種PU一堆,CPU還是皇帝,但是其他PU擁有自己獨立的硬件和OS就像藩王,有點不受控啊。爭奪最厲害的就是電源,這可是大奶媽,然后就是存儲、時鐘、傳感器等。這時候CPU皇帝很頭大了,需要搬出來太上皇了,就是我們本篇介紹的?SCP?(system control?processor)。那么CPU可以代理太上皇嗎,答案是不能,有的情況下比如休眠關機,CPU都得關了但是還有的NPU還在運行,CPU還沒那個資格統領全局。上面圖里面根據網絡小說的名字,看來作者知道太上皇才是權利巔峰,從而意淫奪舍,奪舍在計算機里面算是黑客入侵控制了,但是SoC里面這個太上皇可不好奪舍,是極度安全的幕后人物,擁有自己的全套基礎設施,而又讓你甚至感覺不到他的存在。但是當你一直沿著軟件OS-》ATF往下分析發現還有這個幕后黑手SCP。
1. ARM PCSA規范
上圖所示是一個典型的SoC,里面除了CPU還有各種其他處理器。之前介紹的ARM ATF入門-安全固件軟件介紹和代碼運行中的固件都是在CPU上運行的,也就是ARM的A核,這里說的SCP是在M核上運行的。
俗話說“?君權神授?”,這個SCP肯定得是造物主ARM提出來的了。 隨著SoC的復雜性增加,為了更好的功耗管理,需要從系統中其他的控制器和應用處理器中抽象出來各種電源或其他系統管理任務,進行集中管理,利用一個獨立的控制器核心實現。因此ARM提出了功耗控制系統架構(power control system architecture,簡稱?PCSA?),用來規范芯片功耗控制的邏輯實現。
為什么SoC需要集中功耗控制?
首先SoC的復雜性,現代SOC集成了大量的硬件模塊,在電源管理方面,這些模塊間需要進行集成和協調,實現難度大;
其次功耗管理的復雜性,涉及時鐘、電源域、傳感器、事件等方面。
PCSA描述了一種使用標準基礎設施組件、低功耗接口和相關方法進行功率控制集成的方法。PCSA基于ARM的組件實現,規范包括:
電壓、電源和時鐘的劃分;
電源的狀態和模式;
ARM電源控制框架和集成規范;
ARM特定組件的電源和時鐘集成;
帶有低功耗Q-channel和P-channel接口的IP。
2. SCP簡介
?
?
PCSA 定義了**系統控制處理器** (SCP) 的概念,一般是一個硬件模塊,例如cortex-M4微處理器再加上一些外圍邏輯電路做成的功耗控制單元。SCP用于從應用程序處理器中抽象出電源和系統管理任務,配合操作系統的功耗管理軟件或驅動,來完成頂層的功耗控制。上面這個圖中間是 **SCP** ,AP只是其中的一個 **Agent** ,還有其他的Agent,真正控制硬件的還是SCP,這就很安全。SCP相關的軟件交互定義如下:
AP軟件是SCP服務的請求者。
系統中的其他Agent也可以請求SCP的服務。代理例如一個modem子系統,或者其他的硬件模塊。
SCP基于處理器,有自己的?固件?,控制自己的一組?硬件資源?,例如本地私有內存、計時器、中斷控制以及系統配置、控制和狀態的寄存器。
最底層是SCP控制的?硬件資源?,例如時鐘源、電源域門控、電壓電壓和傳感器等
SCP提供的服務:
系統初始化:SCP負責通電復位系統初始化任務,從主系統和AP核心電源域的通電順序到AP啟動。
OSPM定向操作:SCP在OSPM指導下執行電壓供應變化、電源控制操作和時鐘源管理。這些服務也可以被其他請求的Agent使用。
對系統事件的響應:
計時器事件:SCP有本地計時器資源,可用于觸發系統喚醒和任何周期性動作,如監控。
喚醒事件:響應喚醒請求,包括由路由到斷電核心的中斷引起的GIC喚醒請求,以及來自其他代理的系統訪問請求。
調試訪問電源控制:響應來自調試訪問端口的請求和相關控件的請求,包括調試基礎設施的電源管理。
看門狗事件和系統恢復操作:在本地看門狗超時時,SCP可以執行一個重置和重新初始化序列。
系統感知功能:
SCP可以協調來自OSPM和其他代理對共享資源的請求。例如,它可以控制到主存的路徑,或進入SoC睡眠模式和退出,而不需要AP核心活動。
SCP可負責監測傳感器和測量功能。監控任務可能包括過程和溫度傳感器的數據收集和相關的操作,如操作點優化和報警條件。
SCP在操作點選擇中的作用可以擴展到必要時覆蓋OSPM方向,以確保系統的電氣和熱保護。
SCP在安全方面的優勢:
由于其是一個獨立的硬件模塊和固件,其內部資源例如內存、外設不能夠被外界控制,另外其還能控制外界的一些公共資源,SCP具有較高的權限。配合安全引導過程,SCP可以成為一個可信軟件模塊。
SCP固件為其他MCP的固件實現提供了參考:
SOC中除了SCP處理器外,還有一些其他的可管理性控制處理器 (MCP),其他MCP的實現固件框架跟SCP類似,目的是為需要可管理性的片上系統 (SoC) 提供管理入口點。
3. 電源管理軟件協議棧
用戶層:
首先用戶發起的一些操作,通過用戶空間的各service處理,會經過內核提供的sysfs,操作cpu hotplug、devicepm、EAS、IPA等。
內核層:
在linux內核中,EAS(energy aware scheduling)通過感知到當前的負載及相應的功耗,經過cpuidle、cpu dvfs及調度選擇idle等級、cpu頻率及大核或者小核上運行。IPA(intrlligent powerallocation)經過與EAS的交互,做熱相關的管理。
ATF層:
Linux kernel中發起的操作,會經過電源狀態協調接口(Power State Coordination Interface,簡稱PSCI),由操作系統無關的framework(ARM Trusted Firmware,簡稱ATF)做相關的處理后,通過系統控制與管理接口(System Control and Management Interface,簡稱SCMI),向系統控制處理器(system control processor,簡稱SCP)發起低功耗操作。
SCP層:
SCP最終會控制芯片上的sensor、clock、powerdomain、及板級的pmic做低功耗相關的處理。
總結:?用戶進程 --sysfs--> 內核(EAS、IPA)--PSCI--> ATF --SCMI-->SCP --LPI--> 功耗輸出器件
4. 電壓域和電源域劃分
為了更好地對電進行控制,ARM劃分了兩個電相關的概念:?電源域?(power domain)和?電壓域?(voltage domain)。
電壓域指使用同一個電壓源的模塊合集,如果幾個模塊使用相同的電壓源,就認為這幾個模塊屬于同一個電壓域。電源域指的是在同一個電壓域內,共享相同電源開關邏輯的模塊合集。即在同一個電源域的模塊被相同的電源開關邏輯控制,同時上、下電。一個電壓域內的模塊,可以根據設計需求,拆分到不同電源域。因此,電壓域對應的是功能是dvfs,而電源域的概念對應的是power gating。
如上圖,不同顏色表示不同的電壓域,VBIG是大核處理器的電源供電,VLITTLE是小核處理器的電源供電,VGPU是圖形處理器的電源供電,VSYS是系統電源。虛線框包圍的模塊表示可以做電源開關處理,比如處理器核。實線框包圍的模塊表示不能做電源開關,比如SCP。
5. SCP代碼下載編譯和功能介紹
官方開源代碼路徑:https://github.com/ARM-software/SCP-firmware,代碼下載:
?
git?clone https://github.com/ARM-software/SCP-firmware.git git submodule update --init
?
目錄名字 | 主要功能 |
framework | 存放scp架構的定義和實現,是scp 的代碼的主干 |
module | 存放scp的各個通用功能模塊的代碼,runtime ?services都是以module實現。例如power_domain, smt,scmi,scmi_power_domain,scmi_reset_domain,scmi_sensordeng,scmi_system_power,scmi_voltage_domain等 |
product | 存放具體的產品代碼,例如juno |
tools | 存放編譯腳本等工具 |
doc | 項目文檔 |
arch | 處理器架構,目前支持armv8-a和m |
????ARM的PCSA規范(電源控制系統框架)定義了SCP(系統控制處理器)相關內容,SCP固件為系統控制提供了一個軟件參考實現,一個典型就是SCP源碼中有一個optee實現(product/optee-stm32mp1/fw/Firmware.cmake)。
SCP固件實現的功能可以分為兩大類:system和runtime
實時功能(runtime services):
Power domain ? ? management(電源域管理)
System power ? ? management(系統電源管理),涉及開關機
Performance ? ? domain management (Dynamic voltage and frequency scaling),性能管理,這個主要就是ddr的調頻了(調頻對應電壓)。
Clock ? ? management(時鐘管理),Linux中也有,這里只提供重要的時鐘管理
Sensor ? ? management(傳感器管理)
Reset domain ? ? management(域重置管理)
Voltage ? ? domain management(電壓域管理)
系統相關功能(system services):
系統初始化,啟用應用核心引導
系統控制和管理接口(SCMI,平臺端)
支持GNU Arm嵌入式和Arm Compiler 6工具鏈
支持具有多個控制處理器的平臺
? 我們以juno開發板為例,介紹下編譯,執行如下全編譯命令:
?
make -f Makefile.cmake PRODUCT=juno MODE=debug
?
我們編譯了三個鏡像:
juno-bl1.bin: SCP ROM 固件映像 - 處理 RAM 固件到專用 SRAM 的傳輸并跳轉到它
juno-bl1-bypass.bin: 正常情況下scp_bl1(SCP ROM固件)需要對scp_bl2(SCP RAM固件)進行校驗,進行安全鏈式加載。此bin文件把bl1中對bl2固件的校驗去掉了,方便調試驗證的時候使用。
juno-bl2.bin: SCP RAM 固件映像 - 管理系統運行時服務
要使用 TF-A 在 Juno 上啟動 SCP 固件,您至少需要三個額外的映像:
bl1: BL1 - 存儲在系統 ROM 中的第一階段引導加載程序
bl2: BL2 - 加載的第二階段bootloader bl1,負責交給scp_bl2SCP
fip: FIP - 包含bl2和的固件映像包scp_bl2 疑問:這里為什么有juno-bl1和juno-bl2,跟ATF里面的BL2又有什么關系?--將在下面SCP boot章節解釋。
6. SCP?boot流程分析
固件romfw和ramfw介紹:
對于一個product的scp firmware分為兩部分:romfw(scp_bl1)和ramfw(scp_bl2)。
上電時:在開機上電時首先運行scp_bl1,然后啟動SOC其他核心例如AP(AP啟動后會運行BL1),等待AP發送指令,從系統ram把ramfw加載到SCP內部ram,并跳轉執行。scp_bl1用于加載和執行scp_bl2。
運行時:scp_bl2為scp主要runtime應用代碼,提供scp各種服務,例如scmi。
復位時:當硬件發生復位時,SCP上復位運行scp_bl1,時間上和ATF的AP_BL1 and AP_BL2同時運行。
juno固件相關目錄如下:
~/arm/SCP-firmware/product/juno$ ls includemodule product.mk scp_ramfw scp_romfw scp_romfw_bypass scp_ut src
?
SCP_BL1 boot 流程:
系統啟動,首先運行scp_romfw firmware代碼。執行scp應用初始化流程的初始流程fwk_arch_init(),按照Firmware.cmake中定義的module順序進行初始化,中斷初始化,module啟動,這些完成后會循環調用處理運行時event消息。
ATF中BL2加載SCP_BL2:
TF(Trusted Firmware)是ARM在Armv8引入的安全解決方案,為安全提供了整體解決方案。它包括啟動和運行過程中的特權級劃分。ATF BL2的主要職責就是將后續固件如u-boot。kernel,SCP或者其他異構核的固件,加載到ram中。SCP firmware的加載及boot 由arm Arm Trusted Firmware-A (TF-A)來完成。
SCP用于電源,時鐘,復位和系統控制。BL2將可選的SCP_BL2鏡像從平臺存儲設備加載到特定的安全內存區域。SCP_BL2的后續處理是特定于具體平臺的,需要自行實現。例如,Arm Juno :
BL2先把SCP_BL2加載到trust sram,
再使用Boot ? ? Over MHU (BOM) 協議,把SCP_BL2加載到 SCP的內部RAM之后,
SCP運行SCP_BL2,
SCP給AP發出signals,通知BL2繼續執行。
ATF中,BL2的編譯選項在如下位置定義plat/arm/board/juno/platform.mk中的BL2_SOURCES,morello ATF plat/arm/board/morello/platform.mk中未定義BL2_SOURCES,不包含BL2.是否包含BL2相關通用代碼及配置由CSS_LOAD_SCP_IMAGES決定
scp romfw 跳轉執行ramfw:
在juno中,ATF的BL2中通過SDS(Shared-Data-Structure,在Juno平臺中替代之前Boot-Over_MHU (BOM)協議)和SCP的romfw通信(mod_bootloader調用sds API),發送ramfw到安全內存,然后再由romfw從安全內存加載到其他位置并執行。
備注:SCP_BL2的運行跟SCP_BL1一樣,兩者都是使用SCP的框架代碼,屬于兩個系統。執行scp應用初始化流程的初始流程fwk_arch_init(),按照Firmware.cmake中定義的module順序進行初始化,中斷初始化,module啟動,這些完成后會循環調用處理運行時event消息。
? 后記:
????本篇對SCP進行了介紹,下次文章介紹下SCP的代碼分析,作為一個M核運行的系統代碼,其代碼框架還是有很多通用性和優點,號稱OPTEE固件可以直接在其框架下實現應用,對電源管理和SoC有興趣的朋友可以關注。
審核編輯:湯梓紅
評論
查看更多