VGA initialization in coreboot v2

General

You need to enable two CONFIG options in your Mainboard Option.lb

# VGA Console
option CONFIG_CONSOLE_VGA=1
option CONFIG_PCI_ROM_RUN=1

CONFIG_PCI_ROM_RUN will use the embedded x86 emulator to run the BIOS image in the expansion ROM of a PCI device.
CONFIG_CONSOLE_VGA will redirect console messages to the VGA screen once VGA card is initialized.

For add-on (PCI/PCIe/PCI-X/AGP) VGA cards, you don't have to do anything else besides these two CONFIG options.
If your mainboard has an on-board VGA chip and you insert another VGA add-on card, the add-on
VGA card will be used instead of the on-board VGA chip.

On-board Video Devices

If you want to use the onboard VGA chip, you have to add the following options in addition to the CONFIG options described above.

Mainboard Configuration

1. In the mainboard's Config.lb (./src/mainboard/<mfg>/<board>/Config.lb) You need to specify the device number for your on-board VGA and the address that the video bios will show up at in the system.

Replace the 9.0 with the dev.fn of your vga device. You can find this number by doing a 'lspci' from the board booted under linux.
Please make sure the device number is correct. Otherwise the config code can not compute the proper ROM address.

How to compute the "rom_address" value

So you need to calculate the address by subtracting the
flash chip size (and adding the offset within the image)

In coreboot the offset within the image is 0, because its the first
thing in the coreboot image.

So you need to compute the address in the systems memory space where the start of the video bios will show up.

To do this you take the 4Gb of address and subtract the size of your coreboot image.

0x100000000 - (ROM size in Kb * 1024)

You can do this in bash by:

biossize=256printf"0x%x\n" $(( 0x100000000 - ($biossize*1024)))

Addresses for popular chip sizes:

256K 0xfffc0000
512k 0xfff80000
1024k 0xfff00000

Target Configuration

2. You still need to modify your target 'Config.lb' to reserve space for the additional video bios. Reduce the size of your coreboot image by the size of the video bios. You will prepend the video bios to the coreboot image in step 3.

or if you only have a "fallback" boot then use the "fallback" section instead.

In the above example the bios chip is 512Kb part. The video bios is 48Kb. So (512*1024)-(48*1024) = 475136.

Creating an Image

3. Finally, prepend your video bios to the coreboot.rom

cat<videobios.bin> coreboot.rom > final_coreboot.rom

where <videobios.bin> is the name of your video bios image.
You need to make sure the final_coreboot.rom size is the size of your ROM chip. Normally 256kb, 512kb, or 1024Kb.

dd is helpfull to get your <videobios.bin> when booted under the factory BIOS.

How to retrieve a good video bios

Extracting from your vendor bios image

The recommended method is to take your mainboard vendor's BIOS image and extract the VGA BIOS using a tool called awardeco/amideco/phnxdeco. This is the most reliable way:

You are guaranteed to get an image that fits to your onboard VGA

Even if your VGA BIOS uses self-modifying code you get a correct image

Downloading

There are sites that have video bios roms on their website. (I know of this one for nvidia cards: [1])

Extracting from the system

However you should be able to retrieve your own video bios as well with linux.

Boot up a machine with a commercial bios (not coreboot) with the video card you wish to work under coreboot.

From the command line enter:dd if=/dev/mem of=vgabios.bin skip=1536 count=128 or dd if=/dev/mem of=vgabios.bin bs=1k count=64 skip=768This assumes you card's bios is cached at 0xc0000, and is 64K long. Youcan see where and how much your card's bios is using bydoing a cat iomem | grep "Video ROM"

dd Explained (man dd to learn more):

if is the location to retrieve from.

of is the output file (your rom image)

skip jumps n blocks where the default n is 512 bytes

count is how many blocks you wish to read

bs is the block size

You now have a video bios image

Perl script to dump out your video bios

This is a simple script that computes the size and offset then uses
the command dd to dump your video bios to a file.

VGA initialization in coreboot v3

In coreboot v3 you have to set your PCI option ROM execution method under the Device menu. The default is x86emu. To get a smaller (and slightly more insecure) version, you can switch to vm86. If you don't want option rom execution, set it to Disabled.

On-board devices

To add option roms for on-board video cards to your coreboot image, you can just add the image using lar:

lar -C lzma -a coreboot.rom vgabios.rom:pciXXXX,YYYY.rom

In the above example, vgabios.rom is the name of your option rom on disk. XXXX is the PCI vendor ID of your on-board video adapter and YYYY is its PCI device ID.