概述

平臺環境控制介面 (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);
};

成員

xfer

PECI 傳輸函式

描述

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

用於保護多個呼叫者的鎖

id

PECI 控制器 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 設備註冊到裝置模型的裝置物件

info

PECI 裝置特性

info.x86_vfm

裝置供應商-系列-型號

info.peci_revision

PECI 裝置支援的 PECI 版本

info.socket_id

PECI 裝置表示的插槽 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 裝置

rx

RX 緩衝區特定資料

rx.buf

RX 緩衝區

rx.len

接收到的資料長度(以位元組為單位)

tx

TX 緩衝區特定資料

tx.buf

TX 緩衝區

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

繼承裝置驅動程式

probe

probe 回撥

remove

remove 回撥

id_table

PECI 裝置匹配表,用於決定要繫結的裝置

peci_driver_register

peci_driver_register (driver)

註冊 PECI 驅動程式

引數

driver

要註冊的驅動程式

描述

PECI 驅動程式如果不需要在模組 init 中執行任何特殊操作,則應使用便捷的“module_peci_driver”宏

返回

成功返回零,否則返回負錯誤程式碼。

module_peci_driver

module_peci_driver (__peci_driver)

用於註冊模組化 PECI 驅動程式的輔助宏

引數

__peci_driver

peci_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_len

TX 長度

u8 rx_len

RX 長度

返回

指向新分配的 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 index

PCS 索引

u16 param

PCS 引數

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 dev

device

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 seg

PCI 段

u8 bus

匯流排

u8 dev

device

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 bar

PCI bar

u8 seg

PCI 段

u8 bus

匯流排

u8 dev

device

u8 func

功能

u64 address

64 位 MMIO 地址

u32 *data

儲存讀取資料的位置

描述

它使用 RdEndpointConfig PECI 命令。

返回

成功返回 0,發生錯誤時返回其他值。