amdgpu_fan 0.2.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 474b8500f7505a2793cf2a3cc1345d39273c78b2749cde1a40bef0f8050910e0
4
- data.tar.gz: ceb407543897bd36b851c1c1c42660e8f146878cd354ee0411a104b9358fb133
3
+ metadata.gz: d8bd1ed519a47f577ba017c94f03ac02101767434796821120aef3f9e12d9ba9
4
+ data.tar.gz: 6d55c0d1c45d076d1409318332fade5d9038c8f4e64b86d8af2cb2d5eeb016df
5
5
  SHA512:
6
- metadata.gz: 2808b9d2b5ce15880b9ee3937bac0f534c81b66c3824fe44439ebfc7449ba52d7ad44e930cc21f201bedd1bc6b34a3d17f3d469aed62a534fc8e6cc005064a09
7
- data.tar.gz: 2ddc2aeedb9648308e7bf39f7421d5ae5397addd9df7ed35e6f15e903c78b8c36c946df1a48e529e2cdd2de7629696e0e7caa67d0923d65d9b2b72f56aad7bcd
6
+ metadata.gz: dba9441882e19a730fe7863ac49ac196d6ac6b6ed4f55a1f086d2467c122cb58b7e57fb3dc27d0bfbddcaba9344a89992b59fce9c1f52edb44feb54e9a718b97
7
+ data.tar.gz: 75b810c93258bbb39b2973f97e029cd602d70a61314da9e08af1a13fcaea5ec2ea7067e424aa0a3358d5a9b1863937cefa3a095897214f6ca8f0453757fd5250
data/README.md CHANGED
@@ -1,15 +1,34 @@
1
1
  # amdgpu-fan-rb
2
2
 
3
+ [![Build Status](https://travis-ci.org/HarlemSquirrel/amdgpu-fan-rb.svg?branch=master)](https://travis-ci.org/HarlemSquirrel/amdgpu-fan-rb)
4
+
3
5
  A Ruby CLI to read and set the fan speed for AMD Radeon graphics cards running on the AMDGPU Linux driver.
4
6
 
5
7
  See https://wiki.archlinux.org/index.php/Fan_speed_control#AMDGPU_sysfs_fan_control
6
8
 
7
- ## Usage
9
+ ## Installation
10
+
11
+ The `amdgpu_fan` CLI command can be installed from [RubyGems](https://rubygems.org/gems/amdgpu_fan) or easily run from the source code.
12
+
13
+ ### From RubyGems
8
14
 
9
15
  ```
10
- ➤ bundle
16
+ gem install amdgpu_fan
17
+ ```
18
+
19
+ ### From Source
11
20
 
12
- ➤ bin/amdgpu_fan help
21
+ ```
22
+ ➤ git clone https://github.com/HarlemSquirrel/amdgpu-fan-rb.git
23
+ ➤ cd amdgpu-fan-rb
24
+ ➤ bundle install
25
+ ➤ bin/amdgpu_fan
26
+ ```
27
+
28
+ ## Usage
29
+
30
+ ```
31
+ ➤ amdgpu_fan help
13
32
  Commands:
14
33
  amdgpu_fan auto # Set mode to automatic (requires sudo)
15
34
  amdgpu_fan help [COMMAND] # Describe available commands or one specific command
@@ -17,17 +36,25 @@ Commands:
17
36
  amdgpu_fan status # View device info, current fan speed, and temperature
18
37
  amdgpu_fan watch [SECONDS] # Watch current fan speed, and temperature refreshed every n seconds
19
38
 
20
- bin/amdgpu_fan status
39
+ ➤ amdgpu_fan status
21
40
  📺 GPU: AMD Radeon (TM) R9 Fury Series
22
41
  📄 vBIOS: 113-C8800100-102
23
42
  🌀 Fan: auto mode running at 48% ~ 1828 rpm
24
43
  🌡 Temp: 28.0°C
25
44
  ⚡ Power: 19.26 / 300.0 Watts
45
+
46
+ ➤ bin/amdgpu_fan watch 3
47
+ Watching Advanced Micro Devices, Inc. [AMD/ATI] Radeon R9 FURY X / NANO every 3 second(s)...
48
+ <Press Ctrl-C to exit>
49
+ 2019-05-10 20:36:01 - Clock: 512Mhz Core, 500Mhz Memory, Fan: 1838 rpm [||| ]27%, Load: [||| ]28%, Power: 15.12 W, Temp: 28.0°C
50
+ 2019-05-10 20:36:05 - Clock: 300Mhz Core, 500Mhz Memory, Fan: 1837 rpm [||||| ]49%, Load: [ ]0%, Power: 16.18 W, Temp: 29.0°C
51
+ 2019-05-10 20:36:09 - Clock: 512Mhz Core, 500Mhz Memory, Fan: 1837 rpm [||||| ]49%, Load: [ ]0%, Power: 15.11 W, Temp: 28.0°C
52
+ ^C
53
+ And now the watch is ended.
26
54
  ```
27
55
 
28
56
  ## Dependencies
29
57
 
30
- - Ruby
31
- - bundler
32
- - thor (installed with bundler)
33
- - lspci (included with most Linux distributions)
58
+ - [Ruby](https://www.ruby-lang.org) with [Bundler](https://bundler.io)
59
+ - [Thor](http://whatisthor.com/) (installed with `bundle install`)
60
+ - [`lspci`](https://linux.die.net/man/8/lspci) (included with most Linux distributions)
@@ -4,12 +4,19 @@ require_relative '../config/environment'
4
4
 
5
5
  # The main class
6
6
  class AmdgpuFanCli < Thor
7
- desc 'auto', 'Set mode to automatic (requires sudo)'
7
+ desc 'auto', 'Set fan mode to automatic (requires sudo)'
8
8
  def auto
9
9
  amdgpu_service.set_fan_mode! :auto
10
10
  puts fan_status
11
11
  end
12
12
 
13
+ desc 'connectors', 'View the status of the display connectors'
14
+ def connectors
15
+ amdgpu_service.connectors_status.each do |connector,status|
16
+ puts "#{connector}: #{status}"
17
+ end
18
+ end
19
+
13
20
  desc 'set PERCENTAGE', 'Set fan speed to PERCENTAGE (requires sudo)'
14
21
  def set(percentage)
15
22
  return puts "Invalid percentage" unless (0..100).cover?(percentage.to_i)
@@ -23,14 +30,15 @@ class AmdgpuFanCli < Thor
23
30
 
24
31
  desc 'status', 'View device info, current fan speed, and temperature'
25
32
  def status
26
- print_radeon_logo
27
- puts "📺\tGPU: #{amdgpu_service.name}",
33
+ puts radeon_logo,
34
+ "📺\tGPU: #{amdgpu_service.name}",
28
35
  "📄\tvBIOS: #{amdgpu_service.vbios_version}",
36
+ clock_status,
29
37
  fan_status,
30
38
  "🌡\tTemp: #{amdgpu_service.temperature}°C",
31
39
  "⚡\tPower: #{amdgpu_service.power_dpm_state} mode using " \
32
40
  "#{amdgpu_service.power_draw} / #{amdgpu_service.power_max} Watts",
33
- "⚖\tLoad: #{amdgpu_service.busy_percent}%"
41
+ "⚖\tLoad: #{percent_meter amdgpu_service.busy_percent, 20}"
34
42
  end
35
43
 
36
44
  desc 'watch [SECONDS]', 'Watch fan speed, load, power, and temperature ' \
@@ -42,26 +50,56 @@ class AmdgpuFanCli < Thor
42
50
  ' <Press Ctrl-C to exit>'
43
51
 
44
52
  trap "SIGINT" do
45
- puts 'And now the watch is ended.'
53
+ puts "\nAnd now the watch is ended."
46
54
  exit 0
47
55
  end
48
56
 
49
57
  loop do
50
- puts "#{Time.now.strftime("%F %T")} " \
51
- "Fan: #{amdgpu_service.fan_speed_rpm} rpm (#{amdgpu_service.fan_speed_percent}%), " \
52
- "Load: #{amdgpu_service.busy_percent}%, " \
53
- "Power: #{amdgpu_service.power_draw} W, " \
58
+ puts "#{Time.now.strftime("%F %T")} - " \
59
+ "Clock: #{amdgpu_service.core_clock} Core, #{amdgpu_service.memory_clock} Memory,\t" \
60
+ "Fan: #{amdgpu_service.fan_speed_rpm} rpm #{percent_meter amdgpu_service.fan_speed_percent},\t" \
61
+ "Load: #{percent_meter amdgpu_service.busy_percent},\t" \
62
+ "Power: #{amdgpu_service.power_draw} W,\t" \
54
63
  "Temp: #{amdgpu_service.temperature}°C "
55
64
  sleep seconds.to_i
56
65
  end
57
66
  end
58
67
 
68
+ desc 'watch_csv [SECONDS]', 'Watch stats in CSV format ' \
69
+ 'refreshed every n seconds defaulting to 1 second'
70
+ def watch_csv(seconds=1)
71
+ return puts "Seconds must be from 1 to 600" unless (1..600).cover?(seconds.to_i)
72
+
73
+ puts 'Timestamp, Core Clock (Mhz),Memory Clock (Mhz),Fan speed (rpm), '\
74
+ 'Load (%),Power (Watts),Temp (°C)'
75
+
76
+ trap "SIGINT" do
77
+ exit 0
78
+ end
79
+
80
+ loop do
81
+ puts [Time.now.strftime("%F %T"),
82
+ amdgpu_service.core_clock,
83
+ amdgpu_service.memory_clock,
84
+ amdgpu_service.fan_speed_rpm,
85
+ amdgpu_service.busy_percent,
86
+ amdgpu_service.power_draw,
87
+ amdgpu_service.temperature].join(',')
88
+ sleep seconds.to_i
89
+ end
90
+ end
91
+
59
92
  private
60
93
 
61
94
  def amdgpu_service
62
95
  @amdgpu_service ||= AmdgpuService.new
63
96
  end
64
97
 
98
+ def clock_status
99
+ "⏰\tClocks: #{amdgpu_service.core_clock} Core, " \
100
+ "#{amdgpu_service.memory_clock} Memory"
101
+ end
102
+
65
103
  def current_time
66
104
  Time.now.strftime("%F %T")
67
105
  end
@@ -71,7 +109,12 @@ class AmdgpuFanCli < Thor
71
109
  "#{amdgpu_service.fan_speed_percent}% ~ #{amdgpu_service.fan_speed_rpm} rpm"
72
110
  end
73
111
 
74
- def print_radeon_logo
75
- puts File.read('lib/radeon_r_black_red_100x100.ascii')
112
+ def percent_meter(percent, length = 10)
113
+ progress_bar_count = (length * percent.to_f / 100).round
114
+ "[#{'|' * progress_bar_count}#{' ' * (length - progress_bar_count)}]#{percent}%"
115
+ end
116
+
117
+ def radeon_logo
118
+ File.read(File.join(__dir__, '../lib/radeon_r_black_red_100x100.ascii'))
76
119
  end
77
120
  end
@@ -20,6 +20,16 @@ class AmdgpuService
20
20
  File.read("#{base_card_folder}/gpu_busy_percent").strip
21
21
  end
22
22
 
23
+ def connectors_status
24
+ connectors_files.each_with_object({}) do |f, connectors|
25
+ connectors[f.slice(/(?<=card0-)(\w|-)+/)] = File.read(f).strip
26
+ end
27
+ end
28
+
29
+ def core_clock
30
+ clock_from_pp_file "/sys/class/drm/card#{card_num}/device/pp_dpm_sclk"
31
+ end
32
+
23
33
  def fan_mode
24
34
  FAN_MODES[File.read(fan_mode_file).strip] || 'unknown'
25
35
  end
@@ -40,6 +50,10 @@ class AmdgpuService
40
50
  File.read(fan_input_file).strip
41
51
  end
42
52
 
53
+ def memory_clock
54
+ clock_from_pp_file "/sys/class/drm/card#{card_num}/device/pp_dpm_mclk"
55
+ end
56
+
43
57
  def name
44
58
  lspci_subsystem.split(': ')[1].strip
45
59
  end
@@ -84,6 +98,14 @@ class AmdgpuService
84
98
  @base_card_folder ||= "#{BASE_FOLDER}/card#{card_num}/device"
85
99
  end
86
100
 
101
+ def clock_from_pp_file(file)
102
+ File.read(file).slice /\w+(?= \*)/
103
+ end
104
+
105
+ def connectors_files
106
+ @connectors_files ||= Dir["/sys/class/drm/card#{card_num}*/status"].sort
107
+ end
108
+
87
109
  def fan_input_file
88
110
  @fan_input_file ||= Dir.glob("#{base_card_folder}/**/fan1_input").first
89
111
  end
@@ -113,7 +135,7 @@ class AmdgpuService
113
135
  end
114
136
 
115
137
  def power_max_file
116
- @power_avg_file ||= Dir.glob("#{base_card_folder}/**/power1_cap").first
138
+ @power_max_file ||= Dir.glob("#{base_card_folder}/**/power1_cap").first
117
139
  end
118
140
 
119
141
  def power_raw_to_watts(raw_string)
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: amdgpu_fan
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kevin McCormack
@@ -42,8 +42,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
42
42
  - !ruby/object:Gem::Version
43
43
  version: '0'
44
44
  requirements: []
45
- rubyforge_project:
46
- rubygems_version: 2.7.7
45
+ rubygems_version: 3.0.3
47
46
  signing_key:
48
47
  specification_version: 4
49
48
  summary: A CLI to view and set fan speeds for AMD graphics cards running on the open