Class: AmdgpuService
- Inherits:
-
Object
- Object
- AmdgpuService
- Defined in:
- lib/amdgpu_service.rb
Overview
AmdgpuService
A service class for reading and interacting with AMD radeon graphics cards through the amdgpu Linux kernel driver.
Defined Under Namespace
Classes: Error
Constant Summary collapse
- BASE_FOLDER =
'/sys/class/drm'- FAN_MODES =
{ '1' => 'manual', '2' => 'auto' }.freeze
Instance Attribute Summary collapse
-
#card_num ⇒ Object
readonly
Returns the value of attribute card_num.
Instance Method Summary collapse
- #busy_percent ⇒ Object
- #connectors_status ⇒ Object
- #core_clock ⇒ Object
- #fan_mode ⇒ Object
- #fan_speed_percent ⇒ Object
- #fan_speed_raw_max ⇒ Object
- #fan_speed_rpm ⇒ Object
-
#initialize(card_num: 0) ⇒ AmdgpuService
constructor
A new instance of AmdgpuService.
- #memory_clock ⇒ Object
- #name ⇒ Object
- #power_dpm_state ⇒ Object
- #power_draw ⇒ Object
- #power_max ⇒ Object
- #set_fan_manual_speed!(percent: nil, raw: nil) ⇒ Object
- #set_fan_mode!(mode) ⇒ Object
- #temperature ⇒ Object
- #vbios_version ⇒ Object
Constructor Details
#initialize(card_num: 0) ⇒ AmdgpuService
Returns a new instance of AmdgpuService.
15 16 17 |
# File 'lib/amdgpu_service.rb', line 15 def initialize(card_num: 0) @card_num = card_num end |
Instance Attribute Details
#card_num ⇒ Object (readonly)
Returns the value of attribute card_num.
11 12 13 |
# File 'lib/amdgpu_service.rb', line 11 def card_num @card_num end |
Instance Method Details
#busy_percent ⇒ Object
19 20 21 |
# File 'lib/amdgpu_service.rb', line 19 def busy_percent File.read("#{base_card_folder}/gpu_busy_percent").strip end |
#connectors_status ⇒ Object
23 24 25 26 27 |
# File 'lib/amdgpu_service.rb', line 23 def connectors_status connectors_files.each_with_object({}) do |f, connectors| connectors[f.slice(/(?<=card0-)(\w|-)+/)] = File.read(f).strip end end |
#core_clock ⇒ Object
29 30 31 |
# File 'lib/amdgpu_service.rb', line 29 def core_clock clock_from_pp_file "/sys/class/drm/card#{card_num}/device/pp_dpm_sclk" end |
#fan_mode ⇒ Object
33 34 35 |
# File 'lib/amdgpu_service.rb', line 33 def fan_mode FAN_MODES[File.read(fan_mode_file).strip] || 'unknown' end |
#fan_speed_percent ⇒ Object
41 42 43 |
# File 'lib/amdgpu_service.rb', line 41 def fan_speed_percent (fan_speed_raw.to_f / fan_speed_raw_max.to_i * 100).round end |
#fan_speed_raw_max ⇒ Object
45 46 47 |
# File 'lib/amdgpu_service.rb', line 45 def fan_speed_raw_max @fan_speed_raw_max ||= File.read(Dir.glob("#{base_card_folder}/**/pwm1_max").first).strip end |
#fan_speed_rpm ⇒ Object
49 50 51 |
# File 'lib/amdgpu_service.rb', line 49 def fan_speed_rpm File.read(fan_input_file).strip end |
#memory_clock ⇒ Object
53 54 55 |
# File 'lib/amdgpu_service.rb', line 53 def memory_clock clock_from_pp_file "/sys/class/drm/card#{card_num}/device/pp_dpm_mclk" end |
#name ⇒ Object
57 58 59 |
# File 'lib/amdgpu_service.rb', line 57 def name lspci_subsystem.split(': ')[1].strip end |
#power_dpm_state ⇒ Object
61 62 63 |
# File 'lib/amdgpu_service.rb', line 61 def power_dpm_state File.read("#{base_card_folder}/power_dpm_state").strip end |
#power_draw ⇒ Object
65 66 67 |
# File 'lib/amdgpu_service.rb', line 65 def power_draw power_raw_to_watts File.read(power_avg_file) end |
#power_max ⇒ Object
69 70 71 |
# File 'lib/amdgpu_service.rb', line 69 def power_max @power_max ||= power_raw_to_watts File.read(power_max_file) end |
#set_fan_manual_speed!(percent: nil, raw: nil) ⇒ Object
73 74 75 76 77 78 79 80 81 82 83 84 85 |
# File 'lib/amdgpu_service.rb', line 73 def set_fan_manual_speed!(percent: nil, raw: nil) if valid_fan_percent_speed?(percent) new_raw = (percent.to_f / 100 * fan_speed_raw_max.to_i).round elsif valid_fan_raw_speed?(raw) new_raw = raw end raise(self.class::Error, 'Invalid fan speed provided') if new_raw.to_s.empty? set_fan_mode!(:manual) unless fan_mode == 'manual' `echo "#{new_raw}" | sudo tee #{fan_power_file}` end |
#set_fan_mode!(mode) ⇒ Object
37 38 39 |
# File 'lib/amdgpu_service.rb', line 37 def set_fan_mode!(mode) `echo "#{FAN_MODES.key(mode.to_s)}" | sudo tee #{fan_mode_file}` end |
#temperature ⇒ Object
87 88 89 |
# File 'lib/amdgpu_service.rb', line 87 def temperature (File.read(temperature_file).to_f / 1000).round(1) end |
#vbios_version ⇒ Object
91 92 93 |
# File 'lib/amdgpu_service.rb', line 91 def vbios_version @vbios_version ||= File.read("#{base_card_folder}/vbios_version").strip end |