From nobody Thu May 16 03:18:39 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of groups.io designates 66.175.222.108 as permitted sender) client-ip=66.175.222.108; envelope-from=bounce+27952+72306+1787277+3901457@groups.io; helo=mail02.groups.io; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of groups.io designates 66.175.222.108 as permitted sender) smtp.mailfrom=bounce+27952+72306+1787277+3901457@groups.io; dmarc=fail(p=none dis=none) header.from=intel.com ARC-Seal: i=1; a=rsa-sha256; t=1614652144; cv=none; d=zohomail.com; s=zohoarc; b=bszL4scVW+aGujGkTpJ1xqFPlesVoM4BVk4Oj5yGOvgxi/Riw4wuX40hIppHOavWan9RwE0csG1jj9oJHRiLRJsp5fJcfVSfMDbqmhRTDuYT88DZaO1mU4XE66LwDHE3pjecjIVU1EC1euNuY92lgbuvGGlYOC5GoouWxD63QNc= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1614652144; h=Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Id:List-Unsubscribe:MIME-Version:Message-ID:Reply-To:References:Sender:Subject:To; bh=cCuyS6Wt2zrpYjgVkVjtEaytGT9XEppMwGKHYX0SsRA=; b=aHKtUZcjVjUYdEjEIH/BYDzPblbHnsMwtFcY+YlbbTZ3KOU1/omNsCeUuqZsZaIqy4ywF8xK2j/Fjbbn3VwkJoYb1X8LmT1Vu1OirV9huVmTV0wNvbeAFdtzal+YQHLF3+QI1Vn1h8/ZRJGkoOxwiXM3S37CYjM4CFmHGy8A9WE= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of groups.io designates 66.175.222.108 as permitted sender) smtp.mailfrom=bounce+27952+72306+1787277+3901457@groups.io; dmarc=fail header.from= (p=none dis=none) header.from= Received: from mail02.groups.io (mail02.groups.io [66.175.222.108]) by mx.zohomail.com with SMTPS id 1614652144127404.19346882781554; Mon, 1 Mar 2021 18:29:04 -0800 (PST) Return-Path: X-Received: by 127.0.0.2 with SMTP id fVPWYY1788612xMBIIJsWaK9; Mon, 01 Mar 2021 18:29:03 -0800 X-Received: from mga02.intel.com (mga02.intel.com [134.134.136.20]) by mx.groups.io with SMTP id smtpd.web11.3132.1614652142744425290 for ; Mon, 01 Mar 2021 18:29:03 -0800 IronPort-SDR: TLedR1Mvnq553hPDZjZ+SVT/v/r8mGslAPgYMRZzhvHsE8mpaTGLT1sR075QTiOQ5GH5bBjqiz YlNCPsLClvXg== X-IronPort-AV: E=McAfee;i="6000,8403,9910"; a="173797230" X-IronPort-AV: E=Sophos;i="5.81,216,1610438400"; d="scan'208";a="173797230" X-Received: from fmsmga004.fm.intel.com ([10.253.24.48]) by orsmga101.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 01 Mar 2021 18:29:01 -0800 IronPort-SDR: RzLZ9a0+9upiLWzpCVmsp+9qRTHLajwArytZoTrDcUh2c9o4CLenz3thDYCSiBtYUz8Wd1gHKC GdERaPYvQngQ== X-IronPort-AV: E=Sophos;i="5.81,216,1610438400"; d="scan'208";a="427169855" X-Received: from nldesimo-desk1.amr.corp.intel.com ([10.212.174.59]) by fmsmga004-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 01 Mar 2021 18:29:01 -0800 From: "Nate DeSimone" To: devel@edk2.groups.io Cc: Isaac Oram , Sai Chaganty , Liming Gao , Michael Kubacki Subject: [edk2-devel] [edk2-platforms] [PATCH v1 1/9] IpmiFeaturePkg: Add IPMI driver Include headers Date: Mon, 1 Mar 2021 18:27:56 -0800 Message-Id: <20210302022804.8641-2-nathaniel.l.desimone@intel.com> In-Reply-To: <20210302022804.8641-1-nathaniel.l.desimone@intel.com> References: <20210302022804.8641-1-nathaniel.l.desimone@intel.com> MIME-Version: 1.0 Precedence: Bulk List-Unsubscribe: Sender: devel@edk2.groups.io List-Id: Mailing-List: list devel@edk2.groups.io; contact devel+owner@edk2.groups.io Reply-To: devel@edk2.groups.io,nathaniel.l.desimone@intel.com X-Gm-Message-State: v5Weqw0iB2Z7tQOUHzmAio0ix1787277AA= Content-Transfer-Encoding: quoted-printable DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=groups.io; q=dns/txt; s=20140610; t=1614652143; bh=fOVAf8L9nTS9CLQQWPiq2tlouxW92J11Hts7kjgUIsc=; h=Cc:Date:From:Reply-To:Subject:To; b=mMXCuqkfpKEubCVWYD7u7dJ7sggxWPPyshxLT+k/Wx1477kg8SRvw3yAYDLTQB6YTLC 1YEo2PyAf8BbTDStabbKzUU90eCkMnJv6GapqMoAhBMPB9q1UlPXQ4xkJLaNo8DUMXsoh mp91UNVeFB+HRisXp387cuRQgZf0+NKn/7A= X-ZohoMail-DKIM: pass (identity @groups.io) Content-Type: text/plain; charset="utf-8" From: Isaac Oram REF: https://bugzilla.tianocore.org/show_bug.cgi?id=3D3242 Adds header files for the IPMI transport drivers. Cc: Sai Chaganty Cc: Liming Gao Cc: Michael Kubacki Signed-off-by: Isaac Oram Co-authored-by: Nate DeSimone Acked-by: Michael Kubacki Reviewed-by: Sai Chaganty --- .../Include/Library/IpmiBaseLib.h | 50 +++ .../Include/Library/IpmiCommandLib.h | 19 +- .../Include/Ppi/IpmiTransportPpi.h | 68 ++++ .../Include/Protocol/IpmiTransportProtocol.h | 75 ++++ .../IpmiFeaturePkg/Include/ServerManagement.h | 337 ++++++++++++++++++ .../IpmiFeaturePkg/Include/SmStatusCodes.h | 98 +++++ 6 files changed, 646 insertions(+), 1 deletion(-) create mode 100644 Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Inclu= de/Library/IpmiBaseLib.h create mode 100644 Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Inclu= de/Ppi/IpmiTransportPpi.h create mode 100644 Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Inclu= de/Protocol/IpmiTransportProtocol.h create mode 100644 Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Inclu= de/ServerManagement.h create mode 100644 Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Inclu= de/SmStatusCodes.h diff --git a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Include/Libr= ary/IpmiBaseLib.h b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Inclu= de/Library/IpmiBaseLib.h new file mode 100644 index 0000000000..8487ace5ba --- /dev/null +++ b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Include/Library/Ipm= iBaseLib.h @@ -0,0 +1,50 @@ +/** @file + IPMI Command Library Header File. + + @copyright + Copyright 2011 - 2021 Intel Corporation.
+ SPDX-License-Identifier: BSD-2-Clause-Patent +**/ + +#ifndef _IPMI_BASE_LIB_H_ +#define _IPMI_BASE_LIB_H_ + +// +// Prototype definitions for IPMI Library +// +/** + Initialize the global varible with the pointer of IpmiTransport Protocol. + + @retval EFI_SUCCESS - Always return success + +**/ +EFI_STATUS +InitializeIpmiBase ( + VOID + ); + +/** + Routine to send commands to BMC. + + @param NetFunction - Net function of the command + @param Command - IPMI Command + @param CommandData - Command Data + @param CommandDataSize - Size of CommandData + @param ResponseData - Response Data + @param ResponseDataSize - Response Data Size + + @retval EFI_NOT_AVAILABLE_YET - IpmiTransport Protocol is not installed = yet + +**/ +EFI_STATUS +IpmiSubmitCommand ( + IN UINT8 NetFunction, + IN UINT8 Command, + IN UINT8 *CommandData, + IN UINT32 CommandDataSize, + OUT UINT8 *ResponseData, + OUT UINT32 *ResponseDataSize + ); + +#endif + diff --git a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Include/Libr= ary/IpmiCommandLib.h b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/In= clude/Library/IpmiCommandLib.h index 9b761717d4..18f9d123c9 100644 --- a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Include/Library/Ipm= iCommandLib.h +++ b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Include/Library/Ipm= iCommandLib.h @@ -1,7 +1,7 @@ /** @file This library abstract how to send/receive IPMI command. =20 -Copyright (c) 2018, Intel Corporation. All rights reserved.
+Copyright (c) 2018-2021, Intel Corporation. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent =20 **/ @@ -143,6 +143,23 @@ IpmiSetPowerRestorePolicy ( OUT IPMI_SET_POWER_RESTORE_POLICY_RESPONSE *ChassisControlResponse ); =20 +// +// NetFnStorage +// +EFI_STATUS +EFIAPI +IpmiSetSystemBootOptions ( + IN IPMI_SET_BOOT_OPTIONS_REQUEST *BootOptionsRequest, + OUT IPMI_SET_BOOT_OPTIONS_RESPONSE *BootOptionsResponse + ); + +EFI_STATUS +EFIAPI +IpmiGetSystemBootOptions ( + IN IPMI_GET_BOOT_OPTIONS_REQUEST *BootOptionsRequest, + OUT IPMI_GET_BOOT_OPTIONS_RESPONSE *BootOptionsResponse + ); + // // NetFnStorage // diff --git a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Include/Ppi/= IpmiTransportPpi.h b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Incl= ude/Ppi/IpmiTransportPpi.h new file mode 100644 index 0000000000..9ecb20f9bf --- /dev/null +++ b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Include/Ppi/IpmiTra= nsportPpi.h @@ -0,0 +1,68 @@ +/** @file + IPMI Ttransport PPI Header File. + + @copyright + Copyright 2014 - 2021 Intel Corporation.
+ SPDX-License-Identifier: BSD-2-Clause-Patent +**/ + +#ifndef _IPMI_TRANSPORT_PPI_H_ +#define _IPMI_TRANSPORT_PPI_H_ + +#include "ServerManagement.h" + +typedef struct _PEI_IPMI_TRANSPORT_PPI PEI_IPMI_TRANSPORT_PPI; + +#define PEI_IPMI_TRANSPORT_PPI_GUID \ + { \ + 0x7bf5fecc, 0xc5b5, 0x4b25, 0x81, 0x1b, 0xb4, 0xb5, 0xb, 0x28, 0x79, 0= xf7 \ + } + +// +// Common Defines +// +typedef UINT32 BMC_STATUS; + +#define BMC_OK 0 +#define BMC_SOFTFAIL 1 +#define BMC_HARDFAIL 2 +#define BMC_UPDATE_IN_PROGRESS 3 +#define BMC_NOTREADY 4 + + +// +// IPMI Function Prototypes +// +typedef +EFI_STATUS +(EFIAPI *PEI_IPMI_SEND_COMMAND) ( + IN PEI_IPMI_TRANSPORT_PPI *This, + IN UINT8 NetFunction, + IN UINT8 Lun, + IN UINT8 Command, + IN UINT8 *CommandData, + IN UINT32 CommandDataSize, + OUT UINT8 *ResponseData, + OUT UINT32 *ResponseDataSize + ); + +typedef +EFI_STATUS +(EFIAPI *PEI_IPMI_GET_CHANNEL_STATUS) ( + IN PEI_IPMI_TRANSPORT_PPI *This, + OUT BMC_STATUS *BmcStatus, + OUT SM_COM_ADDRESS *ComAddress + ); + +// +// IPMI TRANSPORT PPI +// +struct _PEI_IPMI_TRANSPORT_PPI { + UINT64 Revision; + PEI_IPMI_SEND_COMMAND IpmiSubmitCommand; + PEI_IPMI_GET_CHANNEL_STATUS GetBmcStatus; +}; + +extern EFI_GUID gPeiIpmiTransportPpiGuid; + +#endif diff --git a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Include/Prot= ocol/IpmiTransportProtocol.h b/Features/Intel/OutOfBandManagement/IpmiFeatu= rePkg/Include/Protocol/IpmiTransportProtocol.h new file mode 100644 index 0000000000..2ee6f98e07 --- /dev/null +++ b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Include/Protocol/Ip= miTransportProtocol.h @@ -0,0 +1,75 @@ +/** @file + IPMITtransport Protocol Header File. + + @copyright + Copyright 2011 - 2021 Intel Corporation.
+ SPDX-License-Identifier: BSD-2-Clause-Patent +**/ + +#ifndef _IPMI_TRANSPORT_PROTO_H_ +#define _IPMI_TRANSPORT_PROTO_H_ + +#include + +typedef struct _IPMI_TRANSPORT IPMI_TRANSPORT; + +#define IPMI_TRANSPORT_PROTOCOL_GUID \ + { \ + 0x6bb945e8, 0x3743, 0x433e, 0xb9, 0xe, 0x29, 0xb3, 0xd, 0x5d, 0xc6, 0x= 30 \ + } + +#define SMM_IPMI_TRANSPORT_PROTOCOL_GUID \ +{ \ + 0x8bb070f1, 0xa8f3, 0x471d, 0x86, 0x16, 0x77, 0x4b, 0xa3, 0xf4, 0x30, 0x= a0 \ +} + +// +// Common Defines +// +typedef UINT32 BMC_STATUS; + +#define BMC_OK 0 +#define BMC_SOFTFAIL 1 +#define BMC_HARDFAIL 2 +#define BMC_UPDATE_IN_PROGRESS 3 +#define BMC_NOTREADY 4 + +// +// IPMI Function Prototypes +// +typedef +EFI_STATUS +(EFIAPI *IPMI_SEND_COMMAND) ( + IN IPMI_TRANSPORT *This, + IN UINT8 NetFunction, + IN UINT8 Lun, + IN UINT8 Command, + IN UINT8 *CommandData, + IN UINT32 CommandDataSize, + OUT UINT8 *ResponseData, + OUT UINT32 *ResponseDataSize + ); + +typedef +EFI_STATUS +(EFIAPI *IPMI_GET_CHANNEL_STATUS) ( + IN IPMI_TRANSPORT *This, + OUT BMC_STATUS *BmcStatus, + OUT SM_COM_ADDRESS *ComAddress + ); + +// +// IPMI TRANSPORT PROTOCOL +// +struct _IPMI_TRANSPORT { + UINT64 Revision; + IPMI_SEND_COMMAND IpmiSubmitCommand; + IPMI_GET_CHANNEL_STATUS GetBmcStatus; + EFI_HANDLE IpmiHandle; + UINT8 CompletionCode; +}; + +extern EFI_GUID gIpmiTransportProtocolGuid; +extern EFI_GUID gSmmIpmiTransportProtocolGuid; + +#endif diff --git a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Include/Serv= erManagement.h b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Include/= ServerManagement.h new file mode 100644 index 0000000000..244b86e91a --- /dev/null +++ b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Include/ServerManag= ement.h @@ -0,0 +1,337 @@ +/** @file + Generic Definations for Server Management Header File. + + @copyright + Copyright 1999 - 2021 Intel Corporation.
+ SPDX-License-Identifier: BSD-2-Clause-Patent +**/ + +#ifndef _SERVER_MANAGEMENT_H_ +#define _SERVER_MANAGEMENT_H_ + +// +// Defines +// +#define PRIM_IPMB_CHANNEL 0x0 +#define BMC_LUN 0x0 +#define PRESENT_INTERFACE 0xE +#define SYSTEM_INTERFACE 0xF +#define COMPLETE_SEL_RECORD 0xFF +#define IPMI_UNSPECIFIED_ERROR 0xFF + +// +// Net Function Defines. +// +#define SM_CHASSIS 0x0 +#define SM_BRIDGE 0x2 +#define SM_SENSOR_EVENT 0x4 +#define SM_APPLICATION 0x6 +#define SM_FIRMWARE 0x8 +#define SM_STORAGE 0xA +#define SM_TRANSPORT 0xC +#define SM_GROUP_EXT 0x2C +#define SM_OEM_GROUP 0x2E +#define SM_INTEL_OEM 0x30 +#define SM_SOL_OEM 0x34 + +// +// IPMI Command Definations. +// +#define IPMI_GET_DEVICE_ID 1 +#define IPMI_COLD_RESET 2 +#define IPMI_WARM_RESET 3 +#define IPMI_GET_SELF_TEST_RESULTS 4 +#define IPMI_MFG_MODE_ON 5 +#define IPMI_SET_ACPI_POWER_STATE 6 +#define IPMI_GET_ACPI_POWER_STATE 7 +#define IPMI_GET_DEVICE_GUID 8 + +#define IPMI_GET_MESSAGE_FLAGS 0x31 +#define IPMI_GET_MESSAGE 0x33 +#define IPMI_SEND_MESSAGE 0x34 + +#define RESERVE_SEL_ENTRY 0x42 +#define ADD_SEL_ENTRY 0x44 +#define GET_SEL_ENTRY 0x43 +#define DELETE_SEL_ENTRY 0x46 +#define CLEAR_SEL_ENTRY 0x47 +#define SET_BMC_GLOBALS 0x2E +#define GET_BMC_GLOBALS 0x2F +#define SET_SEL_TIME 0x49 + +#define GET_SELF_TEST_RESULTS 0x4 + +#define NMI_ENABLE_DISABLE 0xF7 + +// +// Controller Attributes +// +#define IPMI_SENSOR_DEVICE_SUPPORT 0x1 +#define IPMB_SDR_REPOSITORY_SUPPORT 0x2 +#define IPMI_SEL_DEVICE_SUPPORT 0x4 +#define IPMI_FRU_INVENTORY_SUPPORT 0x8 +#define IPMB_EVENT_RECEIVER_SUPPORT 0x10 +#define IPMB_EVENT_GENERATOR_SUPPORT 0x20 +#define ICMB_BRIDGE_SUPPORT 0x40 +#define ICMB_CHASSIS_DEVICE_SUPPORT 0x80 +#define SM_TCP_SUPPORT 0x100 +#define SM_UDP_SUPPORT 0x200 +#define SM_IPV4_SUPPORT 0x400 +#define SM_IPV6_SUPPORT 0x800 +#define SM_RS232_SUPPORT 0x1000 + +// +// Sensor Type Definations +// +typedef enum { + SensorReserved, + SensorTemperature, + SensorVoltage, + SensorCurrent, + SensorFan, + SensorPhysicalSecurity, + SensorPlatformSecurityViolationAttempt, + SensorProcessor, + SensorPowerSupply, + SensorPowerUnit, + SensorCoolingDevice, + SensorOtherUnits, + SensorMemory, + SensorDriveSlot, + SensorPOSTMemoryResize, + SensorSystemFirmwareProgress, + SensorEventLoggingDisabled, + SensorWatchdog1, + SensorSystemEvent, + SensorCriticalInterrupt, + SensorButton, + SensorModuleBoard, + SensorMicrocontrollerCoprocessor, + SensorAddinCard, + SensorChassis, + SensorChipSet, + SensorOtherFRU, + SensorCableInterconnect, + SensorTerminator, + SensorSystemBootInitiated, + SensorBootError, + SensorOSBoot, + SensorOSCriticalStop, + SensorSlotConnector, + SensorSystemACPIPowerState, + SensorWatchdog2, + SensorPlatformAlert, + SensorEntityPresence, + SensorMonitorASIC, + SensorLAN, + SensorManagementSubsystemHealth +} SM_SENSOR_TYPE; + +// +// Sensor Event Type Code +// +#define SENSOR_THRESHOLD_EVENT_TYPE 1 +#define SENSOR_SPECIFIC_EVENT_TYPE 0x6F + +// +// THRESHOLD SENSOR TYPE BIT MASK +// +#define LOWER_NON_CRITICAL_GOING_LOW 0x1 +#define LOWER_NON_CRITICAL_GOING_HI 0x2 +#define LOWER_CRITICAL_GOING_LOW 0x4 +#define LOWER_CRITICAL_GOING_HI 0x8 +#define LOWER_NON_RECOVER_GOING_LOW 0x10 +#define LOWER_NON_RECOVER_GOING_HI 0x20 +#define UPPER_NON_CRITICAL_GOING_LOW 0x40 +#define UPPER_NON_CRITICAL_GOING_HI 0x80 +#define UPPER_CRITICAL_GOING_LOW 0x100 +#define UPPER_CRITICAL_GOING_HI 0x200 +#define UPPER_NON_RECOVER_GOING_LOW 0x400 +#define UPPER_NON_RECOVER_GOING_HI 0x800 + +// +// Server Management COM Addressing types +// +typedef enum { + SmReserved, + SmIpmb, + SmIcmb1_0, + SmIcmb0_9, + Sm802_3_Lan, + SmRs_232, + SmOtherLan, + SmPciSmBus, + SmSmBus1_0, + SmSmBus2_0, + SmUsb1_x, + SmUsb2_x, + SmBmc +} SM_CHANNEL_MEDIA_TYPE; + +typedef enum { + SmTcp, + SmUdp, + SmIcmp, + SmIpmi +} SM_PROTOCOL_TYPE; + +typedef enum { + SmMessage, + SmRawData +} SM_DATA_TYPE; + +typedef struct { + BOOLEAN IpAddressType; + UINT16 IpPort; + UINT8 IpAddress[16]; +} SM_IP_ADDRESS; + +typedef struct { + UINT8 SlaveAddress; + UINT8 LunAddress; + UINT8 NetFunction; + UINT8 ChannelAddress; +} SM_IPMI_ADDRESS; + +typedef struct { + UINT8 SerialPortNumber; +} SM_SERIAL_ADDRESS; + +typedef union { + SM_IP_ADDRESS IpAddress; + SM_IPMI_ADDRESS BmcAddress; + SM_SERIAL_ADDRESS SerialAddress; +} SM_COM_ADDRESS_TYPE; + +typedef struct { + SM_CHANNEL_MEDIA_TYPE ChannelType; + SM_COM_ADDRESS_TYPE Address; +} SM_COM_ADDRESS; + +#pragma pack(1) +// +// Sensor Reading Data +// +typedef enum { + DataLinear, // Linear + DataNaturalLog, // Ln(x) + DataLog10, // Log10(x) + DataLog2, // Log2(x) + Datae, // e + DataExp10, // Exp 10 + DataExp2, // Exp 2 + DataInverse, // 1/x + DataSqr, // Sqr + DataCube, // Cube + DataSqrt, // Square Root + DataCubeInverse // Cube-1 (x) +} LINERIZATION_TYPE; + +typedef union { + UINT8 SensorUint8Data[2]; + UINT16 SensorUint16Data; +} SENSOR_SPLIT_DATA; + +typedef struct { + LINERIZATION_TYPE Linearization; // L + UINT8 Tolerance; // Tolerance + UINT8 AdditiveOffsetExp; // k1 + UINT8 AccuracyExp; // Accuracy Exponential + UINT8 ResultExponent; // k2 + SENSOR_SPLIT_DATA IntegerConstantMultiplier; // M + SENSOR_SPLIT_DATA AdditiveOffset; // B + SENSOR_SPLIT_DATA Accuracy; // Accuracy +} SENSOR_CONVERSION_DATA; + +// +// Server Management Controller Information +// +typedef struct { + UINT8 CompletionCode; + UINT8 DeviceId; + UINT8 DeviceRevision : 4; + UINT8 Reserved : 3; + UINT8 DeviceSdr : 1; + UINT8 MajorFirmwareRev : 7; + UINT8 UpdateMode : 1; + UINT8 MinorFirmwareRev; + UINT8 SpecificationVersion; + UINT8 SensorDeviceSupport : 1; + UINT8 SdrRepositorySupport : 1; + UINT8 SelDeviceSupport : 1; + UINT8 FruInventorySupport : 1; + UINT8 IPMBMessageReceiver : 1; + UINT8 IPMBMessageGenerator : 1; + UINT8 BridgeSupport : 1; + UINT8 ChassisSupport : 1; + UINT8 ManufacturerId[3]; + UINT16 ProductId; + UINT32 AuxFirmwareRevInfo; +} SM_CTRL_INFO; + +typedef struct { + UINT8 Reserved1 : 1; + UINT8 ControllerSlaveAddress : 7; + UINT8 FruDeviceId; + UINT8 BusId : 3; + UINT8 Lun : 2; + UINT8 Reserved : 2; + UINT8 LogicalFruDevice : 1; + UINT8 Reserved3 : 4; + UINT8 ChannelNumber : 4; +} FRU_DATA_INFO; +#pragma pack() + +typedef enum { + Unicode, + BcdPlus, + Ascii6BitPacked, + AsciiLatin1 +} SENSOR_ID_STRING_TYPE; + +// +// SENSOR Structures +// +typedef struct { + BOOLEAN Valid; // Data is Valid + SENSOR_CONVERSION_DATA ConversionParam; // Conversion Parameters + UINT8 UpperNonRec; // Upper Non Recoverable + UINT8 UpperCritical; // Upper Critical + UINT8 UpperNonCritical; // Upper Non Critical + UINT8 LowerNonRec; // Lower Non Recoverable + UINT8 LowerCritical; // Lower Critical + UINT8 LowerNonCritical; // Lower Non Critical +} SENSOR_THRESHOLD_STRUCT; + +typedef struct { + BOOLEAN Valid; // Structure Valid + SENSOR_CONVERSION_DATA ConversionParam; // Conversion Parameters + SENSOR_ID_STRING_TYPE SensorIdStringType; // Sensor ID String type + UINT8 NominalReading; // Nominal Reading of th= e Sensor + UINT8 SensorId[16]; // Sensor Description +} SENSOR_READING_STRUCT; + +// +// IPMI HOB +// +typedef struct { + UINT16 IoBasePort; +} IPMI_HOB_DATA; + +// +// COM Layer Callback +// +typedef +EFI_STATUS +(EFIAPI *SM_CALLBACK_PROC) ( + OUT EFI_STATUS Status, + IN VOID *UserContext + ); + +typedef struct { + SM_CALLBACK_PROC SmCallback; + VOID *UserContext; +} SM_CALLBACK; + +#endif // _SERVER_MANAGEMENT_H_ + diff --git a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Include/SmSt= atusCodes.h b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Include/SmS= tatusCodes.h new file mode 100644 index 0000000000..08cd3b21b9 --- /dev/null +++ b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Include/SmStatusCod= es.h @@ -0,0 +1,98 @@ +/** @file + Efi Server Management Status Code Header File. + + @copyright + Copyright 2011 - 2021 Intel Corporation.
+ SPDX-License-Identifier: BSD-2-Clause-Patent +**/ + +#ifndef _SM_STATUS_CODE_H_ +#define _SM_STATUS_CODE_H_ + +// +// Computing Unit Host Processor Subclass Error Code definitions. +// +#define CU_HP_EC_MISMATCH_STEPPING (EFI_SUBCLASS_SPECIFIC | 0= x0000000E) +#define CU_HP_EC_MISMATCH_FAMILY (EFI_SUBCLASS_SPECIFIC | 0= x0000000F) +#define CU_HP_EC_MISMATCH_MODEL (EFI_SUBCLASS_SPECIFIC | 0= x00000010) +#define CU_HP_EC_MISMATCH_FSB (EFI_SUBCLASS_SPECIFIC | 0= x00000011) +#define CU_HP_EC_MISMATCH_SPEED (EFI_SUBCLASS_SPECIFIC | 0= x00000012) +#define CU_HP_EC_UNSUPPORTED_PROCESSOR_FAMILY (EFI_SUBCLASS_SPECIFIC | 0= x00000013) +#define CU_HP_EC_MISMATCH_CACHE_SIZE (EFI_SUBCLASS_SPECIFIC | 0= x00000014) +#define CU_HP_EC_UNSUPPORTED_CHIPSET (EFI_SUBCLASS_SPECIFIC | 0= x00000015) +#define CU_HP_EC_MISMATCH_VOLTAGE (EFI_SUBCLASS_SPECIFIC | 0= x00000016) + +// +// Computing Unit Firmware Processor Subclass Error Code definitions. +// +#define CU_FP_EC_FRB2_WATCHDOG_TIMEOUT (EFI_SUBCLASS_SPECIFIC | 0= x00000003) +#define CU_FP_EC_OS_WATCHDOG_TIMEOUT (EFI_SUBCLASS_SPECIFIC | 0= x00000004) +#define CU_FP_EC_SDR_EMPTY (EFI_SUBCLASS_SPECIFIC | 0= x00000005) +#define CU_FP_EC_FORCE_UPDATE_MODE (EFI_SUBCLASS_SPECIFIC | 0= x00000006) +#define CU_FP_EC_FW_MISMATCH (EFI_SUBCLASS_SPECIFIC | 0= x00000007) + +// +// Computing Unit Memory Subclass Error Code definitions. +// +#define CU_MEMORY_EC_FAILED (EFI_SUBCLASS_SPECIFIC | 0= x0000000B) +#define CU_MEMORY_EC_UNSUPPORTED (EFI_SUBCLASS_SPECIFIC | 0= x0000000C) +#define CU_MEMORY_EC_CLTT_FAILED (EFI_SUBCLASS_SPECIFIC | 0= x0000000D) +#define CU_MEMORY_EC_DCPMM_INV_POP (EFI_SUBCLASS_SPECIFIC | 0= x0000000E) + +// +// Peripheral Class Error Code definitions. +// +#define P_EC_FW_CORRUPTED 0x0000000A +#define P_EC_RESOURCE_CONSUMED_BY_BMC 0x0000000B + +// +// IO Bus Subclass definitions. +// +#define IO_BUS_PCI_EXPRESS (IO_BUS | 0x000D0000) + +// +// IO Bus Class PCI Subclass Error Code definitions. +// +#define IOB_PCI_EC_OUT_OF_RESOURCES (EFI_SUBCLASS_SPECIFIC | 0= x00000002) + +// +// IO Bus Class PCI EXPRESS Subclass Error Code definitions. +// +#define IOB_PCI_EXP_EC_PERR (EFI_SUBCLASS_SPECIFIC | 0= x00000000) +#define IOB_PCI_EXP_EC_SERR (EFI_SUBCLASS_SPECIFIC | 0= x00000001) +#define IOB_PCI_EXP_EC_TRAINING_FAILED (EFI_SUBCLASS_SPECIFIC | 0= x00000002) +#define IOB_PCI_EXP_EC_DEGRADED_LINK (EFI_SUBCLASS_SPECIFIC | 0= x00000003) +#define IOB_PCI_EXP_EC_IBIST_FAILED (EFI_SUBCLASS_SPECIFIC | 0= x00000004) + +// +// Software Subclass definitions. +// +#define SOFTWARE_SYSTEM_ERROR (EFI_SOFTWARE | 0x00130000) +#define SYSTEM_FRONT_PANEL (EFI_SOFTWARE | 0x00140000) +#define SOFTWARE_EFI_BMC (EFI_SOFTWARE | 0x00150000) + +// +// Software Class DXE BS Driver Subclass Progress Code definitions. +// +#define SW_DXE_BS_END_OF_POST (EFI_SUBCLASS_SPECIFIC | 0= x00000007) + +// +// Software Class Error Code definitions. +// +#define SW_EC_PWD_CLEAR_JMPR_SET 0x00000012 + +// +// Software Class PEI Module Subclass Error Code definitions. +// +#define SW_PEIM_WATCHDOG_TIMEOUT (EFI_SUBCLASS_SPECIFIC | 0= x00000002) +#define SW_PEIM_OS_WATCHDOG_TIMEOUT (EFI_SUBCLASS_SPECIFIC | 0= x00000003) + +// +// Software Class System Subclass Error Code definitions. +// +#define SW_EC_CMOS_DATE_TIME_ERROR (EFI_SUBCLASS_SPECIFIC | 0= x00000000) +#define SW_EC_BACKUP_BIOS_FLASH_ERROR (EFI_SUBCLASS_SPECIFIC | 0= x00000001) + + +#endif // _SM_STATUS_CODE_H_ + --=20 2.27.0.windows.1 -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#72306): https://edk2.groups.io/g/devel/message/72306 Mute This Topic: https://groups.io/mt/81016647/1787277 Group Owner: devel+owner@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [importer@patchew.org] -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D- From nobody Thu May 16 03:18:39 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of groups.io designates 66.175.222.108 as permitted sender) client-ip=66.175.222.108; envelope-from=bounce+27952+72310+1787277+3901457@groups.io; helo=mail02.groups.io; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of groups.io designates 66.175.222.108 as permitted sender) smtp.mailfrom=bounce+27952+72310+1787277+3901457@groups.io; dmarc=fail(p=none dis=none) header.from=intel.com ARC-Seal: i=1; a=rsa-sha256; t=1614652151; cv=none; d=zohomail.com; s=zohoarc; b=clIeQfzNVYSF/JjEe3aRE8zWwZJ7Xuu7lfu2Xe8r87wJL/fM5e5NrVMrWXNidAKHNzRTyUHmX3LFGcUTvAa23hXdJYrjUDxVlreP7qYaLtt0nBmViTya+ZP6teotMntEawnaE/dLnJ9HE21qtLzb54vRrHdJbD9+ll2oG+35IBo= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1614652151; h=Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Id:List-Unsubscribe:MIME-Version:Message-ID:Reply-To:References:Sender:Subject:To; bh=4fXlw1pdGDLzjgNCimqEe5GAe3h+w3bwFGr7gK56XKs=; b=hMWCE0OIKnPO4O1QyWeT/tukuPEjFQ6H3t1W/PTZ2RIt6LBhHUKpn3zqvz0e+aUE8qw5pocuDt/fPqG8KBlKBmZZ/FSYJ7+NO0v7xeo+Vp3LSAWiDcaTf64SWG7oizNqTr7SYLJ94eCh+2eJNvoqtgk7QyjlGqn/j11ylVabZYI= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of groups.io designates 66.175.222.108 as permitted sender) smtp.mailfrom=bounce+27952+72310+1787277+3901457@groups.io; dmarc=fail header.from= (p=none dis=none) header.from= Received: from mail02.groups.io (mail02.groups.io [66.175.222.108]) by mx.zohomail.com with SMTPS id 161465215140937.84654797404232; Mon, 1 Mar 2021 18:29:11 -0800 (PST) Return-Path: X-Received: by 127.0.0.2 with SMTP id ikDNYY1788612xiY7ttjLMfA; Mon, 01 Mar 2021 18:29:11 -0800 X-Received: from mga02.intel.com (mga02.intel.com [134.134.136.20]) by mx.groups.io with SMTP id smtpd.web12.3173.1614652144809506276 for ; Mon, 01 Mar 2021 18:29:04 -0800 IronPort-SDR: fRvrtIxph1dFeSOp1gP8xw00I3oMt+8Ou5bFTOt6hrwi9KizPRxgxPU9Z3ExYadzkOvPS8qXbQ boa5LscSz8OA== X-IronPort-AV: E=McAfee;i="6000,8403,9910"; a="173797231" X-IronPort-AV: E=Sophos;i="5.81,216,1610438400"; d="scan'208";a="173797231" X-Received: from fmsmga004.fm.intel.com ([10.253.24.48]) by orsmga101.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 01 Mar 2021 18:29:01 -0800 IronPort-SDR: wNC2gLFCPliCtPQbTbQ4BNAOwleskwi6D6Mssz51T5MLCvAJUgjBm2WFJufdDtq9AZstSz4Nid bHxS8QJlwP6Q== X-IronPort-AV: E=Sophos;i="5.81,216,1610438400"; d="scan'208";a="427169859" X-Received: from nldesimo-desk1.amr.corp.intel.com ([10.212.174.59]) by fmsmga004-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 01 Mar 2021 18:29:01 -0800 From: "Nate DeSimone" To: devel@edk2.groups.io Cc: Isaac Oram , Sai Chaganty , Liming Gao , Michael Kubacki Subject: [edk2-devel] [edk2-platforms] [PATCH v1 2/9] IpmiFeaturePkg: Add IpmiBaseLib and IpmiCommandLib Date: Mon, 1 Mar 2021 18:27:57 -0800 Message-Id: <20210302022804.8641-3-nathaniel.l.desimone@intel.com> In-Reply-To: <20210302022804.8641-1-nathaniel.l.desimone@intel.com> References: <20210302022804.8641-1-nathaniel.l.desimone@intel.com> MIME-Version: 1.0 Precedence: Bulk List-Unsubscribe: Sender: devel@edk2.groups.io List-Id: Mailing-List: list devel@edk2.groups.io; contact devel+owner@edk2.groups.io Reply-To: devel@edk2.groups.io,nathaniel.l.desimone@intel.com X-Gm-Message-State: HT9hFo0NM2eOCdVHj19k8MxFx1787277AA= Content-Transfer-Encoding: quoted-printable DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=groups.io; q=dns/txt; s=20140610; t=1614652151; bh=pzjjohq1s/8YbbnBl+sXIqZDg5oj2od1d3nmeCKSZzg=; h=Cc:Date:From:Reply-To:Subject:To; b=sAQy4cLKtrj65WoFjNCyy221TXbdgx9Dzxm94CViILa3y/UCkxiEDkyN0D+LnnkTyDh u0EJPXlfVbLC6ZhXrdSglZDZhHZq8MPMrSv8XR6dw18JczdIK70Kwv1J3StE9gMhqs4CH ipYSwBXr4I3ck6r0aStrQpTifKZiMplepP0= X-ZohoMail-DKIM: pass (identity @groups.io) Content-Type: text/plain; charset="utf-8" From: Isaac Oram REF: https://bugzilla.tianocore.org/show_bug.cgi?id=3D3242 Adds IpmiBaseLib and adds new commands to IpmiCommandLib Cc: Sai Chaganty Cc: Liming Gao Cc: Michael Kubacki Signed-off-by: Isaac Oram Co-authored-by: Nate DeSimone Acked-by: Michael Kubacki Reviewed-by: Sai Chaganty --- .../Library/IpmiBaseLib/IpmiBaseLib.c | 155 +++++++++++++++ .../Library/IpmiBaseLib/IpmiBaseLib.inf | 28 +++ .../Library/IpmiBaseLibNull/IpmiBaseLibNull.c | 76 ++++++++ .../IpmiBaseLibNull/IpmiBaseLibNull.inf | 36 ++++ .../Library/IpmiCommandLib/IpmiCommandLib.inf | 4 +- .../IpmiCommandLib/IpmiCommandLibNetFnApp.c | 7 +- .../IpmiCommandLibNetFnChassis.c | 51 ++++- .../IpmiCommandLibNetFnStorage.c | 7 +- .../IpmiCommandLibNetFnTransport.c | 7 +- .../Library/PeiIpmiBaseLib/PeiIpmiBaseLib.c | 111 +++++++++++ .../Library/PeiIpmiBaseLib/PeiIpmiBaseLib.inf | 30 +++ .../Library/SmmIpmiBaseLib/SmmIpmiBaseLib.c | 180 ++++++++++++++++++ .../Library/SmmIpmiBaseLib/SmmIpmiBaseLib.inf | 29 +++ 13 files changed, 703 insertions(+), 18 deletions(-) create mode 100644 Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Libra= ry/IpmiBaseLib/IpmiBaseLib.c create mode 100644 Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Libra= ry/IpmiBaseLib/IpmiBaseLib.inf create mode 100644 Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Libra= ry/IpmiBaseLibNull/IpmiBaseLibNull.c create mode 100644 Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Libra= ry/IpmiBaseLibNull/IpmiBaseLibNull.inf create mode 100644 Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Libra= ry/PeiIpmiBaseLib/PeiIpmiBaseLib.c create mode 100644 Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Libra= ry/PeiIpmiBaseLib/PeiIpmiBaseLib.inf create mode 100644 Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Libra= ry/SmmIpmiBaseLib/SmmIpmiBaseLib.c create mode 100644 Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Libra= ry/SmmIpmiBaseLib/SmmIpmiBaseLib.inf diff --git a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Library/Ipmi= BaseLib/IpmiBaseLib.c b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/L= ibrary/IpmiBaseLib/IpmiBaseLib.c new file mode 100644 index 0000000000..6b2e0a9e1e --- /dev/null +++ b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Library/IpmiBaseLib= /IpmiBaseLib.c @@ -0,0 +1,155 @@ +/** @file + A Library to support all BMC access via IPMI command during Dxe Phase. + + @copyright + Copyright 1999 - 2021 Intel Corporation.
+ SPDX-License-Identifier: BSD-2-Clause-Patent +**/ + +#include +#include +#include +#include + +STATIC IPMI_TRANSPORT *mIpmiTransport =3D NULL; +VOID *mEfiIpmiProtocolNotifyReg; +EFI_EVENT mEfiIpmiProtocolEvent; + +/** + Callback function for locating the IpmiTransport protocol. + @param[in] Event Event on which the callback is called. + @param[in] Context The context of the Callback. + + @retval EFI_SUCCESS Return from EfiLocateProtocolInterface function. + @retval Other Failure. + +**/ +EFI_STATUS +NotifyIpmiTransportCallback ( + IN EFI_EVENT Event, + IN VOID *Context + ) +{ + EFI_STATUS Status; + + Status =3D EFI_SUCCESS; + if (mIpmiTransport =3D=3D NULL) { + Status =3D gBS->LocateProtocol ( + &gIpmiTransportProtocolGuid, + NULL, + (VOID **) &mIpmiTransport + ); + } + + return Status; +} + +/** + Initialize the global varible with the pointer of IpmiTransport Protocol. + + @retval EFI_SUCCESS Always return success. + +**/ +EFI_STATUS +InitializeIpmiBase ( + VOID + ) +{ + EFI_STATUS Status; + + if (mIpmiTransport =3D=3D NULL) { + Status =3D gBS->CreateEvent (EVT_NOTIFY_SIGNAL, TPL_CALLBACK, (EFI_EVE= NT_NOTIFY) NotifyIpmiTransportCallback, NULL, &mEfiIpmiProtocolEvent); + ASSERT_EFI_ERROR (Status); + if (Status !=3D EFI_SUCCESS) { + return Status; + } + + Status =3D gBS->RegisterProtocolNotify (&gIpmiTransportProtocolGuid, m= EfiIpmiProtocolEvent, &mEfiIpmiProtocolNotifyReg); + ASSERT_EFI_ERROR (Status); + if (Status !=3D EFI_SUCCESS) { + return Status; + } + + gBS->SignalEvent (mEfiIpmiProtocolEvent); + } + + return EFI_SUCCESS; +} + +/** + Routine to send commands to BMC. + @param[in] NetFunction Net function of the command + @param[in] Command IPMI Command + @param[in] CommandData Command Data + @param[in] CommandDataSize Size of CommandData + @param[out] ResponseData Response Data + @param[in, out] ResponseDataSize Response Data Size + + @retval EFI_SUCCESS Return Successly. + @retval EFI_NOT_AVAILABLE_YET IpmiTransport Protocol is not installed y= et + @retval Other Failure. + +**/ +EFI_STATUS +IpmiSubmitCommand ( + IN UINT8 NetFunction, + IN UINT8 Command, + IN UINT8 *CommandData, + IN UINT32 CommandDataSize, + OUT UINT8 *ResponseData, + IN OUT UINT32 *ResponseDataSize + ) +{ + EFI_STATUS Status; + + Status =3D gBS->LocateProtocol (&gIpmiTransportProtocolGuid, NULL, (VOID= **) &mIpmiTransport); + if (EFI_ERROR (Status)) { + ASSERT_EFI_ERROR (Status); + return Status; + } + + Status =3D mIpmiTransport->IpmiSubmitCommand ( + mIpmiTransport, + NetFunction, + 0, + Command, + CommandData, + CommandDataSize, + ResponseData, + ResponseDataSize + ); + return Status; +} + +/** + Routine to send commands to BMC. + @param[out] BmcStatus A pointer to the BMC_STATUS. + @param[out] ComAddress Pointer to the SM_COM_ADDRESS. + + @retval EFI_SUCCESS Restart Successly. + @retval EFI_NOT_AVAILABLE_YET IpmiTransport Protocol is not installed y= et. + @retval Other Failure. + +**/ +EFI_STATUS +IpmiGetBmcStatus ( + OUT BMC_STATUS *BmcStatus, + OUT SM_COM_ADDRESS *ComAddress + ) +{ + EFI_STATUS Status; + + Status =3D gBS->LocateProtocol (&gIpmiTransportProtocolGuid, NULL, (VOID= **) &mIpmiTransport); + if (EFI_ERROR (Status)) { + ASSERT_EFI_ERROR (Status); + return Status; + } + + Status =3D mIpmiTransport->GetBmcStatus ( + mIpmiTransport, + BmcStatus, + ComAddress + ); + return Status; +} + diff --git a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Library/Ipmi= BaseLib/IpmiBaseLib.inf b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg= /Library/IpmiBaseLib/IpmiBaseLib.inf new file mode 100644 index 0000000000..b429d3b7b9 --- /dev/null +++ b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Library/IpmiBaseLib= /IpmiBaseLib.inf @@ -0,0 +1,28 @@ +## @file +# +# @copyright +# Copyright 2010 - 2021 Intel Corporation.
+# SPDX-License-Identifier: BSD-2-Clause-Patent +## + +[Defines] + INF_VERSION =3D 0x00010005 + BASE_NAME =3D IpmiBaseLib + FILE_GUID =3D 2B5AD78E-5CF8-45d2-B2AC-749A09425911 + MODULE_TYPE =3D UEFI_DRIVER + VERSION_STRING =3D 1.0 + LIBRARY_CLASS =3D IpmiBaseLib|DXE_RUNTIME_DRIVER DXE_DR= IVER UEFI_APPLICATION UEFI_DRIVER + +[sources] + IpmiBaseLib.c + +[Packages] + MdePkg/MdePkg.dec + OutOfBandManagement/IpmiFeaturePkg/IpmiFeaturePkg.dec + +[LibraryClasses] + UefiBootServicesTableLib + DebugLib + +[Protocols] + gIpmiTransportProtocolGuid diff --git a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Library/Ipmi= BaseLibNull/IpmiBaseLibNull.c b/Features/Intel/OutOfBandManagement/IpmiFeat= urePkg/Library/IpmiBaseLibNull/IpmiBaseLibNull.c new file mode 100644 index 0000000000..7c4c67f6ac --- /dev/null +++ b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Library/IpmiBaseLib= Null/IpmiBaseLibNull.c @@ -0,0 +1,76 @@ +/** @file + A Null Library to support all BMC access via IPMI command. + + @copyright + Copyright 2011 - 2021 Intel Corporation.
+ SPDX-License-Identifier: BSD-2-Clause-Patent +**/ + +#include +#include +#include +#include +#include +#include + +/** + + Initialize the global varible with the pointer of IpmiTransport Protocol + + @retval EFI_SUCCESS Always return success. + +**/ +EFI_STATUS +InitializeIpmiBase ( + VOID + ) +{ + return EFI_SUCCESS; +} + +/** + Routine to send commands to BMC. + @param [in] NetFunction Net function of the command + @param [in] Command IPMI Command + @param [in] CommandData Command Data + @param [in] CommandDataSize Size of CommandData + @param [out] ResponseData Response Data + @param [out] ResponseDataSize Response Data Size + + @retval EFI_SUCCESS Restart Successly. + @retval EFI_NOT_AVAILABLE_YET IpmiTransport Protocol is not installed y= et. + @retval Other Failure. + +**/ +EFI_STATUS +IpmiSubmitCommand ( + IN UINT8 NetFunction, + IN UINT8 Command, + IN UINT8 *CommandData, + IN UINT32 CommandDataSize, + OUT UINT8 *ResponseData, + OUT UINT32 *ResponseDataSize + ) +{ + return EFI_SUCCESS; +} + +/** + Routine to send commands to BMC. + @param [out] BmcStatus A pointer to BMC_STATUS. + @param [out] ComAddress A pointer to SM_COM_ADDRESS. + + @retval EFI_SUCCESS Restart Successly. + @retval EFI_NOT_AVAILABLE_YET - IpmiTransport Protocol is not installed = yet. + @retval Other Failure. + +**/ +EFI_STATUS +GetBmcStatus ( + OUT BMC_STATUS *BmcStatus, + OUT SM_COM_ADDRESS *ComAddress + ) +{ + return EFI_SUCCESS; +} + diff --git a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Library/Ipmi= BaseLibNull/IpmiBaseLibNull.inf b/Features/Intel/OutOfBandManagement/IpmiFe= aturePkg/Library/IpmiBaseLibNull/IpmiBaseLibNull.inf new file mode 100644 index 0000000000..5478f9842b --- /dev/null +++ b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Library/IpmiBaseLib= Null/IpmiBaseLibNull.inf @@ -0,0 +1,36 @@ +## @file +# +# @copyright +# Copyright 2011 - 2021 Intel Corporation.
+# SPDX-License-Identifier: BSD-2-Clause-Patent +## + +[Defines] + INF_VERSION =3D 0x00010005 + BASE_NAME =3D IpmiBaseLibNull + FILE_GUID =3D 3444CF4F-8B88-4579-9A95-2E7678C0E945 + MODULE_TYPE =3D DXE_SMM_DRIVER + VERSION_STRING =3D 1.0 + LIBRARY_CLASS =3D IpmiBaseLib|DXE_CORE DXE_DRIVER DXE_RU= NTIME_DRIVER DXE_SMM_DRIVER UEFI_APPLICATION UEFI_DRIVER SMM_CORE + +# +# The following information is for reference only and not required by the = build tools. +# +# VALID_ARCHITECTURES =3D IA32 X64 +# + +[Sources.common] + IpmiBaseLibNull.c + +[Packages] + MdePkg/MdePkg.dec + OutOfBandManagement/IpmiFeaturePkg/IpmiFeaturePkg.dec + +[LibraryClasses] + BaseLib + UefiBootServicesTableLib + DxeServicesLib + DebugLib + +[Guids] + diff --git a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Library/Ipmi= CommandLib/IpmiCommandLib.inf b/Features/Intel/OutOfBandManagement/IpmiFeat= urePkg/Library/IpmiCommandLib/IpmiCommandLib.inf index 0bdace8688..f8e7ba5a8f 100644 --- a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Library/IpmiCommand= Lib/IpmiCommandLib.inf +++ b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Library/IpmiCommand= Lib/IpmiCommandLib.inf @@ -1,7 +1,7 @@ ### @file # Component description file for IPMI Command Library. # -# Copyright (c) 2018 - 2019, Intel Corporation. All rights reserved.
+# Copyright (c) 2018 - 2021, Intel Corporation. All rights reserved.
# # SPDX-License-Identifier: BSD-2-Clause-Patent # @@ -29,4 +29,4 @@ [LibraryClasses] BaseMemoryLib DebugLib - IpmiLib + IpmiBaseLib diff --git a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Library/Ipmi= CommandLib/IpmiCommandLibNetFnApp.c b/Features/Intel/OutOfBandManagement/Ip= miFeaturePkg/Library/IpmiCommandLib/IpmiCommandLibNetFnApp.c index b57db50610..addabc554e 100644 --- a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Library/IpmiCommand= Lib/IpmiCommandLibNetFnApp.c +++ b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Library/IpmiCommand= Lib/IpmiCommandLibNetFnApp.c @@ -1,15 +1,14 @@ /** @file IPMI Command - NetFnApp. =20 -Copyright (c) 2018, Intel Corporation. All rights reserved.
-SPDX-License-Identifier: BSD-2-Clause-Patent - + Copyright (c) 2018 - 2021, Intel Corporation. All rights reserved.
+ SPDX-License-Identifier: BSD-2-Clause-Patent **/ =20 #include #include #include -#include +#include =20 #include =20 diff --git a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Library/Ipmi= CommandLib/IpmiCommandLibNetFnChassis.c b/Features/Intel/OutOfBandManagemen= t/IpmiFeaturePkg/Library/IpmiCommandLib/IpmiCommandLibNetFnChassis.c index 1b86aa888e..9c19f52ce4 100644 --- a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Library/IpmiCommand= Lib/IpmiCommandLibNetFnChassis.c +++ b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Library/IpmiCommand= Lib/IpmiCommandLibNetFnChassis.c @@ -1,15 +1,14 @@ /** @file IPMI Command - NetFnChassis. =20 -Copyright (c) 2018, Intel Corporation. All rights reserved.
-SPDX-License-Identifier: BSD-2-Clause-Patent - + Copyright (c) 2018 - 2021, Intel Corporation. All rights reserved.
+ SPDX-License-Identifier: BSD-2-Clause-Patent **/ =20 #include #include #include -#include +#include =20 #include =20 @@ -99,3 +98,47 @@ IpmiSetPowerRestorePolicy ( ); return Status; } + +EFI_STATUS +EFIAPI +IpmiSetSystemBootOptions ( + IN IPMI_SET_BOOT_OPTIONS_REQUEST *BootOptionsRequest, + OUT IPMI_SET_BOOT_OPTIONS_RESPONSE *BootOptionsResponse + ) +{ + EFI_STATUS Status; + UINT32 DataSize; + + DataSize =3D sizeof(*BootOptionsResponse); + Status =3D IpmiSubmitCommand ( + IPMI_NETFN_CHASSIS, + IPMI_CHASSIS_SET_SYSTEM_BOOT_OPTIONS, + (VOID *)BootOptionsRequest, + sizeof(*BootOptionsRequest), + (VOID *)BootOptionsResponse, + &DataSize + ); + return Status; +} + +EFI_STATUS +EFIAPI +IpmiGetSystemBootOptions ( + IN IPMI_GET_BOOT_OPTIONS_REQUEST *BootOptionsRequest, + OUT IPMI_GET_BOOT_OPTIONS_RESPONSE *BootOptionsResponse + ) +{ + EFI_STATUS Status; + UINT32 DataSize; + + DataSize =3D sizeof(*BootOptionsResponse); + Status =3D IpmiSubmitCommand ( + IPMI_NETFN_CHASSIS, + IPMI_CHASSIS_GET_SYSTEM_BOOT_OPTIONS, + (VOID *)BootOptionsRequest, + sizeof(*BootOptionsRequest), + (VOID *)BootOptionsResponse, + &DataSize + ); + return Status; +} diff --git a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Library/Ipmi= CommandLib/IpmiCommandLibNetFnStorage.c b/Features/Intel/OutOfBandManagemen= t/IpmiFeaturePkg/Library/IpmiCommandLib/IpmiCommandLibNetFnStorage.c index 8e892c5f84..2215028089 100644 --- a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Library/IpmiCommand= Lib/IpmiCommandLibNetFnStorage.c +++ b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Library/IpmiCommand= Lib/IpmiCommandLibNetFnStorage.c @@ -1,15 +1,14 @@ /** @file IPMI Command - NetFnStorage. =20 -Copyright (c) 2018, Intel Corporation. All rights reserved.
-SPDX-License-Identifier: BSD-2-Clause-Patent - + Copyright (c) 2018 - 2021, Intel Corporation. All rights reserved.
+ SPDX-License-Identifier: BSD-2-Clause-Patent **/ =20 #include #include #include -#include +#include =20 #include =20 diff --git a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Library/Ipmi= CommandLib/IpmiCommandLibNetFnTransport.c b/Features/Intel/OutOfBandManagem= ent/IpmiFeaturePkg/Library/IpmiCommandLib/IpmiCommandLibNetFnTransport.c index 3b9b17b909..7dfcf86126 100644 --- a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Library/IpmiCommand= Lib/IpmiCommandLibNetFnTransport.c +++ b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Library/IpmiCommand= Lib/IpmiCommandLibNetFnTransport.c @@ -1,15 +1,14 @@ /** @file IPMI Command - NetFnTransport. =20 -Copyright (c) 2018, Intel Corporation. All rights reserved.
-SPDX-License-Identifier: BSD-2-Clause-Patent - + Copyright (c) 2018 - 2021, Intel Corporation. All rights reserved.
+ SPDX-License-Identifier: BSD-2-Clause-Patent **/ =20 #include #include #include -#include +#include =20 #include =20 diff --git a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Library/PeiI= pmiBaseLib/PeiIpmiBaseLib.c b/Features/Intel/OutOfBandManagement/IpmiFeatur= ePkg/Library/PeiIpmiBaseLib/PeiIpmiBaseLib.c new file mode 100644 index 0000000000..8679cd95db --- /dev/null +++ b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Library/PeiIpmiBase= Lib/PeiIpmiBaseLib.c @@ -0,0 +1,111 @@ +/** @file + A Library to support all BMC access via IPMI command during PEI Phase. + + @copyright + Copyright 2017 - 2021 Intel Corporation.
+ SPDX-License-Identifier: BSD-2-Clause-Patent +**/ + +#include +#include +#include +#include +#include + + +/** + Initialize the global varible with the pointer of IpmiTransport Protocol. + + @return EFI_SUCCESS - Always return success + +**/ +EFI_STATUS +InitializeIpmiBase ( + VOID + ) +{ + EFI_STATUS Status; + PEI_IPMI_TRANSPORT_PPI *IpmiTransport; + + Status =3D PeiServicesLocatePpi (&gPeiIpmiTransportPpiGuid, 0, NULL, (VO= ID **) &IpmiTransport); + if (EFI_ERROR (Status)) { + ASSERT_EFI_ERROR (Status); + } + return Status; +} + +/** + Routine to send commands to BMC. + + @param NetFunction - Net function of the command + @param Command - IPMI Command + @param CommandData - Command Data + @param CommandDataSize - Size of CommandData + @param ResponseData - Response Data + @param ResponseDataSize - Response Data Size + + @return EFI_NOT_AVAILABLE_YET - IpmiTransport Protocol is not installed = yet + +**/ +EFI_STATUS +IpmiSubmitCommand ( + IN UINT8 NetFunction, + IN UINT8 Command, + IN UINT8 *CommandData, + IN UINT32 CommandDataSize, + OUT UINT8 *ResponseData, + IN OUT UINT32 *ResponseDataSize + ) +{ + EFI_STATUS Status; + PEI_IPMI_TRANSPORT_PPI *IpmiTransport; + + Status =3D PeiServicesLocatePpi (&gPeiIpmiTransportPpiGuid, 0, NULL, (VO= ID **) &IpmiTransport); + if (EFI_ERROR (Status)) { + ASSERT_EFI_ERROR (Status); + return Status; + } + Status =3D IpmiTransport->IpmiSubmitCommand ( + IpmiTransport, + NetFunction, + 0, + Command, + CommandData, + CommandDataSize, + ResponseData, + ResponseDataSize + ); + return Status; +} + +/** + Routine to send commands to BMC. + + @param BmcStatus - Ststus of Bmc + @param ComAddress - IPMI Address + + @return EFI_NOT_AVAILABLE_YET - IpmiTransport Protocol is not installed = yet + +**/ +EFI_STATUS +GetBmcStatus ( + OUT BMC_STATUS *BmcStatus, + OUT SM_COM_ADDRESS *ComAddress + ) +{ + EFI_STATUS Status; + PEI_IPMI_TRANSPORT_PPI *IpmiTransport; + + Status =3D PeiServicesLocatePpi (&gPeiIpmiTransportPpiGuid, 0, NULL, (VO= ID **) &IpmiTransport); + if (EFI_ERROR (Status)) { + ASSERT_EFI_ERROR (Status); + return Status; + } + Status =3D IpmiTransport->GetBmcStatus ( + IpmiTransport, + BmcStatus, + ComAddress + ); + return Status; +} + diff --git a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Library/PeiI= pmiBaseLib/PeiIpmiBaseLib.inf b/Features/Intel/OutOfBandManagement/IpmiFeat= urePkg/Library/PeiIpmiBaseLib/PeiIpmiBaseLib.inf new file mode 100644 index 0000000000..f89614adfb --- /dev/null +++ b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Library/PeiIpmiBase= Lib/PeiIpmiBaseLib.inf @@ -0,0 +1,30 @@ +## @file +# +# @copyright +# Copyright 2014 - 2021 Intel Corporation.
+# SPDX-License-Identifier: BSD-2-Clause-Patent +## + +[Defines] + INF_VERSION =3D 0x00010005 + BASE_NAME =3D PeiIpmiBaseLib + FILE_GUID =3D 616A8628-9A5C-4d19-9C62-3874C5E6F4A6 + MODULE_TYPE =3D PEIM + VERSION_STRING =3D 1.0 + LIBRARY_CLASS =3D IpmiBaseLib|PEIM PEI_CORE + +[sources] + PeiIpmiBaseLib.c + +[Packages] + MdePkg/MdePkg.dec + OutOfBandManagement/IpmiFeaturePkg/IpmiFeaturePkg.dec + +[LibraryClasses] + DebugLib + BaseMemoryLib + PeiServicesLib + + +[Ppis] + gPeiIpmiTransportPpiGuid diff --git a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Library/SmmI= pmiBaseLib/SmmIpmiBaseLib.c b/Features/Intel/OutOfBandManagement/IpmiFeatur= ePkg/Library/SmmIpmiBaseLib/SmmIpmiBaseLib.c new file mode 100644 index 0000000000..6282adc269 --- /dev/null +++ b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Library/SmmIpmiBase= Lib/SmmIpmiBaseLib.c @@ -0,0 +1,180 @@ +/** @file + A Library to support all BMC access via IPMI command during SMM Phase. + + @copyright + Copyright 1999 - 2021 Intel Corporation.
+ SPDX-License-Identifier: BSD-2-Clause-Patent +**/ + +#include +#include +#include +#include +#include +#include + +STATIC IPMI_TRANSPORT *mIpmiTransport =3D NULL; +VOID *mEfiIpmiProtocolNotifyReg =3D NULL; +EFI_EVENT mEfiIpmiProtocolEvent; + +/** + Callback function for locating the IpmiTransport protocol. + + @param Protocol A pointer to EFI_GUID + @param Interface A pointer to Interface + @param Handle Handle + + @retval EFI_SUCCESS: Callback successfully + +**/ +EFI_STATUS +NotifyIpmiTransportCallback ( + IN CONST EFI_GUID *Protocol, + IN VOID *Interface, + IN EFI_HANDLE Handle + ) +{ + EFI_STATUS Status; + Status =3D EFI_SUCCESS; + if (mIpmiTransport =3D=3D NULL) { + Status =3D gSmst->SmmLocateProtocol ( + &gSmmIpmiTransportProtocolGuid, + NULL, + (VOID **) &mIpmiTransport + ); + } + + return Status; +} + +/** + Routine to send commands to BMC. + + @retval EFI_SUCCESS: Always return success + +**/ +EFI_STATUS +InitializeIpmiBase ( + VOID + ) +{ + EFI_STATUS Status; + if (mIpmiTransport =3D=3D NULL) { + Status =3D gSmst->SmmLocateProtocol ( + &gSmmIpmiTransportProtocolGuid, + NULL, + (VOID **) &mIpmiTransport + ); + if (EFI_ERROR (Status)) { + Status =3D gSmst->SmmRegisterProtocolNotify ( + &gSmmIpmiTransportProtocolGuid, + (EFI_SMM_NOTIFY_FN) NotifyIpmiTransportCallback, + &mEfiIpmiProtocolNotifyReg + ); + } + ASSERT_EFI_ERROR (Status); + if (Status !=3D EFI_SUCCESS) { + return Status; + } + } + + return EFI_SUCCESS; +} + +/** + Routine to send commands to BMC. + + @param NetFunction - Net function of the command + @param Command - IPMI Command + @param CommandData - Command Data + @param CommandDataSize - Size of CommandData + @param ResponseData - Response Data + @param ResponseDataSize - Response Data Size + + @retval EFI_SUCCESS: Get successfully + @retval EFI_NOT_AVAILABLE_YET + +**/ +EFI_STATUS +IpmiSubmitCommand ( + IN UINT8 NetFunction, + IN UINT8 Command, + IN UINT8 *CommandData, + IN UINT32 CommandDataSize, + OUT UINT8 *ResponseData, + IN OUT UINT32 *ResponseDataSize + ) +/*++ + +Routine Description: + + Routine to send commands to BMC + +Arguments: + + NetFunction - Net function of the command + Command - IPMI Command + CommandData - Command Data + CommandDataSize - Size of CommandData + ResponseData - Response Data + ResponseDataSize - Response Data Size + +Returns: + + EFI_NOT_AVAILABLE_YET - IpmiTransport Protocol is not installed yet + +--*/ +{ + EFI_STATUS Status; + + Status =3D gSmst->SmmLocateProtocol (&gSmmIpmiTransportProtocolGuid, NUL= L, (VOID **) &mIpmiTransport); + if (EFI_ERROR (Status)) { + ASSERT_EFI_ERROR (Status); + return Status; + } + + Status =3D mIpmiTransport->IpmiSubmitCommand ( + mIpmiTransport, + NetFunction, + 0, + Command, + CommandData, + CommandDataSize, + ResponseData, + ResponseDataSize + ); + return Status; +} + +/** + Routine to send commands to BMC. + + @param BmcStatus The ConnectAllComplete EFI Event. + @param ComAddress Event context pass to create function + + @retval EFI_SUCCESS: Get successfully + @retval EFI_NOT_AVAILABLE_YET + +**/ +EFI_STATUS +GetBmcStatus ( + OUT BMC_STATUS *BmcStatus, + OUT SM_COM_ADDRESS *ComAddress + ) +{ + EFI_STATUS Status; + + Status =3D gSmst->SmmLocateProtocol (&gSmmIpmiTransportProtocolGuid, NUL= L, (VOID **) &mIpmiTransport); + if (EFI_ERROR (Status)) { + ASSERT_EFI_ERROR (Status); + return Status; + } + + Status =3D mIpmiTransport->GetBmcStatus ( + mIpmiTransport, + BmcStatus, + ComAddress + ); + return Status; +} + diff --git a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Library/SmmI= pmiBaseLib/SmmIpmiBaseLib.inf b/Features/Intel/OutOfBandManagement/IpmiFeat= urePkg/Library/SmmIpmiBaseLib/SmmIpmiBaseLib.inf new file mode 100644 index 0000000000..bb1ccf1ca2 --- /dev/null +++ b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Library/SmmIpmiBase= Lib/SmmIpmiBaseLib.inf @@ -0,0 +1,29 @@ +## @file +# +# @copyright +# Copyright 2010 - 2021 Intel Corporation.
+# SPDX-License-Identifier: BSD-2-Clause-Patent +## + +[Defines] + INF_VERSION =3D 0x00010005 + BASE_NAME =3D SmmIpmiBaseLib + FILE_GUID =3D 2B5AD78E-5CF8-45d2-B2AC-749A09425911 + MODULE_TYPE =3D DXE_SMM_DRIVER + VERSION_STRING =3D 1.0 + LIBRARY_CLASS =3D IpmiBaseLib|DXE_SMM_DRIVER SMM_CORE + +[sources] + SmmIpmiBaseLib.c + +[Packages] + MdePkg/MdePkg.dec + OutOfBandManagement/IpmiFeaturePkg/IpmiFeaturePkg.dec + +[LibraryClasses] + UefiBootServicesTableLib + DebugLib + SmmServicesTableLib + +[Protocols] + gSmmIpmiTransportProtocolGuid --=20 2.27.0.windows.1 -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#72310): https://edk2.groups.io/g/devel/message/72310 Mute This Topic: https://groups.io/mt/81016652/1787277 Group Owner: devel+owner@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [importer@patchew.org] -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D- From nobody Thu May 16 03:18:39 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of groups.io designates 66.175.222.108 as permitted sender) client-ip=66.175.222.108; envelope-from=bounce+27952+72311+1787277+3901457@groups.io; helo=mail02.groups.io; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of groups.io designates 66.175.222.108 as permitted sender) smtp.mailfrom=bounce+27952+72311+1787277+3901457@groups.io; dmarc=fail(p=none dis=none) header.from=intel.com ARC-Seal: i=1; a=rsa-sha256; t=1614652152; cv=none; d=zohomail.com; s=zohoarc; b=EH1hw1LgoFskk97b4NLh+K35+YNLX0e/hCO5T7WsoUFONHWWknumc2Ynch0ZSHZ1SiJaDM4rwz3qSL518PD02CXqDow4n744pgWmcL5iFrmFgPGuqFVO3MJ3NvHDulhHSj7SseEyCinbW1M/ocfUjEcVpZUmgfV9HkeOE69pnbE= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1614652152; h=Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Id:List-Unsubscribe:MIME-Version:Message-ID:Reply-To:References:Sender:Subject:To; bh=6x20wXl8o4xfZPrdZRV5iP7/svf8lZKYEWgYBXGSUOE=; b=n8+Exk8bJ+26Wf3XFl4tP/tzzeRHYXeNLwpojhnBCSzFjde7hFiR7aS9K+5BYiGrWIAbYnCHAIXGNXjKwxQ53RwNjOtNVBtkVq8fWtfOoBcllj6zfcMqKUK/DBF9qCUZt53dDYlZsheI6IQIxnRjVb6c87phys8GI/mBVcTlmqs= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of groups.io designates 66.175.222.108 as permitted sender) smtp.mailfrom=bounce+27952+72311+1787277+3901457@groups.io; dmarc=fail header.from= (p=none dis=none) header.from= Received: from mail02.groups.io (mail02.groups.io [66.175.222.108]) by mx.zohomail.com with SMTPS id 1614652152185490.9536220765855; Mon, 1 Mar 2021 18:29:12 -0800 (PST) Return-Path: X-Received: by 127.0.0.2 with SMTP id gkbNYY1788612xDsdjkOhyI4; Mon, 01 Mar 2021 18:29:11 -0800 X-Received: from mga02.intel.com (mga02.intel.com []) by mx.groups.io with SMTP id smtpd.web11.3132.1614652142744425290 for ; Mon, 01 Mar 2021 18:29:05 -0800 IronPort-SDR: vd8tfvWddyg1OkDepMiH9diLeIwzfTBN9MMYeXNVl+QZwS83MEvKmWc22pdsQoLDmKQCfWlGXi DMWmOuuB9uoA== X-IronPort-AV: E=McAfee;i="6000,8403,9910"; a="173797232" X-IronPort-AV: E=Sophos;i="5.81,216,1610438400"; d="scan'208";a="173797232" X-Received: from fmsmga004.fm.intel.com ([10.253.24.48]) by orsmga101.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 01 Mar 2021 18:29:02 -0800 IronPort-SDR: cH0tz0yYnfKNeQsSguBaeajE6mKhizAQ9NUmYTi1xGdyJs122nSTDxavNuXhbnk+8Y+Bo+s9lc TxzBZeazvwwg== X-IronPort-AV: E=Sophos;i="5.81,216,1610438400"; d="scan'208";a="427169864" X-Received: from nldesimo-desk1.amr.corp.intel.com ([10.212.174.59]) by fmsmga004-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 01 Mar 2021 18:29:01 -0800 From: "Nate DeSimone" To: devel@edk2.groups.io Cc: Isaac Oram , Sai Chaganty , Liming Gao , Michael Kubacki Subject: [edk2-devel] [edk2-platforms] [PATCH v1 3/9] IpmiFeaturePkg: Add IpmiInit driver DEPEXs Date: Mon, 1 Mar 2021 18:27:58 -0800 Message-Id: <20210302022804.8641-4-nathaniel.l.desimone@intel.com> In-Reply-To: <20210302022804.8641-1-nathaniel.l.desimone@intel.com> References: <20210302022804.8641-1-nathaniel.l.desimone@intel.com> MIME-Version: 1.0 Precedence: Bulk List-Unsubscribe: Sender: devel@edk2.groups.io List-Id: Mailing-List: list devel@edk2.groups.io; contact devel+owner@edk2.groups.io Reply-To: devel@edk2.groups.io,nathaniel.l.desimone@intel.com X-Gm-Message-State: uwJ1TbGfFTmDgF3DqpxcCrH6x1787277AA= Content-Transfer-Encoding: quoted-printable DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=groups.io; q=dns/txt; s=20140610; t=1614652151; bh=lQ0weQejt8h/l25yIHw8nKnBUD8XQtpJlzSvZLNiuy8=; h=Cc:Date:From:Reply-To:Subject:To; b=d4JnGXJzjOseVMLIoY2BvY1lymadj6gNam+rMWfTIzuqyR17cSHV0fHvbG3yEEECD7N y4+dv5lBLRwpKMZjva2Q7F0MjIXuMmzLnS+QRikAV9mKJOvUNfWsPU+ylEiP3RJZwFoRr 6TxqaykGzWQ9P3Ei3rWna7wxwcXEHnEykMg= X-ZohoMail-DKIM: pass (identity @groups.io) Content-Type: text/plain; charset="utf-8" From: Isaac Oram REF: https://bugzilla.tianocore.org/show_bug.cgi?id=3D3242 Adds IPMI Transport Protocol/PPI to the IpmiInit PEIM and DXE driver's DEPEXs Cc: Sai Chaganty Cc: Liming Gao Cc: Michael Kubacki Signed-off-by: Isaac Oram Co-authored-by: Nate DeSimone Acked-by: Michael Kubacki Reviewed-by: Sai Chaganty --- .../IpmiFeaturePkg/IpmiInit/DxeIpmiInit.c | 4 ++-- .../IpmiFeaturePkg/IpmiInit/DxeIpmiInit.inf | 6 +++--- .../IpmiFeaturePkg/IpmiInit/PeiIpmiInit.c | 4 ++-- .../IpmiFeaturePkg/IpmiInit/PeiIpmiInit.inf | 4 ++-- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/IpmiInit/Dxe= IpmiInit.c b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/IpmiInit/Dxe= IpmiInit.c index 0639c3b2a1..baa2f1bb9f 100644 --- a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/IpmiInit/DxeIpmiIni= t.c +++ b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/IpmiInit/DxeIpmiIni= t.c @@ -1,7 +1,7 @@ /** @file IPMI stack initialization. =20 -Copyright (c) 2018 - 2019, Intel Corporation. All rights reserved.
+Copyright (c) 2018 - 2021, Intel Corporation. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent =20 **/ @@ -79,7 +79,7 @@ Returns: =20 // // Set up a loop to retry for up to 30 seconds. Calculate retries not ti= meout - // so that in case KCS is not enabled and EfiIpmiSendCommand() returns + // so that in case KCS is not enabled and IpmiSendCommand() returns // immediately we will not wait all the 30 seconds. // Retries =3D BMC_TIMEOUT / BMC_KCS_TIMEOUT + 1; diff --git a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/IpmiInit/Dxe= IpmiInit.inf b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/IpmiInit/D= xeIpmiInit.inf index 68ff70cd43..831bfb0b5e 100644 --- a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/IpmiInit/DxeIpmiIni= t.inf +++ b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/IpmiInit/DxeIpmiIni= t.inf @@ -1,7 +1,7 @@ ### @file # Component description file for IPMI initialization. # -# Copyright (c) 2018 - 2019, Intel Corporation. All rights reserved.
+# Copyright (c) 2018 - 2021, Intel Corporation. All rights reserved.
# # SPDX-License-Identifier: BSD-2-Clause-Patent # @@ -10,7 +10,7 @@ [Defines] INF_VERSION =3D 0x00010005 BASE_NAME =3D DxeIpmiInit - FILE_GUID =3D 07A01ACF-46D5-48de-A63D-74FA92AA8450 + FILE_GUID =3D 09D958D8-4646-886D-85F1-AA9249CC50FB MODULE_TYPE =3D DXE_DRIVER VERSION_STRING =3D 1.0 ENTRY_POINT =3D IpmiInterfaceInit @@ -31,4 +31,4 @@ TimerLib =20 [Depex] - TRUE + gIpmiTransportProtocolGuid diff --git a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/IpmiInit/Pei= IpmiInit.c b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/IpmiInit/Pei= IpmiInit.c index 062d20c44e..e4d040c381 100644 --- a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/IpmiInit/PeiIpmiIni= t.c +++ b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/IpmiInit/PeiIpmiIni= t.c @@ -1,7 +1,7 @@ /** @file IPMI stack initialization in PEI. =20 -Copyright (c) 2018 - 2019, Intel Corporation. All rights reserved.
+Copyright (c) 2018 - 2021, Intel Corporation. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent =20 **/ @@ -38,7 +38,7 @@ Returns: =20 // // Set up a loop to retry for up to 30 seconds. Calculate retries not ti= meout - // so that in case KCS is not enabled and EfiIpmiSendCommand() returns + // so that in case KCS is not enabled and IpmiSendCommand() returns // immediately we will not wait all the 30 seconds. // Retries =3D BMC_TIMEOUT_PEI/ BMC_KCS_TIMEOUT + 1; diff --git a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/IpmiInit/Pei= IpmiInit.inf b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/IpmiInit/P= eiIpmiInit.inf index 825451ede1..607a185eb6 100644 --- a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/IpmiInit/PeiIpmiIni= t.inf +++ b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/IpmiInit/PeiIpmiIni= t.inf @@ -1,7 +1,7 @@ ### @file # Component description file for IPMI initialization in PEI. # -# Copyright (c) 2018 - 2019, Intel Corporation. All rights reserved.
+# Copyright (c) 2018 - 2021, Intel Corporation. All rights reserved.
# # SPDX-License-Identifier: BSD-2-Clause-Patent # @@ -29,4 +29,4 @@ IpmiCommandLib =20 [Depex] - TRUE + gPeiIpmiTransportPpiGuid --=20 2.27.0.windows.1 -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#72311): https://edk2.groups.io/g/devel/message/72311 Mute This Topic: https://groups.io/mt/81016653/1787277 Group Owner: devel+owner@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [importer@patchew.org] -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D- From nobody Thu May 16 03:18:39 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of groups.io designates 66.175.222.108 as permitted sender) client-ip=66.175.222.108; envelope-from=bounce+27952+72314+1787277+3901457@groups.io; helo=mail02.groups.io; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of groups.io designates 66.175.222.108 as permitted sender) smtp.mailfrom=bounce+27952+72314+1787277+3901457@groups.io; dmarc=fail(p=none dis=none) header.from=intel.com ARC-Seal: i=1; a=rsa-sha256; t=1614652146; cv=none; d=zohomail.com; s=zohoarc; b=DkuWRAjR2Ti0y9qNJGXfOUjvP0Is6SVuSmi2p3jzUqudAN4z7lxWVLGLYaKQI99KC44N/DsQzSTv7QpiExravJq15M1kw3wx9Vi4t24RuvmnMpRINZ3JtWbJVYbhwhwP2lj09G2T57NOoj7z1pTYLsExrMpQNn2ElaMwbJPSBuI= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1614652146; h=Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Id:List-Unsubscribe:MIME-Version:Message-ID:Reply-To:References:Sender:Subject:To; bh=71JxPQLaoSvle6PmoAe5B0xwTKLPzKoiCpdGFTBgYvw=; b=h5Kf4AATMB6k+5YzDgA6Wq4Az5kaOJHIJ/9+71UL5VE3qa9oRA/KLvLfPmoyOAZi18tuFQOdqZaG9S7aEhzDmnkOIkKcYGsZIhr6NqMmu5VJOu73j0TvUMWLV7ObD8ZGFFhgDJORQAkKRFQ3EFqYhDSd2F87PIvtu53vCF+YUmI= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of groups.io designates 66.175.222.108 as permitted sender) smtp.mailfrom=bounce+27952+72314+1787277+3901457@groups.io; dmarc=fail header.from= (p=none dis=none) header.from= Received: from mail02.groups.io (mail02.groups.io [66.175.222.108]) by mx.zohomail.com with SMTPS id 1614652146919470.95474816672095; Mon, 1 Mar 2021 18:29:06 -0800 (PST) Return-Path: X-Received: by 127.0.0.2 with SMTP id CTmmYY1788612xXtCdZiAoFb; Mon, 01 Mar 2021 18:29:06 -0800 X-Received: from mga02.intel.com (mga02.intel.com []) by mx.groups.io with SMTP id smtpd.web12.3173.1614652144809506276 for ; Mon, 01 Mar 2021 18:29:05 -0800 IronPort-SDR: 03LwGFK28WTE7U/RwJTHHKo7ghOpaALvy3wo6i8WirA4tTcPBxMReZacYdPyQX1pgRxSIoDbte I98Vg0nriLrQ== X-IronPort-AV: E=McAfee;i="6000,8403,9910"; a="173797234" X-IronPort-AV: E=Sophos;i="5.81,216,1610438400"; d="scan'208";a="173797234" X-Received: from fmsmga004.fm.intel.com ([10.253.24.48]) by orsmga101.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 01 Mar 2021 18:29:02 -0800 IronPort-SDR: CHwjJyqcvAMi9O/VzAcIVjuGIb4I8TZTtJdvR4vyn3lvvOHcbdKmY0pZX/z6FIJvaFONtzyIN7 hl3eQu3uUOBQ== X-IronPort-AV: E=Sophos;i="5.81,216,1610438400"; d="scan'208";a="427169869" X-Received: from nldesimo-desk1.amr.corp.intel.com ([10.212.174.59]) by fmsmga004-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 01 Mar 2021 18:29:01 -0800 From: "Nate DeSimone" To: devel@edk2.groups.io Cc: Isaac Oram , Sai Chaganty , Liming Gao , Michael Kubacki Subject: [edk2-devel] [edk2-platforms] [PATCH v1 4/9] IpmiFeaturePkg: Add GenericIpmi driver common code Date: Mon, 1 Mar 2021 18:27:59 -0800 Message-Id: <20210302022804.8641-5-nathaniel.l.desimone@intel.com> In-Reply-To: <20210302022804.8641-1-nathaniel.l.desimone@intel.com> References: <20210302022804.8641-1-nathaniel.l.desimone@intel.com> MIME-Version: 1.0 Precedence: Bulk List-Unsubscribe: Sender: devel@edk2.groups.io List-Id: Mailing-List: list devel@edk2.groups.io; contact devel+owner@edk2.groups.io Reply-To: devel@edk2.groups.io,nathaniel.l.desimone@intel.com X-Gm-Message-State: ijjDvoQ2Yl9KExfb7h4I4wOpx1787277AA= Content-Transfer-Encoding: quoted-printable DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=groups.io; q=dns/txt; s=20140610; t=1614652146; bh=F8sjZ5NrozpIQ0uNhyJRCmQG/O3Yk4blsJ3Ydf8WlQg=; h=Cc:Date:From:Reply-To:Subject:To; b=L3qy98MjBTk+/GzC2MdVfqTo7V5nK9sI7lD6RyttOg/CchBJG63LiQKlX2U2kppbODS IYfFSFbpQvWNJYl/n4U0pDoKENRHF4v8kjiTgw+0yOHs0TvCnrhDrGfnzBJXnJyj0HV2G a6Agb5SUfQoZ5kAe3iYnShs0/M7UZRar6zg= X-ZohoMail-DKIM: pass (identity @groups.io) Content-Type: text/plain; charset="utf-8" From: Isaac Oram REF: https://bugzilla.tianocore.org/show_bug.cgi?id=3D3242 Adds phase independent code for the generic IPMI transport driver. Cc: Sai Chaganty Cc: Liming Gao Cc: Michael Kubacki Signed-off-by: Isaac Oram Co-authored-by: Nate DeSimone Acked-by: Michael Kubacki Reviewed-by: Sai Chaganty --- .../GenericIpmi/Common/IpmiBmc.c | 297 +++++++++++ .../GenericIpmi/Common/IpmiBmc.h | 44 ++ .../GenericIpmi/Common/IpmiBmcCommon.h | 179 +++++++ .../GenericIpmi/Common/IpmiHooks.c | 96 ++++ .../GenericIpmi/Common/IpmiHooks.h | 81 +++ .../GenericIpmi/Common/IpmiPhysicalLayer.h | 29 ++ .../GenericIpmi/Common/KcsBmc.c | 483 ++++++++++++++++++ .../GenericIpmi/Common/KcsBmc.h | 236 +++++++++ 8 files changed, 1445 insertions(+) create mode 100644 Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Gener= icIpmi/Common/IpmiBmc.c create mode 100644 Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Gener= icIpmi/Common/IpmiBmc.h create mode 100644 Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Gener= icIpmi/Common/IpmiBmcCommon.h create mode 100644 Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Gener= icIpmi/Common/IpmiHooks.c create mode 100644 Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Gener= icIpmi/Common/IpmiHooks.h create mode 100644 Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Gener= icIpmi/Common/IpmiPhysicalLayer.h create mode 100644 Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Gener= icIpmi/Common/KcsBmc.c create mode 100644 Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Gener= icIpmi/Common/KcsBmc.h diff --git a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/GenericIpmi/= Common/IpmiBmc.c b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Generi= cIpmi/Common/IpmiBmc.c new file mode 100644 index 0000000000..03b8174e37 --- /dev/null +++ b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/GenericIpmi/Common/= IpmiBmc.c @@ -0,0 +1,297 @@ +/** @file + IPMI Transport common layer driver + + @copyright + Copyright 1999 - 2021 Intel Corporation.
+ SPDX-License-Identifier: BSD-2-Clause-Patent +**/ + +#include "IpmiBmc.h" + +EFI_STATUS +UpdateErrorStatus ( + IN UINT8 BmcError, + IPMI_BMC_INSTANCE_DATA *IpmiInstance + ) +/*++ + +Routine Description: + + Check if the completion code is a Soft Error and increment the count. T= he count + is not updated if the BMC is in Force Update Mode. + +Arguments: + + BmcError - Completion code to check + IpmiInstance - BMC instance data + +Returns: + + EFI_SUCCESS - Status + +--*/ +{ + UINT8 Errors[] =3D COMPLETION_CODES; + UINT16 CodeCount; + UINT8 i; + + CodeCount =3D sizeof (Errors) / sizeof (Errors[0]); + for (i =3D 0; i < CodeCount; i++) { + if (BmcError =3D=3D Errors[i]) { + // + // Don't change Bmc Status flag if the BMC is in Force Update Mode. + // + if (IpmiInstance->BmcStatus !=3D BMC_UPDATE_IN_PROGRESS) { + IpmiInstance->BmcStatus =3D BMC_SOFTFAIL; + } + + IpmiInstance->SoftErrorCount++; + break; + } + } + + return EFI_SUCCESS; +} + +EFI_STATUS +EFIAPI +IpmiSendCommandToBmc ( + IN IPMI_TRANSPORT *This, + IN UINT8 NetFunction, + IN UINT8 Lun, + IN UINT8 Command, + IN UINT8 *CommandData, + IN UINT8 CommandDataSize, + IN OUT UINT8 *ResponseData, + IN OUT UINT8 *ResponseDataSize, + IN VOID *Context + ) +/*++ + +Routine Description: + + Send IPMI command to BMC + +Arguments: + + This - Pointer to IPMI protocol instance + NetFunction - Net Function of command to send + Lun - LUN of command to send + Command - IPMI command to send + CommandData - Pointer to command data buffer, if needed + CommandDataSize - Size of command data buffer + ResponseData - Pointer to response data buffer + ResponseDataSize - Pointer to response data buffer size + Context - Context + +Returns: + + EFI_INVALID_PARAMETER - One of the input values is bad + EFI_DEVICE_ERROR - IPMI command failed + EFI_BUFFER_TOO_SMALL - Response buffer is too small + EFI_UNSUPPORTED - Command is not supported by BMC + EFI_SUCCESS - Command completed successfully + +--*/ +{ + IPMI_BMC_INSTANCE_DATA *IpmiInstance; + UINT8 DataSize; + EFI_STATUS Status; + IPMI_COMMAND *IpmiCommand; + IPMI_RESPONSE *IpmiResponse; + UINT8 RetryCnt =3D IPMI_SEND_COMMAND_MAX_RETRY; + UINT8 Index; + + IpmiInstance =3D INSTANCE_FROM_SM_IPMI_BMC_THIS (This); + + while (RetryCnt--) { + // + // The TempData buffer is used for both sending command data and recei= ving + // response data. Since the command format is different from the resp= onse + // format, the buffer is cast to both structure definitions. + // + IpmiCommand =3D (IPMI_COMMAND*) IpmiInstance->TempData; + IpmiResponse =3D (IPMI_RESPONSE*) IpmiInstance->TempData; + + // + // Send IPMI command to BMC + // + IpmiCommand->Lun =3D Lun; + IpmiCommand->NetFunction =3D NetFunction; + IpmiCommand->Command =3D Command; + + // + // Ensure that the buffer is valid before attempting to copy the comma= nd data + // buffer into the IpmiCommand structure. + // + if (CommandDataSize > 0) { + if (CommandData =3D=3D NULL) { + return EFI_INVALID_PARAMETER; + } + + CopyMem ( + IpmiCommand->CommandData, + CommandData, + CommandDataSize + ); + } + + Status =3D SendDataToBmcPort ( + IpmiInstance->KcsTimeoutPeriod, + IpmiInstance->IpmiIoBase, + Context, + (UINT8 *) IpmiCommand, + (CommandDataSize + IPMI_COMMAND_HEADER_SIZE) + ); + + if (Status !=3D EFI_SUCCESS) { + IpmiInstance->BmcStatus =3D BMC_SOFTFAIL; + IpmiInstance->SoftErrorCount++; + return Status; + } + + // + // Get Response to IPMI Command from BMC. + // Subtract 1 from DataSize so memory past the end of the buffer can't= be written + // + DataSize =3D MAX_TEMP_DATA - 1; + Status =3D ReceiveBmcDataFromPort ( + IpmiInstance->KcsTimeoutPeriod, + IpmiInstance->IpmiIoBase, + Context, + (UINT8 *) IpmiResponse, + &DataSize + ); + + if (Status !=3D EFI_SUCCESS) { + IpmiInstance->BmcStatus =3D BMC_SOFTFAIL; + IpmiInstance->SoftErrorCount++; + return Status; + } + + // + // If we got this far without any error codes, but the DataSize less t= han IPMI_RESPONSE_HEADER_SIZE, then the + // command response failed, so do not continue. + // + if (DataSize < IPMI_RESPONSE_HEADER_SIZE) { + return EFI_DEVICE_ERROR; + } + + if ((IpmiResponse->CompletionCode !=3D COMP_CODE_NORMAL) && + (IpmiInstance->BmcStatus =3D=3D BMC_UPDATE_IN_PROGRESS)) { + // + // If the completion code is not normal and the BMC is in Force Upda= te + // mode, then update the error status and return EFI_UNSUPPORTED. + // + UpdateErrorStatus ( + IpmiResponse->CompletionCode, + IpmiInstance + ); + return EFI_UNSUPPORTED; + } else if (IpmiResponse->CompletionCode !=3D COMP_CODE_NORMAL) { + // + // Otherwise if the BMC is in normal mode, but the completion code + // is not normal, then update the error status and return device err= or. + // + UpdateErrorStatus ( + IpmiResponse->CompletionCode, + IpmiInstance + ); + // + // Intel Server System Integrated Baseboard Management Controller (B= MC) Firmware v0.62 + // D4h C Insufficient privilege, in KCS channel this indicates KCS P= olicy Control Mode is Deny All. + // In authenticated channels this indicates invalid authentication/p= rivilege. + // + if (IpmiResponse->CompletionCode =3D=3D COMP_INSUFFICIENT_PRIVILEGE)= { + return EFI_SECURITY_VIOLATION; + } else { + return EFI_DEVICE_ERROR; + } + } + + // + // Verify the response data buffer passed in is big enough. + // + if ((DataSize - IPMI_RESPONSE_HEADER_SIZE) > *ResponseDataSize) { + // + //Verify the response data matched with the cmd sent. + // + if ((IpmiResponse->NetFunction !=3D (NetFunction | 0x1)) || (IpmiRes= ponse->Command !=3D Command)) { + if (0 =3D=3D RetryCnt) { + return EFI_DEVICE_ERROR; + } else { + continue; + } + } + return EFI_BUFFER_TOO_SMALL; + } + + break; + } + // + // Copy data over to the response data buffer. + // + *ResponseDataSize =3D DataSize - IPMI_RESPONSE_HEADER_SIZE; + CopyMem ( + ResponseData, + IpmiResponse->ResponseData, + *ResponseDataSize + ); + + // + // Add completion code in response data to meet the requirement of IPMI = spec 2.0 + // + *ResponseDataSize +=3D 1; // Add one byte for Completion Code + for (Index =3D 1; Index < *ResponseDataSize; Index++) { + ResponseData [*ResponseDataSize - Index] =3D ResponseData [*ResponseDa= taSize - (Index + 1)]; + } + ResponseData [0] =3D IpmiResponse->CompletionCode; + + IpmiInstance->BmcStatus =3D BMC_OK; + return EFI_SUCCESS; +} + + +EFI_STATUS +EFIAPI +IpmiBmcStatus ( + IN IPMI_TRANSPORT *This, + OUT BMC_STATUS *BmcStatus, + OUT SM_COM_ADDRESS *ComAddress, + IN VOID *Context + ) +/*++ + +Routine Description: + + Updates the BMC status and returns the Com Address + +Arguments: + + This - Pointer to IPMI protocol instance + BmcStatus - BMC status + ComAddress - Com Address + Context - Context + +Returns: + + EFI_SUCCESS - Success + +--*/ +{ + IPMI_BMC_INSTANCE_DATA *IpmiInstance; + + IpmiInstance =3D INSTANCE_FROM_SM_IPMI_BMC_THIS (This); + + if ((IpmiInstance->BmcStatus =3D=3D BMC_SOFTFAIL) && (IpmiInstance->Soft= ErrorCount >=3D MAX_SOFT_COUNT)) { + IpmiInstance->BmcStatus =3D BMC_HARDFAIL; + } + + *BmcStatus =3D IpmiInstance->BmcStatus; + ComAddress->ChannelType =3D SmBmc; + ComAddress->Address.BmcAddress.LunAddress =3D 0x0; + ComAddress->Address.BmcAddress.SlaveAddress =3D IpmiInstance->SlaveAddre= ss; + ComAddress->Address.BmcAddress.ChannelAddress =3D 0x0; + + return EFI_SUCCESS; +} diff --git a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/GenericIpmi/= Common/IpmiBmc.h b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Generi= cIpmi/Common/IpmiBmc.h new file mode 100644 index 0000000000..d306a085e5 --- /dev/null +++ b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/GenericIpmi/Common/= IpmiBmc.h @@ -0,0 +1,44 @@ +/** @file + IPMI Transport common layer driver head file + + @copyright + Copyright 1999 - 2021 Intel Corporation.
+ SPDX-License-Identifier: BSD-2-Clause-Patent +**/ + +#ifndef _IPMI_BMC_H_ +#define _IPMI_BMC_H_ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "IpmiBmcCommon.h" +#include "KcsBmc.h" + + +#define BMC_KCS_TIMEOUT 5 // [s] Single KSC request timeout + +// +// IPMI Instance signature +// +#define SM_IPMI_BMC_SIGNATURE SIGNATURE_32 ('i', 'p', 'm', 'i') +#define IPMI_SEND_COMMAND_MAX_RETRY 3 // Number of retries +#define INSTANCE_FROM_SM_IPMI_BMC_THIS(a) \ + CR ( \ + a, \ + IPMI_BMC_INSTANCE_DATA, \ + IpmiTransport, \ + SM_IPMI_BMC_SIGNATURE \ + ) + +#endif // _IPMI_BMC_H_ diff --git a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/GenericIpmi/= Common/IpmiBmcCommon.h b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/= GenericIpmi/Common/IpmiBmcCommon.h new file mode 100644 index 0000000000..1e5dfd81f1 --- /dev/null +++ b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/GenericIpmi/Common/= IpmiBmcCommon.h @@ -0,0 +1,179 @@ +/** @file + IPMI Transport common layer driver common head file + + @copyright + Copyright 1999 - 2021 Intel Corporation.
+ SPDX-License-Identifier: BSD-2-Clause-Patent +**/ + +#ifndef _IPMI_COMMON_BMC_H_ +#define _IPMI_COMMON_BMC_H_ + +#define MAX_TEMP_DATA 255 // 160 Modified to increase number of bytes = transfered per command +#define BMC_SLAVE_ADDRESS 0x20 +#define MAX_SOFT_COUNT 10 +#define COMP_CODE_NORMAL 0x00 + +// +// IPMI command completion codes to check for in the UpdateErrorStatus rou= tine. +// These completion codes indicate a soft error and a running total of the= occurrences +// of these errors is maintained. +// +#define COMP_CODE_NODE_BUSY 0xC0 +#define COMP_CODE_TIMEOUT 0xC3 +#define COMP_CODE_OUT_OF_SPACE 0xC4 +#define COMP_CODE_OUT_OF_RANGE 0xC9 +#define COMP_CODE_CMD_RESP_NOT_PROVIDED 0xCE +#define COMP_CODE_FAIL_DUP_REQUEST 0xCF +#define COMP_CODE_SDR_REP_IN_UPDATE_MODE 0xD0 +#define COMP_CODE_DEV_IN_FW_UPDATE_MODE 0xD1 +#define COMP_CODE_BMC_INIT_IN_PROGRESS 0xD2 +// +// Intel Server System Integrated Baseboard Management Controller (BMC) Fi= rmware v0.62 +// D4h C Insufficient privilege, in KCS channel this indicates KCS Policy = Control Mode is Deny All. +// In authenticated channels this indicates invalid authentication/privile= ge. +// +#define COMP_INSUFFICIENT_PRIVILEGE 0xD4 +#define COMP_CODE_UNSPECIFIED 0xFF + +#define COMPLETION_CODES \ + { \ + COMP_CODE_NODE_BUSY, COMP_CODE_TIMEOUT, COMP_CODE_OUT_OF_SPACE, COMP_C= ODE_OUT_OF_RANGE, \ + COMP_CODE_CMD_RESP_NOT_PROVIDED, COMP_CODE_FAIL_DUP_REQUEST, COMP_CODE= _SDR_REP_IN_UPDATE_MODE, \ + COMP_CODE_DEV_IN_FW_UPDATE_MODE, COMP_CODE_BMC_INIT_IN_PROGRESS, COMP_= INSUFFICIENT_PRIVILEGE, COMP_CODE_UNSPECIFIED \ + } + +// +// Dxe Ipmi instance data +// +typedef struct { + UINTN Signature; + UINT64 KcsTimeoutPeriod; + UINT8 SlaveAddress; + UINT8 TempData[MAX_TEMP_DATA]; + BMC_STATUS BmcStatus; + UINT64 ErrorStatus; + UINT8 SoftErrorCount; + UINT16 IpmiIoBase; + IPMI_TRANSPORT IpmiTransport; + EFI_HANDLE IpmiSmmHandle; +} IPMI_BMC_INSTANCE_DATA; + +// +// Structure of IPMI Command buffer +// +#define IPMI_COMMAND_HEADER_SIZE 2 + +typedef struct { + UINT8 Lun : 2; + UINT8 NetFunction : 6; + UINT8 Command; + UINT8 CommandData[MAX_TEMP_DATA - IPMI_COMMAND_HEADER_SIZE]; +} IPMI_COMMAND; + +// +// Structure of IPMI Command response buffer +// +#define IPMI_RESPONSE_HEADER_SIZE 3 + +typedef struct { + UINT8 Lun : 2; + UINT8 NetFunction : 6; + UINT8 Command; + UINT8 CompletionCode; + UINT8 ResponseData[MAX_TEMP_DATA - IPMI_RESPONSE_HEADER_SIZE]; +} IPMI_RESPONSE; + +EFI_STATUS +EFIAPI +IpmiSendCommandToBmc ( + IN IPMI_TRANSPORT *This, + IN UINT8 NetFunction, + IN UINT8 Lun, + IN UINT8 Command, + IN UINT8 *CommandData, + IN UINT8 CommandDataSize, + IN OUT UINT8 *ResponseData, + IN OUT UINT8 *ResponseDataSize, + IN VOID *Context + ) +/*++ + +Routine Description: + + Send IPMI command to BMC + +Arguments: + + This - Pointer to IPMI protocol instance + NetFunction - Net Function of command to send + Lun - LUN of command to send + Command - IPMI command to send + CommandData - Pointer to command data buffer, if needed + CommandDataSize - Size of command data buffer + ResponseData - Pointer to response data buffer + ResponseDataSize - Pointer to response data buffer size + Context - Context + +Returns: + + EFI_INVALID_PARAMETER - One of the input values is bad + EFI_DEVICE_ERROR - IPMI command failed + EFI_BUFFER_TOO_SMALL - Response buffer is too small + EFI_SUCCESS - Command completed successfully + +--*/ +; + + +EFI_STATUS +EFIAPI +IpmiBmcStatus ( + IN IPMI_TRANSPORT *This, + OUT BMC_STATUS *BmcStatus, + OUT SM_COM_ADDRESS *ComAddress, + IN VOID *Context + ) +/*++ + +Routine Description: + + Updates the BMC status and returns the Com Address + +Arguments: + + This - Pointer to IPMI protocol instance + BmcStatus - BMC status + ComAddress - Com Address + Context - Context + +Returns: + + EFI_SUCCESS - Success + +--*/ +; + +VOID +GetDeviceSpecificTestResults ( + IN IPMI_BMC_INSTANCE_DATA *IpmiInstance + ) +/*++ + +Routine Description: + + This is a BMC specific routine to check the device specific self test re= sults as defined + in the Bensley BMC core specification. + +Arguments: + + IpmiInstance - Data structure describing BMC variables and used for sen= ding commands + +Returns: + + VOID + +--*/ +; + +#endif diff --git a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/GenericIpmi/= Common/IpmiHooks.c b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Gene= ricIpmi/Common/IpmiHooks.c new file mode 100644 index 0000000000..86ff7c0fdf --- /dev/null +++ b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/GenericIpmi/Common/= IpmiHooks.c @@ -0,0 +1,96 @@ +/** @file + IPMI common hook functions + + @copyright + Copyright 2014 - 2021 Intel Corporation.
+ SPDX-License-Identifier: BSD-2-Clause-Patent +**/ + +#include "IpmiHooks.h" + +EFI_STATUS +IpmiSendCommand ( + IN IPMI_TRANSPORT *This, + IN UINT8 NetFunction, + IN UINT8 Lun, + IN UINT8 Command, + IN UINT8 *CommandData, + IN UINT32 CommandDataSize, + IN OUT UINT8 *ResponseData, + IN OUT UINT32 *ResponseDataSize + ) +/*++ + +Routine Description: + + Send Ipmi Command in the right mode: HECI or KCS, to the + appropiate device, ME or BMC. + +Arguments: + + This - Pointer to IPMI protocol instance + NetFunction - Net Function of command to send + Lun - LUN of command to send + Command - IPMI command to send + CommandData - Pointer to command data buffer, if needed + CommandDataSize - Size of command data buffer + ResponseData - Pointer to response data buffer + ResponseDataSize - Pointer to response data buffer size + +Returns: + + EFI_INVALID_PARAMETER - One of the input values is bad + EFI_DEVICE_ERROR - IPMI command failed + EFI_BUFFER_TOO_SMALL - Response buffer is too small + EFI_UNSUPPORTED - Command is not supported by BMC + EFI_SUCCESS - Command completed successfully + +--*/ +{ + // + // This Will be unchanged ( BMC/KCS style ) + // + return IpmiSendCommandToBmc ( + This, + NetFunction, + Lun, + Command, + CommandData, + (UINT8) CommandDataSize, + ResponseData, + (UINT8*) ResponseDataSize, + NULL + ); +} // IpmiSendCommand() + +EFI_STATUS +IpmiGetBmcStatus ( + IN IPMI_TRANSPORT *This, + OUT BMC_STATUS *BmcStatus, + OUT SM_COM_ADDRESS *ComAddress + ) +/*++ + +Routine Description: + + Updates the BMC status and returns the Com Address + +Arguments: + + This - Pointer to IPMI protocol instance + BmcStatus - BMC status + ComAddress - Com Address + +Returns: + + EFI_SUCCESS - Success + +--*/ +{ + return IpmiBmcStatus ( + This, + BmcStatus, + ComAddress, + NULL + ); +} diff --git a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/GenericIpmi/= Common/IpmiHooks.h b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Gene= ricIpmi/Common/IpmiHooks.h new file mode 100644 index 0000000000..083c9e70b0 --- /dev/null +++ b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/GenericIpmi/Common/= IpmiHooks.h @@ -0,0 +1,81 @@ +/** @file + IPMI common hook functions head file + + @copyright + Copyright 2014 - 2021 Intel Corporation.
+ SPDX-License-Identifier: BSD-2-Clause-Patent +**/ + +#ifndef _IPMI_HOOKS_H +#define _IPMI_HOOKS_H + +#include "IpmiBmc.h" + +// +// Internal(hook) function list +// +EFI_STATUS +IpmiSendCommand ( + IN IPMI_TRANSPORT *This, + IN UINT8 NetFunction, + IN UINT8 Lun, + IN UINT8 Command, + IN UINT8 *CommandData, + IN UINT32 CommandDataSize, + IN OUT UINT8 *ResponseData, + IN OUT UINT32 *ResponseDataSize + ) +/*++ + +Routine Description: + + Send IPMI command to BMC + +Arguments: + + This - Pointer to IPMI protocol instance + NetFunction - Net Function of command to send + Lun - LUN of command to send + Command - IPMI command to send + CommandData - Pointer to command data buffer, if needed + CommandDataSize - Size of command data buffer + ResponseData - Pointer to response data buffer + ResponseDataSize - Pointer to response data buffer size + +Returns: + + EFI_INVALID_PARAMETER - One of the input values is bad + EFI_DEVICE_ERROR - IPMI command failed + EFI_BUFFER_TOO_SMALL - Response buffer is too small + EFI_UNSUPPORTED - Command is not supported by BMC + EFI_SUCCESS - Command completed successfully + +--*/ +; + +EFI_STATUS +IpmiGetBmcStatus ( + IN IPMI_TRANSPORT *This, + OUT BMC_STATUS *BmcStatus, + OUT SM_COM_ADDRESS *ComAddress + ) +/*++ + +Routine Description: + + Updates the BMC status and returns the Com Address + +Arguments: + + This - Pointer to IPMI protocol instance + BmcStatus - BMC status + ComAddress - Com Address + +Returns: + + EFI_SUCCESS - Success + +--*/ +; + +#endif diff --git a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/GenericIpmi/= Common/IpmiPhysicalLayer.h b/Features/Intel/OutOfBandManagement/IpmiFeature= Pkg/GenericIpmi/Common/IpmiPhysicalLayer.h new file mode 100644 index 0000000000..0215bd0e5a --- /dev/null +++ b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/GenericIpmi/Common/= IpmiPhysicalLayer.h @@ -0,0 +1,29 @@ +/** @file + IPMI Common physical layer functions. + + @copyright + Copyright 2014 - 2021 Intel Corporation.
+ SPDX-License-Identifier: BSD-2-Clause-Patent +**/ + +#ifndef _IPMI_PHYSICAL_LAYER_H +#define _IPMI_PHYSICAL_LAYER_H + +// +// KCS physical interface layer +// +EFI_STATUS +InitializeIpmiKcsPhysicalLayer ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable + ); + + +EFI_STATUS +SmmInitializeIpmiKcsPhysicalLayer ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable + ); + +#endif + diff --git a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/GenericIpmi/= Common/KcsBmc.c b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Generic= Ipmi/Common/KcsBmc.c new file mode 100644 index 0000000000..7243d37cc5 --- /dev/null +++ b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/GenericIpmi/Common/= KcsBmc.c @@ -0,0 +1,483 @@ +/** @file + KCS Transport Hook. + + @copyright + Copyright 1999 - 2021 Intel Corporation.
+ SPDX-License-Identifier: BSD-2-Clause-Patent +**/ + +#include "KcsBmc.h" + +EFI_STATUS +KcsErrorExit ( + UINT64 KcsTimeoutPeriod, + UINT16 KcsPort, + VOID *Context + ) +/*++ + +Routine Description: + + Check the KCS error status + +Arguments: + + IpmiInstance - The pointer of IPMI_BMC_INSTANCE_DATA + KcsPort - The base port of KCS + Context - The Context for this operation + +Returns: + + EFI_DEVICE_ERROR - The device error happened + EFI_SUCCESS - Successfully check the KCS error status + +--*/ +{ + EFI_STATUS Status; + UINT8 KcsData; + KCS_STATUS KcsStatus; + UINT8 BmcStatus; + UINT8 RetryCount; + UINT64 TimeOut; + + TimeOut =3D 0; + RetryCount =3D 0; + while (RetryCount < KCS_ABORT_RETRY_COUNT) { + + TimeOut =3D 0; + do { + MicroSecondDelay (KCS_DELAY_UNIT); + KcsStatus.RawData =3D IoRead8 (KcsPort + 1); + if (KcsStatus.RawData =3D=3D 0xFF || (TimeOut >=3D KcsTimeoutPeriod)= ) { + RetryCount =3D KCS_ABORT_RETRY_COUNT; + break; + } + TimeOut++; + } while (KcsStatus.Status.Ibf); + + if (RetryCount >=3D KCS_ABORT_RETRY_COUNT) { + break; + } + + KcsData =3D KCS_ABORT; + IoWrite8 ((KcsPort + 1), KcsData); + + TimeOut =3D 0; + do { + MicroSecondDelay (KCS_DELAY_UNIT); + KcsStatus.RawData =3D IoRead8 (KcsPort + 1); + if (KcsStatus.RawData =3D=3D 0xFF || (TimeOut >=3D KcsTimeoutPeriod)= ) { + Status =3D EFI_DEVICE_ERROR; + goto LabelError; + } + TimeOut++; + } while (KcsStatus.Status.Ibf); + + KcsData =3D IoRead8 (KcsPort); + + KcsData =3D 0x0; + IoWrite8 (KcsPort, KcsData); + + TimeOut =3D 0; + do { + MicroSecondDelay (KCS_DELAY_UNIT); + KcsStatus.RawData =3D IoRead8 (KcsPort + 1); + if (KcsStatus.RawData =3D=3D 0xFF || (TimeOut >=3D KcsTimeoutPeriod)= ) { + Status =3D EFI_DEVICE_ERROR; + goto LabelError; + } + TimeOut++; + } while (KcsStatus.Status.Ibf); + + if (KcsStatus.Status.State =3D=3D KcsReadState) { + TimeOut =3D 0; + do { + MicroSecondDelay (KCS_DELAY_UNIT); + KcsStatus.RawData =3D IoRead8 (KcsPort + 1); + if (KcsStatus.RawData =3D=3D 0xFF || (TimeOut >=3D KcsTimeoutPerio= d)) { + Status =3D EFI_DEVICE_ERROR; + goto LabelError; + } + TimeOut++; + } while (!KcsStatus.Status.Obf); + + BmcStatus =3D IoRead8 (KcsPort); + + KcsData =3D KCS_READ; + IoWrite8 (KcsPort, KcsData); + + TimeOut =3D 0; + do { + MicroSecondDelay (KCS_DELAY_UNIT); + KcsStatus.RawData =3D IoRead8 (KcsPort + 1); + if (KcsStatus.RawData =3D=3D 0xFF || (TimeOut >=3D KcsTimeoutPerio= d)) { + Status =3D EFI_DEVICE_ERROR; + goto LabelError; + } + TimeOut++; + } while (KcsStatus.Status.Ibf); + + if (KcsStatus.Status.State =3D=3D KcsIdleState) { + TimeOut =3D 0; + do { + MicroSecondDelay (KCS_DELAY_UNIT); + KcsStatus.RawData =3D IoRead8 (KcsPort + 1); + if (KcsStatus.RawData =3D=3D 0xFF || (TimeOut >=3D KcsTimeoutPer= iod)) { + Status =3D EFI_DEVICE_ERROR; + goto LabelError; + } + TimeOut++; + } while (!KcsStatus.Status.Obf); + + KcsData =3D IoRead8 (KcsPort); + break; + + } else { + RetryCount++; + continue; + } + + } else { + RetryCount++; + continue; + } + } + + if (RetryCount >=3D KCS_ABORT_RETRY_COUNT) { + Status =3D EFI_DEVICE_ERROR; + goto LabelError; + } + + return EFI_SUCCESS; + +LabelError: + return Status; +} + +EFI_STATUS +KcsCheckStatus ( + UINT64 KcsTimeoutPeriod, + UINT16 KcsPort, + KCS_STATE KcsState, + BOOLEAN *Idle, + VOID *Context + ) +/*++ + +Routine Description: + + Ckeck KCS status + +Arguments: + + IpmiInstance - The pointer of IPMI_BMC_INSTANCE_DATA + KcsPort - The base port of KCS + KcsState - The state of KCS to be checked + Idle - If the KCS is idle + Context - The context for this operation + +Returns: + + EFI_SUCCESS - Checked the KCS status successfully + +--*/ +{ + EFI_STATUS Status; + KCS_STATUS KcsStatus; + UINT8 KcsData; + UINT64 TimeOut; + + if (Idle =3D=3D NULL) { + return EFI_INVALID_PARAMETER; + } + + *Idle =3D FALSE; + + TimeOut =3D 0; + do { + MicroSecondDelay (KCS_DELAY_UNIT); + KcsStatus.RawData =3D IoRead8 (KcsPort + 1); + if (KcsStatus.RawData =3D=3D 0xFF || (TimeOut >=3D KcsTimeoutPeriod)) { + Status =3D EFI_DEVICE_ERROR; + goto LabelError; + } + TimeOut++; + } while (KcsStatus.Status.Ibf); + + if (KcsState =3D=3D KcsWriteState) { + KcsData =3D IoRead8 (KcsPort); + } + + if (KcsStatus.Status.State !=3D KcsState) { + if ((KcsStatus.Status.State =3D=3D KcsIdleState) && (KcsState =3D=3D K= csReadState)) { + *Idle =3D TRUE; + } else { + Status =3D KcsErrorExit (KcsTimeoutPeriod, KcsPort, Context); + goto LabelError; + } + } + + if (KcsState =3D=3D KcsReadState) { + TimeOut =3D 0; + do { + MicroSecondDelay (KCS_DELAY_UNIT); + KcsStatus.RawData =3D IoRead8 (KcsPort + 1); + if (KcsStatus.RawData =3D=3D 0xFF || (TimeOut >=3D KcsTimeoutPeriod)= ) { + Status =3D EFI_DEVICE_ERROR; + goto LabelError; + } + TimeOut++; + } while (!KcsStatus.Status.Obf); + } + + if (KcsState =3D=3D KcsWriteState || (*Idle =3D=3D TRUE)) { + KcsData =3D IoRead8 (KcsPort); + } + + return EFI_SUCCESS; + +LabelError: + return Status; +} + +EFI_STATUS +SendDataToBmc ( + UINT64 KcsTimeoutPeriod, + UINT16 KcsPort, + VOID *Context, + UINT8 *Data, + UINT8 DataSize + ) +/*++ + +Routine Description: + + Send data to BMC + +Arguments: + + IpmiInstance - The pointer of IPMI_BMC_INSTANCE_DATA + Context - The context of this operation + Data - The data pointer to be sent + DataSize - The data size + +Returns: + + EFI_SUCCESS - Send out the data successfully + +--*/ +{ + KCS_STATUS KcsStatus; + UINT8 KcsData; + UINT16 KcsIoBase; + EFI_STATUS Status; + UINT8 i; + BOOLEAN Idle; + UINT64 TimeOut; + + KcsIoBase =3D KcsPort; + + TimeOut =3D 0; + + do { + MicroSecondDelay (KCS_DELAY_UNIT); + KcsStatus.RawData =3D IoRead8 (KcsIoBase + 1); + if ((KcsStatus.RawData =3D=3D 0xFF) || (TimeOut >=3D KcsTimeoutPeriod)= ) { + if ((Status =3D KcsErrorExit (KcsTimeoutPeriod, KcsIoBase, Context))= !=3D EFI_SUCCESS) { + return Status; + } + } + TimeOut++; + } while (KcsStatus.Status.Ibf); + + KcsData =3D KCS_WRITE_START; + IoWrite8 ((KcsIoBase + 1), KcsData); + if ((Status =3D KcsCheckStatus (KcsTimeoutPeriod, KcsIoBase, KcsWriteSta= te, &Idle, Context)) !=3D EFI_SUCCESS) { + return Status; + } + + for (i =3D 0; i < DataSize; i++) { + if (i =3D=3D (DataSize - 1)) { + if ((Status =3D KcsCheckStatus (KcsTimeoutPeriod, KcsIoBase, KcsWrit= eState, &Idle, Context)) !=3D EFI_SUCCESS) { + return Status; + } + + KcsData =3D KCS_WRITE_END; + IoWrite8 ((KcsIoBase + 1), KcsData); + } + + Status =3D KcsCheckStatus (KcsTimeoutPeriod, KcsIoBase, KcsWriteState,= &Idle, Context); + if (EFI_ERROR (Status)) { + return Status; + } + + IoWrite8 (KcsIoBase, Data[i]); + } + + return EFI_SUCCESS; +} + +EFI_STATUS +ReceiveBmcData ( + UINT64 KcsTimeoutPeriod, + UINT16 KcsPort, + VOID *Context, + UINT8 *Data, + UINT8 *DataSize + ) +/*++ + +Routine Description: + + Routine Description: + + Receive data from BMC + +Arguments: + + IpmiInstance - The pointer of IPMI_BMC_INSTANCE_DATA + Context - The context of this operation + Data - The buffer pointer + DataSize - The buffer size + +Returns: + + EFI_SUCCESS - Received data successfully + +--*/ +{ + UINT8 KcsData; + UINT16 KcsIoBase; + EFI_STATUS Status; + BOOLEAN Idle; + UINT8 Count; + + Count =3D 0; + KcsIoBase =3D KcsPort; + + while (TRUE) { + + if ((Status =3D KcsCheckStatus (KcsTimeoutPeriod, KcsIoBase, KcsReadSt= ate, &Idle, Context)) !=3D EFI_SUCCESS) { + return Status; + } + + if (Idle) { + *DataSize =3D Count; + break; + } + + // + //Need to check Data Size -1 to account for array access + // + if (Count >=3D *DataSize) { + return EFI_DEVICE_ERROR; + } + + Data[Count] =3D IoRead8 (KcsIoBase); + + Count++; + + KcsData =3D KCS_READ; + IoWrite8 (KcsIoBase, KcsData); + } + + return EFI_SUCCESS; +} + +EFI_STATUS +ReceiveBmcDataFromPort ( + UINT64 KcsTimeoutPeriod, + UINT16 KcsPort, + VOID *Context, + UINT8 *Data, + UINT8 *DataSize + ) +/*++ + +Routine Description: + + Receive data from BMC + +Arguments: + + IpmiInstance - The pointer of IPMI_BMC_INSTANCE_DATA + Context - The context of this operation + Data - The buffer pointer to receive data + DataSize - The buffer size + +Returns: + + EFI_SUCCESS - Received the data successfully + +--*/ +{ + EFI_STATUS Status; + UINT16 KcsIoBase; + UINT8 i; + UINT8 MyDataSize; + + MyDataSize =3D *DataSize; + KcsIoBase =3D KcsPort; + + for (i =3D 0; i < KCS_ABORT_RETRY_COUNT; i++) { + Status =3D ReceiveBmcData (KcsTimeoutPeriod, KcsIoBase, Context, Data,= DataSize); + if (EFI_ERROR (Status)) { + if ((Status =3D KcsErrorExit (KcsTimeoutPeriod, KcsIoBase, Context))= !=3D EFI_SUCCESS) { + return Status; + } + + *DataSize =3D MyDataSize; + } else { + return Status; + } + } + + return EFI_DEVICE_ERROR; +} + +EFI_STATUS +SendDataToBmcPort ( + UINT64 KcsTimeoutPeriod, + UINT16 KcsPort, + VOID *Context, + UINT8 *Data, + UINT8 DataSize + ) +/*++ + +Routine Description: + + Send data to BMC + +Arguments: + + IpmiInstance - The pointer of IPMI_BMC_INSTANCE_DATA + Context - The context of this operation + Data - The data pointer to be sent + DataSize - The data size + +Returns: + + EFI_SUCCESS - Send out the data successfully + +--*/ +{ + EFI_STATUS Status; + UINT16 KcsIoBase; + UINT8 i; + + KcsIoBase =3D KcsPort; + + for (i =3D 0; i < KCS_ABORT_RETRY_COUNT; i++) { + Status =3D SendDataToBmc (KcsTimeoutPeriod, KcsIoBase, Context, Data, = DataSize); + if (EFI_ERROR (Status)) { + if ((Status =3D KcsErrorExit (KcsTimeoutPeriod, KcsIoBase, Context))= !=3D EFI_SUCCESS) { + return Status; + } + } else { + return Status; + } + } + + return EFI_DEVICE_ERROR; +} diff --git a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/GenericIpmi/= Common/KcsBmc.h b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Generic= Ipmi/Common/KcsBmc.h new file mode 100644 index 0000000000..a8684cc4f6 --- /dev/null +++ b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/GenericIpmi/Common/= KcsBmc.h @@ -0,0 +1,236 @@ +/** @file + KCS Transport Hook head file. + + @copyright + Copyright 1999 - 2021 Intel Corporation.
+ SPDX-License-Identifier: BSD-2-Clause-Patent +**/ + +#ifndef _KCS_BMC_H +#define _KCS_BMC_H + +#include +#include +#include +#include + +#define KCS_WRITE_START 0x61 +#define KCS_WRITE_END 0x62 +#define KCS_READ 0x68 +#define KCS_GET_STATUS 0x60 +#define KCS_ABORT 0x60 +#define KCS_DELAY_UNIT 50 // [s] Each KSC IO delay + +// +// In OpenBMC, UpdateMode: the bit 7 of byte 4 in get device id command is= used for the BMC status: +// 0 means BMC is ready, 1 means BMC is not ready. +// At the very beginning of BMC power on, the status is 1 means BMC is in = booting process and not ready. It is not the flag for force update mode. +// +#define BMC_READY 0 + + +#define KCS_ABORT_RETRY_COUNT 1 + +//#define TIMEOUT64(a,b) ((INT64)((b) - (a)) < 0) + +typedef enum { + KcsIdleState, + KcsReadState, + KcsWriteState, + KcsErrorState +} KCS_STATE; + +typedef union { + UINT8 RawData; + struct { + UINT8 Obf : 1; + UINT8 Ibf : 1; + UINT8 SmAtn : 1; + UINT8 CD : 1; + UINT8 Oem1 : 1; + UINT8 Oem2 : 1; + UINT8 State : 2; + } Status; +} KCS_STATUS; + + +// +//External Fucntion List +// +EFI_STATUS +SendDataToBmcPort ( + UINT64 KcsTimeoutPeriod, + UINT16 KcsPort, + VOID *Context, + UINT8 *Data, + UINT8 DataSize + ) +/*++ + +Routine Description: + + Send data to BMC + +Arguments: + + IpmiInstance - The pointer of IPMI_BMC_INSTANCE_DATA + Context - The context of this operation + Data - The data pointer to be sent + DataSize - The data size + +Returns: + + EFI_SUCCESS - Send out the data successfully + +--*/ +; + +EFI_STATUS +ReceiveBmcDataFromPort ( + UINT64 KcsTimeoutPeriod, + UINT16 KcsPort, + VOID *Context, + UINT8 *Data, + UINT8 *DataSize + ) +/*++ + +Routine Description: + + Routine Description: + + Receive data from BMC + +Arguments: + + IpmiInstance - The pointer of IPMI_BMC_INSTANCE_DATA + Context - The context of this operation + Data - The buffer pointer + DataSize - The buffer size + +Returns: + + EFI_SUCCESS - Received data successfully + +--*/ +; + +// +//Internal Fucntion List +// +EFI_STATUS +KcsErrorExit ( + UINT64 KcsTimeoutPeriod, + UINT16 KcsPort, + VOID *Context + ) +/*++ + +Routine Description: + + Check the KCS error status + +Arguments: + + IpmiInstance - The pointer of IPMI_BMC_INSTANCE_DATA + KcsPort - The base port of KCS + Context - The Context for this operation + +Returns: + + EFI_DEVICE_ERROR - The device error happened + EFI_SUCCESS - Successfully check the KCS error status + +--*/ +; + +EFI_STATUS +KcsCheckStatus ( + UINT64 KcsTimeoutPeriod, + UINT16 KcsPort, + KCS_STATE KcsState, + BOOLEAN *Idle, + VOID *Context + ) +/*++ + +Routine Description: + + Ckeck KCS status + +Arguments: + + IpmiInstance - The pointer of IPMI_BMC_INSTANCE_DATA + KcsPort - The base port of KCS + KcsState - The state of KCS to be checked + Idle - If the KCS is idle + Context - The context for this operation + +Returns: + + EFI_SUCCESS - Checked the KCS status successfully + +--*/ +; + + +EFI_STATUS +SendDataToBmc ( + UINT64 KcsTimeoutPeriod, + UINT16 KcsPort, + VOID *Context, + UINT8 *Data, + UINT8 DataSize + ) +/*++ + +Routine Description: + + Send data to BMC + +Arguments: + + IpmiInstance - The pointer of IPMI_BMC_INSTANCE_DATA + Context - The context of this operation + Data - The data pointer to be sent + DataSize - The data size + +Returns: + + EFI_SUCCESS - Send out the data successfully + +--*/ +; + + +EFI_STATUS +ReceiveBmcData ( + UINT64 KcsTimeoutPeriod, + UINT16 KcsPort, + VOID *Context, + UINT8 *Data, + UINT8 *DataSize + ) +/*++ + +Routine Description: + + Routine Description: + + Receive data from BMC + +Arguments: + + IpmiInstance - The pointer of IPMI_BMC_INSTANCE_DATA + Context - The context of this operation + Data - The buffer pointer + DataSize - The buffer size + +Returns: + + EFI_SUCCESS - Received data successfully + +--*/ +; + +#endif --=20 2.27.0.windows.1 -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#72314): https://edk2.groups.io/g/devel/message/72314 Mute This Topic: https://groups.io/mt/81016656/1787277 Group Owner: devel+owner@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [importer@patchew.org] -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D- From nobody Thu May 16 03:18:39 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of groups.io designates 66.175.222.108 as permitted sender) client-ip=66.175.222.108; envelope-from=bounce+27952+72313+1787277+3901457@groups.io; helo=mail02.groups.io; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of groups.io designates 66.175.222.108 as permitted sender) smtp.mailfrom=bounce+27952+72313+1787277+3901457@groups.io; dmarc=fail(p=none dis=none) header.from=intel.com ARC-Seal: i=1; a=rsa-sha256; t=1614652147; cv=none; d=zohomail.com; s=zohoarc; b=gD4CDh/nVKjuCy7ZEbGQ7D7CHag8DJ8oErUeoDtqQjV+rZ4x+N/yFFibc/W3YtuUraf8YpuxejmM92EsE8I+RzAE61tCoMsn02iTgmkkicepuVIvluCXySL9JQ8qJ6BZDFfnwPOuOGeWBx4e88ItGNAKBMNSJcPyyYBCvTdqU+k= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1614652147; h=Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Id:List-Unsubscribe:MIME-Version:Message-ID:Reply-To:References:Sender:Subject:To; bh=UmvN3r+g/fH0e+BpK+C/JT2PZgyCNrM5yiESADdF3CY=; b=gyl5TfOfHVdvaJ7pIY2zPdueHATi9u4HZcJdO+6Q/ohzdIdPC2GUG1cHQJZcfpTkE69fq+Fnd07R+H7/eKIUpNH+PcvQ7SOTN0xgBWTQPbxNyRc3JM+wiFp3qCnQQ3bk1aNLX0tTVhBoEoZRXKCcye6R6Z9T2b1z+uyXp2VqRc0= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of groups.io designates 66.175.222.108 as permitted sender) smtp.mailfrom=bounce+27952+72313+1787277+3901457@groups.io; dmarc=fail header.from= (p=none dis=none) header.from= Received: from mail02.groups.io (mail02.groups.io [66.175.222.108]) by mx.zohomail.com with SMTPS id 1614652147359996.2408591417656; Mon, 1 Mar 2021 18:29:07 -0800 (PST) Return-Path: X-Received: by 127.0.0.2 with SMTP id aWLEYY1788612xricie6mAf3; Mon, 01 Mar 2021 18:29:07 -0800 X-Received: from mga02.intel.com (mga02.intel.com []) by mx.groups.io with SMTP id smtpd.web11.3132.1614652142744425290 for ; Mon, 01 Mar 2021 18:29:05 -0800 IronPort-SDR: eIJImEL9ikjhmtiFtXOYxmXuE5ddN9/5LVJV7lWaXsqG53kh699gSsuTcc8mpE6Woua7lLK+qX 79/fddWU4YMg== X-IronPort-AV: E=McAfee;i="6000,8403,9910"; a="173797235" X-IronPort-AV: E=Sophos;i="5.81,216,1610438400"; d="scan'208";a="173797235" X-Received: from fmsmga004.fm.intel.com ([10.253.24.48]) by orsmga101.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 01 Mar 2021 18:29:02 -0800 IronPort-SDR: OMcIcvG97p9d8wd1G007JbnhfKEJ+JGssASkExBXPHoK+UJLYgwZK4gxBj087yjnFWpZVd0HZ1 HVj5LdeYx61A== X-IronPort-AV: E=Sophos;i="5.81,216,1610438400"; d="scan'208";a="427169873" X-Received: from nldesimo-desk1.amr.corp.intel.com ([10.212.174.59]) by fmsmga004-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 01 Mar 2021 18:29:02 -0800 From: "Nate DeSimone" To: devel@edk2.groups.io Cc: Isaac Oram , Sai Chaganty , Liming Gao , Michael Kubacki Subject: [edk2-devel] [edk2-platforms] [PATCH v1 5/9] IpmiFeaturePkg: Add GenericIpmi PEIM Date: Mon, 1 Mar 2021 18:28:00 -0800 Message-Id: <20210302022804.8641-6-nathaniel.l.desimone@intel.com> In-Reply-To: <20210302022804.8641-1-nathaniel.l.desimone@intel.com> References: <20210302022804.8641-1-nathaniel.l.desimone@intel.com> MIME-Version: 1.0 Precedence: Bulk List-Unsubscribe: Sender: devel@edk2.groups.io List-Id: Mailing-List: list devel@edk2.groups.io; contact devel+owner@edk2.groups.io Reply-To: devel@edk2.groups.io,nathaniel.l.desimone@intel.com X-Gm-Message-State: tB7i24FZWAUPi5j7O5U6cMLdx1787277AA= Content-Transfer-Encoding: quoted-printable DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=groups.io; q=dns/txt; s=20140610; t=1614652147; bh=C+5MWpRMz6Y3DTtgrxmnmQinMIbr30l0s1NDhOW9U4E=; h=Cc:Date:From:Reply-To:Subject:To; b=w5CeddqStSvx+ywyrYtngkCtRtZYXTZHndxXBHuJeBcbYMGHFIZb7TvQn+13FGheFdx 1HMLOJsgXIrAnWzHPvb7lHeInW7jkZA07Ud5W15ze8irxbji8aLd/FqA8D6oaAK6pVmwq /UMTyavVWO+JTAExv/3QLFkk8vLx92GurYw= X-ZohoMail-DKIM: pass (identity @groups.io) Content-Type: text/plain; charset="utf-8" From: Isaac Oram REF: https://bugzilla.tianocore.org/show_bug.cgi?id=3D3242 Adds the PEI version of the generic IPMI transport driver. Cc: Sai Chaganty Cc: Liming Gao Cc: Michael Kubacki Signed-off-by: Isaac Oram Co-authored-by: Nate DeSimone Acked-by: Michael Kubacki Reviewed-by: Sai Chaganty --- .../GenericIpmi/Pei/PeiGenericIpmi.c | 362 ++++++++++++++++++ .../GenericIpmi/Pei/PeiGenericIpmi.h | 138 +++++++ .../GenericIpmi/Pei/PeiGenericIpmi.inf | 58 +++ .../GenericIpmi/Pei/PeiIpmiBmc.c | 277 ++++++++++++++ .../GenericIpmi/Pei/PeiIpmiBmc.h | 38 ++ .../GenericIpmi/Pei/PeiIpmiBmcDef.h | 156 ++++++++ 6 files changed, 1029 insertions(+) create mode 100644 Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Gener= icIpmi/Pei/PeiGenericIpmi.c create mode 100644 Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Gener= icIpmi/Pei/PeiGenericIpmi.h create mode 100644 Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Gener= icIpmi/Pei/PeiGenericIpmi.inf create mode 100644 Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Gener= icIpmi/Pei/PeiIpmiBmc.c create mode 100644 Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Gener= icIpmi/Pei/PeiIpmiBmc.h create mode 100644 Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Gener= icIpmi/Pei/PeiIpmiBmcDef.h diff --git a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/GenericIpmi/= Pei/PeiGenericIpmi.c b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Ge= nericIpmi/Pei/PeiGenericIpmi.c new file mode 100644 index 0000000000..31f613925d --- /dev/null +++ b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/GenericIpmi/Pei/Pei= GenericIpmi.c @@ -0,0 +1,362 @@ +/** @file + Generic IPMI stack during PEI phase + + @copyright + Copyright 2017 - 2021 Intel Corporation.
+ SPDX-License-Identifier: BSD-2-Clause-Patent +**/ + +#include +#include "PeiGenericIpmi.h" +#include + + +//////////////////////////////////////////////////////////////////////////= ///// +// Function Implementations +// + +/*************************************************************************= **** + @brief + Internal function + + @param[in] PeiServices General purpose services available to eve= ry PEIM. + + @retval EFI_SUCCESS Always return EFI_SUCCESS +**/ +EFI_STATUS +EFIAPI +PeiInitializeIpmiKcsPhysicalLayer ( + IN CONST EFI_PEI_SERVICES **PeiServices + ) +{ + EFI_STATUS Status; + PEI_IPMI_BMC_INSTANCE_DATA *mIpmiInstance; + + mIpmiInstance =3D NULL; + + // + // Send Pre-Boot signal to BMC + // + if (PcdGetBool (PcdSignalPreBootToBmc)) { + Status =3D SendPreBootSignaltoBmc (PeiServices); + if (EFI_ERROR (Status)) { + return Status; + } + } + + // + // Enable OEM specific southbridge SIO KCS I/O address range 0xCA0 to 0x= CAF at here + // if the the I/O address range has not been enabled. + // + + mIpmiInstance =3D AllocateZeroPool (sizeof (PEI_IPMI_BMC_INSTANCE_DATA)); + if (mIpmiInstance =3D=3D NULL) { + DEBUG ((EFI_D_ERROR,"IPMI Peim:EFI_OUT_OF_RESOURCES of memory allocati= on\n")); + return EFI_OUT_OF_RESOURCES; + } + + // + // Calibrate TSC Counter. Stall for 10ms, then multiply the resulting n= umber of + // ticks in that period by 100 to get the number of ticks in a 1 second = timeout + // + DEBUG ((DEBUG_INFO,"IPMI Peim:IPMI STACK Initialization\n")); + mIpmiInstance->KcsTimeoutPeriod =3D (BMC_KCS_TIMEOUT_PEI *1000*1000) / K= CS_DELAY_UNIT_PEI; + DEBUG ((EFI_D_INFO,"IPMI Peim:KcsTimeoutPeriod =3D 0x%x\n", mIpmiInstanc= e->KcsTimeoutPeriod)); + + // + // Initialize IPMI IO Base. + // + mIpmiInstance->IpmiIoBase =3D PcdGet16 (PcdIpmiI= oBaseAddress); + DEBUG ((EFI_D_INFO,"IPMI Peim:IpmiIoBase=3D0x%x\n",mIpmiInstance->IpmiIo= Base)); + mIpmiInstance->Signature =3D SM_IPMI_BMC_SIGNAT= URE; + mIpmiInstance->SlaveAddress =3D BMC_SLAVE_ADDRESS; + mIpmiInstance->BmcStatus =3D BMC_NOTREADY; + mIpmiInstance->IpmiTransportPpi.IpmiSubmitCommand =3D PeiIpmiSendCommand; + mIpmiInstance->IpmiTransportPpi.GetBmcStatus =3D PeiGetIpmiBmcStatu= s; + + mIpmiInstance->PeiIpmiBmcDataDesc.Flags =3D EFI_PEI_PPI_DESCRIPT= OR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST; + mIpmiInstance->PeiIpmiBmcDataDesc.Guid =3D &gPeiIpmiTransportPp= iGuid; + mIpmiInstance->PeiIpmiBmcDataDesc.Ppi =3D &mIpmiInstance->Ipmi= TransportPpi; + + // + // Get the Device ID and check if the system is in Force Update mode. + // + Status =3D GetDeviceId (mIpmiInstance); + if (EFI_ERROR (Status)) { + DEBUG ((EFI_D_ERROR,"IPMI Peim:Get BMC Device Id Failed. Status=3D%r\n= ",Status)); + } + + // + // Do not continue initialization if the BMC is in Force Update Mode. + // + if (mIpmiInstance->BmcStatus =3D=3D BMC_UPDATE_IN_PROGRESS || mIpmiInsta= nce->BmcStatus =3D=3D BMC_HARDFAIL) { + return EFI_UNSUPPORTED; + } + + // + // Just produce PPI + // + Status =3D PeiServicesInstallPpi (&mIpmiInstance->PeiIpmiBmcDataDesc); + if (EFI_ERROR (Status)) { + return Status; + } + + return EFI_SUCCESS; +} + +/*************************************************************************= **** + @bref + PRE-BOOT signal will be sent in very early PEI phase, to enable necessar= y KCS access for host boot. + + @param[in] PeiServices General purpose services available to ev= ery PEIM. + + @retval EFI_SUCCESS Indicates that the signal is sent successfully. +**/ +EFI_STATUS +SendPreBootSignaltoBmc ( + IN CONST EFI_PEI_SERVICES **PeiServices + ) +{ + EFI_STATUS Status; + EFI_PEI_CPU_IO_PPI *CpuIoPpi; + UINT32 ProvisionPort =3D 0; + UINT8 PreBoot =3D 0; + + // + // Locate CpuIo service + // + CpuIoPpi =3D (**PeiServices).CpuIo; + ProvisionPort =3D PcdGet32 (PcdSioMailboxBaseAddress) + MBXDAT_B; + PreBoot =3D 0x01;// PRE-BOOT + + Status =3D CpuIoPpi->Io.Write ( + PeiServices, + CpuIoPpi, + EfiPeiCpuIoWidthUint8, + ProvisionPort, + 1, + &PreBoot + ); + if (EFI_ERROR (Status)) { + DEBUG ((EFI_D_ERROR, "SendPreBootSignaltoBmc () Write PRE-BOOT Status= =3D%r\n", Status)); + return Status; + } + + return EFI_SUCCESS; +} + +/*************************************************************************= **** + @bref + The entry point of the Ipmi PEIM. Instals Ipmi PPI interface. + + @param FileHandle Handle of the file being invoked. + @param PeiServices Describes the list of possible PEI Services. + + @retval EFI_SUCCESS Indicates that Ipmi initialization completed succe= ssfully. +**/ +EFI_STATUS +PeimIpmiInterfaceInit ( + IN EFI_PEI_FILE_HANDLE FileHandle, + IN CONST EFI_PEI_SERVICES **PeiServices + ) +{ + EFI_STATUS Status; + + + // + // Performing Ipmi KCS physical layer initialization + // + Status =3D PeiInitializeIpmiKcsPhysicalLayer (PeiServices); + + return EFI_SUCCESS; +} // PeimIpmiInterfaceInit() + + +EFI_STATUS +PeiIpmiSendCommand ( + IN PEI_IPMI_TRANSPORT_PPI *This, + IN UINT8 NetFunction, + IN UINT8 Lun, + IN UINT8 Command, + IN UINT8 *CommandData, + IN UINT32 CommandDataSize, + IN OUT UINT8 *ResponseData, + IN OUT UINT32 *ResponseDataSize + ) +/*++ + +Routine Description: + + Send Ipmi Command in the right mode: HECI or KCS, to the + appropiate device, ME or BMC. + +Arguments: + + This - Pointer to IPMI protocol instance + NetFunction - Net Function of command to send + Lun - LUN of command to send + Command - IPMI command to send + CommandData - Pointer to command data buffer, if needed + CommandDataSize - Size of command data buffer + ResponseData - Pointer to response data buffer + ResponseDataSize - Pointer to response data buffer size + +Returns: + + EFI_INVALID_PARAMETER - One of the input values is bad + EFI_DEVICE_ERROR - IPMI command failed + EFI_BUFFER_TOO_SMALL - Response buffer is too small + EFI_UNSUPPORTED - Command is not supported by BMC + EFI_SUCCESS - Command completed successfully + +--*/ +{ + // + // This Will be unchanged ( BMC/KCS style ) + // + return PeiIpmiSendCommandToBmc ( + This, + NetFunction, + Lun, + Command, + CommandData, + (UINT8) CommandDataSize, + ResponseData, + (UINT8 *) ResponseDataSize, + NULL + ); +} // IpmiSendCommand() + +EFI_STATUS +PeiGetIpmiBmcStatus ( + IN PEI_IPMI_TRANSPORT_PPI *This, + OUT BMC_STATUS *BmcStatus, + OUT SM_COM_ADDRESS *ComAddress + ) +/*++ + +Routine Description: + + Updates the BMC status and returns the Com Address + +Arguments: + + This - Pointer to IPMI protocol instance + BmcStatus - BMC status + ComAddress - Com Address + +Returns: + + EFI_SUCCESS - Success + +--*/ +{ + return PeiIpmiBmcStatus ( + This, + BmcStatus, + ComAddress, + NULL + ); +} + + +EFI_STATUS +GetDeviceId ( + IN PEI_IPMI_BMC_INSTANCE_DATA *mIpmiInstance + ) +/*++ + +Routine Description: + Execute the Get Device ID command to determine whether or not the BMC is= in Force Update + Mode. If it is, then report it to the error manager. + +Arguments: + mIpmiInstance - Data structure describing BMC variables and used for s= ending commands + StatusCodeValue - An array used to accumulate error codes for later repo= rting. + ErrorCount - Counter used to keep track of error codes in StatusCod= eValue + +Returns: + Status + +--*/ +{ + EFI_STATUS Status; + UINT32 DataSize; + SM_CTRL_INFO *pBmcInfo; + UINTN Retries; + + // + // Set up a loop to retry for up to PcdIpmiBmcReadyDelayTimer seconds. C= alculate retries not timeout + // so that in case KCS is not enabled and IpmiSendCommand() returns + // immediately we will not wait all the PcdIpmiBmcReadyDelayTimer second= s. + // + Retries =3D PcdGet8 (PcdIpmiBmcReadyDelayTimer); + // + // Get the device ID information for the BMC. + // + DataSize =3D sizeof (mIpmiInstance->TempData); + while (EFI_ERROR (Status =3D PeiIpmiSendCommand ( + &mIpmiInstance->IpmiTransportPpi, + IPMI_NETFN_APP, + 0, + IPMI_APP_GET_DEVICE_ID, + NULL, + 0, + mIpmiInstance->TempData, + &DataSize + ))) { + DEBUG ((EFI_D_ERROR, "[IPMI] BMC does not respond (status: %r), %d ret= ries left\n", + Status, Retries)); + + if (Retries-- =3D=3D 0) { + ReportStatusCode (EFI_ERROR_CODE | EFI_ERROR_MAJOR, EFI_COMPUTING_UN= IT_FIRMWARE_PROCESSOR | EFI_CU_FP_EC_COMM_ERROR); + mIpmiInstance->BmcStatus =3D BMC_HARDFAIL; + return Status; + } + // + // Handle the case that BMC FW still not enable KCS channel after AC c= ycle. just stall 1 second + // + MicroSecondDelay (1*1000*1000); + } + pBmcInfo =3D (SM_CTRL_INFO*) &mIpmiInstance->TempData[0]; + DEBUG ((DEBUG_INFO, "[IPMI PEI] BMC Device ID: 0x%02X, firmware version:= %d.%02X UpdateMode:%x\n", + pBmcInfo->DeviceId, pBmcInfo->MajorFirmwareRev, pBmcInfo->MinorF= irmwareRev, pBmcInfo->UpdateMode)); + // + // In OpenBMC, UpdateMode: the bit 7 of byte 4 in get device id command = is used for the BMC status: + // 0 means BMC is ready, 1 means BMC is not ready. + // At the very beginning of BMC power on, the status is 1 means BMC is i= n booting process and not ready. It is not the flag for force update mode. + // + if (pBmcInfo->UpdateMode =3D=3D BMC_READY) { + mIpmiInstance->BmcStatus =3D BMC_OK; + return EFI_SUCCESS; + } else { + // + // Updatemode =3D 1 mean BMC is not ready, continue waiting. + // + while (Retries-- !=3D 0) { + MicroSecondDelay(1*1000*1000); //delay 1 seconds + DEBUG ((DEBUG_INFO, "[IPMI PEI] UpdateMode Retries:%x \n",Retries)); + Status =3D PeiIpmiSendCommand ( + &mIpmiInstance->IpmiTransportPpi, + IPMI_NETFN_APP, + 0, + IPMI_APP_GET_DEVICE_ID, + NULL, + 0, + mIpmiInstance->TempData, + &DataSize + ); + if (!EFI_ERROR (Status)) { + pBmcInfo =3D (SM_CTRL_INFO*) &mIpmiInstance->TempData[0]; + DEBUG ((DEBUG_INFO, "[IPMI PEI] UpdateMode Retries:%x pBmcInfo->= UpdateMode:%x\n", Retries, pBmcInfo->UpdateMode)); + if (pBmcInfo->UpdateMode =3D=3D BMC_READY) { + mIpmiInstance->BmcStatus =3D BMC_OK; + return EFI_SUCCESS; + } + } + } + } + + mIpmiInstance->BmcStatus =3D BMC_HARDFAIL; + return Status; +} // GetDeviceId() diff --git a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/GenericIpmi/= Pei/PeiGenericIpmi.h b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Ge= nericIpmi/Pei/PeiGenericIpmi.h new file mode 100644 index 0000000000..d31af85325 --- /dev/null +++ b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/GenericIpmi/Pei/Pei= GenericIpmi.h @@ -0,0 +1,138 @@ +/** @file + Generic IPMI stack head file during PEI phase + + @copyright + Copyright 2017 - 2021 Intel Corporation.
+ SPDX-License-Identifier: BSD-2-Clause-Patent +**/ + +#ifndef _PEI_IPMI_INIT_H_ +#define _PEI_IPMI_INIT_H_ + +#include +#include + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "PeiIpmiBmcDef.h" +#include "PeiIpmiBmc.h" + +// +// Prototypes +// +#define MBXDAT_B 0x0B +#define BMC_KCS_TIMEOUT_PEI 5 // [s] Single KSC request = timeout +#define KCS_DELAY_UNIT_PEI 1000 // [s] Each KSC IO delay +#define IPMI_DEFAULT_IO_BASE 0xCA2 + +// +// Internal(hook) function list +// +EFI_STATUS +SendPreBootSignaltoBmc ( + IN CONST EFI_PEI_SERVICES **PeiServices + ) + /*++ + +Routine Description: + Send Pre-Boot signal to BMC + +Arguments: + PeiServices - General purpose services available to every PEIM. + +Returns: + EFI_SUCCESS - Success +--*/ +; + +EFI_STATUS +PeiIpmiSendCommand ( + IN PEI_IPMI_TRANSPORT_PPI *This, + IN UINT8 NetFunction, + IN UINT8 Lun, + IN UINT8 Command, + IN UINT8 *CommandData, + IN UINT32 CommandDataSize, + IN OUT UINT8 *ResponseData, + IN OUT UINT32 *ResponseDataSize + ) +/*++ + +Routine Description: + Send IPMI command to BMC + +Arguments: + This - Pointer to IPMI protocol instance + NetFunction - Net Function of command to send + Lun - LUN of command to send + Command - IPMI command to send + CommandData - Pointer to command data buffer, if needed + CommandDataSize - Size of command data buffer + ResponseData - Pointer to response data buffer + ResponseDataSize - Pointer to response data buffer size + +Returns: + EFI_INVALID_PARAMETER - One of the input values is bad + EFI_DEVICE_ERROR - IPMI command failed + EFI_BUFFER_TOO_SMALL - Response buffer is too small + EFI_UNSUPPORTED - Command is not supported by BMC + EFI_SUCCESS - Command completed successfully +--*/ +; + +EFI_STATUS +PeiGetIpmiBmcStatus ( + IN PEI_IPMI_TRANSPORT_PPI *This, + OUT BMC_STATUS *BmcStatus, + OUT SM_COM_ADDRESS *ComAddress + ) +/*++ + +Routine Description: + Updates the BMC status and returns the Com Address + +Arguments: + This - Pointer to IPMI protocol instance + BmcStatus - BMC status + ComAddress - Com Address + +Returns: + EFI_SUCCESS - Success +--*/ +; + +// +// internal function list +// +EFI_STATUS +GetDeviceId ( + IN PEI_IPMI_BMC_INSTANCE_DATA *mIpmiInstance + ) +/*++ + +Routine Description: + Execute the Get Device ID command to determine whether or not the BMC is= in Force Update + Mode. If it is, then report it to the error manager. + +Arguments: + mIpmiInstance - Data structure describing BMC variables and used for s= ending commands + StatusCodeValue - An array used to accumulate error codes for later repo= rting. + ErrorCount - Counter used to keep track of error codes in StatusCod= eValue + +Returns: + Status + +--*/ +; +#endif //_PEI_IPMI_INIT_H_ + diff --git a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/GenericIpmi/= Pei/PeiGenericIpmi.inf b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/= GenericIpmi/Pei/PeiGenericIpmi.inf new file mode 100644 index 0000000000..0ef2c18116 --- /dev/null +++ b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/GenericIpmi/Pei/Pei= GenericIpmi.inf @@ -0,0 +1,58 @@ +## @file +# Generic IPMI during PEI phase +# +# @copyright +# Copyright 2017 - 2021 Intel Corporation.
+# SPDX-License-Identifier: BSD-2-Clause-Patent +## + +[Defines] + INF_VERSION =3D 0x00010005 + BASE_NAME =3D PeiGenericIpmi + FILE_GUID =3D 0B161208-2958-460C-B97F-B912A8AD0F8D + MODULE_TYPE =3D PEIM + VERSION_STRING =3D 1.0 + ENTRY_POINT =3D PeimIpmiInterfaceInit + +# +# The following information is for reference only and not required by the = build tools. +# +# VALID_ARCHITECTURES =3D IA32 X64 +# +# HOB Guid C Name: gEfiHtBistHobGuid Hob Type: GUID_EXTENSION +# +[Sources] + ../Common/IpmiBmcCommon.h + ../Common/KcsBmc.c + ../Common/KcsBmc.h + PeiIpmiBmc.c + PeiIpmiBmc.h + PeiIpmiBmcDef.h + PeiGenericIpmi.c + PeiGenericIpmi.h + +[Packages] + MdePkg/MdePkg.dec + OutOfBandManagement/IpmiFeaturePkg/IpmiFeaturePkg.dec + +[LibraryClasses] + PeimEntryPoint + PciLib + MemoryAllocationLib + DebugLib + IoLib + TimerLib + +[Guids] + +[Ppis] + gPeiIpmiTransportPpiGuid #ALWAYS PRODUCE + +[Pcd] + gIpmiFeaturePkgTokenSpaceGuid.PcdIpmiIoBaseAddress + gIpmiFeaturePkgTokenSpaceGuid.PcdIpmiBmcReadyDelayTimer + gIpmiFeaturePkgTokenSpaceGuid.PcdSioMailboxBaseAddress + gIpmiFeaturePkgTokenSpaceGuid.PcdSignalPreBootToBmc + +[Depex] + TRUE diff --git a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/GenericIpmi/= Pei/PeiIpmiBmc.c b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Generi= cIpmi/Pei/PeiIpmiBmc.c new file mode 100644 index 0000000000..32665b3e22 --- /dev/null +++ b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/GenericIpmi/Pei/Pei= IpmiBmc.c @@ -0,0 +1,277 @@ +/** @file + Generic IPMI transport layer during PEI phase + + @copyright + Copyright 2016 - 2021 Intel Corporation.
+ SPDX-License-Identifier: BSD-2-Clause-Patent +**/ + +#include "PeiIpmiBmc.h" + +EFI_STATUS +UpdateErrorStatus ( + IN UINT8 BmcError, + PEI_IPMI_BMC_INSTANCE_DATA *IpmiInstance + ) +/*++ + +Routine Description: + + Check if the completion code is a Soft Error and increment the count. T= he count + is not updated if the BMC is in Force Update Mode. + +Arguments: + + BmcError - Completion code to check + IpmiInstance - BMC instance data + +Returns: + + EFI_SUCCESS - Status + +--*/ +{ + UINT8 Errors[] =3D COMPLETION_CODES; + UINT16 CodeCount; + UINT8 i; + + CodeCount =3D sizeof (Errors) / sizeof (Errors[0]); + for (i =3D 0; i < CodeCount; i++) { + if (BmcError =3D=3D Errors[i]) { + // + // Don't change Bmc Status flag if the BMC is in Force Update Mode. + // + if (IpmiInstance->BmcStatus !=3D BMC_UPDATE_IN_PROGRESS) { + IpmiInstance->BmcStatus =3D BMC_SOFTFAIL; + } + + IpmiInstance->SoftErrorCount++; + break; + } + } + + return EFI_SUCCESS; +} + +EFI_STATUS +PeiIpmiSendCommandToBmc ( + IN PEI_IPMI_TRANSPORT_PPI *This, + IN UINT8 NetFunction, + IN UINT8 Lun, + IN UINT8 Command, + IN UINT8 *CommandData, + IN UINT8 CommandDataSize, + IN OUT UINT8 *ResponseData, + IN OUT UINT8 *ResponseDataSize, + IN VOID *Context + ) +/*++ + +Routine Description: + + Send IPMI command to BMC + +Arguments: + + This - Pointer to IPMI protocol instance + NetFunction - Net Function of command to send + Lun - LUN of command to send + Command - IPMI command to send + CommandData - Pointer to command data buffer, if needed + CommandDataSize - Size of command data buffer + ResponseData - Pointer to response data buffer + ResponseDataSize - Pointer to response data buffer size + Context - Context + +Returns: + + EFI_INVALID_PARAMETER - One of the input values is bad + EFI_DEVICE_ERROR - IPMI command failed + EFI_BUFFER_TOO_SMALL - Response buffer is too small + EFI_UNSUPPORTED - Command is not supported by BMC + EFI_SUCCESS - Command completed successfully + +--*/ +{ + PEI_IPMI_BMC_INSTANCE_DATA *IpmiInstance; + UINT8 DataSize; + EFI_STATUS Status; + IPMI_COMMAND *IpmiCommand; + IPMI_RESPONSE *IpmiResponse; + UINT8 Index; + + IpmiInstance =3D INSTANCE_FROM_PEI_SM_IPMI_BMC_THIS (This); + + // + // The TempData buffer is used for both sending command data and receivi= ng + // response data. Since the command format is different from the respon= se + // format, the buffer is cast to both structure definitions. + // + IpmiCommand =3D (IPMI_COMMAND*) IpmiInstance->TempData; + IpmiResponse =3D (IPMI_RESPONSE*) IpmiInstance->TempData; + + // + // Send IPMI command to BMC + // + IpmiCommand->Lun =3D Lun; + IpmiCommand->NetFunction =3D NetFunction; + IpmiCommand->Command =3D Command; + + // + // Ensure that the buffer is valid before attempting to copy the command= data + // buffer into the IpmiCommand structure. + // + if (CommandDataSize > 0) { + if (CommandData =3D=3D NULL) { + return EFI_INVALID_PARAMETER; + } + + CopyMem ( + IpmiCommand->CommandData, + CommandData, + CommandDataSize + ); + } + + Status =3D SendDataToBmcPort ( + IpmiInstance->KcsTimeoutPeriod, + IpmiInstance->IpmiIoBase, + Context, + (UINT8 *) IpmiCommand, + (CommandDataSize + IPMI_COMMAND_HEADER_SIZE) + ); + + if (Status !=3D EFI_SUCCESS) { + IpmiInstance->BmcStatus =3D BMC_SOFTFAIL; + IpmiInstance->SoftErrorCount++; + DEBUG ((EFI_D_ERROR, "PEI Phase SendDataToBmcPort failed Status:%r\n",= Status)); + return Status; + } + + // + // Get Response to IPMI Command from BMC. + // + DataSize =3D MAX_TEMP_DATA; + Status =3D ReceiveBmcDataFromPort ( + IpmiInstance->KcsTimeoutPeriod, + IpmiInstance->IpmiIoBase, + Context, + (UINT8 *) IpmiResponse, + &DataSize + ); + + if (Status !=3D EFI_SUCCESS) { + IpmiInstance->BmcStatus =3D BMC_SOFTFAIL; + IpmiInstance->SoftErrorCount++; + DEBUG ((EFI_D_ERROR, "PEI Phase ReceiveBmcDataFromPort failed Status:%= r\n", Status)); + return Status; + } + + if ((IpmiResponse->CompletionCode !=3D COMP_CODE_NORMAL) && + (IpmiInstance->BmcStatus =3D=3D BMC_UPDATE_IN_PROGRESS)) { + // + // If the completion code is not normal and the BMC is in Force Update + // mode, then update the error status and return EFI_UNSUPPORTED. + // + UpdateErrorStatus ( + IpmiResponse->CompletionCode, + IpmiInstance + ); + return EFI_UNSUPPORTED; + } else if (IpmiResponse->CompletionCode !=3D COMP_CODE_NORMAL) { + // + // Otherwise if the BMC is in normal mode, but the completion code + // is not normal, then update the error status and return device error. + // + UpdateErrorStatus ( + IpmiResponse->CompletionCode, + IpmiInstance + ); + return EFI_DEVICE_ERROR; + } + + // + // If we got this far without any error codes, but the DataSize is 0 the= n the + // command response failed, so do not continue. + // + // + // Some abnormal case, in order to avoid that BMC sent illegal data size. + // If we got this far without any error codes, but the DataSize less tha= n IPMI_RESPONSE_HEADER_SIZE, then the + // command response failed, so do not continue. + if (DataSize < IPMI_RESPONSE_HEADER_SIZE) { + return EFI_DEVICE_ERROR; + } + + // + // Verify the response data buffer passed in is big enough. + // + if ((DataSize - IPMI_RESPONSE_HEADER_SIZE) > *ResponseDataSize) { + return EFI_BUFFER_TOO_SMALL; + } + + // + // Copy data over to the response data buffer. + // + *ResponseDataSize =3D DataSize - IPMI_RESPONSE_HEADER_SIZE; + CopyMem ( + ResponseData, + IpmiResponse->ResponseData, + *ResponseDataSize + ); + + // + // Add completion code in response data to meet the requirement of IPMI = spec 2.0 + // + *ResponseDataSize +=3D 1; // Add one byte for Completion Code + for (Index =3D 1; Index < *ResponseDataSize; Index++) { + ResponseData [*ResponseDataSize - Index] =3D ResponseData [*ResponseDa= taSize - (Index + 1)]; + } + ResponseData [0] =3D IpmiResponse->CompletionCode; + + IpmiInstance->BmcStatus =3D BMC_OK; + return EFI_SUCCESS; +} + + +EFI_STATUS +PeiIpmiBmcStatus ( + IN PEI_IPMI_TRANSPORT_PPI *This, + OUT BMC_STATUS *BmcStatus, + OUT SM_COM_ADDRESS *ComAddress, + IN VOID *Context + ) +/*++ + +Routine Description: + + Updates the BMC status and returns the Com Address + +Arguments: + + This - Pointer to IPMI protocol instance + BmcStatus - BMC status + ComAddress - Com Address + Context - Context + +Returns: + + EFI_SUCCESS - Success + +--*/ +{ + PEI_IPMI_BMC_INSTANCE_DATA *IpmiInstance; + + IpmiInstance =3D INSTANCE_FROM_PEI_SM_IPMI_BMC_THIS (This); + + if ((IpmiInstance->BmcStatus =3D=3D BMC_SOFTFAIL) && (IpmiInstance->Soft= ErrorCount >=3D MAX_SOFT_COUNT)) { + IpmiInstance->BmcStatus =3D BMC_HARDFAIL; + } + + *BmcStatus =3D IpmiInstance->BmcStatus; + ComAddress->ChannelType =3D SmBmc; + ComAddress->Address.BmcAddress.LunAddress =3D 0x0; + ComAddress->Address.BmcAddress.SlaveAddress =3D IpmiInstance->SlaveAddre= ss; + ComAddress->Address.BmcAddress.ChannelAddress =3D 0x0; + + return EFI_SUCCESS; +} diff --git a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/GenericIpmi/= Pei/PeiIpmiBmc.h b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Generi= cIpmi/Pei/PeiIpmiBmc.h new file mode 100644 index 0000000000..40b9429e84 --- /dev/null +++ b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/GenericIpmi/Pei/Pei= IpmiBmc.h @@ -0,0 +1,38 @@ +/** @file + Generic IPMI transport layer head file during PEI phase + + @copyright + Copyright 2016 - 2021 Intel Corporation.
+ SPDX-License-Identifier: BSD-2-Clause-Patent +**/ + +#ifndef _PEI_IPMI_BMC_H_ +#define _PEI_IPMI_BMC_H_ + +#include +#include +#include +#include +#include +#include +#include + +#include + +#include "PeiIpmiBmcDef.h" +#include "KcsBmc.h" + +// +// IPMI Instance signature +// +#define SM_IPMI_BMC_SIGNATURE SIGNATURE_32 ('i', 'p', 'm', 'i') + +#define INSTANCE_FROM_PEI_SM_IPMI_BMC_THIS(a) \ + CR ( \ + a, \ + PEI_IPMI_BMC_INSTANCE_DATA, \ + IpmiTransportPpi, \ + SM_IPMI_BMC_SIGNATURE \ + ) + +#endif // _PEI_IPMI_BMC_H_ diff --git a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/GenericIpmi/= Pei/PeiIpmiBmcDef.h b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Gen= ericIpmi/Pei/PeiIpmiBmcDef.h new file mode 100644 index 0000000000..3fbe70ce62 --- /dev/null +++ b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/GenericIpmi/Pei/Pei= IpmiBmcDef.h @@ -0,0 +1,156 @@ +/** @file + Generic IPMI transport layer common head file during PEI phase + + @copyright + Copyright 2016 - 2021 Intel Corporation.
+ SPDX-License-Identifier: BSD-2-Clause-Patent +**/ + +#ifndef _PEI_IPMI_COMMON_BMC_H_ +#define _PEI_IPMI_COMMON_BMC_H_ + +#include + +#define MAX_TEMP_DATA 160 +#define BMC_SLAVE_ADDRESS 0x20 +#define MAX_SOFT_COUNT 10 +#define COMP_CODE_NORMAL 0x00 + +// +// IPMI command completion codes to check for in the UpdateErrorStatus rou= tine. +// These completion codes indicate a soft error and a running total of the= occurrences +// of these errors is maintained. +// +#define COMP_CODE_NODE_BUSY 0xC0 +#define COMP_CODE_TIMEOUT 0xC3 +#define COMP_CODE_OUT_OF_SPACE 0xC4 +#define COMP_CODE_OUT_OF_RANGE 0xC9 +#define COMP_CODE_CMD_RESP_NOT_PROVIDED 0xCE +#define COMP_CODE_FAIL_DUP_REQUEST 0xCF +#define COMP_CODE_SDR_REP_IN_UPDATE_MODE 0xD0 +#define COMP_CODE_DEV_IN_FW_UPDATE_MODE 0xD1 +#define COMP_CODE_BMC_INIT_IN_PROGRESS 0xD2 +#define COMP_CODE_UNSPECIFIED 0xFF + +#define COMPLETION_CODES \ + { \ + COMP_CODE_NODE_BUSY, COMP_CODE_TIMEOUT, COMP_CODE_OUT_OF_SPACE, COMP_C= ODE_OUT_OF_RANGE, \ + COMP_CODE_CMD_RESP_NOT_PROVIDED, COMP_CODE_FAIL_DUP_REQUEST, COMP_CODE= _SDR_REP_IN_UPDATE_MODE, \ + COMP_CODE_DEV_IN_FW_UPDATE_MODE, COMP_CODE_BMC_INIT_IN_PROGRESS, COMP_= CODE_UNSPECIFIED \ + } +// +// Ensure proper structure formats +// +#pragma pack(1) +// +// Pei Ipmi instance data +// +typedef struct { + UINTN Signature; + UINT64 KcsTimeoutPeriod; + UINT8 SlaveAddress; + UINT8 TempData[MAX_TEMP_DATA]; + BMC_STATUS BmcStatus; + UINT64 ErrorStatus; + UINT8 SoftErrorCount; + UINT16 IpmiIoBase; + PEI_IPMI_TRANSPORT_PPI IpmiTransportPpi; + EFI_PEI_PPI_DESCRIPTOR PeiIpmiBmcDataDesc; +} PEI_IPMI_BMC_INSTANCE_DATA; + +// +// Structure of IPMI Command buffer +// +#define IPMI_COMMAND_HEADER_SIZE 2 + +typedef struct { + UINT8 Lun : 2; + UINT8 NetFunction : 6; + UINT8 Command; + UINT8 CommandData[MAX_TEMP_DATA - IPMI_COMMAND_HEADER_SIZE]; +} IPMI_COMMAND; + +// +// Structure of IPMI Command response buffer +// +#define IPMI_RESPONSE_HEADER_SIZE 3 + +typedef struct { + UINT8 Lun : 2; + UINT8 NetFunction : 6; + UINT8 Command; + UINT8 CompletionCode; + UINT8 ResponseData[MAX_TEMP_DATA - IPMI_RESPONSE_HEADER_SIZE]; +} IPMI_RESPONSE; +#pragma pack() + +EFI_STATUS +PeiIpmiSendCommandToBmc ( + IN PEI_IPMI_TRANSPORT_PPI *This, + IN UINT8 NetFunction, + IN UINT8 Lun, + IN UINT8 Command, + IN UINT8 *CommandData, + IN UINT8 CommandDataSize, + IN OUT UINT8 *ResponseData, + IN OUT UINT8 *ResponseDataSize, + IN VOID *Context + ) +/*++ + +Routine Description: + + Send IPMI command to BMC + +Arguments: + + This - Pointer to IPMI protocol instance + NetFunction - Net Function of command to send + Lun - LUN of command to send + Command - IPMI command to send + CommandData - Pointer to command data buffer, if needed + CommandDataSize - Size of command data buffer + ResponseData - Pointer to response data buffer + ResponseDataSize - Pointer to response data buffer size + Context - Context + +Returns: + + EFI_INVALID_PARAMETER - One of the input values is bad + EFI_DEVICE_ERROR - IPMI command failed + EFI_BUFFER_TOO_SMALL - Response buffer is too small + EFI_SUCCESS - Command completed successfully + +--*/ +; + + +EFI_STATUS +PeiIpmiBmcStatus ( + IN PEI_IPMI_TRANSPORT_PPI *This, + OUT BMC_STATUS *BmcStatus, + OUT SM_COM_ADDRESS *ComAddress, + IN VOID *Context + ) +/*++ + +Routine Description: + + Updates the BMC status and returns the Com Address + +Arguments: + + This - Pointer to IPMI protocol instance + BmcStatus - BMC status + ComAddress - Com Address + Context - Context + +Returns: + + EFI_SUCCESS - Success + +--*/ +; + + +#endif //_PEI_IPMI_COMMON_BMC_H_ --=20 2.27.0.windows.1 -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#72313): https://edk2.groups.io/g/devel/message/72313 Mute This Topic: https://groups.io/mt/81016655/1787277 Group Owner: devel+owner@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [importer@patchew.org] -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D- From nobody Thu May 16 03:18:39 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of groups.io designates 66.175.222.108 as permitted sender) client-ip=66.175.222.108; envelope-from=bounce+27952+72309+1787277+3901457@groups.io; helo=mail02.groups.io; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of groups.io designates 66.175.222.108 as permitted sender) smtp.mailfrom=bounce+27952+72309+1787277+3901457@groups.io; dmarc=fail(p=none dis=none) header.from=intel.com ARC-Seal: i=1; a=rsa-sha256; t=1614652150; cv=none; d=zohomail.com; s=zohoarc; b=ZI1+WmAbD7ow5f2JGlrA/8EHSG+NvraDEPTmyEU93+z3rmWdBz2GBpfspgbIxdph2kj/nIRH/DFKSadiW8RzbnDFn0k2LJxWeFZy2EJaKj179+gP60ld0z5V/2D+v7fVudQSRf07tKc7+5qyfqPvqg+fob0XgGW7wt6vxyobd4M= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1614652150; h=Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Id:List-Unsubscribe:MIME-Version:Message-ID:Reply-To:References:Sender:Subject:To; bh=KXLtggIcmNqXM5toCm2hCV3+k/iZzfwJLX80DePniII=; b=e2/puhGqixRZ9tOIEK+9FY+ds5jS0r/gAPyleJ3ZZQUzn1yTswwFy+H9ZLrJqJRH+OS567sCMnY+hr9GHqlfWIfnYR22NjvPAAZsvNPPi+MOPl6u/sxy7mJDWAdgsByHnlOSk2cxAj1+qp767l/W8GbnaRIBzKRZ38faTPkrZ3M= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of groups.io designates 66.175.222.108 as permitted sender) smtp.mailfrom=bounce+27952+72309+1787277+3901457@groups.io; dmarc=fail header.from= (p=none dis=none) header.from= Received: from mail02.groups.io (mail02.groups.io [66.175.222.108]) by mx.zohomail.com with SMTPS id 1614652150977694.3695025396173; Mon, 1 Mar 2021 18:29:10 -0800 (PST) Return-Path: X-Received: by 127.0.0.2 with SMTP id IHmgYY1788612xDCNzuC3hAq; Mon, 01 Mar 2021 18:29:10 -0800 X-Received: from mga06.intel.com (mga06.intel.com []) by mx.groups.io with SMTP id smtpd.web11.3133.1614652144393136110 for ; Mon, 01 Mar 2021 18:29:04 -0800 IronPort-SDR: QCHrrtIJL1LG2g/pOeX6lkD+HuZO2ppp1oYS2DXCn41OaVOh9V3ps/vmoP7AJIN6kQYD2x6UDP Fn2Z1f1eHRRw== X-IronPort-AV: E=McAfee;i="6000,8403,9910"; a="248069509" X-IronPort-AV: E=Sophos;i="5.81,216,1610438400"; d="scan'208";a="248069509" X-Received: from fmsmga004.fm.intel.com ([10.253.24.48]) by orsmga104.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 01 Mar 2021 18:29:03 -0800 IronPort-SDR: 7RVubm4t0Rfrxh6szOJWpaUyWwInJEd5nKtAcKoVJZ4PHXvECm2XDXo2IgZLl/3kdsO6Zd3bv4 q/89j0Ty5xyA== X-IronPort-AV: E=Sophos;i="5.81,216,1610438400"; d="scan'208";a="427169876" X-Received: from nldesimo-desk1.amr.corp.intel.com ([10.212.174.59]) by fmsmga004-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 01 Mar 2021 18:29:02 -0800 From: "Nate DeSimone" To: devel@edk2.groups.io Cc: Isaac Oram , Sai Chaganty , Liming Gao , Michael Kubacki Subject: [edk2-devel] [edk2-platforms] [PATCH v1 6/9] IpmiFeaturePkg: Add GenericIpmi DXE Driver Date: Mon, 1 Mar 2021 18:28:01 -0800 Message-Id: <20210302022804.8641-7-nathaniel.l.desimone@intel.com> In-Reply-To: <20210302022804.8641-1-nathaniel.l.desimone@intel.com> References: <20210302022804.8641-1-nathaniel.l.desimone@intel.com> MIME-Version: 1.0 Precedence: Bulk List-Unsubscribe: Sender: devel@edk2.groups.io List-Id: Mailing-List: list devel@edk2.groups.io; contact devel+owner@edk2.groups.io Reply-To: devel@edk2.groups.io,nathaniel.l.desimone@intel.com X-Gm-Message-State: UEhcxjRP9XWcSdijghqwJDvlx1787277AA= Content-Transfer-Encoding: quoted-printable DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=groups.io; q=dns/txt; s=20140610; t=1614652150; bh=TG/pTtk3l75rYmn8N530MJNvTyRQ7scqsYkeyy9OZKM=; h=Cc:Date:From:Reply-To:Subject:To; b=GMXfm0Ha+G6i3DzEEPm7BDUp59l64DfqT8iZHwpQhVPneQxXCrZF7oAXV27GtaPIxR+ HdoG10kDXu6JPEbXc5MOzibbR/Dhg03LQPhxfRZmYkxUhmgObWofMMFcTAh4sp6LDzSaL Ve1/5O6qvpPJoF7gG1Fxpp0p353WWet48Eg= X-ZohoMail-DKIM: pass (identity @groups.io) Content-Type: text/plain; charset="utf-8" From: Isaac Oram REF: https://bugzilla.tianocore.org/show_bug.cgi?id=3D3242 Adds the DXE version of the generic IPMI transport driver. Cc: Sai Chaganty Cc: Liming Gao Cc: Michael Kubacki Signed-off-by: Isaac Oram Co-authored-by: Nate DeSimone Acked-by: Michael Kubacki Reviewed-by: Sai Chaganty --- .../GenericIpmi/Dxe/GenericIpmi.c | 46 ++ .../GenericIpmi/Dxe/GenericIpmi.inf | 66 +++ .../IpmiFeaturePkg/GenericIpmi/Dxe/IpmiInit.c | 452 ++++++++++++++++++ 3 files changed, 564 insertions(+) create mode 100644 Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Gener= icIpmi/Dxe/GenericIpmi.c create mode 100644 Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Gener= icIpmi/Dxe/GenericIpmi.inf create mode 100644 Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Gener= icIpmi/Dxe/IpmiInit.c diff --git a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/GenericIpmi/= Dxe/GenericIpmi.c b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Gener= icIpmi/Dxe/GenericIpmi.c new file mode 100644 index 0000000000..957a9c8e6e --- /dev/null +++ b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/GenericIpmi/Dxe/Gen= ericIpmi.c @@ -0,0 +1,46 @@ +/** @file + Generic IPMI Transport functions.. + + @copyright + Copyright 1999 - 2021 Intel Corporation.
+ SPDX-License-Identifier: BSD-2-Clause-Patent +**/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "IpmiPhysicalLayer.h" + +/*************************************************************************= **** + @brief + This is entry point for IPMI service for BIOS POST. + + @param[in] ImageHandle a handle to driver image + @param[in] SystemTable a pointer to system table + + @retval EFI_SUCCESS The function completed successfully. + @retval EFI_UNSUPPORTED IPMI is not available. +**/ +EFI_STATUS +LocateIpmiInterface ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable + ) +{ + EFI_STATUS Status; + + Status =3D InitializeIpmiKcsPhysicalLayer (ImageHandle, SystemTable); + + // + // keep this interface for other Physical Layer as new interface. + // + + return Status; +} // LocateIpmiInterface() + diff --git a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/GenericIpmi/= Dxe/GenericIpmi.inf b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Gen= ericIpmi/Dxe/GenericIpmi.inf new file mode 100644 index 0000000000..9881f9e3d0 --- /dev/null +++ b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/GenericIpmi/Dxe/Gen= ericIpmi.inf @@ -0,0 +1,66 @@ +## @file +# Generic IPMI DXE Driver. +# +# @copyright +# Copyright 2010 - 2021 Intel Corporation.
+# SPDX-License-Identifier: BSD-2-Clause-Patent +## + +[Defines] + INF_VERSION =3D 0x00010005 + BASE_NAME =3D GenericIpmi + FILE_GUID =3D 07A01ACF-46D5-48de-A63D-74FA92AA8450 + MODULE_TYPE =3D DXE_DRIVER + VERSION_STRING =3D 1.0 + ENTRY_POINT =3D LocateIpmiInterface + +# +# The following information is for reference only and not required by the = build tools. +# +# VALID_ARCHITECTURES =3D IA32 X64 +# +# VIRTUAL_ADDRESS_MAP_CALLBACK =3D VariableAddressChangeEvent +# + +[Sources] + ../Common/IpmiHooks.h + ../Common/IpmiHooks.c + ../Common/IpmiBmcCommon.h + ../Common/KcsBmc.c + ../Common/KcsBmc.h + ../Common/IpmiBmc.h + ../Common/IpmiBmc.c + GenericIpmi.c + IpmiInit.c + + +[Packages] + MdePkg/MdePkg.dec + OutOfBandManagement/IpmiFeaturePkg/IpmiFeaturePkg.dec + +[LibraryClasses] + MemoryAllocationLib + BaseLib + UefiBootServicesTableLib + UefiRuntimeServicesTableLib + DebugLib + DxeServicesTableLib + UefiDriverEntryPoint + IoLib + ReportStatusCodeLib + TimerLib + +[Protocols] + gIpmiTransportProtocolGuid # PROTOCOL ALWAYS_PRODUCED + gEfiVideoPrintProtocolGuid + +[Guids] + +[Pcd] + gIpmiFeaturePkgTokenSpaceGuid.PcdIpmiIoBaseAddress + gIpmiFeaturePkgTokenSpaceGuid.PcdIpmiBmcReadyDelayTimer + +[Depex] + gEfiRuntimeArchProtocolGuid AND + gEfiVariableArchProtocolGuid + diff --git a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/GenericIpmi/= Dxe/IpmiInit.c b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/GenericI= pmi/Dxe/IpmiInit.c new file mode 100644 index 0000000000..1e0c132508 --- /dev/null +++ b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/GenericIpmi/Dxe/Ipm= iInit.c @@ -0,0 +1,452 @@ +/** @file + Generic IPMI stack driver + + @copyright + Copyright 1999 - 2021 Intel Corporation.
+ SPDX-License-Identifier: BSD-2-Clause-Patent +**/ + +#include +#include +#include "IpmiHooks.h" +#include "IpmiBmcCommon.h" +#include "IpmiBmc.h" +#include "IpmiPhysicalLayer.h" +#include +#ifdef FAST_VIDEO_SUPPORT + #include +#endif +#include + + +/*************************************************************************= ***** + * Local variables + */ +IPMI_BMC_INSTANCE_DATA *mIpmiInstance =3D NULL; +EFI_HANDLE mImageHandle; + +// +// Specific test interface +// +VOID +GetDeviceSpecificTestResults ( + IN IPMI_BMC_INSTANCE_DATA *IpmiInstance + ) +/*++ + +Routine Description: + + This is a BMC specific routine to check the device specific self test re= sults as defined + in the Bensley BMC core specification. + +Arguments: + + IpmiInstance - Data structure describing BMC variables and used for sen= ding commands + +Returns: + + VOID + +--*/ +{ + return; +} + +EFI_STATUS +GetSelfTest ( + IN IPMI_BMC_INSTANCE_DATA *IpmiInstance, + IN EFI_STATUS_CODE_VALUE StatusCodeValue[], + IN OUT UINT8 *ErrorCount + ) +/*++ + +Routine Description: + + Execute the Get Self Test results command to determine whether or not th= e BMC self tests + have passed + +Arguments: + + IpmiInstance - Data structure describing BMC variables and used for s= ending commands + StatusCodeValue - An array used to accumulate error codes for later repo= rting. + ErrorCount - Counter used to keep track of error codes in StatusCod= eValue + +Returns: + + EFI_SUCCESS - BMC Self test results are retrieved and saved into B= mcStatus + EFI_DEVICE_ERROR - BMC failed to return self test results. + +--*/ +{ + EFI_STATUS Status; + UINT32 DataSize; + UINT8 Index; + UINT8 *TempPtr; + UINT32 Retries; + BOOLEAN bResultFlag =3D FALSE; + + // + // Get the SELF TEST Results. + // + // + //Note: If BMC PcdIpmiBmcReadyDelayTimer < BMC_KCS_TIMEOUT, it need set = Retries as 1. Otherwise it will make SELT failure, caused by below conditio= n (EFI_ERROR(Status) || Retries =3D=3D 0) + // + if (PcdGet8 (PcdIpmiBmcReadyDelayTimer) < BMC_KCS_TIMEOUT) { + Retries =3D 1; + } else { + Retries =3D PcdGet8 (PcdIpmiBmcReadyDelayTimer); + } + + DataSize =3D sizeof (IpmiInstance->TempData); + + IpmiInstance->TempData[1] =3D 0; + + do { + Status =3D IpmiSendCommand ( + &IpmiInstance->IpmiTransport, + IPMI_NETFN_APP, + 0, + IPMI_APP_GET_SELFTEST_RESULTS, + NULL, + 0, + IpmiInstance->TempData, + &DataSize + ); + if (Status =3D=3D EFI_SUCCESS) { + switch (IpmiInstance->TempData[1]) { + case IPMI_APP_SELFTEST_NO_ERROR: + case IPMI_APP_SELFTEST_NOT_IMPLEMENTED: + case IPMI_APP_SELFTEST_ERROR: + case IPMI_APP_SELFTEST_FATAL_HW_ERROR: + bResultFlag =3D TRUE; + break; + + default: + break; + } //switch + + if (bResultFlag) { + break; + } + } + + MicroSecondDelay (500 * 1000); + } while (--Retries > 0); + + // + // If Status indicates a Device error, then the BMC is not responding, s= o send an error. + // + if (EFI_ERROR (Status) || Retries =3D=3D 0) { + DEBUG ((EFI_D_ERROR, "\n[IPMI] BMC self-test does not respond (status= : %r)!\n\n", Status)); + if (*ErrorCount < MAX_SOFT_COUNT) { + StatusCodeValue[*ErrorCount] =3D EFI_COMPUTING_UNIT_FIRMWARE_PROCESS= OR | EFI_CU_FP_EC_COMM_ERROR; + (*ErrorCount)++; + } + + IpmiInstance->BmcStatus =3D BMC_HARDFAIL; + return Status; + } else { + DEBUG ((EFI_D_INFO, "[IPMI] BMC self-test result: %02X-%02X\n", IpmiIn= stance->TempData[1], IpmiInstance->TempData[2])); + // + // Copy the Self test results to Error Status. Data will be copied as= long as it + // does not exceed the size of the ErrorStatus variable. + // + for (Index =3D 0, TempPtr =3D (UINT8 *) &IpmiInstance->ErrorStatus; + (Index < DataSize) && (Index < sizeof (IpmiInstance->ErrorStatus)= ); + Index++, TempPtr++ + ) { + *TempPtr =3D IpmiInstance->TempData[Index]; + } + // + // Check the IPMI defined self test results. + // Additional Cases are device specific test results. + // + switch (IpmiInstance->TempData[0]) { + case IPMI_APP_SELFTEST_NO_ERROR: + case IPMI_APP_SELFTEST_NOT_IMPLEMENTED: + IpmiInstance->BmcStatus =3D BMC_OK; + break; + + case IPMI_APP_SELFTEST_ERROR: + // + // Three of the possible errors result in BMC hard failure; FRU Co= rruption, + // BootBlock Firmware corruption, and Operational Firmware Corrupt= ion. All + // other errors are BMC soft failures. + // + if ((IpmiInstance->TempData[1] & (IPMI_APP_SELFTEST_FRU_CORRUPT | = IPMI_APP_SELFTEST_FW_BOOTBLOCK_CORRUPT | IPMI_APP_SELFTEST_FW_CORRUPT)) != =3D 0) { + IpmiInstance->BmcStatus =3D BMC_HARDFAIL; + } else { + IpmiInstance->BmcStatus =3D BMC_SOFTFAIL; + } + // + // Check if SDR repository is empty and report it if it is. + // + if ((IpmiInstance->TempData[1] & IPMI_APP_SELFTEST_SDR_REPOSITORY_= EMPTY) !=3D 0) { + if (*ErrorCount < MAX_SOFT_COUNT) { + StatusCodeValue[*ErrorCount] =3D EFI_COMPUTING_UNIT_FIRMWARE_P= ROCESSOR | CU_FP_EC_SDR_EMPTY; + (*ErrorCount)++; + } + } + break; + + case IPMI_APP_SELFTEST_FATAL_HW_ERROR: + IpmiInstance->BmcStatus =3D BMC_HARDFAIL; + break; + + default: + // + // Call routine to check device specific failures. + // + GetDeviceSpecificTestResults (IpmiInstance); + } + + if (IpmiInstance->BmcStatus =3D=3D BMC_HARDFAIL) { + if (*ErrorCount < MAX_SOFT_COUNT) { + StatusCodeValue[*ErrorCount] =3D EFI_COMPUTING_UNIT_FIRMWARE_PROCE= SSOR | EFI_CU_FP_EC_HARD_FAIL; + (*ErrorCount)++; + } + } else if (IpmiInstance->BmcStatus =3D=3D BMC_SOFTFAIL) { + if (*ErrorCount < MAX_SOFT_COUNT) { + StatusCodeValue[*ErrorCount] =3D EFI_COMPUTING_UNIT_FIRMWARE_PROCE= SSOR | EFI_CU_FP_EC_SOFT_FAIL; + (*ErrorCount)++; + } + } + } + + return EFI_SUCCESS; +} // GetSelfTest() + + +EFI_STATUS +GetDeviceId ( + IN IPMI_BMC_INSTANCE_DATA *IpmiInstance, + IN EFI_STATUS_CODE_VALUE StatusCodeValue[ ], + IN OUT UINT8 *ErrorCount + ) +/*++ + +Routine Description: + Execute the Get Device ID command to determine whether or not the BMC is= in Force Update + Mode. If it is, then report it to the error manager. + +Arguments: + IpmiInstance - Data structure describing BMC variables and used for s= ending commands + StatusCodeValue - An array used to accumulate error codes for later repo= rting. + ErrorCount - Counter used to keep track of error codes in StatusCod= eValue + +Returns: + Status + +--*/ +{ + EFI_STATUS Status; + UINT32 DataSize; + SM_CTRL_INFO *pBmcInfo; + EFI_IPMI_MSG_GET_BMC_EXEC_RSP *pBmcExecContext; + UINT32 Retries; +#ifdef FAST_VIDEO_SUPPORT + EFI_VIDEOPRINT_PROTOCOL *VideoPrintProtocol; + EFI_STATUS VideoPrintStatus; +#endif + +#ifdef FAST_VIDEO_SUPPORT + VideoPrintStatus =3D gBS->LocateProtocol ( + &gEfiVideoPrintProtocolGuid, + NULL, + &VideoPrintProtocol + ); +#endif + + // + // Set up a loop to retry for up to PcdIpmiBmcReadyDelayTimer seconds. C= alculate retries not timeout + // so that in case KCS is not enabled and IpmiSendCommand() returns + // immediately we will not wait all the PcdIpmiBmcReadyDelayTimer second= s. + // + Retries =3D PcdGet8 (PcdIpmiBmcReadyDelayTimer); + // + // Get the device ID information for the BMC. + // + DataSize =3D sizeof (IpmiInstance->TempData); + while (EFI_ERROR (Status =3D IpmiSendCommand ( + &IpmiInstance->IpmiTransport, + IPMI_NETFN_APP, 0, + IPMI_APP_GET_DEVICE_ID, + NULL, 0, + IpmiInstance->TempData, &DataSize)) + ) { + DEBUG ((DEBUG_ERROR, "[IPMI] BMC does not respond by Get BMC DID (stat= us: %r), %d retries left, ResponseData: 0x%lx\n", + Status, Retries, IpmiInstance->TempData)); + + if (Retries-- =3D=3D 0) { + IpmiInstance->BmcStatus =3D BMC_HARDFAIL; + return Status; + } + // + //Handle the case that BMC FW still not enable KCS channel after AC cy= cle. just stall 1 second + // + MicroSecondDelay (1*1000*1000); + } + + pBmcInfo =3D (SM_CTRL_INFO*)&IpmiInstance->TempData[0]; + DEBUG ((EFI_D_ERROR, "[IPMI] BMC Device ID: 0x%02X, firmware version: %d= .%02X UpdateMode:%x\n", pBmcInfo->DeviceId, pBmcInfo->MajorFirmwareRev, pBm= cInfo->MinorFirmwareRev,pBmcInfo->UpdateMode)); + // + // In OpenBMC, UpdateMode: the bit 7 of byte 4 in get device id command = is used for the BMC status: + // 0 means BMC is ready, 1 means BMC is not ready. + // At the very beginning of BMC power on, the status is 1 means BMC is i= n booting process and not ready. It is not the flag for force update mode. + // + if (pBmcInfo->UpdateMode =3D=3D BMC_READY) { + mIpmiInstance->BmcStatus =3D BMC_OK; + return EFI_SUCCESS; + } else { + Status =3D IpmiSendCommand ( + &IpmiInstance->IpmiTransport, + IPMI_NETFN_FIRMWARE, 0, + EFI_FIRMWARE_GET_BMC_EXECUTION_CONTEXT, + NULL, 0, + IpmiInstance->TempData, &DataSize + ); + + pBmcExecContext =3D (EFI_IPMI_MSG_GET_BMC_EXEC_RSP*)&IpmiInstance->Tem= pData[0]; + DEBUG ((DEBUG_INFO, "[IPMI] Operational status of BMC: 0x%x\n", pBmcEx= ecContext->CurrentExecutionContext)); + if ((pBmcExecContext->CurrentExecutionContext =3D=3D EFI_FIRMWARE_BMC_= IN_FORCED_UPDATE_MODE) && + !EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "[IPMI] BMC in Forced Update mode, skip waiting= for BMC_READY.\n")); + IpmiInstance->BmcStatus =3D BMC_UPDATE_IN_PROGRESS; + } else { + // + // Updatemode =3D 1 mean BMC is not ready, continue waiting. + // + while (Retries-- !=3D 0) { + MicroSecondDelay(1*1000*1000); //delay 1 seconds + DEBUG ((EFI_D_ERROR, "[IPMI] UpdateMode Retries: %d \n",Retries)); + Status =3D IpmiSendCommand ( + &IpmiInstance->IpmiTransport, + IPMI_NETFN_APP, 0, + IPMI_APP_GET_DEVICE_ID, + NULL, 0, + IpmiInstance->TempData, &DataSize + ); + + if (!EFI_ERROR (Status)) { + pBmcInfo =3D (SM_CTRL_INFO*)&IpmiInstance->TempData[0]; + DEBUG ((EFI_D_ERROR, "[IPMI] UpdateMode Retries: %d pBmcInfo->= UpdateMode:%x, Status: %r, Response Data: 0x%lx\n",Retries, pBmcInfo->Updat= eMode, Status, IpmiInstance->TempData)); + if (pBmcInfo->UpdateMode =3D=3D BMC_READY) { + mIpmiInstance->BmcStatus =3D BMC_OK; + return EFI_SUCCESS; + } + } + } + mIpmiInstance->BmcStatus =3D BMC_HARDFAIL; + } + } + return Status; +} // GetDeviceId() + + +/** + This function initializes KCS interface to BMC. + + Setup and initialize the BMC for the DXE phase. In order to verify the = BMC is functioning + as expected, the BMC Selftest is performed. The results are then checke= d and any errors are + reported to the error manager. Errors are collected throughout this rou= tine and reported + just prior to installing the driver. If there are more errors than MAX_= SOFT_COUNT, then they + will be ignored. + + @param[in] ImageHandle - Handle of this driver image + @param[in] SystemTable - Table containing standard EFI services + + @retval EFI_SUCCESS - Always success is returned even if KCS does not fu= nction + **/ +EFI_STATUS +InitializeIpmiKcsPhysicalLayer ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable + ) +{ + EFI_STATUS Status; + UINT8 ErrorCount; + EFI_HANDLE Handle; + UINT8 Index; + EFI_STATUS_CODE_VALUE StatusCodeValue[MAX_SOFT_COUNT]; + + ErrorCount =3D 0; + mImageHandle =3D ImageHandle; + + mIpmiInstance =3D AllocateZeroPool (sizeof (*mIpmiInstance)); + if (mIpmiInstance =3D=3D NULL) { + DEBUG ((EFI_D_ERROR, "ERROR!! Null Pointer returned by AllocateZeroPoo= l ()\n")); + ASSERT_EFI_ERROR (EFI_OUT_OF_RESOURCES); + return EFI_OUT_OF_RESOURCES; + } else { + // + // Calibrate TSC Counter. Stall for 10ms, then multiply the resulting= number of + // ticks in that period by 100 to get the number of ticks in a 1 secon= d timeout + // + + // + // Initialize the KCS transaction timeout. + // + mIpmiInstance->KcsTimeoutPeriod =3D (BMC_KCS_TIMEOUT * 1000*1000) / KC= S_DELAY_UNIT; + DEBUG ((EFI_D_ERROR, "[IPMI] mIpmiInstance->KcsTimeoutPeriod: 0x%lx\n"= ,mIpmiInstance->KcsTimeoutPeriod)); + + // + // Initialize IPMI IO Base. + // + mIpmiInstance->IpmiIoBase =3D PcdGet16 (PcdIpmiI= oBaseAddress); + mIpmiInstance->Signature =3D SM_IPMI_BMC_SIGNAT= URE; + mIpmiInstance->SlaveAddress =3D BMC_SLAVE_ADDRESS; + mIpmiInstance->BmcStatus =3D BMC_NOTREADY; + mIpmiInstance->IpmiTransport.IpmiSubmitCommand =3D IpmiSendCommand; + mIpmiInstance->IpmiTransport.GetBmcStatus =3D IpmiGetBmcStatus; + + // + // Get the Device ID and check if the system is in Force Update mode. + // + Status =3D GetDeviceId ( + mIpmiInstance, + StatusCodeValue, + &ErrorCount + ); + // + // Do not continue initialization if the BMC is in Force Update Mode. + // + if ((mIpmiInstance->BmcStatus !=3D BMC_UPDATE_IN_PROGRESS) && + (mIpmiInstance->BmcStatus !=3D BMC_HARDFAIL)) { + // + // Get the SELF TEST Results. + // + Status =3D GetSelfTest ( + mIpmiInstance, + StatusCodeValue, + &ErrorCount + ); + } + + // + // iterate through the errors reporting them to the error manager. + // + for (Index =3D 0; Index < ErrorCount; Index++) { + ReportStatusCode ( + EFI_ERROR_CODE | EFI_ERROR_MAJOR, + StatusCodeValue[Index] + ); + } + + // + // Now install the Protocol if the BMC is not in a HardFail State and = not in Force Update mode + // + if ((mIpmiInstance->BmcStatus !=3D BMC_HARDFAIL) && (mIpmiInstance->Bm= cStatus !=3D BMC_UPDATE_IN_PROGRESS)) { + Handle =3D NULL; + Status =3D gBS->InstallProtocolInterface ( + &Handle, + &gIpmiTransportProtocolGuid, + EFI_NATIVE_INTERFACE, + &mIpmiInstance->IpmiTransport + ); + ASSERT_EFI_ERROR (Status); + } + + return EFI_SUCCESS; + } +} // InitializeIpmiKcsPhysicalLayer() + --=20 2.27.0.windows.1 -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#72309): https://edk2.groups.io/g/devel/message/72309 Mute This Topic: https://groups.io/mt/81016651/1787277 Group Owner: devel+owner@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [importer@patchew.org] -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D- From nobody Thu May 16 03:18:39 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of groups.io designates 66.175.222.108 as permitted sender) client-ip=66.175.222.108; envelope-from=bounce+27952+72307+1787277+3901457@groups.io; helo=mail02.groups.io; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of groups.io designates 66.175.222.108 as permitted sender) smtp.mailfrom=bounce+27952+72307+1787277+3901457@groups.io; dmarc=fail(p=none dis=none) header.from=intel.com ARC-Seal: i=1; a=rsa-sha256; t=1614652145; cv=none; d=zohomail.com; s=zohoarc; b=BsR4lCNoF2FRWDzd4rN6flvRC1Tf7t/VUADeXJ5ZpS0/qdoi43fFZXDDKGDfDfBzm/FwZOhaapTMHV/ZRIoEF7jGfImo2iWJPDrPFF/NtyNrgYeNXJxVsB8Avh5xw06hVYTIIh/NxDpQCScYnpJd85VPyiR+uw7S0E/qGPdGjp8= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1614652145; h=Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Id:List-Unsubscribe:MIME-Version:Message-ID:Reply-To:References:Sender:Subject:To; bh=VilO4yPEroMaNsQKizNAGy+Fz9vEknDKfj1PLtWEDj4=; b=Nhj2dJwinEuqsqmWov0FIjtNUxfXRBrtEcy2aR8rWkw1kbNsC/CVMpwUs0vGRqQ/Ii7xQ0t+xuy9WMmBtS9wrrkyqklO56bTlAg4XHpwOzlE0NJ72nI9PIlZi+NNDJgihKzvGwWmveDrTcucM2JxfxGD5XvPTkFxFZ7yJObbLzo= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of groups.io designates 66.175.222.108 as permitted sender) smtp.mailfrom=bounce+27952+72307+1787277+3901457@groups.io; dmarc=fail header.from= (p=none dis=none) header.from= Received: from mail02.groups.io (mail02.groups.io [66.175.222.108]) by mx.zohomail.com with SMTPS id 1614652145306979.0468342956218; Mon, 1 Mar 2021 18:29:05 -0800 (PST) Return-Path: X-Received: by 127.0.0.2 with SMTP id sETPYY1788612xTOmHNToUjv; Mon, 01 Mar 2021 18:29:04 -0800 X-Received: from mga06.intel.com (mga06.intel.com [134.134.136.31]) by mx.groups.io with SMTP id smtpd.web11.3133.1614652144393136110 for ; Mon, 01 Mar 2021 18:29:04 -0800 IronPort-SDR: zLEc6lyW78B3hj06MNnv/ppBFO1Tupk6y0wvyxNSqlrWm/FA9cpvoMl5jk52JAOb2RKesX/Muo iJCKFEhnw0oQ== X-IronPort-AV: E=McAfee;i="6000,8403,9910"; a="248069511" X-IronPort-AV: E=Sophos;i="5.81,216,1610438400"; d="scan'208";a="248069511" X-Received: from fmsmga004.fm.intel.com ([10.253.24.48]) by orsmga104.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 01 Mar 2021 18:29:03 -0800 IronPort-SDR: fVxD3Au1UncBbaCPAAJedgsVkpe9WtanH9NLjA3ZK1zLd0XmahrLIfoqdqJ6VpZowZzkNmMg5R +pYe2UV3kjRw== X-IronPort-AV: E=Sophos;i="5.81,216,1610438400"; d="scan'208";a="427169880" X-Received: from nldesimo-desk1.amr.corp.intel.com ([10.212.174.59]) by fmsmga004-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 01 Mar 2021 18:29:03 -0800 From: "Nate DeSimone" To: devel@edk2.groups.io Cc: Isaac Oram , Sai Chaganty , Liming Gao , Michael Kubacki Subject: [edk2-devel] [edk2-platforms] [PATCH v1 7/9] IpmiFeaturePkg: Add GenericIpmi SMM Driver Date: Mon, 1 Mar 2021 18:28:02 -0800 Message-Id: <20210302022804.8641-8-nathaniel.l.desimone@intel.com> In-Reply-To: <20210302022804.8641-1-nathaniel.l.desimone@intel.com> References: <20210302022804.8641-1-nathaniel.l.desimone@intel.com> MIME-Version: 1.0 Precedence: Bulk List-Unsubscribe: Sender: devel@edk2.groups.io List-Id: Mailing-List: list devel@edk2.groups.io; contact devel+owner@edk2.groups.io Reply-To: devel@edk2.groups.io,nathaniel.l.desimone@intel.com X-Gm-Message-State: thBL3veMOy4Cw4ycjBULcHW9x1787277AA= Content-Transfer-Encoding: quoted-printable DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=groups.io; q=dns/txt; s=20140610; t=1614652144; bh=r5r79vxUMMYD6+Szo1Y+fpx2+j2wLxHD4+Y3Rh0JaW8=; h=Cc:Date:From:Reply-To:Subject:To; b=Mw/BrqrWl5dYY3axW8NN4FaS2862wkK172p4TP9Q7HRCumNteNVkYGANE1WEW8ADjDr SXfql6u5uHJSrifl3PU6+LgvNBVyHYw+aK6Hk1SXvFgr+fhQLLJfuVFWG+vMHEkaaAEl2 pSwwZrPwzJKw9nlEK0/4DknKmBb+wgMCGPc= X-ZohoMail-DKIM: pass (identity @groups.io) Content-Type: text/plain; charset="utf-8" From: Isaac Oram REF: https://bugzilla.tianocore.org/show_bug.cgi?id=3D3242 Adds the SMM version of the generic IPMI transport driver. Cc: Sai Chaganty Cc: Liming Gao Cc: Michael Kubacki Signed-off-by: Isaac Oram Co-authored-by: Nate DeSimone Acked-by: Michael Kubacki Reviewed-by: Sai Chaganty --- .../GenericIpmi/Smm/SmmGenericIpmi.c | 208 ++++++++++++++++++ .../GenericIpmi/Smm/SmmGenericIpmi.inf | 53 +++++ 2 files changed, 261 insertions(+) create mode 100644 Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Gener= icIpmi/Smm/SmmGenericIpmi.c create mode 100644 Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Gener= icIpmi/Smm/SmmGenericIpmi.inf diff --git a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/GenericIpmi/= Smm/SmmGenericIpmi.c b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Ge= nericIpmi/Smm/SmmGenericIpmi.c new file mode 100644 index 0000000000..fda215baaa --- /dev/null +++ b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/GenericIpmi/Smm/Smm= GenericIpmi.c @@ -0,0 +1,208 @@ +/** @file + Generic SMM IPMI stack driver + + @copyright + Copyright 1999 - 2021 Intel Corporation.
+ SPDX-License-Identifier: BSD-2-Clause-Patent +**/ + +// +// Statements that include other files +// +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "IpmiHooks.h" +#include "IpmiBmcCommon.h" +#include "IpmiBmc.h" +#include + +IPMI_BMC_INSTANCE_DATA *mIpmiInstance; +EFI_HANDLE mImageHandle; + + +EFI_STATUS +GetDeviceId ( + IN IPMI_BMC_INSTANCE_DATA *IpmiInstance, + IN EFI_STATUS_CODE_VALUE StatusCodeValue[ ], + IN OUT UINT8 *ErrorCount + ) +/*++ + +Routine Description: + Execute the Get Device ID command to determine whether or not the BMC is= in Force Update + Mode. If it is, then report it to the error manager. + +Arguments: + IpmiInstance - Data structure describing BMC variables and used for s= ending commands + StatusCodeValue - An array used to accumulate error codes for later repo= rting. + ErrorCount - Counter used to keep track of error codes in StatusCod= eValue + +Returns: + Status + +--*/ +{ + EFI_STATUS Status; + UINT32 DataSize; + SM_CTRL_INFO *ControllerInfo; + UINT8 TimeOut; + UINT8 Retries; + + TimeOut =3D 0; + Retries =3D PcdGet8 (PcdIpmiBmcReadyDelayTimer); + + do { + // + // Get the device ID information for the BMC. + // + DataSize =3D MAX_TEMP_DATA; + Status =3D IpmiSendCommand ( + &IpmiInstance->IpmiTransport, + IPMI_NETFN_APP, + 0, + IPMI_APP_GET_DEVICE_ID, + NULL, + 0, + IpmiInstance->TempData, + &DataSize + ); + if (Status =3D=3D EFI_SUCCESS) { + DEBUG ((EFI_D_INFO, "IPMI: SendCommand success!\n")); + break; + } else { + // + // Display message and retry. + // + DEBUG ( + (EFI_D_ERROR | EFI_D_INFO, + "IPMI: Waiting for BMC (KCS 0x%x)...\n", + IpmiInstance->IpmiIoBase) + ); + MicroSecondDelay (500 * 1000); + TimeOut++; + } + } while (TimeOut < Retries); + + // + // If there is no error then proceed to check the data returned by the B= MC + // + if (!EFI_ERROR (Status)) { + ControllerInfo =3D (SM_CTRL_INFO *) IpmiInstance->TempData; + // + // If the controller is in Update Mode and the maximum number of error= s has not been exceeded, then + // save the error code to the StatusCode array and increment the count= er. Set the BMC Status to indicate + // the BMC is in force update mode. + // + if (ControllerInfo->UpdateMode !=3D 0) { + IpmiInstance->BmcStatus =3D BMC_UPDATE_IN_PROGRESS; + if (*ErrorCount < MAX_SOFT_COUNT) { + StatusCodeValue[*ErrorCount] =3D EFI_COMPUTING_UNIT_FIRMWARE_PROCE= SSOR | CU_FP_EC_FORCE_UPDATE_MODE; + (*ErrorCount)++; + } + } + } + + return Status; +} + +EFI_STATUS +SmmInitializeIpmiKcsPhysicalLayer ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable + ) +/*++ + +Routine Description: + Setup and initialize the BMC for the DXE phase. In order to verify the = BMC is functioning + as expected, the BMC Selftest is performed. The results are then checke= d and any errors are + reported to the error manager. Errors are collected throughout this rou= tine and reported + just prior to installing the driver. If there are more errors than MAX_= SOFT_COUNT, then they + will be ignored. + +Arguments: + ImageHandle - Handle of this driver image + SystemTable - Table containing standard EFI services + +Returns: + EFI_SUCCESS - Successful driver initialization + +--*/ +{ + EFI_STATUS Status; + UINT8 ErrorCount; + EFI_HANDLE Handle; + EFI_STATUS_CODE_VALUE StatusCodeValue[MAX_SOFT_COUNT]; + + DEBUG ((DEBUG_INFO,"SmmInitializeIpmiKcsPhysicalLayer entry \n")); + ErrorCount =3D 0; + mImageHandle =3D ImageHandle; + + mIpmiInstance =3D AllocateZeroPool (sizeof (IPMI_BMC_INSTANCE_DATA)); + ASSERT (mIpmiInstance !=3D NULL); + if (mIpmiInstance =3D=3D NULL) { + DEBUG ((EFI_D_ERROR, "ERROR!! Null Pointer returned by AllocateZeroPoo= l ()\n")); + ASSERT_EFI_ERROR (EFI_OUT_OF_RESOURCES); + return EFI_OUT_OF_RESOURCES; + } else { + + // + // Initialize the KCS transaction timeout. Assume delay unit is 1000 u= s. + // + mIpmiInstance->KcsTimeoutPeriod =3D (BMC_KCS_TIMEOUT * 1000*1000) / KC= S_DELAY_UNIT; + + // + // Initialize IPMI IO Base, we still use SMS IO base to get device ID = and Seltest result since SMM IF may have different cmds supported + // + mIpmiInstance->IpmiIoBase =3D PcdGet16 (PcdIpmiS= mmIoBaseAddress); + mIpmiInstance->Signature =3D SM_IPMI_BMC_SIGNAT= URE; + mIpmiInstance->SlaveAddress =3D BMC_SLAVE_ADDRESS; + mIpmiInstance->BmcStatus =3D BMC_NOTREADY; + mIpmiInstance->IpmiTransport.IpmiSubmitCommand =3D IpmiSendCommand; + mIpmiInstance->IpmiTransport.GetBmcStatus =3D IpmiGetBmcStatus; + + DEBUG ((DEBUG_INFO,"IPMI: Waiting for Getting BMC DID in SMM \n")); + // + // Get the Device ID and check if the system is in Force Update mode. + // + // Just obey the Spec.. + // If we want to improve performance, we're going to comment it. + // + Status =3D GetDeviceId ( + mIpmiInstance, + StatusCodeValue, + &ErrorCount + ); + ASSERT_EFI_ERROR (Status); + Handle =3D NULL; + Status =3D gSmst->SmmInstallProtocolInterface ( + &Handle, + &gSmmIpmiTransportProtocolGuid, + EFI_NATIVE_INTERFACE, + &mIpmiInstance->IpmiTransport + ); + ASSERT_EFI_ERROR (Status); + + DEBUG ((DEBUG_INFO,"SmmInitializeIpmiKcsPhysicalLayer exit \n")); + + return EFI_SUCCESS; + } +} + +EFI_STATUS +InitializeSmmGenericIpmi ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable + ) +{ + SmmInitializeIpmiKcsPhysicalLayer (ImageHandle, SystemTable); + return EFI_SUCCESS; +} diff --git a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/GenericIpmi/= Smm/SmmGenericIpmi.inf b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/= GenericIpmi/Smm/SmmGenericIpmi.inf new file mode 100644 index 0000000000..a534f7dac8 --- /dev/null +++ b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/GenericIpmi/Smm/Smm= GenericIpmi.inf @@ -0,0 +1,53 @@ +## @file +# Generic IPMI SMM Driver. +# +# @copyright +# Copyright 2010 - 2021 Intel Corporation.
+# SPDX-License-Identifier: BSD-2-Clause-Patent +## + +[Defines] + INF_VERSION =3D 0x00010005 + BASE_NAME =3D SmmGenericIpmi + FILE_GUID =3D D14443FF-3626-4bcc-8204-196D11F0= 6BC5 + MODULE_TYPE =3D DXE_SMM_DRIVER + PI_SPECIFICATION_VERSION =3D 0x0001000A + VERSION_STRING =3D 1.0 + ENTRY_POINT =3D InitializeSmmGenericIpmi + +[Sources] + ../Common/IpmiHooks.h + ../Common/IpmiHooks.c + ../Common/IpmiBmcCommon.h + ../Common/KcsBmc.c + ../Common/KcsBmc.h + ../Common/IpmiBmc.c + ../Common/IpmiBmc.h + SmmGenericIpmi.c #GenericIpmi.c+IpmiBmcInitialize.c + +[Packages] + MdePkg/MdePkg.dec + OutOfBandManagement/IpmiFeaturePkg/IpmiFeaturePkg.dec + +[LibraryClasses] + MemoryAllocationLib + BaseLib + UefiBootServicesTableLib + SmmServicesTableLib + DebugLib + UefiDriverEntryPoint + IoLib + ReportStatusCodeLib + TimerLib + +[Protocols] + gSmmIpmiTransportProtocolGuid # PROTOCOL ALWAYS_PROD= UCED + +[Guids] + +[Pcd] + gIpmiFeaturePkgTokenSpaceGuid.PcdIpmiSmmIoBaseAddress + gIpmiFeaturePkgTokenSpaceGuid.PcdIpmiBmcReadyDelayTimer + +[Depex] + gIpmiTransportProtocolGuid --=20 2.27.0.windows.1 -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#72307): https://edk2.groups.io/g/devel/message/72307 Mute This Topic: https://groups.io/mt/81016649/1787277 Group Owner: devel+owner@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [importer@patchew.org] -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D- From nobody Thu May 16 03:18:39 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of groups.io designates 66.175.222.108 as permitted sender) client-ip=66.175.222.108; envelope-from=bounce+27952+72312+1787277+3901457@groups.io; helo=mail02.groups.io; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of groups.io designates 66.175.222.108 as permitted sender) smtp.mailfrom=bounce+27952+72312+1787277+3901457@groups.io; dmarc=fail(p=none dis=none) header.from=intel.com ARC-Seal: i=1; a=rsa-sha256; t=1614652145; cv=none; d=zohomail.com; s=zohoarc; b=P4kcD2qi0z5WUyy+Jx08JFpjIm92k9W1Y+eqpIykN4jG1zjfOuwEh1vzRS4VlzXuGA4CFiKu+YlbWIj9zJbd99DphRPAoAluI2eChOG0hr70c/DeCsUjC7VAQjGJxR8e5nVLiEb+Vf0tTRUd1ZsV1mGrY45qTO6dxowpEgpr5do= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1614652145; h=Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Id:List-Unsubscribe:MIME-Version:Message-ID:Reply-To:References:Sender:Subject:To; bh=3IgG8QCMIBBjMwLC8g0eLfNWrf30v00/QFnEskvjM5M=; b=AJC66J5SmQWISPqkIj63NQRwoVpU9s6bcIUIngFRp+ospbs3u1Fl4Deco3lREh7aBzzHacvz02Z/4Xxi+s5sAZNWWsBr4tU4BBveYn68jsluB4cfxruPpbxPOwSzSH1JJQSprkknsqQQWaESGIUjYiHe2pdxWmAsSiJh/ko3z6w= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of groups.io designates 66.175.222.108 as permitted sender) smtp.mailfrom=bounce+27952+72312+1787277+3901457@groups.io; dmarc=fail header.from= (p=none dis=none) header.from= Received: from mail02.groups.io (mail02.groups.io [66.175.222.108]) by mx.zohomail.com with SMTPS id 1614652145995588.9848174512913; Mon, 1 Mar 2021 18:29:05 -0800 (PST) Return-Path: X-Received: by 127.0.0.2 with SMTP id 2d0vYY1788612xPhp32DJsZv; Mon, 01 Mar 2021 18:29:05 -0800 X-Received: from mga06.intel.com (mga06.intel.com []) by mx.groups.io with SMTP id smtpd.web11.3133.1614652144393136110 for ; Mon, 01 Mar 2021 18:29:05 -0800 IronPort-SDR: PEM2maGlYJ4iNjcLVnIGshyzOcRcmF2tZj0QccNqemmQf7Y3I4WFFQnyf8qRRo8tCEHV8Q4Z/F imbetpnFk7lQ== X-IronPort-AV: E=McAfee;i="6000,8403,9910"; a="248069517" X-IronPort-AV: E=Sophos;i="5.81,216,1610438400"; d="scan'208";a="248069517" X-Received: from fmsmga004.fm.intel.com ([10.253.24.48]) by orsmga104.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 01 Mar 2021 18:29:03 -0800 IronPort-SDR: QvJ+qXpaeCYfYSY7wLkN6NoyUud2zPCCT3hJqO0JUOVasbTBXV6VJBeJePnTXEBJZApom0VkZi 66TKO9woeUSA== X-IronPort-AV: E=Sophos;i="5.81,216,1610438400"; d="scan'208";a="427169883" X-Received: from nldesimo-desk1.amr.corp.intel.com ([10.212.174.59]) by fmsmga004-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 01 Mar 2021 18:29:03 -0800 From: "Nate DeSimone" To: devel@edk2.groups.io Cc: Isaac Oram , Sai Chaganty , Liming Gao , Michael Kubacki Subject: [edk2-devel] [edk2-platforms] [PATCH v1 8/9] IpmiFeaturePkg: Add IPMI driver build files Date: Mon, 1 Mar 2021 18:28:03 -0800 Message-Id: <20210302022804.8641-9-nathaniel.l.desimone@intel.com> In-Reply-To: <20210302022804.8641-1-nathaniel.l.desimone@intel.com> References: <20210302022804.8641-1-nathaniel.l.desimone@intel.com> MIME-Version: 1.0 Precedence: Bulk List-Unsubscribe: Sender: devel@edk2.groups.io List-Id: Mailing-List: list devel@edk2.groups.io; contact devel+owner@edk2.groups.io Reply-To: devel@edk2.groups.io,nathaniel.l.desimone@intel.com X-Gm-Message-State: LDMPBncP18W0oE96B5kfihqVx1787277AA= Content-Transfer-Encoding: quoted-printable DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=groups.io; q=dns/txt; s=20140610; t=1614652145; bh=1k+cbnj+RbmG/hC1OIq6YCEOF9ktE1urdo5rFL97D20=; h=Cc:Date:From:Reply-To:Subject:To; b=XgP6WxIrp9m75rmsJH8xtiJCIWVpw83mg88VD6sLrM/Vp9TVhrqGOF1OncYo2QoZGqb XYoqm+m1dnOcBhW4eGG1JPPG4pcxIekPJ2IMEAE4TbI1qD0Mfe6J7HL+CSe8qSZMH+wPZ uuz20/F+Uk+Ntq4zjEwIg0n0oAo9XfpIF7w= X-ZohoMail-DKIM: pass (identity @groups.io) Content-Type: text/plain; charset="utf-8" From: Isaac Oram REF: https://bugzilla.tianocore.org/show_bug.cgi?id=3D3242 * Adds DEC/DSC build files for the generic IPMI transport driver. * Updates Readme.md Cc: Sai Chaganty Cc: Liming Gao Cc: Michael Kubacki Signed-off-by: Isaac Oram Co-authored-by: Nate DeSimone Acked-by: Michael Kubacki Reviewed-by: Sai Chaganty --- .../IpmiFeaturePkg/Include/IpmiFeature.dsc | 9 +++++++- .../IpmiFeaturePkg/IpmiFeaturePkg.dec | 22 ++++++++++++++++++- .../IpmiFeaturePkg/Readme.md | 4 ++-- 3 files changed, 31 insertions(+), 4 deletions(-) diff --git a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Include/Ipmi= Feature.dsc b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Include/Ipm= iFeature.dsc index a82f18a68c..226ae27bd3 100644 --- a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Include/IpmiFeature= .dsc +++ b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Include/IpmiFeature= .dsc @@ -6,7 +6,7 @@ # INF files to generate AutoGen.c and AutoGen.h files # for the build infrastructure. # -# Copyright (c) 2019, Intel Corporation. All rights reserved.
+# Copyright (c) 2019 - 2021, Intel Corporation. All rights reserved.
# # SPDX-License-Identifier: BSD-2-Clause-Patent # @@ -99,7 +99,10 @@ =20 OutOfBandManagement/IpmiFeaturePkg/Library/IpmiPlatformHookLibNull/IpmiP= latformHookLibNull.inf =20 + # # Add components here that should be included in the package build. + # + OutOfBandManagement/IpmiFeaturePkg/GenericIpmi/Pei/PeiGenericIpmi.inf OutOfBandManagement/IpmiFeaturePkg/Frb/FrbPei.inf OutOfBandManagement/IpmiFeaturePkg/IpmiInit/PeiIpmiInit.inf =20 @@ -119,7 +122,11 @@ =20 OutOfBandManagement/IpmiFeaturePkg/Library/IpmiPlatformHookLibNull/IpmiP= latformHookLibNull.inf =20 + # # Add components here that should be included in the package build. + # + OutOfBandManagement/IpmiFeaturePkg/GenericIpmi/Dxe/GenericIpmi.inf + OutOfBandManagement/IpmiFeaturePkg/Library/SmmIpmiBaseLib/SmmIpmiBaseLib= .inf OutOfBandManagement/IpmiFeaturePkg/BmcAcpi/BmcAcpi.inf OutOfBandManagement/IpmiFeaturePkg/BmcElog/BmcElog.inf OutOfBandManagement/IpmiFeaturePkg/Frb/FrbDxe.inf diff --git a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/IpmiFeatureP= kg.dec b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/IpmiFeaturePkg.d= ec index 1426496d28..48f4ebf931 100644 --- a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/IpmiFeaturePkg.dec +++ b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/IpmiFeaturePkg.dec @@ -7,7 +7,7 @@ # INF files to generate AutoGen.c and AutoGen.h files # for the build infrastructure. # -# Copyright (c) 2019, Intel Corporation. All rights reserved.
+# Copyright (c) 2019-2021, Intel Corporation. All rights reserved.
# # SPDX-License-Identifier: BSD-2-Clause-Patent # @@ -20,7 +20,14 @@ PACKAGE_VERSION =3D 0.1 =20 [Includes] + GenericIpmi/Common + GenericIpmi/Dxe + GenericIpmi/Pei + GenericIpmi/Smm Include + IpmiInit + Library + OsWdt =20 [LibraryClasses] ## @libraryclass Provides services to send IPMI commands. @@ -34,13 +41,26 @@ [Guids] gIpmiFeaturePkgTokenSpaceGuid =3D {0xc05283f6, 0xd6a8, 0x48f3, {0x9b, = 0x59, 0xfb, 0xca, 0x71, 0x32, 0x0f, 0x12}} =20 +[Ppis] + gPeiIpmiTransportPpiGuid =3D {0x7bf5fecc, 0xc5b5, 0x4b25, {0x81, 0x1b, 0= xb4, 0xb5, 0xb, 0x28, 0x79, 0xf7}} + +[Protocols] + gIpmiTransportProtocolGuid =3D {0x6bb945e8, 0x3743, 0x433e, {0xb9, 0x0e= , 0x29, 0xb3, 0x0d, 0x5d, 0xc6, 0x30}} + gSmmIpmiTransportProtocolGuid =3D {0x8bb070f1, 0xa8f3, 0x471d, {0x86, 0= x16, 0x77, 0x4b, 0xa3, 0xf4, 0x30, 0xa0}} + gEfiVideoPrintProtocolGuid =3D {0x3dbf3e06, 0x9d0c, 0x40d3, {0xb2, 0= x17, 0x45, 0x5f, 0x33, 0x9e, 0x29, 0x09}} + [PcdsFeatureFlag] gIpmiFeaturePkgTokenSpaceGuid.PcdIpmiFeatureEnable|FALSE|BOOLEAN|0xA0000= 001 =20 [PcdsFixedAtBuild] gIpmiFeaturePkgTokenSpaceGuid.PcdMaxSOLChannels|3|UINT8|0xF0000001 + #When True, BIOS will send a Pre-Boot signal to BMC + gIpmiFeaturePkgTokenSpaceGuid.PcdSignalPreBootToBmc|FALSE|BOOLEAN|0xF000= 0002 =20 [PcdsDynamic, PcdsDynamicEx] gIpmiFeaturePkgTokenSpaceGuid.PcdFRB2EnabledFlag|TRUE|BOOLEAN|0xD0000001 gIpmiFeaturePkgTokenSpaceGuid.PcdFRBTimeoutValue|360|UINT16|0xD0000002 gIpmiFeaturePkgTokenSpaceGuid.PcdIpmiIoBaseAddress|0xCA2|UINT16|0xD00000= 03 + gIpmiFeaturePkgTokenSpaceGuid.PcdSioMailboxBaseAddress|0x600|UINT32|0xD0= 000004 + gIpmiFeaturePkgTokenSpaceGuid.PcdIpmiBmcReadyDelayTimer|120|UINT8|0xD000= 0005 + gIpmiFeaturePkgTokenSpaceGuid.PcdIpmiSmmIoBaseAddress|0xCA2|UINT16|0xD00= 00006 diff --git a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Readme.md b/= Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Readme.md index 1af5b0cfda..d383150e3f 100644 --- a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Readme.md +++ b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Readme.md @@ -1,7 +1,7 @@ # Overview * **Feature Name:** Intelligent Platform Management Interface (IPMI) -* **PI Phase(s) Supported:** PEI, DXE -* **SMM Required?** No +* **PI Phase(s) Supported:** PEI, DXE, SMM +* **SMM Required?** Yes =20 More Information: * [IPMI Specification 2nd Generation v2.0](https://www.intel.com/content/d= am/www/public/us/en/documents/product-briefs/ipmi-second-gen-interface-spec= -v2-rev1-1.pdf) --=20 2.27.0.windows.1 -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#72312): https://edk2.groups.io/g/devel/message/72312 Mute This Topic: https://groups.io/mt/81016654/1787277 Group Owner: devel+owner@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [importer@patchew.org] -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D- From nobody Thu May 16 03:18:39 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of groups.io designates 66.175.222.108 as permitted sender) client-ip=66.175.222.108; envelope-from=bounce+27952+72315+1787277+3901457@groups.io; helo=mail02.groups.io; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of groups.io designates 66.175.222.108 as permitted sender) smtp.mailfrom=bounce+27952+72315+1787277+3901457@groups.io; dmarc=fail(p=none dis=none) header.from=intel.com ARC-Seal: i=1; a=rsa-sha256; t=1614652147; cv=none; d=zohomail.com; s=zohoarc; b=EpAJfOIOFsferYed4b9mAjT5TAv7Ne/JtmUXDjeKuDIczISnvPkMu1yrsrzUqE5cBhW9YPoKnIwA3qvZgNvSolxJ6XUyT4qCsiO3j+6YnjKzJ0jocQUKrSKVPcCIO7yHHvGGxpDQr6N5NMLO2bW8QkaxaWIFYTG//PUK5002Mdw= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1614652147; h=Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Id:List-Unsubscribe:MIME-Version:Message-ID:Reply-To:References:Sender:Subject:To; bh=NP+CYpryslZt5XlDmadnJ+n9K4TfeUdiCvqV0HFM3QQ=; b=hHe8BoBKbIXSl5v4Q59bUeusoEqfPu1UpvH7owrsNj2NUzwMsV0U4SUhfssFcBNonCVly+rpXiaNhqO24TaRU/a+7ZTZVdIRxqCrTaAJrzU/px1LfOnQan1/HTNExU3tXuAeLVgyXjUoRC2QF9aa4srRx+93HQV/Q1DpgTybcIs= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of groups.io designates 66.175.222.108 as permitted sender) smtp.mailfrom=bounce+27952+72315+1787277+3901457@groups.io; dmarc=fail header.from= (p=none dis=none) header.from= Received: from mail02.groups.io (mail02.groups.io [66.175.222.108]) by mx.zohomail.com with SMTPS id 1614652147840207.71065252904668; Mon, 1 Mar 2021 18:29:07 -0800 (PST) Return-Path: X-Received: by 127.0.0.2 with SMTP id PZ9QYY1788612xRXZSp6u9kD; Mon, 01 Mar 2021 18:29:07 -0800 X-Received: from mga06.intel.com (mga06.intel.com []) by mx.groups.io with SMTP id smtpd.web11.3133.1614652144393136110 for ; Mon, 01 Mar 2021 18:29:05 -0800 IronPort-SDR: VfnfktA+nS7yi3g9LWn9Hj5acqkIBI4zlhuV+v7G764/EQSI0Km+cVfmKpzZ4O4v96ILNg79pZ +HlI84KGoA3w== X-IronPort-AV: E=McAfee;i="6000,8403,9910"; a="248069518" X-IronPort-AV: E=Sophos;i="5.81,216,1610438400"; d="scan'208";a="248069518" X-Received: from fmsmga004.fm.intel.com ([10.253.24.48]) by orsmga104.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 01 Mar 2021 18:29:04 -0800 IronPort-SDR: 8UdN81eeBqnBYydxk79jnXOX6irMXkeU07lV57yujcQTk7CJds2ekME4+muIXrimykZmvqD+nL osQwlnFiP6OQ== X-IronPort-AV: E=Sophos;i="5.81,216,1610438400"; d="scan'208";a="427169886" X-Received: from nldesimo-desk1.amr.corp.intel.com ([10.212.174.59]) by fmsmga004-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 01 Mar 2021 18:29:03 -0800 From: "Nate DeSimone" To: devel@edk2.groups.io Cc: Isaac Oram , Sai Chaganty , Liming Gao Subject: [edk2-devel] [edk2-platforms] [PATCH v1 9/9] Maintainers.txt: Add IpmiFeaturePkg maintainers Date: Mon, 1 Mar 2021 18:28:04 -0800 Message-Id: <20210302022804.8641-10-nathaniel.l.desimone@intel.com> In-Reply-To: <20210302022804.8641-1-nathaniel.l.desimone@intel.com> References: <20210302022804.8641-1-nathaniel.l.desimone@intel.com> MIME-Version: 1.0 Precedence: Bulk List-Unsubscribe: Sender: devel@edk2.groups.io List-Id: Mailing-List: list devel@edk2.groups.io; contact devel+owner@edk2.groups.io Reply-To: devel@edk2.groups.io,nathaniel.l.desimone@intel.com X-Gm-Message-State: x1yN2Azav8Kx1f5eczHSahn6x1787277AA= Content-Transfer-Encoding: quoted-printable DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=groups.io; q=dns/txt; s=20140610; t=1614652147; bh=AqhPXWBo0w8LN0uy0wYajqm5Jf3c8+orgo/AVqqT3zg=; h=Cc:Date:From:Reply-To:Subject:To; b=O902OAHTUWDVl6UVHpzJvGQDeNpcsAJWMhVwiOSNLRaJxCFlln1zs8FdUOgVk8dof1n 1O4Ud9o6oNHsWNhKF5b8G5rnHE99octHMQcn5TlYYOH+6WlchW7ZZL0zhiyy3Ok48+njc wEXrZ8JbbtgUvTDQZqAuMKDqBKSCegbUev8= X-ZohoMail-DKIM: pass (identity @groups.io) Content-Type: text/plain; charset="utf-8" From: Isaac Oram REF: https://bugzilla.tianocore.org/show_bug.cgi?id=3D3242 Cc: Sai Chaganty Cc: Liming Gao Signed-off-by: Isaac Oram Co-authored-by: Nate DeSimone Acked-by: Michael Kubacki Reviewed-by: Sai Chaganty --- Maintainers.txt | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Maintainers.txt b/Maintainers.txt index 2e6e87bb6d..63d09749f6 100644 --- a/Maintainers.txt +++ b/Maintainers.txt @@ -146,6 +146,12 @@ F: Features/Intel/Debugging/ M: Eric Dong R: Liming Gao =20 +Features/Intel/OutOfBandManagement/IpmiFeaturePkg +F: Features/Intel/OutOfBandManagement/IpmiFeaturePkg +M: Isaac Oram +M: Nate DeSimone +R: Liming Gao + Features/Intel/UserInterface F: Features/Intel/UserInterface/ M: Dandan Bi --=20 2.27.0.windows.1 -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#72315): https://edk2.groups.io/g/devel/message/72315 Mute This Topic: https://groups.io/mt/81016657/1787277 Group Owner: devel+owner@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [importer@patchew.org] -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-