From e371c8debdc1c0c0c731a99d6d40cd63815515d8 Mon Sep 17 00:00:00 2001 From: Ilya Zlobintsev Date: Wed, 2 Sep 2026 00:27:55 +0300 Subject: [PATCH] feat: abstract AMD DRM --- lact-daemon/src/server/gpu_controller/amd.rs | 176 +-- .../src/server/gpu_controller/amd/drm.rs | 23 + .../server/gpu_controller/amd/drm/amdgpu.rs | 147 ++ .../src/server/gpu_controller/amd/drm/mock.rs | 64 + ...act_daemon__tests__amd__granite-ridge.snap | 243 +++ tests/snapshots/amd/granite-ridge/card2/dev | 1 + .../granite-ridge/card2/device/ari_enabled | 1 + .../amd/granite-ridge/card2/device/boot_vga | 1 + .../card2/device/broken_parity_status | 1 + .../amd/granite-ridge/card2/device/class | 1 + .../card2/device/compute_reset_mask | 1 + .../amd/granite-ridge/card2/device/config | Bin 0 -> 4096 bytes .../card2/device/consistent_dma_mask_bits | 1 + .../card2/device/current_link_speed | 1 + .../card2/device/current_link_width | 1 + .../granite-ridge/card2/device/d3cold_allowed | 1 + .../amd/granite-ridge/card2/device/device | 1 + .../granite-ridge/card2/device/dma_mask_bits | 1 + .../card2/device/driver_override | 1 + .../amd/granite-ridge/card2/device/enable | 1 + .../card2/device/enforce_isolation | 1 + .../card2/device/fw_version/asd_fw_version | 1 + .../card2/device/fw_version/ce_fw_version | 1 + .../card2/device/fw_version/dmcub_fw_version | 1 + .../card2/device/fw_version/me_fw_version | 1 + .../card2/device/fw_version/mec2_fw_version | 1 + .../card2/device/fw_version/mec_fw_version | 1 + .../card2/device/fw_version/pfp_fw_version | 1 + .../card2/device/fw_version/rlc_fw_version | 1 + .../device/fw_version/rlc_srlc_fw_version | 1 + .../device/fw_version/rlc_srlg_fw_version | 1 + .../device/fw_version/rlc_srls_fw_version | 1 + .../card2/device/fw_version/sdma_fw_version | 1 + .../card2/device/fw_version/smc_fw_version | 1 + .../card2/device/fw_version/vcn_fw_version | 1 + .../granite-ridge/card2/device/gfx_reset_mask | 1 + .../card2/device/gpu_busy_percent | 1 + .../granite-ridge/card2/device/gpu_metrics | Bin 0 -> 120 bytes .../amd/granite-ridge/card2/device/hdcp_srm | Bin 0 -> 48 bytes .../card2/device/hwmon/hwmon6/freq1_input | 1 + .../card2/device/hwmon/hwmon6/freq1_label | 1 + .../card2/device/hwmon/hwmon6/in0_input | 1 + .../card2/device/hwmon/hwmon6/in0_label | 1 + .../card2/device/hwmon/hwmon6/in1_input | 1 + .../card2/device/hwmon/hwmon6/in1_label | 1 + .../card2/device/hwmon/hwmon6/name | 1 + .../card2/device/hwmon/hwmon6/power/control | 1 + .../hwmon/hwmon6/power/runtime_active_time | 1 + .../device/hwmon/hwmon6/power/runtime_status | 1 + .../hwmon/hwmon6/power/runtime_suspended_time | 1 + .../card2/device/hwmon/hwmon6/power1_input | 1 + .../card2/device/hwmon/hwmon6/power1_label | 1 + .../card2/device/hwmon/hwmon6/temp1_input | 1 + .../card2/device/hwmon/hwmon6/temp1_label | 1 + .../card2/device/hwmon/hwmon6/uevent | 0 .../device/ip_discovery/die/0/1/0/base_addr | 5 + .../device/ip_discovery/die/0/1/0/harvest | 1 + .../card2/device/ip_discovery/die/0/1/0/hw_id | 1 + .../card2/device/ip_discovery/die/0/1/0/major | 1 + .../card2/device/ip_discovery/die/0/1/0/minor | 1 + .../ip_discovery/die/0/1/0/num_base_addresses | 1 + .../ip_discovery/die/0/1/0/num_instance | 1 + .../device/ip_discovery/die/0/1/0/revision | 1 + .../device/ip_discovery/die/0/108/0/base_addr | 6 + .../device/ip_discovery/die/0/108/0/harvest | 1 + .../device/ip_discovery/die/0/108/0/hw_id | 1 + .../device/ip_discovery/die/0/108/0/major | 1 + .../device/ip_discovery/die/0/108/0/minor | 1 + .../die/0/108/0/num_base_addresses | 1 + .../ip_discovery/die/0/108/0/num_instance | 1 + .../device/ip_discovery/die/0/108/0/revision | 1 + .../device/ip_discovery/die/0/11/0/base_addr | 3 + .../device/ip_discovery/die/0/11/0/harvest | 1 + .../device/ip_discovery/die/0/11/0/hw_id | 1 + .../device/ip_discovery/die/0/11/0/major | 1 + .../device/ip_discovery/die/0/11/0/minor | 1 + .../die/0/11/0/num_base_addresses | 1 + .../ip_discovery/die/0/11/0/num_instance | 1 + .../device/ip_discovery/die/0/11/0/revision | 1 + .../device/ip_discovery/die/0/12/0/base_addr | 3 + .../device/ip_discovery/die/0/12/0/harvest | 1 + .../device/ip_discovery/die/0/12/0/hw_id | 1 + .../device/ip_discovery/die/0/12/0/major | 1 + .../device/ip_discovery/die/0/12/0/minor | 1 + .../die/0/12/0/num_base_addresses | 1 + .../ip_discovery/die/0/12/0/num_instance | 1 + .../device/ip_discovery/die/0/12/0/revision | 1 + .../device/ip_discovery/die/0/14/0/base_addr | 2 + .../device/ip_discovery/die/0/14/0/harvest | 1 + .../device/ip_discovery/die/0/14/0/hw_id | 1 + .../device/ip_discovery/die/0/14/0/major | 1 + .../device/ip_discovery/die/0/14/0/minor | 1 + .../die/0/14/0/num_base_addresses | 1 + .../ip_discovery/die/0/14/0/num_instance | 1 + .../device/ip_discovery/die/0/14/0/revision | 1 + .../device/ip_discovery/die/0/150/0/base_addr | 2 + .../device/ip_discovery/die/0/150/0/harvest | 1 + .../device/ip_discovery/die/0/150/0/hw_id | 1 + .../device/ip_discovery/die/0/150/0/major | 1 + .../device/ip_discovery/die/0/150/0/minor | 1 + .../die/0/150/0/num_base_addresses | 1 + .../ip_discovery/die/0/150/0/num_instance | 1 + .../device/ip_discovery/die/0/150/0/revision | 1 + .../device/ip_discovery/die/0/150/1/base_addr | 2 + .../device/ip_discovery/die/0/150/1/harvest | 1 + .../device/ip_discovery/die/0/150/1/hw_id | 1 + .../device/ip_discovery/die/0/150/1/major | 1 + .../device/ip_discovery/die/0/150/1/minor | 1 + .../die/0/150/1/num_base_addresses | 1 + .../ip_discovery/die/0/150/1/num_instance | 1 + .../device/ip_discovery/die/0/150/1/revision | 1 + .../device/ip_discovery/die/0/2/0/base_addr | 5 + .../device/ip_discovery/die/0/2/0/harvest | 1 + .../card2/device/ip_discovery/die/0/2/0/hw_id | 1 + .../card2/device/ip_discovery/die/0/2/0/major | 1 + .../card2/device/ip_discovery/die/0/2/0/minor | 1 + .../ip_discovery/die/0/2/0/num_base_addresses | 1 + .../ip_discovery/die/0/2/0/num_instance | 1 + .../device/ip_discovery/die/0/2/0/revision | 1 + .../device/ip_discovery/die/0/24/0/base_addr | 3 + .../device/ip_discovery/die/0/24/0/harvest | 1 + .../device/ip_discovery/die/0/24/0/hw_id | 1 + .../device/ip_discovery/die/0/24/0/major | 1 + .../device/ip_discovery/die/0/24/0/minor | 1 + .../die/0/24/0/num_base_addresses | 1 + .../ip_discovery/die/0/24/0/num_instance | 1 + .../device/ip_discovery/die/0/24/0/revision | 1 + .../device/ip_discovery/die/0/255/0/base_addr | 5 + .../device/ip_discovery/die/0/255/0/harvest | 1 + .../device/ip_discovery/die/0/255/0/hw_id | 1 + .../device/ip_discovery/die/0/255/0/major | 1 + .../device/ip_discovery/die/0/255/0/minor | 1 + .../die/0/255/0/num_base_addresses | 1 + .../ip_discovery/die/0/255/0/num_instance | 1 + .../device/ip_discovery/die/0/255/0/revision | 1 + .../device/ip_discovery/die/0/271/0/base_addr | 5 + .../device/ip_discovery/die/0/271/0/harvest | 1 + .../device/ip_discovery/die/0/271/0/hw_id | 1 + .../device/ip_discovery/die/0/271/0/major | 1 + .../device/ip_discovery/die/0/271/0/minor | 1 + .../die/0/271/0/num_base_addresses | 1 + .../ip_discovery/die/0/271/0/num_instance | 1 + .../device/ip_discovery/die/0/271/0/revision | 1 + .../device/ip_discovery/die/0/3/0/base_addr | 2 + .../device/ip_discovery/die/0/3/0/harvest | 1 + .../card2/device/ip_discovery/die/0/3/0/hw_id | 1 + .../card2/device/ip_discovery/die/0/3/0/major | 1 + .../card2/device/ip_discovery/die/0/3/0/minor | 1 + .../ip_discovery/die/0/3/0/num_base_addresses | 1 + .../ip_discovery/die/0/3/0/num_instance | 1 + .../device/ip_discovery/die/0/3/0/revision | 1 + .../device/ip_discovery/die/0/34/0/base_addr | 3 + .../device/ip_discovery/die/0/34/0/harvest | 1 + .../device/ip_discovery/die/0/34/0/hw_id | 1 + .../device/ip_discovery/die/0/34/0/major | 1 + .../device/ip_discovery/die/0/34/0/minor | 1 + .../die/0/34/0/num_base_addresses | 1 + .../ip_discovery/die/0/34/0/num_instance | 1 + .../device/ip_discovery/die/0/34/0/revision | 1 + .../device/ip_discovery/die/0/35/0/base_addr | 3 + .../device/ip_discovery/die/0/35/0/harvest | 1 + .../device/ip_discovery/die/0/35/0/hw_id | 1 + .../device/ip_discovery/die/0/35/0/major | 1 + .../device/ip_discovery/die/0/35/0/minor | 1 + .../die/0/35/0/num_base_addresses | 1 + .../ip_discovery/die/0/35/0/num_instance | 1 + .../device/ip_discovery/die/0/35/0/revision | 1 + .../device/ip_discovery/die/0/4/0/base_addr | 6 + .../device/ip_discovery/die/0/4/0/harvest | 1 + .../card2/device/ip_discovery/die/0/4/0/hw_id | 1 + .../card2/device/ip_discovery/die/0/4/0/major | 1 + .../card2/device/ip_discovery/die/0/4/0/minor | 1 + .../ip_discovery/die/0/4/0/num_base_addresses | 1 + .../ip_discovery/die/0/4/0/num_instance | 1 + .../device/ip_discovery/die/0/4/0/revision | 1 + .../device/ip_discovery/die/0/40/0/base_addr | 2 + .../device/ip_discovery/die/0/40/0/harvest | 1 + .../device/ip_discovery/die/0/40/0/hw_id | 1 + .../device/ip_discovery/die/0/40/0/major | 1 + .../device/ip_discovery/die/0/40/0/minor | 1 + .../die/0/40/0/num_base_addresses | 1 + .../ip_discovery/die/0/40/0/num_instance | 1 + .../device/ip_discovery/die/0/40/0/revision | 1 + .../device/ip_discovery/die/0/41/0/base_addr | 2 + .../device/ip_discovery/die/0/41/0/harvest | 1 + .../device/ip_discovery/die/0/41/0/hw_id | 1 + .../device/ip_discovery/die/0/41/0/major | 1 + .../device/ip_discovery/die/0/41/0/minor | 1 + .../die/0/41/0/num_base_addresses | 1 + .../ip_discovery/die/0/41/0/num_instance | 1 + .../device/ip_discovery/die/0/41/0/revision | 1 + .../device/ip_discovery/die/0/42/0/base_addr | 3 + .../device/ip_discovery/die/0/42/0/harvest | 1 + .../device/ip_discovery/die/0/42/0/hw_id | 1 + .../device/ip_discovery/die/0/42/0/major | 1 + .../device/ip_discovery/die/0/42/0/minor | 1 + .../die/0/42/0/num_base_addresses | 1 + .../ip_discovery/die/0/42/0/num_instance | 1 + .../device/ip_discovery/die/0/42/0/revision | 1 + .../device/ip_discovery/die/0/45/0/base_addr | 6 + .../device/ip_discovery/die/0/45/0/harvest | 1 + .../device/ip_discovery/die/0/45/0/hw_id | 1 + .../device/ip_discovery/die/0/45/0/major | 1 + .../device/ip_discovery/die/0/45/0/minor | 1 + .../die/0/45/0/num_base_addresses | 1 + .../ip_discovery/die/0/45/0/num_instance | 1 + .../device/ip_discovery/die/0/45/0/revision | 1 + .../device/ip_discovery/die/0/46/0/base_addr | 5 + .../device/ip_discovery/die/0/46/0/harvest | 1 + .../device/ip_discovery/die/0/46/0/hw_id | 1 + .../device/ip_discovery/die/0/46/0/major | 1 + .../device/ip_discovery/die/0/46/0/minor | 1 + .../die/0/46/0/num_base_addresses | 1 + .../ip_discovery/die/0/46/0/num_instance | 1 + .../device/ip_discovery/die/0/46/0/revision | 1 + .../device/ip_discovery/die/0/48/0/base_addr | 4 + .../device/ip_discovery/die/0/48/0/harvest | 1 + .../device/ip_discovery/die/0/48/0/hw_id | 1 + .../device/ip_discovery/die/0/48/0/major | 1 + .../device/ip_discovery/die/0/48/0/minor | 1 + .../die/0/48/0/num_base_addresses | 1 + .../ip_discovery/die/0/48/0/num_instance | 1 + .../device/ip_discovery/die/0/48/0/revision | 1 + .../device/ip_discovery/die/0/5/0/base_addr | 2 + .../device/ip_discovery/die/0/5/0/harvest | 1 + .../card2/device/ip_discovery/die/0/5/0/hw_id | 1 + .../card2/device/ip_discovery/die/0/5/0/major | 1 + .../card2/device/ip_discovery/die/0/5/0/minor | 1 + .../ip_discovery/die/0/5/0/num_base_addresses | 1 + .../ip_discovery/die/0/5/0/num_instance | 1 + .../device/ip_discovery/die/0/5/0/revision | 1 + .../device/ip_discovery/die/0/6/0/base_addr | 2 + .../device/ip_discovery/die/0/6/0/harvest | 1 + .../card2/device/ip_discovery/die/0/6/0/hw_id | 1 + .../card2/device/ip_discovery/die/0/6/0/major | 1 + .../card2/device/ip_discovery/die/0/6/0/minor | 1 + .../ip_discovery/die/0/6/0/num_base_addresses | 1 + .../ip_discovery/die/0/6/0/num_instance | 1 + .../device/ip_discovery/die/0/6/0/revision | 1 + .../device/ip_discovery/die/0/6/1/base_addr | 2 + .../device/ip_discovery/die/0/6/1/harvest | 1 + .../card2/device/ip_discovery/die/0/6/1/hw_id | 1 + .../card2/device/ip_discovery/die/0/6/1/major | 1 + .../card2/device/ip_discovery/die/0/6/1/minor | 1 + .../ip_discovery/die/0/6/1/num_base_addresses | 1 + .../ip_discovery/die/0/6/1/num_instance | 1 + .../device/ip_discovery/die/0/6/1/revision | 1 + .../device/ip_discovery/die/0/6/2/base_addr | 2 + .../device/ip_discovery/die/0/6/2/harvest | 1 + .../card2/device/ip_discovery/die/0/6/2/hw_id | 1 + .../card2/device/ip_discovery/die/0/6/2/major | 1 + .../card2/device/ip_discovery/die/0/6/2/minor | 1 + .../ip_discovery/die/0/6/2/num_base_addresses | 1 + .../ip_discovery/die/0/6/2/num_instance | 1 + .../device/ip_discovery/die/0/6/2/revision | 1 + .../device/ip_discovery/die/0/6/3/base_addr | 2 + .../device/ip_discovery/die/0/6/3/harvest | 1 + .../card2/device/ip_discovery/die/0/6/3/hw_id | 1 + .../card2/device/ip_discovery/die/0/6/3/major | 1 + .../card2/device/ip_discovery/die/0/6/3/minor | 1 + .../ip_discovery/die/0/6/3/num_base_addresses | 1 + .../ip_discovery/die/0/6/3/num_instance | 1 + .../device/ip_discovery/die/0/6/3/revision | 1 + .../device/ip_discovery/die/0/6/4/base_addr | 2 + .../device/ip_discovery/die/0/6/4/harvest | 1 + .../card2/device/ip_discovery/die/0/6/4/hw_id | 1 + .../card2/device/ip_discovery/die/0/6/4/major | 1 + .../card2/device/ip_discovery/die/0/6/4/minor | 1 + .../ip_discovery/die/0/6/4/num_base_addresses | 1 + .../ip_discovery/die/0/6/4/num_instance | 1 + .../device/ip_discovery/die/0/6/4/revision | 1 + .../device/ip_discovery/die/0/6/5/base_addr | 2 + .../device/ip_discovery/die/0/6/5/harvest | 1 + .../card2/device/ip_discovery/die/0/6/5/hw_id | 1 + .../card2/device/ip_discovery/die/0/6/5/major | 1 + .../card2/device/ip_discovery/die/0/6/5/minor | 1 + .../ip_discovery/die/0/6/5/num_base_addresses | 1 + .../ip_discovery/die/0/6/5/num_instance | 1 + .../device/ip_discovery/die/0/6/5/revision | 1 + .../device/ip_discovery/die/0/70/0/base_addr | 6 + .../device/ip_discovery/die/0/70/0/harvest | 1 + .../device/ip_discovery/die/0/70/0/hw_id | 1 + .../device/ip_discovery/die/0/70/0/major | 1 + .../device/ip_discovery/die/0/70/0/minor | 1 + .../die/0/70/0/num_base_addresses | 1 + .../ip_discovery/die/0/70/0/num_instance | 1 + .../device/ip_discovery/die/0/70/0/revision | 1 + .../device/ip_discovery/die/0/70/1/base_addr | 6 + .../device/ip_discovery/die/0/70/1/harvest | 1 + .../device/ip_discovery/die/0/70/1/hw_id | 1 + .../device/ip_discovery/die/0/70/1/major | 1 + .../device/ip_discovery/die/0/70/1/minor | 1 + .../die/0/70/1/num_base_addresses | 1 + .../ip_discovery/die/0/70/1/num_instance | 1 + .../device/ip_discovery/die/0/70/1/revision | 1 + .../card2/device/ip_discovery/die/0/num_ips | 1 + .../amd/granite-ridge/card2/device/irq | 1 + .../card2/device/jpeg_reset_mask | 1 + .../granite-ridge/card2/device/link/l0s_aspm | 1 + .../granite-ridge/card2/device/link/l1_aspm | 1 + .../granite-ridge/card2/device/local_cpulist | 1 + .../amd/granite-ridge/card2/device/local_cpus | 1 + .../granite-ridge/card2/device/max_link_speed | 1 + .../granite-ridge/card2/device/max_link_width | 1 + .../card2/device/mem_info_gtt_total | 1 + .../card2/device/mem_info_gtt_used | 1 + .../card2/device/mem_info_preempt_used | 1 + .../card2/device/mem_info_vis_vram_total | 1 + .../card2/device/mem_info_vis_vram_used | 1 + .../card2/device/mem_info_vram_total | 1 + .../card2/device/mem_info_vram_used | 1 + .../amd/granite-ridge/card2/device/modalias | 1 + .../amd/granite-ridge/card2/device/msi_bus | 1 + .../amd/granite-ridge/card2/device/numa_node | 1 + .../granite-ridge/card2/device/power/control | 1 + .../card2/device/power/runtime_active_time | 1 + .../card2/device/power/runtime_status | 1 + .../card2/device/power/runtime_suspended_time | 1 + .../granite-ridge/card2/device/power/wakeup | 1 + .../card2/device/power/wakeup_abort_count | 1 + .../card2/device/power/wakeup_active | 1 + .../card2/device/power/wakeup_active_count | 1 + .../card2/device/power/wakeup_count | 1 + .../card2/device/power/wakeup_expire_count | 1 + .../card2/device/power/wakeup_last_time_ms | 1 + .../card2/device/power/wakeup_max_time_ms | 1 + .../card2/device/power/wakeup_total_time_ms | 1 + .../device/power_dpm_force_performance_level | 1 + .../card2/device/power_dpm_state | 1 + .../granite-ridge/card2/device/power_state | 1 + .../granite-ridge/card2/device/pp_cur_state | 1 + .../granite-ridge/card2/device/pp_dpm_dcefclk | 1 + .../granite-ridge/card2/device/pp_dpm_dclk | 2 + .../granite-ridge/card2/device/pp_dpm_fclk | 1 + .../granite-ridge/card2/device/pp_dpm_mclk | 1 + .../granite-ridge/card2/device/pp_dpm_pcie | 1 + .../granite-ridge/card2/device/pp_dpm_sclk | 3 + .../granite-ridge/card2/device/pp_dpm_socclk | 2 + .../granite-ridge/card2/device/pp_dpm_vclk | 2 + .../granite-ridge/card2/device/pp_force_state | 1 + .../granite-ridge/card2/device/pp_num_states | 2 + .../card2/device/pp_od_clk_voltage | 5 + .../amd/granite-ridge/card2/device/revision | 1 + .../card2/device/sdma_reset_mask | 1 + .../card2/device/subsystem_device | 1 + .../card2/device/subsystem_vendor | 1 + .../card2/device/thermal_throttling_logging | 1 + .../amd/granite-ridge/card2/device/uevent | 6 + .../granite-ridge/card2/device/vbios_build | 1 + .../granite-ridge/card2/device/vbios_version | 1 + .../card2/device/vcn_busy_percent | 1 + .../granite-ridge/card2/device/vcn_reset_mask | 1 + .../amd/granite-ridge/card2/device/vendor | 1 + .../card2/device/wakeup/wakeup49/active_count | 1 + .../device/wakeup/wakeup49/active_time_ms | 1 + .../card2/device/wakeup/wakeup49/event_count | 1 + .../card2/device/wakeup/wakeup49/expire_count | 1 + .../device/wakeup/wakeup49/last_change_ms | 1 + .../card2/device/wakeup/wakeup49/max_time_ms | 1 + .../card2/device/wakeup/wakeup49/name | 1 + .../wakeup/wakeup49/prevent_suspend_time_ms | 1 + .../card2/device/wakeup/wakeup49/relax_count | 1 + .../device/wakeup/wakeup49/total_time_ms | 1 + .../card2/device/wakeup/wakeup49/uevent | 0 .../card2/device/wakeup/wakeup49/wakeup_count | 1 + .../snapshots/amd/granite-ridge/card2/uevent | 4 + tests/snapshots/amd/granite-ridge/info.json | 1321 +++++++++++++++++ 367 files changed, 2289 insertions(+), 132 deletions(-) create mode 100644 lact-daemon/src/server/gpu_controller/amd/drm.rs create mode 100644 lact-daemon/src/server/gpu_controller/amd/drm/amdgpu.rs create mode 100644 lact-daemon/src/server/gpu_controller/amd/drm/mock.rs create mode 100644 lact-daemon/src/tests/snapshots/lact_daemon__tests__amd__granite-ridge.snap create mode 100644 tests/snapshots/amd/granite-ridge/card2/dev create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ari_enabled create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/boot_vga create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/broken_parity_status create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/class create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/compute_reset_mask create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/config create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/consistent_dma_mask_bits create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/current_link_speed create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/current_link_width create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/d3cold_allowed create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/device create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/dma_mask_bits create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/driver_override create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/enable create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/enforce_isolation create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/fw_version/asd_fw_version create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/fw_version/ce_fw_version create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/fw_version/dmcub_fw_version create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/fw_version/me_fw_version create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/fw_version/mec2_fw_version create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/fw_version/mec_fw_version create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/fw_version/pfp_fw_version create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/fw_version/rlc_fw_version create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/fw_version/rlc_srlc_fw_version create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/fw_version/rlc_srlg_fw_version create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/fw_version/rlc_srls_fw_version create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/fw_version/sdma_fw_version create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/fw_version/smc_fw_version create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/fw_version/vcn_fw_version create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/gfx_reset_mask create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/gpu_busy_percent create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/gpu_metrics create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/hdcp_srm create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/hwmon/hwmon6/freq1_input create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/hwmon/hwmon6/freq1_label create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/hwmon/hwmon6/in0_input create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/hwmon/hwmon6/in0_label create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/hwmon/hwmon6/in1_input create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/hwmon/hwmon6/in1_label create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/hwmon/hwmon6/name create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/hwmon/hwmon6/power/control create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/hwmon/hwmon6/power/runtime_active_time create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/hwmon/hwmon6/power/runtime_status create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/hwmon/hwmon6/power/runtime_suspended_time create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/hwmon/hwmon6/power1_input create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/hwmon/hwmon6/power1_label create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/hwmon/hwmon6/temp1_input create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/hwmon/hwmon6/temp1_label create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/hwmon/hwmon6/uevent create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/1/0/base_addr create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/1/0/harvest create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/1/0/hw_id create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/1/0/major create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/1/0/minor create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/1/0/num_base_addresses create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/1/0/num_instance create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/1/0/revision create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/108/0/base_addr create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/108/0/harvest create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/108/0/hw_id create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/108/0/major create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/108/0/minor create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/108/0/num_base_addresses create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/108/0/num_instance create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/108/0/revision create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/11/0/base_addr create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/11/0/harvest create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/11/0/hw_id create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/11/0/major create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/11/0/minor create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/11/0/num_base_addresses create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/11/0/num_instance create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/11/0/revision create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/12/0/base_addr create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/12/0/harvest create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/12/0/hw_id create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/12/0/major create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/12/0/minor create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/12/0/num_base_addresses create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/12/0/num_instance create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/12/0/revision create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/14/0/base_addr create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/14/0/harvest create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/14/0/hw_id create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/14/0/major create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/14/0/minor create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/14/0/num_base_addresses create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/14/0/num_instance create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/14/0/revision create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/150/0/base_addr create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/150/0/harvest create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/150/0/hw_id create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/150/0/major create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/150/0/minor create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/150/0/num_base_addresses create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/150/0/num_instance create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/150/0/revision create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/150/1/base_addr create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/150/1/harvest create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/150/1/hw_id create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/150/1/major create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/150/1/minor create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/150/1/num_base_addresses create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/150/1/num_instance create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/150/1/revision create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/2/0/base_addr create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/2/0/harvest create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/2/0/hw_id create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/2/0/major create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/2/0/minor create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/2/0/num_base_addresses create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/2/0/num_instance create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/2/0/revision create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/24/0/base_addr create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/24/0/harvest create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/24/0/hw_id create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/24/0/major create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/24/0/minor create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/24/0/num_base_addresses create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/24/0/num_instance create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/24/0/revision create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/255/0/base_addr create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/255/0/harvest create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/255/0/hw_id create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/255/0/major create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/255/0/minor create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/255/0/num_base_addresses create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/255/0/num_instance create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/255/0/revision create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/271/0/base_addr create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/271/0/harvest create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/271/0/hw_id create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/271/0/major create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/271/0/minor create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/271/0/num_base_addresses create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/271/0/num_instance create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/271/0/revision create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/3/0/base_addr create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/3/0/harvest create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/3/0/hw_id create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/3/0/major create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/3/0/minor create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/3/0/num_base_addresses create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/3/0/num_instance create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/3/0/revision create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/34/0/base_addr create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/34/0/harvest create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/34/0/hw_id create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/34/0/major create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/34/0/minor create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/34/0/num_base_addresses create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/34/0/num_instance create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/34/0/revision create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/35/0/base_addr create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/35/0/harvest create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/35/0/hw_id create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/35/0/major create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/35/0/minor create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/35/0/num_base_addresses create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/35/0/num_instance create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/35/0/revision create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/4/0/base_addr create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/4/0/harvest create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/4/0/hw_id create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/4/0/major create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/4/0/minor create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/4/0/num_base_addresses create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/4/0/num_instance create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/4/0/revision create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/40/0/base_addr create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/40/0/harvest create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/40/0/hw_id create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/40/0/major create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/40/0/minor create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/40/0/num_base_addresses create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/40/0/num_instance create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/40/0/revision create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/41/0/base_addr create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/41/0/harvest create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/41/0/hw_id create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/41/0/major create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/41/0/minor create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/41/0/num_base_addresses create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/41/0/num_instance create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/41/0/revision create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/42/0/base_addr create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/42/0/harvest create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/42/0/hw_id create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/42/0/major create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/42/0/minor create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/42/0/num_base_addresses create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/42/0/num_instance create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/42/0/revision create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/45/0/base_addr create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/45/0/harvest create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/45/0/hw_id create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/45/0/major create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/45/0/minor create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/45/0/num_base_addresses create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/45/0/num_instance create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/45/0/revision create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/46/0/base_addr create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/46/0/harvest create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/46/0/hw_id create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/46/0/major create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/46/0/minor create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/46/0/num_base_addresses create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/46/0/num_instance create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/46/0/revision create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/48/0/base_addr create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/48/0/harvest create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/48/0/hw_id create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/48/0/major create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/48/0/minor create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/48/0/num_base_addresses create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/48/0/num_instance create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/48/0/revision create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/5/0/base_addr create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/5/0/harvest create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/5/0/hw_id create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/5/0/major create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/5/0/minor create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/5/0/num_base_addresses create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/5/0/num_instance create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/5/0/revision create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/6/0/base_addr create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/6/0/harvest create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/6/0/hw_id create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/6/0/major create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/6/0/minor create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/6/0/num_base_addresses create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/6/0/num_instance create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/6/0/revision create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/6/1/base_addr create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/6/1/harvest create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/6/1/hw_id create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/6/1/major create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/6/1/minor create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/6/1/num_base_addresses create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/6/1/num_instance create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/6/1/revision create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/6/2/base_addr create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/6/2/harvest create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/6/2/hw_id create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/6/2/major create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/6/2/minor create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/6/2/num_base_addresses create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/6/2/num_instance create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/6/2/revision create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/6/3/base_addr create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/6/3/harvest create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/6/3/hw_id create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/6/3/major create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/6/3/minor create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/6/3/num_base_addresses create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/6/3/num_instance create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/6/3/revision create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/6/4/base_addr create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/6/4/harvest create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/6/4/hw_id create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/6/4/major create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/6/4/minor create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/6/4/num_base_addresses create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/6/4/num_instance create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/6/4/revision create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/6/5/base_addr create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/6/5/harvest create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/6/5/hw_id create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/6/5/major create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/6/5/minor create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/6/5/num_base_addresses create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/6/5/num_instance create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/6/5/revision create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/70/0/base_addr create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/70/0/harvest create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/70/0/hw_id create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/70/0/major create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/70/0/minor create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/70/0/num_base_addresses create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/70/0/num_instance create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/70/0/revision create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/70/1/base_addr create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/70/1/harvest create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/70/1/hw_id create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/70/1/major create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/70/1/minor create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/70/1/num_base_addresses create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/70/1/num_instance create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/70/1/revision create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/ip_discovery/die/0/num_ips create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/irq create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/jpeg_reset_mask create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/link/l0s_aspm create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/link/l1_aspm create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/local_cpulist create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/local_cpus create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/max_link_speed create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/max_link_width create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/mem_info_gtt_total create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/mem_info_gtt_used create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/mem_info_preempt_used create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/mem_info_vis_vram_total create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/mem_info_vis_vram_used create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/mem_info_vram_total create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/mem_info_vram_used create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/modalias create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/msi_bus create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/numa_node create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/power/control create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/power/runtime_active_time create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/power/runtime_status create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/power/runtime_suspended_time create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/power/wakeup create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/power/wakeup_abort_count create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/power/wakeup_active create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/power/wakeup_active_count create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/power/wakeup_count create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/power/wakeup_expire_count create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/power/wakeup_last_time_ms create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/power/wakeup_max_time_ms create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/power/wakeup_total_time_ms create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/power_dpm_force_performance_level create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/power_dpm_state create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/power_state create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/pp_cur_state create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/pp_dpm_dcefclk create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/pp_dpm_dclk create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/pp_dpm_fclk create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/pp_dpm_mclk create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/pp_dpm_pcie create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/pp_dpm_sclk create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/pp_dpm_socclk create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/pp_dpm_vclk create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/pp_force_state create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/pp_num_states create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/pp_od_clk_voltage create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/revision create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/sdma_reset_mask create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/subsystem_device create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/subsystem_vendor create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/thermal_throttling_logging create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/uevent create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/vbios_build create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/vbios_version create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/vcn_busy_percent create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/vcn_reset_mask create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/vendor create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/wakeup/wakeup49/active_count create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/wakeup/wakeup49/active_time_ms create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/wakeup/wakeup49/event_count create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/wakeup/wakeup49/expire_count create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/wakeup/wakeup49/last_change_ms create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/wakeup/wakeup49/max_time_ms create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/wakeup/wakeup49/name create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/wakeup/wakeup49/prevent_suspend_time_ms create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/wakeup/wakeup49/relax_count create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/wakeup/wakeup49/total_time_ms create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/wakeup/wakeup49/uevent create mode 100644 tests/snapshots/amd/granite-ridge/card2/device/wakeup/wakeup49/wakeup_count create mode 100644 tests/snapshots/amd/granite-ridge/card2/uevent create mode 100644 tests/snapshots/amd/granite-ridge/info.json diff --git a/lact-daemon/src/server/gpu_controller/amd.rs b/lact-daemon/src/server/gpu_controller/amd.rs index 16929e90..9777e6a5 100644 --- a/lact-daemon/src/server/gpu_controller/amd.rs +++ b/lact-daemon/src/server/gpu_controller/amd.rs @@ -1,3 +1,5 @@ +mod drm; + use super::{CommonControllerInfo, FanControlHandle, GpuController, VENDOR_AMD}; use crate::server::gpu_controller::common::{ fan_control::FanCurveExt, @@ -15,20 +17,22 @@ use amdgpu_sysfs::{ sysfs::SysFS, }; use anyhow::{Context, anyhow, bail}; +#[cfg(feature = "mock")] +use drm::mock::MockDrmProvider; +use drm::{DrmProvider, amdgpu::AmdGpuDrmProvider}; use futures::{FutureExt, future::LocalBoxFuture}; use indexmap::IndexMap; use lact_schema::{ - ActivePowerStates, AmdCacheInstance, AmdIpInfo, CacheInfo, CacheType, ClocksInfo, - ClockspeedStats, DeviceApiInfo, DeviceFlag, DeviceInfo, DeviceStats, DeviceType, DrmInfo, - FanControlMode, FanStats, IntelDrmInfo, LinkInfo, NvidiaThermalInfo, PmfwInfo, PowerState, - PowerStates, PowerStats, ProcessList, ProcessUtilizationType, RopInfo, TemperatureEntry, - VoltageStats, VramStats, + ActivePowerStates, AmdCacheInstance, CacheInfo, CacheType, ClocksInfo, ClockspeedStats, + DeviceApiInfo, DeviceFlag, DeviceInfo, DeviceStats, DeviceType, DrmInfo, FanControlMode, + FanStats, LinkInfo, NvidiaThermalInfo, PmfwInfo, PowerState, PowerStates, PowerStats, + ProcessList, ProcessUtilizationType, TemperatureEntry, VoltageStats, VramStats, config::{ClocksConfiguration, FanControlSettings, FanCurve, GpuConfig}, }; #[cfg(feature = "display-info")] use lact_schema::{DisplayConnector, DisplaysInfo}; -use libdrm_amdgpu_sys::AMDGPU::{GpuMetrics, HW_IP::HW_IP_TYPE, ThrottlerBit, ThrottlerType}; -use libdrm_amdgpu_sys::{AMDGPU::SENSOR_INFO::SENSOR_TYPE, LibDrmAmdgpu, PCI}; +use libdrm_amdgpu_sys::AMDGPU::{GpuMetrics, MetricsInfo, ThrottlerBit, ThrottlerType}; +use libdrm_amdgpu_sys::{LibDrmAmdgpu, PCI}; use std::{ cell::RefCell, cmp, @@ -41,11 +45,6 @@ use std::{collections::BTreeMap, fs, time::Instant}; use tokio::{select, sync::Notify, time::sleep}; use tracing::{debug, error, info, trace, warn}; -use { - lact_schema::DrmMemoryInfo, - libdrm_amdgpu_sys::AMDGPU::{DeviceHandle as DrmHandle, GPU_INFO, MetricsInfo}, -}; - /// RDNA3 - minimum family with PMFW const AMDGPU_FAMILY_GC_11_0_0: u32 = 145; @@ -66,7 +65,6 @@ const REQUIRE_MANUAL_DEVICE_IDS: [&str; 19] = [ // https://github.com/torvalds/linux/blob/v7.2/drivers/gpu/drm/amd/pm/swsmu/smu14/smu_v14_0.c#L1809 "1114", "150E", "1586", "1902", // Strix, Krackan ]; -const AMDGPU_IDS_FLAGS_FUSION: u64 = 0x1; const HSA_CACHE_TYPE_DATA: u32 = 0x0000_0001; const HSA_CACHE_TYPE_INSTRUCTION: u32 = 0x0000_0002; const HSA_CACHE_TYPE_CPU: u32 = 0x0000_0004; @@ -81,22 +79,9 @@ const DRM_ENGINES: &[(&str, ProcessUtilizationType)] = &[ ("enc_1", ProcessUtilizationType::Encode), ]; -const ALL_HW_IP: &[HW_IP_TYPE] = &[ - HW_IP_TYPE::GFX, - HW_IP_TYPE::COMPUTE, - HW_IP_TYPE::DMA, - HW_IP_TYPE::UVD, - HW_IP_TYPE::VCE, - HW_IP_TYPE::UVD_ENC, - HW_IP_TYPE::VCN_DEC, - HW_IP_TYPE::VCN_ENC, - HW_IP_TYPE::VCN_JPEG, - HW_IP_TYPE::VPE, -]; - pub struct AmdGpuController { handle: GpuHandle, - drm_handle: Option, + drm_handle: Option>, common: CommonControllerInfo, fan_control_handle: RefCell>, last_drm_util: RefCell>, @@ -111,16 +96,24 @@ impl AmdGpuController { let handle = GpuHandle::new_from_path(common.sysfs_path.clone()) .map_err(|error| anyhow!("failed to initialize gpu handle: {error}"))?; - #[allow(unused_mut)] - let mut drm_handle = None; - #[cfg(not(test))] - if let Some(libdrm_amdgpu) = libdrm_amdgpu - && handle.get_driver() == "amdgpu" - { - drm_handle = Some( - get_drm_handle(&common, libdrm_amdgpu).context("Could not get AMD DRM handle")?, - ); - } + #[allow(unused_labels)] + let drm_handle: Option> = 'drm: { + #[cfg(feature = "mock")] + if let Some(mock) = MockDrmProvider::new(&common.sysfs_path) { + break 'drm Some(Box::new(mock) as Box); + } + + if let Some(libdrm_amdgpu) = libdrm_amdgpu + && handle.get_driver() == "amdgpu" + && !cfg!(test) + { + let handle = AmdGpuDrmProvider::new(&common, libdrm_amdgpu) + .context("Could not get AMD DRM handle")?; + Some(Box::new(handle)) + } else { + None + } + }; Ok(Self { handle, @@ -526,8 +519,7 @@ impl AmdGpuController { let vram_clockspeed = self .drm_handle .as_ref() - .and_then(|handle| handle.sensor_info(SENSOR_TYPE::GFX_MCLK).ok()) - .map(u64::from) + .and_then(|handle| handle.get_vram_clock().ok()) .or_else(|| self.hw_mon_and_then(HwMon::get_vram_clockspeed)); let mut sensors = IndexMap::new(); @@ -577,8 +569,6 @@ impl AmdGpuController { } fn get_drm_info(&self) -> Option { - use libdrm_amdgpu_sys::AMDGPU::VRAM_TYPE; - let cache_info = self .kfd_node_path() .inspect(|path| debug!("found KFD node path at '{}'", path.display())) @@ -595,64 +585,8 @@ impl AmdGpuController { trace!("Reading DRM info"); let drm_handle = self.drm_handle.as_ref(); - let drm_memory_info = - drm_handle - .and_then(|handle| handle.memory_info().ok()) - .map(|memory_info| DrmMemoryInfo { - resizeable_bar: Some(memory_info.check_resizable_bar()), - cpu_accessible_used: memory_info.cpu_accessible_vram.heap_usage, - cpu_accessible_total: memory_info.cpu_accessible_vram.total_heap_size, - }); - match drm_handle { - Some(handle) => handle.device_info().ok().map(|drm_info| DrmInfo { - device_name: drm_info.find_device_name(), - pci_revision_id: Some(drm_info.pci_rev_id()), - family_name: Some(drm_info.get_family_name().to_string()), - family_id: Some(drm_info.family_id()), - asic_name: Some(drm_info.get_asic_name().to_string()), - chip_class: Some(drm_info.get_chip_class().to_string()), - compute_units: Some(drm_info.cu_active_number), - isa: drm_info - .get_gfx_target_version() - .map(|version| version.to_string()), - streaming_multiprocessors: None, - cuda_cores: None, - vram_type: Some(drm_info.get_vram_type().to_string()), - vram_vendor: self.handle.get_vram_vendor().ok(), - vram_clock_ratio: match drm_info.get_vram_type() { - VRAM_TYPE::GDDR6 => 2.0, - _ => 1.0, - }, - amd_ip_info: ALL_HW_IP - .iter() - .filter_map(|ip_type| { - let ip_info = handle.get_hw_ip_info(*ip_type).ok()?; - - Some(AmdIpInfo { - ip_type: ip_info.ip_type.to_string(), - version_major: ip_info.info.hw_ip_version_major, - version_minor: ip_info.info.hw_ip_version_minor, - queues: ip_info.info.num_queues(), - count: ip_info.count, - }) - }) - .collect(), - vram_bit_width: Some(drm_info.vram_bit_width), - vram_max_bw: Some(drm_info.peak_memory_bw_gb().to_string()), - cache_info, - memory_info: drm_memory_info, - rop_info: Some(RopInfo { - unit_count: drm_info.rb_pipes(), - operations_factor: if drm_info.get_asic_name().rbplus_allowed() { - 8 - } else { - 4 - }, - operations_count: drm_info.calc_rop_count(), - }), - intel: IntelDrmInfo::default(), - }), + Some(drm_handle) => drm_handle.get_drm_info(&self.handle, cache_info), None => Some(DrmInfo { cache_info, vram_clock_ratio: 1.0, @@ -728,10 +662,13 @@ impl AmdGpuController { #[cfg(not(test))] fn kfd_node_path(&self) -> Option { - self.drm_handle - .as_ref() - .and_then(|handle| handle.get_pci_bus_info().ok()) - .and_then(|bus_info| bus_info.get_drm_render_path().ok()) + self.common + .get_drm_render() + .ok() + // self.drm_handle + // .as_ref() + // .and_then(|handle| handle.get_pci_bus_info().ok()) + // .and_then(|bus_info| bus_info.get_drm_render_path().ok()) .and_then(|path| { path.file_name() .and_then(|name| name.to_str()) @@ -778,14 +715,8 @@ impl GpuController for AmdGpuController { fn device_type(&self) -> DeviceType { self.drm_handle .as_ref() - .and_then(|drm| drm.device_info().ok()) - .map_or(DeviceType::Dedicated, |info| { - if (info.ids_flags & AMDGPU_IDS_FLAGS_FUSION) > 0 { - DeviceType::Integrated - } else { - DeviceType::Dedicated - } - }) + .and_then(|drm| drm.get_device_type()) + .unwrap_or(DeviceType::Dedicated) } fn get_info( @@ -850,8 +781,7 @@ impl GpuController for AmdGpuController { fn friendly_name(&self) -> Option { self.drm_handle .as_ref() - .and_then(|handle| handle.device_info().ok()) - .and_then(|info| info.find_device_name()) + .and_then(|handle| handle.get_device_name()) .or_else(|| self.common.pci_info.device_pci_info.model.clone()) } @@ -1064,12 +994,11 @@ impl GpuController for AmdGpuController { gtt_total_usable: self .drm_handle .as_ref() - .and_then(|handle| handle.vram_gtt_info().ok()) - .map(|info| info.gtt_size), + .and_then(|handle| handle.get_gtt_size().ok()), gtt_used: self .drm_handle .as_ref() - .and_then(|handle| handle.gtt_usage_info().ok()), + .and_then(|handle| handle.get_gtt_used().ok()), }, power: PowerStats { average: self.hw_mon_and_then(HwMon::get_power_average), @@ -1556,23 +1485,6 @@ impl GpuController for AmdGpuController { } } -#[cfg(not(test))] -fn get_drm_handle( - common: &CommonControllerInfo, - libdrm_amdgpu: &LibDrmAmdgpu, -) -> anyhow::Result { - let path = common.get_drm_render()?; - let drm_file = fs::OpenOptions::new() - .read(true) - .write(true) - .open(&path) - .with_context(|| format!("Could not open drm file at {}", path.display()))?; - let (handle, _, _) = libdrm_amdgpu - .init_device_handle_with_fd(drm_file) - .map_err(|err| anyhow!("Could not open drm handle, error code {err}"))?; - Ok(handle) -} - fn apply_clocks_config_to_table( config: &ClocksConfiguration, table: &mut ClocksTableGen, diff --git a/lact-daemon/src/server/gpu_controller/amd/drm.rs b/lact-daemon/src/server/gpu_controller/amd/drm.rs new file mode 100644 index 00000000..6c891887 --- /dev/null +++ b/lact-daemon/src/server/gpu_controller/amd/drm.rs @@ -0,0 +1,23 @@ +pub mod amdgpu; +#[cfg(feature = "mock")] +pub mod mock; + +use amdgpu_sysfs::gpu_handle::GpuHandle; +use lact_schema::{CacheInfo, DeviceType, DrmInfo}; +use libdrm_amdgpu_sys::AMDGPU::VBIOS::VbiosInfo; + +pub trait DrmProvider { + fn get_drm_info(&self, handle: &GpuHandle, cache_info: Option) -> Option; + + fn get_device_type(&self) -> Option; + + fn get_gtt_size(&self) -> Result; + + fn get_gtt_used(&self) -> Result; + + fn get_vram_clock(&self) -> Result; + + fn get_vbios_info(&self) -> Result; + + fn get_device_name(&self) -> Option; +} diff --git a/lact-daemon/src/server/gpu_controller/amd/drm/amdgpu.rs b/lact-daemon/src/server/gpu_controller/amd/drm/amdgpu.rs new file mode 100644 index 00000000..53f5dc2d --- /dev/null +++ b/lact-daemon/src/server/gpu_controller/amd/drm/amdgpu.rs @@ -0,0 +1,147 @@ +use super::DrmProvider; +use amdgpu_sysfs::gpu_handle::GpuHandle; +use anyhow::{Context as _, anyhow}; +use lact_schema::{AmdIpInfo, CacheInfo, DeviceType, DrmInfo, DrmMemoryInfo, RopInfo}; +use libdrm_amdgpu_sys::{ + AMDGPU::{ + GPU_INFO as _, HW_IP::HW_IP_TYPE, SENSOR_INFO::SENSOR_TYPE, VBIOS::VbiosInfo, VRAM_TYPE, + }, + LibDrmAmdgpu, +}; +use std::fs; +use tracing::error; + +const AMDGPU_IDS_FLAGS_FUSION: u64 = 0x1; + +const ALL_HW_IP: &[HW_IP_TYPE] = &[ + HW_IP_TYPE::GFX, + HW_IP_TYPE::COMPUTE, + HW_IP_TYPE::DMA, + HW_IP_TYPE::UVD, + HW_IP_TYPE::VCE, + HW_IP_TYPE::UVD_ENC, + HW_IP_TYPE::VCN_DEC, + HW_IP_TYPE::VCN_ENC, + HW_IP_TYPE::VCN_JPEG, + HW_IP_TYPE::VPE, +]; + +use crate::server::gpu_controller::CommonControllerInfo; + +pub struct AmdGpuDrmProvider(libdrm_amdgpu_sys::AMDGPU::DeviceHandle); + +impl AmdGpuDrmProvider { + pub fn new( + common: &CommonControllerInfo, + libdrm_amdgpu: &LibDrmAmdgpu, + ) -> anyhow::Result { + let path = common.get_drm_render()?; + let drm_file = fs::OpenOptions::new() + .read(true) + .write(true) + .open(&path) + .with_context(|| format!("Could not open drm file at {}", path.display()))?; + let (handle, _, _) = libdrm_amdgpu + .init_device_handle_with_fd(drm_file) + .map_err(|err| anyhow!("Could not open drm handle, error code {err}"))?; + + Ok(Self(handle)) + } +} + +impl DrmProvider for AmdGpuDrmProvider { + fn get_drm_info(&self, handle: &GpuHandle, cache_info: Option) -> Option { + let drm_memory_info = self.0.memory_info().ok().map(|memory_info| DrmMemoryInfo { + resizeable_bar: Some(memory_info.check_resizable_bar()), + cpu_accessible_used: memory_info.cpu_accessible_vram.heap_usage, + cpu_accessible_total: memory_info.cpu_accessible_vram.total_heap_size, + }); + let drm_info = self + .0 + .device_info() + .inspect_err(|err| error!("could not fetch DRM info: {err}")) + .ok()?; + + Some(DrmInfo { + device_name: drm_info.find_device_name(), + pci_revision_id: Some(drm_info.pci_rev_id()), + family_name: Some(drm_info.get_family_name().to_string()), + family_id: Some(drm_info.family_id()), + asic_name: Some(drm_info.get_asic_name().to_string()), + chip_class: Some(drm_info.get_chip_class().to_string()), + compute_units: Some(drm_info.cu_active_number), + isa: drm_info + .get_gfx_target_version() + .map(|version| version.to_string()), + streaming_multiprocessors: None, + cuda_cores: None, + vram_type: Some(drm_info.get_vram_type().to_string()), + vram_vendor: handle.get_vram_vendor().ok(), + vram_clock_ratio: match drm_info.get_vram_type() { + VRAM_TYPE::GDDR6 => 2.0, + _ => 1.0, + }, + amd_ip_info: ALL_HW_IP + .iter() + .filter_map(|ip_type| { + let ip_info = self.0.get_hw_ip_info(*ip_type).ok()?; + + Some(AmdIpInfo { + ip_type: ip_info.ip_type.to_string(), + version_major: ip_info.info.hw_ip_version_major, + version_minor: ip_info.info.hw_ip_version_minor, + queues: ip_info.info.num_queues(), + count: ip_info.count, + }) + }) + .collect(), + vram_bit_width: Some(drm_info.vram_bit_width), + vram_max_bw: Some(drm_info.peak_memory_bw_gb().to_string()), + cache_info, + memory_info: drm_memory_info, + rop_info: Some(RopInfo { + unit_count: drm_info.rb_pipes(), + operations_factor: if drm_info.get_asic_name().rbplus_allowed() { + 8 + } else { + 4 + }, + operations_count: drm_info.calc_rop_count(), + }), + ..Default::default() + }) + } + + fn get_gtt_size(&self) -> Result { + self.0.vram_gtt_info().map(|info| info.gtt_size) + } + + fn get_gtt_used(&self) -> Result { + self.0.gtt_usage_info() + } + + fn get_vram_clock(&self) -> Result { + self.0.sensor_info(SENSOR_TYPE::GFX_MCLK).map(u64::from) + } + + fn get_vbios_info(&self) -> Result { + self.0.get_vbios_info() + } + + fn get_device_name(&self) -> Option { + self.0 + .device_info() + .ok() + .and_then(|info| info.find_device_name()) + } + + fn get_device_type(&self) -> Option { + self.0.device_info().ok().map(|info| { + if (info.ids_flags & AMDGPU_IDS_FLAGS_FUSION) > 0 { + DeviceType::Integrated + } else { + DeviceType::Dedicated + } + }) + } +} diff --git a/lact-daemon/src/server/gpu_controller/amd/drm/mock.rs b/lact-daemon/src/server/gpu_controller/amd/drm/mock.rs new file mode 100644 index 00000000..1247699b --- /dev/null +++ b/lact-daemon/src/server/gpu_controller/amd/drm/mock.rs @@ -0,0 +1,64 @@ +use super::DrmProvider; +use crate::server::handler::SnapshotDeviceInfo; +use lact_schema::{DeviceType, DrmInfo}; +use libdrm_amdgpu_sys::AMDGPU::VBIOS::VbiosInfo; +use std::path::Path; +use tracing::info; + +pub struct MockDrmProvider { + snapshot: SnapshotDeviceInfo, +} + +impl MockDrmProvider { + pub fn new(sysfs: &Path) -> Option { + let info_path = sysfs.parent()?.parent()?.join("info.json"); + let raw_snapshot = std::fs::read_to_string(&info_path).ok()?; + let snapshot = serde_json::from_str(&raw_snapshot).expect("could not parse snapshot"); + + info!("using mock device info from {}", info_path.display()); + + Some(Self { snapshot }) + } +} + +impl DrmProvider for MockDrmProvider { + fn get_drm_info( + &self, + _handle: &amdgpu_sysfs::gpu_handle::GpuHandle, + cache_info: Option, + ) -> Option { + self.snapshot + .info + .drm_info + .clone() + .map(|info| DrmInfo { cache_info, ..info }) + } + + fn get_device_type(&self) -> Option { + Some(DeviceType::Dedicated) + } + + fn get_gtt_size(&self) -> Result { + self.snapshot.stats.vram.gtt_total_usable.ok_or(-1) + } + + fn get_gtt_used(&self) -> Result { + self.snapshot.stats.vram.gtt_used.ok_or(-1) + } + + fn get_vram_clock(&self) -> Result { + self.snapshot.stats.clockspeed.vram_clockspeed.ok_or(-1) + } + + fn get_vbios_info(&self) -> Result { + Err(-1) + } + + fn get_device_name(&self) -> Option { + self.snapshot + .info + .drm_info + .as_ref() + .and_then(|info| info.device_name.clone()) + } +} diff --git a/lact-daemon/src/tests/snapshots/lact_daemon__tests__amd__granite-ridge.snap b/lact-daemon/src/tests/snapshots/lact_daemon__tests__amd__granite-ridge.snap new file mode 100644 index 00000000..c623a286 --- /dev/null +++ b/lact-daemon/src/tests/snapshots/lact_daemon__tests__amd__granite-ridge.snap @@ -0,0 +1,243 @@ +--- +source: lact-daemon/src/tests/mod.rs +expression: device_info +--- +{ + "clocks_info": { + "max_sclk": 2200, + "table": { + "type": "amd", + "value": { + "data": { + "current_mclk_range": { + "max": null, + "min": null + }, + "current_sclk_range": { + "max": 2200, + "min": 600 + }, + "od_range": { + "curve_sclk_points": [], + "curve_voltage_points": [], + "mclk": null, + "sclk": { + "max": 2200, + "min": 600 + }, + "sclk_offset": null, + "voltage_offset": null + }, + "sclk_offset": null, + "vddc_curve": [], + "voltage_offset": null + }, + "kind": "rdna" + } + } + }, + "info": { + "driver": "amdgpu", + "drm_info": { + "amd_ip_info": [ + { + "count": 1, + "ip_type": "GFX", + "queues": 1, + "version_major": 10, + "version_minor": 0 + }, + { + "count": 1, + "ip_type": "COMPUTE", + "queues": 4, + "version_major": 10, + "version_minor": 0 + }, + { + "count": 1, + "ip_type": "DMA", + "queues": 1, + "version_major": 5, + "version_minor": 2 + }, + { + "count": 1, + "ip_type": "VCN_DEC", + "queues": 1, + "version_major": 3, + "version_minor": 0 + }, + { + "count": 1, + "ip_type": "VCN_ENC", + "queues": 1, + "version_major": 3, + "version_minor": 0 + }, + { + "count": 1, + "ip_type": "VCN_JPEG", + "queues": 1, + "version_major": 3, + "version_minor": 0 + } + ], + "asic_name": "GFX1036/Raphael/Mendocino/Granite Ridge", + "chip_class": "GFX10_3", + "compute_units": 2, + "family_id": 149, + "family_name": "GC 10.3.6", + "isa": "gfx1036", + "memory_info": { + "cpu_accessible_total": 536870912, + "cpu_accessible_used": 30269440, + "resizeable_bar": true + }, + "pci_revision_id": 201, + "rop_info": { + "operations_count": 8, + "operations_factor": 8, + "unit_count": 1 + }, + "vram_bit_width": 128, + "vram_clock_ratio": 1.0, + "vram_max_bw": "96", + "vram_type": "DDR5" + }, + "flags": [ + "DumpableVBios", + "HasPmfw" + ], + "link_info": { + "current_speed": "16.0 GT/s PCIe", + "current_width": "16", + "max_speed": "16.0 GT/s PCIe", + "max_width": "16" + }, + "pci_info": { + "device_pci_info": { + "model": "Granite Ridge [Radeon Graphics]", + "model_id": "13C0", + "vendor": "Advanced Micro Devices, Inc. [AMD/ATI]", + "vendor_id": "1002" + }, + "subsystem_pci_info": { + "model_id": "7E56", + "vendor": "Micro-Star International Co., Ltd. [MSI]", + "vendor_id": "1462" + } + }, + "vbios_version": "102-RAPHAEL-008", + "vulkan_instances": [] + }, + "pci_info": { + "device_pci_info": { + "model": "Granite Ridge [Radeon Graphics]", + "model_id": "13C0", + "vendor": "Advanced Micro Devices, Inc. [AMD/ATI]", + "vendor_id": "1002" + }, + "subsystem_pci_info": { + "model_id": "7E56", + "vendor": "Micro-Star International Co., Ltd. [MSI]", + "vendor_id": "1462" + } + }, + "power_profile_modes": null, + "power_states": { + "core": [ + { + "enabled": true, + "id": { + "Index": 0 + }, + "value": 600 + }, + { + "enabled": true, + "id": { + "Index": 1 + }, + "value": 700 + }, + { + "enabled": true, + "id": { + "Index": 2 + }, + "value": 2200 + } + ], + "vram": [ + { + "enabled": true, + "id": { + "Index": 0 + }, + "value": 3000 + } + ] + }, + "stats": { + "active_power_states": { + "core": { + "Index": 2 + }, + "memory": { + "Index": 0 + } + }, + "busy_percent": 5, + "clockspeed": { + "gpu_clockspeed": 2200, + "sensors": {}, + "vram_clockspeed": 3000 + }, + "fan": { + "control_enabled": false, + "pmfw_info": {} + }, + "performance_level": "auto", + "power": { + "current": 0.064, + "sensors": { + "gfx": 22.506, + "soc": 16.8 + } + }, + "temps": { + "edge": { + "crit": null, + "crit_hyst": null, + "current": 46.0, + "display_only": false, + "primary": true + }, + "soc": { + "crit": null, + "crit_hyst": null, + "current": 49.0, + "display_only": true, + "primary": false + } + }, + "throttle_info": { + "Current": [ + "EDC_CPU" + ] + }, + "voltage": { + "gpu": 1375, + "sensors": { + "northbridge": 1199 + } + }, + "vram": { + "gtt_total_usable": 33110503424, + "gtt_used": 25473024, + "total": 536870912, + "used": 30269440 + } + } +} diff --git a/tests/snapshots/amd/granite-ridge/card2/dev b/tests/snapshots/amd/granite-ridge/card2/dev new file mode 100644 index 00000000..c3dfd39e --- /dev/null +++ b/tests/snapshots/amd/granite-ridge/card2/dev @@ -0,0 +1 @@ +226:2 diff --git a/tests/snapshots/amd/granite-ridge/card2/device/ari_enabled b/tests/snapshots/amd/granite-ridge/card2/device/ari_enabled new file mode 100644 index 00000000..573541ac --- /dev/null +++ b/tests/snapshots/amd/granite-ridge/card2/device/ari_enabled @@ -0,0 +1 @@ +0 diff --git a/tests/snapshots/amd/granite-ridge/card2/device/boot_vga b/tests/snapshots/amd/granite-ridge/card2/device/boot_vga new file mode 100644 index 00000000..573541ac --- /dev/null +++ b/tests/snapshots/amd/granite-ridge/card2/device/boot_vga @@ -0,0 +1 @@ +0 diff --git a/tests/snapshots/amd/granite-ridge/card2/device/broken_parity_status b/tests/snapshots/amd/granite-ridge/card2/device/broken_parity_status new file mode 100644 index 00000000..573541ac --- /dev/null +++ b/tests/snapshots/amd/granite-ridge/card2/device/broken_parity_status @@ -0,0 +1 @@ +0 diff --git a/tests/snapshots/amd/granite-ridge/card2/device/class b/tests/snapshots/amd/granite-ridge/card2/device/class new file mode 100644 index 00000000..c5f02e33 --- /dev/null +++ b/tests/snapshots/amd/granite-ridge/card2/device/class @@ -0,0 +1 @@ +0x030000 diff --git a/tests/snapshots/amd/granite-ridge/card2/device/compute_reset_mask b/tests/snapshots/amd/granite-ridge/card2/device/compute_reset_mask new file mode 100644 index 00000000..9679bb1c --- /dev/null +++ b/tests/snapshots/amd/granite-ridge/card2/device/compute_reset_mask @@ -0,0 +1 @@ +queue full diff --git a/tests/snapshots/amd/granite-ridge/card2/device/config b/tests/snapshots/amd/granite-ridge/card2/device/config new file mode 100644 index 0000000000000000000000000000000000000000..b79e1e05c87ebbdbf67cd2be82454e70da2a4d8c GIT binary patch literal 4096 zcmZP)I3UcW-Mj-1OV)s BI*