This document attempts to consolidate all available information regarding the VBIOS ROMs for the venerable AMD Instinct MI50 - especially the 32 GB variant
Sources include
- TechPowerUp Forums
- https://andrealmeid.com/post/2020-05-01-vbios2/
and of course the great folks over at the gfx906 Discord group: https://discord.gg/cyEpXWbM
Warning: There are at least two versions of the MI50 32 GB out there:
- The original PCB version by AMD
- 64 ROPs and 256 TMUs
- multiple stickers on the back-plate
- The modified/simplified PCB from China
- 60 ROPs and 240 TMUs
- one sticker on the back-plate
The following VBIOS variants have only been tested with the original PCB version by AMD.
Important details are to the right of the table, so make sure to scroll. :D
Name | TechPowerUp # | VBIOS Version | rocm-smi --showvbios | Filename | MD5 (+ padded by amdvbflash) | UEFI in ROM? | Display? | ReBAR? | BAR size / CPU-visible VRAM | PCIe P2P inter-device? (rocm-bandwidth-test) | PCIe Gen | Power Cap | MinSCLK/MinMCLK MaxSCLK/MaxMCLK | Idle |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Apple Radeon Pro VII 32 GB | 276180, 278241 | 016.004.000.045.000000 (2019-11-18 14:11) | 113-D163A1XT-045 ("vbios3") | 276180.rom, 278241.rom, 32G_UEFI.rom | 512 KB: 08d3f76b81f113adc9eaeb10f59f7dec 1024 KB padded: b6f82c47f7f4bb126a1614874ecf4df8 | YES | YES | YES | 32 GB | YES | 3 !! fixed | 300 W | 1000/1000 1730/1000 | 27-29 W |
Original AMD MI50 32 GB | 275395 | 016.004.000.064.016969 (2021-05-07 11:42) | 113-D1631711-100 ("vbios1") | 275395.rom | 512 KB: 73fbb91323e14267a93f6d1e4f6f0d33 1024 KB padded: bfb88a64f15883fa0a15e0e8efea1bc7 | NO (Legacy only) | NO | NO | 16 GB (Vulkan issue!) | NO | 4 fixed | 225 W | 930/350 1725/1000 | 17-21 W |
AMD MI50 32 GB | 274474 | 016.004.000.056.013522 (2020-01-16 21:38) | 113-D1631700-111 ("vbios2") | 274474.rom | 512 KB: 06f5ba8a179b0295ecc043435096aceb 1024K padded: 470f479cc20160db3377c7b9e117fed5 | NO (Legacy only) | NO | YES | 32 GB | YES | 4 fixed | 225 W | 925/350 1725/1000 | 17-21 W |
Radeon Pro V420 32 GB | - | 016.004.000.043.012098 (2019-05-02 11:36) | 113-D1640200-043 | V420.rom | 512 KB: 51901dcee3815b36e829d1076e2f7111 1024K padded: 063a68494802a16970e95660aa235a2c | YES | YES | YES | 32 GB | YES | 1 <-> 4 dynamic | 178 W | 925/350 1800/1000 | 17-21 W |
We are still testing, but currently I can only recommend the bottom two VBIOS. Unfortunately we can't have nice things. There is no one BIOS version to rule them all. 😄
If you need display output and lower power consumption, use "113-D1640200-043" (V420.rom). The 178 W power cap does cause a negligible 1% performance drop (load testing with vkpeak). With multiple GPUs in "round-robin" inference there is enough time for the junction/hotspot to cool down - so the power cap and thermals seem to be less of an issue. The card boosts to ~230 W quite a lot. Also throughput reported by rocm-bandwidth-test is actually 5-10% higher across the board and the SCLK clock is slightly higher (1800 MHz versus 1725 MHz).
If you want the default 225 W and don't need display output, use "113-D1631700-111" (274474.rom).
Both support PCIe Gen 4, ReBAR and 32 GB BAR size / "CPU-visible VRAM".
Mixing cards with different VBIOS versions seems to be an issue with ROCm - at least that is what I saw in my ollama tests (SCALE sig abort etc.) YMMV.
Thanks Merom Green @ gfx906 Discord server for the V420.rom file!
- Check other known VBIOS versions
https://github.com/stylesuxx/amdvbflash
sudo ./amdvbflash -i
Output:
AMDVBFLASH version 4.71, Copyright (c) 2020 Advanced Micro Devices, Inc.
adapter seg bn dn dID asic flash romsize test bios p/n
======= ==== == == ==== =============== ============== ======= ==== ================
0 0000 24 00 66A1 Vega20 GD25Q80C 100000 pass 113-D1631711-100
1 0000 27 00 66A1 Vega20 GD25Q80C 100000 pass 113-D1631711-100
2 0000 30 00 66A1 Vega20 GD25Q80C 100000 pass 113-D1631711-100
3 0000 33 00 66A1 Vega20 GD25Q80C 100000 pass 113-D1631711-100
sudo ./amdvbflash -ai
Output:
AMDVBFLASH version 4.71, Copyright (c) 2020 Advanced Micro Devices, Inc.
Adapter 0 SEG=0000, BN=24, DN=00, PCIID=66A11002, SSID=08341002)
Asic Family : Vega20
Flash Type : GD25Q80C (1024 KB)
Product Name : Vega20 A1 SERVER XL D16317-11 Hynix/Samsung 32GB Gen 24HI 600m
Bios Config File : D1631711.100
Bios P/N : 113-D1631711-100
Bios Version : 016.004.000.064.016969
Bios Date : 05/07/21 11:42
ROM Image Type : Legacy Image
ROM Image Details :
Image[0]: Size(41472 Bytes), Type(Legacy Image)
Adapter 1 SEG=0000, BN=27, DN=00, PCIID=66A11002, SSID=08341002)
Asic Family : Vega20
Flash Type : GD25Q80C (1024 KB)
Product Name : Vega20 A1 SERVER XL D16317-11 Hynix/Samsung 32GB Gen 24HI 600m
Bios Config File : D1631711.100
...
sudo ./amdvbflash -s 0 MY_AWESOME_VBIOS.rom
where 0
is the card ID.
Output:
AMDVBFLASH version 4.71, Copyright (c) 2020 Advanced Micro Devices, Inc.
0x100000 bytes saved, checksum = 0x62F6
amdvbflash will pad the dumped ROM file to the size of the installed Flash chip. So for a 1024 KB / 8 MBit Flash chip a VBIOS ROM that was initially 512 KB or less will be 1024 KB after dump. Therefore the table above also includes the MD5 sum of dumped files - in case you want to search the web for the checksum.
!!! USE AT YOUR OWN RISK - UNDERSTAND THE FLAGS FIRST !!!
-f Force flashing regardless of security checkings (e.g. AsicID &
BIOS file info check OR boot-up card).
-fp Force flashing bypassing BIOS P/N check.
-fa Force flashing bypassing already-programmed check.
-fv Force flashing bypassing newer BIOS version check.
sudo ./amdvbflash -f -fp -fa -fv -p 0 274474.rom
where 0
is the card ID.
Example:
# sudo ./amdvbflash -f -fp -fa -fv -p 3 274474.rom
AMDVBFLASH version 4.71, Copyright (c) 2020 Advanced Micro Devices, Inc.
Old SSID: 0834
New SSID: 0834
Old P/N: 113-D1631711-100
New P/N: 113-D1631700-111
The result of RSA signature verify is PASS.
Old DeviceID: 66A1
New DeviceID: 66A1
Old Product Name: Vega20 A1 SERVER XL D16317-11 Hynix/Samsung 32GB Gen 24HI 600m
New Product Name: Vega20 A1 SERVER XL D16317 Hynix/Samsung 32GB 8HI
Old BIOS Version: 016.004.000.064.016969
New BIOS Version: 016.004.000.056.013522
Flash type: GD25Q80C
Burst size is 256
80000/80000h bytes programmed
80000/80000h bytes verified
Restart System To Complete VBIOS Update.
Seriously please don't ruin your cards!
If you are looking for MI25 OC: https://krusic22.com/2025/08/09/mi25-overclocking/
"UPP: Uplift Power Play" allows modifying the Power Play tables at runtime without having having to resort to hacking the VBIOS - which by the way will not work on the MI50 due to the RSA signature checks at startup.
UPP seems to work without setting the amdgpu.ppfeaturemask=0xffffffff
kernel param / module option.
If UPP can't access the /sys/class/drm/card*/device/pp_table
you may want to add this kernel parameter to your /etc/default/grub
(Debian based) GRUB_CMDLINE_LINUX
variable to unlock the Power Play R/W feature.
https://github.com/sibradzic/upp (Leave him a ⭐!)
Install in Python 3 virtual env:
python3 -m venv upp
upp/bin/pip install upp
cd upp/bin
Here be dragons.
Be careful and double check the parameters you changed in the single-line bash commands below. Once again, use at your own risk!
In my tests once anything is written to /sys/class/drm/card*/device/pp_table
either via UPP or manually, the power consumption of the targeted MI50 card increased by ~3 W (~19 W -> ~22 W) - even when just re-setting the boot-up default pp_table
content. It seems like writing to the pp_table
file disables the dynamic PCIe Link speed switching in V420.rom, causing slightly higher power draw:
Before writing to pp_table
:
/sys/class/drm/card1/device/pp_dpm_pcie:0: 2.5GT/s, x4 80Mhz *
/sys/class/drm/card1/device/pp_dpm_pcie:1: 16.0GT/s, x4 773Mhz
After writing to pp_table
:
/sys/class/drm/card1/device/pp_dpm_pcie:0: 2.5GT/s, x4 80Mhz
/sys/class/drm/card1/device/pp_dpm_pcie:1: 16.0GT/s, x4 773Mhz *
Any combination ("0" "1" "0 1") written to this register to force it back results in an error - even with amdgpu.ppfeaturemask=0xffffffff
enabled.
echo "0" | sudo tee /sys/class/drm/card1/device/pp_dpm_pcie
0
tee: /sys/class/drm/card1/device/pp_dpm_pcie: Invalid argument
My current workaround is suspending and waking up the system (MSI MEG X570) for the PCIe registers to be fixed up. sudo rtcwake -s 20 -m mem
Not ideal.
I am still investigating. If you know what is causing this and have a solution, please drop me a comment below or in the #general
channel on the gfx906 Discord server (see link above). Thank you!
Change MI50_POWER
below to a value in Watt.
Change MI50_CARDS
to the relevant cards in /sys/class/drm/card*
. May use standard bash comma-separated (0,1,2,3) or range format (0-3).
Check with rocm-smi
.
MI50_POWER=300 && MI50_CARDS="0,1,2,3" && \
for MI50_CARD in /sys/class/drm/card[$MI50_CARDS]/device/pp_table; do \
sudo ./upp -p $MI50_CARD set --write \
SmallPowerLimit1=$MI50_POWER \
SmallPowerLimit2=$MI50_POWER \
BoostPowerLimit=$MI50_POWER \
smcPPTable/SocketPowerLimitAc0=$MI50_POWER \
smcPPTable/SocketPowerLimitDc=$MI50_POWER; \
done
Change MI50_MCLK
below to a value in MHz.
Change MI50_CARDS
to the relevant cards in /sys/class/drm/card*
. May use standard bash comma-separated (0,1,2,3) or range format (0-3).
Check with rocm-smi
and rocm-smi --setperflevel=high
and some load with vkpeak.
MI50_MCLK=1050 && MI50_CARDS="0,1,2,3" && \
for MI50_CARD in /sys/class/drm/card[$MI50_CARDS]/device/pp_table; do \
sudo ./upp -p $MI50_CARD set --write \
smcPPTable/FreqTableUclk/2=$MI50_MCLK \
smcPPTable/FreqTableUclk/3=$MI50_MCLK; \
done
Change MI50_SCLK
below to a value in MHz.
Change MI50_CARDS
to the relevant cards in /sys/class/drm/card*
. May use standard bash comma-separated (0,1,2,3) or range format (0-3).
Check with rocm-smi
and rocm-smi --setperflevel=high
and some load with vkpeak.
MI50_SCLK=1900 && MI50_CARDS="0,1,2,3" && \
for MI50_CARD in /sys/class/drm/card[$MI50_CARDS]/device/pp_table; do \
sudo ./upp -p $MI50_CARD set --write \
smcPPTable/FreqTableGfx/8=$MI50_SCLK \
smcPPTable/DcModeMaxFreq/0=$MI50_SCLK \
smcPPTable/GfxclkDsMaxFreq=$MI50_SCLK \
PowerSavingClockTable/PowerSavingClockMax/0=$MI50_SCLK; \
done
Same parameters as above, but all in one command, setting power cap, core and memory clocks.
MI50_POWER=300 && MI50_SCLK=1900 && MI50_MCLK=1050 && MI50_CARDS="0,1,2,3" && \
for MI50_CARD in /sys/class/drm/card[$MI50_CARDS]/device/pp_table; do \
sudo ./upp -p $MI50_CARD set --write \
SmallPowerLimit1=$MI50_POWER \
SmallPowerLimit2=$MI50_POWER \
BoostPowerLimit=$MI50_POWER \
smcPPTable/SocketPowerLimitAc0=$MI50_POWER \
smcPPTable/SocketPowerLimitDc=$MI50_POWER \
smcPPTable/FreqTableGfx/8=$MI50_SCLK \
smcPPTable/DcModeMaxFreq/0=$MI50_SCLK \
smcPPTable/GfxclkDsMaxFreq=$MI50_SCLK \
PowerSavingClockTable/PowerSavingClockMax/0=$MI50_SCLK \
smcPPTable/FreqTableUclk/2=$MI50_MCLK \
smcPPTable/FreqTableUclk/3=$MI50_MCLK; \
done
./upp extract --video-rom 32G_UEFI.rom
Extracting PP table from '32G_UEFI.rom' ROM image...
Found ATOM Common Table rev. 2
Video ROM information:
113-D163A1XT-045
VEGA20
PCI_EXPRESS
HBM2
Vega20 A1 XT WS D16302 32GB 300e/1000m
(C) 1988-2010, Advanced Micro Devices, Inc.
ATOMBIOSBK-AMD VER016.004.000.045.000000
D163A1XT.045
1835720
491810
FALCON_VEGA20_GLXT_RUSSELL_A1_HBM_32GB\config.h
CHKSUM: 0x0A (off by 0), CRC: 0xF43AB07C
Looking into MasterDataTable at offset 0x03C4
Looking into PowerPlayInfo at offset 0x4046
Found 1730 bytes long PowerPlayInfo table v11.0 at offset 0x4046
Saving PowerPlay table to 32G_UEFI.rom.pp_table
32G_UEFI.rom.pp_table
is the binary pp_table file that you can write back to /sys/class/drm/card0/device/pp_table
like so:
cat 32G_UEFI.rom.pp_table | sudo tee /sys/class/drm/card0/device/pp_table > /dev/null
This will reset the pp_table to the default values.
In order to compare different VBIOS PP-Tables with each other, for example using diff, meld or VS Code, it is necessary to get a text representation of the binary file:
./upp --pp-file=32G_UEFI.rom.pp_table dump | tee 32G_UEFI.rom.pp_table.txt
The following table shows some benchmarks that have been done to check stability on different overclocks / power caps.
It should also illustrate that the power limit or the thermals are holding the card back.
Why game benchmarks when this is a data center card? Because I can easily spot texture issues and "miscalculations".
- All tests have been run with
rocm-smi --setperflevel high
- Test-System: Ryzen 9 5950X, Kubuntu 24.04.3 LTS, 6.14.0-29-generic, amdgpu-dkms 6.4.3 1:6.12.12.60403-2194681.24.04, Mesa 25.2.1 - kisak-mesa PPA
- Prompt: "Tell me about yourself. Keep it short, 500 words max." (I know it is too short.)
- Ollama config:
- OLLAMA_CONTEXT_LENGTH: 32768
- OLLAMA_SCHED_SPREAD: 1
- OLLAMA_FLASH_ATTENTION: 1
- OLLAMA_KV_CACHE_TYPE: "q8_0"
- All results after warm-up.
ROM @ PowerCap SCLK/MCLK | Cyberpunk 2077 2.3 In-Game Benchmark - 1xMI50 1080p Ultra | ollama/ollama:0.11.8-rocm 4xMI50 gpt-oss:120b |
---|---|---|
min/avg/max FPS | min/avg/max pp/s min/avg/max tg/s | |
V420.rom @ 178W 1800/1000 | 72.60 / 72.65 / 72.66 | 2541.83/2562.27/2581.29 31.45/31.52/31.63 |
V420.rom @ 178W 1800/1180 | 72.88 / 72.98 / 73.05 | 2612.95/2623.45/2637.59 32.88/33.01/33.13 |
V420.rom @ 178W 2000/1000 | 73.32 / 73.46 / 73.46 | 2667.80/2679.17/2689.24 32.98/33.20/33.43 |
V420.rom @ 178W 2000/1180 | 73.99 / 74.01 / 74.23 | 2793.57/2810.14/2827.62 34.71/34.86/35.12 |
V420.rom @ 225W 2000/1000 | 2662.80/2683.52/2697.88 33.18/33.29/33.42 | |
V420.rom @ 225W 2000/1180 | 78.51 / 78.51 / 78.77 | 2781.86/2796.71/2811.14 34.69/34.78/34.89 |
V420.rom @ 300W 2000/1000 | 2661.94/2682.30/2701.52 32.99/33.24/33.51 | |
V420.rom @ 300W 2000/1150 | 79.99 / 80.73 / 80.88 | 2745.13/2764.77/2780.41 34.52/34.60/34.81 |
V420.rom @ 300W 2000/1180 | 80.60 / 80.85 / 80.91 | 2789.91/2802.37/2826.73 34.72/34.85/34.92 |
- Add other ROMs
- Add vkpeak and clpeak benchmarks to show FP16, FP32, FP64, INT8, INT16, INT32 and INT64 operations.
- Add rocm-bandwidth-test