Skip to content

Instantly share code, notes, and snippets.

@evilJazz
Last active September 7, 2025 00:53
Show Gist options
  • Save evilJazz/14a4c82a67f2c52a6bb5f9cea02f5e13 to your computer and use it in GitHub Desktop.
Save evilJazz/14a4c82a67f2c52a6bb5f9cea02f5e13 to your computer and use it in GitHub Desktop.
MI50 32GB VBIOS

AMD Instinct MI50

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

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.

VBIOS matrix

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

Conclusion & recommendation

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.

Credits

Thanks Merom Green @ gfx906 Discord server for the V420.rom file!

TODO

  • Check other known VBIOS versions

Commands

amdvbflash

https://github.com/stylesuxx/amdvbflash

List all available GPUs

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

List all available GPUs in detail

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   
...

!!! Backup your VBIOS first !!!

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.

Flash a VBIOS to the card

!!! 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.

UPP: MI50 Overclocking & Overrides

!!! USE AT YOUR OWN RISK - THIS WILL DESTROY YOUR CARDS IF USED INCORRECTLY !!!

Seriously please don't ruin your cards!

If you are looking for MI25 OC: https://krusic22.com/2025/08/09/mi25-overclocking/

Install upp

"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

Before using UPP

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!

Overriding power cap/limit

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

Overclocking memory (MCLK)

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

Overclocking GPU (SCLK)

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

Putting it all together

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: Advanced topics

Dumping the pp_table from an existing VBIOS ROM file

./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:

Resetting from *.pp_table file

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.

Dumping a *.pp_table file to a text file (e.g. for diffing)

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

Benchmarks

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

TODO

  • Add other ROMs
  • Add vkpeak and clpeak benchmarks to show FP16, FP32, FP64, INT8, INT16, INT32 and INT64 operations.
  • Add rocm-bandwidth-test
#!/bin/bash
SCRIPT_FILENAME="`cd \`dirname \"$0\"\`; pwd`/`basename \"$0\"`"
SCRIPT_ROOT=$(dirname "$SCRIPT_FILENAME")
cd "$SCRIPT_ROOT"
DEFAULT_MODEL=tinyllama
MODEL=${1:-$DEFAULT_MODEL}
#TEST_SENTENCE="where was beethoven born?"
#TEST_SENTENCE="Who discovered heliocentrism and how is that possible without being in space? Be verbose I want to know all about it."
TEST_SENTENCE="Tell me something about yourself. Keep it short, 500 words max."
echo "Benchmarking with model $MODEL. Warming up..."
echo "$TEST_SENTENCE" | ollama run $MODEL --verbose 2>&1 >/dev/null
echo
echo "Starting benchmarking:"
for run in {1..10}; do echo "$TEST_SENTENCE" | ollama run $MODEL --verbose 2>&1 >/dev/null | grep "eval rate:"; done
echo
echo "done."
echo
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment