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>
This commit is contained in:
Sam Eiderman 2019-06-12 12:37:02 +03:00 committed by Gerd Hoffmann
parent b3d21205b7
commit ad2910949b
2 changed files with 88 additions and 0 deletions

View File

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

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