From 3f57b5c8bef01d2d5fc177b354f76d9a7c1bc1e5 Mon Sep 17 00:00:00 2001 From: Kevin O'Connor Date: Sat, 20 Dec 2008 23:32:16 -0500 Subject: [PATCH] Support multiple BCVs in a single option rom. --- src/optionroms.c | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/src/optionroms.c b/src/optionroms.c index 0f99c2e..389d528 100644 --- a/src/optionroms.c +++ b/src/optionroms.c @@ -131,6 +131,18 @@ get_pnp_rom(struct rom_header *rom) return pnp; } +// Check for multiple pnp option rom headers. +static struct pnp_data * +get_pnp_next(struct rom_header *rom, struct pnp_data *pnp) +{ + if (! pnp->nextoffset) + return NULL; + pnp = (struct pnp_data *)((u8*)rom + pnp->nextoffset); + if (pnp->signature != *(u32*)pnp_string) + return NULL; + return pnp; +} + // Check if a valid option rom has a pci struct; return it if so. static struct pci_data * get_pci_rom(struct rom_header *rom) @@ -345,9 +357,13 @@ optionrom_setup() if (pnp->bev) // Can boot system - add to IPL list. add_ipl(rom, pnp); - else if (pnp->bcv) - // Has BCV - run it now. - callrom(rom, pnp->bcv, 0); + else + // Check for BCV (there may be multiple). + while (pnp && pnp->bcv) { + // Has BCV - run it now. + callrom(rom, pnp->bcv, 0); + pnp = get_pnp_next(rom, pnp); + } } } -- 2.25.1