/* * Copyright (c) Advanced Micro Devices, Inc. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ #include #include #include #include #include #include #include #include "amd_smi/amdsmi.h" #include "asm/amd_hsmp.h" #include #include #define SHOWLINESZ 256 #define CHK_AMDSMI_RET(RET) \ { \ if (RET != AMDSMI_STATUS_SUCCESS) { \ const char *err_str; \ amdsmi_status_t status; \ status = amdsmi_get_esmi_err_msg(RET, &err_str); \ std::cout << "AMDSMI call returned " << status << " at line " \ << __LINE__ << std::endl; \ std::cout << err_str << std::endl; \ return RET; \ } \ } using std::cin; using std::cout; using std::endl; using std::fixed; using std::setprecision; using std::vector; int main(int argc, char **argv) { amdsmi_status_t ret; uint32_t proto_ver; amdsmi_smu_fw_version_t smu_fw = {}; // Initialize esmi for AMD CPUs ret = amdsmi_init(AMDSMI_INIT_AMD_CPUS); CHK_AMDSMI_RET(ret) // Get all sockets uint32_t socket_count = 0; ret = amdsmi_get_socket_handles(&socket_count, nullptr); CHK_AMDSMI_RET(ret) // Allocate the memory for the sockets vector sockets(socket_count); // Get the sockets of the system ret = amdsmi_get_socket_handles(&socket_count, &sockets[0]); CHK_AMDSMI_RET(ret) cout << "Total Socket: " << socket_count << endl; // For each socket, get cpus and cores for (uint32_t i = 0; i < socket_count; i++) { cout << endl << "Socket " << i << endl; uint32_t cpu_count = 0; uint32_t core_count = 0; // Set processor type as AMDSMI_PROCESSOR_TYPE_AMD_CPU processor_type_t processor_type = AMDSMI_PROCESSOR_TYPE_AMD_CPU; ret = amdsmi_get_processor_handles_by_type(sockets[i], processor_type, nullptr, &cpu_count); CHK_AMDSMI_RET(ret) // Allocate the memory for the cpus vector plist(cpu_count); // Get the cpus for each socket ret = amdsmi_get_processor_handles_by_type(sockets[i], processor_type, &plist[0], &cpu_count); CHK_AMDSMI_RET(ret) // Set processor type as AMDSMI_PROCESSOR_TYPE_AMD_CPU_CORE processor_type = AMDSMI_PROCESSOR_TYPE_AMD_CPU_CORE; ret = amdsmi_get_processor_handles_by_type(sockets[i], processor_type, nullptr, &core_count); CHK_AMDSMI_RET(ret) // Allocate the memory for the cpu cores vector core_list(core_count); // Get the cpu cores for each socket ret = amdsmi_get_processor_handles_by_type(sockets[i], processor_type, &core_list[0], &core_count); CHK_AMDSMI_RET(ret) for (uint32_t index = 0; index < plist.size(); index++) { ret = amdsmi_get_cpu_hsmp_proto_ver(plist[index], &proto_ver); if(ret != AMDSMI_STATUS_SUCCESS) cout<<"Failed to get hsmp proto version"<<"["< 0 && retVal < SHOWLINESZ) cout << str; else cout <<"error writing to buffer" << endl; cout<<"\n-------------------------------------------------\n"; uint32_t socket_power; cout<(socket_power)/1000<<"\t|"; } else { err_bits |= 1 << ret; cout<<" NA (Err:" <(power_limit)/1000<<"\t|"; } else { err_bits |= 1 << ret; cout<<" NA (Err:" <(power_max)/1000<<"\t|"; } else { err_bits |= 1 << ret; cout<<" NA (Err:" <>input_power; ret = amdsmi_get_cpu_socket_power_cap_max(plist[index], &power_max); if(ret != AMDSMI_STATUS_SUCCESS) cout<<"Failed to get cpu socket power cap max"<<"["< power_max)) { cout<<"Input power is more than max power limit," " limiting to "<(power_max)/1000<<"Watts\n"; input_power = power_max; } ret = amdsmi_set_cpu_socket_power_cap(plist[index], input_power); if(ret != AMDSMI_STATUS_SUCCESS) cout<<"Failed to set cpu socket power cap"<<"["<(input_power)/1000<<" Watts successfully\n"; } power_limit = 0; cout<<"\n| PowerLimit (Watts) \t\t | "; ret = amdsmi_get_cpu_socket_power_cap(plist[index], &power_limit); if(ret != AMDSMI_STATUS_SUCCESS) cout<<"Failed to get cpu socket power cap"<<"["<(power_limit)/1000<<"\t|"; } else { err_bits |= 1 << ret; cout<<" NA (Err:" <