zig

fork of https://codeberg.org/ziglang/zig
Log | Files | Refs | README | LICENSE

psp-dbc.h (5278B) - Raw


      1 /* SPDX-License-Identifier: GPL-2.0-only WITH Linux-syscall-note */
      2 /*
      3  * Userspace interface for AMD Dynamic Boost Control (DBC)
      4  *
      5  * Copyright (C) 2023 Advanced Micro Devices, Inc.
      6  *
      7  * Author: Mario Limonciello <mario.limonciello@amd.com>
      8  */
      9 
     10 #ifndef __PSP_DBC_USER_H__
     11 #define __PSP_DBC_USER_H__
     12 
     13 #include <linux/types.h>
     14 
     15 /**
     16  * DOC: AMD Dynamic Boost Control (DBC) interface
     17  */
     18 
     19 #define DBC_NONCE_SIZE		16
     20 #define DBC_SIG_SIZE		32
     21 #define DBC_UID_SIZE		16
     22 
     23 /**
     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).
     31  */
     32 struct dbc_user_nonce {
     33 	__u32	auth_needed;
     34 	__u8	nonce[DBC_NONCE_SIZE];
     35 	__u8	signature[DBC_SIG_SIZE];
     36 } __attribute__((packed));
     37 
     38 /**
     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
     42  */
     43 struct dbc_user_setuid {
     44 	__u8	uid[DBC_UID_SIZE];
     45 	__u8	signature[DBC_SIG_SIZE];
     46 } __attribute__((packed));
     47 
     48 /**
     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
     57  *               results.
     58  */
     59 struct dbc_user_param {
     60 	__u32	msg_index;
     61 	__u32	param;
     62 	__u8	signature[DBC_SIG_SIZE];
     63 } __attribute__((packed));
     64 
     65 /**
     66  * Dynamic Boost Control (DBC) IOC
     67  *
     68  * possible return codes for all DBC IOCTLs:
     69  *  0:          success
     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
     80  *  -ENFILE:    overflow
     81  *  -EPERM:     invalid signature
     82  *  -EIO:       unknown error
     83  */
     84 #define DBC_IOC_TYPE	'D'
     85 
     86 /**
     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.
     92  */
     93 #define DBCIOCNONCE	_IOWR(DBC_IOC_TYPE, 0x1, struct dbc_user_nonce)
     94 
     95 /**
     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
     99  *             DBCIOCNONCE.
    100  *             The UID can only be set once until the system is rebooted.
    101  */
    102 #define DBCIOCUID	_IOW(DBC_IOC_TYPE, 0x2, struct dbc_user_setuid)
    103 
    104 /**
    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.
    114  */
    115 #define DBCIOCPARAM	_IOWR(DBC_IOC_TYPE, 0x3, struct dbc_user_param)
    116 
    117 /**
    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)
    131  */
    132 enum dbc_cmd_msg {
    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,
    145 };
    146 
    147 #endif /* __PSP_DBC_USER_H__ */