From: "Laszlo Ersek" <lersek@redhat.com>
To: devel@edk2.groups.io, dwmw2@infradead.org
Cc: Ray Ni <ray.ni@intel.com>
Subject: Re: [edk2-devel] [PATCH 2/7] OvmfPkg/LegacyBbs: Add boot entries for VirtIO and NVME devices
Date: Tue, 25 Jun 2019 00:46:05 +0200 [thread overview]
Message-ID: <5e9a1d83-c378-9c71-29eb-da0d45d8aa90@redhat.com> (raw)
In-Reply-To: <20190621223156.701502-2-dwmw2@infradead.org>
On 06/22/19 00:31, David Woodhouse wrote:
> Iterate over the available block devices in much the same way as
> BdsLibEnumerateAllBootOption() does, but limiting to those devices
> which are PCI-backed, which can be represented in the BbsTable.
>
> One day we might need to extend the BbsTable to allow us to distinguish
> between different NVMe namespaces on a device.
>
> Signed-off-by: David Woodhouse <dwmw2@infradead.org>
> Acked-by: Laszlo Ersek <lersek@redhat.com>
> ---
> OvmfPkg/Csm/LegacyBiosDxe/LegacyBbs.c | 162 +++++++++++++++++++++++++-
> 1 file changed, 157 insertions(+), 5 deletions(-)
Some second-wave comments on this. Feel free to ignore, given that most
of this code is being copied (as the commit message states). But, I'll
feel better after having them pointed out :)
> 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)) {
(1) Whitespace between function designator / macro name / sizeof
operator, and opening paren, please. (Applies elsewhere too.)
> + 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"));
(2) In new code, we use DEBUG_, not EFI_D_.
> + continue;
> + }
> +
> + //
> + // Skip the fixed block io then the removable block io
> + //
> + if (BlkIo->Media->RemovableMedia == ((Removable == 0) ? FALSE : TRUE)) {
(3) Could be simplified as
BlkIo->Media->RemovableMedia == (Removable != 0)
> + 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));
(4) Might deserve DEBUG_WARN
> + 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));
(5) This doesn't handle (PathText == NULL).
(6) DEBUG_VERBOSE might be more appropriate.
(7) UINTN values shouldn't be printed with %d; they should be cast to
UINT64, and printed with %Lu.
Feel free to address any number of these (including zero); and keep the ACK.
Thanks
Laszlo
> + 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;
> }
>
>
>
next prev parent reply other threads:[~2019-06-24 22:46 UTC|newest]
Thread overview: 23+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-06-21 22:31 [PATCH 1/7] OvmfPkg/LegacyBios: set NumberBbsEntries to the size of BbsTable David Woodhouse
2019-06-21 22:31 ` [PATCH 2/7] OvmfPkg/LegacyBbs: Add boot entries for VirtIO and NVME devices David Woodhouse
2019-06-24 22:46 ` Laszlo Ersek [this message]
2019-06-21 22:31 ` [PATCH 3/7] OvmfPkg: Don't build in QemuVideoDxe when we have CSM David Woodhouse
2019-06-21 22:31 ` [PATCH 4/7] MdeModulePkg/UefiBootManagerLib: export EfiBootManagerGetBootDescription() David Woodhouse
2019-06-24 22:36 ` [edk2-devel] " Laszlo Ersek
2019-06-25 2:00 ` Ni, Ray
2019-06-25 8:00 ` David Woodhouse
2019-06-21 22:31 ` [PATCH 5/7] OvmfPkg/LegacyBiosDxe: Use EfiBootManagerGetBootDescription() David Woodhouse
2019-06-24 23:03 ` [edk2-devel] " Laszlo Ersek
2019-06-21 22:31 ` [PATCH 6/7] MdeModulePkg/UefiBootManagerLib: describe VirtIO devices correctly David Woodhouse
2019-06-24 23:16 ` [edk2-devel] " Laszlo Ersek
2019-06-25 1:44 ` Ni, Ray
2019-06-25 7:40 ` David Woodhouse
2019-06-25 8:06 ` Ni, Ray
2019-06-25 8:28 ` David Woodhouse
2019-06-25 9:15 ` Ni, Ray
2019-06-25 9:28 ` David Woodhouse
2019-06-25 9:56 ` Ni, Ray
2019-06-25 11:27 ` David Woodhouse
2019-06-21 22:31 ` [PATCH 7/7] OvmfPkg: don't assign PCI BARs above 4GiB when CSM enabled David Woodhouse
2019-06-24 23:50 ` [edk2-devel] " Laszlo Ersek
2019-06-25 12:07 ` David Woodhouse
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=5e9a1d83-c378-9c71-29eb-da0d45d8aa90@redhat.com \
--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