1178f6ab7SMaximilian Luz /* SPDX-License-Identifier: GPL-2.0+ WITH Linux-syscall-note */ 2178f6ab7SMaximilian Luz /* 3178f6ab7SMaximilian Luz * Surface System Aggregator Module (SSAM) user-space EC interface. 4178f6ab7SMaximilian Luz * 5178f6ab7SMaximilian Luz * Definitions, structs, and IOCTLs for the /dev/surface/aggregator misc 6178f6ab7SMaximilian Luz * device. This device provides direct user-space access to the SSAM EC. 7178f6ab7SMaximilian Luz * Intended for debugging and development. 8178f6ab7SMaximilian Luz * 9776c53c6SMaximilian Luz * Copyright (C) 2020-2021 Maximilian Luz <luzmaximilian@gmail.com> 10178f6ab7SMaximilian Luz */ 11178f6ab7SMaximilian Luz 12178f6ab7SMaximilian Luz #ifndef _UAPI_LINUX_SURFACE_AGGREGATOR_CDEV_H 13178f6ab7SMaximilian Luz #define _UAPI_LINUX_SURFACE_AGGREGATOR_CDEV_H 14178f6ab7SMaximilian Luz 15178f6ab7SMaximilian Luz #include <linux/ioctl.h> 16178f6ab7SMaximilian Luz #include <linux/types.h> 17178f6ab7SMaximilian Luz 18178f6ab7SMaximilian Luz /** 19178f6ab7SMaximilian Luz * enum ssam_cdev_request_flags - Request flags for SSAM cdev request IOCTL. 20178f6ab7SMaximilian Luz * 21178f6ab7SMaximilian Luz * @SSAM_CDEV_REQUEST_HAS_RESPONSE: 22178f6ab7SMaximilian Luz * Specifies that the request expects a response. If not set, the request 23178f6ab7SMaximilian Luz * will be directly completed after its underlying packet has been 24178f6ab7SMaximilian Luz * transmitted. If set, the request transport system waits for a response 25178f6ab7SMaximilian Luz * of the request. 26178f6ab7SMaximilian Luz * 27178f6ab7SMaximilian Luz * @SSAM_CDEV_REQUEST_UNSEQUENCED: 28178f6ab7SMaximilian Luz * Specifies that the request should be transmitted via an unsequenced 29178f6ab7SMaximilian Luz * packet. If set, the request must not have a response, meaning that this 30178f6ab7SMaximilian Luz * flag and the %SSAM_CDEV_REQUEST_HAS_RESPONSE flag are mutually 31178f6ab7SMaximilian Luz * exclusive. 32178f6ab7SMaximilian Luz */ 33178f6ab7SMaximilian Luz enum ssam_cdev_request_flags { 34178f6ab7SMaximilian Luz SSAM_CDEV_REQUEST_HAS_RESPONSE = 0x01, 35178f6ab7SMaximilian Luz SSAM_CDEV_REQUEST_UNSEQUENCED = 0x02, 36178f6ab7SMaximilian Luz }; 37178f6ab7SMaximilian Luz 38178f6ab7SMaximilian Luz /** 39178f6ab7SMaximilian Luz * struct ssam_cdev_request - Controller request IOCTL argument. 40178f6ab7SMaximilian Luz * @target_category: Target category of the SAM request. 41178f6ab7SMaximilian Luz * @target_id: Target ID of the SAM request. 42178f6ab7SMaximilian Luz * @command_id: Command ID of the SAM request. 43178f6ab7SMaximilian Luz * @instance_id: Instance ID of the SAM request. 44178f6ab7SMaximilian Luz * @flags: Request flags (see &enum ssam_cdev_request_flags). 45178f6ab7SMaximilian Luz * @status: Request status (output). 46178f6ab7SMaximilian Luz * @payload: Request payload (input data). 47178f6ab7SMaximilian Luz * @payload.data: Pointer to request payload data. 48178f6ab7SMaximilian Luz * @payload.length: Length of request payload data (in bytes). 49178f6ab7SMaximilian Luz * @response: Request response (output data). 50178f6ab7SMaximilian Luz * @response.data: Pointer to response buffer. 51178f6ab7SMaximilian Luz * @response.length: On input: Capacity of response buffer (in bytes). 52178f6ab7SMaximilian Luz * On output: Length of request response (number of bytes 53178f6ab7SMaximilian Luz * in the buffer that are actually used). 54178f6ab7SMaximilian Luz */ 55178f6ab7SMaximilian Luz struct ssam_cdev_request { 56178f6ab7SMaximilian Luz __u8 target_category; 57178f6ab7SMaximilian Luz __u8 target_id; 58178f6ab7SMaximilian Luz __u8 command_id; 59178f6ab7SMaximilian Luz __u8 instance_id; 60178f6ab7SMaximilian Luz __u16 flags; 61178f6ab7SMaximilian Luz __s16 status; 62178f6ab7SMaximilian Luz 63178f6ab7SMaximilian Luz struct { 64178f6ab7SMaximilian Luz __u64 data; 65178f6ab7SMaximilian Luz __u16 length; 66178f6ab7SMaximilian Luz __u8 __pad[6]; 67178f6ab7SMaximilian Luz } payload; 68178f6ab7SMaximilian Luz 69178f6ab7SMaximilian Luz struct { 70178f6ab7SMaximilian Luz __u64 data; 71178f6ab7SMaximilian Luz __u16 length; 72178f6ab7SMaximilian Luz __u8 __pad[6]; 73178f6ab7SMaximilian Luz } response; 74178f6ab7SMaximilian Luz } __attribute__((__packed__)); 75178f6ab7SMaximilian Luz 76776c53c6SMaximilian Luz /** 77776c53c6SMaximilian Luz * struct ssam_cdev_notifier_desc - Notifier descriptor. 78776c53c6SMaximilian Luz * @priority: Priority value determining the order in which notifier 79776c53c6SMaximilian Luz * callbacks will be called. A higher value means higher 80776c53c6SMaximilian Luz * priority, i.e. the associated callback will be executed 81776c53c6SMaximilian Luz * earlier than other (lower priority) callbacks. 82776c53c6SMaximilian Luz * @target_category: The event target category for which this notifier should 83776c53c6SMaximilian Luz * receive events. 84776c53c6SMaximilian Luz * 85776c53c6SMaximilian Luz * Specifies the notifier that should be registered or unregistered, 86776c53c6SMaximilian Luz * specifically with which priority and for which target category of events. 87776c53c6SMaximilian Luz */ 88776c53c6SMaximilian Luz struct ssam_cdev_notifier_desc { 89776c53c6SMaximilian Luz __s32 priority; 90776c53c6SMaximilian Luz __u8 target_category; 91776c53c6SMaximilian Luz } __attribute__((__packed__)); 92776c53c6SMaximilian Luz 93776c53c6SMaximilian Luz /** 94*e8e298a6SMaximilian Luz * struct ssam_cdev_event_desc - Event descriptor. 95*e8e298a6SMaximilian Luz * @reg: Registry via which the event will be enabled/disabled. 96*e8e298a6SMaximilian Luz * @reg.target_category: Target category for the event registry requests. 97*e8e298a6SMaximilian Luz * @reg.target_id: Target ID for the event registry requests. 98*e8e298a6SMaximilian Luz * @reg.cid_enable: Command ID for the event-enable request. 99*e8e298a6SMaximilian Luz * @reg.cid_disable: Command ID for the event-disable request. 100*e8e298a6SMaximilian Luz * @id: ID specifying the event. 101*e8e298a6SMaximilian Luz * @id.target_category: Target category of the event source. 102*e8e298a6SMaximilian Luz * @id.instance: Instance ID of the event source. 103*e8e298a6SMaximilian Luz * @flags: Flags used for enabling the event. 104*e8e298a6SMaximilian Luz * 105*e8e298a6SMaximilian Luz * Specifies which event should be enabled/disabled and how to do that. 106*e8e298a6SMaximilian Luz */ 107*e8e298a6SMaximilian Luz struct ssam_cdev_event_desc { 108*e8e298a6SMaximilian Luz struct { 109*e8e298a6SMaximilian Luz __u8 target_category; 110*e8e298a6SMaximilian Luz __u8 target_id; 111*e8e298a6SMaximilian Luz __u8 cid_enable; 112*e8e298a6SMaximilian Luz __u8 cid_disable; 113*e8e298a6SMaximilian Luz } reg; 114*e8e298a6SMaximilian Luz 115*e8e298a6SMaximilian Luz struct { 116*e8e298a6SMaximilian Luz __u8 target_category; 117*e8e298a6SMaximilian Luz __u8 instance; 118*e8e298a6SMaximilian Luz } id; 119*e8e298a6SMaximilian Luz 120*e8e298a6SMaximilian Luz __u8 flags; 121*e8e298a6SMaximilian Luz } __attribute__((__packed__)); 122*e8e298a6SMaximilian Luz 123*e8e298a6SMaximilian Luz /** 124776c53c6SMaximilian Luz * struct ssam_cdev_event - SSAM event sent by the EC. 125776c53c6SMaximilian Luz * @target_category: Target category of the event source. See &enum ssam_ssh_tc. 126776c53c6SMaximilian Luz * @target_id: Target ID of the event source. 127776c53c6SMaximilian Luz * @command_id: Command ID of the event. 128776c53c6SMaximilian Luz * @instance_id: Instance ID of the event source. 129776c53c6SMaximilian Luz * @length: Length of the event payload in bytes. 130776c53c6SMaximilian Luz * @data: Event payload data. 131776c53c6SMaximilian Luz */ 132776c53c6SMaximilian Luz struct ssam_cdev_event { 133776c53c6SMaximilian Luz __u8 target_category; 134776c53c6SMaximilian Luz __u8 target_id; 135776c53c6SMaximilian Luz __u8 command_id; 136776c53c6SMaximilian Luz __u8 instance_id; 137776c53c6SMaximilian Luz __u16 length; 138776c53c6SMaximilian Luz __u8 data[]; 139776c53c6SMaximilian Luz } __attribute__((__packed__)); 140776c53c6SMaximilian Luz 141178f6ab7SMaximilian Luz #define SSAM_CDEV_REQUEST _IOWR(0xA5, 1, struct ssam_cdev_request) 142776c53c6SMaximilian Luz #define SSAM_CDEV_NOTIF_REGISTER _IOW(0xA5, 2, struct ssam_cdev_notifier_desc) 143776c53c6SMaximilian Luz #define SSAM_CDEV_NOTIF_UNREGISTER _IOW(0xA5, 3, struct ssam_cdev_notifier_desc) 144*e8e298a6SMaximilian Luz #define SSAM_CDEV_EVENT_ENABLE _IOW(0xA5, 4, struct ssam_cdev_event_desc) 145*e8e298a6SMaximilian Luz #define SSAM_CDEV_EVENT_DISABLE _IOW(0xA5, 5, struct ssam_cdev_event_desc) 146178f6ab7SMaximilian Luz 147178f6ab7SMaximilian Luz #endif /* _UAPI_LINUX_SURFACE_AGGREGATOR_CDEV_H */ 148