Skip to content

Commit b2d8569

Browse files
overlay_params: detect sensor availability for "full" overlay preset
Replace the hardcoded handheld device-id list in preset 4 with a per-GPU check of which sensors are actually reported, so on handhelds information is only shown when it is actually available on the device. AMD and Intel report availability via hwmon (a missing node hides the field); AMD voltage is special-cased since its node exists but reads 0, so it is probed at init. Also drops the redundant gpu_efficiency=0, already set for all of preset 4.
1 parent 7d56089 commit b2d8569

5 files changed

Lines changed: 58 additions & 12 deletions

File tree

src/amdgpu.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -553,6 +553,15 @@ AMDGPU::AMDGPU(std::string pci_dev, uint32_t device_id, uint32_t vendor_id) {
553553
}
554554
}
555555

556+
// Probe voltage before the polling thread starts; it shares this FILE*.
557+
if (sysfs_nodes.gpu_voltage_soc) {
558+
int64_t value = 0;
559+
rewind(sysfs_nodes.gpu_voltage_soc);
560+
fflush(sysfs_nodes.gpu_voltage_soc);
561+
if (fscanf(sysfs_nodes.gpu_voltage_soc, "%" PRId64, &value) == 1 && value > 0)
562+
voltage_is_valid = true;
563+
}
564+
556565
throttling = std::make_shared<Throttling>(0x1002);
557566
#ifndef TEST_ONLY
558567
fdinfo_helper = std::make_unique<GPU_fdinfo>("amdgpu", pci_dev, "", /*called_from_amdgpu_cpp=*/ true);

src/amdgpu.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -506,6 +506,13 @@ class AMDGPU {
506506
cond_var.notify_one();
507507
}
508508

509+
bool has_fan_sensor() const { return sysfs_nodes.fan != nullptr; }
510+
bool has_junction_temp_sensor() const { return sysfs_nodes.junction_temp != nullptr; }
511+
bool has_memory_temp_sensor() const { return sysfs_nodes.memory_temp != nullptr; }
512+
bool has_power_limit_sensor() const { return sysfs_nodes.power_limit != nullptr; }
513+
// in0_input exists on some APUs but always reads 0, so require a reading
514+
bool has_voltage_sensor() const { return sysfs_nodes.gpu_voltage_soc != nullptr && voltage_is_valid; }
515+
509516
private:
510517
std::string pci_dev;
511518
std::string gpu_metrics_path;
@@ -515,6 +522,7 @@ class AMDGPU {
515522
std::thread thread;
516523
struct amdgpu_files sysfs_nodes = {};
517524
bool gpu_metrics_is_valid = false;
525+
bool voltage_is_valid = false; // gpu_voltage_soc read non-zero at init
518526
std::condition_variable cond_var;
519527
std::atomic<bool> stop_thread{false};
520528
std::atomic<bool> paused{false};

src/gpu.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,13 @@ class GPU {
100100
return false;
101101
}
102102

103+
// Sensor availability: AMD and Intel report it from hwmon
104+
bool has_fan_sensor() { return amdgpu ? amdgpu->has_fan_sensor() : fdinfo ? fdinfo->has_fan_sensor() : true; }
105+
bool has_junction_temp_sensor() { return amdgpu ? amdgpu->has_junction_temp_sensor() : fdinfo ? fdinfo->has_junction_temp_sensor() : true; }
106+
bool has_memory_temp_sensor() { return amdgpu ? amdgpu->has_memory_temp_sensor() : fdinfo ? fdinfo->has_memory_temp_sensor() : true; }
107+
bool has_voltage_sensor() { return amdgpu ? amdgpu->has_voltage_sensor() : fdinfo ? fdinfo->has_voltage_sensor() : true; }
108+
bool has_power_limit_sensor() { return amdgpu ? amdgpu->has_power_limit_sensor() : fdinfo ? fdinfo->has_power_limit_sensor() : true; }
109+
103110
std::shared_ptr<Throttling> throttling() {
104111
if (nvidia)
105112
return nvidia->throttling;

src/gpu_fdinfo.h

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,8 @@ class GPU_fdinfo {
6060
uint64_t fdinfo_last_update_ms = 0;
6161

6262
std::map<std::string, hwmon_sensor> hwmon_sensors;
63+
bool fan_avail = false, voltage_avail = false;
64+
bool mem_temp_avail = false, power_limit_avail = false;
6365

6466
std::string drm_engine_type = "EMPTY";
6567
std::string drm_memory_type = "EMPTY";
@@ -83,6 +85,10 @@ class GPU_fdinfo {
8385

8486
float get_memory_used();
8587

88+
bool hwmon_has(const std::string& key) const {
89+
auto it = hwmon_sensors.find(key);
90+
return it != hwmon_sensors.end() && !it->second.filename.empty();
91+
}
8692
void find_hwmon_sensors();
8793
std::string find_hwmon_dir();
8894
std::string find_hwmon_sensor_dir(std::string name);
@@ -208,6 +214,12 @@ class GPU_fdinfo {
208214

209215
find_hwmon_sensors();
210216

217+
// Snapshot availability before the worker thread starts mutating the map.
218+
fan_avail = hwmon_has("fan_speed");
219+
voltage_avail = hwmon_has("voltage");
220+
mem_temp_avail = hwmon_has("vram_temp");
221+
power_limit_avail = hwmon_has("power_limit");
222+
211223
if (module == "i915")
212224
find_i915_gt_dir();
213225
else if (module == "xe")
@@ -242,4 +254,10 @@ class GPU_fdinfo {
242254
}
243255

244256
float amdgpu_helper_get_proc_vram();
257+
258+
bool has_fan_sensor() const { return fan_avail; }
259+
bool has_voltage_sensor() const { return voltage_avail; }
260+
bool has_memory_temp_sensor() const { return mem_temp_avail; }
261+
bool has_power_limit_sensor() const { return power_limit_avail; }
262+
bool has_junction_temp_sensor() const { return false; } // not exposed via fdinfo
245263
};

src/overlay_params.cpp

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1380,22 +1380,26 @@ void presets(int preset, struct overlay_params *params, bool inherit) {
13801380
add_to_options(params, "gpu_efficiency", "0");
13811381
add_to_options(params, "cpu_efficiency", "0");
13821382

1383-
// Disable some options if steamdeck / other known handhelds
1383+
// Hide GPU fields with no backing sensor on any detected GPU
13841384
if (!gpus)
13851385
gpus = std::make_unique<GPUS>(params);
13861386

1387-
for (auto gpu : gpus->available_gpus) {
1388-
if (gpu->device_id == 0x1435 || gpu->device_id == 0x163f || gpu->device_id == 0x1681 || gpu->device_id == 0x15bf){
1389-
add_to_options(params, "gpu_fan", "0");
1390-
add_to_options(params, "gpu_junction_temp", "0");
1391-
add_to_options(params, "gpu_voltage", "0");
1392-
add_to_options(params, "gpu_mem_temp", "0");
1393-
add_to_options(params, "gpu_efficiency", "0");
1394-
}
1395-
// Rembrandt and Phoenix APUs (Z1, Z1E, Z2 Go)
1396-
if (gpu->device_id == 0x1681 || gpu->device_id == 0x15bf){
1397-
add_to_options(params, "gpu_power_limit", "0");
1387+
if (!gpus->available_gpus.empty()) {
1388+
bool has_fan = false, has_junction_temp = false, has_memory_temp = false;
1389+
bool has_voltage = false, has_power_limit = false;
1390+
for (auto gpu : gpus->available_gpus) {
1391+
has_fan |= gpu->has_fan_sensor();
1392+
has_junction_temp |= gpu->has_junction_temp_sensor();
1393+
has_memory_temp |= gpu->has_memory_temp_sensor();
1394+
has_voltage |= gpu->has_voltage_sensor();
1395+
has_power_limit |= gpu->has_power_limit_sensor();
13981396
}
1397+
1398+
if (!has_fan) add_to_options(params, "gpu_fan", "0");
1399+
if (!has_junction_temp) add_to_options(params, "gpu_junction_temp", "0");
1400+
if (!has_memory_temp) add_to_options(params, "gpu_mem_temp", "0");
1401+
if (!has_voltage) add_to_options(params, "gpu_voltage", "0");
1402+
if (!has_power_limit) add_to_options(params, "gpu_power_limit", "0");
13991403
}
14001404

14011405
break;

0 commit comments

Comments
 (0)