| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718 |
- .. SPDX-License-Identifier: GPL-2.0+
- .. |__u16| replace:: :c:type:`__u16 <__u16>`
- .. |sdtx_event| replace:: :c:type:`struct sdtx_event <sdtx_event>`
- .. |sdtx_event_code| replace:: :c:type:`enum sdtx_event_code <sdtx_event_code>`
- .. |sdtx_base_info| replace:: :c:type:`struct sdtx_base_info <sdtx_base_info>`
- .. |sdtx_device_mode| replace:: :c:type:`struct sdtx_device_mode <sdtx_device_mode>`
- ======================================================
- User-Space DTX (Clipboard Detachment System) Interface
- ======================================================
- The ``surface_dtx`` driver is responsible for proper clipboard detachment
- and re-attachment handling. To this end, it provides the ``/dev/surface/dtx``
- device file, through which it can interface with a user-space daemon. This
- daemon is then ultimately responsible for determining and taking necessary
- actions, such as unmounting devices attached to the base,
- unloading/reloading the graphics-driver, user-notifications, etc.
- There are two basic communication principles used in this driver: Commands
- (in other parts of the documentation also referred to as requests) and
- events. Commands are sent to the EC and may have a different implications in
- different contexts. Events are sent by the EC upon some internal state
- change. Commands are always driver-initiated, whereas events are always
- initiated by the EC.
- .. contents::
- Nomenclature
- ============
- * **Clipboard:**
- The detachable upper part of the Surface Book, housing the screen and CPU.
- * **Base:**
- The lower part of the Surface Book from which the clipboard can be
- detached, optionally (model dependent) housing the discrete GPU (dGPU).
- * **Latch:**
- The mechanism keeping the clipboard attached to the base in normal
- operation and allowing it to be detached when requested.
- * **Silently ignored commands:**
- The command is accepted by the EC as a valid command and acknowledged
- (following the standard communication protocol), but the EC does not act
- upon it, i.e. ignores it.e upper part of the
- Detachment Process
- ==================
- Warning: This part of the documentation is based on reverse engineering and
- testing and thus may contain errors or be incomplete.
- Latch States
- ------------
- The latch mechanism has two major states: *open* and *closed*. In the
- *closed* state (default), the clipboard is secured to the base, whereas in
- the *open* state, the clipboard can be removed by a user.
- The latch can additionally be locked and, correspondingly, unlocked, which
- can influence the detachment procedure. Specifically, this locking mechanism
- is intended to prevent the dGPU, positioned in the base of the device, from
- being hot-unplugged while in use. More details can be found in the
- documentation for the detachment procedure below. By default, the latch is
- unlocked.
- Detachment Procedure
- --------------------
- Note that the detachment process is governed fully by the EC. The
- ``surface_dtx`` driver only relays events from the EC to user-space and
- commands from user-space to the EC, i.e. it does not influence this process.
- The detachment process is started with the user pressing the *detach* button
- on the base of the device or executing the ``SDTX_IOCTL_LATCH_REQUEST`` IOCTL.
- Following that:
- 1. The EC turns on the indicator led on the detach-button, sends a
- *detach-request* event (``SDTX_EVENT_REQUEST``), and awaits further
- instructions/commands. In case the latch is unlocked, the led will flash
- green. If the latch has been locked, the led will be solid red
- 2. The event is, via the ``surface_dtx`` driver, relayed to user-space, where
- an appropriate user-space daemon can handle it and send instructions back
- to the EC via IOCTLs provided by this driver.
- 3. The EC waits for instructions from user-space and acts according to them.
- If the EC does not receive any instructions in a given period, it will
- time out and continue as follows:
- - If the latch is unlocked, the EC will open the latch and the clipboard
- can be detached from the base. This is the exact behavior as without
- this driver or any user-space daemon. See the ``SDTX_IOCTL_LATCH_CONFIRM``
- description below for more details on the follow-up behavior of the EC.
- - If the latch is locked, the EC will *not* open the latch, meaning the
- clipboard cannot be detached from the base. Furthermore, the EC sends
- an cancel event (``SDTX_EVENT_CANCEL``) detailing this with the cancel
- reason ``SDTX_DETACH_TIMEDOUT`` (see :ref:`events` for details).
- Valid responses by a user-space daemon to a detachment request event are:
- - Execute ``SDTX_IOCTL_LATCH_REQUEST``. This will immediately abort the
- detachment process. Furthermore, the EC will send a detach-request event,
- similar to the user pressing the detach-button to cancel said process (see
- below).
- - Execute ``SDTX_IOCTL_LATCH_CONFIRM``. This will cause the EC to open the
- latch, after which the user can separate clipboard and base.
- As this changes the latch state, a *latch-status* event
- (``SDTX_EVENT_LATCH_STATUS``) will be sent once the latch has been opened
- successfully. If the EC fails to open the latch, e.g. due to hardware
- error or low battery, a latch-cancel event (``SDTX_EVENT_CANCEL``) will be
- sent with the cancel reason indicating the specific failure.
- If the latch is currently locked, the latch will automatically be
- unlocked before it is opened.
- - Execute ``SDTX_IOCTL_LATCH_HEARTBEAT``. This will reset the internal timeout.
- No other actions will be performed, i.e. the detachment process will neither
- be completed nor canceled, and the EC will still be waiting for further
- responses.
- - Execute ``SDTX_IOCTL_LATCH_CANCEL``. This will abort the detachment process,
- similar to ``SDTX_IOCTL_LATCH_REQUEST``, described above, or the button
- press, described below. A *generic request* event (``SDTX_EVENT_REQUEST``)
- is send in response to this. In contrast to those, however, this command
- does not trigger a new detachment process if none is currently in
- progress.
- - Do nothing. The detachment process eventually times out as described in
- point 3.
- See :ref:`ioctls` for more details on these responses.
- It is important to note that, if the user presses the detach button at any
- point when a detachment operation is in progress (i.e. after the EC has sent
- the initial *detach-request* event (``SDTX_EVENT_REQUEST``) and before it
- received the corresponding response concluding the process), the detachment
- process is canceled on the EC-level and an identical event is being sent.
- Thus a *detach-request* event, by itself, does not signal the start of the
- detachment process.
- The detachment process may further be canceled by the EC due to hardware
- failures or a low clipboard battery. This is done via a cancel event
- (``SDTX_EVENT_CANCEL``) with the corresponding cancel reason.
- User-Space Interface Documentation
- ==================================
- Error Codes and Status Values
- -----------------------------
- Error and status codes are divided into different categories, which can be
- used to determine if the status code is an error, and, if it is, the
- severity and type of that error. The current categories are:
- .. flat-table:: Overview of Status/Error Categories.
- :widths: 2 1 3
- :header-rows: 1
- * - Name
- - Value
- - Short Description
- * - ``STATUS``
- - ``0x0000``
- - Non-error status codes.
- * - ``RUNTIME_ERROR``
- - ``0x1000``
- - Non-critical runtime errors.
- * - ``HARDWARE_ERROR``
- - ``0x2000``
- - Critical hardware failures.
- * - ``UNKNOWN``
- - ``0xF000``
- - Unknown error codes.
- Other categories are reserved for future use. The ``SDTX_CATEGORY()`` macro
- can be used to determine the category of any status value. The
- ``SDTX_SUCCESS()`` macro can be used to check if the status value is a
- success value (``SDTX_CATEGORY_STATUS``) or if it indicates a failure.
- Unknown status or error codes sent by the EC are assigned to the ``UNKNOWN``
- category by the driver and may be implemented via their own code in the
- future.
- Currently used error codes are:
- .. flat-table:: Overview of Error Codes.
- :widths: 2 1 1 3
- :header-rows: 1
- * - Name
- - Category
- - Value
- - Short Description
- * - ``SDTX_DETACH_NOT_FEASIBLE``
- - ``RUNTIME``
- - ``0x1001``
- - Detachment not feasible due to low clipboard battery.
- * - ``SDTX_DETACH_TIMEDOUT``
- - ``RUNTIME``
- - ``0x1002``
- - Detachment process timed out while the latch was locked.
- * - ``SDTX_ERR_FAILED_TO_OPEN``
- - ``HARDWARE``
- - ``0x2001``
- - Failed to open latch.
- * - ``SDTX_ERR_FAILED_TO_REMAIN_OPEN``
- - ``HARDWARE``
- - ``0x2002``
- - Failed to keep latch open.
- * - ``SDTX_ERR_FAILED_TO_CLOSE``
- - ``HARDWARE``
- - ``0x2003``
- - Failed to close latch.
- Other error codes are reserved for future use. Non-error status codes may
- overlap and are generally only unique within their use-case:
- .. flat-table:: Latch Status Codes.
- :widths: 2 1 1 3
- :header-rows: 1
- * - Name
- - Category
- - Value
- - Short Description
- * - ``SDTX_LATCH_CLOSED``
- - ``STATUS``
- - ``0x0000``
- - Latch is closed/has been closed.
- * - ``SDTX_LATCH_OPENED``
- - ``STATUS``
- - ``0x0001``
- - Latch is open/has been opened.
- .. flat-table:: Base State Codes.
- :widths: 2 1 1 3
- :header-rows: 1
- * - Name
- - Category
- - Value
- - Short Description
- * - ``SDTX_BASE_DETACHED``
- - ``STATUS``
- - ``0x0000``
- - Base has been detached/is not present.
- * - ``SDTX_BASE_ATTACHED``
- - ``STATUS``
- - ``0x0001``
- - Base has been attached/is present.
- Again, other codes are reserved for future use.
- .. _events:
- Events
- ------
- Events can be received by reading from the device file. They are disabled by
- default and have to be enabled by executing ``SDTX_IOCTL_EVENTS_ENABLE``
- first. All events follow the layout prescribed by |sdtx_event|. Specific
- event types can be identified by their event code, described in
- |sdtx_event_code|. Note that other event codes are reserved for future use,
- thus an event parser must be able to handle any unknown/unsupported event
- types gracefully, by relying on the payload length given in the event header.
- Currently provided event types are:
- .. flat-table:: Overview of DTX events.
- :widths: 2 1 1 3
- :header-rows: 1
- * - Name
- - Code
- - Payload
- - Short Description
- * - ``SDTX_EVENT_REQUEST``
- - ``1``
- - ``0`` bytes
- - Detachment process initiated/aborted.
- * - ``SDTX_EVENT_CANCEL``
- - ``2``
- - ``2`` bytes
- - EC canceled detachment process.
- * - ``SDTX_EVENT_BASE_CONNECTION``
- - ``3``
- - ``4`` bytes
- - Base connection state changed.
- * - ``SDTX_EVENT_LATCH_STATUS``
- - ``4``
- - ``2`` bytes
- - Latch status changed.
- * - ``SDTX_EVENT_DEVICE_MODE``
- - ``5``
- - ``2`` bytes
- - Device mode changed.
- Individual events in more detail:
- ``SDTX_EVENT_REQUEST``
- ^^^^^^^^^^^^^^^^^^^^^^
- Sent when a detachment process is started or, if in progress, aborted by the
- user, either via a detach button press or a detach request
- (``SDTX_IOCTL_LATCH_REQUEST``) being sent from user-space.
- Does not have any payload.
- ``SDTX_EVENT_CANCEL``
- ^^^^^^^^^^^^^^^^^^^^^
- Sent when a detachment process is canceled by the EC due to unfulfilled
- preconditions (e.g. clipboard battery too low to detach) or hardware
- failure. The reason for cancellation is given in the event payload detailed
- below and can be one of
- * ``SDTX_DETACH_TIMEDOUT``: Detachment timed out while the latch was locked.
- The latch has neither been opened nor unlocked.
- * ``SDTX_DETACH_NOT_FEASIBLE``: Detachment not feasible due to low clipboard
- battery.
- * ``SDTX_ERR_FAILED_TO_OPEN``: Could not open the latch (hardware failure).
- * ``SDTX_ERR_FAILED_TO_REMAIN_OPEN``: Could not keep the latch open (hardware
- failure).
- * ``SDTX_ERR_FAILED_TO_CLOSE``: Could not close the latch (hardware failure).
- Other error codes in this context are reserved for future use.
- These codes can be classified via the ``SDTX_CATEGORY()`` macro to discern
- between critical hardware errors (``SDTX_CATEGORY_HARDWARE_ERROR``) or
- runtime errors (``SDTX_CATEGORY_RUNTIME_ERROR``), the latter of which may
- happen during normal operation if certain preconditions for detachment are
- not given.
- .. flat-table:: Detachment Cancel Event Payload
- :widths: 1 1 4
- :header-rows: 1
- * - Field
- - Type
- - Description
- * - ``reason``
- - |__u16|
- - Reason for cancellation.
- ``SDTX_EVENT_BASE_CONNECTION``
- ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
- Sent when the base connection state has changed, i.e. when the base has been
- attached, detached, or detachment has become infeasible due to low clipboard
- battery. The new state and, if a base is connected, ID of the base is
- provided as payload of type |sdtx_base_info| with its layout presented
- below:
- .. flat-table:: Base-Connection-Change Event Payload
- :widths: 1 1 4
- :header-rows: 1
- * - Field
- - Type
- - Description
- * - ``state``
- - |__u16|
- - Base connection state.
- * - ``base_id``
- - |__u16|
- - Type of base connected (zero if none).
- Possible values for ``state`` are:
- * ``SDTX_BASE_DETACHED``,
- * ``SDTX_BASE_ATTACHED``, and
- * ``SDTX_DETACH_NOT_FEASIBLE``.
- Other values are reserved for future use.
- ``SDTX_EVENT_LATCH_STATUS``
- ^^^^^^^^^^^^^^^^^^^^^^^^^^^
- Sent when the latch status has changed, i.e. when the latch has been opened,
- closed, or an error occurred. The current status is provided as payload:
- .. flat-table:: Latch-Status-Change Event Payload
- :widths: 1 1 4
- :header-rows: 1
- * - Field
- - Type
- - Description
- * - ``status``
- - |__u16|
- - Latch status.
- Possible values for ``status`` are:
- * ``SDTX_LATCH_CLOSED``,
- * ``SDTX_LATCH_OPENED``,
- * ``SDTX_ERR_FAILED_TO_OPEN``,
- * ``SDTX_ERR_FAILED_TO_REMAIN_OPEN``, and
- * ``SDTX_ERR_FAILED_TO_CLOSE``.
- Other values are reserved for future use.
- ``SDTX_EVENT_DEVICE_MODE``
- ^^^^^^^^^^^^^^^^^^^^^^^^^^
- Sent when the device mode has changed. The new device mode is provided as
- payload:
- .. flat-table:: Device-Mode-Change Event Payload
- :widths: 1 1 4
- :header-rows: 1
- * - Field
- - Type
- - Description
- * - ``mode``
- - |__u16|
- - Device operation mode.
- Possible values for ``mode`` are:
- * ``SDTX_DEVICE_MODE_TABLET``,
- * ``SDTX_DEVICE_MODE_LAPTOP``, and
- * ``SDTX_DEVICE_MODE_STUDIO``.
- Other values are reserved for future use.
- .. _ioctls:
- IOCTLs
- ------
- The following IOCTLs are provided:
- .. flat-table:: Overview of DTX IOCTLs
- :widths: 1 1 1 1 4
- :header-rows: 1
- * - Type
- - Number
- - Direction
- - Name
- - Description
- * - ``0xA5``
- - ``0x21``
- - ``-``
- - ``EVENTS_ENABLE``
- - Enable events for the current file descriptor.
- * - ``0xA5``
- - ``0x22``
- - ``-``
- - ``EVENTS_DISABLE``
- - Disable events for the current file descriptor.
- * - ``0xA5``
- - ``0x23``
- - ``-``
- - ``LATCH_LOCK``
- - Lock the latch.
- * - ``0xA5``
- - ``0x24``
- - ``-``
- - ``LATCH_UNLOCK``
- - Unlock the latch.
- * - ``0xA5``
- - ``0x25``
- - ``-``
- - ``LATCH_REQUEST``
- - Request clipboard detachment.
- * - ``0xA5``
- - ``0x26``
- - ``-``
- - ``LATCH_CONFIRM``
- - Confirm clipboard detachment request.
- * - ``0xA5``
- - ``0x27``
- - ``-``
- - ``LATCH_HEARTBEAT``
- - Send heartbeat signal to EC.
- * - ``0xA5``
- - ``0x28``
- - ``-``
- - ``LATCH_CANCEL``
- - Cancel detachment process.
- * - ``0xA5``
- - ``0x29``
- - ``R``
- - ``GET_BASE_INFO``
- - Get current base/connection information.
- * - ``0xA5``
- - ``0x2A``
- - ``R``
- - ``GET_DEVICE_MODE``
- - Get current device operation mode.
- * - ``0xA5``
- - ``0x2B``
- - ``R``
- - ``GET_LATCH_STATUS``
- - Get current device latch status.
- ``SDTX_IOCTL_EVENTS_ENABLE``
- ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
- Defined as ``_IO(0xA5, 0x22)``.
- Enable events for the current file descriptor. Events can be obtained by
- reading from the device, if enabled. Events are disabled by default.
- ``SDTX_IOCTL_EVENTS_DISABLE``
- ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
- Defined as ``_IO(0xA5, 0x22)``.
- Disable events for the current file descriptor. Events can be obtained by
- reading from the device, if enabled. Events are disabled by default.
- ``SDTX_IOCTL_LATCH_LOCK``
- ^^^^^^^^^^^^^^^^^^^^^^^^^
- Defined as ``_IO(0xA5, 0x23)``.
- Locks the latch, causing the detachment procedure to abort without opening
- the latch on timeout. The latch is unlocked by default. This command will be
- silently ignored if the latch is already locked.
- ``SDTX_IOCTL_LATCH_UNLOCK``
- ^^^^^^^^^^^^^^^^^^^^^^^^^^^
- Defined as ``_IO(0xA5, 0x24)``.
- Unlocks the latch, causing the detachment procedure to open the latch on
- timeout. The latch is unlocked by default. This command will not open the
- latch when sent during an ongoing detachment process. It will be silently
- ignored if the latch is already unlocked.
- ``SDTX_IOCTL_LATCH_REQUEST``
- ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
- Defined as ``_IO(0xA5, 0x25)``.
- Generic latch request. Behavior depends on the context: If no
- detachment-process is active, detachment is requested. Otherwise the
- currently active detachment-process will be aborted.
- If a detachment process is canceled by this operation, a generic detachment
- request event (``SDTX_EVENT_REQUEST``) will be sent.
- This essentially behaves the same as a detachment button press.
- ``SDTX_IOCTL_LATCH_CONFIRM``
- ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
- Defined as ``_IO(0xA5, 0x26)``.
- Acknowledges and confirms a latch request. If sent during an ongoing
- detachment process, this command causes the latch to be opened immediately.
- The latch will also be opened if it has been locked. In this case, the latch
- lock is reset to the unlocked state.
- This command will be silently ignored if there is currently no detachment
- procedure in progress.
- ``SDTX_IOCTL_LATCH_HEARTBEAT``
- ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
- Defined as ``_IO(0xA5, 0x27)``.
- Sends a heartbeat, essentially resetting the detachment timeout. This
- command can be used to keep the detachment process alive while work required
- for the detachment to succeed is still in progress.
- This command will be silently ignored if there is currently no detachment
- procedure in progress.
- ``SDTX_IOCTL_LATCH_CANCEL``
- ^^^^^^^^^^^^^^^^^^^^^^^^^^^
- Defined as ``_IO(0xA5, 0x28)``.
- Cancels detachment in progress (if any). If a detachment process is canceled
- by this operation, a generic detachment request event
- (``SDTX_EVENT_REQUEST``) will be sent.
- This command will be silently ignored if there is currently no detachment
- procedure in progress.
- ``SDTX_IOCTL_GET_BASE_INFO``
- ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
- Defined as ``_IOR(0xA5, 0x29, struct sdtx_base_info)``.
- Get the current base connection state (i.e. attached/detached) and the type
- of the base connected to the clipboard. This is command essentially provides
- a way to query the information provided by the base connection change event
- (``SDTX_EVENT_BASE_CONNECTION``).
- Possible values for ``struct sdtx_base_info.state`` are:
- * ``SDTX_BASE_DETACHED``,
- * ``SDTX_BASE_ATTACHED``, and
- * ``SDTX_DETACH_NOT_FEASIBLE``.
- Other values are reserved for future use.
- ``SDTX_IOCTL_GET_DEVICE_MODE``
- ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
- Defined as ``_IOR(0xA5, 0x2A, __u16)``.
- Returns the device operation mode, indicating if and how the base is
- attached to the clipboard. This is command essentially provides a way to
- query the information provided by the device mode change event
- (``SDTX_EVENT_DEVICE_MODE``).
- Returned values are:
- * ``SDTX_DEVICE_MODE_LAPTOP``
- * ``SDTX_DEVICE_MODE_TABLET``
- * ``SDTX_DEVICE_MODE_STUDIO``
- See |sdtx_device_mode| for details. Other values are reserved for future
- use.
- ``SDTX_IOCTL_GET_LATCH_STATUS``
- ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
- Defined as ``_IOR(0xA5, 0x2B, __u16)``.
- Get the current latch status or (presumably) the last error encountered when
- trying to open/close the latch. This is command essentially provides a way
- to query the information provided by the latch status change event
- (``SDTX_EVENT_LATCH_STATUS``).
- Returned values are:
- * ``SDTX_LATCH_CLOSED``,
- * ``SDTX_LATCH_OPENED``,
- * ``SDTX_ERR_FAILED_TO_OPEN``,
- * ``SDTX_ERR_FAILED_TO_REMAIN_OPEN``, and
- * ``SDTX_ERR_FAILED_TO_CLOSE``.
- Other values are reserved for future use.
- A Note on Base IDs
- ------------------
- Base types/IDs provided via ``SDTX_EVENT_BASE_CONNECTION`` or
- ``SDTX_IOCTL_GET_BASE_INFO`` are directly forwarded from the EC in the lower
- byte of the combined |__u16| value, with the driver storing the EC type from
- which this ID comes in the high byte (without this, base IDs over different
- types of ECs may be overlapping).
- The ``SDTX_DEVICE_TYPE()`` macro can be used to determine the EC device
- type. This can be one of
- * ``SDTX_DEVICE_TYPE_HID``, for Surface Aggregator Module over HID, and
- * ``SDTX_DEVICE_TYPE_SSH``, for Surface Aggregator Module over Surface Serial
- Hub.
- Note that currently only the ``SSH`` type EC is supported, however ``HID``
- type is reserved for future use.
- Structures and Enums
- --------------------
- .. kernel-doc:: include/uapi/linux/surface_aggregator/dtx.h
- API Users
- =========
- A user-space daemon utilizing this API can be found at
- https://github.com/linux-surface/surface-dtx-daemon.
|