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

In kernel 6.13 scaling_min_freq value was changed to the CPU’s Lowest Non Linear Frequency value. Got a reply from the AMD dev who made the commit, the scaling_min_freq value can be user configured through udev rules.

I’m looking to create a udev rule, that set scaling_min_freq value back to 550000. The guide I am using is the Arch guide on creating udev rules.

Thus far I am not succeeding and I’m a bit out of my depth on udev rule creation.

Device path:
/sys/devices/system/cpu/cpu*/cpufreq/scaling_min_freq

First udev rule I wrote and tested did not work:
SUBSYSTEM=="cpu", KERNEL=="cpu[0-15]", ACTION=="add", ATTR{cpufreq/scaling_min_freq}="550000"

Then using udevadm to look up the device I get this output:

udevadm info --attribute-walk --path=/devices/system/cpu/cpu0

  looking at device '/devices/system/cpu/cpu0':
    KERNEL=="cpu0"
    SUBSYSTEM=="cpu"
    DRIVER=="processor"
    ATTR{acpi_cppc/feedback_ctrs}=="ref:541866155036 del:378045918914"
    ATTR{acpi_cppc/guaranteed_perf}=="0"
    ATTR{acpi_cppc/highest_perf}=="186"
    ATTR{acpi_cppc/lowest_freq}=="550"
    ATTR{acpi_cppc/lowest_nonlinear_perf}=="60"
    ATTR{acpi_cppc/lowest_perf}=="19"
    ATTR{acpi_cppc/nominal_freq}=="3401"
    ATTR{acpi_cppc/nominal_perf}=="116"
    ATTR{acpi_cppc/reference_perf}=="116"
    ATTR{acpi_cppc/wraparound_time}=="18446744073709551615"
    ATTR{cpuidle/state0/above}=="0"
    ATTR{cpuidle/state0/below}=="23931"
    ATTR{cpuidle/state0/default_status}=="enabled"
    ATTR{cpuidle/state0/desc}=="CPUIDLE CORE POLL IDLE"
    ATTR{cpuidle/state0/disable}=="0"
    ATTR{cpuidle/state0/latency}=="0"
    ATTR{cpuidle/state0/name}=="POLL"
    ATTR{cpuidle/state0/power}=="4294967295"
    ATTR{cpuidle/state0/rejected}=="0"
    ATTR{cpuidle/state0/residency}=="0"
    ATTR{cpuidle/state0/time}=="302061"
    ATTR{cpuidle/state0/usage}=="27868"
    ATTR{cpuidle/state1/above}=="23895"
    ATTR{cpuidle/state1/below}=="85425"
    ATTR{cpuidle/state1/default_status}=="enabled"
    ATTR{cpuidle/state1/desc}=="ACPI FFH MWAIT 0x0"
    ATTR{cpuidle/state1/disable}=="0"
    ATTR{cpuidle/state1/latency}=="1"
    ATTR{cpuidle/state1/name}=="C1"
    ATTR{cpuidle/state1/power}=="0"
    ATTR{cpuidle/state1/rejected}=="0"
    ATTR{cpuidle/state1/residency}=="2"
    ATTR{cpuidle/state1/time}=="28108192"
    ATTR{cpuidle/state1/usage}=="310973"
    ATTR{cpuidle/state2/above}=="373804"
    ATTR{cpuidle/state2/below}=="0"
    ATTR{cpuidle/state2/default_status}=="enabled"
    ATTR{cpuidle/state2/desc}=="ACPI IOPORT 0x414"
    ATTR{cpuidle/state2/disable}=="0"
    ATTR{cpuidle/state2/latency}=="18"
    ATTR{cpuidle/state2/name}=="C2"
    ATTR{cpuidle/state2/power}=="0"
    ATTR{cpuidle/state2/rejected}=="0"
    ATTR{cpuidle/state2/residency}=="36"
    ATTR{cpuidle/state2/s2idle/time}=="0"
    ATTR{cpuidle/state2/s2idle/usage}=="0"
    ATTR{cpuidle/state2/time}=="2385504709"
    ATTR{cpuidle/state2/usage}=="2735534"
    ATTR{crash_notes}=="(not readable)"
    ATTR{crash_notes_size}=="(not readable)"
    ATTR{hotplug/fail}=="-1"
    ATTR{hotplug/state}=="238"
    ATTR{hotplug/target}=="238"
    ATTR{microcode/processor_flags}=="0x0"
    ATTR{microcode/version}=="0xa201210"
    ATTR{power/control}=="auto"
    ATTR{power/pm_qos_resume_latency_us}=="0"
    ATTR{power/runtime_active_time}=="0"
    ATTR{power/runtime_status}=="unsupported"
    ATTR{power/runtime_suspended_time}=="0"
    ATTR{topology/cluster_cpus}=="0101"
    ATTR{topology/cluster_cpus_list}=="0,8"
    ATTR{topology/cluster_id}=="65535"
    ATTR{topology/core_cpus}=="0101"
    ATTR{topology/core_cpus_list}=="0,8"
    ATTR{topology/core_id}=="0"
    ATTR{topology/core_siblings}=="ffff"
    ATTR{topology/core_siblings_list}=="0-15"
    ATTR{topology/die_cpus}=="ffff"
    ATTR{topology/die_cpus_list}=="0-15"
    ATTR{topology/die_id}=="0"
    ATTR{topology/package_cpus}=="ffff"
    ATTR{topology/package_cpus_list}=="0-15"
    ATTR{topology/physical_package_id}=="0"
    ATTR{topology/thread_siblings}=="0101"
    ATTR{topology/thread_siblings_list}=="0,8"

  looking at device '/devices/system/cpu':
    KERNEL=="cpu"
    SUBSYSTEM==""
    DRIVER==""
    ATTR{amd_pstate/prefcore}=="enabled"
    ATTR{amd_pstate/status}=="passive"
    ATTR{cpufreq/boost}=="1"
    ATTR{cpufreq/conservative/down_threshold}=="20"
    ATTR{cpufreq/conservative/freq_step}=="5"
    ATTR{cpufreq/conservative/ignore_nice_load}=="0"
    ATTR{cpufreq/conservative/sampling_down_factor}=="1"
    ATTR{cpufreq/conservative/sampling_rate}=="4000"
    ATTR{cpufreq/conservative/up_threshold}=="80"
    ATTR{cpufreq/policy0/affected_cpus}=="0"
    ATTR{cpufreq/policy0/amd_pstate_highest_perf}=="166"
    ATTR{cpufreq/policy0/amd_pstate_hw_prefcore}=="enabled"
    ATTR{cpufreq/policy0/amd_pstate_lowest_nonlinear_freq}=="1756000"
    ATTR{cpufreq/policy0/amd_pstate_max_freq}=="4865000"
    ATTR{cpufreq/policy0/amd_pstate_prefcore_ranking}=="186"
    ATTR{cpufreq/policy0/boost}=="1"
    ATTR{cpufreq/policy0/cpuinfo_max_freq}=="4865000"
    ATTR{cpufreq/policy0/cpuinfo_min_freq}=="550000"
    ATTR{cpufreq/policy0/cpuinfo_transition_latency}=="4000000"
    ATTR{cpufreq/policy0/related_cpus}=="0"
    ATTR{cpufreq/policy0/scaling_available_governors}=="conservative ondemand userspace powersave pe>
    ATTR{cpufreq/policy0/scaling_cur_freq}=="1756000"
    ATTR{cpufreq/policy0/scaling_driver}=="amd-pstate"
    ATTR{cpufreq/policy0/scaling_governor}=="conservative"
    ATTR{cpufreq/policy0/scaling_max_freq}=="4865000"
    ATTR{cpufreq/policy0/scaling_min_freq}=="1756000"
    ATTR{cpufreq/policy0/scaling_setspeed}=="<unsupported>"

On this I got stuck.
The device /devices/system/cpu/cpu0 does not have an ATTR scaling_min_freq.

The parent device /devices/system/cpu/ does have an ATTRS: ATTRS{cpufreq/policy0/scaling_min_freq}="1756000".

So how would this need to be written, then also to apply on all policies0-15?

SUBSYSTEM=="", KERNEL=="cpu", ACTION=="add", ATTRS{cpufreq/policy0/scaling_min_freq}="550000"

On testing this I get:

udevadm test --action=add /devices/system/cpu

...snip...

/etc/udev/rules.d/99-cpufreq-scaling-min-freq.rules:1 Invalid operator for ATTRS.

sd-device: Failed to chase symlinks in "/devices/system/cpu".
cpu: Failed to clone sd_device object: No such file or directory
Properties:
  DEVPATH=/devices/system/cpu
  ACTION=add
Unload kernel module index.
Unloaded link configuration context.

Can anyone pitch in?

You cannot set a value for ATTRS (=), only match it (==). You need to add a RUN="" which will set the value.

I guess that should work:

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

Manually setting value by sudo /usr/bin/bash -c 'echo 550000 > /sys/devices/system/cpu/cpu0/cpufreq/scaling_min_freq' works on cpu0.
Doesn’t KERNEL=="cpu[0-9]" need to be [0-15] to apply to all threads?

KERNEL=="cpu[0-9]" it applies the new min freq to those few threads
See:

udevadm info --attribute-walk --path=/devices/system/cpu | grep 'scaling_min_freq'
    ATTR{cpufreq/policy0/scaling_min_freq}=="550000"
    ATTR{cpufreq/policy1/scaling_min_freq}=="550000"
    ATTR{cpufreq/policy10/scaling_min_freq}=="1756000"
    ATTR{cpufreq/policy11/scaling_min_freq}=="1756000"
    ATTR{cpufreq/policy12/scaling_min_freq}=="1756000"
    ATTR{cpufreq/policy13/scaling_min_freq}=="1756000"
    ATTR{cpufreq/policy14/scaling_min_freq}=="1756000"
    ATTR{cpufreq/policy15/scaling_min_freq}=="1756000"
    ATTR{cpufreq/policy2/scaling_min_freq}=="550000"
    ATTR{cpufreq/policy3/scaling_min_freq}=="550000"
    ATTR{cpufreq/policy4/scaling_min_freq}=="550000"
    ATTR{cpufreq/policy5/scaling_min_freq}=="550000"
    ATTR{cpufreq/policy6/scaling_min_freq}=="550000"
    ATTR{cpufreq/policy7/scaling_min_freq}=="550000"
    ATTR{cpufreq/policy8/scaling_min_freq}=="550000"
    ATTR{cpufreq/policy9/scaling_min_freq}=="550000"

If I set:

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

This is erroneous thanks @linux-aarhus

Trust @megavolt - the cpu[0-9] is a regex checking for digits - so you effectively borked the rule by changing it to cpu[0-15]

1 Like

Thanks for that clarification.
I’m reading into regular expressions for 0-15 on stackoverflow and it’s, well interesting. But I’ll wait on @megavolt

The definition of a regular expression is quite broad but in context - the cpu listing is using arabic numerals 0-9 which is what the expression is validating cpu[0-9] meaning - cpu followed by any combination of digits - thus making cpu199 or cpu99 or cpu9 valid results.

So it should have applied the rule to cpu10 to 15 as well.
Then why would it have only applied the range ATTR{cpufreq/policy0-9/scaling_min_freq} and not the range ATTR{cpufreq/policy10-15/scaling_min_freq}?

It’s been a while since I made any udev rules, and I can’t remember using regexs in them.

However normally a regex of [0-9] will match a single digit, [0-9]+ would match one or more digits.


The square brackets denote a set of characters, it will match any one of those characters. The - denotes a range so [0-5] is the same as [012345], both will match any single digit between 1 and 5.

[0-15] would match 0, 1 or 5.

2 Likes

I am speculating - could be that my assumption on how systemd parse the value is off track - what result do you get from "cpu[0-9]|cpu[0-9][0-9]" ?

which would - hopefully match cpu with a single digit and two digits e.g. cpu9 or cpu15

3 Likes

@Gkirmathal

Thats exactly how would target more than 10 CPU cores, so up to number 99. It is basically regex.

https://man7.org/linux/man-pages/man7/udev.7.html

3 Likes

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

Please do, that can be extremely useful.

I was the OP in the other post. I marked it as solved, then it closed before I replied to thank you there.

Thank you all for your hard work on this. It works wonderfully.

A quick modification to the rule and my laptop (Ryzen-7 7840U) now idles at 400 again.

Seems to have no adverse effects to changing power/performance profiles in tuned-gui either.

This topic was automatically closed 3 days after the last reply. New replies are no longer allowed.