[SeaBIOS] [PATCH 7/9] Create mapping between rom address and boot priority.

Gleb Natapov gleb at redhat.com
Fri Dec 24 19:41:21 CET 2010


On Fri, Dec 24, 2010 at 01:33:20PM -0500, Kevin O'Connor wrote:
> On Fri, Dec 24, 2010 at 12:13:14PM -0500, Kevin O'Connor wrote:
> > On Thu, Dec 23, 2010 at 11:29:41AM +0200, Gleb Natapov wrote:
> > > At the time of bev/bcv initialization the device rom was loaded from is
> > > no longer know. Only memory address where rom resides is know at this
> > > point. This patch create mapping between boot priority and rom address
> > > at rom initialization time for use during bev/bcv init.
> > > 
> > > Signed-off-by: Gleb Natapov <gleb at redhat.com>
> > 
> > I find this patch confusing.  How about the patch below instead?
> 
> Hrmm - instead of tracking the priority of each rom, lets track the
> source of each rom, and then calculate the priority when adding the
> bev/bcv.  How about the attached instead?  (It is admittedly more
> complex, but it gives me the ability to set priorities for each BCV.)
> 
I am OK with this one too.  The attached patch includes parts of patch 8
though (pass prio too add_bev/add_bcv functions). 


> -Kevin

> commit 16ef4c87505b415d033b39722e5e829d13708f77
> Author: Kevin O'Connor <kevin at koconnor.net>
> Date:   Fri Dec 24 13:28:12 2010 -0500
> 
>     Support qemu based romfile wrappers to be called out of order.
>     
>     If the file requested isn't the last file read, then reread the index
>     to find the given file.
> 
> diff --git a/src/paravirt.c b/src/paravirt.c
> index 74d3743..dcb2798 100644
> --- a/src/paravirt.c
> +++ b/src/paravirt.c
> @@ -338,26 +338,43 @@ u32 qemu_cfg_find_file(const char *name)
>      return __cfg_next_prefix_file(name, strlen(name) + 1, 0);
>  }
>  
> +static int
> +__qemu_cfg_set_file(u32 select)
> +{
> +    if (!qemu_cfg_present)
> +        return -1;
> +    if (select == ntohs(LastFile.select))
> +        return 0;
> +
> +    u32 count;
> +    qemu_cfg_read_entry(&count, QEMU_CFG_FILE_DIR, sizeof(count));
> +    count = ntohl(count);
> +    u32 e;
> +    for (e = 0; e < count; e++) {
> +        qemu_cfg_read((void*)&LastFile, sizeof(LastFile));
> +        if (select == ntohs(LastFile.select))
> +            return 0;
> +    }
> +    return -1;
> +}
> +
>  int qemu_cfg_size_file(u32 select)
>  {
> -    if (select != ntohs(LastFile.select))
> +    if (__qemu_cfg_set_file(select))
>          return -1;
>      return ntohl(LastFile.size);
>  }
>  
> -
>  const char* qemu_cfg_name_file(u32 select)
>  {
> -    if (select != ntohs(LastFile.select))
> +    if (__qemu_cfg_set_file(select))
>          return NULL;
>      return LastFile.name;
>  }
>  
>  int qemu_cfg_read_file(u32 select, void *dst, u32 maxlen)
>  {
> -    if (!qemu_cfg_present)
> -        return -1;
> -    if (!select || select != ntohs(LastFile.select))
> +    if (!select || __qemu_cfg_set_file(select))
>          return -1;
>      int len = qemu_cfg_size_file(select);
>      if (len < 0 || len > maxlen)

> diff --git a/src/boot.c b/src/boot.c
> index 5137345..9777bd6 100644
> --- a/src/boot.c
> +++ b/src/boot.c
> @@ -21,6 +21,18 @@ struct ipl_s IPL;
>   * Boot setup
>   ****************************************************************/
>  
> +int
> +bootprio_find_pci_device(int bdf, int instance)
> +{
> +    return -1;
> +}
> +
> +int
> +bootprio_find_named_rom(const char *name, int instance)
> +{
> +    return -1;
> +}
> +
>  static void
>  loadBootOrder(void)
>  {
> @@ -113,7 +125,7 @@ boot_setup(void)
>  
>  // Add a BEV vector for a given pnp compatible option rom.
>  void
> -add_bev(u16 seg, u16 bev, u16 desc)
> +add_bev(u16 seg, u16 bev, u16 desc, int prio)
>  {
>      if (! CONFIG_BOOT)
>          return;
> @@ -150,7 +162,7 @@ add_baid_cdrom(struct drive_s *drive_g)
>  
>  // Add a bcv entry for an expansion card harddrive or legacy option rom
>  void
> -add_bcv(u16 seg, u16 ip, u16 desc)
> +add_bcv(u16 seg, u16 ip, u16 desc, int prio)
>  {
>      if (! CONFIG_BOOT)
>          return;
> diff --git a/src/boot.h b/src/boot.h
> index 778aebd..272c574 100644
> --- a/src/boot.h
> +++ b/src/boot.h
> @@ -41,12 +41,14 @@ struct ipl_s {
>  // boot.c
>  extern struct ipl_s IPL;
>  void boot_setup(void);
> -void add_bev(u16 seg, u16 bev, u16 desc);
> -void add_bcv(u16 seg, u16 ip, u16 desc);
> +void add_bev(u16 seg, u16 bev, u16 desc, int prio);
> +void add_bcv(u16 seg, u16 ip, u16 desc, int prio);
>  struct drive_s;
>  void add_bcv_internal(struct drive_s *drive_g);
>  void add_baid_cdrom(struct drive_s *drive_g);
>  
>  void boot_prep(void);
> +int bootprio_find_pci_device(int bdf, int instance);
> +int bootprio_find_named_rom(const char *name, int instance);
>  
>  #endif // __BOOT_H
> diff --git a/src/optionroms.c b/src/optionroms.c
> index 854c33f..697b4ef 100644
> --- a/src/optionroms.c
> +++ b/src/optionroms.c
> @@ -211,6 +211,26 @@ init_optionrom(struct rom_header *rom, u16 bdf, int isvga)
>      return 0;
>  }
>  
> +#define RS_PCIROM (1LL<<33)
> +
> +static void
> +setRomSource(u64 *sources, struct rom_header *rom, u64 source)
> +{
> +    if (sources)
> +        sources[((u32)rom - BUILD_ROM_START) / OPTION_ROM_ALIGN] = source;
> +}
> +
> +static u8
> +getRomPriority(u64 *sources, struct rom_header *rom, int instance)
> +{
> +    u64 source = sources[((u32)rom - BUILD_ROM_START) / OPTION_ROM_ALIGN];
> +    if (! source)
> +        return -1;
> +    if (source & RS_PCIROM)
> +        return bootprio_find_pci_device(source, instance);
> +    return bootprio_find_named_rom(romfile_name(source), instance);
> +}
> +
>  
>  /****************************************************************
>   * Roms in CBFS
> @@ -240,16 +260,19 @@ lookup_hardcode(u32 vendev)
>  
>  // Run all roms in a given CBFS directory.
>  static void
> -run_file_roms(const char *prefix, int isvga)
> +run_file_roms(const char *prefix, int isvga, u64 *sources)
>  {
>      u32 file = 0;
>      for (;;) {
>          file = romfile_findprefix(prefix, file);
>          if (!file)
>              break;
> -        int ret = romfile_copy(file, (void*)RomEnd, max_rom() - RomEnd);
> -        if (ret > 0)
> -            init_optionrom((void*)RomEnd, 0, isvga);
> +        struct rom_header *rom = (void*)RomEnd;
> +        int ret = romfile_copy(file, rom, max_rom() - RomEnd);
> +        if (ret > 0) {
> +            setRomSource(sources, rom, file);
> +            init_optionrom(rom, 0, isvga);
> +        }
>      }
>  }
>  
> @@ -330,7 +353,7 @@ fail:
>  
>  // Attempt to map and initialize the option rom on a given PCI device.
>  static int
> -init_pcirom(u16 bdf, int isvga)
> +init_pcirom(u16 bdf, int isvga, u64 *sources)
>  {
>      u32 vendev = pci_config_readl(bdf, PCI_VENDOR_ID);
>      dprintf(4, "Attempting to init PCI bdf %02x:%02x.%x (vd %04x:%04x)\n"
> @@ -342,6 +365,7 @@ init_pcirom(u16 bdf, int isvga)
>      if (! rom)
>          // No ROM present.
>          return -1;
> +    setRomSource(sources, rom, RS_PCIROM | bdf);
>      return init_optionrom(rom, bdf, isvga);
>  }
>  
> @@ -357,7 +381,8 @@ optionrom_setup(void)
>          return;
>  
>      dprintf(1, "Scan for option roms\n");
> -
> +    u64 sources[(BUILD_BIOS_ADDR - BUILD_ROM_START) / OPTION_ROM_ALIGN];
> +    memset(sources, 0, sizeof(sources));
>      u32 post_vga = RomEnd;
>  
>      if (CONFIG_OPTIONROMS_DEPLOYED) {
> @@ -378,11 +403,11 @@ optionrom_setup(void)
>              if (v == 0x0000 || v == 0xffff || v == PCI_CLASS_DISPLAY_VGA
>                  || (CONFIG_ATA && v == PCI_CLASS_STORAGE_IDE))
>                  continue;
> -            init_pcirom(bdf, 0);
> +            init_pcirom(bdf, 0, sources);
>          }
>  
>          // Find and deploy CBFS roms not associated with a device.
> -        run_file_roms("genroms/", 0);
> +        run_file_roms("genroms/", 0, sources);
>      }
>  
>      // All option roms found and deployed - now build BEV/BCV vectors.
> @@ -394,21 +419,25 @@ optionrom_setup(void)
>              pos += OPTION_ROM_ALIGN;
>              continue;
>          }
> +        int instance = 0;
>          pos += ALIGN(rom->size * 512, OPTION_ROM_ALIGN);
>          struct pnp_data *pnp = get_pnp_rom(rom);
>          if (! pnp) {
>              // Legacy rom.
> -            add_bcv(FLATPTR_TO_SEG(rom), OPTION_ROM_INITVECTOR, 0);
> +            add_bcv(FLATPTR_TO_SEG(rom), OPTION_ROM_INITVECTOR, 0
> +                    , getRomPriority(sources, rom, instance));
>              continue;
>          }
>          // PnP rom.
>          if (pnp->bev)
>              // Can boot system - add to IPL list.
> -            add_bev(FLATPTR_TO_SEG(rom), pnp->bev, pnp->productname);
> +            add_bev(FLATPTR_TO_SEG(rom), pnp->bev, pnp->productname
> +                    , getRomPriority(sources, rom, instance));
>          else
>              // Check for BCV (there may be multiple).
>              while (pnp && pnp->bcv) {
> -                add_bcv(FLATPTR_TO_SEG(rom), pnp->bcv, pnp->productname);
> +                add_bcv(FLATPTR_TO_SEG(rom), pnp->bcv, pnp->productname
> +                        , getRomPriority(sources, rom, instance++));
>                  pnp = get_pnp_next(rom, pnp);
>              }
>      }
> @@ -438,10 +467,10 @@ vga_setup(void)
>          // Find and deploy PCI VGA rom.
>          int bdf = VGAbdf = pci_find_vga();
>          if (bdf >= 0)
> -            init_pcirom(bdf, 1);
> +            init_pcirom(bdf, 1, NULL);
>  
>          // Find and deploy CBFS vga-style roms not associated with a device.
> -        run_file_roms("vgaroms/", 1);
> +        run_file_roms("vgaroms/", 1, NULL);
>      }
>  
>      if (RomEnd == BUILD_ROM_START) {


--
			Gleb.



More information about the SeaBIOS mailing list