Udev rule to lower AMD CPU 'scaling_min_freq' value for kernel 6.13 & up

Yep this is the solution and this did the job!
Credits to @megavolt and @linux-aarhus in creating the correct udev rule. See below for a short howto guide to implement this udev rule.

`SUBSYSTEM=="cpu", KERNEL=="cpu[0-9]|cpu[0-9][0-9]", ACTION=="add|change", RUN="/usr/bin/bash -c 'echo 550000 > /sys/devices/system/cpu/%k/cpufreq/scaling_min_freq'"`

My sincere thanks!

I’ll write a short guide, also in the other thread, how to make make this udev rule for 6.13 and up those seeking how to add this as well.

The following is a simple howto how to create the udev rule when using Kernel 6.13.x > that lowers the idle frequency to 550Mhz which was the default up to Kernel 6.12.x, when using amd-pstate=passive or amd-pstate=active kernel boot parameters.

Step 1)
First look up what your current scaling_min_freq frequency is set to:

$ udevadm info --attribute-walk --path=/devices/system/cpu/cpu0 | grep 'scaling_min_freq'

    ATTRS{cpufreq/policy0/scaling_min_freq}=="1756000"
    ATTRS{cpufreq/policy1/scaling_min_freq}=="1756000"
    ATTRS{cpufreq/policy10/scaling_min_freq}=="1756000"
    ATTRS{cpufreq/policy11/scaling_min_freq}=="1756000"
    ATTRS{cpufreq/policy12/scaling_min_freq}=="1756000"
    ATTRS{cpufreq/policy13/scaling_min_freq}=="1756000"
    ATTRS{cpufreq/policy14/scaling_min_freq}=="1756000"
    ATTRS{cpufreq/policy15/scaling_min_freq}=="1756000"
    ATTRS{cpufreq/policy2/scaling_min_freq}=="1756000"
    ATTRS{cpufreq/policy3/scaling_min_freq}=="1756000"
    ATTRS{cpufreq/policy4/scaling_min_freq}=="1756000"
    ATTRS{cpufreq/policy5/scaling_min_freq}=="1756000"
    ATTRS{cpufreq/policy6/scaling_min_freq}=="1756000"
    ATTRS{cpufreq/policy7/scaling_min_freq}=="1756000"
    ATTRS{cpufreq/policy8/scaling_min_freq}=="1756000"
    ATTRS{cpufreq/policy9/scaling_min_freq}=="1756000"

The policy0 to 15 shows the number of CPU threads, the value is the Mhz. For my 5700X this is 1756Mhz.

Step 2)
Creating the udev rule.
First create the empty udev rule file:

$ sudo touch /etc/udev/rules.d/99-cpufreq-scaling-min-freq.rules

Open and edit with an editor of choice:

$ sudo nano /etc/udev/rules.d/99-cpufreq-scaling-min-freq.rules

Add or copy paste the following rule:

SUBSYSTEM=="cpu", KERNEL=="cpu[0-9]|cpu[0-9][0-9]", ACTION=="add|change", RUN="/usr/bin/bash -c 'echo 550000 > /sys/devices/system/cpu/%k/cpufreq/scaling_min_freq'"

Save and exit.

Step 3)
Testing if the udev rule has no errors:

$ udevadm test /sys/devices/system/cpu/cpu0

It should output something like this with no failed entries related to 99-cpufreq-scaling-min-freq.rules. See hidden output below:

Output
$ udevadm test /sys/devices/system/cpu/cpu0

This program is for debugging only, it does not run any program
specified by a RUN key. It may show incorrect results, because
some values may be different, or not available at a simulation run.

Trying to open "/etc/systemd/hwdb/hwdb.bin"...
Trying to open "/etc/udev/hwdb.bin"...
Trying to open "/usr/lib/systemd/hwdb/hwdb.bin"...
Trying to open "/usr/lib/udev/hwdb.bin"...
=== trie on-disk ===
tool version:          257
file size:        13186944 bytes
header size             80 bytes
strings            2702840 bytes
nodes             10484024 bytes
Loading kernel module index.
Loaded 'libkmod.so.2' via dlopen()
Failed to read $container of PID 1, ignoring: Permission denied
Found container virtualization none.
Using default interface naming scheme 'v257'.
Parsed configuration file "/usr/lib/systemd/network/99-default.link"
Parsed configuration file "/usr/lib/systemd/network/80-vm-vt.link"
Parsed configuration file "/usr/lib/systemd/network/80-namespace-ns.link"
Parsed configuration file "/usr/lib/systemd/network/80-container-vz.link"
Parsed configuration file "/usr/lib/systemd/network/80-container-ve.link"
Parsed configuration file "/usr/lib/systemd/network/80-container-vb.link"
Parsed configuration file "/usr/lib/systemd/network/80-6rd-tunnel.link"
Created link configuration context.
Reading rules file: /usr/lib/udev/rules.d/01-md-raid-creating.rules
Reading rules file: /usr/lib/udev/rules.d/10-dm.rules
Reading rules file: /usr/lib/udev/rules.d/11-dm-lvm.rules
Reading rules file: /usr/lib/udev/rules.d/13-dm-disk.rules
Reading rules file: /usr/lib/udev/rules.d/39-usbmuxd.rules
Reading rules file: /usr/lib/udev/rules.d/40-gphoto.rules
Reading rules file: /usr/lib/udev/rules.d/40-usb-media-players.rules
Reading rules file: /usr/lib/udev/rules.d/40-usb_modeswitch.rules
Reading rules file: /usr/lib/udev/rules.d/45-i2c-tools.rules
Reading rules file: /usr/lib/udev/rules.d/50-udev-default.rules
Reading rules file: /usr/lib/udev/rules.d/60-autosuspend.rules
Reading rules file: /usr/lib/udev/rules.d/60-block.rules
Reading rules file: /usr/lib/udev/rules.d/60-cdrom_id.rules
Reading rules file: /usr/lib/udev/rules.d/60-ddcutil-i2c.rules
Reading rules file: /usr/lib/udev/rules.d/60-dmi-id.rules
Reading rules file: /usr/lib/udev/rules.d/60-drm.rules
Reading rules file: /usr/lib/udev/rules.d/60-evdev.rules
Reading rules file: /usr/lib/udev/rules.d/60-fido-id.rules
Reading rules file: /usr/lib/udev/rules.d/60-infiniband.rules
Reading rules file: /usr/lib/udev/rules.d/60-input-id.rules
Reading rules file: /usr/lib/udev/rules.d/60-nfs.rules
Reading rules file: /usr/lib/udev/rules.d/60-openrgb.rules
Reading rules file: /usr/lib/udev/rules.d/60-persistent-alsa.rules
Reading rules file: /usr/lib/udev/rules.d/60-persistent-input.rules
Reading rules file: /usr/lib/udev/rules.d/60-persistent-storage-mtd.rules
Reading rules file: /usr/lib/udev/rules.d/60-persistent-storage-tape.rules
Reading rules file: /usr/lib/udev/rules.d/60-persistent-storage.rules
Reading rules file: /usr/lib/udev/rules.d/60-persistent-v4l.rules
Reading rules file: /usr/lib/udev/rules.d/60-rfkill.rules
Reading rules file: /usr/lib/udev/rules.d/60-sensor.rules
Reading rules file: /usr/lib/udev/rules.d/60-serial.rules
Reading rules file: /usr/lib/udev/rules.d/60-tpm-udev.rules
Reading rules file: /usr/lib/udev/rules.d/60-upower-battery.rules
Reading rules file: /usr/lib/udev/rules.d/60-vboxdrv.rules
Reading rules file: /usr/lib/udev/rules.d/63-md-raid-arrays.rules
Reading rules file: /usr/lib/udev/rules.d/64-btrfs-dm.rules
Reading rules file: /usr/lib/udev/rules.d/64-btrfs-zoned.rules
Reading rules file: /usr/lib/udev/rules.d/64-btrfs.rules
Reading rules file: /usr/lib/udev/rules.d/64-ext4.rules
Reading rules file: /usr/lib/udev/rules.d/64-md-raid-assembly.rules
Reading rules file: /usr/lib/udev/rules.d/64-xfs.rules
Reading rules file: /usr/lib/udev/rules.d/65-libwacom.rules
Reading rules file: /usr/lib/udev/rules.d/65-persistent-net-nbft.rules
Reading rules file: /usr/lib/udev/rules.d/65-sane.rules
Reading rules file: /usr/lib/udev/rules.d/66-saned.rules
Reading rules file: /usr/lib/udev/rules.d/69-dm-lvm.rules
Reading rules file: /usr/lib/udev/rules.d/69-libftdi.rules
Reading rules file: /usr/lib/udev/rules.d/69-libmtp.rules
Reading rules file: /usr/lib/udev/rules.d/69-md-clustered-confirm-device.rules
Reading rules file: /usr/lib/udev/rules.d/70-camera.rules
Reading rules file: /usr/lib/udev/rules.d/70-flashrom.rules
Reading rules file: /usr/lib/udev/rules.d/70-infrared.rules
Reading rules file: /usr/lib/udev/rules.d/70-joystick.rules
Reading rules file: /usr/lib/udev/rules.d/70-memory.rules
Reading rules file: /usr/lib/udev/rules.d/70-mouse.rules
Reading rules file: /usr/lib/udev/rules.d/70-nvmf-autoconnect.rules
Reading rules file: /usr/lib/udev/rules.d/70-nvmf-keys.rules
Reading rules file: /usr/lib/udev/rules.d/70-power-switch.rules
Reading rules file: /usr/lib/udev/rules.d/70-printers.rules
Reading rules file: /usr/lib/udev/rules.d/70-steam-input.rules
Reading rules file: /usr/lib/udev/rules.d/70-steam-vr.rules
Reading rules file: /usr/lib/udev/rules.d/70-touchpad.rules
Reading rules file: /usr/lib/udev/rules.d/70-uaccess.rules
Reading rules file: /usr/lib/udev/rules.d/71-8bitdo-controllers.rules
Reading rules file: /usr/lib/udev/rules.d/71-alpha_imaging_technology_co-vr.rules
Reading rules file: /usr/lib/udev/rules.d/71-astro_gaming-controllers.rules
Reading rules file: /usr/lib/udev/rules.d/71-betop-controllers.rules
Reading rules file: /usr/lib/udev/rules.d/71-google-controllers.rules
Reading rules file: /usr/lib/udev/rules.d/71-hori-controllers.rules
Reading rules file: /usr/lib/udev/rules.d/71-htc-vr.rules
Reading rules file: /usr/lib/udev/rules.d/71-logitech-controllers.rules
Reading rules file: /usr/lib/udev/rules.d/71-mad_catz-controllers.rules
Reading rules file: /usr/lib/udev/rules.d/71-microsoft-controllers.rules
Reading rules file: /usr/lib/udev/rules.d/71-nacon-controllers.rules
Reading rules file: /usr/lib/udev/rules.d/71-nintendo-controllers.rules
Reading rules file: /usr/lib/udev/rules.d/71-nvidia-controllers.rules
Reading rules file: /usr/lib/udev/rules.d/71-nvmf-netapp.rules
Reading rules file: /usr/lib/udev/rules.d/71-pdp-controllers.rules
Reading rules file: /usr/lib/udev/rules.d/71-personal_communication_systems_inc-controllers.rules
Reading rules file: /usr/lib/udev/rules.d/71-pid_codes-controllers.rules
Reading rules file: /usr/lib/udev/rules.d/71-powera-controllers.rules
Reading rules file: /usr/lib/udev/rules.d/71-razer-controllers.rules
Reading rules file: /usr/lib/udev/rules.d/71-seat.rules
Reading rules file: /usr/lib/udev/rules.d/71-sony-controllers.rules
Reading rules file: /usr/lib/udev/rules.d/71-sony-vr.rules
Reading rules file: /usr/lib/udev/rules.d/71-uinput-dev-early-creation.rules
Reading rules file: /usr/lib/udev/rules.d/71-valve-controllers.rules
Reading rules file: /usr/lib/udev/rules.d/71-valve-vr.rules
Reading rules file: /usr/lib/udev/rules.d/71-zeroplus_technology_corporation-controllers.rules
Reading rules file: /usr/lib/udev/rules.d/73-seat-late.rules
Reading rules file: /usr/lib/udev/rules.d/75-net-description.rules
Reading rules file: /usr/lib/udev/rules.d/75-probe_mtd.rules
Reading rules file: /usr/lib/udev/rules.d/77-mm-broadmobi-port-types.rules
Reading rules file: /usr/lib/udev/rules.d/77-mm-cinterion-port-types.rules
Reading rules file: /usr/lib/udev/rules.d/77-mm-dell-port-types.rules
Reading rules file: /usr/lib/udev/rules.d/77-mm-dlink-port-types.rules
Reading rules file: /usr/lib/udev/rules.d/77-mm-ericsson-mbm.rules
Reading rules file: /usr/lib/udev/rules.d/77-mm-fibocom-port-types.rules
Reading rules file: /usr/lib/udev/rules.d/77-mm-foxconn-port-types.rules
Reading rules file: /usr/lib/udev/rules.d/77-mm-gosuncn-port-types.rules
Reading rules file: /usr/lib/udev/rules.d/77-mm-haier-port-types.rules
Reading rules file: /usr/lib/udev/rules.d/77-mm-huawei-net-port-types.rules
Reading rules file: /usr/lib/udev/rules.d/77-mm-linktop-port-types.rules
Reading rules file: /usr/lib/udev/rules.d/77-mm-longcheer-port-types.rules
Reading rules file: /usr/lib/udev/rules.d/77-mm-mtk-port-types.rules
Reading rules file: /usr/lib/udev/rules.d/77-mm-nokia-port-types.rules
Reading rules file: /usr/lib/udev/rules.d/77-mm-qcom-soc.rules
Reading rules file: /usr/lib/udev/rules.d/77-mm-quectel-port-types.rules
Reading rules file: /usr/lib/udev/rules.d/77-mm-sierra.rules
Reading rules file: /usr/lib/udev/rules.d/77-mm-simtech-port-types.rules
Reading rules file: /usr/lib/udev/rules.d/77-mm-telit-port-types.rules
Reading rules file: /usr/lib/udev/rules.d/77-mm-tplink-port-types.rules
Reading rules file: /usr/lib/udev/rules.d/77-mm-ublox-port-types.rules
Reading rules file: /usr/lib/udev/rules.d/77-mm-x22x-port-types.rules
Reading rules file: /usr/lib/udev/rules.d/77-mm-zte-port-types.rules
Reading rules file: /usr/lib/udev/rules.d/78-sound-card.rules
Reading rules file: /usr/lib/udev/rules.d/80-drivers.rules
Reading rules file: /usr/lib/udev/rules.d/80-libinput-device-groups.rules
Reading rules file: /usr/lib/udev/rules.d/80-mm-candidate.rules
Reading rules file: /usr/lib/udev/rules.d/80-net-setup-link.rules
Reading rules file: /usr/lib/udev/rules.d/80-udisks2.rules
Reading rules file: /usr/lib/udev/rules.d/81-net-dhcp.rules
Reading rules file: /usr/lib/udev/rules.d/84-nm-drivers.rules
Reading rules file: /usr/lib/udev/rules.d/85-nm-unmanaged.rules
Reading rules file: /usr/lib/udev/rules.d/85-regulatory.rules
Reading rules file: /usr/lib/udev/rules.d/90-alsa-restore.rules
Reading rules file: /usr/lib/udev/rules.d/90-iocost.rules
Reading rules file: /usr/lib/udev/rules.d/90-libinput-fuzz-override.rules
Reading rules file: /usr/lib/udev/rules.d/90-nm-thunderbolt.rules
Reading rules file: /usr/lib/udev/rules.d/90-pipewire-alsa.rules
Reading rules file: /usr/lib/udev/rules.d/90-vconsole.rules
Reading rules file: /usr/lib/udev/rules.d/95-dm-notify.rules
Reading rules file: /usr/lib/udev/rules.d/95-upower-hid.rules
Reading rules file: /usr/lib/udev/rules.d/95-upower-wup.rules
Reading rules file: /usr/lib/udev/rules.d/96-e2scrub.rules
Reading rules file: /etc/udev/rules.d/99-cpufreq-scaling-min-freq.rules
Reading rules file: /usr/lib/udev/rules.d/99-fuse.rules
Reading rules file: /usr/lib/udev/rules.d/99-fuse3.rules
Reading rules file: /usr/lib/udev/rules.d/99-nfs.rules
Reading rules file: /usr/lib/udev/rules.d/99-systemd.rules
Reading rules file: /etc/udev/rules.d/99-usb-sync.rules
cpu0: /usr/lib/udev/rules.d/50-udev-default.rules:20 Importing properties from results of builtin command 'hwdb --subsystem=cpu'
cpu0: hwdb modalias key: "cpu:type:x86,ven0002fam0019mod0021:feature:,0000,0001,0002,0003,0004,0005,0006,0007,0008,0009,000B,000C,000D,000E,000F,0010,0011,0013,0017,0018,0019,001A,001C,0020,0021,0022,0023,0024,0025,0026,0027,0028,0029,002B,002C,002D,002E,002F,0030,0031,0034,0036,0037,0038,0039,003A,003B,003D,0064,0068,006E,0070,0074,0075,0076,0078,0079,007A,007C,007D,0080,0081,0083,0089,008C,008D,0093,0094,0095,0096,0097,0099,009A,009B,009C,009D,009E,00C0,00C1,00C2,00C3,00C4,00C5,00C6,00C7,00C8,00C9,00CA,00CC,00CD,00D1,00D6,00D7,00D8,00DA,00DC,00DD,00DE,00E2,00E4,00E6,00E8,00EA,00ED,00F0,00F1,00F2,00F3,00F5,00F6,00F9,00FA,00FB,00FC,010F,0120,0123,0125,0127,0128,0129,012A,012C,012F,0132,0133,0134,0137,0138,013D,0140,0141,0142,0143,0160,0161,0162,0163,0165,016C,016E,016F,0177,0179,017D,018B,01A0,01A1,01A2,01A4,01A6,01A9,01AA,01AC,01AD,01AE,01AF,01B1,01B2,01B3,01B4,01B8,01BC,01BD,01C2,01E0,01E1,01E2,01E3,01E4,01E5,01E6,01E7,01EA,01EB,01EC,01ED,01EF,01F0,01F1,01F3,01F4,01FC,0202,0203,0204,0207,0209,020A,0216,0220,0221,0223,0224,0225,0244,0262,026B,026C,026D,026E,0270,0280,0282,0283,0286,029B,029C"
cpu0: No entry found from hwdb.
cpu0: /usr/lib/udev/rules.d/50-udev-default.rules:20 Failed to run builtin 'hwdb --subsystem=cpu': No data available
cpu0: /usr/lib/udev/rules.d/80-drivers.rules:5 RUN 'kmod load'
cpu0: /etc/udev/rules.d/99-cpufreq-scaling-min-freq.rules:1 RUN '/usr/bin/bash -c 'echo 550000 > /sys/devices/system/cpu/%k/cpufreq/scaling_min_freq''
Properties:
  DEVPATH=/devices/system/cpu/cpu0
  DRIVER=processor
  MODALIAS=cpu:type:x86,ven0002fam0019mod0021:feature:,0000,0001,0002,0003,0004,0005,0006,0007,0008,0009,000B,000C,000D,000E,000F,0010,0011,0013,0017,0018,0019,001A,001C,0020,0021,0022,0023,0024,0025,0026,0027,0028,0029,002B,002C,002D,002E,002F,0030,0031,0034,0036,0037,0038,0039,003A,003B,003D,0064,0068,006E,0070,0074,0075,0076,0078,0079,007A,007C,007D,0080,0081,0083,0089,008C,008D,0093,0094,0095,0096,0097,0099,009A,009B,009C,009D,009E,00C0,00C1,00C2,00C3,00C4,00C5,00C6,00C7,00C8,00C9,00CA,00CC,00CD,00D1,00D6,00D7,00D8,00DA,00DC,00DD,00DE,00E2,00E4,00E6,00E8,00EA,00ED,00F0,00F1,00F2,00F3,00F5,00F6,00F9,00FA,00FB,00FC,010F,0120,0123,0125,0127,0128,0129,012A,012C,012F,0132,0133,0134,0137,0138,013D,0140,0141,0142,0143,0160,0161,0162,0163,0165,016C,016E,016F,0177,0179,017D,018B,01A0,01A1,01A2,01A4,01A6,01A9,01AA,01AC,01AD,01AE,01AF,01B1,01B2,01B3,01B4,01B8,01BC,01BD,01C2,01E0,01E1,01E2,01E3,01E4,01E5,01E6,01E7,01EA,01EB,01EC,01ED,01EF,01F0,01F1,01F3,01F4,01FC,0202,0203,0204,0207,0209,020A,0216,0220,0221,0223,0224,0225,0244,0262,026B,026C,026D,026E,0270,0280,0282,0283,0286,029B,029C
  ACTION=add
  SUBSYSTEM=cpu
  USEC_INITIALIZED=643493474
Queued commands:
  RUN{program} : /usr/bin/bash -c 'echo 550000 > /sys/devices/system/cpu/cpu0/cpufreq/scaling_min_freq'
Unload kernel module index.
Unloaded link configuration context.

Step 4)
Reload your systems udev rules:

$ sudo udevadm control --reload

Trigger the reloaded udev rules:

$ sudo udevadm trigger

Check if the udev rule has been applied:

$ udevadm info --attribute-walk --path=/devices/system/cpu/cpu0 | grep 'scaling_min_freq'

    ATTRS{cpufreq/policy0/scaling_min_freq}=="550000"
    ATTRS{cpufreq/policy1/scaling_min_freq}=="550000"
    ATTRS{cpufreq/policy10/scaling_min_freq}=="550000"
    ATTRS{cpufreq/policy11/scaling_min_freq}=="550000"
    ATTRS{cpufreq/policy12/scaling_min_freq}=="550000"
    ATTRS{cpufreq/policy13/scaling_min_freq}=="550000"
    ATTRS{cpufreq/policy14/scaling_min_freq}=="550000"
    ATTRS{cpufreq/policy15/scaling_min_freq}=="550000"
    ATTRS{cpufreq/policy2/scaling_min_freq}=="550000"
    ATTRS{cpufreq/policy3/scaling_min_freq}=="550000"
    ATTRS{cpufreq/policy4/scaling_min_freq}=="550000"
    ATTRS{cpufreq/policy5/scaling_min_freq}=="550000"
    ATTRS{cpufreq/policy6/scaling_min_freq}=="550000"
    ATTRS{cpufreq/policy7/scaling_min_freq}=="550000"
    ATTRS{cpufreq/policy8/scaling_min_freq}=="550000"
    ATTRS{cpufreq/policy9/scaling_min_freq}=="550000"

That is it.
Your Ryzen idle frequencies should be at 550Mhz as it was up to Kernel 6.12.x.

Optional Step 5)
How to disable this udev rule.
Open a terminal to:

$ cd /etc/udev/rules.d

Rename the 99-cpufreq-scaling-min-freq.rules file:

$ sudo mv 99-cpufreq-scaling-min-freq.rules 99-cpufreq-scaling-min-freq.rules.old

Then reload your systems udev rules:

$ sudo udevadm control --reload

And trigger the reloaded udev rules:

$ sudo udevadm trigger

Confirm if scaling_min_freq is set back to the 6.13 default value as noted in Step 1.

udevadm info --attribute-walk --path=/devices/system/cpu/cpu0 | grep 'scaling_min_freq'

The udev rule has been disabled and idle frequency is set back to default behavior for Kernels 6.13.x and up.

1 Like