$ ./rom-parser GT635.rom
Valid ROM signature found @0h, PCIR offset 190h
PCIR: type 0, vendor: 10de, device: 1280, class: 030000
PCIR: revision 0, vendor revision: 1
Valid ROM signature found @f400h, PCIR offset 1ch
PCIR: type 3, vendor: 10de, device: 1280, class: 030000
PCIR: revision 3, vendor revision: 0
EFI: Signature Valid
Last image
This is what we typically expect to see, there are two headers, the first is type 0, which is a standard PC BIOS ROM, the second is type 3, an EFI ROM. If you don't have EFI support in the ROM, the OVMF solution will not work for you. Newer graphics card will hopefully all have EFI support.
To get this program:
$ git clone https://github.com/awilliam/rom-parser
$ cd rom-parser
$ make
You'll need to copy the ROM to a file first, the program does not have support for enabling the ROM through pci-sysfs. To do this from the host:
# cd /sys/bus/pci/devices/0000:01:00.0/
# echo 1 > rom
# cat rom > /tmp/image.rom
# echo 0 > rom
If you get a zero-sized file, look for an error in dmesg. The ROM may only be readable initially after boot, before any drivers have bound to it. Use the pci-stub.ids= boot option to attempt to keep the device in a pristine, unused state.
While my card's vbios doesn't have EFI support (VTX3D HD7870 GHZ Edition), Powercolor's equivalent does and apparently it's running flawlessly.
ReplyDeleteThat's a good point, since we can supply the ROM via the romfile= option, you aren't necessarily tied to the ROM flashed on the card. There's likely to be some interchangeability between vendors for the same chipset.
DeleteDo you know if support for the romfile= option is included in libvirt (PCI device element?) or it can only be specified as a qemu argument?
Delete<rom file=/path/to/file.rom/>
Deletehttps://libvirt.org/formatdomain.html#elementsHostDevSubsys
Note that some graphics card vendors don't ship an EFI compatible ROM on the card, but do provide an update with it. This seems to be the case with many EVGA cards, unfortunately you need to go through the hassle of registering your card and filing a support ticket to get it.
ReplyDeleteIf you have the EfiRom program from Tiano Core (in Fedora it is part of the "edk2" package) you can also use "EfiRom -d /path/to/image.tom".
ReplyDeleteThanks Paolo! Here's what that produces for the same example ROM above:
Delete$ EfiRom -d GT635.rom
Image 1 -- Offset 0x0
ROM header contents
Signature 0xAA55
PCIR offset 0x0190
Signature PCIR
Vendor ID 0x10DE
Device ID 0x1280
Length 0x0018
Revision 0x0000
DeviceListOffset 0x00
Class Code 0x030000
Image size 0xF400
Code revision: 0x0001
MaxRuntimeImageLength 0x00
ConfigUtilityCodeHeaderOffset 0x8B2E
DMTFCLPEntryPointOffset 0x2EC0
Indicator 0x00
Code type 0x00
Image 2 -- Offset 0xF400
ROM header contents
Signature 0xAA55
PCIR offset 0x001C
Signature PCIR
Vendor ID 0x10DE
Device ID 0x1280
Length 0x001C
Revision 0x0003
DeviceListOffset 0x00
Class Code 0x030000
Image size 0x10400
Code revision: 0x0000
MaxRuntimeImageLength 0x00
ConfigUtilityCodeHeaderOffset 0x00
DMTFCLPEntryPointOffset 0x00
Indicator 0x80 (last image)
Code type 0x03 (EFI image)
EFI ROM header contents
EFI Signature 0x0EF1
Compression Type 0x0001 (compressed)
Machine type 0x8664 (unknown)
Subsystem 0x000B (EFI boot service driver)
EFI image offset 0x004C (@0xF44C)
lspci -nn said:
ReplyDelete01:00.0 VGA compatible controller [0300]: NVIDIA Corporation G73 [GeForce 7600 GS] [10de:0392] (rev a1)
so I've booted with pci-stub.ids=10de:0392,8086:0151.
Then I run:
[root@hermes 0000:01:00.0]# echo 1 > rom
[root@hermes 0000:01:00.0]# cat rom > /tmp/image.rom
cat: rom: Input/output error
[root@hermes 0000:01:00.0]# dmesg
....
[11386.105826] pci-stub 0000:01:00.0: Invalid ROM contents
If it's your primary graphics it can be a pain to collect the ROM. Sometimes it's a pain regardless. I'd guess chances are very, very, very slim that a 7-series Nvidia card supports EFI. All the ROMs on TechPowerUp are dated 2006/2007. If your card is listed there you can test their copy instead.
DeleteTry your luck switching off CSM in your EFI, and then booting using the kernel arguments: "nomodeset init=/bin/bash pci-stub.ids=10de:0392,8086:0151"
DeleteThat worked for me where even GPU-Z would only ever result in a crash. CSM is definitely required for some reason, at least on my machine. init=/bin/bash will (at least on Debian) leave you in your initrd environment prior to the nvidia driver being loaded. No need to edit files, just temporary kernel arguments at the Grub menu.
This comment has been removed by a blog administrator.
ReplyDeleteHi.
ReplyDeleteCompiler rookie here, what do I need to compile your rom-parser?
Using grml 2014.11 to see if the ROM of my GPU had EFI support.
installed gcc-4.9 and installed linux-headers-$(uname -r) but am stuck on
# make
gcc-4.9 -o rom-parser rom-parser.c
rom-parser.c:1:19: fatal error: fcntl.h: No such file or directory
#include
^
compilation terminated.
Makefile:4: recipe for target 'rom-parser' failed
make: *** [rom-parser] Error 1
I'm not sure if fcntl.h is installed
# find / -name fcntl.h
/usr/src/linux-headers-3.16.0-1-grml-common/include/uapi/asm-generic/fcntl.h
/usr/src/linux-headers-3.16.0-1-grml-common/include/uapi/linux/fcntl.h
/usr/src/linux-headers-3.16.0-1-grml-common/include/linux/fcntl.h
/usr/src/linux-headers-3.16.0-1-grml-common/arch/x86/include/uapi/asm/fcntl.h
But the compiler doesn't find on of the 4 header files.
Thanks for any help.
got it compiled!
DeleteIn the end for GRML 2014.11:
# apt-get update
# apt-get kernel-package
And sadly my GTX 750 Ti misses the second entry, so no EFI, to bad :(
In case you also have an MSI NVIDIA 7xx series: most of the cards in this series don't have a EFI vbios, but posting a message on their support forums with your cards serial number will usually get you the EFI vbios in less that one day.
ReplyDeleteIts working here :)