Skip to content

RX 7700S dGPU power cap locked at exactly 100W on Linux — PP_OD_FEATURE_PPT_BIT not set in VBIOS PP table (BIOS 4.04) #228

Description

@knipp30

System Model: Framework Laptop 16 (AMD Ryzen™ 7040 Series)
BIOS Version: 4.04 (stable)
CPU: AMD Ryzen 7 7840HS
GPU Module: AMD Radeon RX 7700S

OS: Fedora Linux 44

Kernels tested (both reproduce):
• 7.1.3-cachyos1.fc44.x86_64
• 7.0.14-201.fc44.x86_64

Describe the bug

On BIOS 4.04, the RX 7700S power cap is completely locked — power1_cap, power1_cap_max, power1_cap_min, and power1_cap_default are all identical at 100W, with zero range:

power1_cap:         100000000
power1_cap_max:     100000000
power1_cap_min:     100000000
power1_cap_default: 100000000

Any attempt to write a value other than exactly 100W fails:

$ echo 120000000 | sudo tee /sys/class/hwmon/hwmon9/power1_cap
sh: echo: write error: Invalid argument

This was working on a previous BIOS version — setting the power cap up to 120W (AMD's rated max for this GPU) was possible via LACT. The regression appeared after a BIOS update.

Root Cause (Diagnosed)

After investigation, the root cause is that PP_OD_FEATURE_PPT_BIT is not set in the VBIOS power play table, meaning the amdgpu driver sees no power OD range and exposes a zero-width [100W, 100W] cap.

Evidence:

  1. No OD/PPT entries exist in debugfs for the dGPU:
$ sudo find /sys/kernel/debug/dri/0000:03:00.0/ | grep -i "od\|overdrive\|ppt"
# only returns: odm_combine_segments (display pipeline, unrelated)
  1. pp_od_clk_voltage shows clock OD but no OD_POWER section:
OD_SCLK:
0:  800Mhz
1:  2700Mhz
OD_RANGE:
SCLK:  800Mhz  2700Mhz
# no OD_PPT / OD_POWER entries
  1. The upstream kernel fix for work_items/5227 (drm/amd/pm: fix smu13 power limit default/cap calculation, commit 1eaf26db) calculates max = SocketPowerLimitAc × (100 + od_percent_upper) / 100. Without PP_OD_FEATURE_PPT_BIT, od_percent_upper = 0 and max = 100W regardless of kernel version.

Expected Behavior

power1_cap_max should be 120000000 (120W), matching AMD's rated TGP range for the RX 7700S. The VBIOS PP table should have PP_OD_FEATURE_PPT_BIT set with od_percent_upper = 20 (giving the 20% headroom = 120W), as it apparently was in earlier BIOS versions.

Steps to Reproduce

  1. Boot Framework 16 with RX 7700S module on BIOS 4.04
  2. Run on any recent Linux kernel (tested 7.0.14 Fedora stable and 7.1.3 CachyOS)
  3. Ensure amdgpu.ppfeaturemask=0xffffffff is set
  4. Check: for f in power1_cap power1_cap_max power1_cap_min power1_cap_default; do echo "$f: $(cat /sys/class/hwmon/hwmon10/$f)"; done
  5. All four values will be 100000000

Additional Context

• Reproducible on two different kernel versions
• ppfeaturemask=0xffffffff is confirmed active: cat /sys/module/amdgpu/parameters/ppfeaturemask → 0xffffffff
• The amdgpu SMU feature mask is 0x0001a33dfbffffff — OD features appear present in the SMU but the PP table doesn't expose power OD
• LACT daemon logs confirm the driver is clamping any non-100W value: Power cap 110W was outside of [100W, 100W], clamped to 100W
• This is distinct from issue #27 (power delivery under load) — this is specifically the PP table not exposing the power OD range at all

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions