aboutsummaryrefslogtreecommitdiff
path: root/src/boot.c
diff options
context:
space:
mode:
authorSam Eiderman <shmuel.eiderman@oracle.com>2019-06-26 15:38:15 +0300
committerGerd Hoffmann <kraxel@redhat.com>2019-11-18 14:58:37 +0100
commitd49496f94ed469e18f9aeea4c014d1ab968ff940 (patch)
tree7ae5f55fffdf01fc62ed7a632c68043df09e2bed /src/boot.c
parentdb58caa92ee28af3055e266f8978191e8a0fdddf (diff)
downloadseabios-hppa-d49496f94ed469e18f9aeea4c014d1ab968ff940.zip
seabios-hppa-d49496f94ed469e18f9aeea4c014d1ab968ff940.tar.gz
seabios-hppa-d49496f94ed469e18f9aeea4c014d1ab968ff940.tar.bz2
geometry: Add boot_lchs_find_*() utility functions
Adding the following utility functions: * boot_lchs_find_pci_device * boot_lchs_find_scsi_device * boot_lchs_find_ata_device These will be used to apply LCHS values received through fw_cfg. Reviewed-by: Karl Heubaum <karl.heubaum@oracle.com> Reviewed-by: Arbel Moshe <arbel.moshe@oracle.com> Signed-off-by: Sam Eiderman <shmuel.eiderman@oracle.com> Message-Id: <20190626123816.8907-5-shmuel.eiderman@oracle.com>
Diffstat (limited to 'src/boot.c')
-rw-r--r--src/boot.c69
1 files changed, 69 insertions, 0 deletions
diff --git a/src/boot.c b/src/boot.c
index 52e1c8e..ea18194 100644
--- a/src/boot.c
+++ b/src/boot.c
@@ -129,6 +129,8 @@ parse_u32(char *cur, u32 *n)
static void
loadBiosGeometry(void)
{
+ if (!CONFIG_HOST_BIOS_GEOMETRY)
+ return;
char *f = romfile_loadfile("bios-geometry", NULL);
if (!f)
return;
@@ -168,6 +170,73 @@ loadBiosGeometry(void)
} while (f);
}
+// Search the bios-geometry list for the given glob pattern.
+static BootDeviceLCHS *
+boot_lchs_find(const char *glob)
+{
+ dprintf(1, "Searching bios-geometry for: %s\n", glob);
+ int i;
+ for (i = 0; i < BiosGeometryCount; i++)
+ if (glob_prefix(glob, BiosGeometry[i].name))
+ return &BiosGeometry[i];
+ return NULL;
+}
+
+int boot_lchs_find_pci_device(struct pci_device *pci, struct chs_s *chs)
+{
+ if (!CONFIG_HOST_BIOS_GEOMETRY)
+ return -1;
+ char desc[256];
+ build_pci_path(desc, sizeof(desc), "*", pci);
+ BootDeviceLCHS *b = boot_lchs_find(desc);
+ if (!b)
+ return -1;
+ chs->cylinder = (u16)b->lcyls;
+ chs->head = (u16)b->lheads;
+ chs->sector = (u16)b->lsecs;
+ return 0;
+}
+
+int boot_lchs_find_scsi_device(struct pci_device *pci, int target, int lun,
+ struct chs_s *chs)
+{
+ if (!CONFIG_HOST_BIOS_GEOMETRY)
+ return -1;
+ if (!pci)
+ // support only pci machine for now
+ return -1;
+ // Find scsi drive - for example: /pci@i0cf8/scsi@5/channel@0/disk@1,0
+ char desc[256];
+ build_scsi_path(desc, sizeof(desc), pci, target, lun);
+ BootDeviceLCHS *b = boot_lchs_find(desc);
+ if (!b)
+ return -1;
+ chs->cylinder = (u16)b->lcyls;
+ chs->head = (u16)b->lheads;
+ chs->sector = (u16)b->lsecs;
+ return 0;
+}
+
+int boot_lchs_find_ata_device(struct pci_device *pci, int chanid, int slave,
+ struct chs_s *chs)
+{
+ if (!CONFIG_HOST_BIOS_GEOMETRY)
+ 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];
+ build_ata_path(desc, sizeof(desc), pci, chanid, slave);
+ BootDeviceLCHS *b = boot_lchs_find(desc);
+ if (!b)
+ return -1;
+ chs->cylinder = (u16)b->lcyls;
+ chs->head = (u16)b->lheads;
+ chs->sector = (u16)b->lsecs;
+ return 0;
+}
+
/****************************************************************
* Boot priority ordering