[amdgpu] Writing to pp_table produces error if using both dGPU + iGPU
Brief summary of the problem:
On a system with both an iGPU and a dGPU, where both GPUs use the amdgpu driver, writing the pp_table produces an error. The monitor is attached to the iGPU.
Hardware description:
- CPU: 7800X3D
- GPU:
$lshw -C display -numeric
*-display
description: VGA compatible controller
product: Navi 21 [Radeon RX 6950 XT] [1002:73A5]
vendor: Advanced Micro Devices, Inc. [AMD/ATI] [1002]
physical id: 0
bus info: pci@0000:03:00.0
logical name: /dev/fb0
version: c0
width: 64 bits
clock: 33MHz
capabilities: pm pciexpress msi vga_controller bus_master cap_list rom fb
configuration: depth=32 driver=amdgpu latency=0 mode=2560x1440 visual=truecolor xres=2560 yres=1440
resources: iomemory:f80-f7f iomemory:fc0-fbf irq:99 memory:f800000000-fbffffffff memory:fc00000000-fc0fffffff ioport:f000(size=256) memory:fcb00000-fcbfffff memory:fcc00000-fcc1ffff
*-display
description: VGA compatible controller
product: Raphael [1002:164E]
vendor: Advanced Micro Devices, Inc. [AMD/ATI] [1002]
physical id: 0
bus info: pci@0000:11:00.0
logical name: /dev/fb0
version: cb
width: 64 bits
clock: 33MHz
capabilities: pm pciexpress msi msix vga_controller bus_master cap_list fb
configuration: depth=32 driver=amdgpu latency=0 resolution=2560,1440
resources: iomemory:fc0-fbf iomemory:fc0-fbf irq:82 memory:fc20000000-fc2fffffff memory:fc30000000-fc301fffff ioport:e000(size=256) memory:fc700000-fc77ffff
- System Memory: 32 GiB DDR5-6000
- Type of Display Connection: HDMI
System information:
- Distro name and Version: Archlinux
- Kernel version: 6.6.7
- AMD official driver version: N/A
How to reproduce the issue:
Try to write the pp_table with upp:
$ sudo upp --pp-file /sys/class/drm/card1/device/pp_table set --write \
power_saving_clock/min/1=500 \
overdrive_table/max/0=3000 \
overdrive_table/max/1=3000 \
smc_pptable/SocketPowerLimitDc/0=332 \
smc_pptable/MinVoltageUlvGfx=2700 \
smc_pptable/MinVoltageUlvSoc=2700 \
smc_pptable/MinVoltageGfx=2800 \
smc_pptable/MinVoltageSoc=2800 \
smc_pptable/MaxVoltageGfx=4200 \
smc_pptable/MaxVoltageSoc=4000
Changing power_saving_clock.min.1 from 480 to 500 at 0x07a
Commiting changes to '/sys/class/drm/card1/device/pp_table'.
Traceback (most recent call last):
File "/usr/bin/upp", line 33, in <module>
sys.exit(load_entry_point('upp==0.1.7', 'console_scripts', 'upp')())
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3.11/site-packages/upp/upp.py", line 387, in main
cli(obj={})()
^^^^^^^^^^^
File "/usr/lib/python3.11/site-packages/click/core.py", line 1157, in __call__
return self.main(*args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3.11/site-packages/click/core.py", line 1078, in main
rv = self.invoke(ctx)
^^^^^^^^^^^^^^^^
File "/usr/lib/python3.11/site-packages/click/core.py", line 1688, in invoke
return _process_result(sub_ctx.command.invoke(sub_ctx))
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3.11/site-packages/click/core.py", line 1434, in invoke
return ctx.invoke(self.callback, **ctx.params)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3.11/site-packages/click/core.py", line 783, in invoke
return __callback(*args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3.11/site-packages/click/decorators.py", line 33, in new_func
return f(get_current_context(), *args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3.11/site-packages/upp/upp.py", line 368, in set
decode._write_binary_file(pp_file, pp_bytes)
File "/usr/lib/python3.11/site-packages/upp/decode.py", line 52, in _write_binary_file
f.close()
OSError: [Errno 22] Invalid argument
After executing the command reported values for the voltages and the power are not valid anymore. This is a screenshot from LACT after executing the command:
The command succeeds if I disable the integrated graphics and use the following patch: #2060 (comment 1685022)