psp-dbc.h (5279B)
- /* SPDX-License-Identifier: GPL-2.0-only WITH Linux-syscall-note */
- /*
- * Userspace interface for AMD Dynamic Boost Control (DBC)
- *
- * Copyright (C) 2023 Advanced Micro Devices, Inc.
- *
- * Author: Mario Limonciello <mario.limonciello@amd.com>
- */
- #ifndef __PSP_DBC_USER_H__
- #define __PSP_DBC_USER_H__
- #include <linux/types.h>
- /**
- * DOC: AMD Dynamic Boost Control (DBC) interface
- */
- #define DBC_NONCE_SIZE 16
- #define DBC_SIG_SIZE 32
- #define DBC_UID_SIZE 16
- /**
- * struct dbc_user_nonce - Nonce exchange structure (input/output).
- * @auth_needed: Whether the PSP should authenticate this request (input).
- * 0: no authentication, PSP will return single use nonce.
- * 1: authentication: PSP will return multi-use nonce.
- * @nonce: 8 byte value used for future authentication (output).
- * @signature: Optional 32 byte signature created by software using a
- * previous nonce (input).
- */
- struct dbc_user_nonce {
- __u32 auth_needed;
- __u8 nonce[DBC_NONCE_SIZE];
- __u8 signature[DBC_SIG_SIZE];
- } __attribute__((packed));
- /**
- * struct dbc_user_setuid - UID exchange structure (input).
- * @uid: 16 byte value representing software identity
- * @signature: 32 byte signature created by software using a previous nonce
- */
- struct dbc_user_setuid {
- __u8 uid[DBC_UID_SIZE];
- __u8 signature[DBC_SIG_SIZE];
- } __attribute__((packed));
- /**
- * struct dbc_user_param - Parameter exchange structure (input/output).
- * @msg_index: Message indicating what parameter to set or get (input)
- * @param: 4 byte parameter, units are message specific. (input/output)
- * @signature: 32 byte signature.
- * - When sending a message this is to be created by software
- * using a previous nonce (input)
- * - For interpreting results, this signature is updated by the
- * PSP to allow software to validate the authenticity of the
- * results.
- */
- struct dbc_user_param {
- __u32 msg_index;
- __u32 param;
- __u8 signature[DBC_SIG_SIZE];
- } __attribute__((packed));
- /**
- * Dynamic Boost Control (DBC) IOC
- *
- * possible return codes for all DBC IOCTLs:
- * 0: success
- * -EINVAL: invalid input
- * -E2BIG: excess data passed
- * -EFAULT: failed to copy to/from userspace
- * -EBUSY: mailbox in recovery or in use
- * -ENODEV: driver not bound with PSP device
- * -EACCES: request isn't authorized
- * -EINVAL: invalid parameter
- * -ETIMEDOUT: request timed out
- * -EAGAIN: invalid request for state machine
- * -ENOENT: not implemented
- * -ENFILE: overflow
- * -EPERM: invalid signature
- * -EIO: unknown error
- */
- #define DBC_IOC_TYPE 'D'
- /**
- * DBCIOCNONCE - Fetch a nonce from the PSP for authenticating commands.
- * If a nonce is fetched without authentication it can only
- * be utilized for one command.
- * If a nonce is fetched with authentication it can be used
- * for multiple requests.
- */
- #define DBCIOCNONCE _IOWR(DBC_IOC_TYPE, 0x1, struct dbc_user_nonce)
- /**
- * DBCIOCUID - Set the user ID (UID) of a calling process.
- * The user ID is 8 bytes long. It must be programmed using a
- * 32 byte signature built using the nonce fetched from
- * DBCIOCNONCE.
- * The UID can only be set once until the system is rebooted.
- */
- #define DBCIOCUID _IOW(DBC_IOC_TYPE, 0x2, struct dbc_user_setuid)
- /**
- * DBCIOCPARAM - Set or get a parameter from the PSP.
- * This request will only work after DBCIOCUID has successfully
- * set the UID of the calling process.
- * Whether the parameter is set or get is controlled by the
- * message ID in the request.
- * This command must be sent using a 32 byte signature built
- * using the nonce fetched from DBCIOCNONCE.
- * When the command succeeds, the 32 byte signature will be
- * updated by the PSP for software to authenticate the results.
- */
- #define DBCIOCPARAM _IOWR(DBC_IOC_TYPE, 0x3, struct dbc_user_param)
- /**
- * enum dbc_cmd_msg - Messages utilized by DBCIOCPARAM
- * @PARAM_GET_FMAX_CAP: Get frequency cap (MHz)
- * @PARAM_SET_FMAX_CAP: Set frequency cap (MHz)
- * @PARAM_GET_PWR_CAP: Get socket power cap (mW)
- * @PARAM_SET_PWR_CAP: Set socket power cap (mW)
- * @PARAM_GET_GFX_MODE: Get graphics mode (0/1)
- * @PARAM_SET_GFX_MODE: Set graphics mode (0/1)
- * @PARAM_GET_CURR_TEMP: Get current temperature (degrees C)
- * @PARAM_GET_FMAX_MAX: Get maximum allowed value for frequency (MHz)
- * @PARAM_GET_FMAX_MIN: Get minimum allowed value for frequency (MHz)
- * @PARAM_GET_SOC_PWR_MAX: Get maximum allowed value for SoC power (mw)
- * @PARAM_GET_SOC_PWR_MIN: Get minimum allowed value for SoC power (mw)
- * @PARAM_GET_SOC_PWR_CUR: Get current value for SoC Power (mW)
- */
- enum dbc_cmd_msg {
- PARAM_GET_FMAX_CAP = 0x3,
- PARAM_SET_FMAX_CAP = 0x4,
- PARAM_GET_PWR_CAP = 0x5,
- PARAM_SET_PWR_CAP = 0x6,
- PARAM_GET_GFX_MODE = 0x7,
- PARAM_SET_GFX_MODE = 0x8,
- PARAM_GET_CURR_TEMP = 0x9,
- PARAM_GET_FMAX_MAX = 0xA,
- PARAM_GET_FMAX_MIN = 0xB,
- PARAM_GET_SOC_PWR_MAX = 0xC,
- PARAM_GET_SOC_PWR_MIN = 0xD,
- PARAM_GET_SOC_PWR_CUR = 0xE,
- };
- #endif /* __PSP_DBC_USER_H__ */