1 /* SPDX-License-Identifier: GPL-2.0-only WITH Linux-syscall-note */
3 * Userspace interface for AMD Dynamic Boost Control (DBC)
5 * Copyright (C) 2023 Advanced Micro Devices, Inc.
7 * Author: Mario Limonciello <mario.limonciello@amd.com>
10 #ifndef __PSP_DBC_USER_H__
11 #define __PSP_DBC_USER_H__
13 #include <linux/types.h>
16 * DOC: AMD Dynamic Boost Control (DBC) interface
19 #define DBC_NONCE_SIZE 16
20 #define DBC_SIG_SIZE 32
21 #define DBC_UID_SIZE 16
24 * struct dbc_user_nonce - Nonce exchange structure (input/output).
25 * @auth_needed: Whether the PSP should authenticate this request (input).
26 * 0: no authentication, PSP will return single use nonce.
27 * 1: authentication: PSP will return multi-use nonce.
28 * @nonce: 8 byte value used for future authentication (output).
29 * @signature: Optional 32 byte signature created by software using a
30 * previous nonce (input).
32 struct dbc_user_nonce {
34 __u8 nonce[DBC_NONCE_SIZE];
35 __u8 signature[DBC_SIG_SIZE];
39 * struct dbc_user_setuid - UID exchange structure (input).
40 * @uid: 16 byte value representing software identity
41 * @signature: 32 byte signature created by software using a previous nonce
43 struct dbc_user_setuid {
44 __u8 uid[DBC_UID_SIZE];
45 __u8 signature[DBC_SIG_SIZE];
49 * struct dbc_user_param - Parameter exchange structure (input/output).
50 * @msg_index: Message indicating what parameter to set or get (input)
51 * @param: 4 byte parameter, units are message specific. (input/output)
52 * @signature: 32 byte signature.
53 * - When sending a message this is to be created by software
54 * using a previous nonce (input)
55 * - For interpreting results, this signature is updated by the
56 * PSP to allow software to validate the authenticity of the
59 struct dbc_user_param {
62 __u8 signature[DBC_SIG_SIZE];
66 * Dynamic Boost Control (DBC) IOC
68 * possible return codes for all DBC IOCTLs:
70 * -EINVAL: invalid input
71 * -E2BIG: excess data passed
72 * -EFAULT: failed to copy to/from userspace
73 * -EBUSY: mailbox in recovery or in use
74 * -ENODEV: driver not bound with PSP device
75 * -EACCES: request isn't authorized
76 * -EINVAL: invalid parameter
77 * -ETIMEDOUT: request timed out
78 * -EAGAIN: invalid request for state machine
79 * -ENOENT: not implemented
81 * -EPERM: invalid signature
84 #define DBC_IOC_TYPE 'D'
87 * DBCIOCNONCE - Fetch a nonce from the PSP for authenticating commands.
88 * If a nonce is fetched without authentication it can only
89 * be utilized for one command.
90 * If a nonce is fetched with authentication it can be used
91 * for multiple requests.
93 #define DBCIOCNONCE _IOWR(DBC_IOC_TYPE, 0x1, struct dbc_user_nonce)
96 * DBCIOCUID - Set the user ID (UID) of a calling process.
97 * The user ID is 8 bytes long. It must be programmed using a
98 * 32 byte signature built using the nonce fetched from
100 * The UID can only be set once until the system is rebooted.
102 #define DBCIOCUID _IOW(DBC_IOC_TYPE, 0x2, struct dbc_user_setuid)
105 * DBCIOCPARAM - Set or get a parameter from the PSP.
106 * This request will only work after DBCIOCUID has successfully
107 * set the UID of the calling process.
108 * Whether the parameter is set or get is controlled by the
109 * message ID in the request.
110 * This command must be sent using a 32 byte signature built
111 * using the nonce fetched from DBCIOCNONCE.
112 * When the command succeeds, the 32 byte signature will be
113 * updated by the PSP for software to authenticate the results.
115 #define DBCIOCPARAM _IOWR(DBC_IOC_TYPE, 0x3, struct dbc_user_param)
118 * enum dbc_cmd_msg - Messages utilized by DBCIOCPARAM
119 * @PARAM_GET_FMAX_CAP: Get frequency cap (MHz)
120 * @PARAM_SET_FMAX_CAP: Set frequency cap (MHz)
121 * @PARAM_GET_PWR_CAP: Get socket power cap (mW)
122 * @PARAM_SET_PWR_CAP: Set socket power cap (mW)
123 * @PARAM_GET_GFX_MODE: Get graphics mode (0/1)
124 * @PARAM_SET_GFX_MODE: Set graphics mode (0/1)
125 * @PARAM_GET_CURR_TEMP: Get current temperature (degrees C)
126 * @PARAM_GET_FMAX_MAX: Get maximum allowed value for frequency (MHz)
127 * @PARAM_GET_FMAX_MIN: Get minimum allowed value for frequency (MHz)
128 * @PARAM_GET_SOC_PWR_MAX: Get maximum allowed value for SoC power (mw)
129 * @PARAM_GET_SOC_PWR_MIN: Get minimum allowed value for SoC power (mw)
130 * @PARAM_GET_SOC_PWR_CUR: Get current value for SoC Power (mW)
133 PARAM_GET_FMAX_CAP = 0x3,
134 PARAM_SET_FMAX_CAP = 0x4,
135 PARAM_GET_PWR_CAP = 0x5,
136 PARAM_SET_PWR_CAP = 0x6,
137 PARAM_GET_GFX_MODE = 0x7,
138 PARAM_SET_GFX_MODE = 0x8,
139 PARAM_GET_CURR_TEMP = 0x9,
140 PARAM_GET_FMAX_MAX = 0xA,
141 PARAM_GET_FMAX_MIN = 0xB,
142 PARAM_GET_SOC_PWR_MAX = 0xC,
143 PARAM_GET_SOC_PWR_MIN = 0xD,
144 PARAM_GET_SOC_PWR_CUR = 0xE,
147 #endif /* __PSP_DBC_USER_H__ */