[edk2-devel] [EFI Redfish Host Interface PATCH 4/5] RedfishPkg/RedfishHostInterfaceDxe: Create SMBIOS type 42 record

Nickle Wang nickle.wang at hpe.com
Thu Oct 29 06:30:59 UTC 2020


Reviewed-by: Nickle Wang <nickle.wang at hpe.com>

> -----Original Message-----
> From: Chang, Abner (HPS SW/FW Technologist) <abner.chang at hpe.com>
> Sent: Tuesday, October 13, 2020 12:08 PM
> To: devel at edk2.groups.io
> Cc: Jiaxin Wu <jiaxin.wu at intel.com>; Siyuan Fu <siyuan.fu at intel.com>; Fan
> Wang <fan.wang at intel.com>; Jiewen Yao <jiewen.yao at intel.com>; Wang,
> Nickle (HPS SW) <nickle.wang at hpe.com>
> Subject: [EFI Redfish Host Interface PATCH 4/5]
> RedfishPkg/RedfishHostInterfaceDxe: Create SMBIOS type 42 record
> 
> This is the abstract driver to consume the contents of SMBIOS type 42h
> device descriptor and protocol type data which provided by
> PlatformHostInterfaceLib, and create SMBIOS type 42 record through
> EFI SMBIOS protocol.
> 
> Signed-off-by: Abner Chang <abner.chang at hpe.com>
> 
> Cc: Jiaxin Wu <jiaxin.wu at intel.com>
> Cc: Siyuan Fu <siyuan.fu at intel.com>
> Cc: Fan Wang <fan.wang at intel.com>
> Cc: Jiewen Yao <jiewen.yao at intel.com>
> Cc: Nickle Wang <nickle.wang at hpe.com>
> ---
>  .../RedfishHostInterfaceDxe.c                 | 243 ++++++++++++++++++
>  .../RedfishHostInterfaceDxe.inf               |  50 ++++
>  2 files changed, 293 insertions(+)
>  create mode 100644
> RedfishPkg/RedfishHostInterfaceDxe/RedfishHostInterfaceDxe.c
>  create mode 100644
> RedfishPkg/RedfishHostInterfaceDxe/RedfishHostInterfaceDxe.inf
> 
> diff --git a/RedfishPkg/RedfishHostInterfaceDxe/RedfishHostInterfaceDxe.c
> b/RedfishPkg/RedfishHostInterfaceDxe/RedfishHostInterfaceDxe.c
> new file mode 100644
> index 0000000000..ec7faefed7
> --- /dev/null
> +++ b/RedfishPkg/RedfishHostInterfaceDxe/RedfishHostInterfaceDxe.c
> @@ -0,0 +1,243 @@
> +/** @file
> +  RedfishHostInterfaceDxe builds up SMBIOS Type 42h host interface
> +  record for Redfish service host interface using EFI MBIOS Protocol.
> +  RedfishHostInterfacePlatformLib is the platform-level library which
> +  provides the content of Redfish host interface type 42h record.
> +
> +  Copyright (c) 2019, Intel Corporation. All rights reserved.<BR>
> +  (C) Copyright 2020 Hewlett Packard Enterprise Development LP<BR>
> +
> +  SPDX-License-Identifier: BSD-2-Clause-Patent
> +
> +**/
> +#include <Uefi.h>
> +#include <Library/BaseLib.h>
> +#include <Library/BaseMemoryLib.h>
> +#include <Library/DebugLib.h>
> +#include <Library/MemoryAllocationLib.h>
> +#include <Library/PrintLib.h>
> +#include <Library/RedfishHostInterfaceLib.h>
> +#include <Library/UefiLib.h>
> +#include <Library/UefiBootServicesTableLib.h>
> +#include <Library/UefiRuntimeServicesTableLib.h>
> +
> +/**
> +  Create SMBIOS type 42 record for Redfish host interface.
> +
> +  @retval EFI_SUCESS     SMBIOS type 42 record is created.
> +  @retval Others         Fail to create SMBIOS 42 record.
> +
> +**/
> +EFI_STATUS
> +RedfishCreateSmbiosTable42 (
> +  VOID
> +  )
> +{
> +  REDFISH_INTERFACE_DATA *DeviceDescriptor;
> +  UINT8 DeviceDataLength;
> +  UINT8 DeviceType;
> +  EFI_STATUS Status;
> +  MC_HOST_INTERFACE_PROTOCOL_RECORD *ProtocolRecord;
> +  VOID *ProtocolRecords;
> +  VOID *NewProtocolRecords;
> +  UINT8 ProtocolCount;
> +  UINT8 CurrentProtocolsDataLength;
> +  UINT8 NewProtocolsDataLength;
> +  UINT8 ProtocolDataSize;
> +  SMBIOS_TABLE_TYPE42 *Type42Record;
> +  EFI_SMBIOS_PROTOCOL *Smbios;
> +  EFI_SMBIOS_HANDLE MemArrayMappedAddrSmbiosHandle;
> +
> +  //
> +  // Get platform Redfish host interface device type descriptor data.
> +  //
> +  Status = RedfishPlatformHostInterfaceDeviceDescriptor (&DeviceType,
> &DeviceDescriptor);
> +  if (EFI_ERROR (Status)) {
> +    if (Status == EFI_NOT_FOUND) {
> +      DEBUG ((DEBUG_ERROR, "%a: No Redfish host interface descriptor is
> provided on this platform.", __FUNCTION__));
> +      return EFI_NOT_FOUND;
> +    }
> +    DEBUG((DEBUG_ERROR, "%a: Fail to get device descriptor, %r.",
> __FUNCTION__, Status));
> +    return Status;
> +  }
> +  if (DeviceType != REDFISH_HOST_INTERFACE_DEVICE_TYPE_USB_V2 &&
> +      DeviceType != REDFISH_HOST_INTERFACE_DEVICE_TYPE_PCI_PCIE_V2
> +    ) {
> +    DEBUG ((DEBUG_ERROR, "%a: Only support either protocol type 04h or
> 05h as Redfish host interface.", __FUNCTION__));
> +    return EFI_UNSUPPORTED;
> +  }
> +  if (DeviceType == REDFISH_HOST_INTERFACE_DEVICE_TYPE_PCI_PCIE_V2)
> {
> +    DeviceDataLength = DeviceDescriptor-
> >DeviceDescriptor.PciPcieDeviceV2.Length;
> +  } else {
> +    DeviceDataLength = DeviceDescriptor-
> >DeviceDescriptor.UsbDeviceV2.Length;
> +  }
> +  //
> +  // Loop to get platform Redfish host interface protocol type data.
> +  //
> +  ProtocolRecord = NULL;
> +  ProtocolRecords = NULL;
> +  NewProtocolRecords = NULL;
> +  Type42Record = NULL;
> +  ProtocolCount = 0;
> +  CurrentProtocolsDataLength = 0;
> +  NewProtocolsDataLength = 0;
> +  while (TRUE) {
> +    Status = RedfishPlatformHostInterfaceProtocolData (&ProtocolRecord,
> ProtocolCount);
> +    if (Status == EFI_NOT_FOUND) {
> +      break;
> +    }
> +    if (EFI_ERROR(Status)) {
> +      DEBUG ((DEBUG_ERROR, "%a: Fail to get Redfish host interafce protocol
> type data.", __FUNCTION__));
> +      if (ProtocolRecords != NULL) {
> +        FreePool (ProtocolRecords);
> +      }
> +      if (ProtocolRecord != NULL) {
> +        FreePool (ProtocolRecord);
> +      }
> +      return Status;
> +    }
> +    ProtocolDataSize = sizeof (MC_HOST_INTERFACE_PROTOCOL_RECORD) -
> sizeof(ProtocolRecord->ProtocolTypeData) + ProtocolRecord-
> >ProtocolTypeDataLen;
> +    NewProtocolsDataLength += ProtocolDataSize;
> +    if (ProtocolRecords == NULL) {
> +      ProtocolRecords = AllocateZeroPool (NewProtocolsDataLength);
> +      if (ProtocolRecords == NULL) {
> +        FreePool (ProtocolRecord);
> +        return EFI_OUT_OF_RESOURCES;
> +      }
> +      CopyMem ((VOID *)ProtocolRecords, (VOID *)ProtocolRecord,
> ProtocolDataSize);
> +      NewProtocolRecords = ProtocolRecords;
> +    } else {
> +      NewProtocolRecords = ReallocatePool(CurrentProtocolsDataLength,
> NewProtocolsDataLength, (VOID *)ProtocolRecords);
> +      if (NewProtocolRecords == NULL) {
> +        DEBUG ((DEBUG_ERROR, "%a: Fail to allocate memory for Redfish host
> interface protocol data."));
> +        FreePool (ProtocolRecords);
> +        FreePool (ProtocolRecord);
> +        return EFI_OUT_OF_RESOURCES;
> +      }
> +      CopyMem (
> +        (VOID *)((UINT8 *)NewProtocolRecords +
> CurrentProtocolsDataLength),
> +        (VOID *)ProtocolRecord,
> +        ProtocolDataSize
> +        );
> +    }
> +    FreePool (ProtocolRecord);
> +    CurrentProtocolsDataLength = NewProtocolsDataLength;
> +    ProtocolCount ++;
> +  };
> +  if (ProtocolCount == 0) {
> +    goto ON_EXIT;
> +  }
> +  //
> +  // Construct SMBIOS Type 42h for Redfish host inteface.
> +  //
> +  // SMBIOS type 42 Record for Redfish Interface
> +  // 00h Type BYTE 42 Management Controller Host Interface structure
> indicator
> +  // 01h Length BYTE Varies Length of the structure, a minimum of 09h
> +  // 02h Handle WORD Varies
> +  // 04h Interface Type BYTE Varies Management Controller Interface Type.
> +  // 05h Interface Specific Data Length (n)
> +  // 06h Interface Specific data
> +  // 06h+n number of protocols defined for the host interface (typically 1)
> +  // 07h+n Include a Protocol Record for each protocol supported.
> +  //
> +  Type42Record = (SMBIOS_TABLE_TYPE42 *) AllocateZeroPool (
> +                                           sizeof (SMBIOS_TABLE_TYPE42) - 4
> +                                           + DeviceDataLength
> +                                           + 1 /// For Protocol Record Count
> +                                           + CurrentProtocolsDataLength
> +                                           + 2 /// Double NULL terminator/
> +                                           );
> +  if (Type42Record == NULL) {
> +    Status = EFI_OUT_OF_RESOURCES;
> +    goto ON_EXIT;
> +  }
> +
> +  Type42Record->Hdr.Type   =
> EFI_SMBIOS_TYPE_MANAGEMENT_CONTROLLER_HOST_INTERFACE;
> +  Type42Record->Hdr.Length = sizeof (SMBIOS_TABLE_TYPE42) - 4
> +                               + DeviceDataLength
> +                               + 1
> +                               + CurrentProtocolsDataLength;
> +  Type42Record->Hdr.Handle = 0;
> +  Type42Record->InterfaceType =
> MCHostInterfaceTypeNetworkHostInterface; // Network Host Interface
> +
> +  //
> +  // Fill in InterfaceTypeSpecificDataLength field
> +  //
> +  Type42Record->InterfaceTypeSpecificDataLength = DeviceDataLength;
> +
> +  //
> +  // Fill in InterfaceTypeSpecificData field
> +  //
> +  CopyMem (Type42Record->InterfaceTypeSpecificData, DeviceDescriptor,
> DeviceDataLength);
> +  FreePool (DeviceDescriptor);
> +  DeviceDescriptor = NULL;
> +
> +  //
> +  // Fill in InterfaceTypeSpecificData Protocol Count field
> +  //
> +  *(Type42Record->InterfaceTypeSpecificData + DeviceDataLength) =
> ProtocolCount;
> +
> +  //
> +  // Fill in Redfish Protocol Data
> +  //
> +  CopyMem (
> +    Type42Record->InterfaceTypeSpecificData + DeviceDataLength + 1,
> +    NewProtocolRecords,
> +    CurrentProtocolsDataLength
> +    );
> +
> +  //
> +  // 5. Add Redfish interface data record to SMBIOS table 42
> +  //
> +  Status = gBS->LocateProtocol (&gEfiSmbiosProtocolGuid, NULL,
> (VOID**)&Smbios);
> +  if (EFI_ERROR (Status)) {
> +    goto ON_EXIT;
> +  }
> +
> +  MemArrayMappedAddrSmbiosHandle = SMBIOS_HANDLE_PI_RESERVED;
> +  Status = Smbios->Add (
> +                    Smbios,
> +                    NULL,
> +                    &MemArrayMappedAddrSmbiosHandle,
> +                    (EFI_SMBIOS_TABLE_HEADER*) Type42Record
> +                    );
> +  DEBUG ((DEBUG_INFO, "RedfishPlatformDxe: Smbios->Add() - %r\n",
> Status));
> +  if (EFI_ERROR (Status)) {
> +    goto ON_EXIT;
> +  }
> +  Status = EFI_SUCCESS;
> +
> +ON_EXIT:
> +  if (DeviceDescriptor != NULL) {
> +    FreePool (DeviceDescriptor);
> +  }
> +  if (NewProtocolRecords != NULL) {
> +    FreePool (NewProtocolRecords);
> +  }
> +  if (Type42Record != NULL) {
> +    FreePool (Type42Record);
> +  }
> +  return Status;
> +}
> +
> +/**
> +  Main entry for this driver.
> +
> +  @param ImageHandle     Image handle this driver.
> +  @param SystemTable     Pointer to SystemTable.
> +
> +  @retval EFI_SUCESS     This function always complete successfully.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +RedfishHostInterfaceDxeEntryPoint (
> +  IN EFI_HANDLE         ImageHandle,
> +  IN EFI_SYSTEM_TABLE   *SystemTable
> +  )
> +{
> +  //
> +  // Create SMBIOS type 42 record.
> +  //
> +  return RedfishCreateSmbiosTable42 ();
> +}
> diff --git
> a/RedfishPkg/RedfishHostInterfaceDxe/RedfishHostInterfaceDxe.inf
> b/RedfishPkg/RedfishHostInterfaceDxe/RedfishHostInterfaceDxe.inf
> new file mode 100644
> index 0000000000..6c1f60bca5
> --- /dev/null
> +++ b/RedfishPkg/RedfishHostInterfaceDxe/RedfishHostInterfaceDxe.inf
> @@ -0,0 +1,50 @@
> +## @file
> +#  RedfishHostInterfaceDxe builds up SMBIOS Type 42h host interface
> +#  record for Redfish service host interface using SMBIOS Protocol.
> +#  RedfishHostInterfacePlatformLib is the platform-level library which
> +#  provides the content of Redfish host interface type 42h record.
> +#
> +#  Copyright (c) 2019, Intel Corporation. All rights reserved.<BR>
> +#  (C) Copyright 2020 Hewlett Packard Enterprise Development LP<BR>
> +
> +#  SPDX-License-Identifier: BSD-2-Clause-Patent
> +#
> +##
> +
> +[Defines]
> +  INF_VERSION                    = 0x0001000b
> +  BASE_NAME                      = RedfishHostInterfaceDxe
> +  FILE_GUID                      = 592626DA-4A1E-8B39-28BA-FEAD92C4A0A4
> +  MODULE_TYPE                    = DXE_DRIVER
> +  VERSION_STRING                 = 1.0
> +  ENTRY_POINT                    = RedfishHostInterfaceDxeEntryPoint
> +
> +#
> +#  VALID_ARCHITECTURES           = IA32 X64 ARM AARCH64 RISCV64
> +#
> +
> +[Sources]
> +  RedfishHostInterfaceDxe.c
> +
> +[Packages]
> +  MdePkg/MdePkg.dec
> +  MdeModulePkg/MdeModulePkg.dec
> +  RedfishPkg/RedfishPkg.dec
> +
> +[LibraryClasses]
> +  BaseLib
> +  BaseMemoryLib
> +  DebugLib
> +  MemoryAllocationLib
> +  PrintLib
> +  RedfishPlatformHostInterfaceLib
> +  UefiBootServicesTableLib
> +  UefiDriverEntryPoint
> +  UefiLib
> +
> +[Protocols]
> +  gEfiSmbiosProtocolGuid                ## TO_START
> +
> +[Depex]
> +  gEfiSmbiosProtocolGuid
> +
> --
> 2.17.1



-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.
View/Reply Online (#66732): https://edk2.groups.io/g/devel/message/66732
Mute This Topic: https://groups.io/mt/77477512/1813853
Group Owner: devel+owner at edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub [edk2-devel-archive at redhat.com]
-=-=-=-=-=-=-=-=-=-=-=-






More information about the edk2-devel-archive mailing list