Surface ACPI 通知

Surface ACPI 通知 (SAN) 设备提供了 ACPI 和 SAM 控制器之间的桥梁。具体来说,ACPI 代码可以通过此接口执行请求并处理电池和散热事件。除此之外,与 Surface Book 2 的独立 GPU (dGPU) 相关的事件可以从 ACPI 代码发送(注意:Surface Book 3 使用不同的方法)。目前已知通过此接口发送的唯一事件是 dGPU 上电通知。虽然此驱动程序在内部处理前者,但它仅通过其公共 API 将 dGPU 事件中继到任何其他感兴趣的驱动程序,并且不处理它们。

此驱动程序的公共接口分为两部分:客户端注册和通知程序块注册。

SAN 接口的客户端可以通过 san_client_link() 作为消费者链接到 SAN 设备。这可用于确保接收 dGPU 事件的客户端不会因 SAN 接口未设置而错过任何事件,因为这会强制客户端驱动程序在 SAN 驱动程序取消绑定后取消绑定。

只要模块已加载,任何设备都可以注册通知程序块,无论是否作为客户端链接。注册通过 san_dgpu_notifier_register() 完成。如果不再需要通知程序,则应通过 san_dgpu_notifier_unregister() 取消注册。

有关更多详细信息,请参阅下面的 API 文档。

API 文档

struct san_dgpu_event

独立 GPU ACPI 事件。

定义:

struct san_dgpu_event {
    u8 category;
    u8 target;
    u8 command;
    u8 instance;
    u16 length;
    u8 *payload;
};

成员

category

事件的类别。

target

事件源的目标 ID。

command

事件的命令 ID。

instance

事件源的实例 ID。

length

事件有效负载数据的长度(以字节为单位)。

payload

指向事件有效负载数据的指针。

将客户端链接为 SAN 设备的消费者。

参数

struct device *client

要链接的客户端。

描述

在提供的客户端设备作为消费者和 SAN 设备作为提供者之间设置设备链接。此函数可用于确保已设置 SAN 接口,并且只要客户端设备的驱动程序已绑定,就会设置 SAN 接口。这保证了在此期间,任何注册的通知程序都将收到所有 dGPU 事件。

一旦客户端设备的驱动程序取消绑定,该链接将自动删除。

返回

成功时返回零,如果尚未设置 SAN 接口,则返回 -ENXIO,如果设备链接创建失败,则返回 -ENOMEM

int san_dgpu_notifier_register(struct notifier_block *nb)

注册 SAN dGPU 通知程序。

参数

struct notifier_block *nb

要注册的通知程序块。

描述

注册 SAN dGPU 通知程序,接收从 ACPI 发送的任何新的 SAN dGPU 事件。注册的通知程序将使用 struct san_dgpu_event 作为通知程序数据和该事件的命令 ID 作为通知程序操作进行调用。

int san_dgpu_notifier_unregister(struct notifier_block *nb)

取消注册 SAN dGPU 通知程序。

参数

struct notifier_block *nb

要取消注册的通知程序块。