xref: /linux/include/uapi/linux/psp-dbc.h (revision a1c613ae4c322ddd58d5a8539dbfba2a0380a8c0)
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 <mario.limonciello@amd.com>
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
21d9408716SMario 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 /**
39d9408716SMario Limonciello  * struct dbc_user_setuid - UID exchange structure (input).
40d9408716SMario Limonciello  * @uid:       16 byte value representing software identity
41d9408716SMario Limonciello  * @signature: 32 byte signature created by software using a previous nonce
42d9408716SMario Limonciello  */
43d9408716SMario Limonciello struct dbc_user_setuid {
44d9408716SMario Limonciello 	__u8	uid[DBC_UID_SIZE];
45d9408716SMario Limonciello 	__u8	signature[DBC_SIG_SIZE];
46d9408716SMario Limonciello } __packed;
47d9408716SMario Limonciello 
48d9408716SMario Limonciello /**
49*e2cfe05eSMario Limonciello  * struct dbc_user_param - Parameter exchange structure (input/output).
50*e2cfe05eSMario Limonciello  * @msg_index: Message indicating what parameter to set or get (input)
51*e2cfe05eSMario Limonciello  * @param:     4 byte parameter, units are message specific. (input/output)
52*e2cfe05eSMario Limonciello  * @signature: 32 byte signature.
53*e2cfe05eSMario Limonciello  *             - When sending a message this is to be created by software
54*e2cfe05eSMario Limonciello  *               using a previous nonce (input)
55*e2cfe05eSMario Limonciello  *             - For interpreting results, this signature is updated by the
56*e2cfe05eSMario Limonciello  *               PSP to allow software to validate the authenticity of the
57*e2cfe05eSMario Limonciello  *               results.
58*e2cfe05eSMario Limonciello  */
59*e2cfe05eSMario Limonciello struct dbc_user_param {
60*e2cfe05eSMario Limonciello 	__u32	msg_index;
61*e2cfe05eSMario Limonciello 	__u32	param;
62*e2cfe05eSMario Limonciello 	__u8	signature[DBC_SIG_SIZE];
63*e2cfe05eSMario Limonciello } __packed;
64*e2cfe05eSMario Limonciello 
65*e2cfe05eSMario Limonciello /**
66c04cf9e1SMario Limonciello  * Dynamic Boost Control (DBC) IOC
67c04cf9e1SMario Limonciello  *
68c04cf9e1SMario Limonciello  * possible return codes for all DBC IOCTLs:
69c04cf9e1SMario Limonciello  *  0:          success
70c04cf9e1SMario Limonciello  *  -EINVAL:    invalid input
71c04cf9e1SMario Limonciello  *  -E2BIG:     excess data passed
72c04cf9e1SMario Limonciello  *  -EFAULT:    failed to copy to/from userspace
73c04cf9e1SMario Limonciello  *  -EBUSY:     mailbox in recovery or in use
74c04cf9e1SMario Limonciello  *  -ENODEV:    driver not bound with PSP device
75c04cf9e1SMario Limonciello  *  -EACCES:    request isn't authorized
76c04cf9e1SMario Limonciello  *  -EINVAL:    invalid parameter
77c04cf9e1SMario Limonciello  *  -ETIMEDOUT: request timed out
78c04cf9e1SMario Limonciello  *  -EAGAIN:    invalid request for state machine
79c04cf9e1SMario Limonciello  *  -ENOENT:    not implemented
80c04cf9e1SMario Limonciello  *  -ENFILE:    overflow
81c04cf9e1SMario Limonciello  *  -EPERM:     invalid signature
82c04cf9e1SMario Limonciello  *  -EIO:       unknown error
83c04cf9e1SMario Limonciello  */
84c04cf9e1SMario Limonciello #define DBC_IOC_TYPE	'D'
85c04cf9e1SMario Limonciello 
86c04cf9e1SMario Limonciello /**
87c04cf9e1SMario Limonciello  * DBCIOCNONCE - Fetch a nonce from the PSP for authenticating commands.
88c04cf9e1SMario Limonciello  *               If a nonce is fetched without authentication it can only
89c04cf9e1SMario Limonciello  *               be utilized for one command.
90c04cf9e1SMario Limonciello  *               If a nonce is fetched with authentication it can be used
91c04cf9e1SMario Limonciello  *               for multiple requests.
92c04cf9e1SMario Limonciello  */
93c04cf9e1SMario Limonciello #define DBCIOCNONCE	_IOWR(DBC_IOC_TYPE, 0x1, struct dbc_user_nonce)
94c04cf9e1SMario Limonciello 
95d9408716SMario Limonciello /**
96d9408716SMario Limonciello  * DBCIOCUID - Set the user ID (UID) of a calling process.
97d9408716SMario Limonciello  *             The user ID is 8 bytes long. It must be programmed using a
98d9408716SMario Limonciello  *             32 byte signature built using the nonce fetched from
99d9408716SMario Limonciello  *             DBCIOCNONCE.
100d9408716SMario Limonciello  *             The UID can only be set once until the system is rebooted.
101d9408716SMario Limonciello  */
102d9408716SMario Limonciello #define DBCIOCUID	_IOW(DBC_IOC_TYPE, 0x2, struct dbc_user_setuid)
103d9408716SMario Limonciello 
104*e2cfe05eSMario Limonciello /**
105*e2cfe05eSMario Limonciello  * DBCIOCPARAM - Set or get a parameter from the PSP.
106*e2cfe05eSMario Limonciello  *               This request will only work after DBCIOCUID has successfully
107*e2cfe05eSMario Limonciello  *               set the UID of the calling process.
108*e2cfe05eSMario Limonciello  *               Whether the parameter is set or get is controlled by the
109*e2cfe05eSMario Limonciello  *               message ID in the request.
110*e2cfe05eSMario Limonciello  *               This command must be sent using a 32 byte signature built
111*e2cfe05eSMario Limonciello  *               using the nonce fetched from DBCIOCNONCE.
112*e2cfe05eSMario Limonciello  *               When the command succeeds, the 32 byte signature will be
113*e2cfe05eSMario Limonciello  *               updated by the PSP for software to authenticate the results.
114*e2cfe05eSMario Limonciello  */
115*e2cfe05eSMario Limonciello #define DBCIOCPARAM	_IOWR(DBC_IOC_TYPE, 0x3, struct dbc_user_param)
116*e2cfe05eSMario Limonciello 
117*e2cfe05eSMario Limonciello /**
118*e2cfe05eSMario Limonciello  * enum dbc_cmd_msg - Messages utilized by DBCIOCPARAM
119*e2cfe05eSMario Limonciello  * @PARAM_GET_FMAX_CAP:		Get frequency cap (MHz)
120*e2cfe05eSMario Limonciello  * @PARAM_SET_FMAX_CAP:		Set frequency cap (MHz)
121*e2cfe05eSMario Limonciello  * @PARAM_GET_PWR_CAP:		Get socket power cap (mW)
122*e2cfe05eSMario Limonciello  * @PARAM_SET_PWR_CAP:		Set socket power cap (mW)
123*e2cfe05eSMario Limonciello  * @PARAM_GET_GFX_MODE:		Get graphics mode (0/1)
124*e2cfe05eSMario Limonciello  * @PARAM_SET_GFX_MODE:		Set graphics mode (0/1)
125*e2cfe05eSMario Limonciello  * @PARAM_GET_CURR_TEMP:	Get current temperature (degrees C)
126*e2cfe05eSMario Limonciello  * @PARAM_GET_FMAX_MAX:		Get maximum allowed value for frequency (MHz)
127*e2cfe05eSMario Limonciello  * @PARAM_GET_FMAX_MIN:		Get minimum allowed value for frequency (MHz)
128*e2cfe05eSMario Limonciello  * @PARAM_GET_SOC_PWR_MAX:	Get maximum allowed value for SoC power (mw)
129*e2cfe05eSMario Limonciello  * @PARAM_GET_SOC_PWR_MIN:	Get minimum allowed value for SoC power (mw)
130*e2cfe05eSMario Limonciello  * @PARAM_GET_SOC_PWR_CUR:	Get current value for SoC Power (mW)
131*e2cfe05eSMario Limonciello  */
132*e2cfe05eSMario Limonciello enum dbc_cmd_msg {
133*e2cfe05eSMario Limonciello 	PARAM_GET_FMAX_CAP	= 0x3,
134*e2cfe05eSMario Limonciello 	PARAM_SET_FMAX_CAP	= 0x4,
135*e2cfe05eSMario Limonciello 	PARAM_GET_PWR_CAP	= 0x5,
136*e2cfe05eSMario Limonciello 	PARAM_SET_PWR_CAP	= 0x6,
137*e2cfe05eSMario Limonciello 	PARAM_GET_GFX_MODE	= 0x7,
138*e2cfe05eSMario Limonciello 	PARAM_SET_GFX_MODE	= 0x8,
139*e2cfe05eSMario Limonciello 	PARAM_GET_CURR_TEMP	= 0x9,
140*e2cfe05eSMario Limonciello 	PARAM_GET_FMAX_MAX	= 0xA,
141*e2cfe05eSMario Limonciello 	PARAM_GET_FMAX_MIN	= 0xB,
142*e2cfe05eSMario Limonciello 	PARAM_GET_SOC_PWR_MAX	= 0xC,
143*e2cfe05eSMario Limonciello 	PARAM_GET_SOC_PWR_MIN	= 0xD,
144*e2cfe05eSMario Limonciello 	PARAM_GET_SOC_PWR_CUR	= 0xE,
145*e2cfe05eSMario Limonciello };
146*e2cfe05eSMario Limonciello 
147c04cf9e1SMario Limonciello #endif /* __PSP_DBC_USER_H__ */
148