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
>
>
>
prev parent 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