概述¶
平臺環境控制介面 (PECI) 是 Intel 處理器和管理控制器(例如基板管理控制器,BMC)之間的通訊介面。 PECI 提供服務,允許管理控制器透過訪問各種暫存器來配置、監視和除錯平臺。 它定義了一種專用命令協議,其中管理控制器充當 PECI 發起者,處理器充當 PECI 響應者。 PECI 可用於單處理器和多處理器系統。
注意:Intel PECI 規範未作為專用文件釋出,而是給定 Intel CPU 的外部設計規範 (EDS) 的一部分。 外部設計規範通常不公開。
PECI 線纜¶
PECI 線纜介面使用單根線纜進行自時鐘和資料傳輸。 它不需要任何額外的控制線 - 物理層是一種自時鐘的單線匯流排訊號,每個位都以驅動的、從接近零伏的空閒狀態上升的邊沿開始。 訊號被驅動為高電平的持續時間允許確定位值是邏輯“0”還是邏輯“1”。 PECI 線纜還包括每個訊息建立的可變資料速率。
對於 PECI 線纜,每個處理器封裝將利用定義範圍內的唯一固定地址,並且該地址應與處理器插槽 ID 具有固定的關係 - 如果移除其中一個處理器,則不會影響剩餘處理器的地址。
PECI 子系統內部結構¶
-
struct peci_controller_ops¶
PECI 控制器特定方法
定義:
struct peci_controller_ops {
int (*xfer)(struct peci_controller *controller, u8 addr, struct peci_request *req);
};
成員
xferPECI 傳輸函式
描述
PECI 控制器可能具有不同的硬體介面 - 實現 PECI 控制器的驅動程式可以使用此結構透過為 PECI 核心公開一個通用介面來抽象出這些差異。
-
struct peci_controller¶
PECI 控制器
定義:
struct peci_controller {
struct device dev;
const struct peci_controller_ops *ops;
struct mutex bus_lock;
u8 id;
};
成員
dev將 PECI 控制器註冊到裝置模型的裝置物件
ops指向裝置特定控制器操作的指標
bus_lock用於保護多個呼叫者的鎖
idPECI 控制器 ID
描述
PECI 控制器通常使用非 PECI 匯流排(例如平臺匯流排)連線到其驅動程式。 每個 PECI 控制器可以與一個或多個 PECI 裝置通訊。
-
struct peci_device¶
PECI 裝置
定義:
struct peci_device {
struct device dev;
struct {
u32 x86_vfm;
u8 peci_revision;
u8 socket_id;
} info;
u8 addr;
bool deleted;
};
成員
dev將 PECI 設備註冊到裝置模型的裝置物件
infoPECI 裝置特性
info.x86_vfm裝置供應商-系列-型號
info.peci_revisionPECI 裝置支援的 PECI 版本
info.socket_idPECI 裝置表示的插槽 ID
addr在連線到父控制器的 PECI 總線上使用的地址
deleted指示 PECI 裝置已被刪除
描述
peci_device 標識連線到 PECI 匯流排的單個裝置(即 CPU)。 暴露給系統其餘部分的行為由管理裝置的 PECI 驅動程式定義。
-
struct peci_request¶
PECI 請求
定義:
struct peci_request {
struct peci_device *device;
struct {
u8 buf[PECI_REQUEST_MAX_BUF_SIZE];
u8 len;
} rx, tx;
};
成員
device將請求傳送到的 PECI 裝置
rxRX 緩衝區特定資料
rx.bufRX 緩衝區
rx.len接收到的資料長度(以位元組為單位)
txTX 緩衝區特定資料
tx.bufTX 緩衝區
tx.len傳輸資料長度(以位元組為單位)
描述
peci_request 表示 PECI 發起者 (TX) 發出的請求和從 PECI 響應者 (RX) 收到的響應。
-
struct peci_device_id¶
要匹配的 PECI 裝置資料
定義:
struct peci_device_id {
const void *data;
u32 x86_vfm;
};
成員
data指向特定於裝置的驅動程式私有資料的指標
x86_vfm裝置供應商-系列-型號
-
struct peci_driver¶
PECI 驅動程式
定義:
struct peci_driver {
struct device_driver driver;
int (*probe)(struct peci_device *device, const struct peci_device_id *id);
void (*remove)(struct peci_device *device);
const struct peci_device_id *id_table;
};
成員
driver繼承裝置驅動程式
probeprobe 回撥
removeremove 回撥
id_tablePECI 裝置匹配表,用於決定要繫結的裝置
-
peci_driver_register¶
peci_driver_register (driver)
註冊 PECI 驅動程式
引數
driver要註冊的驅動程式
描述
PECI 驅動程式如果不需要在模組 init 中執行任何特殊操作,則應使用便捷的“module_peci_driver”宏
返回
成功返回零,否則返回負錯誤程式碼。
-
module_peci_driver¶
module_peci_driver (__peci_driver)
用於註冊模組化 PECI 驅動程式的輔助宏
引數
__peci_driverpeci_driver 結構體
描述
用於 PECI 驅動程式的輔助宏,這些驅動程式在模組 init/exit 中不執行任何特殊操作。 這消除了很多樣板程式碼。 每個模組只能使用此宏一次,並且呼叫它會替換 module_init() 和 module_exit()
-
struct peci_controller *devm_peci_controller_add(struct device *dev, const struct peci_controller_ops *ops)¶
新增 PECI 控制器
引數
struct device *dev用於 devm 操作的裝置
const struct peci_controller_ops *ops指向控制器特定方法的指標
描述
在其 probe() 的最後階段,peci_controller 驅動程式呼叫 devm_peci_controller_add() 以向 PECI 匯流排註冊自身。
返回
指向新分配的控制器的指標,或者在失敗的情況下指向 ERR_PTR()。
-
int peci_request_status(struct peci_request *req)¶
基於 PECI 完成程式碼返回 -errno
引數
struct peci_request *req包含帶有完成程式碼的響應資料的 PECI 請求
描述
它不能用於 Ping()、GetDIB() 和 GetTemp() - 對於這些命令,我們不期望響應中包含完成程式碼。
返回
-errno
-
struct peci_request *peci_request_alloc(struct peci_device *device, u8 tx_len, u8 rx_len)¶
分配
struct peci_requests
引數
struct peci_device *device要將請求傳送到的 PECI 裝置
u8 tx_lenTX 長度
u8 rx_lenRX 長度
返回
指向新分配的 struct peci_request 的指標(如果成功),否則為 NULL。
-
void peci_request_free(struct peci_request *req)¶
釋放 peci_request
引數
struct peci_request *req要釋放的 PECI 請求
PECI CPU 驅動程式 API¶
-
int peci_temp_read(struct peci_device *device, s16 *temp_raw)¶
從 PECI 目標裝置讀取最大晶片溫度
引數
struct peci_device *device要將請求傳送到的 PECI 裝置
s16 *temp_raw儲存讀取溫度的位置
描述
它使用 GetTemp PECI 命令。
返回
成功返回 0,發生錯誤時返回其他值。
-
int peci_pcs_read(struct peci_device *device, u8 index, u16 param, u32 *data)¶
讀取 PCS 暫存器
引數
struct peci_device *device要將請求傳送到的 PECI 裝置
u8 indexPCS 索引
u16 paramPCS 引數
u32 *data儲存讀取資料的位置
描述
它使用 RdPkgConfig PECI 命令。
返回
成功返回 0,發生錯誤時返回其他值。
-
int peci_pci_local_read(struct peci_device *device, u8 bus, u8 dev, u8 func, u16 reg, u32 *data)¶
使用原始地址讀取 32 位記憶體位置
引數
struct peci_device *device要將請求傳送到的 PECI 裝置
u8 bus匯流排
u8 devdevice
u8 func功能
u16 reg暫存器
u32 *data儲存讀取資料的位置
描述
它使用 RdPCIConfigLocal PECI 命令。
返回
成功返回 0,發生錯誤時返回其他值。
-
int peci_ep_pci_local_read(struct peci_device *device, u8 seg, u8 bus, u8 dev, u8 func, u16 reg, u32 *data)¶
使用原始地址讀取 32 位記憶體位置
引數
struct peci_device *device要將請求傳送到的 PECI 裝置
u8 segPCI 段
u8 bus匯流排
u8 devdevice
u8 func功能
u16 reg暫存器
u32 *data儲存讀取資料的位置
描述
與 peci_pci_local_read 類似,但它使用 RdEndpointConfig PECI 命令。
返回
成功返回 0,發生錯誤時返回其他值。
-
int peci_mmio_read(struct peci_device *device, u8 bar, u8 seg, u8 bus, u8 dev, u8 func, u64 address, u32 *data)¶
使用 64 位 bar 偏移地址讀取 32 位記憶體位置
引數
struct peci_device *device要將請求傳送到的 PECI 裝置
u8 barPCI bar
u8 segPCI 段
u8 bus匯流排
u8 devdevice
u8 func功能
u64 address64 位 MMIO 地址
u32 *data儲存讀取資料的位置
描述
它使用 RdEndpointConfig PECI 命令。
返回
成功返回 0,發生錯誤時返回其他值。