719 lines
		
	
	
		
			21 KiB
		
	
	
	
		
			ReStructuredText
		
	
	
	
	
	
			
		
		
	
	
			719 lines
		
	
	
		
			21 KiB
		
	
	
	
		
			ReStructuredText
		
	
	
	
	
	
| .. 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.
 |