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