* Don't require powercap support

APUs don't necessarily support setting a power cap from sysfs.
Ignore failures of the file missing.

Signed-off-by: Mario Limonciello (AMD) <superm1@kernel.org>

* Show edge temperature in default output if hotspot is missing

APUs don't have a hotspot temperature, they have an edge though.
Use that.

Signed-off-by: Mario Limonciello (AMD) <superm1@kernel.org>

* Format all "power" keys as watts

There will be more power keys when APU support is added, so format
them properly.

Signed-off-by: Mario Limonciello (AMD) <superm1@kernel.org>

* Don't show power limit in output if it's invalid

APUs can't set power limit using power_cap1 interface.  The limit
will be 0 and thus the UX looks weird in default output.
Only add the `/power_limit` if it's valid.

Signed-off-by: Mario Limonciello (AMD) <superm1@kernel.org>

* Unify sizes of `amdsmi_power_info_t`

Sizes are used inconsistently.  This causes tools to not show
N/A when they should.  Make them unified.

Signed-off-by: Mario Limonciello (AMD) <superm1@kernel.org>

---------

Signed-off-by: Mario Limonciello (AMD) <superm1@kernel.org>
Этот коммит содержится в:
Mario Limonciello authored and GitHub committed 2025-12-08 21:36:45 -06:00
1 родитель 24ff76a880
Коммит a08170bc75
6 files changed
+41 -23

No files matched your search

+24 -17
Просмотреть файл
@@ -4556,28 +4556,33 @@ amdsmi_get_power_info(amdsmi_processor_handle processor_handle, amdsmi_power_inf
if (status != AMDSMI_STATUS_SUCCESS)
return status;
info->socket_power = 0xFFFF;
info->current_socket_power = 0xFFFF;
info->average_socket_power = 0xFFFF;
info->gfx_voltage = 0xFFFF;
info->soc_voltage = 0xFFFF;
info->mem_voltage = 0xFFFF;
info->power_limit = 0xFFFF;
info->socket_power = get_std_num_limit<decltype(info->socket_power)>();
info->current_socket_power = get_std_num_limit<decltype(info->current_socket_power)>();
info->average_socket_power = get_std_num_limit<decltype(info->average_socket_power)>();
info->gfx_voltage = get_std_num_limit<decltype(info->gfx_voltage)>();
info->soc_voltage = get_std_num_limit<decltype(info->soc_voltage)>();
info->mem_voltage = get_std_num_limit<decltype(info->mem_voltage)>();
info->power_limit = get_std_num_limit<decltype(info->power_limit)>();
amdsmi_gpu_metrics_t metrics = {};
status = amdsmi_get_gpu_metrics_info(processor_handle, &metrics);
if (status == AMDSMI_STATUS_SUCCESS) {
info->current_socket_power = metrics.current_socket_power;
info->average_socket_power = metrics.average_socket_power;
info->gfx_voltage = metrics.voltage_gfx;
info->soc_voltage = metrics.voltage_soc;
info->mem_voltage = metrics.voltage_mem;
}
if (metrics.current_socket_power != get_std_num_limit<decltype(metrics.current_socket_power)>())
info->current_socket_power = metrics.current_socket_power;
if (metrics.average_socket_power != get_std_num_limit<decltype(metrics.average_socket_power)>())
info->average_socket_power = metrics.average_socket_power;
if (metrics.voltage_gfx != get_std_num_limit<decltype(metrics.voltage_gfx)>())
info->gfx_voltage = metrics.voltage_gfx;
if (metrics.voltage_soc != get_std_num_limit<decltype(metrics.voltage_soc)>())
info->soc_voltage = metrics.voltage_soc;
if (metrics.voltage_mem != get_std_num_limit<decltype(metrics.voltage_mem)>())
info->mem_voltage = metrics.voltage_mem;
if (metrics.current_socket_power != 0xFFFF) {
info->socket_power = metrics.current_socket_power;
} else if (metrics.average_socket_power != 0xFFFF) {
info->socket_power = metrics.average_socket_power;
/* store something in socket power */
if (info->current_socket_power != get_std_num_limit<decltype(info->current_socket_power)>())
info->socket_power = info->current_socket_power;
else if (info->average_socket_power != get_std_num_limit<decltype(info->average_socket_power)>())
info->socket_power = info->average_socket_power;
}
int power_limit = 0;
@@ -4585,6 +4590,8 @@ amdsmi_get_power_info(amdsmi_processor_handle processor_handle, amdsmi_power_inf
amdsmi_status_t status2 = smi_amdgpu_get_power_cap(gpu_device, 0, &power_limit);
if (status2 == AMDSMI_STATUS_SUCCESS) {
info->power_limit = power_limit;
} else if (status2 == AMDSMI_STATUS_NOT_SUPPORTED) {
status = AMDSMI_STATUS_SUCCESS;
}
// Returning status from amdsmi_get_gpu_metrics_info() which should return SUCCESS
+1 -1
Просмотреть файл
@@ -260,7 +260,7 @@ amdsmi_status_t smi_amdgpu_get_power_cap(amd::smi::AMDSmiGPUDevice* device, uint
fullpath += "/power" + std::to_string(sensor_ind + 1) + "_cap";
std::ifstream file(fullpath.c_str(), std::ifstream::in);
if (!file.is_open()) {
return AMDSMI_STATUS_API_FAILED;
return AMDSMI_STATUS_NOT_SUPPORTED;
}
file.getline(val, DATA_SIZE);