/** @file Post Code Library instance that writes post code values to I/O port 0x80 and TraceTool. @copyright INTEL CONFIDENTIAL Copyright 2011 - 2021 Intel Corporation. The source code contained or described herein and all documents related to the source code ("Material") are owned by Intel Corporation or its suppliers or licensors. Title to the Material remains with Intel Corporation or its suppliers and licensors. The Material may contain trade secrets and proprietary and confidential information of Intel Corporation and its suppliers and licensors, and is protected by worldwide copyright and trade secret laws and treaty provisions. No part of the Material may be used, copied, reproduced, modified, published, uploaded, posted, transmitted, distributed, or disclosed in any way without Intel's prior express written permission. No license under any patent, copyright, trade secret or other intellectual property right is granted to or conferred upon you by disclosure or delivery of the Materials, either expressly, by implication, inducement, estoppel or otherwise. Any license under such intellectual property rights must be express and approved by Intel in writing. Unless otherwise agreed by Intel in writing, you may not remove or alter this notice or any other notice embedded in Materials by Intel or Intel's suppliers or licensors in any way. This file contains an 'Intel Peripheral Driver' and is uniquely identified as "Intel Reference Module" and is licensed for Intel CPUs and chipsets under the terms of your license agreement with Intel or your vendor. This file may be modified by the user, subject to additional terms of the license agreement. @par Specification Reference: **/ #include #include #include #include #include #include #include #include #include // // Define the maximum debug and assert message length that this library supports // #define MAX_DEBUG_MESSAGE_LENGTH 0x100 /** Prints a Post Code message to the Trace Hub device if the specified error level is enabled. @param Format Format string for the Post Code message to print. @param ... Variable argument list whose contents are accessed based on the format string specified by Format. **/ VOID EFIAPI PrintPostCodeFormat ( IN CONST CHAR8 *Format, ... ) { CHAR8 Buffer[MAX_DEBUG_MESSAGE_LENGTH]; VA_LIST Marker; // // Convert the message to an ASCII String // VA_START (Marker, Format); AsciiVSPrint (Buffer, sizeof (Buffer), Format, Marker); VA_END (Marker); // // Send to DebugLib // DEBUG ((DEBUG_INFO, "%a", Buffer)); // // Send the print string to Trace Hub // TraceHubDebugWrite (SeverityNormal, (UINT8 *) Buffer, AsciiStrLen (Buffer)); } /** Sends an 32-bit value to a POST card. Sends the 32-bit value specified by Value to a POST card, and returns Value. Some implementations of this library function may perform I/O operations directly to a POST card device. Other implementations may send Value to ReportStatusCode(), and the status code reporting mechanism will eventually display the 32-bit value on the status reporting device. PostCode() must actively prevent recursion. If PostCode() is called while processing another any other Post Code Library function, then PostCode() must return Value immediately. @param[in] Value The 32-bit value to write to the POST card. @retval Value The 32-bit value to write to the POST card. **/ UINT32 EFIAPI PostCode ( IN UINT32 Value ) { SetPostCodeToScratchPad (Value); return PostCodeWithDescription (Value, NULL); } /** Sends an 32-bit value to a POST and associated ASCII string. Sends the 32-bit value specified by Value to a POST card, and returns Value. If Description is not NULL, then the ASCII string specified by Description is also passed to the handler that displays the POST card value. Some implementations of this library function may perform I/O operations directly to a POST card device. Other implementations may send Value to ReportStatusCode(), and the status code reporting mechanism will eventually display the 32-bit value on the status reporting device. PostCodeWithDescription()must actively prevent recursion. If PostCodeWithDescription() is called while processing another any other Post Code Library function, then PostCodeWithDescription() must return Value immediately. @param[in] Value The 32-bit value to write to the POST card. @param[in] Description The pointer to an ASCII string that is a description of the POST code value. This is an optional parameter that may be NULL. @retval Value The 32-bit value to write to the POST card. **/ UINT32 EFIAPI PostCodeWithDescription ( IN UINT32 Value, IN CONST CHAR8 *Description OPTIONAL ) { IoWrite16 (0x80, (UINT16) Value); #if FixedPcdGetBool (PcdTraceHubCatalogEnable) == 1 TraceHubWriteCataLog64_0 (SeverityNormal, Value); return Value; #else if (Description == NULL) { PrintPostCodeFormat ("POSTCODE = <%08x>\n", Value); } else { PrintPostCodeFormat ("POSTCODE = <%08x> - %a\n", Value, Description); } return Value; #endif } /** Returns TRUE if POST Codes are enabled. This function returns TRUE if the POST_CODE_PROPERTY_POST_CODE_ENABLED bit of PcdPostCodePropertyMask is set. Otherwise FALSE is returned. @retval TRUE The POST_CODE_PROPERTY_POST_CODE_ENABLED bit of PcdPostCodeProperyMask is set. @retval FALSE The POST_CODE_PROPERTY_POST_CODE_ENABLED bit of PcdPostCodeProperyMask is clear. **/ BOOLEAN EFIAPI PostCodeEnabled ( VOID ) { return (BOOLEAN) ((PcdGet8(PcdPostCodePropertyMask) & POST_CODE_PROPERTY_POST_CODE_ENABLED) != 0); } /** Returns TRUE if POST code descriptions are enabled. This function returns TRUE if the POST_CODE_PROPERTY_POST_CODE_DESCRIPTION_ENABLED bit of PcdPostCodePropertyMask is set. Otherwise FALSE is returned. @retval TRUE The POST_CODE_PROPERTY_POST_CODE_DESCRIPTION_ENABLED bit of PcdPostCodeProperyMask is set. @retval FALSE The POST_CODE_PROPERTY_POST_CODE_DESCRIPTION_ENABLED bit of PcdPostCodeProperyMask is clear. **/ BOOLEAN EFIAPI PostCodeDescriptionEnabled ( VOID ) { return (BOOLEAN) ((PcdGet8(PcdPostCodePropertyMask) & POST_CODE_PROPERTY_POST_CODE_DESCRIPTION_ENABLED) != 0); }