20. AMD HSMP 介面¶
AMD 的較新 Fam19h(型號 0x00-0x1f、0x30-0x3f、0x90-0x9f、0xa0-0xaf)、Fam1Ah(型號 0x00-0x1f)EPYC 伺服器系列處理器透過 HSMP(主機系統管理埠)支援系統管理功能。
主機系統管理埠 (HSMP) 是一個介面,透過一組郵箱暫存器為作業系統級別的軟體提供對系統管理功能的訪問。
有關該介面的更多詳細資訊,請參見系列/型號 PPR 的 “7 主機系統管理埠 (HSMP)” 章節,例如:https://www.amd.com/content/dam/amd/en/documents/epyc-technical-docs/programmer-references/55898_B1_pub_0_50.zip
HSMP 介面在 EPYC 系列伺服器 CPU 和 MI300A (APU) 上受支援。
20.1. HSMP 裝置¶
drivers/platforms/x86/amd/hsmp/ 下的 amd_hsmp 驅動程式具有單獨的驅動程式檔案,用於基於 ACPI 物件的探測、基於平臺裝置的探測以及這兩個驅動程式的公共程式碼。
Kconfig 選項 CONFIG_AMD_HSMP_PLAT 編譯 plat.c 並建立 amd_hsmp.ko。 Kconfig 選項 CONFIG_AMD_HSMP_ACPI 編譯 acpi.c 並建立 hsmp_acpi.ko。 選擇這兩個配置中的任何一個都會自動選擇 CONFIG_AMD_HSMP。 這會編譯公共程式碼 hsmp.c 並建立 hsmp_common.ko 模組。
ACPI 和 plat 驅動程式都建立 miscdevice /dev/hsmp,以允許使用者空間程式執行 hsmp 郵箱命令。
驅動程式支援的 ACPI 物件格式定義如下。
$ ls -al /dev/hsmp crw-r--r-- 1 root root 10, 123 Jan 21 21:41 /dev/hsmp
- dev 節點的特性
寫入模式用於執行 set/configure 命令
讀取模式用於執行 get/status monitor 命令
- 訪問限制
僅允許 root 使用者以寫入模式開啟檔案。
所有使用者都可以讀取模式開啟該檔案。
- 核心整合
核心中的其他子系統可以使用匯出的傳輸函式 hsmp_send_message()。
驅動程式負責處理跨呼叫者的鎖定。
20.2. HSMP sysfs 介面¶
指標表二進位制 sysfs
AMD MI300A MCM 提供 GET_METRICS_TABLE 訊息,以便一次性從 SMU 檢索大部分系統管理資訊。
指標表以十六進位制 sysfs 二進位制檔案的形式提供,位於 /sys/devices/platform/amd_hsmp/socket%d/metrics_bin 下建立的每個插槽 sysfs 目錄下。
注意:不支援 lseek(),因為讀取的是整個指標表。
指標表定義將作為公共 PPR 的一部分進行記錄。 相同的內容在 amd_hsmp.h 標頭中定義。
HSMP 遙測 sysfs 檔案
以下 sysfs 檔案可在 /sys/devices/platform/AMDI0097:0X/ 中找到。
c0_residency_input:C0 狀態下核心的百分比。
prochot_status:如果處理器達到熱閾值,則報告 1,否則報告 0。
smu_fw_version:SMU 韌體版本。
protocol_version:HSMP 介面版本。
ddr_max_bw:理論最大 DDR 頻寬,單位為 GB/s。
ddr_utilised_bw_input:當前使用的 DDR 頻寬,單位為 GB/s。
ddr_utilised_bw_perc_input(%):當前使用的 DDR 頻寬的百分比。
mclk_input:記憶體時鐘,單位為 MHz。
fclk_input:Fabric 時鐘,單位為 MHz。
clk_fmax:插槽的最大頻率,單位為 MHz。
clk_fmin:插槽的最小頻率,單位為 MHz。
cclk_freq_limit_input:每個插槽的核心時鐘頻率限制,單位為 MHz。
pwr_current_active_freq_limit:插槽的當前活動頻率限制,單位為 MHz。
pwr_current_active_freq_limit_source:當前活動頻率限制的來源。
20.3. ACPI 裝置物件格式¶
ID 為 ID00 的插槽的 amd_hsmp 驅動程式期望的 ACPI 物件格式如下
Device(HSMP)
{
Name(_HID, "AMDI0097")
Name(_UID, "ID00")
Name(HSE0, 0x00000001)
Name(RBF0, ResourceTemplate()
{
Memory32Fixed(ReadWrite, 0xxxxxxx, 0x00100000)
})
Method(_CRS, 0, NotSerialized)
{
Return(RBF0)
}
Method(_STA, 0, NotSerialized)
{
If(LEqual(HSE0, One))
{
Return(0x0F)
}
Else
{
Return(Zero)
}
}
Name(_DSD, Package(2)
{
Buffer(0x10)
{
0x9D, 0x61, 0x4D, 0xB7, 0x07, 0x57, 0xBD, 0x48,
0xA6, 0x9F, 0x4E, 0xA2, 0x87, 0x1F, 0xC2, 0xF6
},
Package(3)
{
Package(2) {"MsgIdOffset", 0x00010934},
Package(2) {"MsgRspOffset", 0x00010980},
Package(2) {"MsgArgOffset", 0x000109E0}
}
})
}
20.4. HSMP HWMON 介面¶
HSMP 電源感測器已註冊到 hwmon 介面。 為每個插槽建立一個單獨的 hwmon 目錄,並在 hwmon 目錄中生成以下檔案。 - power1_input(只讀) - power1_cap_max(只讀) - power1_cap(讀寫)
20.5. 一個例子¶
要從 C 程式訪問 hsmp 裝置。 首先,你需要包含標頭檔案
#include <linux/amd_hsmp.h>
它定義了支援的訊息/訊息 ID。
接下來,開啟裝置檔案,如下所示
int file;
file = open("/dev/hsmp", O_RDWR);
if (file < 0) {
/* ERROR HANDLING; you can check errno to see what went wrong */
exit(1);
}
定義了以下 IOCTL
ioctl(file, HSMP_IOCTL_CMD, struct hsmp_message *msg)該引數是指向
struct hsmp_message { __u32 msg_id; /* Message ID */ __u16 num_args; /* Number of input argument words in message */ __u16 response_sz; /* Number of expected output/response words */ __u32 args[HSMP_MAX_MSG_LEN]; /* argument/response buffer */ __u16 sock_ind; /* socket number */ };
ioctl 將在失敗時返回一個非零值; 你可以讀取 errno 以檢視發生了什麼。 該事務在成功時返回 0。
有關該介面和訊息定義的更多詳細資訊,請參見相應系列/型號 PPR 的 “7 主機系統管理埠 (HSMP)” 章節,例如:https://www.amd.com/content/dam/amd/en/documents/epyc-technical-docs/programmer-references/55898_B1_pub_0_50.zip
透過連結到 esmi 庫,可以使用使用者空間 C-API,該庫由 E-SMS 專案提供 https://www.amd.com/en/developer/e-sms.html。 請參閱:https://github.com/amd/esmi_ib_library