aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSam Eiderman <shmuel.eiderman@oracle.com>2019-06-12 12:37:02 +0300
committerGerd Hoffmann <kraxel@redhat.com>2019-11-06 10:56:00 +0100
commitad2910949b1886deba24f574cee76cdc75e7cabe (patch)
tree99fdca67b44c1b299aec78bef6f9c047f2436fc8
parentb3d21205b7f5cd94e5e34277226c4289b6f65746 (diff)
downloadseabios-ad2910949b1886deba24f574cee76cdc75e7cabe.tar.gz
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: <20190612093704.47175-4-shmuel.eiderman@oracle.com> Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
-rw-r--r--src/boot.c82
-rw-r--r--src/util.h6
2 files changed, 88 insertions, 0 deletions
diff --git a/src/boot.c b/src/boot.c
index b3d49304..9248fab9 100644
--- a/src/boot.c
+++ b/src/boot.c
@@ -157,6 +157,88 @@ loadBootDevices(void)
}
}
+// Search the bootdevices list for the given glob pattern.
+static BootDevice *
+bootdevice_find(const char *glob)
+{
+ dprintf(1, "Searching bootdevices for: %s\n", glob);
+ int i;
+ for (i = 0; i < BootDeviceCount; i++)
+ if (glob_prefix(glob, BootDevices[i].name))
+ return &BootDevices[i];
+ return NULL;
+}
+
+static BootDevice *
+bootdevice_find_pci_device(struct pci_device *pci)
+{
+ // Find pci device - for example: /pci@i0cf8/ethernet@5
+ char desc[256];
+ build_pci_path(desc, sizeof(desc), "*", pci);
+ return bootdevice_find(desc);
+}
+
+static BootDevice *
+bootdevice_find_scsi_device(struct pci_device *pci, int target, int lun)
+{
+ if (!pci)
+ // support only pci machine for now
+ return NULL;
+ // Find scsi drive - for example: /pci@i0cf8/scsi@5/channel@0/disk@1,0
+ char desc[256], *p;
+ p = build_pci_path(desc, sizeof(desc), "*", pci);
+ snprintf(p, desc+sizeof(desc)-p, "/*@0/*@%x,%x", target, lun);
+ return bootdevice_find(desc);
+}
+
+static BootDevice *
+bootdevice_find_ata_device(struct pci_device *pci, int chanid, int slave)
+{
+ if (!pci)
+ // support only pci machine for now
+ return NULL;
+ // 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), "*", pci);
+ snprintf(p, desc+sizeof(desc)-p, "/drive@%x/disk@%x", chanid, slave);
+ return bootdevice_find(desc);
+}
+
+int boot_lchs_find_pci_device(struct pci_device *pci, struct chs_s *chs)
+{
+ BootDevice *b = bootdevice_find_pci_device(pci);
+ 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)
+{
+ BootDevice *b = bootdevice_find_scsi_device(pci, target, lun);
+ 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)
+{
+ BootDevice *b = bootdevice_find_ata_device(pci, chanid, slave);
+ if (!b)
+ return -1;
+ chs->cylinder = (u16)b->lcyls;
+ chs->head = (u16)b->lheads;
+ chs->sector = (u16)b->lsecs;
+ return 0;
+}
+
/****************************************************************
* Boot priority ordering
diff --git a/src/util.h b/src/util.h
index e2afc80c..b173fa88 100644
--- a/src/util.h
+++ b/src/util.h
@@ -38,6 +38,12 @@ struct usbdevice_s;
int bootprio_find_usb(struct usbdevice_s *usbdev, int lun);
int get_keystroke_full(int msec);
int get_keystroke(int msec);
+struct chs_s;
+int boot_lchs_find_pci_device(struct pci_device *pci, struct chs_s *chs);
+int boot_lchs_find_scsi_device(struct pci_device *pci, int target, int lun,
+ struct chs_s *chs);
+int boot_lchs_find_ata_device(struct pci_device *pci, int chanid, int slave,
+ struct chs_s *chs);
// bootsplash.c
void enable_vga_console(void);