/* 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];
} __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];
} __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];
} __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, 0 x1, 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, 0 x2, 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, 0 x3, 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 = 0 x3,
PARAM_SET_FMAX_CAP = 0 x4,
PARAM_GET_PWR_CAP = 0 x5,
PARAM_SET_PWR_CAP = 0 x6,
PARAM_GET_GFX_MODE = 0 x7,
PARAM_SET_GFX_MODE = 0 x8,
PARAM_GET_CURR_TEMP = 0 x9,
PARAM_GET_FMAX_MAX = 0 xA,
PARAM_GET_FMAX_MIN = 0 xB,
PARAM_GET_SOC_PWR_MAX = 0 xC,
PARAM_GET_SOC_PWR_MIN = 0 xD,
PARAM_GET_SOC_PWR_CUR = 0 xE,
};
#endif /* __PSP_DBC_USER_H__ */
Messung V0.5 in Prozent C=91 H=98 G=94
¤ Dauer der Verarbeitung: 0.9 Sekunden
¤
*© Formatika GbR, Deutschland