Surface ACPI Notify

The Surface ACPI Notify (SAN) device provides the bridge between ACPI and SAM controller. Specifically, ACPI code can execute requests and handle battery and thermal events via this interface. In addition to this, events relating to the discrete GPU (dGPU) of the Surface Book 2 can be sent from ACPI code (note: the Surface Book 3 uses a different method for this). The only currently known event sent via this interface is a dGPU power-on notification. While this driver handles the former part internally, it only relays the dGPU events to any other driver interested via its public API and does not handle them.

The public interface of this driver is split into two parts: Client registration and notifier-block registration.

A client to the SAN interface can be linked as consumer to the SAN device via san_client_link(). This can be used to ensure that the a client receiving dGPU events does not miss any events due to the SAN interface not being set up as this forces the client driver to unbind once the SAN driver is unbound.

Notifier-blocks can be registered by any device for as long as the module is loaded, regardless of being linked as client or not. Registration is done with san_dgpu_notifier_register(). If the notifier is not needed any more, it should be unregistered via san_dgpu_notifier_unregister().

Consult the API documentation below for more details.

API Documentation

struct san_dgpu_event

Discrete GPU ACPI event.


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



Category of the event.


Target ID of the event source.


Command ID of the event.


Instance ID of the event source.


Length of the event's payload data (in bytes).


Pointer to the event's payload data.

Link client as consumer to SAN device.


struct device *client

The client to link.


Sets up a device link between the provided client device as consumer and the SAN device as provider. This function can be used to ensure that the SAN interface has been set up and will be set up for as long as the driver of the client device is bound. This guarantees that, during that time, all dGPU events will be received by any registered notifier.

The link will be automatically removed once the client device's driver is unbound.


Returns zero on success, -ENXIO if the SAN interface has not been set up yet, and -ENOMEM if device link creation failed.

int san_dgpu_notifier_register(struct notifier_block *nb)

Register a SAN dGPU notifier.


struct notifier_block *nb

The notifier-block to register.


Registers a SAN dGPU notifier, receiving any new SAN dGPU events sent from ACPI. The registered notifier will be called with struct san_dgpu_event as notifier data and the command ID of that event as notifier action.

int san_dgpu_notifier_unregister(struct notifier_block *nb)

Unregister a SAN dGPU notifier.


struct notifier_block *nb

The notifier-block to unregister.