aboutsummaryrefslogtreecommitdiff
path: root/src/fw
diff options
context:
space:
mode:
authorDavid Woodhouse <dwmw2@infradead.org>2019-06-28 14:57:47 +0100
committerKevin O'Connor <kevin@koconnor.net>2019-06-28 11:48:07 -0400
commit30f1e41f04fb4c715d27f987f003cfc31c9ff4f3 (patch)
treefa95efc167b150ac2e442e8e62d8b69814ebdff0 /src/fw
parent020bc4fc5ce93107c8e1bc731b9802cee56a123e (diff)
downloadseabios-hppa-30f1e41f04fb4c715d27f987f003cfc31c9ff4f3.zip
seabios-hppa-30f1e41f04fb4c715d27f987f003cfc31c9ff4f3.tar.gz
seabios-hppa-30f1e41f04fb4c715d27f987f003cfc31c9ff4f3.tar.bz2
csm: Fix boot priority translation
Explicitly handle the BBS_DO_NOT_BOOT_FROM and BBS_IGNORE_ENTRY values. Also add one to the other priority values, as find_prio() does for entries from bootorder. SeaBIOS uses zero for an item explicitly selected in interactive_bootmenu(). Signed-off-by: David Woodhouse <dwmw2@infradead.org>
Diffstat (limited to 'src/fw')
-rw-r--r--src/fw/csm.c23
1 files changed, 20 insertions, 3 deletions
diff --git a/src/fw/csm.c b/src/fw/csm.c
index 3fcc252..8359bcb 100644
--- a/src/fw/csm.c
+++ b/src/fw/csm.c
@@ -319,6 +319,23 @@ handle_csm(struct bregs *regs)
csm_return(regs);
}
+static int csm_prio_to_seabios(u16 csm_prio)
+{
+ switch (csm_prio) {
+ case BBS_DO_NOT_BOOT_FROM:
+ case BBS_IGNORE_ENTRY:
+ return -1;
+
+ case BBS_LOWEST_PRIORITY:
+ case BBS_UNPRIORITIZED_ENTRY:
+ default:
+ // SeaBIOS default priorities start at 1, with 0 being used for
+ // an item explicitly selected from interactive_bootmenu().
+ // As in find_prio(), add 1 to the value being returned.
+ return csm_prio + 1;
+ }
+}
+
int csm_bootprio_ata(struct pci_device *pci, int chanid, int slave)
{
if (!csm_boot_table)
@@ -327,7 +344,7 @@ int csm_bootprio_ata(struct pci_device *pci, int chanid, int slave)
int index = 1 + (chanid * 2) + slave;
dprintf(3, "CSM bootprio for ATA%d,%d (index %d) is %d\n", chanid, slave,
index, bbs[index].BootPriority);
- return bbs[index].BootPriority;
+ return csm_prio_to_seabios(bbs[index].BootPriority);
}
int csm_bootprio_fdc(struct pci_device *pci, int port, int fdid)
@@ -336,7 +353,7 @@ int csm_bootprio_fdc(struct pci_device *pci, int port, int fdid)
return -1;
BBS_TABLE *bbs = (void *)csm_boot_table->BbsTable;
dprintf(3, "CSM bootprio for FDC is %d\n", bbs[0].BootPriority);
- return bbs[0].BootPriority;
+ return csm_prio_to_seabios(bbs[0].BootPriority);
}
int csm_bootprio_pci(struct pci_device *pci)
@@ -350,7 +367,7 @@ int csm_bootprio_pci(struct pci_device *pci)
if (pci->bdf == pci_to_bdf(bbs[i].Bus, bbs[i].Device, bbs[i].Function)) {
dprintf(3, "CSM bootprio for PCI(%d,%d,%d) is %d\n", bbs[i].Bus,
bbs[i].Device, bbs[i].Function, bbs[i].BootPriority);
- return bbs[i].BootPriority;
+ return csm_prio_to_seabios(bbs[i].BootPriority);
}
}
return -1;