public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
From: "Dong, Eric" <eric.dong@intel.com>
To: "devel@edk2.groups.io" <devel@edk2.groups.io>,
	"Tan, Ming" <ming.tan@intel.com>
Subject: Re: [edk2-devel] [PATCH v2] Add Features/Intel/OutOfBandManagement/SpcrFeaturePkg.
Date: Fri, 15 May 2020 08:10:33 +0000	[thread overview]
Message-ID: <DM6PR11MB32740862B5C401F7156D9808FEBD0@DM6PR11MB3274.namprd11.prod.outlook.com> (raw)
In-Reply-To: <20200512055534.22812-1-ming.tan@intel.com>

Reviewed-by: Eric Dong <eric.dong@intel.com>

> -----Original Message-----
> From: devel@edk2.groups.io <devel@edk2.groups.io> On Behalf Of Tan,
> Ming
> Sent: Tuesday, May 12, 2020 1:56 PM
> To: devel@edk2.groups.io
> Subject: [edk2-devel] [PATCH v2] Add
> Features/Intel/OutOfBandManagement/SpcrFeaturePkg.
> 
> REF: https://bugzilla.tianocore.org/show_bug.cgi?id=2710
> 
> It is used to support the Serial Port Console Redirection Table (SPCR).
> 
> Signed-off-by: Ming Tan <ming.tan@intel.com>
> ---
> v2: Add the EFIAPI for function GetSpcrDevice() in
> Include/Library/SpcrDeviceLib.h and
> Library/SpcrDeviceLibNull/SpcrDeviceLibNull.c.
> 
>  .../Include/Library/SpcrDeviceLib.h           |  27 +
>  .../SpcrFeaturePkg/Include/SpcrFeature.dsc    | 108 ++++
>  .../SpcrDeviceLibNull/SpcrDeviceLibNull.c     |  26 +
>  .../SpcrDeviceLibNull/SpcrDeviceLibNull.inf   |  22 +
>  .../SpcrFeaturePkg/Readme.md                  |  64 +++
>  .../SpcrFeaturePkg/SpcrAcpiDxe/SpcrAcpi.c     | 467 ++++++++++++++++++
>  .../SpcrFeaturePkg/SpcrAcpiDxe/SpcrAcpi.h     |  81 +++
>  .../SpcrAcpiDxe/SpcrAcpiDxe.inf               |  42 ++
>  .../SpcrFeaturePkg/SpcrFeaturePkg.dec         |  27 +
>  .../SpcrFeaturePkg/SpcrFeaturePkg.dsc         |  30 ++
>  10 files changed, 894 insertions(+)
>  create mode 100644
> Features/Intel/OutOfBandManagement/SpcrFeaturePkg/Include/Library/Sp
> crDeviceLib.h
>  create mode 100644
> Features/Intel/OutOfBandManagement/SpcrFeaturePkg/Include/SpcrFeatu
> re.dsc
>  create mode 100644
> Features/Intel/OutOfBandManagement/SpcrFeaturePkg/Library/SpcrDevice
> LibNull/SpcrDeviceLibNull.c
>  create mode 100644
> Features/Intel/OutOfBandManagement/SpcrFeaturePkg/Library/SpcrDevice
> LibNull/SpcrDeviceLibNull.inf
>  create mode 100644
> Features/Intel/OutOfBandManagement/SpcrFeaturePkg/Readme.md
>  create mode 100644
> Features/Intel/OutOfBandManagement/SpcrFeaturePkg/SpcrAcpiDxe/Spcr
> Acpi.c
>  create mode 100644
> Features/Intel/OutOfBandManagement/SpcrFeaturePkg/SpcrAcpiDxe/Spcr
> Acpi.h
>  create mode 100644
> Features/Intel/OutOfBandManagement/SpcrFeaturePkg/SpcrAcpiDxe/Spcr
> AcpiDxe.inf
>  create mode 100644
> Features/Intel/OutOfBandManagement/SpcrFeaturePkg/SpcrFeaturePkg.de
> c
>  create mode 100644
> Features/Intel/OutOfBandManagement/SpcrFeaturePkg/SpcrFeaturePkg.ds
> c
> 
> diff --git
> a/Features/Intel/OutOfBandManagement/SpcrFeaturePkg/Include/Library/
> SpcrDeviceLib.h
> b/Features/Intel/OutOfBandManagement/SpcrFeaturePkg/Include/Library/
> SpcrDeviceLib.h
> new file mode 100644
> index 0000000000..947813815e
> --- /dev/null
> +++
> b/Features/Intel/OutOfBandManagement/SpcrFeaturePkg/Include/Library/
> +++ SpcrDeviceLib.h
> @@ -0,0 +1,27 @@
> +/** @file
> +  Header file for a library about SPCR device.
> +  SpcrDeviceLib is usd for Serial Port Console Redirection Table (SPCR) device.
> +
> +  Copyright (c) 2011 - 2020, Intel Corporation. All rights
> + reserved.<BR>
> +  SPDX-License-Identifier: BSD-2-Clause-Patent
> +
> +**/
> +
> +#ifndef _SPCR_DEVICE_LIB_H_
> +#define _SPCR_DEVICE_LIB_H_
> +
> +/**
> +  Get a Serial Port device used for SPCR.
> +  The caller should call FreePool() to free the memory if return value is not
> NULL.
> +
> +  @retval NULL          Can not get device.
> +  @retval Others        A serial port device path.
> +
> +**/
> +EFI_DEVICE_PATH_PROTOCOL *
> +EFIAPI
> +GetSpcrDevice (
> +  VOID
> +  );
> +
> +#endif // _SPCR_DEVICE_LIB_H_
> diff --git
> a/Features/Intel/OutOfBandManagement/SpcrFeaturePkg/Include/SpcrFea
> ture.dsc
> b/Features/Intel/OutOfBandManagement/SpcrFeaturePkg/Include/SpcrFea
> ture.dsc
> new file mode 100644
> index 0000000000..89ef648f31
> --- /dev/null
> +++
> b/Features/Intel/OutOfBandManagement/SpcrFeaturePkg/Include/SpcrFea
> t
> +++ ure.dsc
> @@ -0,0 +1,108 @@
> +## @file
> +# This package provides advanced feature functionality about Serial Port
> Console Redirection Table (SPCR).
> +# This file should be included into another package DSC file to build this
> feature.
> +#
> +# The DEC files are used by the utilities that parse DSC and # INF
> +files to generate AutoGen.c and AutoGen.h files # for the build
> +infrastructure.
> +#
> +# Copyright (c) 2020, Intel Corporation. All rights reserved.<BR> # #
> +SPDX-License-Identifier: BSD-2-Clause-Patent # ##
> +
> +#########################################################
> ##############
> +#########
> +#
> +# Defines Section - statements that will be processed to create a Makefile.
> +#
> +#########################################################
> ##############
> +#########
> +[Defines]
> +!ifndef $(PEI_ARCH)
> +  !error "PEI_ARCH must be specified to build this feature!"
> +!endif
> +!ifndef $(DXE_ARCH)
> +  !error "DXE_ARCH must be specified to build this feature!"
> +!endif
> +
> +#########################################################
> ##############
> +#########
> +#
> +# Library Class section - list of all Library Classes needed by this feature.
> +#
> +#########################################################
> ##############
> +#########
> +[LibraryClasses]
> +  #######################################
> +  # Edk2 Packages
> +  #######################################
> +  BaseLib|MdePkg/Library/BaseLib/BaseLib.inf
> +
> +BaseMemoryLib|MdePkg/Library/BaseMemoryLibRepStr/BaseMemoryLib
> RepStr.in
> +f
> +  DebugLib|MdePkg/Library/BaseDebugLibNull/BaseDebugLibNull.inf
> +
> +UefiDriverEntryPoint|MdePkg/Library/UefiDriverEntryPoint/UefiDriverEntr
> +yPoint.inf
> +  UefiLib|MdePkg/Library/UefiLib/UefiLib.inf
> +  PrintLib|MdePkg/Library/BasePrintLib/BasePrintLib.inf
> +  PcdLib|MdePkg/Library/BasePcdLibNull/BasePcdLibNull.inf
> +
> +UefiBootServicesTableLib|MdePkg/Library/UefiBootServicesTableLib/UefiB
> o
> +otServicesTableLib.inf
> +  DevicePathLib|MdePkg/Library/UefiDevicePathLib/UefiDevicePathLib.inf
> +
> +UefiRuntimeServicesTableLib|MdePkg/Library/UefiRuntimeServicesTableLi
> b/
> +UefiRuntimeServicesTableLib.inf
> +
> +  #######################################
> +  # SpcrFeaturePkg Packages
> +  #######################################
> +
> + SpcrDeviceLib|SpcrFeaturePkg/Library/SpcrDeviceLibNull/SpcrDeviceLibNu
> + ll.inf
> +
> +[LibraryClasses.common.DXE_DRIVER]
> +  #######################################
> +  # Edk2 Packages
> +  #######################################
> +
> +MemoryAllocationLib|MdePkg/Library/UefiMemoryAllocationLib/UefiMem
> oryAl
> +locationLib.inf
> +
> +#########################################################
> ##############
> +#########
> +#
> +# Component section - list of all components that need built for this feature.
> +#
> +# Note: The EDK II DSC file is not used to specify how compiled binary
> images get placed
> +#       into firmware volume images. This section is just a list of modules to
> compile from
> +#       source into UEFI-compliant binaries.
> +#       It is the FDF file that contains information on combining binary files into
> firmware
> +#       volume images, whose concept is beyond UEFI and is described in PI
> specification.
> +#       There may also be modules listed in this section that are not required
> in the FDF file,
> +#       When a module listed here is excluded from FDF file, then UEFI-
> compliant binary will be
> +#       generated for it, but the binary will not be put into any firmware
> volume.
> +#
> +#########################################################
> ##############
> +#########
> +
> +#
> +# Feature DXE Components
> +#
> +
> +# @todo: Change below line to [Components.$(DXE_ARCH)] after
> https://bugzilla.tianocore.org/show_bug.cgi?id=2308
> +#        is completed.
> +[Components.X64]
> +  #####################################
> +  # Spcr Feature Package
> +  #####################################
> +
> +  # Add library instances here that are not included in package
> + components and should be tested  # in the package build.
> +
> +  # Add components here that should be included in the package build.
> +  SpcrFeaturePkg/SpcrAcpiDxe/SpcrAcpiDxe.inf
> +  #{
> +#    <LibraryClasses>
> +#
> SpcrDeviceLib|SpcrFeaturePkg/Library/SpcrDeviceLibNull/SpcrDeviceLibNull.i
> nf
> +#  }
> +
> +#########################################################
> ##############
> +############################
> +#
> +# BuildOptions Section - Define the module specific tool chain flags that
> should be used as
> +#                        the default flags for a module. These flags are appended to
> any
> +#                        standard flags that are defined by the build process. They can
> be
> +#                        applied for any modules or only those modules with the
> specific
> +#                        module style (EDK or EDKII) specified in [Components] section.
> +#
> +#                        For advanced features, it is recommended to enable
> [BuildOptions] in
> +#                        the applicable INF file so it does not affect the whole board
> package
> +#                        build when this DSC file is active.
> +#
> +#########################################################
> ##############
> +############################
> +[BuildOptions]
> diff --git
> a/Features/Intel/OutOfBandManagement/SpcrFeaturePkg/Library/SpcrDevi
> ceLibNull/SpcrDeviceLibNull.c
> b/Features/Intel/OutOfBandManagement/SpcrFeaturePkg/Library/SpcrDevi
> ceLibNull/SpcrDeviceLibNull.c
> new file mode 100644
> index 0000000000..d30f421887
> --- /dev/null
> +++
> b/Features/Intel/OutOfBandManagement/SpcrFeaturePkg/Library/SpcrDevi
> +++ ceLibNull/SpcrDeviceLibNull.c
> @@ -0,0 +1,26 @@
> +/** @file
> +  Implementation for a NULL library of SpcrDeviceLib.
> +  SpcrDeviceLib is usd for Serial Port Console Redirection Table (SPCR) device.
> +
> +  Copyright (c) 2017 - 2020, Intel Corporation. All rights
> + reserved.<BR>
> +  SPDX-License-Identifier: BSD-2-Clause-Patent
> +
> +**/
> +
> +#include <Include/Uefi.h>
> +#include <Protocol/DevicePath.h>
> +
> +/**
> +  Get a Serial Port device used for SPCR.
> +
> +  @retval NULL          Can not get device.
> +
> +**/
> +EFI_DEVICE_PATH_PROTOCOL*
> +EFIAPI
> +GetSpcrDevice (
> +  VOID
> +  )
> +{
> +  return NULL;
> +}
> diff --git
> a/Features/Intel/OutOfBandManagement/SpcrFeaturePkg/Library/SpcrDevi
> ceLibNull/SpcrDeviceLibNull.inf
> b/Features/Intel/OutOfBandManagement/SpcrFeaturePkg/Library/SpcrDevi
> ceLibNull/SpcrDeviceLibNull.inf
> new file mode 100644
> index 0000000000..bf40dc48c3
> --- /dev/null
> +++
> b/Features/Intel/OutOfBandManagement/SpcrFeaturePkg/Library/SpcrDevi
> +++ ceLibNull/SpcrDeviceLibNull.inf
> @@ -0,0 +1,22 @@
> +## @file
> +# Implementation for a NULL library of SpcrDeviceLib.
> +# SpcrDeviceLib is usd for Serial Port Console Redirection Table (SPCR)
> device.
> +#
> +# Copyright (c) 2017 - 2020, Intel Corporation. All rights
> +reserved.<BR> # SPDX-License-Identifier: BSD-2-Clause-Patent # ##
> +
> +[Defines]
> +  INF_VERSION                    = 0x00010017
> +  BASE_NAME                      = SpcrDeviceLibNull
> +  FILE_GUID                      = 8865739F-D0A8-4936-A457-8B3521EC60D1
> +  VERSION_STRING                 = 1.0
> +  MODULE_TYPE                    = BASE
> +  LIBRARY_CLASS                  = SpcrDeviceLib
> +
> +[Packages]
> +  MdePkg/MdePkg.dec
> +
> +[Sources]
> +  SpcrDeviceLibNull.c
> diff --git
> a/Features/Intel/OutOfBandManagement/SpcrFeaturePkg/Readme.md
> b/Features/Intel/OutOfBandManagement/SpcrFeaturePkg/Readme.md
> new file mode 100644
> index 0000000000..a16835b151
> --- /dev/null
> +++ b/Features/Intel/OutOfBandManagement/SpcrFeaturePkg/Readme.md
> @@ -0,0 +1,64 @@
> +# Overview
> +* **Feature Name:** Serial Port Console Redirection Table (SPCR)
> +* **PI Phase(s) Supported:** DXE
> +* **SMM Required?** No
> +
> +More Information:
> +* [Serial Port Console Redirection Table
> +(SPCR)](https://docs.microsoft.com/en-us/windows-
> hardware/drivers/serpo
> +rts/serial-port-console-redirection-table)
> +
> +## Purpose
> +The SPCR feature provides the functionality that select a serial port device
> and fill its info to ACPI table.
> +Windows can get this info and use this serial port as input/output device in
> Microsoft® Windows® Emergency Management Services (EMS).
> +
> +# High-Level Theory of Operation
> +A dxe driver will call a library function to get the serial port device, and
> produces the ACPI table.
> +Platform can implement its own library to select the serial port device.
> +
> +## Firmware Volumes
> +* PostMemory
> +
> +## Modules
> +* SpcrAcpiDxe
> +* SpcrDeviceLibNull
> +
> +## SpcrAcpiDxe
> +The main driver of convert the serial port device info to ACPI table.
> +It will call the function GetSpcrDevice() in the library SpcrDeviceLib to get
> the serial port device path.
> +If the serial port device path is not NULL, then use gEfiPciIoProtocolGuid to
> get the PCI info, and use the gEfiSerialIoProtocolGuid to get the serial port
> info, such as the baud rate etc.
> +If the serial port device is PCI device 00:16:03 (AMT serial over lan PCI
> device), then will set the BaseAddress.
> +At last fill the ACPI table as Windows required.
> +
> +## SpcrDeviceLibNull
> +A NULL implemention of library SpcrDeviceLib, it return NULL for function
> GetSpcrDevice().
> +Platform maybe implemente its own SpcrDeviceLib.
> +
> +## Key Functions
> +Fill the serial port device info used for SPCR to ACPI table.
> +
> +## Configuration
> +There is not special configuration.
> +But the platform maybe implemente its own SpcrDeviceLib.
> +
> +## Data Flows
> +GetSpcrDevice() -> serial port device path -> get PCI info and serial port info
> -> ACPI table.
> +
> +## Control Flows
> +GetSpcrDevice() in SpcrDeviceLib -> SpcrAcpiDxe.
> +
> +## Build Flows
> +There is not special build flow.
> +
> +## Test Point Results
> +* Check the output ACPI table.
> +
> +## Functional Exit Criteria
> +* Check the output ACPI table.
> +
> +## Feature Enabling Checklist
> +There is not special PCD to enable this feature.
> +
> +## Performance Impact
> +The SpcrAcpiDxe.efi with SpcrDeviceLibNull debug version size: 1.4KB,
> release version size: 1.12KB.
> +
> +## Common Optimizations
> +N/A now.
> diff --git
> a/Features/Intel/OutOfBandManagement/SpcrFeaturePkg/SpcrAcpiDxe/Spc
> rAcpi.c
> b/Features/Intel/OutOfBandManagement/SpcrFeaturePkg/SpcrAcpiDxe/Sp
> crAcpi.c
> new file mode 100644
> index 0000000000..85ac48cfa5
> --- /dev/null
> +++
> b/Features/Intel/OutOfBandManagement/SpcrFeaturePkg/SpcrAcpiDxe/Sp
> cr
> +++ Acpi.c
> @@ -0,0 +1,467 @@
> +/** @file
> +  Implementation the driver used to add SPCR device info to ACPI table.
> +  SPCR is abbreviation of Serial Port Console Redirection Table (SPCR).
> +
> +  Copyright (c) 2004 - 2020, Intel Corporation. All rights
> + reserved.<BR>
> +  SPDX-License-Identifier: BSD-2-Clause-Patent
> +
> +**/
> +
> +#include "SpcrAcpi.h"
> +
> +#define PCANSITYPE                0
> +#define VT100TYPE                 1
> +#define VT100PLUSTYPE             2
> +#define VTUTF8TYPE                3
> +
> +#define PCI_MAX_BAR_NO            6
> +
> +UINT8  TerminalTypeValue[4] =
> +{
> +  PCANSITYPE,
> +  VT100TYPE,
> +  VT100PLUSTYPE,
> +  VTUTF8TYPE
> +};
> +
> +///
> +/// Guid for messaging path, used in Serial port setting.
> +///
> +EFI_GUID  TerminalTypeGuid[4] = {
> +  DEVICE_PATH_MESSAGING_PC_ANSI,
> +  DEVICE_PATH_MESSAGING_VT_100,
> +  DEVICE_PATH_MESSAGING_VT_100_PLUS,
> +  DEVICE_PATH_MESSAGING_VT_UTF8
> +};
> +
> +//
> +// Serial Port Console Redirection Table // Please modify all values in
> +Spcr.h only.
> +//
> +EFI_ACPI_SERIAL_PORT_CONSOLE_REDIRECTION_TABLE gSpcrInfo = {
> +  {
> +
> EFI_ACPI_2_0_SERIAL_PORT_CONSOLE_REDIRECTION_TABLE_SIGNATURE,
> +    sizeof (EFI_ACPI_SERIAL_PORT_CONSOLE_REDIRECTION_TABLE),
> +    EFI_ACPI_SERIAL_PORT_CONSOLE_REDIRECTION_TABLE_REVISION,
> +
> +    //
> +    // Checksum will be updated at runtime
> +    //
> +    0x00,
> +
> +    //
> +    // It is expected that these values will be programmed at runtime
> +    //
> +    {'I', 'N', 'T', 'E', 'L', ' '},
> +
> +    SIGNATURE_64 ('S', 'P', 'C', 'R', 'T', 'a', 'b', 'l'),
> +    0x00,               // Spcr revision,
> +    SIGNATURE_32 ('I', 'N', 'T', 'L'),
> +    0x01
> +  },
> +
> +  //
> +  // Beginning of SPCR specific fields
> +  //
> +  0x00,               //INTERFACE_TYPE,
> +  {
> +    0x00,               //RESERVED_BYTE,
> +    0x00,               //RESERVED_BYTE,
> +    0x00               //RESERVED_BYTE,
> +  },
> +
> +  //
> +  // Base Address Block
> +  //
> +  {
> +    EFI_ACPI_3_0_SYSTEM_IO,
> +    0x08,               //BASE_ADDRESS_BIT_WIDTH,
> +    0x00,               //BASE_ADDRESS_BIT_OFFSET,
> +    0x00,               //RESERVED_BYTE,
> +    0x0000000000000000  //BASE_ADDRESS_ADDRESS,  },
> +
> +  0x03,               //INTERRUPT_TYPE,
> +  0x04,               //IRQ,
> +  0x04,               //GLOBAL_SYSTEM_INTERRUPT,
> +  0x07,               //BAUD_RATE,
> +  0x00,               //PARITY,
> +  0x01,               //STOP_BITS,
> +  0x00,               //FLOW_CONTROL,
> +  0x03,               //TERMINAL_TYPE,
> +  0x00,               //LANGUAGE,
> +  0xFFFF,             //PCI_DEVICE_ID,
> +  0xFFFF,             //PCI_VENDOR_ID,
> +  0x00,               //PCI_BUS_NUMBER,
> +  0x00,               //PCI_DEVICE_NUMBER,
> +  0x00,               //PCI_FUNCTION_NUMBER,
> +  0x00000000,         //PCI_FLAGS,
> +  0x00,               //PCI_SEGMENT,
> +  EFI_ACPI_RESERVED_DWORD
> +};
> +
> +
> +/**
> +
> +  Install Boot Device Selection Protocol
> +
> +  @param ImageHandle     The image handle.
> +  @param SystemTable     The system table.
> +
> +  @retval  EFI_SUCEESS  BDS has finished initializing.
> +                        Return the dispatcher and recall BDS.Entry
> +  @retval  Other        Return status from AllocatePool() or gBS-
> >InstallProtocolInterface
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +SpcrInitialize (
> +  IN EFI_HANDLE                            ImageHandle,
> +  IN EFI_SYSTEM_TABLE                      *SystemTable
> +  )
> +{
> +  EFI_STATUS                      Status;
> +  EFI_EVENT                       ReadyToBootEvent;
> +  //
> +  // Install protocol interface
> +  //
> +  Status = EfiCreateEventReadyToBootEx (
> +            TPL_CALLBACK,
> +            OutOfBandACPITableConstruction,
> +            NULL,
> +            &ReadyToBootEvent
> +            );
> +  return Status;
> +}
> +
> +/**
> +  Check whether the device path node is ISA Serial Node.
> +
> +  @param DevicePath     Device path node to be checked
> +
> +  @retval TRUE          It's ISA Serial Node.
> +  @retval FALSE         It's NOT ISA Serial Node.
> +
> +**/
> +BOOLEAN
> +HasIsaSerialNode (
> +  IN EFI_DEVICE_PATH_PROTOCOL *DevicePath
> +  )
> +{
> +  EFI_DEVICE_PATH_PROTOCOL  *Node;
> +  ACPI_HID_DEVICE_PATH      *Acpi;
> +
> +  for (Node = DevicePath; !IsDevicePathEnd (Node); Node =
> NextDevicePathNode (Node)) {
> +    Acpi = (ACPI_HID_DEVICE_PATH *) Node;
> +    if ((DevicePathType (Acpi) == ACPI_DEVICE_PATH) &&
> (DevicePathSubType (Acpi) == ACPI_DP) &&
> +        (ReadUnaligned32 (&Acpi->HID) == EISA_PNP_ID (0x0501))) {
> +      return TRUE;
> +    }
> +  }
> +
> +  return FALSE;
> +}
> +
> +/**
> +  Get Irq and resource info from isa type console device.
> +
> +  @param SavedDevicePath           Device path for isa device.
> +
> +**/
> +VOID
> +GetIsaTypeInfo (
> +  IN EFI_DEVICE_PATH_PROTOCOL *SavedDevicePath
> +  )
> +{
> +  EFI_STATUS               Status;
> +  EFI_HANDLE               Handle;
> +  ACPI_RESOURCE_HEADER_PTR Resources;
> +  EFI_SIO_PROTOCOL         *Sio;
> +  EFI_ACPI_IRQ_NOFLAG_DESCRIPTOR   *Irq;
> +  EFI_ACPI_FIXED_LOCATION_IO_PORT_DESCRIPTOR *FixedLocation;
> +
> +    //
> +    // Try to get IRP and BaseAddress info.
> +    //
> +    Status = gBS->LocateDevicePath(
> +                    &gEfiSioProtocolGuid,
> +                    &SavedDevicePath,
> +                    &Handle
> +                    );
> +    if (EFI_ERROR(Status)) {
> +      return;
> +    }
> +
> +    Status = gBS->HandleProtocol (
> +                    Handle,
> +                    &gEfiSioProtocolGuid,
> +                    (VOID **) &Sio
> +                    );
> +    if (EFI_ERROR(Status)) {
> +      return;
> +    }
> +
> +    Status = Sio->GetResources (Sio, &Resources);
> +    if (EFI_ERROR(Status)) {
> +      return;
> +    }
> +
> +    while (Resources.SmallHeader->Byte != ACPI_END_TAG_DESCRIPTOR) {
> +      switch (Resources.SmallHeader->Byte) {
> +        case ACPI_IRQ_DESCRIPTOR:
> +        case ACPI_IRQ_NOFLAG_DESCRIPTOR:
> +          Irq = (EFI_ACPI_IRQ_NOFLAG_DESCRIPTOR *) Resources.SmallHeader;
> +          gSpcrInfo.Irq = 0;
> +          while (Irq->Mask > 1) {
> +            gSpcrInfo.Irq ++;
> +            Irq->Mask = Irq->Mask >> 1;
> +          }
> +          break;
> +        case ACPI_FIXED_LOCATION_IO_PORT_DESCRIPTOR:
> +          FixedLocation = (EFI_ACPI_FIXED_LOCATION_IO_PORT_DESCRIPTOR
> *)Resources.SmallHeader;
> +          gSpcrInfo.BaseAddress.Address = FixedLocation->BaseAddress;
> +          break;
> +        default:
> +          break;
> +      }
> +
> +      if (Resources.SmallHeader->Bits.Type == 0) {
> +        Resources.SmallHeader = (ACPI_SMALL_RESOURCE_HEADER *) ((UINT8
> *) Resources.SmallHeader
> +                                + Resources.SmallHeader->Bits.Length
> +                                + sizeof (*Resources.SmallHeader));
> +      } else {
> +        Resources.LargeHeader = (ACPI_LARGE_RESOURCE_HEADER *) ((UINT8
> *) Resources.LargeHeader
> +                                + Resources.LargeHeader->Length
> +                                + sizeof (*Resources.LargeHeader));
> +      }
> +    }
> +}
> +
> +/**
> +  Get Irq and resource info from Pci type console device.
> +
> +  @param SavedDevicePath           Device path for PCI device.
> +
> +**/
> +VOID
> +GetPciTypeInfo (
> +  IN EFI_DEVICE_PATH_PROTOCOL *SavedDevicePath
> +  )
> +{
> +  EFI_STATUS               Status;
> +  EFI_HANDLE               PciHandle;
> +  EFI_PCI_IO_PROTOCOL      *PciIo;
> +  UINTN                    Bus;
> +  UINTN                    Device;
> +  UINTN                    Function;
> +  UINTN                    SegNum;
> +  UINTN                    Irq;
> +  UINT16                   BaseAddress;
> +  UINT8                    Count;
> +  UINT64                   Supports;
> +  UINT16                   VendorId;
> +  UINT16                   DeviceId;
> +  EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR   *Resources;
> +
> +  PciIo     = NULL;
> +  Resources = NULL;
> +  Supports  = 0x01;
> +  Bus       = 0;
> +  Device    = 0;
> +  Function  = 0;
> +  SegNum    = 0;
> +  Irq       = 0;
> +  BaseAddress = 0;
> +  VendorId  = 0;
> +  DeviceId  = 0;
> +
> +  Status = gBS->LocateDevicePath (&gEfiPciIoProtocolGuid,
> + &SavedDevicePath, (VOID **) &PciHandle);  if (EFI_ERROR (Status)) {
> +    Status = EFI_NOT_FOUND;
> +    return;
> +  }
> +
> +  Status = gBS->HandleProtocol(PciHandle, &gEfiPciIoProtocolGuid, (VOID
> + **) &PciIo);  if (EFI_ERROR (Status) || (PciIo == NULL)) {
> +    Status = EFI_NOT_FOUND;
> +    return;
> +  }
> +
> +  PciIo->GetLocation(PciIo, &SegNum, &Bus, &Device, &Function);  if
> + (EFI_ERROR (Status)) {
> +    Status = EFI_NOT_FOUND;
> +    return;
> +  }
> +
> +  if (Bus == 0x00 && Device == 0x16 && Function == 3)  {
> +    for (Count = 0; Count < PCI_MAX_BAR_NO; Count++) {
> +      Status  = PciIo->GetBarAttributes (PciIo, Count, &Supports, (VOID **)
> &Resources);
> +      if (!EFI_ERROR(Status)) {
> +        if (Resources->ResType == 1) { // TYPE_IO
> +          BaseAddress= (UINT16)Resources->AddrRangeMin;
> +          break;
> +        }
> +        FreePool (Resources);
> +        Resources = NULL;
> +      }
> +    }
> +  }
> +
> +  Status = PciIo->Pci.Read(PciIo, EfiPciIoWidthUint8, 0x3c, 1, &Irq);
> + if (EFI_ERROR(Status)) {
> +    goto Done;
> +  }
> +
> +  Status = PciIo->Pci.Read(PciIo, EfiPciIoWidthUint16, 0x00, 1,
> + &VendorId);  if (EFI_ERROR(Status)) {
> +    goto Done;
> +  }
> +
> +  Status = PciIo->Pci.Read(PciIo, EfiPciIoWidthUint16, 0x02, 1,
> + &DeviceId);  if (EFI_ERROR(Status)) {
> +    goto Done;
> +  }
> +
> +  gSpcrInfo.BaseAddress.Address = BaseAddress;  gSpcrInfo.Irq = (UINT8)
> + Irq;
> +
> +  gSpcrInfo.PciDeviceId       = DeviceId;
> +  gSpcrInfo.PciVendorId       = VendorId;
> +  gSpcrInfo.PciBusNumber      = (UINT8) Bus;
> +  gSpcrInfo.PciDeviceNumber   = (UINT8) Device;
> +  gSpcrInfo.PciFunctionNumber = (UINT8) Function;
> +  gSpcrInfo.PciSegment        = (UINT8) SegNum;
> +
> +Done:
> +  if (Resources != NULL) {
> +    FreePool (Resources);
> +  }
> +}
> +
> +/**
> +  Installs the Smbios Table to the System Table. This function gets
> +called
> +  when the EFI_EVENT_SIGNAL_READY_TO_BOOT gets signaled
> +
> +  @param  Event                The event to signal
> +  @param  Context              Event contex
> +
> +**/
> +VOID
> +EFIAPI
> +OutOfBandACPITableConstruction (
> +  IN EFI_EVENT        Event,
> +  IN VOID             *Context
> +  )
> +{
> +  EFI_DEVICE_PATH_PROTOCOL *SavedDevicePath;
> +  EFI_DEVICE_PATH_PROTOCOL *TmpDevicePath;
> +  EFI_DEVICE_PATH_PROTOCOL *Tmp2DevicePath;
> +  EFI_ACPI_TABLE_PROTOCOL  *AcpiTablProtocol;
> +  UINTN                    TurnKey;
> +  EFI_STATUS               Status;
> +  EFI_HANDLE               Handle;
> +  EFI_SERIAL_IO_PROTOCOL   *SerialIo;
> +  UINT32                   FlowControl;
> +  VENDOR_DEVICE_PATH       *Vendor;
> +  UINT8                    Index;
> +
> +  Handle          = NULL;
> +
> +  SavedDevicePath = GetSpcrDevice();
> +  if (SavedDevicePath == NULL) {
> +    return;
> +
> +  }
> +  //
> +  // Get TerminalType info from the last device path node.
> +  //
> +  TmpDevicePath  = SavedDevicePath;
> +  Tmp2DevicePath = TmpDevicePath;
> +  while (!IsDevicePathEnd (TmpDevicePath)) {
> +    Tmp2DevicePath = TmpDevicePath;
> +    TmpDevicePath  = NextDevicePathNode(TmpDevicePath);
> +  }
> +  Vendor = (VENDOR_DEVICE_PATH *) Tmp2DevicePath;  for (Index=0;
> Index
> + < 4; Index ++) {
> +    if (CompareGuid (&Vendor->Guid, &TerminalTypeGuid[Index])) {
> +      gSpcrInfo.TerminalType = TerminalTypeValue[Index];
> +      break;
> +    }
> +  }
> +  SetDevicePathEndNode (Tmp2DevicePath);  TmpDevicePath =
> + SavedDevicePath;  //  // Get Console attribute from the serial io
> + protocol.
> +  //
> +  Status = gBS->LocateDevicePath(
> +                  &gEfiSerialIoProtocolGuid,
> +                  &TmpDevicePath,
> +                  &Handle
> +                  );
> +  if (EFI_ERROR(Status)) {
> +    goto out;
> +  }
> +
> +  Status = gBS->HandleProtocol (
> +                  Handle,
> +                  &gEfiSerialIoProtocolGuid,
> +                  (VOID **) &SerialIo
> +                  );
> +  if (EFI_ERROR(Status)) {
> +    goto out;
> +  }
> +
> +  switch (SerialIo->Mode->BaudRate) {
> +    case 9600:
> +      gSpcrInfo.BaudRate = 3;
> +      break;
> +    case 19200:
> +      gSpcrInfo.BaudRate = 4;
> +      break;
> +    case 57600:
> +      gSpcrInfo.BaudRate = 6;
> +      break;
> +    case 115200:
> +    default:
> +      gSpcrInfo.BaudRate = 7;
> +      break;
> +  }
> +
> +  gSpcrInfo.FlowControl = 0;
> +  SerialIo->GetControl(SerialIo, &FlowControl);  if ((FlowControl &
> + EFI_SERIAL_HARDWARE_FLOW_CONTROL_ENABLE) != 0) {
> +    gSpcrInfo.FlowControl = UART_FLOW_CONTROL_HARDWARE;  }
> +
> +  if (HasIsaSerialNode(SavedDevicePath)) {
> +    GetIsaTypeInfo (SavedDevicePath);
> +  } else {
> +    GetPciTypeInfo (SavedDevicePath);
> +  }
> +  //
> +  // Not create before, create new Spcr ACPI table.
> +  //
> +  Status = gBS->LocateProtocol (
> +                  &gEfiAcpiTableProtocolGuid,
> +                  NULL,
> +                  (VOID**)&AcpiTablProtocol
> +                  );
> +  if (EFI_ERROR (Status)) {
> +    goto out;
> +  }
> +
> +  //
> +  // Add table
> +  //
> +  Status = AcpiTablProtocol->InstallAcpiTable (
> +                                  AcpiTablProtocol,
> +                                  &gSpcrInfo,
> +                                  sizeof
> (EFI_ACPI_SERIAL_PORT_CONSOLE_REDIRECTION_TABLE),
> +                                  &TurnKey
> +                                  );
> +  ASSERT_EFI_ERROR (Status);
> +
> +out:
> +  FreePool(SavedDevicePath);
> +}
> diff --git
> a/Features/Intel/OutOfBandManagement/SpcrFeaturePkg/SpcrAcpiDxe/Spc
> rAcpi.h
> b/Features/Intel/OutOfBandManagement/SpcrFeaturePkg/SpcrAcpiDxe/Sp
> crAcpi.h
> new file mode 100644
> index 0000000000..c11da439fc
> --- /dev/null
> +++
> b/Features/Intel/OutOfBandManagement/SpcrFeaturePkg/SpcrAcpiDxe/Sp
> cr
> +++ Acpi.h
> @@ -0,0 +1,81 @@
> +/** @file
> +  Header file for the driver used to add SPCR device info to ACPI table.
> +  SPCR is abbreviation of Serial Port Console Redirection Table (SPCR).
> +
> +  Copyright (c) 2004 - 2020, Intel Corporation. All rights
> + reserved.<BR>
> +  SPDX-License-Identifier: BSD-2-Clause-Patent
> +
> +**/
> +
> +#ifndef _SPCR_ACPI_H_
> +#define _SPCR_ACPI_H_
> +
> +
> +#include <IndustryStandard/Acpi30.h>
> +#include <IndustryStandard/SerialPortConsoleRedirectionTable.h>
> +//#include <Guid/GlobalVariable.h>
> +
> +#include <Library/UefiLib.h>
> +#include <Library/UefiBootServicesTableLib.h>
> +#include <Library/UefiRuntimeServicesTableLib.h>
> +#include <Library/DebugLib.h>
> +#include <Library/DevicePathLib.h>
> +#include <Library/BaseMemoryLib.h>
> +#include <Library/MemoryAllocationLib.h> #include
> +<Library/SpcrDeviceLib.h>
> +
> +#include <Protocol/AcpiTable.h>
> +#include <Protocol/SerialIo.h>
> +#include <Protocol/SuperIo.h>
> +#include <Protocol/DevicePath.h>
> +#include <Protocol/PciIo.h>
> +
> +#pragma pack(1)
> +
> +///
> +/// HII specific Vendor Device Path definition.
> +///
> +typedef struct {
> +  VENDOR_DEVICE_PATH             VendorDevicePath;
> +  EFI_DEVICE_PATH_PROTOCOL       End;
> +} HII_VENDOR_DEVICE_PATH;
> +
> +#pragma pack()
> +//
> +// Prototypes
> +//
> +
> +/**
> +
> +  Install Boot Device Selection Protocol
> +
> +  @param ImageHandle     The image handle.
> +  @param SystemTable     The system table.
> +
> +  @retval  EFI_SUCEESS  BDS has finished initializing.
> +                        Return the dispatcher and recall BDS.Entry
> +  @retval  Other        Return status from AllocatePool() or gBS-
> >InstallProtocolInterface
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +SpcrInitialize (
> +  IN EFI_HANDLE                            ImageHandle,
> +  IN EFI_SYSTEM_TABLE                      *SystemTable
> +  );
> +
> +/**
> +  Installs the Smbios Table to the System Table. This function gets
> +called
> +  when the EFI_EVENT_SIGNAL_READY_TO_BOOT gets signaled
> +
> +  @param  Event                The event to signal
> +  @param  Context              Event contex
> +
> +**/
> +VOID
> +EFIAPI
> +OutOfBandACPITableConstruction (
> +  IN EFI_EVENT        Event,
> +  IN VOID             *Context
> +  );
> +#endif
> diff --git
> a/Features/Intel/OutOfBandManagement/SpcrFeaturePkg/SpcrAcpiDxe/Spc
> rAcpiDxe.inf
> b/Features/Intel/OutOfBandManagement/SpcrFeaturePkg/SpcrAcpiDxe/Sp
> crAcpiDxe.inf
> new file mode 100644
> index 0000000000..3fc84959a0
> --- /dev/null
> +++
> b/Features/Intel/OutOfBandManagement/SpcrFeaturePkg/SpcrAcpiDxe/Sp
> cr
> +++ AcpiDxe.inf
> @@ -0,0 +1,42 @@
> +## @file
> +# SPCR is abbreviation of Serial Port Console Redirection Table (SPCR).
> +#
> +# Copyright (c) 2008 - 2020, Intel Corporation. All rights
> +reserved.<BR> # SPDX-License-Identifier: BSD-2-Clause-Patent # ##
> +
> +[Defines]
> +  INF_VERSION                    = 0x00010017
> +  BASE_NAME                      = SpcrAcpiDxe
> +  FILE_GUID                      = 31740724-5F96-48ca-AA0F-332ACA6B9A75
> +  VERSION_STRING                 = 2.0
> +  MODULE_TYPE                    = DXE_DRIVER
> +  ENTRY_POINT                    = SpcrInitialize
> +#
> +# The following information is for reference only and not required by the
> build tools.
> +#
> +# VALID_ARCHITECTURES = IA32 X64 IPF EBC #
> +
> +[LibraryClasses]
> +  UefiDriverEntryPoint
> +  UefiLib
> +  SpcrDeviceLib
> +
> +[Packages]
> +  MdePkg/MdePkg.dec
> +  SpcrFeaturePkg/SpcrFeaturePkg.dec
> +
> +[Sources]
> +  SpcrAcpi.h
> +  SpcrAcpi.c
> +
> +[Protocols]
> +  gEfiAcpiTableProtocolGuid                     ## CONSUMES
> +  gEfiSioProtocolGuid                           ## SOMETIMES_CONSUMES
> +  gEfiSerialIoProtocolGuid                      ## SOMETIMES_CONSUMES
> +  gEfiPciIoProtocolGuid                         ## SOMETIMES_CONSUMES
> +
> +[Depex]
> +  TRUE
> diff --git
> a/Features/Intel/OutOfBandManagement/SpcrFeaturePkg/SpcrFeaturePkg.
> dec
> b/Features/Intel/OutOfBandManagement/SpcrFeaturePkg/SpcrFeaturePkg.
> dec
> new file mode 100644
> index 0000000000..03776abf06
> --- /dev/null
> +++
> b/Features/Intel/OutOfBandManagement/SpcrFeaturePkg/SpcrFeaturePkg.
> d
> +++ ec
> @@ -0,0 +1,27 @@
> +## @file
> +# This package provides advanced feature functionality about Serial Port
> Console Redirection Table (SPCR).
> +# This package should only depend on EDK II Core packages, IntelSiliconPkg,
> and MinPlatformPkg.
> +#
> +# The DEC files are used by the utilities that parse DSC and # INF
> +files to generate AutoGen.c and AutoGen.h files # for the build
> +infrastructure.
> +#
> +# Copyright (c) 2020, Intel Corporation. All rights reserved.<BR> # #
> +SPDX-License-Identifier: BSD-2-Clause-Patent # ##
> +
> +[Defines]
> +  DEC_SPECIFICATION = 0x00010017
> +  PACKAGE_NAME      = SpcrFeaturePkg
> +  PACKAGE_GUID      = 20E84A8A-9008-4798-8215-697555E95B29
> +  PACKAGE_VERSION   = 0.1
> +
> +[Includes]
> +  Include
> +
> +[LibraryClasses]
> +  ## @libraryclass  Provides an API for get SPCR device.
> +  #
> +  SpcrDeviceLib|Include/Library/SpcrDeviceLib.h
> diff --git
> a/Features/Intel/OutOfBandManagement/SpcrFeaturePkg/SpcrFeaturePkg.
> dsc
> b/Features/Intel/OutOfBandManagement/SpcrFeaturePkg/SpcrFeaturePkg.
> dsc
> new file mode 100644
> index 0000000000..82d2d3ac73
> --- /dev/null
> +++
> b/Features/Intel/OutOfBandManagement/SpcrFeaturePkg/SpcrFeaturePkg.
> d
> +++ sc
> @@ -0,0 +1,30 @@
> +## @file
> +# This package provides advanced feature functionality about Serial Port
> Console Redirection Table (SPCR).
> +# This package should only depend on EDK II Core packages, IntelSiliconPkg,
> and MinPlatformPkg.
> +#
> +# The DEC files are used by the utilities that parse DSC and # INF
> +files to generate AutoGen.c and AutoGen.h files # for the build
> +infrastructure.
> +#
> +# Copyright (c) 2020, Intel Corporation. All rights reserved.<BR> # #
> +SPDX-License-Identifier: BSD-2-Clause-Patent # ##
> +
> +[Defines]
> +  PLATFORM_NAME                  = SpcrFeaturePkg
> +  PLATFORM_GUID                  = 2CEB97B5-610D-440F-A2A7-6775AE2A7E89
> +  PLATFORM_VERSION               = 0.1
> +  DSC_SPECIFICATION              = 0x00010005
> +  OUTPUT_DIRECTORY               = Build/$(PLATFORM_NAME)
> +  SUPPORTED_ARCHITECTURES        = IA32|X64
> +  BUILD_TARGETS                  = DEBUG|RELEASE|NOOPT
> +  SKUID_IDENTIFIER               = DEFAULT
> +  PEI_ARCH                       = IA32
> +  DXE_ARCH                       = X64
> +
> +#
> +# This package always builds the feature.
> +#
> +!include Include/SpcrFeature.dsc
> --
> 2.24.0.windows.2
> 
> 
> 


      reply	other threads:[~2020-05-15  8:10 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-05-12  5:55 [PATCH v2] Add Features/Intel/OutOfBandManagement/SpcrFeaturePkg Tan, Ming
2020-05-15  8:10 ` Dong, Eric [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=DM6PR11MB32740862B5C401F7156D9808FEBD0@DM6PR11MB3274.namprd11.prod.outlook.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