static void
loadBootOrder(void)
{
+ if (!CONFIG_BOOTORDER)
+ return;
+
char *f = romfile_loadfile("bootorder", NULL);
if (!f)
return;
if (!Bootorder) {
warn_noalloc();
free(f);
+ BootorderCount = 0;
return;
}
f = strchr(f, '\n');
if (f)
*(f++) = '\0';
+ nullTrailingSpace(Bootorder[i]);
dprintf(3, "%d: %s\n", i+1, Bootorder[i]);
i++;
} while (f);
#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);
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);
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);
}
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");
}
* Boot menu and BCV execution
****************************************************************/
+#define DEFAULT_BOOTMENU_WAIT 2500
+
// Show IPL option menu.
static void
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 */
// 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:
}
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");
}