I decided to rerun some timing tests on my epia-cn.
With some hacking, I've gotten the time from power-on to SeaBIOS boot menu down to 850ms. Of this time, 530ms is coreboot, 210ms is via vga rom, 60ms is usb init (and other hardware probes), and 30ms is time to copy and decompress vga rom from flash.
This rom is pretty small too (under 128K) - 20K for bootblock, 30K for coreboot_ram, 33K for seabios, and 36K for via vga rom.
To get to these numbers I had to disconnect my ATA drive - it's spinup time dominates startup otherwise (9 seconds from power on). I'm hopeful the times shown would be representative if I had an SSD drive.
I also needed to hack coreboot to improve caching. I modified entry16.inc to turn on caching of the rom as soon as possible, I modified auto.c to make sure ram was cached prior to decompressing coreboot_ram, and finally I modified the permanent mtrr setup to leave the rom cached for seabios.
As an aside, I think coreboot could improve in this area. It seems as if each board is tasked with setting up caching - I'm sure epia-cn is not the exception with unoptimized caches.
I'm attaching the serial output below. The timing numbers quoted above are from a program that times the serial responses. This program also takes into account the cost to send serial messages and subtracts that time from the reports. I believe the numbers shown are representative of times had debugging been disabled.
My epia-cn seems to write a null byte to the serial port when I press the power button - I'm using that to time the rest of the boot. I suspect much of the 400ms to the first coreboot message is due to power stabilization prior to cpu execution.
-Kevin
=======================
00.000: <00> 00.008: <00> 00.399: 0 00.400: 00.401: coreboot-2.0.0-r4967M-epiacn Wed Dec 2 20:01:30 EST 2009 starting... 00.426: Stage: loading fallback/coreboot_ram @ 0x4000 (114688 bytes), entry @ 0x4000 00.459: coreboot-2.0.0-r4967M-epiacn Wed Dec 2 20:01:30 EST 2009 booting... 00.479: clocks_per_usec: 1501 00.481: Enumerating buses... 00.481: Finding PCI configuration type. 00.484: done 00.483: Allocating resources... 00.481: Reading resources... 00.487: PNP: 002e.b missing read_resources 00.485: APIC: 00 missing read_resources 00.485: Done reading resources. 00.488: skipping PNP: 002e.1@74 fixed resource, size=0! 00.484: skipping PNP: 002e.b@60 fixed resource, size=0! 00.489: Setting resources... 00.488: ERROR: PNP: 002e.3 74 drq size: 0x0000000001 not assigned 00.491: PNP: 002e.b missing set_resources 00.488: ERROR: PNP: 002e.4 60 io size: 0x0000000008 not assigned 00.491: ERROR: PNP: 002e.4 70 irq size: 0x0000000001 not assigned 00.489: ERROR: PNP: 002e.6 70 irq size: 0x0000000001 not assigned 00.490: Done setting resources. 00.490: Done allocating resources. 00.494: Enabling resources... 00.492: PCI: 00:00.3 missing enable_resources 00.491: PNP: 002e.b missing enable_resources 00.494: done. 00.493: Initializing devices... 00.493: Primary IDE interface enabled 00.497: Secondary IDE interface enabled 00.494: Initializing CPU #0 00.494: Detected VIA Model D C7-D 00.499: Voltage: 1084mV (min 1084mV; max 1084mV) 00.496: CPU multiplier: 15x (min 15x; max 15x) 00.495: Current voltage: 1084mV 00.500: Current CPU multiplier: 15x 00.497: Enabling cache 00.498: Running out of variable MTRRs! 00.501: Disabling local apic...done. 00.500: CPU #0 initialized 00.505: Devices initialized 00.503: Copying Interrupt Routing Table to 0x000f0000... done. 00.502: Copying Interrupt Routing Table to 0x3dff0400... done. 00.505: ACPI: Writing ACPI tables at 3dff1400... 00.503: ACPI: done. 00.503: Multiboot Information structure has been written. 00.537: Start bios (version pre-0.4.3-20091202_003935-morn.localdomain) 00.539: Found mainboard via epia-cn 00.540: Found CBFS header at 0xffffaae0 00.542: Ram Size=0x3dff0000 00.542: CPU Mhz=1501 00.543: No apic - only the main cpu is present. 00.545: Copying ACPI RSDP from 0x3dff1400 to 0x000fdc00 00.543: SMBIOS ptr=0x000fdbe0 table=0x3dfef800 00.548: Scan for VGA option rom 00.579: Running option rom at c000:0003 00.581: fail handle_155fXX:23(86): 00.582: a=00005f0b b=00010100 c=00000044 d=00000110 ds=0000 es=f000 ss=0000 00.583: si=0000ab66 di=00000044 bp=00000000 sp=00006e82 cs=c000 ip=c996 f=0006 00.582: fail handle_155fXX:23(86): 00.584: a=00005f01 b=00010100 c=00000044 d=00000110 ds=0000 es=f000 ss=0000 00.585: si=0000ab66 di=00000044 bp=00000000 sp=00006e68 cs=c000 ip=c8c6 f=0002 00.768: fail handle_155fXX:23(86): 00.770: a=00005f02 b=00010001 c=00000000 d=000003c2 ds=0000 es=f000 ss=0000 00.769: si=00000001 di=00000044 bp=00000000 sp=00006e96 cs=c000 ip=c8f9 f=0002 00.773: fail handle_155fXX:23(86): 00.771: a=00005f18 b=00010200 c=00000044 d=000003c2 ds=0000 es=f000 ss=0000 00.773: si=00000000 di=00000044 bp=00000000 sp=00006e9c cs=c000 ip=ca89 f=0006 00.784: Turning on vga console 00.790: Starting SeaBIOS (version pre-0.4.3-20091202_003935-morn.localdomain) 00.790: 00.790: ebda moved from 9f400 to 9f000 00.790: Found 1 lpt ports 00.794: Found 2 serial ports 00.792: ATA controller 0 at 24a0/24b0 (dev 78 prog_if 8f) 00.792: ATA controller 1 at 24a8/24b4 (dev 78 prog_if 8f) 00.792: ATA controller 2 at 1f0/3f0 (dev 79 prog_if 8a) 00.796: Got ps2 nak (status=d1); continuing 00.793: ATA controller 3 at 170/370 (dev 79 prog_if 8a) 00.827: config_usb: 0x000fdf94 1 00.851: Scan for option roms 00.853: Press F12 for boot menu. 00.854: 03.390: Returned 28672 bytes of ZoneHigh 03.393: e820 map has 5 items: 03.394: 0: 0000000000000000 - 000000000009f000 = 1 03.394: 1: 000000000009f000 - 00000000000a0000 = 2 03.396: 2: 00000000000f0000 - 0000000000100000 = 2 03.396: 3: 0000000000100000 - 000000003dfe7000 = 1 03.397: 4: 000000003dfe7000 - 000000003e000000 = 2 03.398: enter handle_19: 03.398: NULL
=======================
coreboot.final.rom: 1024 kB, bootblocksize 21248, romsize 1048576, offset 0x0 Alignment: 64 bytes
Name Offset Type Size fallback/payload 0x0 payload 33364 fallback/coreboot_ram 0x82c0 stage 30820 pci1106,3344.rom.lzma 0xfb80 optionrom 36368 0x18a00 null 926392
On Wed, Dec 02, 2009 at 10:03:39PM -0500, Kevin O'Connor wrote:
I decided to rerun some timing tests on my epia-cn.
With some hacking, I've gotten the time from power-on to SeaBIOS boot menu down to 850ms. Of this time, 530ms is coreboot, 210ms is via vga rom, 60ms is usb init (and other hardware probes), and 30ms is time to copy and decompress vga rom from flash.
I've done some additional tests, and I've gotten the time from power-on to boot menu down to 765ms (490ms for coreboot and 275ms for SeaBIOS).
At this point, I think the hardware costs are dominating the execution on this board - I only see a few minor ways to further improve performance.
To get to these numbers, I removed debugging reports (I try to account for the cost of serial, but it's not perfect), reduced the time coreboot spends calibrating its timers (20ms to 2ms), and (partly) parallelized the VGA BIOS execution.
SeaBIOS currently uses a cooperative multi-tasking scheme, so it can't fully parallelize the vga rom. Instead, I just delayed launching the vga rom until after hardware init had started so that some of the setup time overlaps. I haven't checked this change in - I'm not sure it's fully safe.
-Kevin