其他固件接口

DMI 接口

int dmi_check_system(const struct dmi_system_id *list)

检查系统 DMI 数据

参数

const struct dmi_system_id *list

要匹配的 dmi_system_id 结构数组。列表中的所有非空元素必须匹配其槽(字段索引)的数据(即,每个列表字符串必须是指定 DMI 槽的字符串数据的子字符串),才能被认为是成功匹配。

遍历黑名单表,运行匹配函数,直到有人返回非零值或到达结尾。对于每个成功的匹配,都会调用回调函数。返回匹配的数量。

必须在调用此函数之前调用 dmi_setup。

const struct dmi_system_id *dmi_first_match(const struct dmi_system_id *list)

查找与系统 DMI 数据匹配的 dmi_system_id 结构

参数

const struct dmi_system_id *list

要匹配的 dmi_system_id 结构数组。列表中的所有非空元素必须匹配其槽(字段索引)的数据(即,每个列表字符串必须是指定 DMI 槽的字符串数据的子字符串),才能被认为是成功匹配。

遍历黑名单表,直到找到第一个匹配项。返回指向匹配条目的指针,如果没有匹配项,则返回 NULL。

必须在调用此函数之前调用 dmi_setup。

const char *dmi_get_system_info(int field)

返回 DMI 数据值

参数

int field

数据索引(参见枚举 dmi_field)

返回一个 DMI 数据值,可用于执行复杂的 DMI 数据检查。

int dmi_name_in_vendors(const char *str)

检查字符串是否在 DMI 系统或主板供应商名称中

参数

const char *str

区分大小写的名称

const struct dmi_device *dmi_find_device(int type, const char *name, const struct dmi_device *from)

按类型/名称查找板载设备

参数

int type

设备类型或 DMI_DEV_TYPE_ANY 以匹配所有设备类型

const char *name

设备名称字符串或 NULL 以匹配所有

const struct dmi_device *from

搜索中找到的上一个设备,或者对于新搜索为 NULL

遍历已知板载设备的列表。如果找到具有匹配的 typename 的设备,则返回指向其设备结构的指针。否则,返回 NULL。通过传递 NULL 作为 from 参数来启动新搜索。如果 from 不是 NULL,则从下一个设备继续搜索。

bool dmi_get_date(int field, int *yearp, int *monthp, int *dayp)

解析 DMI 日期

参数

int field

数据索引(参见枚举 dmi_field)

int *yearp

年份的可选输出参数

int *monthp

月份的可选输出参数

int *dayp

日期的可选输出参数

日期字段假定采用类似于 [mm[/dd]]/yy[yy] 的形式,结果存储在输出参数中,可以省略任何或所有参数。

如果该字段不存在,则所有输出参数都设置为零,并返回 false。否则,返回 true,并将日期的任何无效部分设置为零。

返回时,保证年份、月份和日期分别在 [0,9999]、[0,12] 和 [0,31] 的范围内。

int dmi_get_bios_year(void)

从 DMI_BIOS_DATE 字段中获取年份

参数

void

无参数

描述

成功时返回年份,如果未选择 DMI,则返回 -ENXIO,如果 DMI 字段不存在或无法解析,则返回不同的负错误代码。

int dmi_walk(void (*decode)(const struct dmi_header*, void*), void *private_data)

遍历 DMI 表,并为每个记录调用回调函数

参数

void (*decode)(const struct dmi_header *, void *)

回调函数

void *private_data

要传递给回调函数的私有数据

成功返回 0,如果未选择或不存在 DMI 则返回 -ENXIO,如果 DMI 遍历失败则返回不同的负错误代码。

bool dmi_match(enum dmi_field f, const char *str)

将字符串与 DMI 字段(如果存在)进行比较

参数

enum dmi_field f

DMI 字段标识符

const char *str

要与 DMI 字段进行比较的字符串

描述

如果请求的字段等于 str(包括 NULL),则返回 true。

u8 dmi_memdev_type(u16 handle)

获取内存类型

参数

u16 handle

DMI 结构句柄

描述

返回与给定 DMI 句柄关联的插槽中的模块的 DMI 内存类型,如果不存在此类 DMI 句柄,则返回 0x0。

u16 dmi_memdev_handle(int slot)

获取内存插槽的 DMI 句柄

参数

int slot

插槽号

返回与给定内存插槽关联的 DMI 句柄,如果不存在此类插槽,则返回 0xFFFF

EDD 接口

ssize_t edd_show_raw_data(struct edd_device *edev, char *buf)

将原始数据复制到缓冲区,以供用户空间解析

参数

struct edd_device *edev

目标 edd_device

char *buf

输出缓冲区

返回值

写入的字节数,失败则返回 -EINVAL

void edd_release(struct kobject *kobj)

释放 edd 结构

参数

struct kobject * kobj

edd 结构的 kobject

当 edd 结构的引用计数达到 0 时调用此函数。这应该在注销后立即发生,但以防万一,我们仍然使用 release 回调。

int edd_dev_is_type(struct edd_device *edev, const char *type)

此 EDD 设备是否为“type”设备?

参数

struct edd_device *edev

目标 edd_device

const char *type

每个 EDD 规范的主机总线或接口标识符字符串

描述

如果是“type”设备,则返回 1 (TRUE),否则返回 0。

struct pci_dev *edd_get_pci_dev(struct edd_device *edev)

查找与 edev 匹配的 pci_dev

参数

struct edd_device *edev

edd_device

描述

如果找到,则返回 pci_dev,否则返回 NULL

int edd_init(void)

创建 EDD 数据的 sysfs 树

参数

void

无参数

通用系统帧缓冲接口

void sysfb_disable(struct device *dev)

禁用通用系统帧缓冲支持

参数

struct device *dev

要检查是否非 NULL 的设备

描述

这将禁用注册与使用固件设置的系统帧缓冲区的通用驱动程序匹配的系统帧缓冲设备。

如果设备已由 sysfb_init() 注册,它也会取消注册该设备。

上下文

该函数可以休眠。获取 disable_lock 互斥锁以针对 sysfb_init() 进行序列化,后者注册系统帧缓冲设备。

bool sysfb_handles_screen_info(void)

报告 sysfb 是否处理全局 screen_info

参数

void

无参数

描述

调用者可以使用 sysfb_handles_screen_info() 来确定通用系统帧缓冲区 (sysfb) 是否可以处理全局 screen_info 数据结构。驱动程序可能需要此信息,以了解它们是否必须设置系统帧缓冲区,或者它们是否必须将此操作委托给 sysfb。

返回值

如果 sysfb 处理全局 screen_info 数据结构,则返回 True。

Intel Stratix10 SoC 服务层

Intel Stratix10 SoC 的某些功能需要高于内核被授予的特权级别。此类安全功能包括 FPGA 编程。就 ARMv8 架构而言,内核在异常级别 1 (EL1) 运行,访问这些功能需要异常级别 3 (EL3)。

Intel Stratix10 SoC 服务层为驱动程序提供了一个内核内 API,用于请求访问安全功能。请求会被排队并逐个处理。ARM 的 SMCCC 用于将请求的执行传递给安全监视器 (EL3)。

enum stratix10_svc_command_code

支持的服务命令

常量

COMMAND_NOOP

为集成/调试/故障排除执行“虚拟”请求

COMMAND_RECONFIG

请求准备 FPGA 配置,返回状态为 SVC_STATUS_OK

COMMAND_RECONFIG_DATA_SUBMIT

提交用于 FPGA 配置的位流数据缓冲区,返回状态为 SVC_STATUS_SUBMITTED 或 SVC_STATUS_ERROR

COMMAND_RECONFIG_DATA_CLAIM

检查配置状态,返回状态为 SVC_STATUS_COMPLETED 或 SVC_STATUS_BUSY 或 SVC_STATUS_ERROR

COMMAND_RECONFIG_STATUS

检查配置状态,返回状态为 SVC_STATUS_COMPLETED 或 SVC_STATUS_BUSY 或 SVC_STATUS_ERROR

COMMAND_RSU_STATUS

请求远程系统更新启动日志,返回状态为日志数据或 SVC_STATUS_RSU_ERROR

COMMAND_RSU_UPDATE

设置在重启后启动的位流偏移量,返回状态为 SVC_STATUS_OK 或 SVC_STATUS_ERROR

COMMAND_RSU_NOTIFY

向固件报告硬处理器系统软件的状态,返回状态为 SVC_STATUS_OK 或 SVC_STATUS_ERROR

COMMAND_RSU_RETRY

查询固件以获取当前映像的重试计数器,返回状态为 SVC_STATUS_OK 或 SVC_STATUS_ERROR

COMMAND_RSU_MAX_RETRY

查询固件以获取最大重试值,返回状态为 SVC_STATUS_OK 或 SVC_STATUS_ERROR

COMMAND_RSU_DCMF_VERSION

查询固件以获取 DCMF 版本,返回状态为 SVC_STATUS_OK 或 SVC_STATUS_ERROR

COMMAND_RSU_DCMF_STATUS

查询固件以获取 DCMF 状态,返回状态为 SVC_STATUS_OK 或 SVC_STATUS_ERROR

COMMAND_FIRMWARE_VERSION

查询正在运行的固件版本,返回状态为 SVC_STATUS_OK 或 SVC_STATUS_ERROR

COMMAND_FCS_REQUEST_SERVICE

请求固件验证映像,返回状态为 SVC_STATUS_OK 或 SVC_STATUS_INVALID_PARAM

COMMAND_FCS_SEND_CERTIFICATE

发送证书,返回状态为 SVC_STATUS_OK、SVC_STATUS_INVALID_PARAM、SVC_STATUS_ERROR

COMMAND_FCS_GET_PROVISION_DATA

读取配置数据,返回状态为 SVC_STATUS_OK、SVC_STATUS_INVALID_PARAM、SVC_STATUS_ERROR

COMMAND_FCS_DATA_ENCRYPTION

加密数据,返回状态为 SVC_STATUS_OK、SVC_STATUS_INVALID_PARAM、SVC_STATUS_ERROR

COMMAND_FCS_DATA_DECRYPTION

解密数据,返回状态为 SVC_STATUS_OK、SVC_STATUS_INVALID_PARAM、SVC_STATUS_ERROR

COMMAND_FCS_RANDOM_NUMBER_GEN

生成随机数,返回状态为 SVC_STATUS_OK、SVC_STATUS_ERROR

COMMAND_POLL_SERVICE_STATUS

轮询服务请求是否完成,返回状态为 SVC_STATUS_OK、SVC_STATUS_ERROR 或 SVC_STATUS_BUSY

COMMAND_MBOX_SEND_CMD

发送通用邮箱命令,返回状态为 SVC_STATUS_OK 或 SVC_STATUS_ERROR

COMMAND_SMC_SVC_VERSION

非邮箱 SMC SVC API 版本,返回状态为 SVC_STATUS_OK

struct stratix10_svc_client_msg

客户端发送给服务的消息

定义:

struct stratix10_svc_client_msg {
    void *payload;
    size_t payload_length;
    void *payload_output;
    size_t payload_length_output;
    enum stratix10_svc_command_code command;
    u64 arg[3];
};

成员

payload

需要处理的数据的起始地址

payload_length

要处理的数据大小(以字节为单位)

payload_output

处理后数据的起始地址

payload_length_output

处理后数据的大小(以字节为单位)

command

服务命令

arg

通过寄存器传递而不是通过物理映射的缓冲区传递的参数

struct stratix10_svc_command_config_type

配置类型

定义:

struct stratix10_svc_command_config_type {
    u32 flags;
};

成员

flags

FPGA 配置类型的标志位

struct stratix10_svc_cb_data

来自服务层的回调数据结构

定义:

struct stratix10_svc_cb_data {
    u32 status;
    void *kaddr1;
    void *kaddr2;
    void *kaddr3;
};

成员

status

已发送命令的状态

kaddr1

第一个已完成数据块的地址

kaddr2

第二个已完成数据块的地址

kaddr3

第三个已完成数据块的地址

struct stratix10_svc_client

服务客户端结构

定义:

struct stratix10_svc_client {
    struct device *dev;
    void (*receive_cb)(struct stratix10_svc_client *client, struct stratix10_svc_cb_data *cb_data);
    void *priv;
};

成员

dev

客户端设备

receive_cb

向服务客户端提供接收数据的回调

priv

客户端私有数据

struct stratix10_svc_chan *stratix10_svc_request_channel_byname(struct stratix10_svc_client *client, const char *name)

请求服务通道

参数

struct stratix10_svc_client *client

指向服务客户端的指针

const char *name

服务客户端名称

描述

此函数由服务客户端用于请求服务通道。

返回值

成功时返回指向分配给客户端的通道的指针,出错时返回 ERR_PTR()

void stratix10_svc_free_channel(struct stratix10_svc_chan *chan)

释放服务通道

参数

struct stratix10_svc_chan *chan

要释放的服务通道

描述

此函数由服务客户端用于释放服务通道。

int stratix10_svc_send(struct stratix10_svc_chan *chan, void *msg)

向远程发送消息数据

参数

struct stratix10_svc_chan *chan

分配给客户端的服务通道

void *msg

要发送的消息数据,格式为“struct stratix10_svc_client_msg

描述

此函数由服务客户端用于将消息添加到服务层驱动程序的队列中,以便发送到安全世界。

返回值

成功时返回 0,出错时返回 -ENOMEM 或 -ENOBUFS。

void stratix10_svc_done(struct stratix10_svc_chan *chan)

完成服务请求事务

参数

struct stratix10_svc_chan *chan

分配给客户端的服务通道

描述

当客户端完成其请求或请求过程中出现错误时,应调用此函数。它允许服务层停止正在运行的线程,以最大限度地节省内核资源。

void *stratix10_svc_allocate_memory(struct stratix10_svc_chan *chan, size_t size)

分配内存

参数

struct stratix10_svc_chan *chan

分配给客户端的服务通道

size_t size

特定服务客户端请求的内存大小

描述

服务层从内存池中分配请求的字节数缓冲区,服务客户端使用此函数获取分配的缓冲区。

返回值

成功时返回分配的内存地址,出错时返回 ERR_PTR()

void stratix10_svc_free_memory(struct stratix10_svc_chan *chan, void *kaddr)

释放已分配的内存

参数

struct stratix10_svc_chan *chan

分配给客户端的服务通道

void *kaddr

要释放的内存

描述

此函数由服务客户端用于释放已分配的缓冲区。