[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-block] [SeaBIOS] [PATCH v3 3/4] geometry: Add boot_lchs_find_*() u
From: |
Sam Eiderman |
Subject: |
[Qemu-block] [SeaBIOS] [PATCH v3 3/4] geometry: Add boot_lchs_find_*() utility functions |
Date: |
Wed, 19 Jun 2019 12:23:51 +0300 |
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 <address@hidden>
Reviewed-by: Arbel Moshe <address@hidden>
Signed-off-by: Sam Eiderman <address@hidden>
---
src/Kconfig | 7 ++++++
src/boot.c | 71 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
src/util.h | 6 ++++++
3 files changed, 84 insertions(+)
diff --git a/src/Kconfig b/src/Kconfig
index 55a87cb7..0b4c1c0d 100644
--- a/src/Kconfig
+++ b/src/Kconfig
@@ -72,6 +72,13 @@ endchoice
help
Support controlling of the boot order via the fw_cfg/CBFS
"bootorder" file.
+ config BIOS_GEOMETRY
+ depends on BOOT
+ bool "Boot device bios geometry override"
+ default y
+ help
+ Support overriding bios (logical) geometry of boot devices via the
+ fw_cfg/CBFS "bios-geometry" file.
config COREBOOT_FLASH
depends on COREBOOT
diff --git a/src/boot.c b/src/boot.c
index 70f639f4..308d9559 100644
--- a/src/boot.c
+++ b/src/boot.c
@@ -105,6 +105,8 @@ parse_u32(char *cur, u32 *n)
static void
loadBiosGeometry(void)
{
+ if (!CONFIG_BIOS_GEOMETRY)
+ return;
char *f = romfile_loadfile("bios-geometry", NULL);
if (!f)
return;
@@ -144,6 +146,75 @@ 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_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_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], *p;
+ p = build_pci_path(desc, sizeof(desc), "*", pci);
+ snprintf(p, desc+sizeof(desc)-p, "/*@0/*@%x,%x", 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_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], *p;
+ p = build_pci_path(desc, sizeof(desc), "*", pci);
+ snprintf(p, desc+sizeof(desc)-p, "/drive@%x/disk@%x", 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
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);
--
2.13.3
- [Qemu-block] [SeaBIOS] [PATCH v3 0/4] Add Qemu to SeaBIOS LCHS interface, Sam Eiderman, 2019/06/19
- [Qemu-block] [SeaBIOS] [PATCH v3 1/4] geometry: Read LCHS from fw_cfg, Sam Eiderman, 2019/06/19
- [Qemu-block] [SeaBIOS] [PATCH v3 2/4] boot: Reorder functions in boot.c, Sam Eiderman, 2019/06/19
- [Qemu-block] [SeaBIOS] [PATCH v3 3/4] geometry: Add boot_lchs_find_*() utility functions,
Sam Eiderman <=
- Re: [Qemu-block] [SeaBIOS] [PATCH v3 3/4] geometry: Add boot_lchs_find_*() utility functions, Kevin O'Connor, 2019/06/20
- Re: [Qemu-block] [SeaBIOS] [PATCH v3 3/4] geometry: Add boot_lchs_find_*() utility functions, Sam Eiderman, 2019/06/21
- Re: [Qemu-block] [SeaBIOS] [PATCH v3 3/4] geometry: Add boot_lchs_find_*() utility functions, Kevin O'Connor, 2019/06/21
- Re: [Qemu-block] [SeaBIOS] [PATCH v3 3/4] geometry: Add boot_lchs_find_*() utility functions, Sam Eiderman, 2019/06/22
- Re: [Qemu-block] [SeaBIOS] [PATCH v3 3/4] geometry: Add boot_lchs_find_*() utility functions, Kevin O'Connor, 2019/06/22
- Re: [Qemu-block] [SeaBIOS] [PATCH v3 3/4] geometry: Add boot_lchs_find_*() utility functions, Sam Eiderman, 2019/06/22
- Re: [Qemu-block] [SeaBIOS] [PATCH v3 3/4] geometry: Add boot_lchs_find_*() utility functions, Sam Eiderman, 2019/06/26
[Qemu-block] [SeaBIOS] [PATCH v3 4/4] geometry: Apply LCHS values for boot devices, Sam Eiderman, 2019/06/19