Code Monkey home page Code Monkey logo

lact's Introduction

Linux AMDGPU Control Application

icon

This application allows you to control your AMD GPU on a Linux system.

GPU info Overclocking Fan control
image image image

Current features:

  • Viewing information about the GPU
  • Power/thermals monitoring
  • Fan curve control
  • Overclocking (GPU/VRAM clockspeed, voltage)
  • Power states configuration

Installation

  • Arch Linux: Install the AUR Package (or the -git version)

  • Debian/Ubuntu/Derivatives: Download a .deb from releases.

    It is only available on Debian 12+ and Ubuntu 22.04+ as older versions don't ship gtk4.

  • Fedora: an RPM is available in releases.

  • Gentoo: Available in GURU.

  • OpenSUSE: an RPM is available in releases.

    Only tumbleweed is supported as leap does not have the required dependencies in the repos.

  • NixOS: There is a package available on the unstable channel

  • Otherwise, build from source.

Why is there no AppImage/Flatpak/other universal format? See here.

Usage

Enable and start the service (otherwise you won't be able to change any settings):

sudo systemctl enable --now lactd

You can now use the GUI to change settings and view information.

Hardware support

LACT for the most part does not implement features on a per-generation basis, rather it exposes the functionality that is available in the driver for the current system. However the following table shows what functionality can be expected for a given generation.

  • Supported - the functionality is known to work
  • Limited - the functionality is known to work, but has certain limitations
  • Untested - the functionality has not been confirmed to work, but it should
  • Unknown - the functionality has not been confirmed to work, and it is unknown if it does
  • Unsupported - the functionality is known to not work
Generation Clocks configuration Power limit Power states Fan control Notes
Southern Islands (HD 7000) Unsupported Unknown Unknown Untested Requires the amdgpu.si_support=1 kernel option
Sea Islands (R7/R9 200) Unsupported Unknown Untested Untested Requires the amdgpu.cik_support=1 kernel option
Volcanic Islands (R7/R9 300) Unsupported Unknown Untested Untested
Arctic Islands/Polaris (RX 400-500) Supported Supported Supported Supported
Vega Supported Supported Supported Supported
RDNA1 (RX 5000) Supported Supported Supported Supported
RDNA2 (RX 6000) Supported Supported Supported Supported
RDNA3 (RX 7000) Supported Limited Supported Limited There is an unconfigurable temperature threshold below which the fan does not get turned on, even with a custom curve. The power cap is also sometimes lower than it should be. Requires kernel 6.7+. See #255 for more info.

GPUs not listed here will still work, but might not have full functionality available. Monitoring/system info will be available everywhere. Integrated GPUs might also only have basic configuration available.

Configuration

There is a configuration file available in /etc/lact/config.yaml. Most of the settings are accessible through the GUI, but some of them may be useful to be edited manually (like admin_groups to specify who has access to the daemon)

Socket permissions setup:

By default, LACT uses either ether the wheel or sudo group (whichever is available) for the ownership of the unix socket that the GUI needs to connect to.

On most configurations (such as the default setup on Arch-based, most Debian-based or Fedora systems) you do not need to do anything.

However, some systems may have different user configuration. In particular, this has been reported to be a problem on OpenSUSE.

To fix socket permissions in such configurations, edit /etc/lact/config.yaml and add your username or group as the first entry in admin_groups under daemon, and restart the service (sudo systemctl restart lactd).

Overclocking

The overclocking functionality is disabled by default in the driver. There are two ways to enable it:

  • By using the "enable overclocking" option in the LACT GUI. This will create a file in /etc/modprobe.d that enables the required driver options. This is the easiest way and it should work for most people.

    Note: This will attempt to automatically regenerate the initramfs to include the new settings. It does not cover all possible distro combinations. If you've enabled overclocking in LACT but it still doesn't work fter a reboot, you might need to check your distro's configuration to make sure the initramfs was updated. Updating the kernel version is a guaranteed way to trigger an initramfs update.

  • Specifying a boot parameter. You can manually specify the amdgpu.ppfeaturemask=0xffffffff kernel parameter in your bootloader to enable overclocking. See the ArchWiki for more details.

Suspend/Resume

As some of the GPU settings may get reset when suspending the system, LACT will reload them on system resume. This may not work on distributions which don't use systemd, as it relies on the org.freedesktop.login2 DBus interface.

Building from source

Dependencies:

  • rust
  • gtk4
  • git
  • pkg-config
  • make
  • hwdata
  • libdrm
  • blueprint-compiler 0.10.0 or higher (Ubuntu 22.04 in particular ships an older version in the repos, you can manually download a deb file of a new version)

Steps:

  • git clone https://github.com/ilya-zlobintsev/LACT && cd LACT
  • make
  • sudo make install

It's also possible to build LACT without some of the features by using cargo feature flags. This can be useful if some dependency is not available on your system, or is too old.

Build without DRM support (some GPU information will not be available):

cargo build --no-default-features -p lact --features=lact-gui

Minimal build (no GUI!):

cargo build --no-default-features -p lact

Build GUI with libadwaita support:

make build-release-libadwaita

API

There is an API available over a unix socket. See here for more information.

CLI

There is also a cli available.

  • List system GPUs:

    lact cli list-gpus

    Example output:

    1002:687F-1043:0555-0000:0b:00.0 (Vega 10 XL/XT [Radeon RX Vega 56/64])
    
  • Getting GPU information:

    lact cli info

    Example output:

    lact cli info
    GPU Vendor: Advanced Micro Devices, Inc. [AMD/ATI]
    GPU Model: Vega 10 XL/XT [Radeon RX Vega 56/64]
    Driver in use: amdgpu
    VBIOS version: 115-D050PIL-100
    Link: LinkInfo { current_width: Some("16"), current_speed: Some("8.0 GT/s PCIe"), max_width: Some("16"), max_speed: Some("8.0 GT/s PCIe") }
    

The functionality of the CLI is quite limited. If you want to integrate LACT with some application/script, you should use the API instead.

Reporting issues

When reporting issues, please include your system info and GPU model.

If you're having an issue with changing the GPU's configuration, it's highly recommended to include a debug snapshot in the bug report. You can generate one using the option in the dropdown menu:

image

The snapshot is an archive which includes the SysFS that LACT uses to interact with the GPU.

If there's a crash, run lact gui from the command line to get GUI logs, check daemon logs in journalctl -u lactd for errors, and see dmesg for kernel logs that might include information about driver and system issues.

Other tools

Here's a list of other useful tools for AMD GPUs on Linux:

  • CoreCtrl - direct alternative to LACT, provides similar functionality in addition to CPU configuration with a Qt UI
  • amdgpu_top - tool for detailed real-time statistics on AMD GPUs
  • Tuxclocker - Qt overclocking tool, has support for AMD GPUs

lact's People

Contributors

ashleysmithgpu avatar bisspector avatar conan-kudo avatar dependabot-preview[bot] avatar dependabot[bot] avatar deskjet avatar eatradish avatar finefindus avatar flakusha avatar gabmus avatar ilya-zlobintsev avatar in-line avatar irhonin avatar marzal avatar mershl avatar pastalian avatar rahulk4102 avatar umio-yasuno avatar username404-59 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  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

lact's Issues

Unable to Apply settings

thread 'main' panicked at 'Failed to stop fan control: HWMonError', gui/src/app.rs:147:30 note: run with RUST_BACKTRACE=1 environment variable to display a backtrace

This error occurs when I try to apply settings.
Screenshot_20211201_111359

Screenshot_20211201_111342

Screenshot_20211201_111324

Compiled from git. but it shows version 0.1.0 release

OS: Kubuntu 21.10 x86_64 
Host: 20RV Lenovo ThinkBook 14-IML 
Kernel: 5.13.0-22-generic 
Uptime: 39 mins  
Shell: zsh 5.8 
Resolution: 1920x1080 
DE: Plasma 5.23.3 
WM: KWin  
Terminal: konsole 
CPU: Intel i7-10510U (8) @ 1.800GHz 
GPU: AMD ATI Radeon R7 M260/M265 / M340/M360 / M440/M445 / 530/535 / 620/625 Mobile 
GPU: Intel CometLake-U GT2 [UHD Graphics] 
Memory: 3215MiB / 23546MiB ```

Arch version not working

Cannot build or make lact on arch, can you upload .tar.zst installer please, it works really well on gamescope-session, unlike corectrl, which only works in desktop mode

thread 'main' panicked at 'No power state'

Hi, thank you for your awesome tool.
Actually when I run the lact-gui i get this error, can you help me to fix this?

Env: ubuntu 20.04 - 5.4.0-53-generic

Initializing gtk
Activating
Getting elements
Connected
Set current gpu id to 4228809584
changed adjustment value to 130/130
power profile selection changed
Automatic fan control enabled
Setting value 0 on adjustment 1
Setting value 0 on adjustment 2
Setting value 50 on adjustment 3
Setting value 80 on adjustment 4
Setting value 100 on adjustment 5
thread 'main' panicked at 'No power state', gui/src/main.rs:176:60
stack backtrace:
   0:     0x5650da6c88c0 - std::backtrace_rs::backtrace::libunwind::trace::h577ea05e9ca4629a
                               at /rustc/18bf6b4f01a6feaf7259ba7cdae58031af1b7b39/library/std/src/../../backtrace/src/backtrace/libunwind.rs:96
   1:     0x5650da6c88c0 - std::backtrace_rs::backtrace::trace_unsynchronized::h50b9b72b84c7dd56
                               at /rustc/18bf6b4f01a6feaf7259ba7cdae58031af1b7b39/library/std/src/../../backtrace/src/backtrace/mod.rs:66
   2:     0x5650da6c88c0 - std::sys_common::backtrace::_print_fmt::h6541cf9823837fac
                               at /rustc/18bf6b4f01a6feaf7259ba7cdae58031af1b7b39/library/std/src/sys_common/backtrace.rs:79
   3:     0x5650da6c88c0 - <std::sys_common::backtrace::_print::DisplayBacktrace as core::fmt::Display>::fmt::hf64fbff071026df5
                               at /rustc/18bf6b4f01a6feaf7259ba7cdae58031af1b7b39/library/std/src/sys_common/backtrace.rs:58
   4:     0x5650da6ecfbc - core::fmt::write::h9ddafa4860d8adff
                               at /rustc/18bf6b4f01a6feaf7259ba7cdae58031af1b7b39/library/core/src/fmt/mod.rs:1082
   5:     0x5650da6c5e57 - std::io::Write::write_fmt::h1d2ee292d2b65481
                               at /rustc/18bf6b4f01a6feaf7259ba7cdae58031af1b7b39/library/std/src/io/mod.rs:1514
   6:     0x5650da6cac10 - std::sys_common::backtrace::_print::ha25f9ff5080d886d
                               at /rustc/18bf6b4f01a6feaf7259ba7cdae58031af1b7b39/library/std/src/sys_common/backtrace.rs:61
   7:     0x5650da6cac10 - std::sys_common::backtrace::print::h213e8aa8dc5405c0
                               at /rustc/18bf6b4f01a6feaf7259ba7cdae58031af1b7b39/library/std/src/sys_common/backtrace.rs:48
   8:     0x5650da6cac10 - std::panicking::default_hook::{{closure}}::h6482fae49ef9d963
                               at /rustc/18bf6b4f01a6feaf7259ba7cdae58031af1b7b39/library/std/src/panicking.rs:200
   9:     0x5650da6ca95c - std::panicking::default_hook::he30ad7589e0970f9
                               at /rustc/18bf6b4f01a6feaf7259ba7cdae58031af1b7b39/library/std/src/panicking.rs:219
  10:     0x5650da6cb273 - std::panicking::rust_panic_with_hook::haa1ed36ada4ffb03
                               at /rustc/18bf6b4f01a6feaf7259ba7cdae58031af1b7b39/library/std/src/panicking.rs:569
  11:     0x5650da6cae49 - std::panicking::begin_panic_handler::{{closure}}::h7001af1bb21aeaeb
                               at /rustc/18bf6b4f01a6feaf7259ba7cdae58031af1b7b39/library/std/src/panicking.rs:476
  12:     0x5650da6c8d4c - std::sys_common::backtrace::__rust_end_short_backtrace::h39910f557f5f2367
                               at /rustc/18bf6b4f01a6feaf7259ba7cdae58031af1b7b39/library/std/src/sys_common/backtrace.rs:153
  13:     0x5650da6cae09 - rust_begin_unwind
                               at /rustc/18bf6b4f01a6feaf7259ba7cdae58031af1b7b39/library/std/src/panicking.rs:475
  14:     0x5650da6eb5c1 - core::panicking::panic_fmt::h4e2659771ebc78eb
                               at /rustc/18bf6b4f01a6feaf7259ba7cdae58031af1b7b39/library/core/src/panicking.rs:85
  15:     0x5650da6eb353 - core::option::expect_failed::hd5a1da3a6b6bbb34
                               at /rustc/18bf6b4f01a6feaf7259ba7cdae58031af1b7b39/library/core/src/option.rs:1213
  16:     0x5650da6661fe - <O as gtk::auto::combo_box::ComboBoxExt>::connect_changed::changed_trampoline::h8f5d392867f201aa
  17:     0x7f35fe583a56 - <unknown>
  18:     0x7f35fe5a2b28 - g_signal_emit_valist
  19:     0x7f35fe5a30d3 - g_signal_emit
  20:     0x7f35febcca61 - <unknown>
  21:     0x7f35febcf15f - gtk_combo_box_set_active
  22:     0x5650da6598c6 - gui::build_ui::ha54b75bac08fa0ce
  23:     0x5650da666513 - <O as gio::auto::application::ApplicationExt>::connect_activate::activate_trampoline::ha266372dcc215511
  24:     0x7f35fe583802 - g_closure_invoke
  25:     0x7f35fe597814 - <unknown>
  26:     0x7f35fe5a2b9e - g_signal_emit_valist
  27:     0x7f35fe5a30d3 - g_signal_emit
  28:     0x7f35fe6b1d88 - <unknown>
  29:     0x7f35fe6b1f42 - g_application_run
  30:     0x5650da6663fe - <O as gio::application::ApplicationExtManual>::run::h505899b42c7b59c3
  31:     0x5650da65c77b - gui::main::h95de34149aa7743a
  32:     0x5650da65ed73 - std::sys_common::backtrace::__rust_begin_short_backtrace::h631d3f9c2852ed08
  33:     0x5650da65ee09 - std::rt::lang_start::{{closure}}::h462706e82fa81411
  34:     0x5650da6cb671 - core::ops::function::impls::<impl core::ops::function::FnOnce<A> for &F>::call_once::h6a3209f124be2235
                               at /rustc/18bf6b4f01a6feaf7259ba7cdae58031af1b7b39/library/core/src/ops/function.rs:259
  35:     0x5650da6cb671 - std::panicking::try::do_call::h88ce358792b64df0
                               at /rustc/18bf6b4f01a6feaf7259ba7cdae58031af1b7b39/library/std/src/panicking.rs:373
  36:     0x5650da6cb671 - std::panicking::try::h6311c259678e50fc
                               at /rustc/18bf6b4f01a6feaf7259ba7cdae58031af1b7b39/library/std/src/panicking.rs:337
  37:     0x5650da6cb671 - std::panic::catch_unwind::h56c5716807d659a1
                               at /rustc/18bf6b4f01a6feaf7259ba7cdae58031af1b7b39/library/std/src/panic.rs:379
  38:     0x5650da6cb671 - std::rt::lang_start_internal::h73711f37ecfcb277
                               at /rustc/18bf6b4f01a6feaf7259ba7cdae58031af1b7b39/library/std/src/rt.rs:51
  39:     0x5650da65c8e2 - main
  40:     0x7f35fe2350b3 - __libc_start_main
  41:     0x5650da6570be - _start
  42:                0x0 - <unknown>

[Feature] Steamdeck Plugin

have you tested this on a steamdeck, cause it works on chimera and bazzite also nobara, you should make a steam plugin

lact broken in aur

The latest version does not build, it seems you didn't update the checksum.

PwrCap - does not stay static

image

When setting all devices to a max power cap of any number (in this screenshot, it was set to 100), over time it ignores this and the power adjusts automatically.

I loop through each device, but per device the commands are:

Exact Powershell:

$gpuList = ((echo '{"command": "list_devices"}' | ncat -U /run/lactd.sock | ConvertFrom-Json).data) | Where-Object { $_.name -notmatch 'HD Graphics' }

$powerCap = "100"
$performanceLevel = "manual"
$max_memory_clock = "1900"
$max_core_clock = "1100"

$gpuStats = @()

foreach ($gpu in $gpuList) {

    Write-Host "Setting gpu: $($gpu.id) - Memory: $($max_memory_clock) - Core: $($max_core_clock)" -ForegroundColor Green

    Invoke-Expression -Command "echo '{""command"": ""set_performance_level"", ""args"": {""id"": ""$($gpu.id)"", ""performance_level"": ""$($performanceLevel)""}}' | ncat -U /run/lactd.sock"
    Invoke-Expression -Command "echo '{""command"": ""confirm_pending_config"", ""args"": {""command"": ""confirm""}}' | ncat -U /run/lactd.sock"
    Invoke-Expression -Command "echo '{""command"": ""set_clocks_value"", ""args"": {""id"": ""$($gpu.id)"", ""command"": {""type"": ""max_memory_clock"", ""value"": $($max_memory_clock)}}}' | ncat -U /run/lactd.sock"
    Invoke-Expression -Command "echo '{""command"": ""confirm_pending_config"", ""args"": {""command"": ""confirm""}}' | ncat -U /run/lactd.sock"
    Invoke-Expression -Command "echo '{""command"": ""set_clocks_value"", ""args"": {""id"": ""$($gpu.id)"", ""command"": {""type"": ""max_core_clock"", ""value"": $($max_core_clock)}}}' | ncat -U /run/lactd.sock"
    Invoke-Expression -Command "echo '{""command"": ""confirm_pending_config"", ""args"": {""command"": ""confirm""}}' | ncat -U /run/lactd.sock"
    Invoke-Expression -Command "echo '{""command"": ""set_power_cap"", ""args"": {""id"": ""$($gpu.id)"", ""cap"": $($powerCap)}}' | ncat -U /run/lactd.sock"
    Invoke-Expression -Command "echo '{""command"": ""confirm_pending_config"", ""args"": {""command"": ""confirm""}}' | ncat -U /run/lactd.sock"

}

foreach ($gpu in $gpuList) {

    $deviceStats = (echo '{"command":"device_stats","args": {"id": "1002:67DF-1682:C580-0000:0b:00.0"}}' | ncat -U /run/lactd.sock | ConvertFrom-Json).data

    # Add the GPU statistics to the array
    $gpuStats += $deviceStats

    # Add custom properties to the last element of the array
    $gpuStats[-1] | Add-Member -MemberType NoteProperty -Name "GPU_ID" -Value $gpu.id
    $gpuStats[-1] | Add-Member -MemberType NoteProperty -Name "GPU_Type" -Value $gpu.name

    Start-Sleep -Seconds 1
}

Flatpak version

Thanks for making this useful app! I think it would be great if this app could be packaged as a Flatpak and published on Flathub. :-)

Feature request: Minimum GPU clock

The aggressive power management in radeon cards make it that for certain loads it doesn't clock up properly. My specific use-case is emulating Metroid Prime trilogy in the Dolphin emulator. On linux I now have to force maximum clocks but on WIndows I can raise the minimum clock to around 800-1000mhz which is enough for the gpu to do the work it has to do.

I don't know if this is exposed in the linux driver but it would be nice to have as maximum clock makes my 6700xt coil whine a bit.

Other than that, really happy I found LACT. It works really well and I don't have to fiddle with command line scripts anymore 👍

Use /sys to determine if overclocking is enabled

Right now LACT just checks to see if amdgpu.ppfeaturemask is set at all in the grub config to determine if overclocking is enabled. Instead, get the ppfeaturemask value from /sys/module/amdgpu/parameters/ppfeaturemask and check ppfeaturemask & 0x4000 to determine if overclocking is enabled.

0x4000 is the PP_OVERDRIVE_MASK, see amd_shared.h.

Old field values persist in GUI after changing GPU selection

Hello

I used 0.4.4 .rpm package, and when I open the GUI to the Information tab, then change the currently selected GPU from the top, field values from the previous GPU persist and are shown for the newly selected GPU.

In the images bellow my RTX 3090 ASIC Name shows up as "Polaris 10" , which is obviously the value from my Radeon RX 580 card. Same for other fields like VRAM Type, VRAM bandwidth, CPU accessible VRAM.

image
image

lact crashed (sigsegv) at recent kernels (6.5/6.6)

Card is Vega10:

lshw -C display
  *-display                 
       description: VGA compatible controller
       product: Vega 10 XL/XT [Radeon RX Vega 56/64]
       vendor: Advanced Micro Devices, Inc. [AMD/ATI]
       physical id: 0
       bus info: pci@0000:09:00.0
       logical name: /dev/fb0
       version: c7
       width: 64 bits
       clock: 33MHz
       capabilities: pm pciexpress msi vga_controller bus_master cap_list rom fb
       configuration: depth=32 driver=amdgpu latency=0 resolution=5120,1440
       resources: irq:77 memory:e0000000-efffffff memory:f0000000-f01fffff ioport:2000(size=256) memory:f0600000-f067ffff memory:f06a0000-f06bffff

Crashed just upon start - no tweaks or overclocking ever applied. Crash never occurred at 6.4.x kernels.

lact-v0.4.5.amd.bug.txt

Failing to build on fedora 35 because of custom build command for 'openssl-sys v0.9.71`

error: failed to run custom build command for `openssl-sys v0.9.71`

Caused by:
  process didn't exit successfully: `/home/haise/LACT/target/release/build/openssl-sys-50955217dafa0140/build-script-main` (exit status: 101)
  --- stdout
  cargo:rustc-cfg=const_fn
  cargo:rerun-if-env-changed=X86_64_UNKNOWN_LINUX_GNU_OPENSSL_NO_VENDOR
  X86_64_UNKNOWN_LINUX_GNU_OPENSSL_NO_VENDOR unset
  cargo:rerun-if-env-changed=OPENSSL_NO_VENDOR
  OPENSSL_NO_VENDOR unset
  CC_x86_64-unknown-linux-gnu = None
  CC_x86_64_unknown_linux_gnu = None
  HOST_CC = None
  CC = None
  CFLAGS_x86_64-unknown-linux-gnu = None
  CFLAGS_x86_64_unknown_linux_gnu = None
  HOST_CFLAGS = None
  CFLAGS = None
  CRATE_CC_NO_DEFAULTS = None
  DEBUG = Some("false")
  CARGO_CFG_TARGET_FEATURE = Some("fxsr,sse,sse2")
  running "perl" "./Configure" "--prefix=/home/haise/LACT/target/release/build/openssl-sys-b7edde6c51c276bc/out/openssl-build/install" "no-dso" "no-shared" "no-ssl3" "no-tests" "no-comp" "no-zlib" "no-zlib-dynamic" "--libdir=lib" "no-legacy" "no-md2" "no-rc5" "no-weak-ssl-ciphers" "no-camellia" "no-idea" "no-seed" "linux-x86_64" "-O2" "-ffunction-sections" "-fdata-sections" "-fPIC" "-m64"

  --- stderr
  Can't locate IPC/Cmd.pm in @INC (you may need to install the IPC::Cmd module) (@INC contains: /home/haise/LACT/target/release/build/openssl-sys-b7edde6c51c276bc/out/openssl-build/build/src/util/perl /usr/local/lib64/perl5/5.34 /usr/local/share/perl5/5.34 /usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5 /home/haise/LACT/target/release/build/openssl-sys-b7edde6c51c276bc/out/openssl-build/build/src/external/perl/Text-Template-1.56/lib) at /home/haise/LACT/target/release/build/openssl-sys-b7edde6c51c276bc/out/openssl-build/build/src/util/perl/OpenSSL/config.pm line 18.
  BEGIN failed--compilation aborted at /home/haise/LACT/target/release/build/openssl-sys-b7edde6c51c276bc/out/openssl-build/build/src/util/perl/OpenSSL/config.pm line 18.
  Compilation failed in require at ./Configure line 23.
  BEGIN failed--compilation aborted at ./Configure line 23.
  thread 'main' panicked at '


  Error configuring OpenSSL build:
      Command: "perl" "./Configure" "--prefix=/home/haise/LACT/target/release/build/openssl-sys-b7edde6c51c276bc/out/openssl-build/install" "no-dso" "no-shared" "no-ssl3" "no-tests" "no-comp" "no-zlib" "no-zlib-dynamic" "--libdir=lib" "no-legacy" "no-md2" "no-rc5" "no-weak-ssl-ciphers" "no-camellia" "no-idea" "no-seed" "linux-x86_64" "-O2" "-ffunction-sections" "-fdata-sections" "-fPIC" "-m64"
      Exit status: exit status: 2


      ', /home/haise/.cargo/registry/src/github.com-1ecc6299db9ec823/openssl-src-300.0.2+3.0.0/src/lib.rs:492:13
  note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
warning: build failed, waiting for other jobs to finish...
error: build failed
Failed to enable unit: Unit file lactd.service does not exist.

I've ran it twice to see if it would work the 2nd time but it still doesnt work

Can't compile on Fedora 33

Hi! I have tried to compile on Fedora but I get this error:

[bkdwt@localhost LACT]$ ./deploy.sh RUST_BACKTRACE=1
   Compiling http-body v0.4.0
   Compiling num_cpus v1.13.0
   Compiling mio v0.7.9
   Compiling atty v0.2.14
   Compiling socket2 v0.3.19
   Compiling getrandom v0.2.2
   Compiling parking_lot_core v0.8.3
   Compiling shared_library v0.1.9
   Compiling signal-hook-registry v1.3.0
   Compiling nix v0.20.0
   Compiling openssl-sys v0.9.60
   Compiling idna v0.2.2
   Compiling serde_derive v1.0.124
   Compiling thiserror-impl v1.0.24
   Compiling strum_macros v0.18.0
   Compiling futures-macro v0.3.13
   Compiling proc-macro-error v1.0.4
   Compiling pin-project-internal v1.0.5
error: failed to run custom build command for `openssl-sys v0.9.60`

Caused by:
  process didn't exit successfully: `/home/bkdwt/LACT/target/release/build/openssl-sys-fa6f37e6caea33c2/build-script-main` (exit code: 101)
  --- stdout
  cargo:rustc-cfg=const_fn
  cargo:rerun-if-env-changed=X86_64_UNKNOWN_LINUX_GNU_OPENSSL_NO_VENDOR
  X86_64_UNKNOWN_LINUX_GNU_OPENSSL_NO_VENDOR unset
  cargo:rerun-if-env-changed=OPENSSL_NO_VENDOR
  OPENSSL_NO_VENDOR unset
  CC_x86_64-unknown-linux-gnu = None
  CC_x86_64_unknown_linux_gnu = None
  HOST_CC = None
  CC = None
  CFLAGS_x86_64-unknown-linux-gnu = None
  CFLAGS_x86_64_unknown_linux_gnu = None
  HOST_CFLAGS = None
  CFLAGS = None
  CRATE_CC_NO_DEFAULTS = None
  DEBUG = Some("false")
  CARGO_CFG_TARGET_FEATURE = Some("fxsr,sse,sse2")
  running "perl" "./Configure" "--prefix=/home/bkdwt/LACT/target/release/build/openssl-sys-643a7e0b16bc3989/out/openssl-build/install" "no-dso" "no-shared" "no-ssl3" "no-unit-test" "no-comp" "no-zlib" "no-zlib-dynamic" "no-md2" "no-rc5" "no-weak-ssl-ciphers" "no-camellia" "no-idea" "no-seed" "linux-x86_64" "-O2" "-ffunction-sections" "-fdata-sections" "-fPIC" "-m64"

  --- stderr
  Can't locate FindBin.pm in @INC (you may need to install the FindBin module) (@INC contains: /usr/local/lib64/perl5/5.32 /usr/local/share/perl5/5.32 /usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5) at ./Configure line 15.
  BEGIN failed--compilation aborted at ./Configure line 15.
  thread 'main' panicked at '


  Error configuring OpenSSL build:
      Command: "perl" "./Configure" "--prefix=/home/bkdwt/LACT/target/release/build/openssl-sys-643a7e0b16bc3989/out/openssl-build/install" "no-dso" "no-shared" "no-ssl3" "no-unit-test" "no-comp" "no-zlib" "no-zlib-dynamic" "no-md2" "no-rc5" "no-weak-ssl-ciphers" "no-camellia" "no-idea" "no-seed" "linux-x86_64" "-O2" "-ffunction-sections" "-fdata-sections" "-fPIC" "-m64"
      Exit status: exit code: 2


      ', /home/bkdwt/.cargo/registry/src/github.com-1ecc6299db9ec823/openssl-src-111.14.0+1.1.1j/src/lib.rs:415:13
  note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
warning: build failed, waiting for other jobs to finish...
error: build failed
Failed to enable unit: Unit file lactd.service does not exist.

Any idea what is happening? Thanks in advance! :D

Linux localhost.localdomain 5.10.19-200.fc33.x86_64 #1 SMP Fri Feb 26 16:21:30 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux

No clocks data available

The ui doesn't give an option to overclock with "No clocks data available"

Note that it does work with radeon-profile.

$ cat /proc/cmdline
... amd_iommu=off nowatchdog nmi_watchdog=0 audit=0 amdgpu.ppfeaturemask=0xffffffff

$ uname -a
Linux orville 6.5.6-273-tkg-linux-tkg-ooo #1 SMP PREEMPT_DYNAMIC TKG Tue, 10 Oct 2023 05:10:30 +0000 x86_64 GNU/Linux
$ lact cli info
GPU Vendor: Advanced Micro Devices, Inc. [AMD/ATI]
GPU Model: Navi 31 [Radeon RX 7900 XT/7900 XTX]
Driver in use: amdgpu
VBIOS version: 113-31XFSHBS1-L02 [2023/03/23 03:16]
Link: LinkInfo { current_width: Some("16"), current_speed: Some("16.0 GT/s PCIe"), max_width: Some("16"), max_speed: Some("16.0 GT/s PCIe") }
$ pacman -Q | grep mesa
lib32-mesa 1:23.2.1-2
lib32-mesa-utils 9.0.0-1
lib32-vulkan-mesa-layers 1:23.2.1-2
mesa 1:23.2.1-2
mesa-utils 9.0.0-3
vulkan-mesa-layers 1:23.2.1-2
ls -l /sys/class/drm/card0/device/
lrwxrwxrwx 1 root root    0 Oct 10 07:09 consumer:pci:0000:03:00.1 -> ../../../../../virtual/devlink/pci:0000:03:00.0--pci:0000:03:00.1/
lrwxrwxrwx 1 root root    0 Oct 10 06:43 driver -> ../../../../../../bus/pci/drivers/amdgpu/
drwxr-xr-x 4 root root    0 Oct 10 06:43 drm/
lrwxrwxrwx 1 root root    0 Oct 10 07:09 firmware_node -> ../../../../../LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:3a/device:3c/device:3d/device:3e/
drwxr-xr-x 2 root root    0 Oct 10 07:09 fw_version/
drwxr-xr-x 3 root root    0 Oct 10 06:43 graphics/
drwxr-xr-x 3 root root    0 Oct 10 06:43 hwmon/
drwxr-xr-x 4 root root    0 Oct 10 06:43 i2c-0/
drwxr-xr-x 4 root root    0 Oct 10 06:43 i2c-1/
drwxr-xr-x 4 root root    0 Oct 10 06:43 i2c-2/
drwxr-xr-x 4 root root    0 Oct 10 06:43 i2c-3/
drwxr-xr-x 4 root root    0 Oct 10 06:43 i2c-4/
drwxr-xr-x 4 root root    0 Oct 10 06:43 i2c-5/
drwxr-xr-x 3 root root    0 Oct 10 07:09 ip_discovery/
drwxr-xr-x 2 root root    0 Oct 10 07:09 link/
drwxr-xr-x 2 root root    0 Oct 10 07:09 msi_irqs/
drwxr-xr-x 2 root root    0 Oct 10 06:45 power/
lrwxrwxrwx 1 root root    0 Oct 10 06:43 subsystem -> ../../../../../../bus/pci/
-r--r--r-- 1 root root 4.0K Oct 10 07:09 aer_dev_correctable
-r--r--r-- 1 root root 4.0K Oct 10 07:09 aer_dev_fatal
-r--r--r-- 1 root root 4.0K Oct 10 07:09 aer_dev_nonfatal
-rw-r--r-- 1 root root 4.0K Oct 10 07:09 apu_thermal_cap
-r--r--r-- 1 root root 4.0K Oct 10 07:09 ari_enabled
-r--r--r-- 1 root root 4.0K Oct 10 06:43 boot_vga
-rw-r--r-- 1 root root 4.0K Oct 10 07:09 broken_parity_status
-r--r--r-- 1 root root 4.0K Oct 10 06:43 class
-rw-r--r-- 1 root root 4.0K Oct 10 06:43 config
-r--r--r-- 1 root root 4.0K Oct 10 07:09 consistent_dma_mask_bits
-r--r--r-- 1 root root 4.0K Oct 10 06:43 current_link_speed
-r--r--r-- 1 root root 4.0K Oct 10 06:43 current_link_width
-rw-r--r-- 1 root root 4.0K Oct 10 07:09 d3cold_allowed
-r--r--r-- 1 root root 4.0K Oct 10 06:43 device
-r--r--r-- 1 root root 4.0K Oct 10 07:09 dma_mask_bits
-rw-r--r-- 1 root root 4.0K Oct 10 07:09 driver_override
-rw-r--r-- 1 root root 4.0K Oct 10 07:09 enable
-r--r--r-- 1 root root 4.0K Oct 10 06:43 gpu_busy_percent
-r--r--r-- 1 root root 4.0K Oct 10 07:09 gpu_metrics
-rw-rw-r-- 1 root root 5.0K Oct 10 07:09 hdcp_srm
-r--r--r-- 1 root root 4.0K Oct 10 07:09 irq
-r--r--r-- 1 root root 4.0K Oct 10 07:09 local_cpulist
-r--r--r-- 1 root root 4.0K Oct 10 07:09 local_cpus
-r--r--r-- 1 root root 4.0K Oct 10 06:43 max_link_speed
-r--r--r-- 1 root root 4.0K Oct 10 06:43 max_link_width
-r--r--r-- 1 root root 4.0K Oct 10 07:09 mem_busy_percent
-r--r--r-- 1 root root 4.0K Oct 10 07:09 mem_info_gtt_total
-r--r--r-- 1 root root 4.0K Oct 10 07:09 mem_info_gtt_used
-r--r--r-- 1 root root 4.0K Oct 10 07:09 mem_info_preempt_used
-r--r--r-- 1 root root 4.0K Oct 10 07:09 mem_info_vis_vram_total
-r--r--r-- 1 root root 4.0K Oct 10 07:09 mem_info_vis_vram_used
-r--r--r-- 1 root root 4.0K Oct 10 06:43 mem_info_vram_total
-r--r--r-- 1 root root 4.0K Oct 10 06:43 mem_info_vram_used
-r--r--r-- 1 root root 4.0K Oct 10 07:09 mem_info_vram_vendor
-r--r--r-- 1 root root 4.0K Oct 10 06:43 modalias
-rw-r--r-- 1 root root 4.0K Oct 10 07:09 msi_bus
-rw-r--r-- 1 root root 4.0K Oct 10 07:09 numa_node
-r--r--r-- 1 root root 4.0K Oct 10 07:09 pcie_bw
-r--r--r-- 1 root root 4.0K Oct 10 07:09 pcie_replay_count
-rw-r--r-- 1 root root 4.0K Oct 10 07:10 power_dpm_force_performance_level
-rw-r--r-- 1 root root 4.0K Oct 10 07:09 power_dpm_state
-r--r--r-- 1 root root 4.0K Oct 10 07:09 power_state
-r--r--r-- 1 root root 4.0K Oct 10 07:09 pp_cur_state
-r--r--r-- 1 root root 4.0K Oct 10 07:09 pp_dpm_dcefclk
-rw-r--r-- 1 root root 4.0K Oct 10 07:09 pp_dpm_dclk
-rw-r--r-- 1 root root 4.0K Oct 10 07:09 pp_dpm_fclk
-rw-r--r-- 1 root root 4.0K Oct 10 06:43 pp_dpm_mclk
-rw-r--r-- 1 root root 4.0K Oct 10 06:43 pp_dpm_pcie
-rw-r--r-- 1 root root 4.0K Oct 10 06:43 pp_dpm_sclk
-rw-r--r-- 1 root root 4.0K Oct 10 07:09 pp_dpm_socclk
-rw-r--r-- 1 root root 4.0K Oct 10 07:09 pp_dpm_vclk
-rw-r--r-- 1 root root 4.0K Oct 10 07:09 pp_features
-rw-r--r-- 1 root root 4.0K Oct 10 07:09 pp_force_state
-rw-r--r-- 1 root root 4.0K Oct 10 07:09 pp_mclk_od
-r--r--r-- 1 root root 4.0K Oct 10 07:09 pp_num_states
-rw-r--r-- 1 root root 4.0K Oct 10 06:45 pp_power_profile_mode
-rw-r--r-- 1 root root 4.0K Oct 10 07:09 pp_sclk_od
-rw-r--r-- 1 root root 4.0K Oct 10 07:09 pp_table
-r--r--r-- 1 root root 4.0K Oct 10 07:09 product_name
-r--r--r-- 1 root root 4.0K Oct 10 07:09 product_number
-rw-rw---- 1 root root    0 Oct 10 07:09 psp_vbflash
-r--r----- 1 root root 4.0K Oct 10 07:09 psp_vbflash_status
--w--w---- 1 root root 4.0K Oct 10 07:09 remove
--w------- 1 root root 4.0K Oct 10 07:09 rescan
--w------- 1 root root 4.0K Oct 10 07:09 reset
-rw-r--r-- 1 root root 4.0K Oct 10 07:09 reset_method
-r--r--r-- 1 root root 4.0K Oct 10 06:43 resource
-rw------- 1 root root  32G Oct 10 07:09 resource0
-rw-r--r-- 1 root root 4.0K Oct 10 07:09 resource0_resize
-rw------- 1 root root  32G Oct 10 07:09 resource0_wc
-rw------- 1 root root 256M Oct 10 07:09 resource2
-rw-r--r-- 1 root root 4.0K Oct 10 07:09 resource2_resize
-rw------- 1 root root 256M Oct 10 07:09 resource2_wc
-rw------- 1 root root  256 Oct 10 07:09 resource4
-rw------- 1 root root 1.0M Oct 10 07:09 resource5
-r--r--r-- 1 root root 4.0K Oct 10 06:43 revision
-rw------- 1 root root 128K Oct 10 07:09 rom
-r--r--r-- 1 root root 4.0K Oct 10 07:09 serial_number
-r--r--r-- 1 root root 4.0K Oct 10 06:43 subsystem_device
-r--r--r-- 1 root root 4.0K Oct 10 06:43 subsystem_vendor
-rw-r--r-- 1 root root 4.0K Oct 10 07:09 thermal_throttling_logging
-rw-r--r-- 1 root root 4.0K Oct 10 06:43 uevent
-r--r--r-- 1 root root 4.0K Oct 10 07:09 unique_id
-r--r--r-- 1 root root 4.0K Oct 10 06:43 vbios_version
-r--r--r-- 1 root root 4.0K Oct 10 06:43 vendor

Ask for confirmation before saving settings

As described in #129 and #159 (comment), due to GPU quirks and the overall nature of overclocking it is possible to make your system unusable due to crashes or visual artifacts. Currently, LACT applies and saves settings immediately after applying. This makes it possible to soft-lock your system if you happen to be unlucky enough.

There should be a confirmation window with a timeout after applying settings. If the user does not confirm them, they should not be saved, and eventually should be reverted. Ideally this should work for all settings, but clocks settings are enough as a starting point.

Initial work going on in #163

Voltage and clock control not available for RX 7900XT

Voltage and clock control is unavailable. Power management works
Also I don't have /sys/class/drm/card0/device/pp_od_clk_voltage


ls /sys/class/drm/card*/device/
/sys/class/drm/card0/device/:
aer_dev_correctable	   dma_mask_bits     ip_discovery	      msi_bus				 pp_dpm_vclk		resource0_wc
aer_dev_fatal		   driver	     irq		      msi_irqs				 pp_features		resource2
aer_dev_nonfatal	   driver_override   link		      numa_node				 pp_force_state		resource2_resize
apu_thermal_cap		   drm		     local_cpulist	      pcie_bw				 pp_mclk_od		resource2_wc
ari_enabled		   enable	     local_cpus		      pcie_replay_count			 pp_num_states		resource4
boot_vga		   fw_version	     max_link_speed	      power				 pp_power_profile_mode	resource5
broken_parity_status	   gpu_busy_percent  max_link_width	      power_dpm_force_performance_level  pp_sclk_od		revision
class			   gpu_metrics	     mem_busy_percent	      power_dpm_state			 pp_table		rom
config			   graphics	     mem_info_gtt_total       power_state			 psp_vbflash		subsystem
consistent_dma_mask_bits   hdcp_srm	     mem_info_gtt_used	      pp_cur_state			 psp_vbflash_status	subsystem_device
consumer:pci:0000:09:00.1  hwmon	     mem_info_preempt_used    pp_dpm_dcefclk			 remove			subsystem_vendor
consumer:pci:0000:09:00.2  i2c-4	     mem_info_vis_vram_total  pp_dpm_dclk			 rescan			thermal_throttling_logging
consumer:pci:0000:09:00.3  i2c-5	     mem_info_vis_vram_used   pp_dpm_fclk			 reset			uevent
current_link_speed	   i2c-6	     mem_info_vram_total      pp_dpm_mclk			 reset_method		unique_id
current_link_width	   i2c-7	     mem_info_vram_used       pp_dpm_pcie			 resource		vbios_version
d3cold_allowed		   i2c-8	     mem_info_vram_vendor     pp_dpm_sclk			 resource0		vendor
device			   i2c-9	     modalias		      pp_dpm_socclk			 resource0_resize

/sys/class/drm/card0-DP-1/device/:
card0-DP-1  card0-DP-2	card0-DP-3  card0-HDMI-A-1  dev  device  power	subsystem  uevent

/sys/class/drm/card0-DP-2/device/:
card0-DP-1  card0-DP-2	card0-DP-3  card0-HDMI-A-1  dev  device  power	subsystem  uevent

/sys/class/drm/card0-DP-3/device/:
card0-DP-1  card0-DP-2	card0-DP-3  card0-HDMI-A-1  dev  device  power	subsystem  uevent

/sys/class/drm/card0-HDMI-A-1/device/:
card0-DP-1  card0-DP-2	card0-DP-3  card0-HDMI-A-1  dev  device  power	subsystem  uevent

Linux eb2ad5c8 6.6.0 #1 SMP PREEMPT_DYNAMIC Mon Oct 30 09:46:52 CET 2023 x86_64 x86_64 x86_64 GNU/Linux

Distributor ID:	Ubuntu
Description:	Ubuntu 22.04.3 LTS
Release:	22.04
Codename:	jammy

Screenshot from 2023-11-03 17 09 54

Screenshot from 2023-11-03 17 10 25

Controlling GPU via allowing specific P-states

Hi, I have R9 290 GPU and it doesn't support fine tuning Polaris+ cards have, i.e. setting precise clocks and voltages via /sys/class/drm/card0/device/pp_od_clk_voltage SysFS, it simply doesn't exist for my GPU.

However, I can still control the card via enabling specific p-states (https://kernel.org/doc/html/latest/gpu/amdgpu.html#pp-dpm):

cd /sys/class/drm/card0/device

echo manual | sudo tee power_dpm_force_performance_level
# allow core clocks from the first 3 p-states
echo 0 1 2  | sudo tee pp_dpm_sclk
# allow 2 (of 3 in my case) memory clocks
echo 0 1    | sudo tee pp_dpm_mclk

Do you think you can support GPU control in such way?

lact-gui crashes on startup if no GPUs

Was working and displaying my Vega56 properly the other day, but didn't today:

❯ RUST_BACKTRACE=1 lact-gui
Connection to daemon established
thread 'main' panicked at 'called `Option::unwrap()` on a `None` value', gui/src/app/header.rs:58:60
stack backtrace:
   0: rust_begin_unwind
             at /rustc/e1884a8e3c3e813aada8254edfa120e85bf5ffca/library/std/src/panicking.rs:495:5
   1: core::panicking::panic_fmt
             at /rustc/e1884a8e3c3e813aada8254edfa120e85bf5ffca/library/core/src/panicking.rs:92:14
   2: core::panicking::panic
             at /rustc/e1884a8e3c3e813aada8254edfa120e85bf5ffca/library/core/src/panicking.rs:50:5
   3: <O as gtk::auto::combo_box::ComboBoxExt>::connect_changed::changed_trampoline
   4: g_signal_emit_valist
   5: g_signal_emit
   6: <unknown>
   7: gtk_combo_box_set_active
   8: gui::app::header::Header::set_gpus
   9: gui::app::App::run
  10: gui::main
note: Some details are omitted, run with `RUST_BACKTRACE=full` for a verbose backtrace.

I guessed it was because it didn't detect a GPU, so tried lact-cli. Running that I see no GPUs:

❯ lact-cli gpus
Ok({})

I'm surprised there's no GPU shown, as I'm definitely running a Vega that I'm using to type this, but not certain what's going wrong. Daemon is running fine: lactd.service loaded active running AMDGPU Control Daemon

Fan Speed indicator not working

After my comment on Reddit the 6900XT Red 'Devil is now correctly identified. Thank you!

Another issue that I found is that while the slider to control the fans do seem to work perfectly, the reported Fan Speed is always 0 RPM and 0%. I am not sure if this is an issue with the application or whether the feature is not fully supported in the kernel yet? It "sort of" works in CoreCtl where it will sometimes show fanspeed, and no fanspeed at others.

I am on Manjaro with Kernel 5.11.1-1 with Mesa 20.3.4-3 if that helps.

Edit: Additional feedback would be that it might be nice to be able to see the current temperture and perhaps fan speed in the OC tab. Generally, if I am overclocking something, I also monitor the temperature. This would remove the need to switch back and forth between tabs. Maybe renaming the "Thermals" tab to something like "Fancontrol" would make sense in that case.

Cheers!

Full blast fans at 0%
2021-03-02_13-06

Icon suggestions

It would be nice for LACT to have an icon. If anyone wants to make one or finds one with a license that allows it's usage, suggest it here.

pp_dpm_* as fallback for freq

I have noticed that pp_dpm_sclk and pp_dpm_mclk can be used to get the shader and vram clock and also the min and max values of those.
This is very interesting for me since I'm crazy and am trying to profile an internal Picasso GPU, which doesn't have pp_od_clk_voltage, freq2_input and a bunch more.
I would like to implement those files as a fallback for HWMon::get_gpu_freq, HWMon::get_mem_freq and GpuController::get_clocks_table.

This is not jet a pr since I'm unsure about what the second clock speed in GpuController::ClocksTableNew::current_gpu_clocks is. Or should I add a new field to GpuController::ClocksTable?

RX 6900XT - cannot change OC settings

Hello there!

When trying to edit OC settings, I only have power cap and Automatic/Lowest Clocks/Highest Clocks available to me.

I have the ppfeaturemask set as a boot parameter correctly, and have been using a manual overclock for some time now, wanted to try out your software but I'm running into this issue

Is it because lact-gui needs to be run as sudo? I have initiated lact-gui from root using su but the issue still persists.

Any help would be greatly appreciated, my specs are below :)

Thanks!

OS: Arch Linux x86_64
Kernel: 5.15.11-230-tkg-pds-llvm
Shell: fish 3.3.1
Resolution: 2560x1440
WM: sway
Theme: Adwaita [GTK2], dracula [GTK3]
Icons: Adwaita [GTK2], Tela-circle-purple-dark [GTK3]
Terminal: kitty
CPU: AMD Ryzen 9 3900X (24) @ 3.800GHz
GPU: AMD ATI Radeon RX 6800/6800 XT / 6900 XT
Memory: 2316MiB / 32084MiB

EDIT: just in case, here is the output for "/sys/class/drm/card*/device/uevent"

MAJOR=226
MINOR=0
DEVNAME=dri/card0
DEVTYPE=drm_minor
MAJOR=226
MINOR=0
DEVNAME=dri/card0
DEVTYPE=drm_minor
MAJOR=226
MINOR=0
DEVNAME=dri/card0
DEVTYPE=drm_minor
MAJOR=226
MINOR=0
DEVNAME=dri/card0
DEVTYPE=drm_minor
DRIVER=amdgpu
PCI_CLASS=30000
PCI_ID=1002:73BF
PCI_SUBSYS_ID=148C:2408
PCI_SLOT_NAME=0000:2f:00.0
MODALIAS=pci:v00001002d000073BFsv0000148Csd00002408bc03sc00i00

EDITEDIT: lact-cli info shows GPU as blank, see below:

GPU Model:
GPU Vendor: Advanced Micro Devices, Inc. [AMD/ATI]
Driver in use: amdgpu
VBIOS Version: 113-D41201-XT
VRAM Size: 16368
Link Speed: 16.0 GT/s PCIe

However, lact-gui confirms it to be a Navi21 [Radeon RX 6800/6800 XT / 6900 XT] (it even confirms the brand of my GPU, Powercolor)

LAST EDIT I PROMISE: just to confirm journalctl shows no errors for lactd and lact-gui has no errors whatsoever when run from terminal

Deb package

There is a .deb package for LACT now that was created using this tool, it can be downloaded from the releases page. I've tested it on a pop_os VM and it seems to work fine, however I'd like to receive feedback on how it works on other debian-based systems.

Core/Mem Freq not restored after suspend or written to Json by GUI

Ive noticed that on my 5700xt the values for core/mem freq arent restored by the daemon upon returning from system suspend state. The power limit and fan curves work as desired but not the clocks.

The core/mem freq also arent written to the json file by the gui which im not sure if thats intentional. If you manually edit the json its fine.

blueprint-compiler not found

When I try to build this from source, I get:

error: proc macro panicked
  --> lact-gui/src/app/info_row.rs:32:14
   |
32 |     #[derive(CompositeTemplate, Default, Properties)]
   |              ^^^^^^^^^^^^^^^^^
   |
   = help: message: blueprint-compiler not found
   = note: this error originates in the derive macro `CompositeTemplate` (in Nightly builds, run with -Z macro-backtrace for more info)

error: proc macro panicked
  --> lact-gui/src/app/page_section.rs:37:14
   |
37 |     #[derive(CompositeTemplate, Default, Properties)]
   |              ^^^^^^^^^^^^^^^^^
   |
   = help: message: blueprint-compiler not found
   = note: this error originates in the derive macro `CompositeTemplate` (in Nightly builds, run with -Z macro-backtrace for more info)

error: proc macro panicked
  --> lact-gui/src/app/root_stack/info_page/vulkan_info/feature_window/row.rs:31:14
   |
31 |     #[derive(CompositeTemplate, Default, Properties)]
   |              ^^^^^^^^^^^^^^^^^
   |
   = help: message: blueprint-compiler not found
   = note: this error originates in the derive macro `CompositeTemplate` (in Nightly builds, run with -Z macro-backtrace for more info)

error: proc macro panicked
  --> lact-gui/src/app/root_stack/info_page/vulkan_info/feature_window/mod.rs:38:14
   |
38 |     #[derive(CompositeTemplate, Properties, Default)]
   |              ^^^^^^^^^^^^^^^^^
   |
   = help: message: blueprint-compiler not found
   = note: this error originates in the derive macro `CompositeTemplate` (in Nightly builds, run with -Z macro-backtrace for more info)

error: proc macro panicked
  --> lact-gui/src/app/root_stack/oc_page/gpu_stats_section.rs:85:14
   |
85 |     #[derive(CompositeTemplate, Default, Properties)]
   |              ^^^^^^^^^^^^^^^^^
   |
   = help: message: blueprint-compiler not found
   = note: this error originates in the derive macro `CompositeTemplate` (in Nightly builds, run with -Z macro-backtrace for more info)

error: proc macro panicked
  --> lact-gui/src/app/root_stack/oc_page/power_cap_section.rs:44:14
   |
44 |     #[derive(CompositeTemplate, Default, Properties)]
   |              ^^^^^^^^^^^^^^^^^
   |
   = help: message: blueprint-compiler not found
   = note: this error originates in the derive macro `CompositeTemplate` (in Nightly builds, run with -Z macro-backtrace for more info)

error: proc macro panicked
  --> lact-gui/src/app/root_stack/oc_page/power_states/power_state_row.rs:37:14
   |
37 |     #[derive(CompositeTemplate, Default, Properties)]
   |              ^^^^^^^^^^^^^^^^^
   |
   = help: message: blueprint-compiler not found
   = note: this error originates in the derive macro `CompositeTemplate` (in Nightly builds, run with -Z macro-backtrace for more info)

error: proc macro panicked
  --> lact-gui/src/app/root_stack/oc_page/power_states/power_states_frame.rs:80:14
   |
80 |     #[derive(CompositeTemplate, Default, Properties)]
   |              ^^^^^^^^^^^^^^^^^
   |
   = help: message: blueprint-compiler not found
   = note: this error originates in the derive macro `CompositeTemplate` (in Nightly builds, run with -Z macro-backtrace for more info)

error: proc macro panicked
  --> lact-gui/src/app/root_stack/oc_page/power_states/power_states_list.rs:94:14
   |
94 |     #[derive(CompositeTemplate, Default, Properties)]
   |              ^^^^^^^^^^^^^^^^^
   |
   = help: message: blueprint-compiler not found
   = note: this error originates in the derive macro `CompositeTemplate` (in Nightly builds, run with -Z macro-backtrace for more info)

error: proc macro panicked
  --> lact-gui/src/app/root_stack/software_page.rs:48:14
   |
48 |     #[derive(CompositeTemplate, Default, Properties)]
   |              ^^^^^^^^^^^^^^^^^
   |
   = help: message: blueprint-compiler not found
   = note: this error originates in the derive macro `CompositeTemplate` (in Nightly builds, run with -Z macro-backtrace for more info)

Using junction vs edge temp for fans on newer cards

Sorry for the 3 different issues at once lol

On newer cards like the 5700xt (and i think vega/radeon vii too?) the junction temp is much more important than the edge temp and determines when throttling occurs. AFAIK this is the temp used on default in the bios fan curves for these cards to determine fan speeds. Might it be possible to use junction temp for creating fan curves vs edge based on card detected? While this isnt absolutely necessary as you can kinda figure what the fan curve should be by monitoring the edge vs junction temp and adjusting accordingly to my knowledge this is the stock behavior but i may just be dense.

Feel free to close this if not interested in it as its not a critical thing

Can't find service on Artix OpenRC

After installing the AUR package with yay, performing
sudo rc-update add lactd default
results in
rc-update: service lactd does not exist

On the list of all services via rc-status -s, there is no lactd.

"Enable Overclocking" does not take effect until initramfs regeneration

Enabling overclocking creates a file with amdgpu driver options in /etc/modprobe.d. In order for these options to be applied, they have to be loaded early in the boot process at the initramfs stage. At least on Arch, these settings are not included into initramfs until it is regenerated (either manually or via a kernel update). This should at least be mentioned in LACT (ideally handled automatically), also need to check what the behaviour is on other distros.

Workaround for arch-based systems (assuming the default initramfs generator is used): run mkinitcpio -P after clicking "enable overclocking".

proc macro panicked CompositeTemplate

When compiling from master I get the following errors:

   Compiling gtk4 v0.7.3
   Compiling lact-gui v0.5.0 (/home/user/LACT/lact-gui)
error: proc macro panicked
  --> lact-gui/src/app/info_row.rs:32:14
   |
32 |     #[derive(CompositeTemplate, Default, Properties)]
   |              ^^^^^^^^^^^^^^^^^
   |
   = help: message: called `Result::unwrap()` on an `Err` value: error: Could not determine what kind of syntax is meant here
           at <stdin> line 5 column 10:
              5 |template $InfoRow: Box {
                |         ^
           
error: proc macro panicked
  --> lact-gui/src/app/page_section.rs:37:14
   |
37 |     #[derive(CompositeTemplate, Default, Properties)]
   |              ^^^^^^^^^^^^^^^^^
   |
   = help: message: called `Result::unwrap()` on an `Err` value: error: Could not determine what kind of syntax is meant here
           at <stdin> line 4 column 10:
              4 |template $PageSection: Box {
                |         ^
           
           
   = note: this error originates in the derive macro `CompositeTemplate` (in Nightly builds, run with -Z macro-backtrace for more info)

Full logs with more errors like above
   Compiling gtk4 v0.7.3
   Compiling lact-gui v0.5.0 (/home/user/LACT/lact-gui)
error: proc macro panicked
  --> lact-gui/src/app/info_row.rs:32:14
   |
32 |     #[derive(CompositeTemplate, Default, Properties)]
   |              ^^^^^^^^^^^^^^^^^
   |
   = help: message: called `Result::unwrap()` on an `Err` value: error: Could not determine what kind of syntax is meant here
           at <stdin> line 5 column 10:
              5 |template $InfoRow: Box {
                |         ^
           
           
   = note: this error originates in the derive macro `CompositeTemplate` (in Nightly builds, run with -Z macro-backtrace for more info)

error: proc macro panicked
  --> lact-gui/src/app/page_section.rs:37:14
   |
37 |     #[derive(CompositeTemplate, Default, Properties)]
   |              ^^^^^^^^^^^^^^^^^
   |
   = help: message: called `Result::unwrap()` on an `Err` value: error: Could not determine what kind of syntax is meant here
           at <stdin> line 4 column 10:
              4 |template $PageSection: Box {
                |         ^
           
           
   = note: this error originates in the derive macro `CompositeTemplate` (in Nightly builds, run with -Z macro-backtrace for more info)

error: proc macro panicked
  --> lact-gui/src/app/root_stack/info_page/vulkan_info/feature_window/row.rs:31:14
   |
31 |     #[derive(CompositeTemplate, Default, Properties)]
   |              ^^^^^^^^^^^^^^^^^
   |
   = help: message: called `Result::unwrap()` on an `Err` value: error: Could not determine what kind of syntax is meant here
           at <stdin> line 4 column 10:
              4 |template $VulkanFeatureRow: Box {
                |         ^
           
           
   = note: this error originates in the derive macro `CompositeTemplate` (in Nightly builds, run with -Z macro-backtrace for more info)

error: proc macro panicked
  --> lact-gui/src/app/root_stack/info_page/vulkan_info/feature_window/mod.rs:38:14
   |
38 |     #[derive(CompositeTemplate, Properties, Default)]
   |              ^^^^^^^^^^^^^^^^^
   |
   = help: message: called `Result::unwrap()` on an `Err` value: error: Could not determine what kind of syntax is meant here
           at <stdin> line 4 column 10:
              4 |template $VulkanFeaturesWindow: Window {
                |         ^
           
           
   = note: this error originates in the derive macro `CompositeTemplate` (in Nightly builds, run with -Z macro-backtrace for more info)

error: proc macro panicked
  --> lact-gui/src/app/root_stack/oc_page/gpu_stats_section.rs:85:14
   |
85 |     #[derive(CompositeTemplate, Default, Properties)]
   |              ^^^^^^^^^^^^^^^^^
   |
   = help: message: called `Result::unwrap()` on an `Err` value: error: Could not determine what kind of syntax is meant here
           at <stdin> line 4 column 10:
              4 |template $GpuStatsSection: $PageSection {
                |         ^
           
           
   = note: this error originates in the derive macro `CompositeTemplate` (in Nightly builds, run with -Z macro-backtrace for more info)

error: proc macro panicked
  --> lact-gui/src/app/root_stack/oc_page/power_cap_section.rs:44:14
   |
44 |     #[derive(CompositeTemplate, Default, Properties)]
   |              ^^^^^^^^^^^^^^^^^
   |
   = help: message: called `Result::unwrap()` on an `Err` value: error: Could not determine what kind of syntax is meant here
           at <stdin> line 4 column 10:
              4 |template $PowerCapSection: $PageSection {
                |         ^
           
           
   = note: this error originates in the derive macro `CompositeTemplate` (in Nightly builds, run with -Z macro-backtrace for more info)

error: proc macro panicked
  --> lact-gui/src/app/root_stack/oc_page/power_states/power_state_row.rs:37:14
   |
37 |     #[derive(CompositeTemplate, Default, Properties)]
   |              ^^^^^^^^^^^^^^^^^
   |
   = help: message: called `Result::unwrap()` on an `Err` value: error: Could not determine what kind of syntax is meant here
           at <stdin> line 4 column 10:
              4 |template $PowerStateRow: Box {
                |         ^
           
           
   = note: this error originates in the derive macro `CompositeTemplate` (in Nightly builds, run with -Z macro-backtrace for more info)

error: proc macro panicked
  --> lact-gui/src/app/root_stack/oc_page/power_states/power_states_frame.rs:80:14
   |
80 |     #[derive(CompositeTemplate, Default, Properties)]
   |              ^^^^^^^^^^^^^^^^^
   |
   = help: message: called `Result::unwrap()` on an `Err` value: error: Could not determine what kind of syntax is meant here
           at <stdin> line 4 column 10:
              4 |template $PowerStatesFrame: Box {
                |         ^
           
           
   = note: this error originates in the derive macro `CompositeTemplate` (in Nightly builds, run with -Z macro-backtrace for more info)

error: proc macro panicked
  --> lact-gui/src/app/root_stack/oc_page/power_states/power_states_list.rs:94:14
   |
94 |     #[derive(CompositeTemplate, Default, Properties)]
   |              ^^^^^^^^^^^^^^^^^
   |
   = help: message: called `Result::unwrap()` on an `Err` value: error: Could not determine what kind of syntax is meant here
           at <stdin> line 4 column 10:
              4 |template $PowerStatesList: Frame {
                |         ^
           
           
   = note: this error originates in the derive macro `CompositeTemplate` (in Nightly builds, run with -Z macro-backtrace for more info)

error: proc macro panicked
  --> lact-gui/src/app/root_stack/software_page.rs:48:14
   |
48 |     #[derive(CompositeTemplate, Default, Properties)]
   |              ^^^^^^^^^^^^^^^^^
   |
   = help: message: called `Result::unwrap()` on an `Err` value: error: Could not determine what kind of syntax is meant here
           at <stdin> line 4 column 10:
              4 |template $SoftwarePage: Box {
                |         ^
           
           
   = note: this error originates in the derive macro `CompositeTemplate` (in Nightly builds, run with -Z macro-backtrace for more info)

error: could not compile `lact-gui` (lib) due to 10 previous errors

The errors look like #210 but I here's no mention of blueprint-compiler and I have that installed.

Ubuntu 22.04
rustc 1.70.0 (90c541806 2023-05-31)
cargo 1.70.0

Permission Denied Error when trying to change Performance Level and Power Level Mode

When i am trying to change Performance Level and Power Level Mode i get this error:

lact[2305]: 2023-10-30T22:44:20.631759Z  INFO lact_daemon::server::handler: initialized 1 GPUs
lact[2305]: 2023-10-30T22:55:58.379407Z ERROR lact_daemon::server::handler: could not apply settings: Could not set fan control back to automatic: io error: Permission denied (os error 13)
lact[2305]: 2023-10-30T23:03:23.330050Z ERROR lact_daemon::server::handler: could not apply settings: Could not set fan control back to automatic: io error: Permission denied (os error 13)
lact[2305]: 2023-10-30T23:03:47.024258Z ERROR lact_daemon::server::handler: could not apply settings: Could not set fan control back to automatic: io error: Permission denied (os error 13)

I can change this settings if i use the terminal, with this commands for example:

echo "manual" | sudo tee /sys/class/drm/card0/device/power_dpm_force_performance_level

and

echo "3" | sudo tee /sys/class/drm/card0/device/pp_power_profile_mode

This will change the power level mode to "VIDEO", but it does not work with LACT because of the error.

System info:
OS: Debian 12 Bookworm (with kernel 6.1.0-13)
Mesa: 22.3.6
LACT: 0.4.5
Hardware: AMD Ryzen 5700U with Radeon Graphics (Vega 8)

hard system crashes after downgrading kernel and kernel headers to 6.3.9

bit of a weird one this, I've been using lact for about 6 months with no issues, but recently I had an issue with vram clocks being stuck at 96Mhz so downgraded the kernel (linux and linux-zen) and their headers to 6.3.9. Now I get hard system crashes on login if the lact daemon is enabled on startup, but if i enable it manually after login everything works fine.

The crashes are different for the different kernels too, if i boot into zen with the daemon enabled the screen goes blank and no graphical output is detected. Output for journalctl -u lactd:

Sep 26 09:39:45 wh-beast systemd[1]: Started AMDGPU Control Daemon.
Sep 26 09:39:45 wh-beast lact[1343]: 2023-09-26T08:39:45.113827Z INFO lact_daemon::socket: listening on "/var/run/lactd.sock"
Sep 26 09:39:45 wh-beast lact[1343]: 2023-09-26T08:39:45.139782Z INFO lact_daemon::server::handler: initialized 1 GPUs
Sep 26 09:39:45 wh-beast lact[1343]: 2023-09-26T08:39:45.140127Z ERROR lact_daemon::server::handler: could not apply existing config for gpu 1002:73BF-1DA2:E438-0000:2d:00.0: io error: No such file or directory (os error 2)
Sep 26 09:39:45 wh-beast lact[1343]: Could not read file pp_od_clk_voltage

Whereas if i boot into linux the screen goes blank and the fans spin up to 100%. Output for journalctl -u lactd:
Sep 26 10:03:09 wh-beast systemd[1]: Started AMDGPU Control Daemon.
Sep 26 10:03:10 wh-beast lact[1375]: 2023-09-26T09:03:10.004674Z INFO lact_daemon::socket: listening on "/var/run/lactd.sock"
Sep 26 10:03:10 wh-beast lact[1375]: 2023-09-26T09:03:10.027229Z INFO lact_daemon::server::handler: initialized 1 GPUs
Sep 26 10:03:20 wh-beast lact[1375]: thread 'main' panicked at 'No current temp', lact-daemon/src/server/gpu_controller/fan_control.rs:16:36
Sep 26 10:03:20 wh-beast lact[1375]: note: run with RUST_BACKTRACE=1 environment variable to display a backtrace

Here are my system stats:
OS: Garuda Linux x86_64
Host: MS-7C92 1.0
Kernel: 6.3.9-zen1-1-zen
Uptime: 1 hour, 3 mins
Packages: 1704 (pacman)[stable]
Shell: fish 3.6.1
Resolution: 3440x1440
WM: Sway (Wayland)
Theme: Nordic-darker [GTK2/3]{?3} {3} [Plasma], {?}{7}
Icons: Tela-circle-dark [GTK2/3]
Terminal: alacritty 0.12.2
Terminal Font: JetbrainsMonoNL 16
CPU: AMD Ryzen 9 3950X (32) @ 4.76123 GHz
GPU: AMD Radeon RX 6800 XT
Memory: 7.30 GiB / 31.27 GiB

Looking at the lactd.service file:
[Unit]
Description=AMDGPU Control Daemon
After=multi-user.target

[Service]
ExecStart=lact daemon

[Install]
WantedBy=graphical.target

I wonder if I can sort this by changing the "After" or "Install" fields? As it seems that the daemon is loading too early?

Thanks!

Add the ability to disable overclocking

When you enable overclocking support, a file is written to /etc/modprobe.d to enable overdrive support in the driver. Currently there is no way to disable it other than removing the file manually. There should be a button in the GUI to do this.

GUI issues

I've been using LACT for a while and haven't submitted anything... well, just beacuse. :)

I script all my stuff out, but when I want to use the GUI to test some overclocking, I'm having a problem where certain things lock up or don't display properly.

On the first screenshot and when launching the gui, I simply select one of my gpu's and just locks up. I have to ctrl-c it in the console to kill the session.

If I attempt again, go to OC and make a change (in this instance just change the GPU clock) and click "Apply", the window to "Yes/No" doesn't show anything, just blank. This small window every now and then will display, but only a small percentage of the time will it show. (2nd screenshot).

The 3rd screenshot is the console errors when I click "Apply".

image
image
image

LACT sometimes completely disables power limit (6900XT)

If the power limit is set to a value that's too low for the power state that the card is currently in, it seems that the driver completely disables the power limit, causing the card to have a spike in power consumption (I've seen it go as high as 420w up from a 293w TDP) until the card leaves that state and then it is applied correctly.

This can be easily replicated by setting the power limit while running any GPU intensive application that will keep the card at its highest power state (demonstrated in the video using stable diffusion) and can potentially lead to damage if running something like furmark which is not memory-bound.

OS: Arch Linux, Kernel 6.6.1, GPU: 6900XT

Here's a video of the problem:
plbug.webm

Killing the lact-daemon

After killing lact-daemon fan speed increases somewhere to 60 percents. The same thing happens for one second when you turn off the computer.

No Fan Control on RX7900 Series

I've been looking everywhere for this ability, but I can't find it in any tool; I've tried three. I'm assuming you're all having the same issues, but maybe it's me? Do you know that LACT should work on this card? Because I can't get it to work.

Vega20 and newer GPUs support

System:

  • Manjaro Linux
  • Kernel 5.10.7 (Mirrorlist from Arch)
  • Asus Radeon ROG Strix RX5700 XT

Steps:

  • Install from AUR this package
  • Enable and start service
  • Run application

Trace error:

Initializing gtk
Activating
Getting elements
thread 'main' panicked at 'index out of bounds: the len is 2 but the index is 2', daemon/src/gpu_controller.rs:604:28
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace

TRACE lact_daemon::fork: sending response to parent: Err("file not found") -- Unable to find the GPU

$ sudo ./target/debug/lact daemon
2023-10-10T03:34:04.922579Z  INFO lact_daemon::socket: listening on "/var/run/lactd.sock"
2023-10-10T03:34:04.922712Z TRACE lact_daemon::server::handler: trying gpu controller at "/sys/class/drm/card0"
2023-10-10T03:34:04.923765Z TRACE lact_daemon::fork: waiting for message from child
2023-10-10T03:34:04.923947Z TRACE lact_daemon::fork: sending response to parent: Err("file not found")
2023-10-10T03:34:04.924025Z TRACE lact_daemon::fork: exiting child with code 0
2023-10-10T03:34:04.924050Z TRACE lact_daemon::fork: received 26 data bytes from child
2023-10-10T03:34:04.925782Z  WARN lact_daemon::server::handler: failed to initialize controller at "/sys/class/drm/card0", file not found
2023-10-10T03:34:04.925840Z  WARN lact_daemon::server::handler: no GPUs were found, retrying in 1s (attempt 1/5)
2023-10-10T03:34:05.927140Z TRACE lact_daemon::server::handler: trying gpu controller at "/sys/class/drm/card0"
2023-10-10T03:34:05.928133Z TRACE lact_daemon::fork: waiting for message from child
2023-10-10T03:34:05.928346Z TRACE lact_daemon::fork: sending response to parent: Err("file not found")
2023-10-10T03:34:05.928446Z TRACE lact_daemon::fork: exiting child with code 0
2023-10-10T03:34:05.928473Z TRACE lact_daemon::fork: received 26 data bytes from child
2023-10-10T03:34:05.929826Z  WARN lact_daemon::server::handler: failed to initialize controller at "/sys/class/drm/card0", file not found
2023-10-10T03:34:05.929866Z  WARN lact_daemon::server::handler: no GPUs were found, retrying in 1s (attempt 2/5)
2023-10-10T03:34:06.931269Z TRACE lact_daemon::server::handler: trying gpu controller at "/sys/class/drm/card0"
2023-10-10T03:34:06.932258Z TRACE lact_daemon::fork: waiting for message from child
2023-10-10T03:34:06.932486Z TRACE lact_daemon::fork: sending response to parent: Err("file not found")
2023-10-10T03:34:06.932586Z TRACE lact_daemon::fork: exiting child with code 0
2023-10-10T03:34:06.932622Z TRACE lact_daemon::fork: received 26 data bytes from child
2023-10-10T03:34:06.933967Z  WARN lact_daemon::server::handler: failed to initialize controller at "/sys/class/drm/card0", file not found
2023-10-10T03:34:06.934011Z  WARN lact_daemon::server::handler: no GPUs were found, retrying in 1s (attempt 3/5)
2023-10-10T03:34:07.935400Z TRACE lact_daemon::server::handler: trying gpu controller at "/sys/class/drm/card0"
2023-10-10T03:34:07.936665Z TRACE lact_daemon::fork: waiting for message from child
2023-10-10T03:34:07.936920Z TRACE lact_daemon::fork: sending response to parent: Err("file not found")
2023-10-10T03:34:07.937010Z TRACE lact_daemon::fork: exiting child with code 0
2023-10-10T03:34:07.937041Z TRACE lact_daemon::fork: received 26 data bytes from child
2023-10-10T03:34:07.938817Z  WARN lact_daemon::server::handler: failed to initialize controller at "/sys/class/drm/card0", file not found
2023-10-10T03:34:07.938875Z  WARN lact_daemon::server::handler: no GPUs were found, retrying in 1s (attempt 4/5)
2023-10-10T03:34:08.940172Z TRACE lact_daemon::server::handler: trying gpu controller at "/sys/class/drm/card0"
2023-10-10T03:34:08.941279Z TRACE lact_daemon::fork: waiting for message from child
2023-10-10T03:34:08.941502Z TRACE lact_daemon::fork: sending response to parent: Err("file not found")
2023-10-10T03:34:08.941599Z TRACE lact_daemon::fork: exiting child with code 0
2023-10-10T03:34:08.941625Z TRACE lact_daemon::fork: received 26 data bytes from child
2023-10-10T03:34:08.943094Z  WARN lact_daemon::server::handler: failed to initialize controller at "/sys/class/drm/card0", file not found
2023-10-10T03:34:08.943139Z  WARN lact_daemon::server::handler: no GPUs were found, retrying in 1s (attempt 5/5)
2023-10-10T03:34:09.944493Z  INFO lact_daemon::server::handler: initialized 0 GPUs
2023-10-10T03:34:09.945105Z TRACE perform: zbus::handshake: Initializing
2023-10-10T03:34:09.945286Z TRACE perform: zbus::handshake: Waiting for DATA or OK from server
2023-10-10T03:34:09.945455Z TRACE perform: zbus::handshake: Received OK from server
2023-10-10T03:34:09.945544Z TRACE perform: zbus::handshake: Waiting for Unix FD passing agreement from server
2023-10-10T03:34:09.945607Z TRACE perform: zbus::handshake: Unix FD passing agreed by server
2023-10-10T03:34:09.945699Z TRACE perform: zbus::handshake: Handshake done
2023-10-10T03:34:09.946157Z TRACE zbus::connection: Sending message: Msg { type: MethodCall, path: ObjectPath("/org/freedesktop/DBus"), iface: InterfaceName(Str(Borrowed("org.freedesktop.DBus"))), member: MemberName(Str(Borrowed("Hello"))) }
2023-10-10T03:34:09.946333Z TRACE zbus::connection: Sent message with serial: 1
2023-10-10T03:34:09.946397Z TRACE socket reader: zbus::socket_reader: Waiting for message on the socket..
2023-10-10T03:34:09.946976Z TRACE socket reader: zbus::socket_reader: Message received on the socket: Msg { type: MethodReturn, sender: UniqueName(Str(Borrowed("org.freedesktop.DBus"))), reply-serial: 1, body: Signature("s") }
2023-10-10T03:34:09.947235Z TRACE socket reader: zbus::socket_reader: Error broadcasting message to stream for `None`: SendError(..)
2023-10-10T03:34:09.947268Z TRACE socket reader: zbus::socket_reader: Broadcasted to all streams: Ok(Msg { type: MethodReturn, sender: UniqueName(Str(Borrowed("org.freedesktop.DBus"))), reply-serial: 1, body: Signature("s") })
2023-10-10T03:34:09.947391Z TRACE socket reader: zbus::socket_reader: Waiting for message on the socket..
2023-10-10T03:34:09.947566Z TRACE socket reader: zbus::socket_reader: Message received on the socket: Msg { type: Signal, sender: UniqueName(Str(Borrowed("org.freedesktop.DBus"))), path: ObjectPath("/org/freedesktop/DBus"), iface: InterfaceName(Str(Borrowed("org.freedesktop.DBus"))), member: MemberName(Str(Borrowed("NameAcquired"))), body: Signature("s") }
2023-10-10T03:34:09.947871Z TRACE socket reader: zbus::socket_reader: Error broadcasting message to stream for `None`: SendError(..)
2023-10-10T03:34:09.947895Z TRACE socket reader: zbus::socket_reader: Broadcasted to all streams: Ok(Msg { type: Signal, sender: UniqueName(Str(Borrowed("org.freedesktop.DBus"))), path: ObjectPath("/org/freedesktop/DBus"), iface: InterfaceName(Str(Borrowed("org.freedesktop.DBus"))), member: MemberName(Str(Borrowed("NameAcquired"))), body: Signature("s") })
2023-10-10T03:34:09.948043Z TRACE socket reader: zbus::socket_reader: Waiting for message on the socket..
2023-10-10T03:34:09.948609Z TRACE zbus::connection: Sending message: Msg { type: MethodCall, sender: UniqueName(Str(Borrowed(":1.136"))), path: ObjectPath("/org/freedesktop/DBus"), iface: InterfaceName(Str(Borrowed("org.freedesktop.DBus"))), member: MemberName(Str(Borrowed("AddMatch"))), body: Signature("s") }
2023-10-10T03:34:09.948829Z TRACE zbus::connection: Sent message with serial: 2
2023-10-10T03:34:09.949089Z TRACE socket reader: zbus::socket_reader: Message received on the socket: Msg { type: MethodReturn, sender: UniqueName(Str(Borrowed("org.freedesktop.DBus"))), reply-serial: 2 }
2023-10-10T03:34:09.949293Z TRACE socket reader: zbus::socket_reader: Error broadcasting message to stream for `None`: SendError(..)
2023-10-10T03:34:09.949315Z TRACE socket reader: zbus::socket_reader: Broadcasted to all streams: Ok(Msg { type: MethodReturn, sender: UniqueName(Str(Borrowed("org.freedesktop.DBus"))), reply-serial: 2 })
2023-10-10T03:34:09.949420Z TRACE socket reader: zbus::socket_reader: Waiting for message on the socket..
2023-10-10T03:34:09.949827Z TRACE zbus::connection: Sending message: Msg { type: MethodCall, sender: UniqueName(Str(Borrowed(":1.136"))), path: ObjectPath("/org/freedesktop/DBus"), iface: InterfaceName(Str(Borrowed("org.freedesktop.DBus"))), member: MemberName(Str(Borrowed("GetNameOwner"))), body: Signature("s") }
2023-10-10T03:34:09.949992Z TRACE zbus::connection: Sent message with serial: 3
2023-10-10T03:34:09.950207Z TRACE socket reader: zbus::socket_reader: Message received on the socket: Msg { type: MethodReturn, sender: UniqueName(Str(Borrowed("org.freedesktop.DBus"))), reply-serial: 3, body: Signature("s") }
2023-10-10T03:34:09.950577Z TRACE socket reader: zbus::socket_reader: Error broadcasting message to stream for `None`: SendError(..)
2023-10-10T03:34:09.950623Z TRACE socket reader: zbus::socket_reader: Broadcasted to all streams: Ok(Msg { type: MethodReturn, sender: UniqueName(Str(Borrowed("org.freedesktop.DBus"))), reply-serial: 3, body: Signature("s") })
2023-10-10T03:34:09.950782Z TRACE socket reader: zbus::socket_reader: Waiting for message on the socket..
2023-10-10T03:34:09.951154Z TRACE zbus::connection: Sending message: Msg { type: MethodCall, sender: UniqueName(Str(Borrowed(":1.136"))), path: ObjectPath("/org/freedesktop/DBus"), iface: InterfaceName(Str(Borrowed("org.freedesktop.DBus"))), member: MemberName(Str(Borrowed("AddMatch"))), body: Signature("s") }
2023-10-10T03:34:09.951318Z TRACE zbus::connection: Sent message with serial: 4
2023-10-10T03:34:09.951552Z TRACE socket reader: zbus::socket_reader: Message received on the socket: Msg { type: MethodReturn, sender: UniqueName(Str(Borrowed("org.freedesktop.DBus"))), reply-serial: 4 }
2023-10-10T03:34:09.951809Z TRACE socket reader: zbus::socket_reader: Error broadcasting message to stream for `None`: SendError(..)
2023-10-10T03:34:09.951832Z TRACE socket reader: zbus::socket_reader: Broadcasted to all streams: Ok(Msg { type: MethodReturn, sender: UniqueName(Str(Borrowed("org.freedesktop.DBus"))), reply-serial: 4 })
2023-10-10T03:34:09.951965Z TRACE socket reader: zbus::socket_reader: Waiting for message on the socket..
^C2023-10-10T03:37:12.957233Z  INFO lact_daemon: cleaning up and shutting down...
2023-10-10T03:37:12.957344Z DEBUG shutdown_cleanup: lact_daemon::socket: removed socket
$ ls /sys/class/drm/card0
card0-DP-1  card0-DP-2  card0-DP-3  card0-DVI-D-1  card0-HDMI-A-1  dev  device  power  subsystem  uevent
$ ls /sys/class/drm/card0/device
apu_thermal_cap            driver            irq                      mem_info_vram_used                 pp_dpm_mclk            rescan            serial_number
ari_enabled                driver_override   link                     mem_info_vram_vendor               pp_dpm_pcie            reset             subsystem
boot_vga                   drm               local_cpulist            modalias                           pp_dpm_sclk            reset_method      subsystem_device
broken_parity_status       enable            local_cpus               msi_bus                            pp_force_state         resource          subsystem_vendor
class                      fw_version        max_link_speed           msi_irqs                           pp_mclk_od             resource0         thermal_throttling_logging
config                     gpu_busy_percent  max_link_width           numa_node                          pp_num_states          resource0_resize  uevent
consistent_dma_mask_bits   graphics          mem_busy_percent         pcie_bw                            pp_od_clk_voltage      resource0_wc      vbios_version
consumer:pci:0000:07:00.1  hwmon             mem_info_gtt_total       pcie_replay_count                  pp_power_profile_mode  resource2         vendor
current_link_speed         i2c-1             mem_info_gtt_used        power                              pp_sclk_od             resource2_wc
current_link_width         i2c-2             mem_info_preempt_used    power_dpm_force_performance_level  pp_table               resource4
d3cold_allowed             i2c-3             mem_info_vis_vram_total  power_dpm_state                    product_name           resource5
device                     i2c-4             mem_info_vis_vram_used   power_state                        product_number         revision
dma_mask_bits              i2c-5             mem_info_vram_total      pp_cur_state                       remove                 rom
$ nix-shell -p pciutils --run lspci
...
07:00.0 VGA compatible controller: Advanced Micro Devices, Inc. [AMD/ATI] Ellesmere [Radeon RX 470/480/570/570X/580/580X/590] (rev ef)
07:00.1 Audio device: Advanced Micro Devices, Inc. [AMD/ATI] Ellesmere HDMI Audio [Radeon RX 470/480 / 570/580/590]
...
$ tree /sys/class/drm/card0
/sys/class/drm/card0
├── card0-DP-1
│   ├── ddc -> ../../../i2c-1
│   ├── device -> ../../card0
│   ├── dpms
│   ├── drm_dp_aux0
│   │   ├── dev
│   │   ├── device -> ../../card0-DP-1
│   │   ├── name
│   │   ├── power
│   │   │   ├── async
│   │   │   ├── autosuspend_delay_ms
│   │   │   ├── control
│   │   │   ├── runtime_active_kids
│   │   │   ├── runtime_active_time
│   │   │   ├── runtime_enabled
│   │   │   ├── runtime_status
│   │   │   ├── runtime_suspended_time
│   │   │   └── runtime_usage
│   │   ├── subsystem -> ../../../../../../../../class/drm_dp_aux_dev
│   │   └── uevent
│   ├── edid
│   ├── enabled
│   ├── i2c-6
│   │   ├── delete_device
│   │   ├── device -> ../../card0-DP-1
│   │   ├── name
│   │   ├── new_device
│   │   ├── power
│   │   │   ├── async
│   │   │   ├── runtime_active_kids
│   │   │   ├── runtime_enabled
│   │   │   ├── runtime_status
│   │   │   └── runtime_usage
│   │   ├── subsystem -> ../../../../../../../../bus/i2c
│   │   └── uevent
│   ├── modes
│   ├── power
│   │   ├── async
│   │   ├── autosuspend_delay_ms
│   │   ├── control
│   │   ├── runtime_active_kids
│   │   ├── runtime_active_time
│   │   ├── runtime_enabled
│   │   ├── runtime_status
│   │   ├── runtime_suspended_time
│   │   └── runtime_usage
│   ├── status
│   ├── subsystem -> ../../../../../../../class/drm
│   └── uevent
├── card0-DP-2
│   ├── ddc -> ../../../i2c-2
│   ├── device -> ../../card0
│   ├── dpms
│   ├── drm_dp_aux1
│   │   ├── dev
│   │   ├── device -> ../../card0-DP-2
│   │   ├── name
│   │   ├── power
│   │   │   ├── async
│   │   │   ├── autosuspend_delay_ms
│   │   │   ├── control
│   │   │   ├── runtime_active_kids
│   │   │   ├── runtime_active_time
│   │   │   ├── runtime_enabled
│   │   │   ├── runtime_status
│   │   │   ├── runtime_suspended_time
│   │   │   └── runtime_usage
│   │   ├── subsystem -> ../../../../../../../../class/drm_dp_aux_dev
│   │   └── uevent
│   ├── edid
│   ├── enabled
│   ├── i2c-7
│   │   ├── delete_device
│   │   ├── device -> ../../card0-DP-2
│   │   ├── name
│   │   ├── new_device
│   │   ├── power
│   │   │   ├── async
│   │   │   ├── runtime_active_kids
│   │   │   ├── runtime_enabled
│   │   │   ├── runtime_status
│   │   │   └── runtime_usage
│   │   ├── subsystem -> ../../../../../../../../bus/i2c
│   │   └── uevent
│   ├── modes
│   ├── power
│   │   ├── async
│   │   ├── autosuspend_delay_ms
│   │   ├── control
│   │   ├── runtime_active_kids
│   │   ├── runtime_active_time
│   │   ├── runtime_enabled
│   │   ├── runtime_status
│   │   ├── runtime_suspended_time
│   │   └── runtime_usage
│   ├── status
│   ├── subsystem -> ../../../../../../../class/drm
│   └── uevent
├── card0-DP-3
│   ├── ddc -> ../../../i2c-3
│   ├── device -> ../../card0
│   ├── dpms
│   ├── drm_dp_aux2
│   │   ├── dev
│   │   ├── device -> ../../card0-DP-3
│   │   ├── name
│   │   ├── power
│   │   │   ├── async
│   │   │   ├── autosuspend_delay_ms
│   │   │   ├── control
│   │   │   ├── runtime_active_kids
│   │   │   ├── runtime_active_time
│   │   │   ├── runtime_enabled
│   │   │   ├── runtime_status
│   │   │   ├── runtime_suspended_time
│   │   │   └── runtime_usage
│   │   ├── subsystem -> ../../../../../../../../class/drm_dp_aux_dev
│   │   └── uevent
│   ├── edid
│   ├── enabled
│   ├── i2c-8
│   │   ├── delete_device
│   │   ├── device -> ../../card0-DP-3
│   │   ├── name
│   │   ├── new_device
│   │   ├── power
│   │   │   ├── async
│   │   │   ├── runtime_active_kids
│   │   │   ├── runtime_enabled
│   │   │   ├── runtime_status
│   │   │   └── runtime_usage
│   │   ├── subsystem -> ../../../../../../../../bus/i2c
│   │   └── uevent
│   ├── modes
│   ├── power
│   │   ├── async
│   │   ├── autosuspend_delay_ms
│   │   ├── control
│   │   ├── runtime_active_kids
│   │   ├── runtime_active_time
│   │   ├── runtime_enabled
│   │   ├── runtime_status
│   │   ├── runtime_suspended_time
│   │   └── runtime_usage
│   ├── status
│   ├── subsystem -> ../../../../../../../class/drm
│   └── uevent
├── card0-DVI-D-1
│   ├── ddc -> ../../../i2c-5
│   ├── device -> ../../card0
│   ├── dpms
│   ├── edid
│   ├── enabled
│   ├── modes
│   ├── power
│   │   ├── async
│   │   ├── autosuspend_delay_ms
│   │   ├── control
│   │   ├── runtime_active_kids
│   │   ├── runtime_active_time
│   │   ├── runtime_enabled
│   │   ├── runtime_status
│   │   ├── runtime_suspended_time
│   │   └── runtime_usage
│   ├── status
│   ├── subsystem -> ../../../../../../../class/drm
│   └── uevent
├── card0-HDMI-A-1
│   ├── ddc -> ../../../i2c-4
│   ├── device -> ../../card0
│   ├── dpms
│   ├── edid
│   ├── enabled
│   ├── modes
│   ├── power
│   │   ├── async
│   │   ├── autosuspend_delay_ms
│   │   ├── control
│   │   ├── runtime_active_kids
│   │   ├── runtime_active_time
│   │   ├── runtime_enabled
│   │   ├── runtime_status
│   │   ├── runtime_suspended_time
│   │   └── runtime_usage
│   ├── status
│   ├── subsystem -> ../../../../../../../class/drm
│   └── uevent
├── dev
├── device -> ../../../0000:07:00.0
├── power
│   ├── async
│   ├── autosuspend_delay_ms
│   ├── control
│   ├── runtime_active_kids
│   ├── runtime_active_time
│   ├── runtime_enabled
│   ├── runtime_status
│   ├── runtime_suspended_time
│   └── runtime_usage
├── subsystem -> ../../../../../../class/drm
└── uevent

52 directories, 149 files
$ cat /proc/cmdline
BOOT_IMAGE=(hd0,gpt2)/@/nix/store/szpmr752mzr1ylzixp2xnrgl6jwxjrcx-linux-6.4.11/bzImage init=/nix/store/5b8pb0m6mb5gkmr6zcpj2hbavz51z9qc-nixos-system-dreamon-23.05.20230829.2ab91c8/init amdgpu.ppfeaturemask=0xffffffff loglevel=4
$ nix-shell -p nix-info --run "nix-info -m"
 - system: `"x86_64-linux"`
 - host os: `Linux 6.4.11-xanmod1, NixOS, 23.05 (Stoat), 23.05.20230829.2ab91c8`
 - multi-user?: `yes`
 - sandbox: `yes`
 - version: `nix-env (Nix) 2.13.5`
 - channels(root): `"nixos-23.05, nixos-unstable"`
 - channels(raptor): `"home-manager-23.05.tar.gz, nixpkgs-23.05, nixpkgs-unstable"`
 - channels(raptor-experiment): `"home-manager-23.05.tar.gz, nixpkgs-23.05"`
 - nixpkgs: `/home/raptor/.nix-defexpr/channels/nixpkgs`

It seems that it can't see the GPU, i wasn't able to diagnose it further

built from commit 9533234

CC @ilya-zlobintsev

Lact crashes when I open a game

Hi. I found a bug when I open a game (L4D2 for example):

[bkdwt@localhost ~]$ lact-gui
Connection to daemon established
thread '<unnamed>' panicked at 'Socket failed: Sys(EMFILE)', daemon/src/daemon_connection.rs:72:10
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace

(lact-gui:3177): Gtk-WARNING **: 21:13:37.911: Could not load a pixbuf from /org/gtk/libgtk/theme/Adwaita/assets/bullet-symbolic.svg.
This may indicate that pixbuf loaders or the mime database could not be found.
**
Gtk:ERROR:gtkiconhelper.c:494:ensure_surface_for_gicon: assertion failed (error == NULL): Failed to load /org/gtk/libgtk/icons/16x16/status/image-missing.png: Formato de arquivo de imagem não reconhecido (gdk-pixbuf-error-quark, 3)
Bail out! Gtk:ERROR:gtkiconhelper.c:494:ensure_surface_for_gicon: assertion failed (error == NULL): Failed to load /org/gtk/libgtk/icons/16x16/status/image-missing.png: Formato de arquivo de imagem não reconhecido (gdk-pixbuf-error-quark, 3)
Abortado (imagem do núcleo gravada)

I can only open the application again if I restart the system.

maybe add note to readme about finer fan control

I noticed in the readme that nothing about doing finer control of the fan curve is mentioned. The daemon seems to have no problem with doing this if you manually create fan speed and temp targets in the Json and works well for creating specific temp/fan targets. I havent tested beyond adding just one step fyi but fan control seems to work much better than radeon-profile and corectrl which both seem to cause the fan to get stuck in higher speed modes

I.E

default

"fan_control_enabled": true,
        "fan_curve": {
          "20": 0.0,
          "40": 0.0,
          "60": 50.0,
          "80": 75.0,
          "100": 100.0

edited to add 0rpm fan mode below 50c

"fan_control_enabled": true,
        "fan_curve": {
          "20": 0.0,
          "40": 0.0,
          "50": 0.0,
          "60": 50.0,
          "80": 75.0,
          "100": 100.0

It won't read my gpu

AMD Radeon 6800XT
Installed through AUR and enabled/started the service.

image

2023-04-18T17:50:10.586476Z ERROR lact_gui::app: Could not fetch stats: Got error from daemon: No controller with such id 2023-04-18T17:50:10.837018Z ERROR lact_gui::app: Could not fetch stats: Got error from daemon: No controller with such id 2023-04-18T17:50:11.087490Z ERROR lact_gui::app: Could not fetch stats: Got error from daemon: No controller with such id 2023-04-18T17:50:11.338026Z ERROR lact_gui::app: Could not fetch stats: Got error from daemon: No controller with such id

Feature or advice

For systemd users we cannot over clock unless we edit the file located in /boot/loader/entries/what ever the system say your file is

and add
options root=LABEL=frzr_root rw rootflags=subvol=deployments/chimeraos-45_65b2a8b quiet splash loglevel=3 rd.systemd.show_status=auto rd.udev.log_priority=3 ibt=off split_lock_detect=off iomem=relaxed nowatchdog amdgpu.ppfeaturemask=0xffffffff

and it will give u overclocking features on systemd bootloader

thread 'main' panicked at 'called `Option::unwrap()` on a `None` value', gui/src/app/header.rs:55:56

I had uninstalled LACT doing some testing with some other tools, now when i install the regular LACT from AUR i get this

RUST_BACKTRACE=full lact-gui 
Connection to daemon established
thread 'main' panicked at 'called `Option::unwrap()` on a `None` value', gui/src/app/header.rs:55:56
stack backtrace:
   0:     0x55dcbe7b2950 - <unknown>
   1:     0x55dcbe7d3d7c - <unknown>
   2:     0x55dcbe7ad725 - <unknown>
   3:     0x55dcbe7b4aab - <unknown>
   4:     0x55dcbe7b4581 - <unknown>
   5:     0x55dcbe7b5184 - <unknown>
   6:     0x55dcbe7b4c27 - <unknown>
   7:     0x55dcbe7b2e4c - <unknown>
   8:     0x55dcbe7b4bb9 - <unknown>
   9:     0x55dcbe3a5651 - <unknown>
  10:     0x55dcbe3a559d - <unknown>
  11:     0x55dcbe3b6749 - <unknown>
  12:     0x7f56eb667030 - g_signal_emit_valist
  13:     0x7f56eb6671a0 - g_signal_emit
  14:     0x7f56eaf7e919 - <unknown>
  15:     0x7f56eaf7eb02 - gtk_combo_box_set_active
  16:     0x55dcbe3b3489 - <unknown>
  17:     0x55dcbe3a8a13 - <unknown>
  18:     0x55dcbe3aebff - <unknown>
  19:     0x55dcbe3ba1a3 - <unknown>
  20:     0x55dcbe3ad439 - <unknown>
  21:     0x55dcbe7b578a - <unknown>
  22:     0x55dcbe3aedc2 - <unknown>
  23:     0x7f56ea593b25 - __libc_start_main
  24:     0x55dcbe3a5e2e - <unknown>
  25:                0x0 - <unknown>

LACT-git still works and is building an older version from april but if I update the pkgbuild for the latest git it also crashes with this.

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.