<div>Hello.</div><div> </div><div>I would like to share my Option ROM's embedding experience.</div><div> </div><div> </div><div><strong>== AMIBIOS8 ==</strong></div><div><div>Tested server platforms:</div><ul><li>Asus: KGNE-D16, KGP(M)E-D16, Z8NR-D12 and Z8PG-D18</li><li>Supermicro: all mobos series X7, X8 and H8 (X8DTU, X8DTT, X8DT3, H8DGU)</li><li>Huawei: Tecal RH1285</li><li>HP: Proliant DL160 G6 and DL165 G7</li></ul></div><div>There is a trick with AMI BIOS image to replace original Option ROM with iPXE. Every BIOS image contains two Option ROMs: iSCSI and PXE. It might be choosen from BIOS settings. Meanwhile AMI MMTool allows to replace only one module with specific ModuleID/VendorID/DeviceID. In case of the platforms above we always have two records with identical IDs. Therefore, we need to workaround this in HEX-editor:</div><div><ol><li>Look for requested LAN vendor/product IDs in RunLoc column (e.g. 8086:10C9) column. Write down RomLoc value.</li><li>There is a DeviceID at offset "RomLoc - 2" in BIOS image. Change it to some value (e.g. C9 -> CD). Save.</li><li>Run MMTool and replace module with our original VendorID/DeviceID.</li><li>Look for changed VID/PID (i.e. 8086:10<strong>CD</strong>) in RunLoc column and revert back our change at offset "RomLoc - 2".</li><li>For the second module repeat steps 1-4.</li><li>To correct CRCs just replace first module again.</li></ol><div>Now we are ready to update BIOS in the standard way: using flashrom or via AFU{WIN,LNX,DOS}.</div></div><div> </div><div>NOTE: Use MMtool version 3.22+ only.</div><div> </div><div> </div><div><strong>== UEFI (APTIO) ==</strong></div><div>Tested server platforms:</div><div><ul><li>Asus: Z9PE and Z9PG series</li><li>Supermicro: X9DRW, X9DRFF, X9DRT</li><li>Gigabyte: GA-7PPSH, GA-7PTSH</li><li>Quanta: R210-MB2MS</li></ul></div><div><div>AMI APTIO (UEFI enabled) much is much easier to update rather tan AMIBIOS8. To update Option ROM we need AMI MMTool-APTIO tool:</div><ol><li>Choose "Replace" tab and select our Option ROM.</li><li>Check "Link Present" in "For Option ROM only" group.</li><li>Select requested VID/PID in the list and click "Replace".</li><li>Profit :)</li></ol><div>Now we are ready to update BIOS in the standard way.</div><div> </div><div> </div><div><strong>== HP Proliant360 G5 ==</strong><div>It's a special case with a very proprietary BIOS. BIOS packed by 64k chunks by old-school PKWare. The BIOS tool might be found within the same BIOS ROM bundle.</div><div>To unpack BIOS it's required to:</div><div> </div><div>    C:\> rompaq /d cpqp5802.49a cpqp5802.rom</div><div> </div><div>To pack BIOS back (chunk size is mandatory!):</div><br /><div>    C:\> rompaq /c cpqp5802.rom CPQP580 249A 08/20/2012 64</div><div> </div><div>When unpacked (CPQP5802.ROM) PXE Option ROM has offset 0x00171800. Next Video Option ROM at offset 0x00183800. That means we have only 0x12_000 bytes for our iPXE Option ROM. Not so much. To replace a chunk we can use standard "dd" util. Then pack everything back:</div><div> </div><div>    C:\> rompaq /t /u CPQSRVR2.CPU CPQP5802.49A</div><div> </div><div>and ready to burn.</div><div> </div><div> </div><div><strong>== Intel 82599 (X520-DA2) ==</strong></div><div>Intel's burning tool accepts only FLB files. The simplest wat to obtain FLB header is to dump (backup) flash:</div><div> </div><div>     $ bootutil64e -nic X -saveimage -file backup.flb</div><div> </div><div>Then catch the header (first 0x17a bytes). Here is the significant offsets:</div><div> </div><ul><li>Option ROM size is at offset 0x0E0 (e.g. 00 00 01 is 64k). For example, our Option ROM is 68608 (0x10C00) bytes. We need to change bytes to: "00 0C 01" @ 0x0E0.</li><li>PXE version is at offset 0x136 (e.g. 02 03 0B is 2.2.11). For example, our Option ROM's version is 7.8.150. We need to change bytes to: "07 08 96" @ 0x136.</li></ul><div> </div><div>To obtain PXE version size just run</div><div> </div><div>     # bootutil64e -iv -file 808610fb.rom</div><div> </div><div>To burn image just cat fixed header and your custom Option ROM and run:</div><div> </div><div>     # bootutil64e -nic X -restoreimage -file 808610fb.flb</div><div> </div><div>Current BootUtil could be downloaded from Intel Download Center</div><div> </div><div>    https://downloadcenter.intel.com/Detail_Desc.aspx?agr=Y&DwnldID=19186</div><div> </div><div> </div><div><strong>== Mellanox MCX311A-XCAT (to be completed) ==</strong></div><div>Upstream iPXE modification could be obtains from <a href="http://www.mellanox.com/downloads/Drivers/PXE/gpxe_3.4.225.tgz">http://www.mellanox.com/downloads/Drivers/PXE/gpxe_3.4.225.tgz</a></div><div>Burning tool: <a href="http://www.mellanox.com/downloads/MFT/mft-3.6.0-24.tgz">http://www.mellanox.com/downloads/MFT/mft-3.6.0-24.tgz</a> To burn Option ROM we need "flint" (or flint_oem) and "minit" tools.</div><div>Current adapter (15b3:1003, ConnectX3) have not supported in iPXE upstream.</div><div> </div><div>Requirements:</div><div><ul><li>Build and insmod kernel modules mst_pci and mst_pciconf (sources could be found in mft.tar.gz).</li><li>Create character devices:</li><li>   mknod /dev/mst/mt27500_pciconf_cr0 c 245 0</li><li>   mknod /dev/mst/mt27500_pci_cr0 c 246 0</li><li>Initialize MLX:</li><li>    minit /dev/mst/mt27500_pci_cr0 07:00.0 0  (07:00.0 is a PCI bus address and function. Get it from "lspci -n").</li><li>Burn ROM:</li><li>    flint -d /dev/mst/mt27500_pci_cr0 bbrom 15b31003.rom</li></ul><div>FLINT expects a header with PXE version that is lack in iPXE ROM. Just warning. Ignore it.</div><div> </div><div>To be continued…</div></div></div></div>