2022年2月4日 星期五

[OpenBMC] 簡單解析 smbios-mdr

 (*如果之後架構有變,這邊不會更新)GitHub - openbmc/smbios-mdr

MDR(Managed Data Region) 是 OpenBMC中取得SMBIOS Table並解析其內容的一個功能,目前網路上(在沒有特別帳號權限下)能找到的資料蠻少的,所以這邊會盡量用公開資料做個分析 如果還不認識SMBIOS 可以先看之前寫的文章

輕鬆搞懂SMBIOS

先體會一下 smbios-mdr 的結果,假如SMBIOS中有兩個Processor struct,表示Platform上有兩個CPU socket,透過 smbios-mdr 的運作後,最後我們可以從Redfish 的Processor Collection中看到兩顆CPU socket

> curl -k -H "X-Auth-Token: $token" -H "Content-Type: application/octet-stream" -X GET https://${bmcip}/redfish/v1/Systems/system/Processors
 
{
    "@odata.id": "/redfish/v1/Systems/system/Processors",
    "@odata.type": "#ProcessorCollection.ProcessorCollection",
    "Members": [
        {
            "@odata.id": "/redfish/v1/Systems/system/Processors/cpu0"
        },
        {
            "@odata.id": "/redfish/v1/Systems/system/Processors/cpu1"
        }
    ],
    "Members@odata.count": 2,
    "Name": "Processor Collection"
}

簡單來說,BIOS將smbios table透過一些方式傳給BMC後,BMC呼叫dbus method "AgentSynchronizeData" ,smbios-mdr會去將smbios資料expose 到dbus上,供使用者讀取和操作

// github.com/openbmc/intel-ipmi-oem/blob/master/src/smbiosmdrv2handler.cpp
ipmi::RspType<> cmd_mdr2_data_done(uint16_t agentId, uint16_t lockHandle)
{
    // ...
    sdbusplus::message::message method = bus->new_method_call(
        service.c_str(), mdrv2Path, mdrv2Interface, "AgentSynchronizeData");
    // ...
}
 
// github.com/openbmc/smbios-mdr/blob/master/src/smbios-ipmi-blobs/handler.cpp
bool syncSmbiosData()
{
    // ...
    sdbusplus::message::message method =
        bus.new_method_call(mdrV2Service, phosphor::smbios::mdrV2Path,
                            mdrV2Interface, "AgentSynchronizeData");
    // ...
}


MDR(Managed Data Region)

MDR 是一種通用機制,用於管理韌體實體之間的數據傳輸並在 BMC 中維護伺服器數據。 目前,該數據由 BCT/SMBIOS 數據組成。 但將來可能會添加其他數據實體。


  • CMM:Chassis Management Module
  • BMC:Baseboard Management Controller
  • BIOS:Basic Input/Output System

CMM通常是放在PDB上面的,會連接1~N的BMC,負責機箱/機殼管理,可以參考Intel機架規模設計(RSD,Rack Scale Design),當然,並不是所有伺服器都有CMM的存在,MDR的設計中是有包含CMM的,但是沒有也沒關係,等下會著重在BMC和BIOS的溝通


SMBIOS的傳輸

從BIOS傳輸SMBIOS給BMC目前有四個方式,分別是

這四種方法最後都是將SMBIOS放到/var/lib/smbios底下,呼叫smbios-mdr去做解析並將資料放到dbus上,其中MDRV1 是BIOS透過指令將SMBIOS 慢慢送過去給BMC,MDR V2 則是BIOS將SMBIOS放到VGA share memory,BMC再去讀出來 ,只是會根據主動發送指令的是BMC還是BIOS分成Pull和Push兩種,最後IPMI Blobs的方式就是將SMBIOS視為一個Blobs傳送給BMC




CPU 資訊檢查

smbios-mdr 中還有另一個服務"xyz.openbmc_project.cpuinfo.service"。 它的作用是根據SMBIOS中的Processor Type和Entity manager的config文件,通過PIROM訪問CPU,確認CPU ID合法 ,如果沒有問題,才將CPU資訊曝光到dbus上

底下是Entity Manager Config的範例,Bus/Address記得改成主機板上CPU的對應資訊

# Entity Manager config / baseboard.json
{
	"Address": "0x30",
	"Bus": 0,
	"CpuID": 1,
	"Name": "CPU 1",
	"PiromI2cAddress": "0x50",
	"PiromI2cBus": 12,
	"PresenceGpio": [
	    {
	        "Name": "CPU1_PRESENCE",
	        "Polarity": "Low"
	    }
	],
},


沒有留言:

張貼留言

注意:只有此網誌的成員可以留言。