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