From: "David Woodhouse" <dwmw2@infradead.org>
To: Laszlo Ersek <lersek@redhat.com>,
"devel@edk2.groups.io" <devel@edk2.groups.io>,
jljusten@gmail.com, afish@apple.com,
Paolo Bonzini <pbonzini@redhat.com>
Subject: [PATCH 2/2] LegacyBbs: Add boot entries for VirtIO and NVME devices
Date: Wed, 19 Jun 2019 13:44:26 +0100 [thread overview]
Message-ID: <63b115633cdb63263a016388e169f19dad3d7d51.camel@infradead.org> (raw)
In-Reply-To: <9c9d53f5da9c3dec56cff0ff07c399e3034444a1.camel@infradead.org>
[-- Attachment #1: Type: text/plain, Size: 6511 bytes --]
Signed-off-by: David Woodhouse <dwmw2@infradead.org>
---
They still end up all just called 'Harddisk', but I absolutely do not
want to reproduce all the special cases in BmBootDescription.c. I'm not
even sure I want to export that and use it; it's horrid. Why don't the
disk objects themselves have a protocol which will generate a user-
visible label for them instead of collecting special-cases like that?
But that's just cosmetic. I can now do a CSM boot from VirtIO and NVMe
drives. At least, I can after
https://mail.coreboot.org/hyperkitty/list/seabios@seabios.org/thread/NR6Z4VTZA6VKF46RAFB3Q5TUE6ZLMLXT/
OvmfPkg/Csm/LegacyBiosDxe/LegacyBbs.c | 162 +++++++++++++++++++++++++-
1 file changed, 157 insertions(+), 5 deletions(-)
diff --git a/OvmfPkg/Csm/LegacyBiosDxe/LegacyBbs.c b/OvmfPkg/Csm/LegacyBiosDxe/LegacyBbs.c
index 6b1dd344f3..cc84712d25 100644
--- a/OvmfPkg/Csm/LegacyBiosDxe/LegacyBbs.c
+++ b/OvmfPkg/Csm/LegacyBiosDxe/LegacyBbs.c
@@ -140,10 +140,14 @@ LegacyBiosBuildBbs (
IN BBS_TABLE *BbsTable
)
{
- UINTN BbsIndex;
- HDD_INFO *HddInfo;
- UINTN HddIndex;
- UINTN Index;
+ UINTN BbsIndex;
+ HDD_INFO *HddInfo;
+ UINTN HddIndex;
+ UINTN Index;
+ EFI_HANDLE *BlockIoHandles;
+ UINTN NumberBlockIoHandles;
+ UINTN BlockIndex;
+ EFI_STATUS Status;
//
// First entry is floppy.
@@ -252,8 +256,156 @@ LegacyBiosBuildBbs (
}
}
- return EFI_SUCCESS;
+ //
+ // Add non-IDE block devices
+ //
+ BbsIndex = HddIndex * 2 + 1;
+
+ Status = gBS->LocateHandleBuffer (
+ ByProtocol,
+ &gEfiBlockIoProtocolGuid,
+ NULL,
+ &NumberBlockIoHandles,
+ &BlockIoHandles
+ );
+ if (!EFI_ERROR(Status)) {
+ UINTN Removable;
+ EFI_BLOCK_IO_PROTOCOL *BlkIo;
+ EFI_PCI_IO_PROTOCOL *PciIo;
+ EFI_DEVICE_PATH_PROTOCOL *DevicePath;
+ EFI_DEVICE_PATH_PROTOCOL *DevicePathNode;
+ EFI_HANDLE PciHandle;
+ UINTN SegNum;
+ UINTN BusNum;
+ UINTN DevNum;
+ UINTN FuncNum;
+
+ for (Removable = 0; Removable < 2; Removable++) {
+ for (BlockIndex = 0; BlockIndex < NumberBlockIoHandles; BlockIndex++) {
+ Status = gBS->HandleProtocol (
+ BlockIoHandles[BlockIndex],
+ &gEfiBlockIoProtocolGuid,
+ (VOID **) &BlkIo
+ );
+ if (EFI_ERROR (Status)) {
+ continue;
+ }
+ //
+ // Skip the logical partitions
+ //
+ if (BlkIo->Media->LogicalPartition) {
+ DEBUG((EFI_D_INFO, "Partition\n"));
+ continue;
+ }
+
+ //
+ // Skip the fixed block io then the removable block io
+ //
+ if (BlkIo->Media->RemovableMedia == ((Removable == 0) ? FALSE : TRUE)) {
+ continue;
+ }
+
+ //
+ // Get Device Path
+ //
+ Status = gBS->HandleProtocol (
+ BlockIoHandles[BlockIndex],
+ &gEfiDevicePathProtocolGuid,
+ (VOID **) &DevicePath
+ );
+ if (EFI_ERROR (Status)) {
+ continue;
+ }
+
+ //
+ // Skip ATA devices as they have already been handled
+ //
+ DevicePathNode = DevicePath;
+ while (!IsDevicePathEnd (DevicePathNode)) {
+ if (DevicePathType (DevicePathNode) == MESSAGING_DEVICE_PATH &&
+ DevicePathSubType (DevicePathNode) == MSG_ATAPI_DP) {
+ break;
+ }
+ DevicePathNode = NextDevicePathNode (DevicePathNode);
+ }
+ if (!IsDevicePathEnd (DevicePathNode)) {
+ continue;
+ }
+
+ //
+ // Locate which PCI device
+ //
+ Status = gBS->LocateDevicePath (
+ &gEfiPciIoProtocolGuid,
+ &DevicePath,
+ &PciHandle
+ );
+ if (EFI_ERROR (Status)) {
+ continue;
+ }
+
+ Status = gBS->HandleProtocol (
+ PciHandle,
+ &gEfiPciIoProtocolGuid,
+ (VOID **) &PciIo
+ );
+ if (EFI_ERROR (Status)) {
+ continue;
+ }
+
+ Status = PciIo->GetLocation (
+ PciIo,
+ &SegNum,
+ &BusNum,
+ &DevNum,
+ &FuncNum
+ );
+ if (EFI_ERROR (Status)) {
+ continue;
+ }
+
+ if (SegNum != 0) {
+ DEBUG((EFI_D_INFO, "CSM cannot use PCI devices in segment %d\n", SegNum));
+ continue;
+ }
+
+ DEBUG_CODE (
+ CHAR16 *PathText;
+
+ PathText = ConvertDevicePathToText(DevicePath, FALSE, FALSE);
+
+ DEBUG((EFI_D_INFO, "Add Legacy Bbs entry for PCI %d/%d/%d: %s\n",
+ BusNum, DevNum, FuncNum, PathText));
+ FreePool(PathText);
+ );
+
+ BbsTable[BbsIndex].Bus = BusNum;
+ BbsTable[BbsIndex].Device = DevNum;
+ BbsTable[BbsIndex].Function = FuncNum;
+ BbsTable[BbsIndex].Class = 1;
+ BbsTable[BbsIndex].SubClass = 0x80;
+ BbsTable[BbsIndex].StatusFlags.OldPosition = 0;
+ BbsTable[BbsIndex].StatusFlags.Reserved1 = 0;
+ BbsTable[BbsIndex].StatusFlags.Enabled = 0;
+ BbsTable[BbsIndex].StatusFlags.Failed = 0;
+ BbsTable[BbsIndex].StatusFlags.MediaPresent = 0;
+ BbsTable[BbsIndex].StatusFlags.Reserved2 = 0;
+ BbsTable[BbsIndex].DeviceType = BBS_HARDDISK;
+ BbsTable[BbsIndex].BootPriority = BBS_UNPRIORITIZED_ENTRY;
+ BbsIndex++;
+
+ if (BbsIndex == sizeof(Private->IntThunk->BbsTable) / sizeof(BBS_TABLE)) {
+ Removable = 2;
+ break;
+ }
+ }
+ }
+
+ FreePool (BlockIoHandles);
+ }
+
+ return EFI_SUCCESS;
}
[-- Attachment #2: smime.p7s --]
[-- Type: application/x-pkcs7-signature, Size: 5174 bytes --]
prev parent reply other threads:[~2019-06-19 12:44 UTC|newest]
Thread overview: 14+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <1359122038.24865.19.camel@shinybook.infradead.org>
[not found] ` <1359147866-15605-3-git-send-email-lersek@redhat.com>
2019-06-18 9:13 ` [PATCH 2/2] LegacyBbs: add boot entries for virtio-blk devices David Woodhouse
2019-06-19 12:44 ` [PATCH 1/2] LegacyBios: set NumberBbsEntries to the size of BbsTable David Woodhouse
2019-06-20 16:12 ` [edk2-devel] " Laszlo Ersek
2019-06-20 17:32 ` David Woodhouse
2019-06-20 20:35 ` Laszlo Ersek
2019-06-21 10:59 ` David Woodhouse
2019-06-24 22:08 ` Laszlo Ersek
2019-06-24 22:22 ` Laszlo Ersek
[not found] ` <F95F0A95-4638-4B08-BDAF-53A797A6B877@infradead.org>
2019-06-25 7:06 ` Ni, Ray
2019-06-25 10:34 ` Laszlo Ersek
2019-06-25 7:29 ` David Woodhouse
2019-06-24 11:48 ` David Woodhouse
2019-06-24 21:49 ` Laszlo Ersek
2019-06-19 12:44 ` David Woodhouse [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-list from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=63b115633cdb63263a016388e169f19dad3d7d51.camel@infradead.org \
--to=devel@edk2.groups.io \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox