[SeaBIOS] [PATCH 8/9] Record boot priority for each BAID/BCV/BEV.
Gleb Natapov
gleb at redhat.com
Thu Dec 23 10:29:42 CET 2010
For each BAID/BCV/BEV lookup its boot priority in boot order file. If
there is no entry for a device there assign it the lowest boot priority.
Signed-off-by: Gleb Natapov <gleb at redhat.com>
---
src/ahci.c | 4 ++--
src/ata.c | 10 ++++++++--
src/boot.c | 18 ++++++++++++++----
src/boot.h | 10 ++++++----
src/floppy.c | 22 ++++++++++++++++++++--
src/optionroms.c | 18 +++++++++++++++---
src/usb-msc.c | 2 +-
src/virtio-blk.c | 2 +-
8 files changed, 67 insertions(+), 19 deletions(-)
diff --git a/src/ahci.c b/src/ahci.c
index 70c0f1c..a209c86 100644
--- a/src/ahci.c
+++ b/src/ahci.c
@@ -382,7 +382,7 @@ ahci_port_init(struct ahci_ctrl_s *ctrl, u32 pnr)
// Setup disk geometry translation.
setup_translation(&port->drive);
// Register with bcv system.
- add_bcv_internal(&port->drive);
+ add_bcv_internal(&port->drive, MAX_BOOT_PRIO);
} else {
// found cdrom (atapi)
port->drive.blksize = CDROM_SECTOR_SIZE;
@@ -397,7 +397,7 @@ ahci_port_init(struct ahci_ctrl_s *ctrl, u32 pnr)
// fill cdidmap
if (iscd) {
map_cd_drive(&port->drive);
- add_baid_cdrom(&port->drive);
+ add_baid_cdrom(&port->drive, MAX_BOOT_PRIO);
}
}
dprintf(1, "%s\n", port->drive.desc);
diff --git a/src/ata.c b/src/ata.c
index d971480..e45de50 100644
--- a/src/ata.c
+++ b/src/ata.c
@@ -783,8 +783,11 @@ init_drive_atapi(struct atadrive_s *dummy, u16 *buffer)
// fill cdidmap
if (iscd) {
+ int prio = bootprio_find_ata_device(adrive_g->chan_gf->pci_bdf,
+ adrive_g->chan_gf->chanid,
+ adrive_g->slave);
map_cd_drive(&adrive_g->drive);
- add_baid_cdrom(&adrive_g->drive);
+ add_baid_cdrom(&adrive_g->drive, prio);
}
return adrive_g;
@@ -834,8 +837,11 @@ init_drive_ata(struct atadrive_s *dummy, u16 *buffer)
// Setup disk geometry translation.
setup_translation(&adrive_g->drive);
+ int prio = bootprio_find_ata_device(adrive_g->chan_gf->pci_bdf,
+ adrive_g->chan_gf->chanid,
+ adrive_g->slave);
// Register with bcv system.
- add_bcv_internal(&adrive_g->drive);
+ add_bcv_internal(&adrive_g->drive, prio);
return adrive_g;
}
diff --git a/src/boot.c b/src/boot.c
index aeacf08..5c35555 100644
--- a/src/boot.c
+++ b/src/boot.c
@@ -117,7 +117,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, u8 prio)
{
if (! CONFIG_BOOT)
return;
@@ -131,11 +131,12 @@ add_bev(u16 seg, u16 bev, u16 desc)
if (desc)
d = MAKE_FLATPTR(seg, desc);
ie->description = d;
+ ie->prio = prio;
}
// Add a IPL entry for BAID cdrom.
void
-add_baid_cdrom(struct drive_s *drive_g)
+add_baid_cdrom(struct drive_s *drive_g, u8 prio)
{
if (! CONFIG_CDROM_BOOT)
return;
@@ -150,11 +151,18 @@ add_baid_cdrom(struct drive_s *drive_g)
ie->type = IPL_TYPE_CDROM;
ie->vector = (u32)drive_g;
ie->description = "DVD/CD";
+ ie->prio = prio;
+}
+
+void set_floppy_baid_prio(u8 prio)
+{
+ struct ipl_entry_s *ie = &IPL.bev[0];
+ ie->prio = prio;
}
// 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, u8 prio)
{
if (! CONFIG_BOOT)
return;
@@ -168,11 +176,12 @@ add_bcv(u16 seg, u16 ip, u16 desc)
if (desc)
d = MAKE_FLATPTR(seg, desc);
ie->description = d;
+ ie->prio = prio;
}
// Add a bcv entry for an internal harddrive
void
-add_bcv_internal(struct drive_s *drive_g)
+add_bcv_internal(struct drive_s *drive_g, u8 prio)
{
if (! CONFIG_BOOT)
return;
@@ -200,6 +209,7 @@ add_bcv_internal(struct drive_s *drive_g)
ie->type = BCV_TYPE_INTERNAL;
ie->vector = (u32)drive_g;
ie->description = "";
+ ie->prio = prio;
}
diff --git a/src/boot.h b/src/boot.h
index 0dfb135..5a4c6ea 100644
--- a/src/boot.h
+++ b/src/boot.h
@@ -12,6 +12,7 @@ struct ipl_entry_s {
u16 subchoice;
u32 vector;
const char *description;
+ u8 prio;
};
struct ipl_s {
@@ -42,11 +43,12 @@ 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, u8 prio);
+void add_bcv(u16 seg, u16 ip, u16 desc, u8 prio);
struct drive_s;
-void add_bcv_internal(struct drive_s *drive_g);
-void add_baid_cdrom(struct drive_s *drive_g);
+void add_bcv_internal(struct drive_s *drive_g, u8 prio);
+void add_baid_cdrom(struct drive_s *drive_g, u8 prio);
+void set_floppy_baid_prio(u8 prio);
void boot_prep(void);
u8 bootprio_find_pci_device(int bdf);
diff --git a/src/floppy.c b/src/floppy.c
index 6491b96..7dd3083 100644
--- a/src/floppy.c
+++ b/src/floppy.c
@@ -13,6 +13,9 @@
#include "cmos.h" // inb_cmos
#include "pic.h" // eoi_pic1
#include "bregs.h" // struct bregs
+#include "pci.h" // pci_to_bdf
+#include "pci_ids.h" // PCI_CLASS_BRIDGE_ISA
+#include "boot.h" // bootprio_find_fdc_device
#define FLOPPY_SIZE_CODE 0x02 // 512 byte sectors
#define FLOPPY_DATALEN 0xff // Not used - because size code is 0x02
@@ -131,10 +134,25 @@ floppy_setup(void)
// XXX - disable floppies on coreboot for now.
} else {
u8 type = inb_cmos(CMOS_FLOPPY_DRIVE_TYPE);
- if (type & 0xf0)
+ unsigned int prio0 = -1, prio1 = -1;
+ int bdf = pci_find_class(PCI_CLASS_BRIDGE_ISA); /* isa-to-pci bridge */
+
+ if (type & 0xf0) {
addFloppy(0, type >> 4, DTYPE_FLOPPY);
- if (type & 0x0f)
+ prio0 = bootprio_find_fdc_device(bdf, 0x3f0, 0);
+ }
+ if (type & 0x0f) {
addFloppy(1, type & 0x0f, DTYPE_FLOPPY);
+ prio1 = bootprio_find_fdc_device(bdf, 0x3f0, 1);
+ }
+ if (prio1 < prio0) {
+ /* if B has lower boot priority swap it with A */
+ struct drive_s *tmp = Drives.idmap[EXTTYPE_FLOPPY][0];
+ Drives.idmap[EXTTYPE_FLOPPY][0] = Drives.idmap[EXTTYPE_FLOPPY][1];
+ Drives.idmap[EXTTYPE_FLOPPY][1] = tmp;
+ set_floppy_baid_prio(prio1);
+ } else
+ set_floppy_baid_prio(prio0);
}
outb(0x02, PORT_DMA1_MASK_REG);
diff --git a/src/optionroms.c b/src/optionroms.c
index 33f2a03..56f4997 100644
--- a/src/optionroms.c
+++ b/src/optionroms.c
@@ -92,6 +92,17 @@ static void map_rom2prio(void *addr, u8 prio)
}
}
+static u8 rom2prio_get(u32 addr)
+{
+ int i;
+
+ for (i = 0; i < rom2prio_cnt; i++)
+ if (rom2prio[i].addr == addr)
+ return rom2prio[i].prio;
+
+ return MAX_BOOT_PRIO;
+}
+
/****************************************************************
* Helper functions
****************************************************************/
@@ -423,21 +434,22 @@ optionrom_setup(void)
pos += OPTION_ROM_ALIGN;
continue;
}
+ u8 romprio = rom2prio_get(pos);
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, romprio);
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, romprio);
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, romprio);
pnp = get_pnp_next(rom, pnp);
}
}
diff --git a/src/usb-msc.c b/src/usb-msc.c
index 080efdc..c3ffe0b 100644
--- a/src/usb-msc.c
+++ b/src/usb-msc.c
@@ -171,7 +171,7 @@ setup_drive_hd(struct disk_op_s *op)
setup_translation(op->drive_g);
// Register with bcv system.
- add_bcv_internal(op->drive_g);
+ add_bcv_internal(op->drive_g, MAX_BOOT_PRIO);
return 0;
}
diff --git a/src/virtio-blk.c b/src/virtio-blk.c
index 7a25826..3d2b7a6 100644
--- a/src/virtio-blk.c
+++ b/src/virtio-blk.c
@@ -153,7 +153,7 @@ init_virtio_blk(u16 bdf)
vdrive_g->drive.pchs.spt = cfg.sectors;
setup_translation(&vdrive_g->drive);
- add_bcv_internal(&vdrive_g->drive);
+ add_bcv_internal(&vdrive_g->drive, bootprio_find_pci_device(bdf));
snprintf(desc, MAXDESCSIZE, "Virtio disk PCI:%x:%x",
pci_bdf_to_bus(bdf), pci_bdf_to_dev(bdf));
--
1.7.2.3
More information about the SeaBIOS
mailing list