1.. SPDX-License-Identifier: GPL-2.0+
2
3.. |__u16| replace:: :c:type:`__u16 <__u16>`
4.. |sdtx_event| replace:: :c:type:`struct sdtx_event <sdtx_event>`
5.. |sdtx_event_code| replace:: :c:type:`enum sdtx_event_code <sdtx_event_code>`
6.. |sdtx_base_info| replace:: :c:type:`struct sdtx_base_info <sdtx_base_info>`
7.. |sdtx_device_mode| replace:: :c:type:`struct sdtx_device_mode <sdtx_device_mode>`
8
9======================================================
10User-Space DTX (Clipboard Detachment System) Interface
11======================================================
12
13The ``surface_dtx`` driver is responsible for proper clipboard detachment
14and re-attachment handling. To this end, it provides the ``/dev/surface/dtx``
15device file, through which it can interface with a user-space daemon. This
16daemon is then ultimately responsible for determining and taking necessary
17actions, such as unmounting devices attached to the base,
18unloading/reloading the graphics-driver, user-notifications, etc.
19
20There are two basic communication principles used in this driver: Commands
21(in other parts of the documentation also referred to as requests) and
22events. Commands are sent to the EC and may have a different implications in
23different contexts. Events are sent by the EC upon some internal state
24change. Commands are always driver-initiated, whereas events are always
25initiated by the EC.
26
27.. contents::
28
29Nomenclature
30============
31
32* **Clipboard:**
33  The detachable upper part of the Surface Book, housing the screen and CPU.
34
35* **Base:**
36  The lower part of the Surface Book from which the clipboard can be
37  detached, optionally (model dependent) housing the discrete GPU (dGPU).
38
39* **Latch:**
40  The mechanism keeping the clipboard attached to the base in normal
41  operation and allowing it to be detached when requested.
42
43* **Silently ignored commands:**
44  The command is accepted by the EC as a valid command and acknowledged
45  (following the standard communication protocol), but the EC does not act
46  upon it, i.e. ignores it.e upper part of the
47
48
49Detachment Process
50==================
51
52Warning: This part of the documentation is based on reverse engineering and
53testing and thus may contain errors or be incomplete.
54
55Latch States
56------------
57
58The latch mechanism has two major states: *open* and *closed*. In the
59*closed* state (default), the clipboard is secured to the base, whereas in
60the *open* state, the clipboard can be removed by a user.
61
62The latch can additionally be locked and, correspondingly, unlocked, which
63can influence the detachment procedure. Specifically, this locking mechanism
64is intended to prevent the dGPU, positioned in the base of the device, from
65being hot-unplugged while in use. More details can be found in the
66documentation for the detachment procedure below. By default, the latch is
67unlocked.
68
69Detachment Procedure
70--------------------
71
72Note that the detachment process is governed fully by the EC. The
73``surface_dtx`` driver only relays events from the EC to user-space and
74commands from user-space to the EC, i.e. it does not influence this process.
75
76The detachment process is started with the user pressing the *detach* button
77on the base of the device or executing the ``SDTX_IOCTL_LATCH_REQUEST`` IOCTL.
78Following that:
79
801. The EC turns on the indicator led on the detach-button, sends a
81   *detach-request* event (``SDTX_EVENT_REQUEST``), and awaits further
82   instructions/commands. In case the latch is unlocked, the led will flash
83   green. If the latch has been locked, the led will be solid red
84
852. The event is, via the ``surface_dtx`` driver, relayed to user-space, where
86   an appropriate user-space daemon can handle it and send instructions back
87   to the EC via IOCTLs provided by this driver.
88
893. The EC waits for instructions from user-space and acts according to them.
90   If the EC does not receive any instructions in a given period, it will
91   time out and continue as follows:
92
93   - If the latch is unlocked, the EC will open the latch and the clipboard
94     can be detached from the base. This is the exact behavior as without
95     this driver or any user-space daemon. See the ``SDTX_IOCTL_LATCH_CONFIRM``
96     description below for more details on the follow-up behavior of the EC.
97
98   - If the latch is locked, the EC will *not* open the latch, meaning the
99     clipboard cannot be detached from the base. Furthermore, the EC sends
100     an cancel event (``SDTX_EVENT_CANCEL``) detailing this with the cancel
101     reason ``SDTX_DETACH_TIMEDOUT`` (see :ref:`events` for details).
102
103Valid responses by a user-space daemon to a detachment request event are:
104
105- Execute ``SDTX_IOCTL_LATCH_REQUEST``. This will immediately abort the
106  detachment process. Furthermore, the EC will send a detach-request event,
107  similar to the user pressing the detach-button to cancel said process (see
108  below).
109
110- Execute ``SDTX_IOCTL_LATCH_CONFIRM``. This will cause the EC to open the
111  latch, after which the user can separate clipboard and base.
112
113  As this changes the latch state, a *latch-status* event
114  (``SDTX_EVENT_LATCH_STATUS``) will be sent once the latch has been opened
115  successfully. If the EC fails to open the latch, e.g. due to hardware
116  error or low battery, a latch-cancel event (``SDTX_EVENT_CANCEL``) will be
117  sent with the cancel reason indicating the specific failure.
118
119  If the latch is currently locked, the latch will automatically be
120  unlocked before it is opened.
121
122- Execute ``SDTX_IOCTL_LATCH_HEARTBEAT``. This will reset the internal timeout.
123  No other actions will be performed, i.e. the detachment process will neither
124  be completed nor canceled, and the EC will still be waiting for further
125  responses.
126
127- Execute ``SDTX_IOCTL_LATCH_CANCEL``. This will abort the detachment process,
128  similar to ``SDTX_IOCTL_LATCH_REQUEST``, described above, or the button
129  press, described below. A *generic request* event (``SDTX_EVENT_REQUEST``)
130  is send in response to this. In contrast to those, however, this command
131  does not trigger a new detachment process if none is currently in
132  progress.
133
134- Do nothing. The detachment process eventually times out as described in
135  point 3.
136
137See :ref:`ioctls` for more details on these responses.
138
139It is important to note that, if the user presses the detach button at any
140point when a detachment operation is in progress (i.e. after the EC has sent
141the initial *detach-request* event (``SDTX_EVENT_REQUEST``) and before it
142received the corresponding response concluding the process), the detachment
143process is canceled on the EC-level and an identical event is being sent.
144Thus a *detach-request* event, by itself, does not signal the start of the
145detachment process.
146
147The detachment process may further be canceled by the EC due to hardware
148failures or a low clipboard battery. This is done via a cancel event
149(``SDTX_EVENT_CANCEL``) with the corresponding cancel reason.
150
151
152User-Space Interface Documentation
153==================================
154
155Error Codes and Status Values
156-----------------------------
157
158Error and status codes are divided into different categories, which can be
159used to determine if the status code is an error, and, if it is, the
160severity and type of that error. The current categories are:
161
162.. flat-table:: Overview of Status/Error Categories.
163   :widths: 2 1 3
164   :header-rows: 1
165
166   * - Name
167     - Value
168     - Short Description
169
170   * - ``STATUS``
171     - ``0x0000``
172     - Non-error status codes.
173
174   * - ``RUNTIME_ERROR``
175     - ``0x1000``
176     - Non-critical runtime errors.
177
178   * - ``HARDWARE_ERROR``
179     - ``0x2000``
180     - Critical hardware failures.
181
182   * - ``UNKNOWN``
183     - ``0xF000``
184     - Unknown error codes.
185
186Other categories are reserved for future use. The ``SDTX_CATEGORY()`` macro
187can be used to determine the category of any status value. The
188``SDTX_SUCCESS()`` macro can be used to check if the status value is a
189success value (``SDTX_CATEGORY_STATUS``) or if it indicates a failure.
190
191Unknown status or error codes sent by the EC are assigned to the ``UNKNOWN``
192category by the driver and may be implemented via their own code in the
193future.
194
195Currently used error codes are:
196
197.. flat-table:: Overview of Error Codes.
198   :widths: 2 1 1 3
199   :header-rows: 1
200
201   * - Name
202     - Category
203     - Value
204     - Short Description
205
206   * - ``SDTX_DETACH_NOT_FEASIBLE``
207     - ``RUNTIME``
208     - ``0x1001``
209     - Detachment not feasible due to low clipboard battery.
210
211   * - ``SDTX_DETACH_TIMEDOUT``
212     - ``RUNTIME``
213     - ``0x1002``
214     - Detachment process timed out while the latch was locked.
215
216   * - ``SDTX_ERR_FAILED_TO_OPEN``
217     - ``HARDWARE``
218     - ``0x2001``
219     - Failed to open latch.
220
221   * - ``SDTX_ERR_FAILED_TO_REMAIN_OPEN``
222     - ``HARDWARE``
223     - ``0x2002``
224     - Failed to keep latch open.
225
226   * - ``SDTX_ERR_FAILED_TO_CLOSE``
227     - ``HARDWARE``
228     - ``0x2003``
229     - Failed to close latch.
230
231Other error codes are reserved for future use. Non-error status codes may
232overlap and are generally only unique within their use-case:
233
234.. flat-table:: Latch Status Codes.
235   :widths: 2 1 1 3
236   :header-rows: 1
237
238   * - Name
239     - Category
240     - Value
241     - Short Description
242
243   * - ``SDTX_LATCH_CLOSED``
244     - ``STATUS``
245     - ``0x0000``
246     - Latch is closed/has been closed.
247
248   * - ``SDTX_LATCH_OPENED``
249     - ``STATUS``
250     - ``0x0001``
251     - Latch is open/has been opened.
252
253.. flat-table:: Base State Codes.
254   :widths: 2 1 1 3
255   :header-rows: 1
256
257   * - Name
258     - Category
259     - Value
260     - Short Description
261
262   * - ``SDTX_BASE_DETACHED``
263     - ``STATUS``
264     - ``0x0000``
265     - Base has been detached/is not present.
266
267   * - ``SDTX_BASE_ATTACHED``
268     - ``STATUS``
269     - ``0x0001``
270     - Base has been attached/is present.
271
272Again, other codes are reserved for future use.
273
274.. _events:
275
276Events
277------
278
279Events can be received by reading from the device file. They are disabled by
280default and have to be enabled by executing ``SDTX_IOCTL_EVENTS_ENABLE``
281first. All events follow the layout prescribed by |sdtx_event|. Specific
282event types can be identified by their event code, described in
283|sdtx_event_code|. Note that other event codes are reserved for future use,
284thus an event parser must be able to handle any unknown/unsupported event
285types gracefully, by relying on the payload length given in the event header.
286
287Currently provided event types are:
288
289.. flat-table:: Overview of DTX events.
290   :widths: 2 1 1 3
291   :header-rows: 1
292
293   * - Name
294     - Code
295     - Payload
296     - Short Description
297
298   * - ``SDTX_EVENT_REQUEST``
299     - ``1``
300     - ``0`` bytes
301     - Detachment process initiated/aborted.
302
303   * - ``SDTX_EVENT_CANCEL``
304     - ``2``
305     - ``2`` bytes
306     - EC canceled detachment process.
307
308   * - ``SDTX_EVENT_BASE_CONNECTION``
309     - ``3``
310     - ``4`` bytes
311     - Base connection state changed.
312
313   * - ``SDTX_EVENT_LATCH_STATUS``
314     - ``4``
315     - ``2`` bytes
316     - Latch status changed.
317
318   * - ``SDTX_EVENT_DEVICE_MODE``
319     - ``5``
320     - ``2`` bytes
321     - Device mode changed.
322
323Individual events in more detail:
324
325``SDTX_EVENT_REQUEST``
326^^^^^^^^^^^^^^^^^^^^^^
327
328Sent when a detachment process is started or, if in progress, aborted by the
329user, either via a detach button press or a detach request
330(``SDTX_IOCTL_LATCH_REQUEST``) being sent from user-space.
331
332Does not have any payload.
333
334``SDTX_EVENT_CANCEL``
335^^^^^^^^^^^^^^^^^^^^^
336
337Sent when a detachment process is canceled by the EC due to unfulfilled
338preconditions (e.g. clipboard battery too low to detach) or hardware
339failure. The reason for cancellation is given in the event payload detailed
340below and can be one of
341
342* ``SDTX_DETACH_TIMEDOUT``: Detachment timed out while the latch was locked.
343  The latch has neither been opened nor unlocked.
344
345* ``SDTX_DETACH_NOT_FEASIBLE``: Detachment not feasible due to low clipboard
346  battery.
347
348* ``SDTX_ERR_FAILED_TO_OPEN``: Could not open the latch (hardware failure).
349
350* ``SDTX_ERR_FAILED_TO_REMAIN_OPEN``: Could not keep the latch open (hardware
351  failure).
352
353* ``SDTX_ERR_FAILED_TO_CLOSE``: Could not close the latch (hardware failure).
354
355Other error codes in this context are reserved for future use.
356
357These codes can be classified via the ``SDTX_CATEGORY()`` macro to discern
358between critical hardware errors (``SDTX_CATEGORY_HARDWARE_ERROR``) or
359runtime errors (``SDTX_CATEGORY_RUNTIME_ERROR``), the latter of which may
360happen during normal operation if certain preconditions for detachment are
361not given.
362
363.. flat-table:: Detachment Cancel Event Payload
364   :widths: 1 1 4
365   :header-rows: 1
366
367   * - Field
368     - Type
369     - Description
370
371   * - ``reason``
372     - |__u16|
373     - Reason for cancellation.
374
375``SDTX_EVENT_BASE_CONNECTION``
376^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
377
378Sent when the base connection state has changed, i.e. when the base has been
379attached, detached, or detachment has become infeasible due to low clipboard
380battery. The new state and, if a base is connected, ID of the base is
381provided as payload of type |sdtx_base_info| with its layout presented
382below:
383
384.. flat-table:: Base-Connection-Change Event Payload
385   :widths: 1 1 4
386   :header-rows: 1
387
388   * - Field
389     - Type
390     - Description
391
392   * - ``state``
393     - |__u16|
394     - Base connection state.
395
396   * - ``base_id``
397     - |__u16|
398     - Type of base connected (zero if none).
399
400Possible values for ``state`` are:
401
402* ``SDTX_BASE_DETACHED``,
403* ``SDTX_BASE_ATTACHED``, and
404* ``SDTX_DETACH_NOT_FEASIBLE``.
405
406Other values are reserved for future use.
407
408``SDTX_EVENT_LATCH_STATUS``
409^^^^^^^^^^^^^^^^^^^^^^^^^^^
410
411Sent when the latch status has changed, i.e. when the latch has been opened,
412closed, or an error occurred. The current status is provided as payload:
413
414.. flat-table:: Latch-Status-Change Event Payload
415   :widths: 1 1 4
416   :header-rows: 1
417
418   * - Field
419     - Type
420     - Description
421
422   * - ``status``
423     - |__u16|
424     - Latch status.
425
426Possible values for ``status`` are:
427
428* ``SDTX_LATCH_CLOSED``,
429* ``SDTX_LATCH_OPENED``,
430* ``SDTX_ERR_FAILED_TO_OPEN``,
431* ``SDTX_ERR_FAILED_TO_REMAIN_OPEN``, and
432* ``SDTX_ERR_FAILED_TO_CLOSE``.
433
434Other values are reserved for future use.
435
436``SDTX_EVENT_DEVICE_MODE``
437^^^^^^^^^^^^^^^^^^^^^^^^^^
438
439Sent when the device mode has changed. The new device mode is provided as
440payload:
441
442.. flat-table:: Device-Mode-Change Event Payload
443   :widths: 1 1 4
444   :header-rows: 1
445
446   * - Field
447     - Type
448     - Description
449
450   * - ``mode``
451     - |__u16|
452     - Device operation mode.
453
454Possible values for ``mode`` are:
455
456* ``SDTX_DEVICE_MODE_TABLET``,
457* ``SDTX_DEVICE_MODE_LAPTOP``, and
458* ``SDTX_DEVICE_MODE_STUDIO``.
459
460Other values are reserved for future use.
461
462.. _ioctls:
463
464IOCTLs
465------
466
467The following IOCTLs are provided:
468
469.. flat-table:: Overview of DTX IOCTLs
470   :widths: 1 1 1 1 4
471   :header-rows: 1
472
473   * - Type
474     - Number
475     - Direction
476     - Name
477     - Description
478
479   * - ``0xA5``
480     - ``0x21``
481     - ``-``
482     - ``EVENTS_ENABLE``
483     - Enable events for the current file descriptor.
484
485   * - ``0xA5``
486     - ``0x22``
487     - ``-``
488     - ``EVENTS_DISABLE``
489     - Disable events for the current file descriptor.
490
491   * - ``0xA5``
492     - ``0x23``
493     - ``-``
494     - ``LATCH_LOCK``
495     - Lock the latch.
496
497   * - ``0xA5``
498     - ``0x24``
499     - ``-``
500     - ``LATCH_UNLOCK``
501     - Unlock the latch.
502
503   * - ``0xA5``
504     - ``0x25``
505     - ``-``
506     - ``LATCH_REQUEST``
507     - Request clipboard detachment.
508
509   * - ``0xA5``
510     - ``0x26``
511     - ``-``
512     - ``LATCH_CONFIRM``
513     - Confirm clipboard detachment request.
514
515   * - ``0xA5``
516     - ``0x27``
517     - ``-``
518     - ``LATCH_HEARTBEAT``
519     - Send heartbeat signal to EC.
520
521   * - ``0xA5``
522     - ``0x28``
523     - ``-``
524     - ``LATCH_CANCEL``
525     - Cancel detachment process.
526
527   * - ``0xA5``
528     - ``0x29``
529     - ``R``
530     - ``GET_BASE_INFO``
531     - Get current base/connection information.
532
533   * - ``0xA5``
534     - ``0x2A``
535     - ``R``
536     - ``GET_DEVICE_MODE``
537     - Get current device operation mode.
538
539   * - ``0xA5``
540     - ``0x2B``
541     - ``R``
542     - ``GET_LATCH_STATUS``
543     - Get current device latch status.
544
545``SDTX_IOCTL_EVENTS_ENABLE``
546^^^^^^^^^^^^^^^^^^^^^^^^^^^^
547
548Defined as ``_IO(0xA5, 0x22)``.
549
550Enable events for the current file descriptor. Events can be obtained by
551reading from the device, if enabled. Events are disabled by default.
552
553``SDTX_IOCTL_EVENTS_DISABLE``
554^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
555
556Defined as ``_IO(0xA5, 0x22)``.
557
558Disable events for the current file descriptor. Events can be obtained by
559reading from the device, if enabled. Events are disabled by default.
560
561``SDTX_IOCTL_LATCH_LOCK``
562^^^^^^^^^^^^^^^^^^^^^^^^^
563
564Defined as ``_IO(0xA5, 0x23)``.
565
566Locks the latch, causing the detachment procedure to abort without opening
567the latch on timeout. The latch is unlocked by default. This command will be
568silently ignored if the latch is already locked.
569
570``SDTX_IOCTL_LATCH_UNLOCK``
571^^^^^^^^^^^^^^^^^^^^^^^^^^^
572
573Defined as ``_IO(0xA5, 0x24)``.
574
575Unlocks the latch, causing the detachment procedure to open the latch on
576timeout. The latch is unlocked by default. This command will not open the
577latch when sent during an ongoing detachment process. It will be silently
578ignored if the latch is already unlocked.
579
580``SDTX_IOCTL_LATCH_REQUEST``
581^^^^^^^^^^^^^^^^^^^^^^^^^^^^
582
583Defined as ``_IO(0xA5, 0x25)``.
584
585Generic latch request. Behavior depends on the context: If no
586detachment-process is active, detachment is requested. Otherwise the
587currently active detachment-process will be aborted.
588
589If a detachment process is canceled by this operation, a generic detachment
590request event (``SDTX_EVENT_REQUEST``) will be sent.
591
592This essentially behaves the same as a detachment button press.
593
594``SDTX_IOCTL_LATCH_CONFIRM``
595^^^^^^^^^^^^^^^^^^^^^^^^^^^^
596
597Defined as ``_IO(0xA5, 0x26)``.
598
599Acknowledges and confirms a latch request. If sent during an ongoing
600detachment process, this command causes the latch to be opened immediately.
601The latch will also be opened if it has been locked. In this case, the latch
602lock is reset to the unlocked state.
603
604This command will be silently ignored if there is currently no detachment
605procedure in progress.
606
607``SDTX_IOCTL_LATCH_HEARTBEAT``
608^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
609
610Defined as ``_IO(0xA5, 0x27)``.
611
612Sends a heartbeat, essentially resetting the detachment timeout. This
613command can be used to keep the detachment process alive while work required
614for the detachment to succeed is still in progress.
615
616This command will be silently ignored if there is currently no detachment
617procedure in progress.
618
619``SDTX_IOCTL_LATCH_CANCEL``
620^^^^^^^^^^^^^^^^^^^^^^^^^^^
621
622Defined as ``_IO(0xA5, 0x28)``.
623
624Cancels detachment in progress (if any). If a detachment process is canceled
625by this operation, a generic detachment request event
626(``SDTX_EVENT_REQUEST``) will be sent.
627
628This command will be silently ignored if there is currently no detachment
629procedure in progress.
630
631``SDTX_IOCTL_GET_BASE_INFO``
632^^^^^^^^^^^^^^^^^^^^^^^^^^^^
633
634Defined as ``_IOR(0xA5, 0x29, struct sdtx_base_info)``.
635
636Get the current base connection state (i.e. attached/detached) and the type
637of the base connected to the clipboard. This is command essentially provides
638a way to query the information provided by the base connection change event
639(``SDTX_EVENT_BASE_CONNECTION``).
640
641Possible values for ``struct sdtx_base_info.state`` are:
642
643* ``SDTX_BASE_DETACHED``,
644* ``SDTX_BASE_ATTACHED``, and
645* ``SDTX_DETACH_NOT_FEASIBLE``.
646
647Other values are reserved for future use.
648
649``SDTX_IOCTL_GET_DEVICE_MODE``
650^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
651
652Defined as ``_IOR(0xA5, 0x2A, __u16)``.
653
654Returns the device operation mode, indicating if and how the base is
655attached to the clipboard. This is command essentially provides a way to
656query the information provided by the device mode change event
657(``SDTX_EVENT_DEVICE_MODE``).
658
659Returned values are:
660
661* ``SDTX_DEVICE_MODE_LAPTOP``
662* ``SDTX_DEVICE_MODE_TABLET``
663* ``SDTX_DEVICE_MODE_STUDIO``
664
665See |sdtx_device_mode| for details. Other values are reserved for future
666use.
667
668
669``SDTX_IOCTL_GET_LATCH_STATUS``
670^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
671
672Defined as ``_IOR(0xA5, 0x2B, __u16)``.
673
674Get the current latch status or (presumably) the last error encountered when
675trying to open/close the latch. This is command essentially provides a way
676to query the information provided by the latch status change event
677(``SDTX_EVENT_LATCH_STATUS``).
678
679Returned values are:
680
681* ``SDTX_LATCH_CLOSED``,
682* ``SDTX_LATCH_OPENED``,
683* ``SDTX_ERR_FAILED_TO_OPEN``,
684* ``SDTX_ERR_FAILED_TO_REMAIN_OPEN``, and
685* ``SDTX_ERR_FAILED_TO_CLOSE``.
686
687Other values are reserved for future use.
688
689A Note on Base IDs
690------------------
691
692Base types/IDs provided via ``SDTX_EVENT_BASE_CONNECTION`` or
693``SDTX_IOCTL_GET_BASE_INFO`` are directly forwarded from the EC in the lower
694byte of the combined |__u16| value, with the driver storing the EC type from
695which this ID comes in the high byte (without this, base IDs over different
696types of ECs may be overlapping).
697
698The ``SDTX_DEVICE_TYPE()`` macro can be used to determine the EC device
699type. This can be one of
700
701* ``SDTX_DEVICE_TYPE_HID``, for Surface Aggregator Module over HID, and
702
703* ``SDTX_DEVICE_TYPE_SSH``, for Surface Aggregator Module over Surface Serial
704  Hub.
705
706Note that currently only the ``SSH`` type EC is supported, however ``HID``
707type is reserved for future use.
708
709Structures and Enums
710--------------------
711
712.. kernel-doc:: include/uapi/linux/surface_aggregator/dtx.h
713
714API Users
715=========
716
717A user-space daemon utilizing this API can be found at
718https://github.com/linux-surface/surface-dtx-daemon.
719