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 <dw...@infradead.org>
> Acked-by: Laszlo Ersek <ler...@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;
>  }
>  
>  
> 


-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.

View/Reply Online (#42763): https://edk2.groups.io/g/devel/message/42763
Mute This Topic: https://groups.io/mt/32163534/21656
Group Owner: devel+ow...@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub  [arch...@mail-archive.com]
-=-=-=-=-=-=-=-=-=-=-=-

Reply via email to