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>
This commit is contained in:
Sam Eiderman 2019-06-26 15:38:15 +03:00 committed by Gerd Hoffmann
parent db58caa92e
commit d49496f94e
3 changed files with 82 additions and 0 deletions

View File

@ -72,6 +72,13 @@ endchoice
help
Support controlling of the boot order via the fw_cfg/CBFS
"bootorder" file.
config HOST_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

View File

@ -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

View File

@ -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);