Class: AmdgpuService

Inherits:
Object
  • Object
show all
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

Instance Method Summary collapse

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_numObject (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_percentObject



19
20
21
# File 'lib/amdgpu_service.rb', line 19

def busy_percent
  File.read("#{base_card_folder}/gpu_busy_percent").strip
end

#connectors_statusObject



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_clockObject



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_modeObject



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_percentObject



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_maxObject



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_rpmObject



49
50
51
# File 'lib/amdgpu_service.rb', line 49

def fan_speed_rpm
  File.read(fan_input_file).strip
end

#memory_clockObject



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

#nameObject



57
58
59
# File 'lib/amdgpu_service.rb', line 57

def name
  lspci_subsystem.split(': ')[1].strip
end

#power_dpm_stateObject



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_drawObject



65
66
67
# File 'lib/amdgpu_service.rb', line 65

def power_draw
  power_raw_to_watts File.read(power_avg_file)
end

#power_maxObject



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

Raises:

  • (self.class::Error)


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

#temperatureObject



87
88
89
# File 'lib/amdgpu_service.rb', line 87

def temperature
  (File.read(temperature_file).to_f / 1000).round(1)
end

#vbios_versionObject



91
92
93
# File 'lib/amdgpu_service.rb', line 91

def vbios_version
  @vbios_version ||= File.read("#{base_card_folder}/vbios_version").strip
end