X-Git-Url: http://wien.tomnetworks.com/gitweb/?p=seabios.git;a=blobdiff_plain;f=src%2Fboot.c;h=9dd37fd57478d7522fb5251f85f64db88f9b479e;hp=e5475a2f2f75e98eff75951fb4615d39d7f4a49d;hb=refs%2Fheads%2Fcoreboot;hpb=c2002a1be8e859f2f9022f7068f62977401798b4 diff --git a/src/boot.c b/src/boot.c index e5475a2..9dd37fd 100644 --- a/src/boot.c +++ b/src/boot.c @@ -26,6 +26,9 @@ static int BootorderCount; static void loadBootOrder(void) { + if (!CONFIG_BOOTORDER) + return; + char *f = romfile_loadfile("bootorder", NULL); if (!f) return; @@ -41,6 +44,7 @@ loadBootOrder(void) if (!Bootorder) { warn_noalloc(); free(f); + BootorderCount = 0; return; } @@ -51,6 +55,7 @@ loadBootOrder(void) f = strchr(f, '\n'); if (f) *(f++) = '\0'; + nullTrailingSpace(Bootorder[i]); dprintf(3, "%d: %s\n", i+1, Bootorder[i]); i++; } while (f); @@ -94,59 +99,70 @@ find_prio(const char *glob) #define FW_PCI_DOMAIN "/pci@i0cf8" static char * -build_pci_path(char *buf, int max, const char *devname, int bdf) +build_pci_path(char *buf, int max, const char *devname, struct pci_device *pci) { // Build the string path of a bdf - for example: /pci@i0cf8/isa@1,2 char *p = buf; - int bus = pci_bdf_to_bus(bdf); - if (bus) - // XXX - this isn't the correct path syntax - p += snprintf(p, max, "/bus%x", bus); + if (pci->parent) { + p = build_pci_path(p, max, "pci-bridge", pci->parent); + } else { + if (pci->rootbus) + p += snprintf(p, max, "/pci-root@%x", pci->rootbus); + p += snprintf(p, buf+max-p, "%s", FW_PCI_DOMAIN); + } - int dev = pci_bdf_to_dev(bdf), fn = pci_bdf_to_fn(bdf); - p += snprintf(p, buf+max-p, "%s/%s@%x", FW_PCI_DOMAIN, devname, dev); + int dev = pci_bdf_to_dev(pci->bdf), fn = pci_bdf_to_fn(pci->bdf); + p += snprintf(p, buf+max-p, "/%s@%x", devname, dev); if (fn) p += snprintf(p, buf+max-p, ",%x", fn); return p; } -int bootprio_find_pci_device(int bdf) +int bootprio_find_pci_device(struct pci_device *pci) { + if (!CONFIG_BOOTORDER) + return -1; // Find pci device - for example: /pci@i0cf8/ethernet@5 char desc[256]; - build_pci_path(desc, sizeof(desc), "*", bdf); + build_pci_path(desc, sizeof(desc), "*", pci); return find_prio(desc); } -int bootprio_find_ata_device(int bdf, int chanid, int slave) +int bootprio_find_ata_device(struct pci_device *pci, int chanid, int slave) { - if (bdf == -1) + if (!CONFIG_BOOTORDER) + return -1; + if (!pci) // support only pci machine for now return -1; // Find ata drive - for example: /pci@i0cf8/ide@1,1/drive@1/disk@0 char desc[256], *p; - p = build_pci_path(desc, sizeof(desc), "*", bdf); + p = build_pci_path(desc, sizeof(desc), "*", pci); snprintf(p, desc+sizeof(desc)-p, "/drive@%x/disk@%x", chanid, slave); return find_prio(desc); } -int bootprio_find_fdc_device(int bdf, int port, int fdid) +int bootprio_find_fdc_device(struct pci_device *pci, int port, int fdid) { - if (bdf == -1) + if (!CONFIG_BOOTORDER) + return -1; + if (!pci) // support only pci machine for now return -1; // Find floppy - for example: /pci@i0cf8/isa@1/fdc@03f1/floppy@0 char desc[256], *p; - p = build_pci_path(desc, sizeof(desc), "isa", bdf); + p = build_pci_path(desc, sizeof(desc), "isa", pci); snprintf(p, desc+sizeof(desc)-p, "/fdc@%04x/floppy@%x", port, fdid); return find_prio(desc); } -int bootprio_find_pci_rom(int bdf, int instance) +int bootprio_find_pci_rom(struct pci_device *pci, int instance) { + if (!CONFIG_BOOTORDER) + return -1; // Find pci rom - for example: /pci@i0cf8/scsi@3:rom2 char desc[256], *p; - p = build_pci_path(desc, sizeof(desc), "*", bdf); + p = build_pci_path(desc, sizeof(desc), "*", pci); if (instance) snprintf(p, desc+sizeof(desc)-p, ":rom%d", instance); return find_prio(desc); @@ -154,6 +170,8 @@ int bootprio_find_pci_rom(int bdf, int instance) int bootprio_find_named_rom(const char *name, int instance) { + if (!CONFIG_BOOTORDER) + return -1; // Find named rom - for example: /rom@genroms/linuxboot.bin char desc[256], *p; p = desc + snprintf(desc, sizeof(desc), "/rom@%s", name); @@ -162,18 +180,20 @@ int bootprio_find_named_rom(const char *name, int instance) return find_prio(desc); } -int bootprio_find_usb(int bdf, u64 path) +int bootprio_find_usb(struct pci_device *pci, u64 path) { + if (!CONFIG_BOOTORDER) + return -1; // Find usb - for example: /pci@i0cf8/usb@1,2/hub@1/network@0/ethernet@0 int i; char desc[256], *p; - p = build_pci_path(desc, sizeof(desc), "usb", bdf); + p = build_pci_path(desc, sizeof(desc), "usb", pci); for (i=56; i>0; i-=8) { int port = (path >> i) & 0xff; if (port != 0xff) - p += snprintf(p, desc+sizeof(desc)-p, "/hub@%x", port); + p += snprintf(p, desc+sizeof(desc)-p, "/hub@%x", port+1); } - snprintf(p, desc+sizeof(desc)-p, "/*@%x", (u32)(path & 0xff)); + snprintf(p, desc+sizeof(desc)-p, "/*@%x", (u32)(path & 0xff)+1); return find_prio(desc); } @@ -306,7 +326,7 @@ boot_add_bev(u16 seg, u16 bev, u16 desc, int prio) void boot_add_bcv(u16 seg, u16 ip, u16 desc, int prio) { - bootentry_add(IPL_TYPE_BCV, defPrio(prio, DEFAULT_PRIO) + bootentry_add(IPL_TYPE_BCV, defPrio(prio, DefaultHDPrio) , SEGOFF(seg, ip).segoff , desc ? MAKE_FLATPTR(seg, desc) : "Legacy option rom"); } @@ -344,6 +364,8 @@ boot_add_cbfs(void *data, const char *desc, int prio) * Boot menu and BCV execution ****************************************************************/ +#define DEFAULT_BOOTMENU_WAIT 2500 + // Show IPL option menu. static void interactive_bootmenu(void) @@ -356,8 +378,12 @@ interactive_bootmenu(void) printf("Press F12 for boot menu.\n\n"); + u32 menutime = romfile_loadint("etc/boot-menu-wait", DEFAULT_BOOTMENU_WAIT); enable_bootsplash(); - int scan_code = get_keystroke(CONFIG_BOOTMENU_WAIT); + if (1 == 1) { + return; + } + int scan_code = get_keystroke(menutime); disable_bootsplash(); if (scan_code != 0x86) /* not F12 */ @@ -438,11 +464,14 @@ boot_prep(void) // XXX - show available drives? // Allow user to modify BCV/IPL order. + dprintf(3, "[wurm] bp1\n"); interactive_bootmenu(); + dprintf(3, "[wurm] bp2\n"); wait_threads(); // Map drives and populate BEV list struct bootentry_s *pos = BootList; + dprintf(3, "[wurm] bp3\n"); while (pos) { switch (pos->type) { case IPL_TYPE_BCV: @@ -466,10 +495,12 @@ boot_prep(void) } pos = pos->next; } + dprintf(3, "[wurm] bp4\n"); // If nothing added a floppy/hd boot - add it manually. add_bev(IPL_TYPE_FLOPPY, 0); add_bev(IPL_TYPE_HARDDISK, 0); + dprintf(3, "[wurm] bp5\n"); }