Giter VIP home page Giter VIP logo

amdgpud's People

Contributors

auroranssolis avatar boostcookie avatar eraden avatar mithicspirit avatar r15ch13 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar

amdgpud's Issues

amdfand-bin: local (1.0.13-4) is newer than AUR (1.0.11-2)

I get this message every time update my packages with yay or paru:
:: Synchronizing package databases... core is up to date extra is up to date multilib is up to date :: Searching AUR for updates... :: Searching databases for updates... -> amdfand-bin: local (1.0.13-4) is newer than AUR (1.0.11-2)

I guess it is problem with AUR package but is there anyway to fix that?

Unable to install amdfand v1.0.12-1 on arch linux

I am having issues installing and building amdfand version 1.0.12-1 from the aur on my arch linux build.

When updating the package, I run into the following error message:

   Compiling unwinding v0.2.1
error[E0554]: `#![feature]` may not be used on the stable release channel
 --> /tmp/makepkg/.cargo/registry/src/index.crates.io-6f17d22bba15001f/unwinding-0.2.1/src/lib.rs:2:1
  |
2 | #![feature(c_unwind)]
  | ^^^^^^^^^^^^^^^^^^^^^

error[E0554]: `#![feature]` may not be used on the stable release channel
 --> /tmp/makepkg/.cargo/registry/src/index.crates.io-6f17d22bba15001f/unwinding-0.2.1/src/lib.rs:3:1
  |
3 | #![feature(naked_functions)]
  | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^

error[E0554]: `#![feature]` may not be used on the stable release channel
 --> /tmp/makepkg/.cargo/registry/src/index.crates.io-6f17d22bba15001f/unwinding-0.2.1/src/lib.rs:4:1
  |
4 | #![feature(non_exhaustive_omitted_patterns_lint)]
  | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

For more information about this error, try `rustc --explain E0554`.
error: could not compile `unwinding` (lib) due to 3 previous errors

My setup:

Kernel: 6.7.0-arch3-1
DE: Plasma 5.27.10

LockExists on Boot

I have strange behavior during boot with the new version.
service auto restarting provides the same result, but the system reboot has been successful.
it happened twice already. seems, it happens randomly during boot. no service crash after boot.

it was linux-kernel update before. i am using manjaro-unstable (archlinux-stable).
but, strange that with the same software reboot helps after error during boot.

$ journalctl -xb -1 -u amdfand.service

Feb 12 10:29:16 dulia systemd[1]: Started AMD GPU fan daemon.
░░ Subject: A start job for unit amdfand.service has finished successfully
░░ Defined-By: systemd
░░ Support: https://forum.manjaro.org/c/support
░░ 
░░ A start job for unit amdfand.service has finished successfully.
░░ 
░░ The job identifier is 103.
Feb 12 10:29:16 dulia amdfand[664]:  ERROR amdfand > LockExists
Feb 12 10:29:16 dulia systemd[1]: amdfand.service: Main process exited, code=exited, status=1/FAILURE
░░ Subject: Unit process exited
░░ Defined-By: systemd
░░ Support: https://forum.manjaro.org/c/support
░░ 
░░ An ExecStart= process belonging to unit amdfand.service has exited.
░░ 
░░ The process' exit code is 'exited' and its exit status is 1.
Feb 12 10:29:16 dulia systemd[1]: amdfand.service: Failed with result 'exit-code'.
░░ Subject: Unit failed
░░ Defined-By: systemd
░░ Support: https://forum.manjaro.org/c/support
░░ 
░░ The unit amdfand.service has entered the 'failed' state with result 'exit-code'.
Feb 12 10:29:20 dulia systemd[1]: amdfand.service: Scheduled restart job, restart counter is at 1.
░░ Subject: Automatic restarting of a unit has been scheduled
░░ Defined-By: systemd
░░ Support: https://forum.manjaro.org/c/support
░░ 
░░ Automatic restarting of the unit amdfand.service has been scheduled, as the result for
░░ the configured Restart= setting for the unit.
Feb 12 10:29:20 dulia systemd[1]: Stopped AMD GPU fan daemon.
~❯ pacman -Qi amdfand-bin                                                                                                  
Name            : amdfand-bin
Version         : 1.0.9-3
~❯ inxi -G --display                                                                                                            
Graphics:
  Device-1: AMD Lexa PRO [Radeon 540/540X/550/550X / RX 540X/550/550X] driver: amdgpu v: kernel
  Display: x11 server: X.Org 1.21.1.3 driver: loaded: amdgpu resolution: 1920x1080~60Hz
  OpenGL:
    renderer: AMD Radeon RX 550 / 550 Series (POLARIS12 DRM 3.44.0 5.16.9-1-MANJARO LLVM 13.0.0)
    v: 4.6 Mesa 21.3.5

Feature Request: increase fan speed based on GPU activity

Currently the GPU fans are not ramping up when required on my system when they should be. Having a mechanism implemented that allows an bias/increase when the GPU has activity above a certain threshold would resolve this.

I have set the fan curves in amdfand to be at ~700 RPM when the GPU is <40C doing mundane tasks like web browsing.

When I play CPU heavy games that don't load the GPU as much, the reported temperature of the GPU does not increase; while physically I can feel the lower part of the front panel (GPU location) getting hotter.

The reported GPU temperature not reflecting reality seems to only happen when the GPU isn't loaded as much. In more GPU heavy games the reported temperature of the GPU does go up.

Increasing the fan speed for all use cases is not something I'd like to do, as it'd increase wear and maintenance on the fans and build up dust unnecessarily.

Basicly I want the fans to only ramp up when truly required.

Having some configurable increase that gets added to each curve when the GPU activity peaked over e.g. >30% (configurable) in the last 60s (configurable) interval would help a ton in this regard and increase the CFM of the fans of the GPU to a point where it is not "hotboxing" the case.

amdguid ... something is very wrong?

I installed amdguid with
crate install amdguid
and in the same fashion I installed amdfand, amdvold and amdmond.
I ran amdguid from my terminal, and I see a window where GUI is tiny, in top left corner and other 3 fourths are blue with a red triangle in the middle??? and my terminal is mad btw:

 WARN  amdguid::app > Failed to load amd fan services pid list. GuiHelper(NoSockFile)
error: XDG_RUNTIME_DIR is invalid or not set in the environment.
error: XDG_RUNTIME_DIR is invalid or not set in the environment.
 INFO  winit::platform_impl::platform::x11::window > Guessed window scale factor: 2
 DEBUG winit::platform_impl::platform::x11::window > Calculated physical dimensions: 1024x768
 WARN  amdguid::app                                > Failed to load amd fan services pid list. GuiHelper(NoSockFile)
 WARN  amdguid::app                                > Failed to load amd fan services pid list. GuiHelper(NoSockFile)
 WARN  amdguid::app                                > Failed to load amd fan services pid list. GuiHelper(NoSockFile)
 WARN  amdguid::app                                > Failed to load amd fan services pid list. GuiHelper(NoSockFile)
 WARN  amdguid::app                                > Failed to load amd fan services pid list. GuiHelper(NoSockFile)
 WARN  amdguid::app                                > Failed to load amd fan services pid list. GuiHelper(NoSockFile)
 WARN  amdguid::app                                > Failed to load amd fan services pid list. GuiHelper(NoSockFile)
...

card0 and card1 don't link to the same graphics card

I have an NVidia and an AMD card installed and every so often the mapping in /sys/class/drm changes.
Sometimes card0 is the AMD card and another time it's the NVidia card.

As a workaround I added cards = ["card0", "card1"] to the config.toml

As of now, I haven't found a way to always refer to the right card.

Graph axes should be swapped

I guess this is more of a nitpick than an outright issue, but the two axes of the graph should be swapped. The independent variable which is temperature belongs on the x axis and the y axis should be speed since it's dependent on temperature.

amdfand doesn't enable manual fan control via pwm1_enable

Issue

Recently i've noticed that the fan speed sometimes doesn't increase + I get these errors (output from journalctl) when doing gpu intensive tasks:

Mar 08 14:50:49 [HostName] amdfand[448]:  ERROR amdfand::service > Failed to change speed to 100. Fan(FailedToChangeSpeed { value: 255, error: Write { io: Os { code: 22, kind: InvalidInput, message: "Invalid argument" }, path: "/sys/class/drm/card0/device/hwmon/hwmon0/pwm1" } })
Mar 08 14:52:49 [HostName] amdfand[448]:  ERROR amdfand::service > Failed to change speed to 100. Fan(FailedToChangeSpeed { value: 255, error: Write { io: Os { code: 22, kind: InvalidInput, message: "Invalid argument" }, path: "/sys/class/drm/card0/device/hwmon/hwmon0/pwm1" } })
Mar 08 14:52:53 [HostName] amdfand[448]:  ERROR amdfand::service > Failed to change speed to 100. Fan(FailedToChangeSpeed { value: 255, error: Write { io: Os { code: 22, kind: InvalidInput, message: "Invalid argument" }, path: "/sys/class/drm/card0/device/hwmon/hwmon0/pwm1" } })
Mar 08 14:52:57 [HostName] amdfand[448]:  ERROR amdfand::service > Failed to change speed to 100. Fan(FailedToChangeSpeed { value: 255, error: Write { io: Os { code: 22, kind: InvalidInput, message: "Invalid argument" }, path: "/sys/class/drm/card0/device/hwmon/hwmon0/pwm1" } })
Mar 08 14:53:01 [HostName] amdfand[448]:  ERROR amdfand::service > Failed to change speed to 100. Fan(FailedToChangeSpeed { value: 255, error: Write { io: Os { code: 22, kind: InvalidInput, message: "Invalid argument" }, path: "/sys/class/drm/card0/device/hwmon/hwmon0/pwm1" } })
Mar 08 14:53:05 [HostName] amdfand[448]:  ERROR amdfand::service > Failed to change speed to 100. Fan(FailedToChangeSpeed { value: 255, error: Write { io: Os { code: 22, kind: InvalidInput, message: "Invalid argument" }, path: "/sys/class/drm/card0/device/hwmon/hwmon0/pwm1" } })
Mar 08 14:55:53 [HostName] amdfand[448]:  ERROR amdfand::service > Failed to change speed to 100. Fan(FailedToChangeSpeed { value: 255, error: Write { io: Os { code: 22, kind: InvalidInput, message: "Invalid argument" }, path: "/sys/class/drm/card0/device/hwmon/hwmon0/pwm1" } })
Mar 08 14:55:57 [HostName] amdfand[448]:  ERROR amdfand::service > Failed to change speed to 100. Fan(FailedToChangeSpeed { value: 255, error: Write { io: Os { code: 22, kind: InvalidInput, message: "Invalid argument" }, path: "/sys/class/drm/card0/device/hwmon/hwmon0/pwm1" } })
Mar 08 14:56:05 [HostName] amdfand[448]:  ERROR amdfand::service > Failed to change speed to 100. Fan(FailedToChangeSpeed { value: 255, error: Write { io: Os { code: 22, kind: InvalidInput, message: "Invalid argument" }, path: "/sys/class/drm/card0/device/hwmon/hwmon0/pwm1" } })
Mar 08 14:56:09 [HostName] amdfand[448]:  ERROR amdfand::service > Failed to change speed to 100. Fan(FailedToChangeSpeed { value: 255, error: Write { io: Os { code: 22, kind: InvalidInput, message: "Invalid argument" }, path: "/sys/class/drm/card0/device/hwmon/hwmon0/pwm1" } })

When I manually su into root and echo "1" > /sys/class/drm/card0/device/hwmon/hwmon0/pwm1_enable (enable manual fan control), the errors stop and my fan speed starts to change as usual.
This has been been happening more recently, but wasn't the case before.
Is this behaviour normal?

Possible solution

(If the issue is actually a bug in the code)
Implement a check to see if manual fan control is enabled when the above error occurs, and enable it if not.
A manual check can be performed by reading the file sys/class/drm/card0/device/hwmon/hwmon0/pwm1_enable (1 = manual fan control)

System info

OS: Arch linux

How to view log messages

When I have a temperature followed by a lower temperature in my config then I expect to get this message

amdgpud/src/config.rs

Lines 246 to 252 in 90e1dcd

if matrix_point.speed < last_point.speed {
log::error!(
"Curve fan speeds should be monotonically increasing, found {} then {}",
last_point.speed,
matrix_point.speed
);
return Err(std::io::Error::from(ErrorKind::InvalidData));

but the log message never shows up. All I see is Error: Kind(InvalidData).

I do have log_level = "Error" in my config.toml.

Mistakes in config parsing

Hi, first of all your project is awesome! Wanna report an issue.
I've build v1.0.8 tag and found an issue with config parsing. I used default example config from examples and got:

thread 'main' panicked at 'called `Result::unwrap()` on an `Err` value: Error { inner: ErrorInner { kind: Custom, line: Some(24), col: 0, at: Some(268), message: "missing field `interval`", key: [] } }', /home/ab/repos/amdgpud/amdgpu/src/utils.rs:92:58 note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace Aborted (core dumped)

I've made some research and know the point.
Here is a default values but it works if neither interval nor log_level are defined:

impl Default for Config {
fn default() -> Self {
Self {
log_level: LogLevel::Error,
interval: 5000,
}
}
}

But if I have config without interval but log_level and vice versa it fails. Looks like need to check unexciting values and define it with default.
Here is an error, config.interval doesn't exist:

if config.interval < 100 {
log::warn!(
"Minimal interval is 100ms, overriding {}ms",
config.interval
);
config.interval = 100;
}

Rust isn't my strong point so I can't fix it in a fancy way.

Openrc service doesn't always start fan on a startup.

Amdfand service sometimes requires manual start (sudo amdfand in terminal) after system startup.
I have no idea why fans sometimes start spinning and other time doesn't.
I have this in a config file so temperature settings aren't an explanation to this problem.

[[speed_matrix]]
temp = 4.0
speed = 10.0

Services...
rc-update -a
amdfand | default

Change "cards" in config to accept all cards

Linux unfortunately does not assign card to same /sys/class/drm/card and for more than one card, card number will change.

Easiest fix without enforcing some changes on user operating system and without changing config files will be changing cards to

enum CardConfig {
  All,
  Specified(Vec<Card>>
}

Build of `amdguid` fails with errors E0061, E0277, E0308, E0432, E0433, E0599, E0659: ``error[E0432]: unresolved imports `crate::app::ImageStorage`, `crate::app::ImageType``` and subsequent errors.

Ahoj,

Short:

Build fails with

error[E0432]: unresolved imports `crate::app::ImageStorage`, `crate::app::ImageType`

and subsequent errors (E0061, E0277, E0308, E0432, E0433, E0599, E0659).

In detail:

I am building this using the following recipe (inspired by ↗ this PKGBUILD):

export CARGO_HOME=/tmp/cargo
export RUSTUP_HOME=/tmp/rustup

export RUSTUP_TOOLCHAIN=stable
export CARGO_TARGET_DIR=target

export CARCH=x86_64

git clone --depth 1 --single-branch --shallow-submodules https://github.com/Eraden/amdgpud amdgpud

cd amdgpud

cargo fetch --locked --target "$CARCH-unknown-linux-gnu"
cargo build --release --frozen --all-features --target="$CARCH-unknown-linux-gnu"
  • My checkout of https://github.com/Eraden/amdgpud is at the following commit:
    git log -n1:

    commit 9242681bb2726f41d867094f6c3e2b8a1447fa9d (grafted, HEAD -> main, origin/main, origin/HEAD)
    Author: Adrian Woźniak <[email protected]>
    Date:   Thu Aug 25 15:12:11 2022 +0200
    
        Change button to label
    
  • Terminal output from cargo fetch --locked --target "$CARCH-unknown-linux-gnu":

    warning: some crates are on edition 2021 which defaults to `resolver = "2"`, but virtual workspaces default to `resolver = "1"`
    note: to keep the current resolver, specify `workspace.resolver = "1"` in the workspace root's manifest
    note: to use the edition 2021 resolver, specify `workspace.resolver = "2"` in the workspace root's manifest
        Updating crates.io index
      Downloaded either v1.7.0
    [...]
      Downloaded 239 crates (34.4 MB) in 46.31s (largest was `shaderc-sys` at 6.8 MB)
    
  • Terminal output from cargo build --release --frozen --all-features --target="$CARCH-unknown-linux-gnu":

    warning: some crates are on edition 2021 which defaults to `resolver = "2"`, but virtual workspaces default to `resolver = "1"`
    note: to keep the current resolver, specify `workspace.resolver = "1"` in the workspace root's manifest
    note: to use the edition 2021 resolver, specify `workspace.resolver = "2"` in the workspace root's manifest
      Compiling libc v0.2.132
    [...]
     Compiling nix v0.23.1
     Compiling amdfan v0.1.0 (/tmp/makepkg/build/amdgpud-git/src/amdgpud/amdfan)
     Compiling amdgui-helper v1.0.10 (/tmp/makepkg/build/amdgpud-git/src/amdgpud/amdgui-helper)
     Compiling amdportsd v0.1.0 (/tmp/makepkg/build/amdgpud-git/src/amdgpud/amdportsd)
     Compiling amdfand v1.0.13 (/tmp/makepkg/build/amdgpud-git/src/amdgpud/amdfand)
     Compiling amdmond v1.0.10 (/tmp/makepkg/build/amdgpud-git/src/amdgpud/amdmond)
     Compiling amdvold v1.0.10 (/tmp/makepkg/build/amdgpud-git/src/amdgpud/amdvold)
     [...]
    

and then the next line is compilation of amdguid which fails:

   Compiling amdguid v1.0.12 (/tmp/makepkg/build/amdgpud-git/src/amdgpud/amdguid)
error[E0432]: unresolved imports `crate::app::ImageStorage`, `crate::app::ImageType`
  --> amdguid/src/backend/glium_backend.rs:10:26
   |
10 | use crate::app::{AmdGui, ImageStorage, ImageType};
   |                          ^^^^^^^^^^^^  ^^^^^^^^^ no `ImageType` in `app`
   |                          |
   |                          no `ImageStorage` in `app`
   |
   = help: consider importing this enum instead:
           vulkano::image::ImageType

error[E0433]: failed to resolve: could not find `EguiGlow` in `egui_glow`
  --> amdguid/src/backend/glow_backend.rs:49:31
   |
49 |     let mut egui = egui_glow::EguiGlow::new(&gl_window, &gl);
   |                               ^^^^^^^^ could not find `EguiGlow` in `egui_glow`

error[E0659]: `run_app` is ambiguous
  --> amdguid/src/main.rs:28:14
   |
28 |     backend::run_app(amd_gui, receiver);
   |              ^^^^^^^ ambiguous name
   |
   = note: ambiguous because of multiple glob imports of a name in the same module
note: `run_app` could refer to the function imported here
  --> amdguid/src/backend/mod.rs:13:9
   |
13 | pub use glium_backend::*;
   |         ^^^^^^^^^^^^^^^^
   = help: consider adding an explicit import of `run_app` to disambiguate
note: `run_app` could also refer to the function imported here
  --> amdguid/src/backend/mod.rs:18:9
   |
18 | pub use wayland_backend::*;
   |         ^^^^^^^^^^^^^^^^^^
   = help: consider adding an explicit import of `run_app` to disambiguate

warning: unused import: `std::collections::HashMap`
 --> amdguid/src/backend/glium_backend.rs:1:5
  |
1 | use std::collections::HashMap;
  |     ^^^^^^^^^^^^^^^^^^^^^^^^^
  |
  = note: `#[warn(unused_imports)]` on by default

warning: unused import: `std::rc::Rc`
 --> amdguid/src/backend/glium_backend.rs:2:5
  |
2 | use std::rc::Rc;
  |     ^^^^^^^^^^^

warning: unused import: `image::RgbaImage`
 --> amdguid/src/backend/glium_backend.rs:6:5
  |
6 | use image::RgbaImage;
  |     ^^^^^^^^^^^^^^^^

warning: use of deprecated associated function `glutin::event_loop::EventLoop::<T>::with_user_event`: Use `EventLoopBuilder::<T>::with_user_event().build()` instead.
  --> amdguid/src/backend/glium_backend.rs:32:53
   |
32 |     let event_loop = glutin::event_loop::EventLoop::with_user_event();
   |                                                     ^^^^^^^^^^^^^^^
   |
   = note: `#[warn(deprecated)]` on by default

error[E0308]: mismatched types
  --> amdguid/src/backend/glium_backend.rs:35:47
   |
35 |     let mut egui = egui_glium::EguiGlium::new(&display);
   |                    -------------------------- ^^^^^^^^ expected `glium::backend::glutin::Display`, found `glium::Display`
   |                    |
   |                    arguments to this function are incorrect
   |
   = note: `glium::Display` and `glium::backend::glutin::Display` have similar names, but are actually distinct types
note: `glium::Display` is defined in crate `glium`
  --> /tmp/cargo/registry/src/index.crates.io-6f17d22bba15001f/glium-0.32.1/src/backend/glutin/mod.rs:36:1
   |
36 | pub struct Display {
   | ^^^^^^^^^^^^^^^^^^
note: `glium::backend::glutin::Display` is defined in crate `glium`
  --> /tmp/cargo/registry/src/index.crates.io-6f17d22bba15001f/glium-0.31.0/src/backend/glutin/mod.rs:36:1
   |
36 | pub struct Display {
   | ^^^^^^^^^^^^^^^^^^
   = note: perhaps two different versions of crate `glium` are being used?
note: associated function defined here
  --> /tmp/cargo/registry/src/index.crates.io-6f17d22bba15001f/egui_glium-0.18.0/src/lib.rs:28:12
   |
28 |     pub fn new(display: &glium::Display) -> Self {
   |            ^^^

error[E0599]: no method named `begin_frame` found for struct `EguiGlium` in the current scope
  --> amdguid/src/backend/glium_backend.rs:50:18
   |
50 |             egui.begin_frame(&display);
   |                  ^^^^^^^^^^^ method not found in `EguiGlium`
   |
help: one of the expressions' fields has a method of the same name
   |
50 |             egui.egui_ctx.begin_frame(&display);
   |                  +++++++++

error[E0599]: no method named `ctx` found for struct `EguiGlium` in the current scope
  --> amdguid/src/backend/glium_backend.rs:52:45
   |
52 |             create_ui(amd_gui.clone(), egui.ctx());
   |                                             ^^^ method not found in `EguiGlium`

error[E0599]: no method named `end_frame` found for struct `EguiGlium` in the current scope
  --> amdguid/src/backend/glium_backend.rs:54:48
   |
54 |             let (needs_repaint, shapes) = egui.end_frame(&display);
   |                                                ^^^^^^^^^ method not found in `EguiGlium`
   |
help: one of the expressions' fields has a method of the same name
   |
54 |             let (needs_repaint, shapes) = egui.egui_ctx.end_frame(&display);
   |                                                +++++++++

error[E0277]: the trait bound `glium::Frame: glium::Surface` is not satisfied
    --> amdguid/src/backend/glium_backend.rs:69:38
     |
69   |                 egui.paint(&display, &mut target, shapes);
     |                      -----           ^^^^^^^^^^^ the trait `glium::Surface` is not implemented for `glium::Frame`
     |                      |
     |                      required by a bound introduced by this call
     |
help: trait impl with same name found
    --> /tmp/cargo/registry/src/index.crates.io-6f17d22bba15001f/glium-0.32.1/src/lib.rs:1285:1
     |
1285 | impl Surface for Frame {
     | ^^^^^^^^^^^^^^^^^^^^^^
     = note: perhaps two different versions of crate `glium` are being used?
     = help: the following other types implement trait `glium::Surface`:
               glium::framebuffer::default_fb::DefaultFramebuffer
               glium::framebuffer::SimpleFrameBuffer<'a>
               glium::framebuffer::MultiOutputFrameBuffer<'a>
               glium::framebuffer::EmptyFrameBuffer
               glium::Frame
note: required by a bound in `EguiGlium::paint`
    --> /tmp/cargo/registry/src/index.crates.io-6f17d22bba15001f/egui_glium-0.18.0/src/lib.rs:79:21
     |
79   |     pub fn paint<T: glium::Surface>(&mut self, display: &glium::Display, target: &mut T) {
     |                     ^^^^^^^^^^^^^^ required by this bound in `EguiGlium::paint`

error[E0061]: this method takes 2 arguments but 3 arguments were supplied
  --> amdguid/src/backend/glium_backend.rs:69:22
   |
69 |                 egui.paint(&display, &mut target, shapes);
   |                      ^^^^^ ----------
   |                            |
   |                            unexpected argument of type `&glium::Display`
   |                            help: remove the extra argument
   |
note: method defined here
  --> /tmp/cargo/registry/src/index.crates.io-6f17d22bba15001f/egui_glium-0.18.0/src/lib.rs:79:12
   |
79 |     pub fn paint<T: glium::Surface>(&mut self, display: &glium::Display, target: &mut T) {
   |            ^^^^^

error[E0599]: no method named `is_quit_event` found for struct `EguiGlium` in the current scope
  --> amdguid/src/backend/glium_backend.rs:79:25
   |
79 |                 if egui.is_quit_event(&event) {
   |                         ^^^^^^^^^^^^^ method not found in `EguiGlium`

error[E0308]: mismatched types
   --> amdguid/src/backend/glium_backend.rs:83:31
    |
83  |                 egui.on_event(&event);
    |                      -------- ^^^^^^ expected `winit::event::WindowEvent<'_>`, found `glutin::event::WindowEvent<'_>`
    |                      |
    |                      arguments to this method are incorrect
    |
    = note: `glutin::event::WindowEvent<'_>` and `winit::event::WindowEvent<'_>` have similar names, but are actually distinct types
note: `glutin::event::WindowEvent<'_>` is defined in crate `winit`
   --> /tmp/cargo/registry/src/index.crates.io-6f17d22bba15001f/winit-0.27.2/src/event.rs:319:1
    |
319 | pub enum WindowEvent<'a> {
    | ^^^^^^^^^^^^^^^^^^^^^^^^
note: `winit::event::WindowEvent<'_>` is defined in crate `winit`
   --> /tmp/cargo/registry/src/index.crates.io-6f17d22bba15001f/winit-0.26.1/src/event.rs:211:1
    |
211 | pub enum WindowEvent<'a> {
    | ^^^^^^^^^^^^^^^^^^^^^^^^
    = note: perhaps two different versions of crate `winit` are being used?
note: method defined here
   --> /tmp/cargo/registry/src/index.crates.io-6f17d22bba15001f/egui_glium-0.18.0/src/lib.rs:48:12
    |
48  |     pub fn on_event(&mut self, event: &glium::glutin::event::WindowEvent<'_>) -> bool {
    |            ^^^^^^^^

warning: use of deprecated associated function `glutin::event_loop::EventLoop::<T>::with_user_event`: Use `EventLoopBuilder::<T>::with_user_event().build()` instead.
  --> amdguid/src/backend/glow_backend.rs:46:53
   |
46 |     let event_loop = glutin::event_loop::EventLoop::with_user_event();
   |                                                     ^^^^^^^^^^^^^^^

Some errors have detailed explanations: E0061, E0277, E0308, E0432, E0433, E0599, E0659.
For more information about an error, try `rustc --explain E0061`.
warning: `amdguid` (bin "amdguid") generated 5 warnings
error: could not compile `amdguid` (bin "amdguid") due to 11 previous errors; 5 warnings emitted

and the build process terminates with exitcode 101.

Software versions:

  • cargo --version: cargo 1.73.0
  • rustc --version: rustc 1.73.0 (cc66ad468 2023-10-03) (Arch Linux rust 1:1.73.0-1)

Regards!

Support target "x86_64-unknown-linux-gnu"

version used: git head 2c7dd81
toolchain used: stable-x86_64-unknown-linux-gnu
os: Linux Mint 20.2

Compile output
$ cargo build --release
  Downloaded gumdrop v0.8.0
  Downloaded gumdrop_derive v0.8.0
  Downloaded pretty_env_logger v0.4.0
  Downloaded libc v0.2.97
  Downloaded 4 crates (555.3 KB) in 0.68s
   Compiling proc-macro2 v1.0.27
   Compiling unicode-xid v0.2.2
   Compiling syn v1.0.73
   Compiling memchr v2.4.0
   Compiling libc v0.2.97
   Compiling serde_derive v1.0.126
   Compiling log v0.4.14
   Compiling cfg-if v1.0.0
error[E0463]: can't find crate for `core`
  |
  = note: the `x86_64-unknown-linux-musl` target may not be installed
  = help: consider downloading the target with `rustup target add x86_64-unknown-linux-musl`

error: aborting due to previous error

For more information about this error, try `rustc --explain E0463`.
error: could not compile `cfg-if`

To learn more, run the command again with --verbose.
warning: build failed, waiting for other jobs to finish...
error: build failed

1.0.6 regression

Version 1.0.5 was working flawlessly and thank you for such practical service.
But, with version 1.0.6 i have following issue:

$ amdfand
 ERROR amdfand > No hwmod has been found in sysfs

$ amdfand available
Available cards
 * card0 -

$ cat /sys/class/hwmon/hwmon4/name
amdgpu

$ cat /sys/class/hwmon/hwmon4/temp1_input
26000

let me know, if you need more info

Error: Kind(InvalidData)

Hi there
I tried to follow the instruction but getting error on startup Error: Kind(InvalidData)

Missing LICENSE

This project is missing a license file, so technically no one can use it.

You can pick one out from here.

0 rpm mode not working

Hello, been messing with amdgpufand daemon to run custom fan curve but it seems 0 rpm mode doesnt work for me at least with ref 6900 xt.

this is my config

#temp_input = "temp1_input"
log_level = "Info"

[[speed_matrix]]
temp = 50.0
speed = 0.0

[[speed_matrix]]
temp = 60.0
speed = 45.0

[[speed_matrix]]
temp = 65.0
speed = 50.0

[[speed_matrix]]
temp = 70.0
speed = 60.0

[[speed_matrix]]
temp = 80.0
speed = 70.0

[[speed_matrix]]
temp = 90.0
speed = 90.0

Allow setting unsorted fan speeds

With certain clocks, voltages and power levels on a Vega 64, sometimes the VRAM temperature is falsely reported as 1 °C, in some scenarios even for prolonged periods of time.
I use the VRAM temperature as the value to regulate the fan speed as in most of (if not all) the time the VRAM is up to 10 °C hotter than the Core.

The temperature being reported as 1 °C means that the fans will stay turned off even if the VRAM (and maybe the core) are heating up to death, causing instability issues. To combat this, I'd like to set the fan speed to 100 % when temp <= 2 °C just to be on the safe side.

It would be nice to be able to do something like this:

temp_input = "temp3_input"
log_level = "Error"

[[speed_matrix]]
temp = 0.0
speed = 100.0

[[speed_matrix]]
temp = 2.0
speed = 100.0

[[speed_matrix]]
temp = 3.0
speed = 0.0

# and all the rest

However, this causes following error:

ERROR amdfand            > Fan speed 1.0 for config entry 2 is lower than previous value 100.0. Entries must be sorted
ERROR amdgpu_config::fan > Curve fan speeds should be monotonically increasing, found 100 then 1

Error comes from https://github.com/Eraden/amdgpud/blob/main/crates/amdgpu-config/src/fan.rs#L300

Or, if you want to add new configs:

temp_input = "temp3_input"
log_level = "Error"
turn_off_below = 3.0
force_full_speed_at = [1.0, 80.0]

# and all the rest

Edit:
To clarify, what I want is to be able to set 100% fan speed when VRAM temp < 2 °C but still use the normal fan curve otherwise.

Build fails on Arch Linux

Given the AUR package has GPG key issues, I decided to try building from source, so I cloned the repository, ran rustup target add x86_64-unknown-linux-musl, and ./scripts/build.sh. However, I got this compilation error:

error[E0432]: unresolved imports `crate::app::ImageStorage`, `crate::app::ImageType`
  --> amdguid/src/backend/glium_backend.rs:10:26
   |
10 | use crate::app::{AmdGui, ImageStorage, ImageType};
   |                          ^^^^^^^^^^^^  ^^^^^^^^^ no `ImageType` in `app`
   |                          |
   |                          no `ImageStorage` in `app`

warning: unused import: `std::collections::HashMap`
 --> amdguid/src/backend/glium_backend.rs:1:5
  |
1 | use std::collections::HashMap;
  |     ^^^^^^^^^^^^^^^^^^^^^^^^^
  |
  = note: `#[warn(unused_imports)]` on by default

warning: unused import: `std::rc::Rc`
 --> amdguid/src/backend/glium_backend.rs:2:5
  |
2 | use std::rc::Rc;
  |     ^^^^^^^^^^^

warning: unused import: `image::RgbaImage`
 --> amdguid/src/backend/glium_backend.rs:6:5
  |
6 | use image::RgbaImage;
  |     ^^^^^^^^^^^^^^^^

warning: use of deprecated associated function `glium::glutin::event_loop::EventLoop::<T>::with_user_event`: Use `EventLoopBuilder::<T>::with_user_event().build()` instead.
  --> amdguid/src/backend/glium_backend.rs:32:53
   |
32 |     let event_loop = glutin::event_loop::EventLoop::with_user_event();
   |                                                     ^^^^^^^^^^^^^^^
   |
   = note: `#[warn(deprecated)]` on by default

error[E0308]: mismatched types
  --> amdguid/src/backend/glium_backend.rs:35:47
   |
35 |     let mut egui = egui_glium::EguiGlium::new(&display);
   |                    -------------------------- ^^^^^^^^ expected struct `glium::backend::glutin::Display`, found struct `glium::Display`
   |                    |
   |                    arguments to this function are incorrect
   |
   = note: struct `glium::Display` and struct `glium::backend::glutin::Display` have similar names, but are actually distinct types
note: struct `glium::Display` is defined in crate `glium`
  --> /home/kainoa/.cargo/registry/src/github.com-1ecc6299db9ec823/glium-0.32.1/src/backend/glutin/mod.rs:36:1
   |
36 | pub struct Display {
   | ^^^^^^^^^^^^^^^^^^
note: struct `glium::backend::glutin::Display` is defined in crate `glium`
  --> /home/kainoa/.cargo/registry/src/github.com-1ecc6299db9ec823/glium-0.31.0/src/backend/glutin/mod.rs:36:1
   |
36 | pub struct Display {
   | ^^^^^^^^^^^^^^^^^^
   = note: perhaps two different versions of crate `glium` are being used?
note: associated function defined here
  --> /home/kainoa/.cargo/registry/src/github.com-1ecc6299db9ec823/egui_glium-0.18.0/src/lib.rs:28:12
   |
28 |     pub fn new(display: &glium::Display) -> Self {
   |            ^^^

error[E0599]: no method named `begin_frame` found for struct `EguiGlium` in the current scope
  --> amdguid/src/backend/glium_backend.rs:50:18
   |
50 |             egui.begin_frame(&display);
   |                  ^^^^^^^^^^^ method not found in `EguiGlium`
   |
help: one of the expressions' fields has a method of the same name
   |
50 |             egui.egui_ctx.begin_frame(&display);
   |                  +++++++++

error[E0599]: no method named `ctx` found for struct `EguiGlium` in the current scope
  --> amdguid/src/backend/glium_backend.rs:52:45
   |
52 |             create_ui(amd_gui.clone(), egui.ctx());
   |                                             ^^^ method not found in `EguiGlium`

error[E0599]: no method named `end_frame` found for struct `EguiGlium` in the current scope
  --> amdguid/src/backend/glium_backend.rs:54:48
   |
54 |             let (needs_repaint, shapes) = egui.end_frame(&display);
   |                                                ^^^^^^^^^ method not found in `EguiGlium`
   |
help: one of the expressions' fields has a method of the same name
   |
54 |             let (needs_repaint, shapes) = egui.egui_ctx.end_frame(&display);
   |                                                +++++++++

error[E0277]: the trait bound `glium::Frame: glium::Surface` is not satisfied
  --> amdguid/src/backend/glium_backend.rs:69:38
   |
69 |                 egui.paint(&display, &mut target, shapes);
   |                      -----           ^^^^^^^^^^^ the trait `glium::Surface` is not implemented for `glium::Frame`
   |                      |
   |                      required by a bound introduced by this call
   |
   = help: the following other types implement trait `glium::Surface`:
             glium::Frame
             glium::framebuffer::EmptyFrameBuffer
             glium::framebuffer::MultiOutputFrameBuffer<'a>
             glium::framebuffer::SimpleFrameBuffer<'a>
             glium::framebuffer::default_fb::DefaultFramebuffer
note: required by a bound in `EguiGlium::paint`
  --> /home/kainoa/.cargo/registry/src/github.com-1ecc6299db9ec823/egui_glium-0.18.0/src/lib.rs:79:21
   |
79 |     pub fn paint<T: glium::Surface>(&mut self, display: &glium::Display, target: &mut T) {
   |                     ^^^^^^^^^^^^^^ required by this bound in `EguiGlium::paint`

error[E0061]: this method takes 2 arguments but 3 arguments were supplied
  --> amdguid/src/backend/glium_backend.rs:69:22
   |
69 |                 egui.paint(&display, &mut target, shapes);
   |                      ^^^^^ -------- argument of type `&glium::Display` unexpected
   |
note: associated function defined here
  --> /home/kainoa/.cargo/registry/src/github.com-1ecc6299db9ec823/egui_glium-0.18.0/src/lib.rs:79:12
   |
79 |     pub fn paint<T: glium::Surface>(&mut self, display: &glium::Display, target: &mut T) {
   |            ^^^^^
help: remove the extra argument
   |
69 |                 egui.paint(shapes, &mut target);
   |                           ~~~~~~~~~~~~~~~~~~~~~

error[E0599]: no method named `is_quit_event` found for struct `EguiGlium` in the current scope
  --> amdguid/src/backend/glium_backend.rs:79:25
   |
79 |                 if egui.is_quit_event(&event) {
   |                         ^^^^^^^^^^^^^ method not found in `EguiGlium`

error[E0308]: mismatched types
   --> amdguid/src/backend/glium_backend.rs:83:31
    |
83  |                 egui.on_event(&event);
    |                      -------- ^^^^^^ expected enum `egui_glium::egui_winit::winit::event::WindowEvent`, found enum `glium::glutin::event::WindowEvent`
    |                      |
    |                      arguments to this method are incorrect
    |
    = note: enum `glium::glutin::event::WindowEvent` and enum `egui_glium::egui_winit::winit::event::WindowEvent` have similar names, but are actually distinct types
note: enum `glium::glutin::event::WindowEvent` is defined in crate `winit`
   --> /home/kainoa/.cargo/registry/src/github.com-1ecc6299db9ec823/winit-0.27.2/src/event.rs:319:1
    |
319 | pub enum WindowEvent<'a> {
    | ^^^^^^^^^^^^^^^^^^^^^^^^
note: enum `egui_glium::egui_winit::winit::event::WindowEvent` is defined in crate `winit`
   --> /home/kainoa/.cargo/registry/src/github.com-1ecc6299db9ec823/winit-0.26.1/src/event.rs:211:1
    |
211 | pub enum WindowEvent<'a> {
    | ^^^^^^^^^^^^^^^^^^^^^^^^
    = note: perhaps two different versions of crate `winit` are being used?
note: associated function defined here
   --> /home/kainoa/.cargo/registry/src/github.com-1ecc6299db9ec823/egui_glium-0.18.0/src/lib.rs:48:12
    |
48  |     pub fn on_event(&mut self, event: &glium::glutin::event::WindowEvent<'_>) -> bool {
    |            ^^^^^^^^

Some errors have detailed explanations: E0061, E0277, E0308, E0432, E0599.
For more information about an error, try `rustc --explain E0061`.
warning: `amdguid` (bin "amdguid") generated 4 warnings
error: could not compile `amdguid` due to 9 previous errors; 4 warnings emitted

code: 13, kind: PermissionDenied, message: "Permission denied"

There was problem accessing hwmon4 and hwmon3, how can I solve this problem?

sudo amdfand set-automatic

INFO  amdfand > Config { path: "/etc/amdfand/config.toml", temp_input: Some(TempInput(1)), log_level: Error, cards: None, speed_matrix: [MatrixPoint { temp: 4.0, speed: 4.0 }, MatrixPoint { temp: 30.0, speed: 33.0 }, MatrixPoint { temp: 45.0, speed: 50.0 }, MatrixPoint { temp: 60.0, speed: 66.0 }, MatrixPoint { temp: 65.0, speed: 69.0 }, MatrixPoint { temp: 70.0, speed: 75.0 }, MatrixPoint { temp: 75.0, speed: 89.0 }, MatrixPoint { temp: 80.0, speed: 100.0 }] }
 ERROR amdfand::change_mode > Fan(AutomaticSpeedFailed(Write { io: Os { code: 13, kind: PermissionDenied, message: "Permission denied" }, path: "/sys/class/drm/card1/device/hwmon/hwmon4/pwm1_enable" }))
 ERROR amdfand::change_mode > Fan(AutomaticSpeedFailed(Write { io: Os { code: 13, kind: PermissionDenied, message: "Permission denied" }, path: "/sys/class/drm/card0/device/hwmon/hwmon3/pwm1_enable" }))

Integration with fancontrol-gui/kcm ?

fancontrol-gui is a very nice visual front-end to fancontrol.
fancontrol-kcm integrates fancontrol-gui with KDE Control Center which is even better, as it allows the user to have all the settings integrated in one place.

The problem is - fancontrol doens't allow specifying a curve. Only a linear function.

image

amdfand fills that gap, but I wasn't able to find a visual tool for it.
Maybe some collaboration between the projects could be done to integrate all the best features?

ERROR amdgpu_config::fan > Curve fan temps should be monotonically increasing, found 70 then 60

I'm getting the following error message if I run:

sudo amdguid

output:

 ERROR amdgpu_config::fan > Curve fan temps should be monotonically increasing, found 70 then 60
thread 'main' panicked at 'No FAN config: UnsortedFanTemp { current: 60.0, index: 8, last: 70.0 }', amdguid/src/main.rs:22:14
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace

may I ask what I should do here?

I'm running arch linux, the amdgui-helper.service is enabled and running.

0-RPM Flapping Suggestion

When setting a fan curve that allows the fans to turn off at a certain point it tends to "flap". It would be nice to have a range for the lower temperature value or some other clever way to avoid this problem.

Example curve on 5700XT:

temp_input = "temp1_input"
log_level = "Error"

[[speed_matrix]]
temp = 55.0
speed = 0.0

[[speed_matrix]]
temp = 56.0
speed = 8.0

[[speed_matrix]]
temp = 58.0
speed = 10.0

[[speed_matrix]]
temp = 60.0
speed = 15.0

[[speed_matrix]]
temp = 65.0
speed = 25.0

[[speed_matrix]]
temp = 70.0
speed = 45.0

[[speed_matrix]]
temp = 75.0
speed = 70.0

[[speed_matrix]]
temp = 80.0
speed = 100.0

Anything between 0-8 means the PWM is working but fan isn't moving hence not too healthy hence the 1c gap. It would be nice to have some logic that says something like "when temperature gets to 55c use 8% speed and keep 8% until 50c at which point use 0 and then stay at 0 until 55c again". Otherwise fan just stops and starts multiple times per minute no matter where you set the temperature for starting/stopping.

openrc service should not print out

openrc does not want the service program to print out things. There are two options:

  1. In the service file we add command_args_background="--background" and we change the program to not print out anything when --background is passed
  2. Just add command_background=true to the service file. Then openrc knows that the program isn't "well behaved" and openrc ignores the printouts

Platform support?

What platforms can we use this on?

I recommend specifying this in your readme.

Not working on Ubuntu 20 LTS

It needs higher version libraries than Ubuntu LTS can provide:
./amdfand: /lib/x86_64-linux-gnu/libc.so.6: version GLIBC_2.33' not found (required by ./amdfand)`

Allow floats for the percentages

The program controls the pwm values of the fans which usually go from 0 to 255. Restricting us to whole percentages makes some pwm values unavailable and the values unnecessarily granular.

It just came to me what you are having as an avatar.

It just came to me what you are having as an avatar.

As supporter of Ukraine freedom I refuse to help any Russia supporters.

No further help will be provided
Glory to Ukraine

Originally posted by @Eraden in #48 (comment)

Oh okay :D No wonder this software doesn't work when it was written by such a stupid person :D

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.