1*91f410aaSSuma Hegde /* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ 2*91f410aaSSuma Hegde 3*91f410aaSSuma Hegde #ifndef _UAPI_ASM_X86_AMD_HSMP_H_ 4*91f410aaSSuma Hegde #define _UAPI_ASM_X86_AMD_HSMP_H_ 5*91f410aaSSuma Hegde 6*91f410aaSSuma Hegde #include <linux/types.h> 7*91f410aaSSuma Hegde 8*91f410aaSSuma Hegde #pragma pack(4) 9*91f410aaSSuma Hegde 10*91f410aaSSuma Hegde #define HSMP_MAX_MSG_LEN 8 11*91f410aaSSuma Hegde 12*91f410aaSSuma Hegde /* 13*91f410aaSSuma Hegde * HSMP Messages supported 14*91f410aaSSuma Hegde */ 15*91f410aaSSuma Hegde enum hsmp_message_ids { 16*91f410aaSSuma Hegde HSMP_TEST = 1, /* 01h Increments input value by 1 */ 17*91f410aaSSuma Hegde HSMP_GET_SMU_VER, /* 02h SMU FW version */ 18*91f410aaSSuma Hegde HSMP_GET_PROTO_VER, /* 03h HSMP interface version */ 19*91f410aaSSuma Hegde HSMP_GET_SOCKET_POWER, /* 04h average package power consumption */ 20*91f410aaSSuma Hegde HSMP_SET_SOCKET_POWER_LIMIT, /* 05h Set the socket power limit */ 21*91f410aaSSuma Hegde HSMP_GET_SOCKET_POWER_LIMIT, /* 06h Get current socket power limit */ 22*91f410aaSSuma Hegde HSMP_GET_SOCKET_POWER_LIMIT_MAX,/* 07h Get maximum socket power value */ 23*91f410aaSSuma Hegde HSMP_SET_BOOST_LIMIT, /* 08h Set a core maximum frequency limit */ 24*91f410aaSSuma Hegde HSMP_SET_BOOST_LIMIT_SOCKET, /* 09h Set socket maximum frequency level */ 25*91f410aaSSuma Hegde HSMP_GET_BOOST_LIMIT, /* 0Ah Get current frequency limit */ 26*91f410aaSSuma Hegde HSMP_GET_PROC_HOT, /* 0Bh Get PROCHOT status */ 27*91f410aaSSuma Hegde HSMP_SET_XGMI_LINK_WIDTH, /* 0Ch Set max and min width of xGMI Link */ 28*91f410aaSSuma Hegde HSMP_SET_DF_PSTATE, /* 0Dh Alter APEnable/Disable messages behavior */ 29*91f410aaSSuma Hegde HSMP_SET_AUTO_DF_PSTATE, /* 0Eh Enable DF P-State Performance Boost algorithm */ 30*91f410aaSSuma Hegde HSMP_GET_FCLK_MCLK, /* 0Fh Get FCLK and MEMCLK for current socket */ 31*91f410aaSSuma Hegde HSMP_GET_CCLK_THROTTLE_LIMIT, /* 10h Get CCLK frequency limit in socket */ 32*91f410aaSSuma Hegde HSMP_GET_C0_PERCENT, /* 11h Get average C0 residency in socket */ 33*91f410aaSSuma Hegde HSMP_SET_NBIO_DPM_LEVEL, /* 12h Set max/min LCLK DPM Level for a given NBIO */ 34*91f410aaSSuma Hegde /* 13h Reserved */ 35*91f410aaSSuma Hegde HSMP_GET_DDR_BANDWIDTH = 0x14, /* 14h Get theoretical maximum and current DDR Bandwidth */ 36*91f410aaSSuma Hegde HSMP_GET_TEMP_MONITOR, /* 15h Get per-DIMM temperature and refresh rates */ 37*91f410aaSSuma Hegde HSMP_MSG_ID_MAX, 38*91f410aaSSuma Hegde }; 39*91f410aaSSuma Hegde 40*91f410aaSSuma Hegde struct hsmp_message { 41*91f410aaSSuma Hegde __u32 msg_id; /* Message ID */ 42*91f410aaSSuma Hegde __u16 num_args; /* Number of input argument words in message */ 43*91f410aaSSuma Hegde __u16 response_sz; /* Number of expected output/response words */ 44*91f410aaSSuma Hegde __u32 args[HSMP_MAX_MSG_LEN]; /* argument/response buffer */ 45*91f410aaSSuma Hegde __u16 sock_ind; /* socket number */ 46*91f410aaSSuma Hegde }; 47*91f410aaSSuma Hegde 48*91f410aaSSuma Hegde enum hsmp_msg_type { 49*91f410aaSSuma Hegde HSMP_RSVD = -1, 50*91f410aaSSuma Hegde HSMP_SET = 0, 51*91f410aaSSuma Hegde HSMP_GET = 1, 52*91f410aaSSuma Hegde }; 53*91f410aaSSuma Hegde 54*91f410aaSSuma Hegde struct hsmp_msg_desc { 55*91f410aaSSuma Hegde int num_args; 56*91f410aaSSuma Hegde int response_sz; 57*91f410aaSSuma Hegde enum hsmp_msg_type type; 58*91f410aaSSuma Hegde }; 59*91f410aaSSuma Hegde 60*91f410aaSSuma Hegde /* 61*91f410aaSSuma Hegde * User may use these comments as reference, please find the 62*91f410aaSSuma Hegde * supported list of messages and message definition in the 63*91f410aaSSuma Hegde * HSMP chapter of respective family/model PPR. 64*91f410aaSSuma Hegde * 65*91f410aaSSuma Hegde * Not supported messages would return -ENOMSG. 66*91f410aaSSuma Hegde */ 67*91f410aaSSuma Hegde static const struct hsmp_msg_desc hsmp_msg_desc_table[] = { 68*91f410aaSSuma Hegde /* RESERVED */ 69*91f410aaSSuma Hegde {0, 0, HSMP_RSVD}, 70*91f410aaSSuma Hegde 71*91f410aaSSuma Hegde /* 72*91f410aaSSuma Hegde * HSMP_TEST, num_args = 1, response_sz = 1 73*91f410aaSSuma Hegde * input: args[0] = xx 74*91f410aaSSuma Hegde * output: args[0] = xx + 1 75*91f410aaSSuma Hegde */ 76*91f410aaSSuma Hegde {1, 1, HSMP_GET}, 77*91f410aaSSuma Hegde 78*91f410aaSSuma Hegde /* 79*91f410aaSSuma Hegde * HSMP_GET_SMU_VER, num_args = 0, response_sz = 1 80*91f410aaSSuma Hegde * output: args[0] = smu fw ver 81*91f410aaSSuma Hegde */ 82*91f410aaSSuma Hegde {0, 1, HSMP_GET}, 83*91f410aaSSuma Hegde 84*91f410aaSSuma Hegde /* 85*91f410aaSSuma Hegde * HSMP_GET_PROTO_VER, num_args = 0, response_sz = 1 86*91f410aaSSuma Hegde * output: args[0] = proto version 87*91f410aaSSuma Hegde */ 88*91f410aaSSuma Hegde {0, 1, HSMP_GET}, 89*91f410aaSSuma Hegde 90*91f410aaSSuma Hegde /* 91*91f410aaSSuma Hegde * HSMP_GET_SOCKET_POWER, num_args = 0, response_sz = 1 92*91f410aaSSuma Hegde * output: args[0] = socket power in mWatts 93*91f410aaSSuma Hegde */ 94*91f410aaSSuma Hegde {0, 1, HSMP_GET}, 95*91f410aaSSuma Hegde 96*91f410aaSSuma Hegde /* 97*91f410aaSSuma Hegde * HSMP_SET_SOCKET_POWER_LIMIT, num_args = 1, response_sz = 0 98*91f410aaSSuma Hegde * input: args[0] = power limit value in mWatts 99*91f410aaSSuma Hegde */ 100*91f410aaSSuma Hegde {1, 0, HSMP_SET}, 101*91f410aaSSuma Hegde 102*91f410aaSSuma Hegde /* 103*91f410aaSSuma Hegde * HSMP_GET_SOCKET_POWER_LIMIT, num_args = 0, response_sz = 1 104*91f410aaSSuma Hegde * output: args[0] = socket power limit value in mWatts 105*91f410aaSSuma Hegde */ 106*91f410aaSSuma Hegde {0, 1, HSMP_GET}, 107*91f410aaSSuma Hegde 108*91f410aaSSuma Hegde /* 109*91f410aaSSuma Hegde * HSMP_GET_SOCKET_POWER_LIMIT_MAX, num_args = 0, response_sz = 1 110*91f410aaSSuma Hegde * output: args[0] = maximuam socket power limit in mWatts 111*91f410aaSSuma Hegde */ 112*91f410aaSSuma Hegde {0, 1, HSMP_GET}, 113*91f410aaSSuma Hegde 114*91f410aaSSuma Hegde /* 115*91f410aaSSuma Hegde * HSMP_SET_BOOST_LIMIT, num_args = 1, response_sz = 0 116*91f410aaSSuma Hegde * input: args[0] = apic id[31:16] + boost limit value in MHz[15:0] 117*91f410aaSSuma Hegde */ 118*91f410aaSSuma Hegde {1, 0, HSMP_SET}, 119*91f410aaSSuma Hegde 120*91f410aaSSuma Hegde /* 121*91f410aaSSuma Hegde * HSMP_SET_BOOST_LIMIT_SOCKET, num_args = 1, response_sz = 0 122*91f410aaSSuma Hegde * input: args[0] = boost limit value in MHz 123*91f410aaSSuma Hegde */ 124*91f410aaSSuma Hegde {1, 0, HSMP_SET}, 125*91f410aaSSuma Hegde 126*91f410aaSSuma Hegde /* 127*91f410aaSSuma Hegde * HSMP_GET_BOOST_LIMIT, num_args = 1, response_sz = 1 128*91f410aaSSuma Hegde * input: args[0] = apic id 129*91f410aaSSuma Hegde * output: args[0] = boost limit value in MHz 130*91f410aaSSuma Hegde */ 131*91f410aaSSuma Hegde {1, 1, HSMP_GET}, 132*91f410aaSSuma Hegde 133*91f410aaSSuma Hegde /* 134*91f410aaSSuma Hegde * HSMP_GET_PROC_HOT, num_args = 0, response_sz = 1 135*91f410aaSSuma Hegde * output: args[0] = proc hot status 136*91f410aaSSuma Hegde */ 137*91f410aaSSuma Hegde {0, 1, HSMP_GET}, 138*91f410aaSSuma Hegde 139*91f410aaSSuma Hegde /* 140*91f410aaSSuma Hegde * HSMP_SET_XGMI_LINK_WIDTH, num_args = 1, response_sz = 0 141*91f410aaSSuma Hegde * input: args[0] = min link width[15:8] + max link width[7:0] 142*91f410aaSSuma Hegde */ 143*91f410aaSSuma Hegde {1, 0, HSMP_SET}, 144*91f410aaSSuma Hegde 145*91f410aaSSuma Hegde /* 146*91f410aaSSuma Hegde * HSMP_SET_DF_PSTATE, num_args = 1, response_sz = 0 147*91f410aaSSuma Hegde * input: args[0] = df pstate[7:0] 148*91f410aaSSuma Hegde */ 149*91f410aaSSuma Hegde {1, 0, HSMP_SET}, 150*91f410aaSSuma Hegde 151*91f410aaSSuma Hegde /* HSMP_SET_AUTO_DF_PSTATE, num_args = 0, response_sz = 0 */ 152*91f410aaSSuma Hegde {0, 0, HSMP_SET}, 153*91f410aaSSuma Hegde 154*91f410aaSSuma Hegde /* 155*91f410aaSSuma Hegde * HSMP_GET_FCLK_MCLK, num_args = 0, response_sz = 2 156*91f410aaSSuma Hegde * output: args[0] = fclk in MHz, args[1] = mclk in MHz 157*91f410aaSSuma Hegde */ 158*91f410aaSSuma Hegde {0, 2, HSMP_GET}, 159*91f410aaSSuma Hegde 160*91f410aaSSuma Hegde /* 161*91f410aaSSuma Hegde * HSMP_GET_CCLK_THROTTLE_LIMIT, num_args = 0, response_sz = 1 162*91f410aaSSuma Hegde * output: args[0] = core clock in MHz 163*91f410aaSSuma Hegde */ 164*91f410aaSSuma Hegde {0, 1, HSMP_GET}, 165*91f410aaSSuma Hegde 166*91f410aaSSuma Hegde /* 167*91f410aaSSuma Hegde * HSMP_GET_C0_PERCENT, num_args = 0, response_sz = 1 168*91f410aaSSuma Hegde * output: args[0] = average c0 residency 169*91f410aaSSuma Hegde */ 170*91f410aaSSuma Hegde {0, 1, HSMP_GET}, 171*91f410aaSSuma Hegde 172*91f410aaSSuma Hegde /* 173*91f410aaSSuma Hegde * HSMP_SET_NBIO_DPM_LEVEL, num_args = 1, response_sz = 0 174*91f410aaSSuma Hegde * input: args[0] = nbioid[23:16] + max dpm level[15:8] + min dpm level[7:0] 175*91f410aaSSuma Hegde */ 176*91f410aaSSuma Hegde {1, 0, HSMP_SET}, 177*91f410aaSSuma Hegde 178*91f410aaSSuma Hegde /* RESERVED message */ 179*91f410aaSSuma Hegde {0, 0, HSMP_RSVD}, 180*91f410aaSSuma Hegde 181*91f410aaSSuma Hegde /* 182*91f410aaSSuma Hegde * HSMP_GET_DDR_BANDWIDTH, num_args = 0, response_sz = 1 183*91f410aaSSuma Hegde * output: args[0] = max bw in Gbps[31:20] + utilised bw in Gbps[19:8] + 184*91f410aaSSuma Hegde * bw in percentage[7:0] 185*91f410aaSSuma Hegde */ 186*91f410aaSSuma Hegde {0, 1, HSMP_GET}, 187*91f410aaSSuma Hegde 188*91f410aaSSuma Hegde /* 189*91f410aaSSuma Hegde * HSMP_GET_TEMP_MONITOR, num_args = 0, response_sz = 1 190*91f410aaSSuma Hegde * output: args[0] = temperature in degree celsius. [15:8] integer part + 191*91f410aaSSuma Hegde * [7:5] fractional part 192*91f410aaSSuma Hegde */ 193*91f410aaSSuma Hegde {0, 1, HSMP_GET}, 194*91f410aaSSuma Hegde }; 195*91f410aaSSuma Hegde 196*91f410aaSSuma Hegde /* Reset to default packing */ 197*91f410aaSSuma Hegde #pragma pack() 198*91f410aaSSuma Hegde 199*91f410aaSSuma Hegde /* Define unique ioctl command for hsmp msgs using generic _IOWR */ 200*91f410aaSSuma Hegde #define HSMP_BASE_IOCTL_NR 0xF8 201*91f410aaSSuma Hegde #define HSMP_IOCTL_CMD _IOWR(HSMP_BASE_IOCTL_NR, 0, struct hsmp_message) 202*91f410aaSSuma Hegde 203*91f410aaSSuma Hegde #endif /*_ASM_X86_AMD_HSMP_H_*/ 204