Linux 6.7-rc7
[linux-modified.git] / include / uapi / linux / surface_aggregator / dtx.h
1 /* SPDX-License-Identifier: GPL-2.0+ WITH Linux-syscall-note */
2 /*
3  * Surface DTX (clipboard detachment system driver) user-space interface.
4  *
5  * Definitions, structs, and IOCTLs for the /dev/surface/dtx misc device. This
6  * device allows user-space to control the clipboard detachment process on
7  * Surface Book series devices.
8  *
9  * Copyright (C) 2020-2021 Maximilian Luz <luzmaximilian@gmail.com>
10  */
11
12 #ifndef _UAPI_LINUX_SURFACE_AGGREGATOR_DTX_H
13 #define _UAPI_LINUX_SURFACE_AGGREGATOR_DTX_H
14
15 #include <linux/ioctl.h>
16 #include <linux/types.h>
17
18 /* Status/error categories */
19 #define SDTX_CATEGORY_STATUS            0x0000
20 #define SDTX_CATEGORY_RUNTIME_ERROR     0x1000
21 #define SDTX_CATEGORY_HARDWARE_ERROR    0x2000
22 #define SDTX_CATEGORY_UNKNOWN           0xf000
23
24 #define SDTX_CATEGORY_MASK              0xf000
25 #define SDTX_CATEGORY(value)            ((value) & SDTX_CATEGORY_MASK)
26
27 #define SDTX_STATUS(code)               ((code) | SDTX_CATEGORY_STATUS)
28 #define SDTX_ERR_RT(code)               ((code) | SDTX_CATEGORY_RUNTIME_ERROR)
29 #define SDTX_ERR_HW(code)               ((code) | SDTX_CATEGORY_HARDWARE_ERROR)
30 #define SDTX_UNKNOWN(code)              ((code) | SDTX_CATEGORY_UNKNOWN)
31
32 #define SDTX_SUCCESS(value)             (SDTX_CATEGORY(value) == SDTX_CATEGORY_STATUS)
33
34 /* Latch status values */
35 #define SDTX_LATCH_CLOSED               SDTX_STATUS(0x00)
36 #define SDTX_LATCH_OPENED               SDTX_STATUS(0x01)
37
38 /* Base state values */
39 #define SDTX_BASE_DETACHED              SDTX_STATUS(0x00)
40 #define SDTX_BASE_ATTACHED              SDTX_STATUS(0x01)
41
42 /* Runtime errors (non-critical) */
43 #define SDTX_DETACH_NOT_FEASIBLE        SDTX_ERR_RT(0x01)
44 #define SDTX_DETACH_TIMEDOUT            SDTX_ERR_RT(0x02)
45
46 /* Hardware errors (critical) */
47 #define SDTX_ERR_FAILED_TO_OPEN         SDTX_ERR_HW(0x01)
48 #define SDTX_ERR_FAILED_TO_REMAIN_OPEN  SDTX_ERR_HW(0x02)
49 #define SDTX_ERR_FAILED_TO_CLOSE        SDTX_ERR_HW(0x03)
50
51 /* Base types */
52 #define SDTX_DEVICE_TYPE_HID            0x0100
53 #define SDTX_DEVICE_TYPE_SSH            0x0200
54
55 #define SDTX_DEVICE_TYPE_MASK           0x0f00
56 #define SDTX_DEVICE_TYPE(value)         ((value) & SDTX_DEVICE_TYPE_MASK)
57
58 #define SDTX_BASE_TYPE_HID(id)          ((id) | SDTX_DEVICE_TYPE_HID)
59 #define SDTX_BASE_TYPE_SSH(id)          ((id) | SDTX_DEVICE_TYPE_SSH)
60
61 /**
62  * enum sdtx_device_mode - Mode describing how (and if) the clipboard is
63  * attached to the base of the device.
64  * @SDTX_DEVICE_MODE_TABLET: The clipboard is detached from the base and the
65  *                           device operates as tablet.
66  * @SDTX_DEVICE_MODE_LAPTOP: The clipboard is attached normally to the base
67  *                           and the device operates as laptop.
68  * @SDTX_DEVICE_MODE_STUDIO: The clipboard is attached to the base in reverse.
69  *                           The device operates as tablet with keyboard and
70  *                           touchpad deactivated, however, the base battery
71  *                           and, if present in the specific device model, dGPU
72  *                           are available to the system.
73  */
74 enum sdtx_device_mode {
75         SDTX_DEVICE_MODE_TABLET         = 0x00,
76         SDTX_DEVICE_MODE_LAPTOP         = 0x01,
77         SDTX_DEVICE_MODE_STUDIO         = 0x02,
78 };
79
80 /**
81  * struct sdtx_event - Event provided by reading from the DTX device file.
82  * @length: Length of the event payload, in bytes.
83  * @code:   Event code, detailing what type of event this is.
84  * @data:   Payload of the event, containing @length bytes.
85  *
86  * See &enum sdtx_event_code for currently valid event codes.
87  */
88 struct sdtx_event {
89         __u16 length;
90         __u16 code;
91         __u8 data[];
92 } __attribute__((__packed__));
93
94 /**
95  * enum sdtx_event_code - Code describing the type of an event.
96  * @SDTX_EVENT_REQUEST:         Detachment request event type.
97  * @SDTX_EVENT_CANCEL:          Cancel detachment process event type.
98  * @SDTX_EVENT_BASE_CONNECTION: Base/clipboard connection change event type.
99  * @SDTX_EVENT_LATCH_STATUS:    Latch status change event type.
100  * @SDTX_EVENT_DEVICE_MODE:     Device mode change event type.
101  *
102  * Used in &struct sdtx_event to describe the type of the event. Further event
103  * codes are reserved for future use. Any event parser should be able to
104  * gracefully handle unknown events, i.e. by simply skipping them.
105  *
106  * Consult the DTX user-space interface documentation for details regarding
107  * the individual event types.
108  */
109 enum sdtx_event_code {
110         SDTX_EVENT_REQUEST              = 1,
111         SDTX_EVENT_CANCEL               = 2,
112         SDTX_EVENT_BASE_CONNECTION      = 3,
113         SDTX_EVENT_LATCH_STATUS         = 4,
114         SDTX_EVENT_DEVICE_MODE          = 5,
115 };
116
117 /**
118  * struct sdtx_base_info - Describes if and what type of base is connected.
119  * @state:   The state of the connection. Valid values are %SDTX_BASE_DETACHED,
120  *           %SDTX_BASE_ATTACHED, and %SDTX_DETACH_NOT_FEASIBLE (in case a base
121  *           is attached but low clipboard battery prevents detachment). Other
122  *           values are currently reserved.
123  * @base_id: The type of base connected. Zero if no base is connected.
124  */
125 struct sdtx_base_info {
126         __u16 state;
127         __u16 base_id;
128 } __attribute__((__packed__));
129
130 /* IOCTLs */
131 #define SDTX_IOCTL_EVENTS_ENABLE        _IO(0xa5, 0x21)
132 #define SDTX_IOCTL_EVENTS_DISABLE       _IO(0xa5, 0x22)
133
134 #define SDTX_IOCTL_LATCH_LOCK           _IO(0xa5, 0x23)
135 #define SDTX_IOCTL_LATCH_UNLOCK         _IO(0xa5, 0x24)
136
137 #define SDTX_IOCTL_LATCH_REQUEST        _IO(0xa5, 0x25)
138 #define SDTX_IOCTL_LATCH_CONFIRM        _IO(0xa5, 0x26)
139 #define SDTX_IOCTL_LATCH_HEARTBEAT      _IO(0xa5, 0x27)
140 #define SDTX_IOCTL_LATCH_CANCEL         _IO(0xa5, 0x28)
141
142 #define SDTX_IOCTL_GET_BASE_INFO        _IOR(0xa5, 0x29, struct sdtx_base_info)
143 #define SDTX_IOCTL_GET_DEVICE_MODE      _IOR(0xa5, 0x2a, __u16)
144 #define SDTX_IOCTL_GET_LATCH_STATUS     _IOR(0xa5, 0x2b, __u16)
145
146 #endif /* _UAPI_LINUX_SURFACE_AGGREGATOR_DTX_H */