xref: /linux-6.15/include/uapi/linux/psp-dbc.h (revision d9408716)
1c04cf9e1SMario Limonciello /* SPDX-License-Identifier: GPL-2.0-only WITH Linux-syscall-note */
2c04cf9e1SMario Limonciello /*
3c04cf9e1SMario Limonciello  * Userspace interface for AMD Dynamic Boost Control (DBC)
4c04cf9e1SMario Limonciello  *
5c04cf9e1SMario Limonciello  * Copyright (C) 2023 Advanced Micro Devices, Inc.
6c04cf9e1SMario Limonciello  *
7c04cf9e1SMario Limonciello  * Author: Mario Limonciello <[email protected]>
8c04cf9e1SMario Limonciello  */
9c04cf9e1SMario Limonciello 
10c04cf9e1SMario Limonciello #ifndef __PSP_DBC_USER_H__
11c04cf9e1SMario Limonciello #define __PSP_DBC_USER_H__
12c04cf9e1SMario Limonciello 
13c04cf9e1SMario Limonciello #include <linux/types.h>
14c04cf9e1SMario Limonciello 
15c04cf9e1SMario Limonciello /**
16c04cf9e1SMario Limonciello  * DOC: AMD Dynamic Boost Control (DBC) interface
17c04cf9e1SMario Limonciello  */
18c04cf9e1SMario Limonciello 
19c04cf9e1SMario Limonciello #define DBC_NONCE_SIZE		16
20c04cf9e1SMario Limonciello #define DBC_SIG_SIZE		32
21*d9408716SMario Limonciello #define DBC_UID_SIZE		16
22c04cf9e1SMario Limonciello 
23c04cf9e1SMario Limonciello /**
24c04cf9e1SMario Limonciello  * struct dbc_user_nonce - Nonce exchange structure (input/output).
25c04cf9e1SMario Limonciello  * @auth_needed: Whether the PSP should authenticate this request (input).
26c04cf9e1SMario Limonciello  *               0: no authentication, PSP will return single use nonce.
27c04cf9e1SMario Limonciello  *               1: authentication: PSP will return multi-use nonce.
28c04cf9e1SMario Limonciello  * @nonce:       8 byte value used for future authentication (output).
29c04cf9e1SMario Limonciello  * @signature:   Optional 32 byte signature created by software using a
30c04cf9e1SMario Limonciello  *               previous nonce (input).
31c04cf9e1SMario Limonciello  */
32c04cf9e1SMario Limonciello struct dbc_user_nonce {
33c04cf9e1SMario Limonciello 	__u32	auth_needed;
34c04cf9e1SMario Limonciello 	__u8	nonce[DBC_NONCE_SIZE];
35c04cf9e1SMario Limonciello 	__u8	signature[DBC_SIG_SIZE];
36c04cf9e1SMario Limonciello } __packed;
37c04cf9e1SMario Limonciello 
38c04cf9e1SMario Limonciello /**
39*d9408716SMario Limonciello  * struct dbc_user_setuid - UID exchange structure (input).
40*d9408716SMario Limonciello  * @uid:       16 byte value representing software identity
41*d9408716SMario Limonciello  * @signature: 32 byte signature created by software using a previous nonce
42*d9408716SMario Limonciello  */
43*d9408716SMario Limonciello struct dbc_user_setuid {
44*d9408716SMario Limonciello 	__u8	uid[DBC_UID_SIZE];
45*d9408716SMario Limonciello 	__u8	signature[DBC_SIG_SIZE];
46*d9408716SMario Limonciello } __packed;
47*d9408716SMario Limonciello 
48*d9408716SMario Limonciello /**
49c04cf9e1SMario Limonciello  * Dynamic Boost Control (DBC) IOC
50c04cf9e1SMario Limonciello  *
51c04cf9e1SMario Limonciello  * possible return codes for all DBC IOCTLs:
52c04cf9e1SMario Limonciello  *  0:          success
53c04cf9e1SMario Limonciello  *  -EINVAL:    invalid input
54c04cf9e1SMario Limonciello  *  -E2BIG:     excess data passed
55c04cf9e1SMario Limonciello  *  -EFAULT:    failed to copy to/from userspace
56c04cf9e1SMario Limonciello  *  -EBUSY:     mailbox in recovery or in use
57c04cf9e1SMario Limonciello  *  -ENODEV:    driver not bound with PSP device
58c04cf9e1SMario Limonciello  *  -EACCES:    request isn't authorized
59c04cf9e1SMario Limonciello  *  -EINVAL:    invalid parameter
60c04cf9e1SMario Limonciello  *  -ETIMEDOUT: request timed out
61c04cf9e1SMario Limonciello  *  -EAGAIN:    invalid request for state machine
62c04cf9e1SMario Limonciello  *  -ENOENT:    not implemented
63c04cf9e1SMario Limonciello  *  -ENFILE:    overflow
64c04cf9e1SMario Limonciello  *  -EPERM:     invalid signature
65c04cf9e1SMario Limonciello  *  -EIO:       unknown error
66c04cf9e1SMario Limonciello  */
67c04cf9e1SMario Limonciello #define DBC_IOC_TYPE	'D'
68c04cf9e1SMario Limonciello 
69c04cf9e1SMario Limonciello /**
70c04cf9e1SMario Limonciello  * DBCIOCNONCE - Fetch a nonce from the PSP for authenticating commands.
71c04cf9e1SMario Limonciello  *               If a nonce is fetched without authentication it can only
72c04cf9e1SMario Limonciello  *               be utilized for one command.
73c04cf9e1SMario Limonciello  *               If a nonce is fetched with authentication it can be used
74c04cf9e1SMario Limonciello  *               for multiple requests.
75c04cf9e1SMario Limonciello  */
76c04cf9e1SMario Limonciello #define DBCIOCNONCE	_IOWR(DBC_IOC_TYPE, 0x1, struct dbc_user_nonce)
77c04cf9e1SMario Limonciello 
78*d9408716SMario Limonciello /**
79*d9408716SMario Limonciello  * DBCIOCUID - Set the user ID (UID) of a calling process.
80*d9408716SMario Limonciello  *             The user ID is 8 bytes long. It must be programmed using a
81*d9408716SMario Limonciello  *             32 byte signature built using the nonce fetched from
82*d9408716SMario Limonciello  *             DBCIOCNONCE.
83*d9408716SMario Limonciello  *             The UID can only be set once until the system is rebooted.
84*d9408716SMario Limonciello  */
85*d9408716SMario Limonciello #define DBCIOCUID	_IOW(DBC_IOC_TYPE, 0x2, struct dbc_user_setuid)
86*d9408716SMario Limonciello 
87c04cf9e1SMario Limonciello #endif /* __PSP_DBC_USER_H__ */
88