vgabios: Add scrolling for linear (packed pixel) graphics mode.
[seabios.git] / src / boot.c
index f3c165caaf9cc25891f4d2472eb91f95d371abe6..93928d38dd5ff3df57d100b5e57e08cb0621992f 100644 (file)
@@ -98,22 +98,9 @@ find_prio(const char *glob)
 
 #define FW_PCI_DOMAIN "/pci@i0cf8"
 
-static struct pci_device *
-find_pci(u16 bdf)
-{
-    struct pci_device *pci;
-    foreachpci(pci) {
-        if (pci->bdf == bdf)
-            return pci;
-    }
-    return NULL;
-}
-
 static char *
 build_pci_path(char *buf, int max, const char *devname, struct pci_device *pci)
 {
-    if (!pci)
-        return buf;
     // Build the string path of a bdf - for example: /pci@i0cf8/isa@1,2
     char *p = buf;
     if (pci->parent) {
@@ -131,51 +118,51 @@ build_pci_path(char *buf, int max, const char *devname, struct pci_device *pci)
     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), "*", find_pci(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 (!CONFIG_BOOTORDER)
         return -1;
-    if (bdf == -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), "*", find_pci(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 (!CONFIG_BOOTORDER)
         return -1;
-    if (bdf == -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", find_pci(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), "*", find_pci(bdf));
+    p = build_pci_path(desc, sizeof(desc), "*", pci);
     if (instance)
         snprintf(p, desc+sizeof(desc)-p, ":rom%d", instance);
     return find_prio(desc);
@@ -193,20 +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", find_pci(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);
 }
 
@@ -377,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)
@@ -389,8 +378,9 @@ 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);
+    int scan_code = get_keystroke(menutime);
     disable_bootsplash();
     if (scan_code != 0x86)
         /* not F12 */