From 54bd896eb4a66315665e9522371b6b10c284c036 Mon Sep 17 00:00:00 2001 From: qhuang8 Date: Wed, 27 Jun 2007 09:31:57 +0000 Subject: [PATCH] Complete the library instances in IntelFrameworkModulePkg git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@2810 6f19259b-4bc3-4df7-8a09-765794883524 --- .../BaseUefiTianoCustomDecompressLib.c | 845 ++++++++++++++++++ .../BaseUefiTianoCustomDecompressLib.inf | 81 ++ .../BaseUefiTianoCustomDecompressLib.msa | 50 ++ ...aseUefiTianoCustomDecompressLibInternals.h | 229 +++++ .../CommonHeader.h | 31 + .../OemHookStatusCodeLibNull/CommonHeader.h | 28 + .../OemHookStatusCodeLibNull.c | 78 ++ .../OemHookStatusCodeLibNull.inf | 70 ++ .../OemHookStatusCodeLibNull.msa | 40 + .../CommonHeader.h | 30 + .../IncompatiblePciDeviceList.h | 214 +++++ .../PciIncompatibleDeviceSupportLib.c | 393 ++++++++ .../PciIncompatibleDeviceSupportLib.inf | 82 ++ .../PciIncompatibleDeviceSupportLib.msa | 47 + 14 files changed, 2218 insertions(+) create mode 100644 IntelFrameworkModulePkg/Library/BaseUefiTianoCustomDecompressLib/BaseUefiTianoCustomDecompressLib.c create mode 100644 IntelFrameworkModulePkg/Library/BaseUefiTianoCustomDecompressLib/BaseUefiTianoCustomDecompressLib.inf create mode 100644 IntelFrameworkModulePkg/Library/BaseUefiTianoCustomDecompressLib/BaseUefiTianoCustomDecompressLib.msa create mode 100644 IntelFrameworkModulePkg/Library/BaseUefiTianoCustomDecompressLib/BaseUefiTianoCustomDecompressLibInternals.h create mode 100644 IntelFrameworkModulePkg/Library/BaseUefiTianoCustomDecompressLib/CommonHeader.h create mode 100644 IntelFrameworkModulePkg/Library/OemHookStatusCodeLibNull/CommonHeader.h create mode 100644 IntelFrameworkModulePkg/Library/OemHookStatusCodeLibNull/OemHookStatusCodeLibNull.c create mode 100644 IntelFrameworkModulePkg/Library/OemHookStatusCodeLibNull/OemHookStatusCodeLibNull.inf create mode 100644 IntelFrameworkModulePkg/Library/OemHookStatusCodeLibNull/OemHookStatusCodeLibNull.msa create mode 100644 IntelFrameworkModulePkg/Library/PciIncompatibleDeviceSupportLib/CommonHeader.h create mode 100644 IntelFrameworkModulePkg/Library/PciIncompatibleDeviceSupportLib/IncompatiblePciDeviceList.h create mode 100644 IntelFrameworkModulePkg/Library/PciIncompatibleDeviceSupportLib/PciIncompatibleDeviceSupportLib.c create mode 100644 IntelFrameworkModulePkg/Library/PciIncompatibleDeviceSupportLib/PciIncompatibleDeviceSupportLib.inf create mode 100644 IntelFrameworkModulePkg/Library/PciIncompatibleDeviceSupportLib/PciIncompatibleDeviceSupportLib.msa diff --git a/IntelFrameworkModulePkg/Library/BaseUefiTianoCustomDecompressLib/BaseUefiTianoCustomDecompressLib.c b/IntelFrameworkModulePkg/Library/BaseUefiTianoCustomDecompressLib/BaseUefiTianoCustomDecompressLib.c new file mode 100644 index 0000000000..c516c35e54 --- /dev/null +++ b/IntelFrameworkModulePkg/Library/BaseUefiTianoCustomDecompressLib/BaseUefiTianoCustomDecompressLib.c @@ -0,0 +1,845 @@ +/*++ + +Copyright (c) 2006, Intel Corporation +All rights reserved. This program and the accompanying materials +are licensed and made available under the terms and conditions of the BSD License +which accompanies this distribution. The full text of the license may be found at +http://opensource.org/licenses/bsd-license.php + +THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + +Module Name: + + BaseUefiTianoCustomDecompressLib.c + +Abstract: + + UEFI and Custom Decompress Library + +--*/ + +// +// Include common header file for this module. +// +#include "CommonHeader.h" + +#include "BaseUefiTianoCustomDecompressLibInternals.h" + +VOID +FillBuf ( + IN SCRATCH_DATA *Sd, + IN UINT16 NumOfBits + ) +/*++ + +Routine Description: + + Shift mBitBuf NumOfBits left. Read in NumOfBits of bits from source. + +Arguments: + + Sd - The global scratch data + NumOfBits - The number of bits to shift and read. + +Returns: (VOID) + +--*/ +{ + Sd->mBitBuf = (UINT32) (Sd->mBitBuf << NumOfBits); + + while (NumOfBits > Sd->mBitCount) { + + Sd->mBitBuf |= (UINT32) (Sd->mSubBitBuf << (NumOfBits = (UINT16) (NumOfBits - Sd->mBitCount))); + + if (Sd->mCompSize > 0) { + // + // Get 1 byte into SubBitBuf + // + Sd->mCompSize--; + Sd->mSubBitBuf = 0; + Sd->mSubBitBuf = Sd->mSrcBase[Sd->mInBuf++]; + Sd->mBitCount = 8; + + } else { + // + // No more bits from the source, just pad zero bit. + // + Sd->mSubBitBuf = 0; + Sd->mBitCount = 8; + + } + } + + Sd->mBitCount = (UINT16) (Sd->mBitCount - NumOfBits); + Sd->mBitBuf |= Sd->mSubBitBuf >> Sd->mBitCount; +} + +UINT32 +GetBits ( + IN SCRATCH_DATA *Sd, + IN UINT16 NumOfBits + ) +/*++ + +Routine Description: + + Get NumOfBits of bits out from mBitBuf. Fill mBitBuf with subsequent + NumOfBits of bits from source. Returns NumOfBits of bits that are + popped out. + +Arguments: + + Sd - The global scratch data. + NumOfBits - The number of bits to pop and read. + +Returns: + + The bits that are popped out. + +--*/ +{ + UINT32 OutBits; + + OutBits = (UINT32) (Sd->mBitBuf >> (BITBUFSIZ - NumOfBits)); + + FillBuf (Sd, NumOfBits); + + return OutBits; +} + +UINT16 +MakeTable ( + IN SCRATCH_DATA *Sd, + IN UINT16 NumOfChar, + IN UINT8 *BitLen, + IN UINT16 TableBits, + OUT UINT16 *Table + ) +/*++ + +Routine Description: + + Creates Huffman Code mapping table according to code length array. + +Arguments: + + Sd - The global scratch data + NumOfChar - Number of symbols in the symbol set + BitLen - Code length array + TableBits - The width of the mapping table + Table - The table + +Returns: + + 0 - OK. + BAD_TABLE - The table is corrupted. + +--*/ +{ + UINT16 Count[17]; + UINT16 Weight[17]; + UINT16 Start[18]; + UINT16 *Pointer; + UINT16 Index3; + volatile UINT16 Index; + UINT16 Len; + UINT16 Char; + UINT16 JuBits; + UINT16 Avail; + UINT16 NextCode; + UINT16 Mask; + UINT16 WordOfStart; + UINT16 WordOfCount; + + for (Index = 1; Index <= 16; Index++) { + Count[Index] = 0; + } + + for (Index = 0; Index < NumOfChar; Index++) { + Count[BitLen[Index]]++; + } + + Start[1] = 0; + + for (Index = 1; Index <= 16; Index++) { + WordOfStart = Start[Index]; + WordOfCount = Count[Index]; + Start[Index + 1] = (UINT16) (WordOfStart + (WordOfCount << (16 - Index))); + } + + if (Start[17] != 0) { + /*(1U << 16)*/ + return (UINT16) BAD_TABLE; + } + + JuBits = (UINT16) (16 - TableBits); + + for (Index = 1; Index <= TableBits; Index++) { + Start[Index] >>= JuBits; + Weight[Index] = (UINT16) (1U << (TableBits - Index)); + } + + while (Index <= 16) { + Weight[Index] = (UINT16) (1U << (16 - Index)); + Index++; + } + + Index = (UINT16) (Start[TableBits + 1] >> JuBits); + + if (Index != 0) { + Index3 = (UINT16) (1U << TableBits); + while (Index != Index3) { + Table[Index++] = 0; + } + } + + Avail = NumOfChar; + Mask = (UINT16) (1U << (15 - TableBits)); + + for (Char = 0; Char < NumOfChar; Char++) { + + Len = BitLen[Char]; + if (Len == 0) { + continue; + } + + NextCode = (UINT16) (Start[Len] + Weight[Len]); + + if (Len <= TableBits) { + + for (Index = Start[Len]; Index < NextCode; Index++) { + Table[Index] = Char; + } + + } else { + + Index3 = Start[Len]; + Pointer = &Table[Index3 >> JuBits]; + Index = (UINT16) (Len - TableBits); + + while (Index != 0) { + if (*Pointer == 0) { + Sd->mRight[Avail] = Sd->mLeft[Avail] = 0; + *Pointer = Avail++; + } + + if (Index3 & Mask) { + Pointer = &Sd->mRight[*Pointer]; + } else { + Pointer = &Sd->mLeft[*Pointer]; + } + + Index3 <<= 1; + Index--; + } + + *Pointer = Char; + + } + + Start[Len] = NextCode; + } + // + // Succeeds + // + return 0; +} + +UINT32 +DecodeP ( + IN SCRATCH_DATA *Sd + ) +/*++ + +Routine Description: + + Decodes a position value. + +Arguments: + + Sd - the global scratch data + +Returns: + + The position value decoded. + +--*/ +{ + UINT16 Val; + UINT32 Mask; + UINT32 Pos; + + Val = Sd->mPTTable[Sd->mBitBuf >> (BITBUFSIZ - 8)]; + + if (Val >= MAXNP) { + Mask = 1U << (BITBUFSIZ - 1 - 8); + + do { + + if (Sd->mBitBuf & Mask) { + Val = Sd->mRight[Val]; + } else { + Val = Sd->mLeft[Val]; + } + + Mask >>= 1; + } while (Val >= MAXNP); + } + // + // Advance what we have read + // + FillBuf (Sd, Sd->mPTLen[Val]); + + Pos = Val; + if (Val > 1) { + Pos = (UINT32) ((1U << (Val - 1)) + GetBits (Sd, (UINT16) (Val - 1))); + } + + return Pos; +} + +UINT16 +ReadPTLen ( + IN SCRATCH_DATA *Sd, + IN UINT16 nn, + IN UINT16 nbit, + IN UINT16 Special + ) +/*++ + +Routine Description: + + Reads code lengths for the Extra Set or the Position Set + +Arguments: + + Sd - The global scratch data + nn - Number of symbols + nbit - Number of bits needed to represent nn + Special - The special symbol that needs to be taken care of + +Returns: + + 0 - OK. + BAD_TABLE - Table is corrupted. + +--*/ +{ + UINT16 Number; + UINT16 CharC; + volatile UINT16 Index; + UINT32 Mask; + + Number = (UINT16) GetBits (Sd, nbit); + + if (Number == 0) { + CharC = (UINT16) GetBits (Sd, nbit); + + for (Index = 0; Index < 256; Index++) { + Sd->mPTTable[Index] = CharC; + } + + for (Index = 0; Index < nn; Index++) { + Sd->mPTLen[Index] = 0; + } + + return 0; + } + + Index = 0; + + while (Index < Number) { + + CharC = (UINT16) (Sd->mBitBuf >> (BITBUFSIZ - 3)); + + if (CharC == 7) { + Mask = 1U << (BITBUFSIZ - 1 - 3); + while (Mask & Sd->mBitBuf) { + Mask >>= 1; + CharC += 1; + } + } + + FillBuf (Sd, (UINT16) ((CharC < 7) ? 3 : CharC - 3)); + + Sd->mPTLen[Index++] = (UINT8) CharC; + + if (Index == Special) { + CharC = (UINT16) GetBits (Sd, 2); + while ((INT16) (--CharC) >= 0) { + Sd->mPTLen[Index++] = 0; + } + } + } + + while (Index < nn) { + Sd->mPTLen[Index++] = 0; + } + + return MakeTable (Sd, nn, Sd->mPTLen, 8, Sd->mPTTable); +} + +VOID +ReadCLen ( + SCRATCH_DATA *Sd + ) +/*++ + +Routine Description: + + Reads code lengths for Char&Len Set. + +Arguments: + + Sd - the global scratch data + +Returns: (VOID) + +--*/ +{ + UINT16 Number; + UINT16 CharC; + volatile UINT16 Index; + UINT32 Mask; + + Number = (UINT16) GetBits (Sd, CBIT); + + if (Number == 0) { + CharC = (UINT16) GetBits (Sd, CBIT); + + for (Index = 0; Index < NC; Index++) { + Sd->mCLen[Index] = 0; + } + + for (Index = 0; Index < 4096; Index++) { + Sd->mCTable[Index] = CharC; + } + + return ; + } + + Index = 0; + while (Index < Number) { + + CharC = Sd->mPTTable[Sd->mBitBuf >> (BITBUFSIZ - 8)]; + if (CharC >= NT) { + Mask = 1U << (BITBUFSIZ - 1 - 8); + + do { + + if (Mask & Sd->mBitBuf) { + CharC = Sd->mRight[CharC]; + } else { + CharC = Sd->mLeft[CharC]; + } + + Mask >>= 1; + + } while (CharC >= NT); + } + // + // Advance what we have read + // + FillBuf (Sd, Sd->mPTLen[CharC]); + + if (CharC <= 2) { + + if (CharC == 0) { + CharC = 1; + } else if (CharC == 1) { + CharC = (UINT16) (GetBits (Sd, 4) + 3); + } else if (CharC == 2) { + CharC = (UINT16) (GetBits (Sd, CBIT) + 20); + } + + while ((INT16) (--CharC) >= 0) { + Sd->mCLen[Index++] = 0; + } + + } else { + + Sd->mCLen[Index++] = (UINT8) (CharC - 2); + + } + } + + while (Index < NC) { + Sd->mCLen[Index++] = 0; + } + + MakeTable (Sd, NC, Sd->mCLen, 12, Sd->mCTable); + + return ; +} + +UINT16 +DecodeC ( + SCRATCH_DATA *Sd + ) +/*++ + +Routine Description: + + Decode a character/length value. + +Arguments: + + Sd - The global scratch data. + +Returns: + + The value decoded. + +--*/ +{ + UINT16 Index2; + UINT32 Mask; + + if (Sd->mBlockSize == 0) { + // + // Starting a new block + // + Sd->mBlockSize = (UINT16) GetBits (Sd, 16); + Sd->mBadTableFlag = ReadPTLen (Sd, NT, TBIT, 3); + if (Sd->mBadTableFlag != 0) { + return 0; + } + + ReadCLen (Sd); + + Sd->mBadTableFlag = ReadPTLen (Sd, MAXNP, Sd->mPBit, (UINT16) (-1)); + if (Sd->mBadTableFlag != 0) { + return 0; + } + } + + Sd->mBlockSize--; + Index2 = Sd->mCTable[Sd->mBitBuf >> (BITBUFSIZ - 12)]; + + if (Index2 >= NC) { + Mask = 1U << (BITBUFSIZ - 1 - 12); + + do { + if (Sd->mBitBuf & Mask) { + Index2 = Sd->mRight[Index2]; + } else { + Index2 = Sd->mLeft[Index2]; + } + + Mask >>= 1; + } while (Index2 >= NC); + } + // + // Advance what we have read + // + FillBuf (Sd, Sd->mCLen[Index2]); + + return Index2; +} + +VOID +Decode ( + SCRATCH_DATA *Sd + ) +/*++ + +Routine Description: + + Decode the source data and put the resulting data into the destination buffer. + +Arguments: + + Sd - The global scratch data + +Returns: (VOID) + + --*/ +{ + UINT16 BytesRemain; + UINT32 DataIdx; + UINT16 CharC; + + BytesRemain = (UINT16) (-1); + + DataIdx = 0; + + for (;;) { + CharC = DecodeC (Sd); + if (Sd->mBadTableFlag != 0) { + goto Done ; + } + + if (CharC < 256) { + // + // Process an Original character + // + if (Sd->mOutBuf >= Sd->mOrigSize) { + goto Done ; + } else { + Sd->mDstBase[Sd->mOutBuf++] = (UINT8) CharC; + } + + } else { + // + // Process a Pointer + // + CharC = (UINT16) (CharC - (UINT8_MAX + 1 - THRESHOLD)); + + BytesRemain = CharC; + + DataIdx = Sd->mOutBuf - DecodeP (Sd) - 1; + + BytesRemain--; + while ((INT16) (BytesRemain) >= 0) { + Sd->mDstBase[Sd->mOutBuf++] = Sd->mDstBase[DataIdx++]; + if (Sd->mOutBuf >= Sd->mOrigSize) { + goto Done ; + } + + BytesRemain--; + } + } + } + +Done: + return ; +} + +RETURN_STATUS +EFIAPI +UefiDecompressGetInfo ( + IN CONST VOID *Source, + IN UINT32 SourceSize, + OUT UINT32 *DestinationSize, + OUT UINT32 *ScratchSize + ) +/*++ + +Routine Description: + + The internal implementation of *_DECOMPRESS_PROTOCOL.GetInfo(). + +Arguments: + + Source - The source buffer containing the compressed data. + SourceSize - The size of source buffer + DestinationSize - The size of destination buffer. + ScratchSize - The size of scratch buffer. + +Returns: + + RETURN_SUCCESS - The size of destination buffer and the size of scratch buffer are successull retrieved. + RETURN_INVALID_PARAMETER - The source data is corrupted + +--*/ +{ + UINT32 CompressedSize; + + ASSERT (Source != NULL); + ASSERT (DestinationSize != NULL); + ASSERT (ScratchSize != NULL); + + *ScratchSize = sizeof (SCRATCH_DATA); + + if (SourceSize < 8) { + return RETURN_INVALID_PARAMETER; + } + + CopyMem (&CompressedSize, Source, sizeof (UINT32)); + CopyMem (DestinationSize, (VOID *)((UINT8 *)Source + 4), sizeof (UINT32)); + + if (SourceSize < (CompressedSize + 8)) { + return RETURN_INVALID_PARAMETER; + } + + return RETURN_SUCCESS; +} + +RETURN_STATUS +EFIAPI +UefiTianoDecompress ( + IN CONST VOID *Source, + IN OUT VOID *Destination, + IN OUT VOID *Scratch, + IN UINT32 Version + ) +/*++ + +Routine Description: + + The internal implementation of *_DECOMPRESS_PROTOCOL.Decompress(). + +Arguments: + + Source - The source buffer containing the compressed data. + Destination - The destination buffer to store the decompressed data + Scratch - The buffer used internally by the decompress routine. This buffer is needed to store intermediate data. + Version - 1 for UEFI Decompress algoruthm, 2 for Tiano Decompess algorithm + +Returns: + + RETURN_SUCCESS - Decompression is successfull + RETURN_INVALID_PARAMETER - The source data is corrupted + +--*/ +{ + volatile UINT32 Index; + UINT32 CompSize; + UINT32 OrigSize; + SCRATCH_DATA *Sd; + CONST UINT8 *Src; + UINT8 *Dst; + + ASSERT (Source != NULL); + ASSERT (Destination != NULL); + ASSERT (Scratch != NULL); + + Src = Source; + Dst = Destination; + + Sd = (SCRATCH_DATA *) Scratch; + + CompSize = Src[0] + (Src[1] << 8) + (Src[2] << 16) + (Src[3] << 24); + OrigSize = Src[4] + (Src[5] << 8) + (Src[6] << 16) + (Src[7] << 24); + + // + // If compressed file size is 0, return + // + if (OrigSize == 0) { + return RETURN_SUCCESS; + } + + Src = Src + 8; + + for (Index = 0; Index < sizeof (SCRATCH_DATA); Index++) { + ((UINT8 *) Sd)[Index] = 0; + } + // + // The length of the field 'Position Set Code Length Array Size' in Block Header. + // For EFI 1.1 de/compression algorithm(Version 1), mPBit = 4 + // For Tiano de/compression algorithm(Version 2), mPBit = 5 + // + switch (Version) { + case 1 : + Sd->mPBit = 4; + break; + case 2 : + Sd->mPBit = 5; + break; + default: + ASSERT (FALSE); + } + Sd->mSrcBase = (UINT8 *)Src; + Sd->mDstBase = Dst; + Sd->mCompSize = CompSize; + Sd->mOrigSize = OrigSize; + + // + // Fill the first BITBUFSIZ bits + // + FillBuf (Sd, BITBUFSIZ); + + // + // Decompress it + // + Decode (Sd); + + if (Sd->mBadTableFlag != 0) { + // + // Something wrong with the source + // + return RETURN_INVALID_PARAMETER; + } + + return RETURN_SUCCESS; +} + +RETURN_STATUS +EFIAPI +UefiDecompress ( + IN CONST VOID *Source, + IN OUT VOID *Destination, + IN OUT VOID *Scratch + ) +/*++ + +Routine Description: + + The internal implementation of *_DECOMPRESS_PROTOCOL.Decompress(). + +Arguments: + + Source - The source buffer containing the compressed data. + Destination - The destination buffer to store the decompressed data + Scratch - The buffer used internally by the decompress routine. This buffer is needed to store intermediate data. + +Returns: + + RETURN_SUCCESS - Decompression is successfull + RETURN_INVALID_PARAMETER - The source data is corrupted + +--*/ +{ + return UefiTianoDecompress (Source, Destination, Scratch, 1); +} + +RETURN_STATUS +EFIAPI +CustomDecompressGetInfo ( + IN CONST VOID *Source, + IN UINT32 SourceSize, + OUT UINT32 *DestinationSize, + OUT UINT32 *ScratchSize + ) +/*++ + +Routine Description: + + The internal implementation of *_DECOMPRESS_PROTOCOL.GetInfo(). + +Arguments: + + Source - The source buffer containing the compressed data. + SourceSize - The size of source buffer + DestinationSize - The size of destination buffer. + ScratchSize - The size of scratch buffer. + +Returns: + + RETURN_SUCCESS - The size of destination buffer and the size of scratch buffer are successull retrieved. + RETURN_INVALID_PARAMETER - The source data is corrupted + +--*/ +{ + return UefiDecompressGetInfo (Source, SourceSize, DestinationSize, ScratchSize); +} + +RETURN_STATUS +EFIAPI +CustomDecompress ( + IN CONST VOID *Source, + IN OUT VOID *Destination, + IN OUT VOID *Scratch + ) +/*++ + +Routine Description: + + The internal implementation of *_DECOMPRESS_PROTOCOL.Decompress(). + +Arguments: + + Source - The source buffer containing the compressed data. + Destination - The destination buffer to store the decompressed data + Scratch - The buffer used internally by the decompress routine. This buffer is needed to store intermediate data. + +Returns: + + RETURN_SUCCESS - Decompression is successfull + RETURN_INVALID_PARAMETER - The source data is corrupted + +--*/ +{ + return UefiTianoDecompress (Source, Destination, Scratch, 2); +} diff --git a/IntelFrameworkModulePkg/Library/BaseUefiTianoCustomDecompressLib/BaseUefiTianoCustomDecompressLib.inf b/IntelFrameworkModulePkg/Library/BaseUefiTianoCustomDecompressLib/BaseUefiTianoCustomDecompressLib.inf new file mode 100644 index 0000000000..f66fc084e0 --- /dev/null +++ b/IntelFrameworkModulePkg/Library/BaseUefiTianoCustomDecompressLib/BaseUefiTianoCustomDecompressLib.inf @@ -0,0 +1,81 @@ +#/** @file +# Uefi Tiano Decomression Library +# +# Uefi Decompression library instance +# Copyright (c) 2006, Intel Corporation. +# +# All rights reserved. This program and the accompanying materials +# are licensed and made available under the terms and conditions of the BSD License +# which accompanies this distribution. The full text of the license may be found at +# http://opensource.org/licenses/bsd-license.php +# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. +# +# +#**/ + +################################################################################ +# +# Defines Section - statements that will be processed to create a Makefile. +# +################################################################################ +[Defines] + INF_VERSION = 0x00010005 + BASE_NAME = BaseUefiTianoDecompressLib + FILE_GUID = d774c4d9-c121-4da3-a5e2-0f317e3c630c + MODULE_TYPE = BASE + VERSION_STRING = 1.0 + LIBRARY_CLASS = CustomDecompressLib UefiDecompressLib + EDK_RELEASE_VERSION = 0x00020000 + EFI_SPECIFICATION_VERSION = 0x00020000 + + +# +# The following information is for reference only and not required by the build tools. +# +# VALID_ARCHITECTURES = IA32 X64 IPF EBC +# + +################################################################################ +# +# Sources Section - list of files that are required for the build to succeed. +# +################################################################################ + +[Sources.common] + BaseUefiTianoCustomDecompressLibInternals.h + BaseUefiTianoCustomDecompressLib.c + CommonHeader.h + + +################################################################################ +# +# Includes Section - list of Include locations that are required for +# this module. +# +################################################################################ + +[Includes] + $(WORKSPACE)/MdePkg/Include + +################################################################################ +# +# Package Dependency Section - list of Package files that are required for +# this module. +# +################################################################################ + +[Packages] + MdePkg/MdePkg.dec + +################################################################################ +# +# Library Class Section - list of Library Classes that are required for +# this module. +# +################################################################################ + +[LibraryClasses] + BaseMemoryLib + DebugLib + diff --git a/IntelFrameworkModulePkg/Library/BaseUefiTianoCustomDecompressLib/BaseUefiTianoCustomDecompressLib.msa b/IntelFrameworkModulePkg/Library/BaseUefiTianoCustomDecompressLib/BaseUefiTianoCustomDecompressLib.msa new file mode 100644 index 0000000000..dc64709f01 --- /dev/null +++ b/IntelFrameworkModulePkg/Library/BaseUefiTianoCustomDecompressLib/BaseUefiTianoCustomDecompressLib.msa @@ -0,0 +1,50 @@ + + + + BaseUefiTianoCustomDecompressLib + BASE + d774c4d9-c121-4da3-a5e2-0f317e3c630c + 1.0 + Uefi Tiano Decomression Library + Uefi Decompression library instance + Copyright (c) 2006, Intel Corporation. + All rights reserved. This program and the accompanying materials + are licensed and made available under the terms and conditions of the BSD License + which accompanies this distribution. The full text of the license may be found at + http://opensource.org/licenses/bsd-license.php + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + FRAMEWORK_BUILD_PACKAGING_SPECIFICATION 0x00000052 + + + IA32 X64 IPF EBC + false + BaseUefiTianoDecompressLib + + + + UefiDecompressLib + + + CustomDecompressLib + + + DebugLib + + + BaseMemoryLib + + + + BaseUefiTianoCustomDecompressLib.c + BaseUefiTianoCustomDecompressLibInternals.h + + + + + + + EFI_SPECIFICATION_VERSION 0x00020000 + EDK_RELEASE_VERSION 0x00020000 + + \ No newline at end of file diff --git a/IntelFrameworkModulePkg/Library/BaseUefiTianoCustomDecompressLib/BaseUefiTianoCustomDecompressLibInternals.h b/IntelFrameworkModulePkg/Library/BaseUefiTianoCustomDecompressLib/BaseUefiTianoCustomDecompressLibInternals.h new file mode 100644 index 0000000000..cc5037ad81 --- /dev/null +++ b/IntelFrameworkModulePkg/Library/BaseUefiTianoCustomDecompressLib/BaseUefiTianoCustomDecompressLibInternals.h @@ -0,0 +1,229 @@ +/** @file + Internal include file for Base UEFI Decompress Libary. + + Copyright (c) 2006, Intel Corporation + All rights reserved. This program and the accompanying materials + are licensed and made available under the terms and conditions of the BSD License + which accompanies this distribution. The full text of the license may be found at + http://opensource.org/licenses/bsd-license.php + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + + Module Name: BaseUefiCustomDecompressLibInternals.h + +**/ + +#ifndef __BASE_UEFI_TIANO_CUSTOM_DECOMPRESS_LIB_INTERNALS_H__ +#define __BASE_UEFI_TIANO_CUSTOM_DECOMPRESS_LIB_INTERNALS_H__ + +// +// Include common header file for this module. +// +#include "CommonHeader.h" + +// +// Decompression algorithm begins here +// +#define BITBUFSIZ 32 +#define MAXMATCH 256 +#define THRESHOLD 3 +#define CODE_BIT 16 +#define BAD_TABLE - 1 + +// +// C: Char&Len Set; P: Position Set; T: exTra Set +// +#define NC (0xff + MAXMATCH + 2 - THRESHOLD) +#define CBIT 9 +#define MAXPBIT 5 +#define TBIT 5 +#define MAXNP ((1U << MAXPBIT) - 1) +#define NT (CODE_BIT + 3) +#if NT > MAXNP +#define NPT NT +#else +#define NPT MAXNP +#endif + +typedef struct { + UINT8 *mSrcBase; // Starting address of compressed data + UINT8 *mDstBase; // Starting address of decompressed data + UINT32 mOutBuf; + UINT32 mInBuf; + + UINT16 mBitCount; + UINT32 mBitBuf; + UINT32 mSubBitBuf; + UINT16 mBlockSize; + UINT32 mCompSize; + UINT32 mOrigSize; + + UINT16 mBadTableFlag; + + UINT16 mLeft[2 * NC - 1]; + UINT16 mRight[2 * NC - 1]; + UINT8 mCLen[NC]; + UINT8 mPTLen[NPT]; + UINT16 mCTable[4096]; + UINT16 mPTTable[256]; + + // + // The length of the field 'Position Set Code Length Array Size' in Block Header. + // For EFI 1.1 de/compression algorithm, mPBit = 4 + // For Tiano de/compression algorithm, mPBit = 5 + // + UINT8 mPBit; +} SCRATCH_DATA; + +/** + Read NumOfBit of bits from source into mBitBuf + + Shift mBitBuf NumOfBits left. Read in NumOfBits of bits from source. + + @param Sd The global scratch data + @param NumOfBits The number of bits to shift and read. + +**/ +VOID +FillBuf ( + IN SCRATCH_DATA *Sd, + IN UINT16 NumOfBits + ); + +/** + Get NumOfBits of bits out from mBitBuf + + Get NumOfBits of bits out from mBitBuf. Fill mBitBuf with subsequent + NumOfBits of bits from source. Returns NumOfBits of bits that are + popped out. + + @param Sd The global scratch data. + @param NumOfBits The number of bits to pop and read. + + @return The bits that are popped out. + +**/ +UINT32 +GetBits ( + IN SCRATCH_DATA *Sd, + IN UINT16 NumOfBits + ); + +/** + Creates Huffman Code mapping table according to code length array. + + Creates Huffman Code mapping table for Extra Set, Char&Len Set + and Position Set according to code length array. + + @param Sd The global scratch data + @param NumOfChar Number of symbols in the symbol set + @param BitLen Code length array + @param TableBits The width of the mapping table + @param Table The table + + @retval 0 OK. + @retval BAD_TABLE The table is corrupted. + +**/ +UINT16 +MakeTable ( + IN SCRATCH_DATA *Sd, + IN UINT16 NumOfChar, + IN UINT8 *BitLen, + IN UINT16 TableBits, + OUT UINT16 *Table + ); + +/** + Decodes a position value. + + Get a position value according to Position Huffman Table. + + @param Sd the global scratch data + + @return The position value decoded. + +**/ +UINT32 +DecodeP ( + IN SCRATCH_DATA *Sd + ); + +/** + Reads code lengths for the Extra Set or the Position Set. + + Read in the Extra Set or Pointion Set Length Arrary, then + generate the Huffman code mapping for them. + + @param Sd The global scratch data. + @param nn Number of symbols. + @param nbit Number of bits needed to represent nn. + @param Special The special symbol that needs to be taken care of. + + @retval 0 OK. + @retval BAD_TABLE Table is corrupted. + +**/ +UINT16 +ReadPTLen ( + IN SCRATCH_DATA *Sd, + IN UINT16 nn, + IN UINT16 nbit, + IN UINT16 Special + ); + +/** + Reads code lengths for Char&Len Set. + + Read in and decode the Char&Len Set Code Length Array, then + generate the Huffman Code mapping table for the Char&Len Set. + + @param Sd the global scratch data + +**/ +VOID +ReadCLen ( + SCRATCH_DATA *Sd + ); + +/** + Decode a character/length value. + + Read one value from mBitBuf, Get one code from mBitBuf. If it is at block boundary, generates + Huffman code mapping table for Extra Set, Code&Len Set and + Position Set. + + @param Sd The global scratch data. + + @return The value decoded. + +**/ +UINT16 +DecodeC ( + SCRATCH_DATA *Sd + ); + +/** + Decode the source data and put the resulting data into the destination buffer. + + Decode the source data and put the resulting data into the destination buffer. + + @param Sd The global scratch data + +**/ +VOID +Decode ( + SCRATCH_DATA *Sd + ); + +RETURN_STATUS +EFIAPI +UefiTianoDecompress ( + IN CONST VOID *Source, + IN OUT VOID *Destination, + IN OUT VOID *Scratch, + IN UINT32 Version + ); + +#endif diff --git a/IntelFrameworkModulePkg/Library/BaseUefiTianoCustomDecompressLib/CommonHeader.h b/IntelFrameworkModulePkg/Library/BaseUefiTianoCustomDecompressLib/CommonHeader.h new file mode 100644 index 0000000000..baf3f0edfb --- /dev/null +++ b/IntelFrameworkModulePkg/Library/BaseUefiTianoCustomDecompressLib/CommonHeader.h @@ -0,0 +1,31 @@ +/**@file + Common header file shared by all source files. + + This file includes package header files, library classes and protocol, PPI & GUID definitions. + + Copyright (c) 2006, Intel Corporation. + All rights reserved. This program and the accompanying materials + are licensed and made available under the terms and conditions of the BSD License + which accompanies this distribution. The full text of the license may be found at + http://opensource.org/licenses/bsd-license.php + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. +**/ + +#ifndef __COMMON_HEADER_H_ +#define __COMMON_HEADER_H_ + + +// +// The package level header files this module uses +// +#include +// +// The Library classes this module consumes +// +#include +#include +#include +#include + +#endif diff --git a/IntelFrameworkModulePkg/Library/OemHookStatusCodeLibNull/CommonHeader.h b/IntelFrameworkModulePkg/Library/OemHookStatusCodeLibNull/CommonHeader.h new file mode 100644 index 0000000000..6fd8551788 --- /dev/null +++ b/IntelFrameworkModulePkg/Library/OemHookStatusCodeLibNull/CommonHeader.h @@ -0,0 +1,28 @@ +/**@file + Common header file shared by all source files. + + This file includes package header files, library classes and protocol, PPI & GUID definitions. + + Copyright (c) 2006 - 2007, Intel Corporation. + All rights reserved. This program and the accompanying materials + are licensed and made available under the terms and conditions of the BSD License + which accompanies this distribution. The full text of the license may be found at + http://opensource.org/licenses/bsd-license.php + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. +**/ + +#ifndef __COMMON_HEADER_H_ +#define __COMMON_HEADER_H_ + + +// +// The package level header files this module uses +// +#include +// +// The Library classes this module consumes +// +#include + +#endif diff --git a/IntelFrameworkModulePkg/Library/OemHookStatusCodeLibNull/OemHookStatusCodeLibNull.c b/IntelFrameworkModulePkg/Library/OemHookStatusCodeLibNull/OemHookStatusCodeLibNull.c new file mode 100644 index 0000000000..165e4a48a8 --- /dev/null +++ b/IntelFrameworkModulePkg/Library/OemHookStatusCodeLibNull/OemHookStatusCodeLibNull.c @@ -0,0 +1,78 @@ +/** @file + OEM hook status code library functions with no library constructor/destructor + + Copyright (c) 2006, Intel Corporation + All rights reserved. This program and the accompanying materials + are licensed and made available under the terms and conditions of the BSD License + which accompanies this distribution. The full text of the license may be found at + http://opensource.org/licenses/bsd-license.php + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + + Module Name: OemHookStatusCodeLibNull.c + +**/ + +// +// Include common header file for this module. +// +#include "CommonHeader.h" + +/** + + Initialize OEM status code device . + + @return Always return EFI_SUCCESS. + +**/ +EFI_STATUS +EFIAPI +OemHookStatusCodeInitialize ( + VOID + ) +{ + return EFI_SUCCESS; +} + +/** + Report status code to OEM device. + + @param CodeType Indicates the type of status code being reported. Type EFI_STATUS_CODE_TYPE is defined in "Related Definitions" below. + + @param Value Describes the current status of a hardware or software entity. + This included information about the class and subclass that is used to classify the entity + as well as an operation. For progress codes, the operation is the current activity. + For error codes, it is the exception. For debug codes, it is not defined at this time. + Type EFI_STATUS_CODE_VALUE is defined in "Related Definitions" below. + Specific values are discussed in the Intel? Platform Innovation Framework for EFI Status Code Specification. + + @param Instance The enumeration of a hardware or software entity within the system. + A system may contain multiple entities that match a class/subclass pairing. + The instance differentiates between them. An instance of 0 indicates that instance information is unavailable, + not meaningful, or not relevant. Valid instance numbers start with 1. + + + @param CallerId This optional parameter may be used to identify the caller. + This parameter allows the status code driver to apply different rules to different callers. + Type EFI_GUID is defined in InstallProtocolInterface() in the EFI 1.10 Specification. + + + @param Data This optional parameter may be used to pass additional data + + @return The function always return EFI_UNSUPPORTED. + +**/ +EFI_STATUS +EFIAPI +OemHookStatusCodeReport ( + IN EFI_STATUS_CODE_TYPE CodeType, + IN EFI_STATUS_CODE_VALUE Value, + IN UINT32 Instance, + IN EFI_GUID *CallerId, OPTIONAL + IN EFI_STATUS_CODE_DATA *Data OPTIONAL + ) +{ + return EFI_UNSUPPORTED; +} + diff --git a/IntelFrameworkModulePkg/Library/OemHookStatusCodeLibNull/OemHookStatusCodeLibNull.inf b/IntelFrameworkModulePkg/Library/OemHookStatusCodeLibNull/OemHookStatusCodeLibNull.inf new file mode 100644 index 0000000000..f811b7334a --- /dev/null +++ b/IntelFrameworkModulePkg/Library/OemHookStatusCodeLibNull/OemHookStatusCodeLibNull.inf @@ -0,0 +1,70 @@ +#/** @file +# Memory Status Code Library for UEFI drivers +# +# Lib to provide memory journal status code reporting Routines +# Copyright (c) 2006 - 2007, Intel Corporation. +# +# All rights reserved. This program and the accompanying materials +# are licensed and made available under the terms and conditions of the BSD License +# which accompanies this distribution. The full text of the license may be found at +# http://opensource.org/licenses/bsd-license.php +# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. +# +# +#**/ + +################################################################################ +# +# Defines Section - statements that will be processed to create a Makefile. +# +################################################################################ +[Defines] + INF_VERSION = 0x00010005 + BASE_NAME = EdkOemHookStatusCodeLibNull + FILE_GUID = 54D2878F-25CD-4a2b-8420-EBD18E609C76 + MODULE_TYPE = PEIM + VERSION_STRING = 1.0 + LIBRARY_CLASS = OemHookStatusCodeLib + EDK_RELEASE_VERSION = 0x00020000 + EFI_SPECIFICATION_VERSION = 0x00020000 + + +# +# The following information is for reference only and not required by the build tools. +# +# VALID_ARCHITECTURES = IA32 X64 IPF EBC +# + +################################################################################ +# +# Sources Section - list of files that are required for the build to succeed. +# +################################################################################ + +[Sources.common] + OemHookStatusCodeLibNull.c + CommonHeader.h + + +################################################################################ +# +# Includes Section - list of Include locations that are required for +# this module. +# +################################################################################ + +[Includes] + $(WORKSPACE)/MdePkg/Include + $(WORKSPACE)/IntelFrameworkModulePkg/Include + +################################################################################ +# +# Package Dependency Section - list of Package files that are required for +# this module. +# +################################################################################ + +[Packages] + MdePkg/MdePkg.dec + IntelFrameworkModulePkg/IntelFrameworkModulePkg.dec diff --git a/IntelFrameworkModulePkg/Library/OemHookStatusCodeLibNull/OemHookStatusCodeLibNull.msa b/IntelFrameworkModulePkg/Library/OemHookStatusCodeLibNull/OemHookStatusCodeLibNull.msa new file mode 100644 index 0000000000..40e4561c5f --- /dev/null +++ b/IntelFrameworkModulePkg/Library/OemHookStatusCodeLibNull/OemHookStatusCodeLibNull.msa @@ -0,0 +1,40 @@ + + + + EdkOemHookStatusCodeLibNull + PEIM + 54D2878F-25CD-4a2b-8420-EBD18E609C76 + 1.0 + Memory Status Code Library for UEFI drivers + Lib to provide memory journal status code reporting Routines + Copyright (c) 2006 - 2007, Intel Corporation. + All rights reserved. This program and the accompanying materials + are licensed and made available under the terms and conditions of the BSD License + which accompanies this distribution. The full text of the license may be found at + http://opensource.org/licenses/bsd-license.php + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + FRAMEWORK_BUILD_PACKAGING_SPECIFICATION 0x00000052 + + + IA32 X64 IPF EBC + false + EdkOemHookStatusCodeLibNull + + + + OemHookStatusCodeLib + + + + OemHookStatusCodeLibNull.c + + + + + + + EFI_SPECIFICATION_VERSION 0x00020000 + EDK_RELEASE_VERSION 0x00020000 + + \ No newline at end of file diff --git a/IntelFrameworkModulePkg/Library/PciIncompatibleDeviceSupportLib/CommonHeader.h b/IntelFrameworkModulePkg/Library/PciIncompatibleDeviceSupportLib/CommonHeader.h new file mode 100644 index 0000000000..3119b033da --- /dev/null +++ b/IntelFrameworkModulePkg/Library/PciIncompatibleDeviceSupportLib/CommonHeader.h @@ -0,0 +1,30 @@ +/**@file + Common header file shared by all source files. + + This file includes package header files, library classes and protocol, PPI & GUID definitions. + + Copyright (c) 2007, Intel Corporation. + All rights reserved. This program and the accompanying materials + are licensed and made available under the terms and conditions of the BSD License + which accompanies this distribution. The full text of the license may be found at + http://opensource.org/licenses/bsd-license.php + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. +**/ + +#ifndef __COMMON_HEADER_H_ +#define __COMMON_HEADER_H_ + + +// +// The package level header files this module uses +// +#include +// +// The Library classes this module consumes +// +#include +#include +#include + +#endif diff --git a/IntelFrameworkModulePkg/Library/PciIncompatibleDeviceSupportLib/IncompatiblePciDeviceList.h b/IntelFrameworkModulePkg/Library/PciIncompatibleDeviceSupportLib/IncompatiblePciDeviceList.h new file mode 100644 index 0000000000..df30a9d69e --- /dev/null +++ b/IntelFrameworkModulePkg/Library/PciIncompatibleDeviceSupportLib/IncompatiblePciDeviceList.h @@ -0,0 +1,214 @@ +/** @file + The incompatible PCI device list + +Copyright (c) 2007 Intel Corporation. All rights reserved.
+This software and associated documentation (if any) is furnished +under a license and may only be used or copied in accordance +with the terms of the license. Except as permitted by such +license, no part of this software or documentation may be +reproduced, stored in a retrieval system, or transmitted in any +form or by any means without the express written consent of +Intel Corporation. + +**/ + +#ifndef _EFI_INCOMPATIBLE_PCI_DEVICE_LIST_H +#define _EFI_INCOMPATIBLE_PCI_DEVICE_LIST_H + +// +// Include common header file for this module. +// +#include "CommonHeader.h" + +#include +#include + + +#define PCI_DEVICE_ID(VendorId, DeviceId, Revision, SubVendorId, SubDeviceId) \ + VendorId, DeviceId, Revision, SubVendorId, SubDeviceId + +#define PCI_BAR_TYPE_IO ACPI_ADDRESS_SPACE_TYPE_IO +#define PCI_BAR_TYPE_MEM ACPI_ADDRESS_SPACE_TYPE_MEM + +#define DEVICE_INF_TAG 0xFFF2 +#define DEVICE_RES_TAG 0xFFF1 +#define LIST_END_TAG 0x0000 + +// +// descriptor for access width of incompatible PCI device +// +typedef struct { + UINT64 AccessType; + UINT64 AccessWidth; + EFI_PCI_REGISTER_ACCESS_DATA PciRegisterAccessData; +} EFI_PCI_REGISTER_ACCESS_DESCRIPTOR; + +// +// descriptor for register value of incompatible PCI device +// +typedef struct { + UINT64 AccessType; + UINT64 Offset; + EFI_PCI_REGISTER_VALUE_DATA PciRegisterValueData; +} EFI_PCI_REGISTER_VALUE_DESCRIPTOR; + + +// +// the incompatible PCI devices list for ACPI resource +// +GLOBAL_REMOVE_IF_UNREFERENCED UINT64 IncompatiblePciDeviceListForResource[] = { + // + // DEVICE_INF_TAG, + // PCI_DEVICE_ID (VendorID, DeviceID, Revision, SubVendorId, SubDeviceId), + // DEVICE_RES_TAG, + // ResType, GFlag , SFlag, Granularity, RangeMin, + // RangeMax, Offset, AddrLen + // + // + // Device Adaptec 9004 + // + DEVICE_INF_TAG, + PCI_DEVICE_ID(0x9004, DEVICE_ID_NOCARE, DEVICE_ID_NOCARE, DEVICE_ID_NOCARE, DEVICE_ID_NOCARE), + DEVICE_RES_TAG, + PCI_BAR_TYPE_IO, + PCI_ACPI_UNUSED, + PCI_ACPI_UNUSED, + PCI_ACPI_UNUSED, + PCI_ACPI_UNUSED, + PCI_BAR_EVEN_ALIGN, + PCI_BAR_ALL, + PCI_BAR_NOCHANGE, + // + // Device Adaptec 9005 + // + DEVICE_INF_TAG, + PCI_DEVICE_ID(0x9005, DEVICE_ID_NOCARE, DEVICE_ID_NOCARE, DEVICE_ID_NOCARE, DEVICE_ID_NOCARE), + DEVICE_RES_TAG, + PCI_BAR_TYPE_IO, + PCI_ACPI_UNUSED, + PCI_ACPI_UNUSED, + PCI_ACPI_UNUSED, + PCI_ACPI_UNUSED, + PCI_BAR_EVEN_ALIGN, + PCI_BAR_ALL, + PCI_BAR_NOCHANGE, + // + // Device QLogic 1007 + // + DEVICE_INF_TAG, + PCI_DEVICE_ID(0x1077, DEVICE_ID_NOCARE, DEVICE_ID_NOCARE, DEVICE_ID_NOCARE, DEVICE_ID_NOCARE), + DEVICE_RES_TAG, + PCI_BAR_TYPE_IO, + PCI_ACPI_UNUSED, + PCI_ACPI_UNUSED, + PCI_ACPI_UNUSED, + PCI_ACPI_UNUSED, + PCI_BAR_EVEN_ALIGN, + PCI_BAR_ALL, + PCI_BAR_NOCHANGE, + // + // Device Agilent 103C + // + DEVICE_INF_TAG, + PCI_DEVICE_ID(0x103C, DEVICE_ID_NOCARE, DEVICE_ID_NOCARE, DEVICE_ID_NOCARE, DEVICE_ID_NOCARE), + DEVICE_RES_TAG, + PCI_BAR_TYPE_IO, + PCI_ACPI_UNUSED, + PCI_ACPI_UNUSED, + PCI_ACPI_UNUSED, + PCI_ACPI_UNUSED, + PCI_BAR_EVEN_ALIGN, + PCI_BAR_ALL, + PCI_BAR_NOCHANGE, + // + // Device Agilent 15BC + // + DEVICE_INF_TAG, + PCI_DEVICE_ID(0x15BC, DEVICE_ID_NOCARE, DEVICE_ID_NOCARE, DEVICE_ID_NOCARE, DEVICE_ID_NOCARE), + DEVICE_RES_TAG, + PCI_BAR_TYPE_IO, + PCI_ACPI_UNUSED, + PCI_ACPI_UNUSED, + PCI_ACPI_UNUSED, + PCI_ACPI_UNUSED, + PCI_BAR_EVEN_ALIGN, + PCI_BAR_ALL, + PCI_BAR_NOCHANGE, + // + // The end of the list + // + LIST_END_TAG +}; + +// +// the incompatible PCI devices list for the values of configuration registers +// +GLOBAL_REMOVE_IF_UNREFERENCED UINT64 IncompatiblePciDeviceListForRegister[] = { + // + // DEVICE_INF_TAG, + // PCI_DEVICE_ID (VendorID, DeviceID, Revision, SubVendorId, SubDeviceId), + // PCI_RES_TAG, + // PCI_ACCESS_TYPE, PCI_CONFIG_ADDRESS, + // AND_VALUE, OR_VALUE + + // + // Device Lava 0x1407, DeviceId 0x0110 + // + DEVICE_INF_TAG, + PCI_DEVICE_ID(0x1407, 0x0110, DEVICE_ID_NOCARE, DEVICE_ID_NOCARE, DEVICE_ID_NOCARE), + DEVICE_RES_TAG, + PCI_REGISTER_READ, + PCI_CAPBILITY_POINTER_OFFSET, + 0xffffff00, + VALUE_NOCARE, + + // + // Device Lava 0x1407, DeviceId 0x0111 + // + DEVICE_INF_TAG, + PCI_DEVICE_ID(0x1407, 0x0111, DEVICE_ID_NOCARE, DEVICE_ID_NOCARE, DEVICE_ID_NOCARE), + DEVICE_RES_TAG, + PCI_REGISTER_READ, + PCI_CAPBILITY_POINTER_OFFSET, + 0xffffff00, + VALUE_NOCARE, + + // + // The end of the list + // + LIST_END_TAG +}; + +// +// the incompatible PCI devices list for the access width of configuration registers +// +GLOBAL_REMOVE_IF_UNREFERENCED UINT64 DeviceListForAccessWidth[] = { + // + // DEVICE_INF_TAG, + // PCI_DEVICE_ID (VendorID, DeviceID, Revision, SubVendorId, SubDeviceId), + // DEVICE_RES_TAG, + // PCI_ACCESS_TYPE, PCI_ACCESS_WIDTH, + // START_ADDRESS, END_ADDRESS, + // ACTUAL_PCI_ACCESS_WIDTH, + // + + // + // Sample Device + // + //DEVICE_INF_TAG, + //PCI_DEVICE_ID(0xXXXX, DEVICE_ID_NOCARE, DEVICE_ID_NOCARE, DEVICE_ID_NOCARE, DEVICE_ID_NOCARE), + //DEVICE_RES_TAG, + //PCI_REGISTER_READ, + //EfiPciWidthUint8, + //0, + //0xFF, + //EfiPciWidthUint32, + // + + // + // The end of the list + // + LIST_END_TAG +}; + +#endif diff --git a/IntelFrameworkModulePkg/Library/PciIncompatibleDeviceSupportLib/PciIncompatibleDeviceSupportLib.c b/IntelFrameworkModulePkg/Library/PciIncompatibleDeviceSupportLib/PciIncompatibleDeviceSupportLib.c new file mode 100644 index 0000000000..8c974584da --- /dev/null +++ b/IntelFrameworkModulePkg/Library/PciIncompatibleDeviceSupportLib/PciIncompatibleDeviceSupportLib.c @@ -0,0 +1,393 @@ +/** @file + The implementation of PCI incompatible device support libary. + +Copyright (c) 2007 Intel Corporation. All rights reserved.
+This software and associated documentation (if any) is furnished +under a license and may only be used or copied in accordance +with the terms of the license. Except as permitted by such +license, no part of this software or documentation may be +reproduced, stored in a retrieval system, or transmitted in any +form or by any means without the express written consent of +Intel Corporation. + +**/ + +// +// Include common header file for this module. +// +#include "CommonHeader.h" + +#include "IncompatiblePciDeviceList.h" + +/** + Check whether two PCI devices matched + + @param PciDeviceInfo A pointer to EFI_PCI_DEVICE_INFO. + @param Header A pointer to EFI_PCI_DEVICE_INFO. + + @retval returns EFI_SUCCESS if two PCI device matched. +**/ +STATIC +EFI_STATUS +DeviceCheck ( + IN EFI_PCI_DEVICE_INFO *PciDeviceInfo, + IN EFI_PCI_DEVICE_INFO *Header + ) +{ + // + // See if the Header matches the parameters passed in + // + if (Header->VendorID != DEVICE_ID_NOCARE) { + if (PciDeviceInfo->VendorID != Header->VendorID) { + return EFI_UNSUPPORTED; + } + } + + if (Header->DeviceID != DEVICE_ID_NOCARE) { + if (PciDeviceInfo->DeviceID != Header->DeviceID) { + return EFI_UNSUPPORTED; + } + } + + if (Header->RevisionID != DEVICE_ID_NOCARE) { + if (PciDeviceInfo->RevisionID != Header->RevisionID) { + return EFI_UNSUPPORTED; + } + } + + if (Header->SubsystemVendorID != DEVICE_ID_NOCARE) { + if (PciDeviceInfo->SubsystemVendorID != Header->SubsystemVendorID) { + return EFI_UNSUPPORTED; + } + } + + if (Header->SubsystemID != DEVICE_ID_NOCARE) { + if (PciDeviceInfo->SubsystemID != Header->SubsystemID) { + return EFI_UNSUPPORTED; + } + } + + return EFI_SUCCESS; +} + + +/** + Check the incompatible device list for ACPI resource update and return + the configuration + + This function searches the incompatible device list according to request + information. If the PCI device belongs to the devices list, corresponding + configuration informtion will be returned, in the meantime return EFI_SUCCESS. + + @param PciDeviceInfo A pointer to PCI device information. + @param Configuration Returned information. + + @retval returns EFI_SUCCESS if check incompatible device ok. + Otherwise return EFI_UNSUPPORTED. +**/ +RETURN_STATUS +EFIAPI +PciResourceUpdateCheck ( + IN EFI_PCI_DEVICE_INFO *PciDeviceInfo, + OUT VOID *Configuration + ) +{ + UINT64 Tag; + UINT64 *ListPtr; + UINT64 *TempListPtr; + EFI_PCI_DEVICE_INFO *Header; + EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR *AcpiPtr; + EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR *OldAcpiPtr; + EFI_PCI_RESOUCE_DESCRIPTOR *Dsc; + EFI_ACPI_END_TAG_DESCRIPTOR *PtrEnd; + UINTN Index; + + ASSERT (PciDeviceInfo != NULL); + + // + // Initialize the return value to NULL + // + * (VOID **) Configuration = NULL; + + ListPtr = IncompatiblePciDeviceListForResource; + while (*ListPtr != LIST_END_TAG) { + + Tag = *ListPtr; + + switch (Tag) { + case DEVICE_INF_TAG: + Header = (EFI_PCI_DEVICE_INFO *) (ListPtr + 1); + ListPtr = ListPtr + 1 + sizeof (EFI_PCI_DEVICE_INFO) / sizeof (UINT64); + + if (DeviceCheck (PciDeviceInfo, Header) != EFI_SUCCESS) { + continue; + } + + // + // Matched an item, so construct the ACPI descriptor for the resource. + // + // + // Count the resource items so that to allocate space + // + for (Index = 0, TempListPtr = ListPtr; *TempListPtr == DEVICE_RES_TAG; Index++) { + TempListPtr = TempListPtr + 1 + ((sizeof (EFI_PCI_RESOUCE_DESCRIPTOR)) / sizeof (UINT64)); + } + // + // If there is at least one type of resource request, + // allocate a acpi resource node + // + if (Index == 0) { + return EFI_ABORTED; + } + + AcpiPtr = AllocateZeroPool ( + sizeof (EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR) * Index + sizeof (EFI_ACPI_END_TAG_DESCRIPTOR) + ); + + OldAcpiPtr = AcpiPtr; + + // + // Fill the EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR structure + // according to the EFI_PCI_RESOUCE_DESCRIPTOR structure + // + for (; *ListPtr == DEVICE_RES_TAG;) { + + Dsc = (EFI_PCI_RESOUCE_DESCRIPTOR *) (ListPtr + 1); + + AcpiPtr->Desc = ACPI_ADDRESS_SPACE_DESCRIPTOR; + AcpiPtr->Len = sizeof (EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR); + AcpiPtr->ResType = (UINT8) Dsc->ResType; + AcpiPtr->GenFlag = (UINT8) Dsc->GenFlag; + AcpiPtr->SpecificFlag = (UINT8) Dsc->SpecificFlag; + AcpiPtr->AddrSpaceGranularity = Dsc->AddrSpaceGranularity;; + AcpiPtr->AddrRangeMin = Dsc->AddrRangeMin; + AcpiPtr->AddrRangeMax = Dsc->AddrRangeMax; + AcpiPtr->AddrTranslationOffset = Dsc->AddrTranslationOffset; + AcpiPtr->AddrLen = Dsc->AddrLen; + + ListPtr = ListPtr + 1 + ((sizeof (EFI_PCI_RESOUCE_DESCRIPTOR)) / sizeof (UINT64)); + AcpiPtr++; + } + // + // put the checksum + // + PtrEnd = (EFI_ACPI_END_TAG_DESCRIPTOR *) (AcpiPtr); + PtrEnd->Desc = ACPI_END_TAG_DESCRIPTOR; + PtrEnd->Checksum = 0; + + *(VOID **) Configuration = OldAcpiPtr; + + return EFI_SUCCESS; + + case DEVICE_RES_TAG: + // + // Adjust the pointer to the next PCI resource descriptor item + // + ListPtr = ListPtr + 1 + ((sizeof (EFI_PCI_RESOUCE_DESCRIPTOR)) / sizeof (UINT64)); + break; + + default: + return EFI_UNSUPPORTED; + } + } + + return EFI_UNSUPPORTED; + +} + +/** + Check the incompatible device list and return configuraton register mask values. + + This function searches the incompatible device list according to request + information. If the PCI device belongs to the devices list, corresponding + configuration informtion will be returned, in the meantime return EFI_SUCCESS. + + @param PciDeviceInfo A pointer to EFI_PCI_DEVICE_INFO. + @param AccessType Access Type, READ or WRITE. + @param Offset The address within the PCI configuration space. + @param Configuration Returned information. + + @retval returns EFI_SUCCESS if check incompatible device ok. + Otherwise return EFI_UNSUPPORTED. +**/ +RETURN_STATUS +EFIAPI +PciRegisterUpdateCheck ( + IN EFI_PCI_DEVICE_INFO *PciDeviceInfo, + IN UINT64 AccessType, + IN UINT64 Offset, + OUT VOID *Configuration + ) +{ + EFI_PCI_DEVICE_INFO *Header; + UINT64 Tag; + UINT64 *ListPtr; + EFI_PCI_REGISTER_VALUE_DATA *RegisterPtr; + EFI_PCI_REGISTER_VALUE_DATA *Dsc; + + ASSERT (PciDeviceInfo != NULL); + + ListPtr = IncompatiblePciDeviceListForRegister; + + // + // Initialize the return value to NULL + // + * (VOID **) Configuration = NULL; + + while (*ListPtr != LIST_END_TAG) { + + Tag = *ListPtr; + + switch (Tag) { + case DEVICE_INF_TAG: + Header = (EFI_PCI_DEVICE_INFO *) (ListPtr + 1); + ListPtr = ListPtr + 1 + sizeof (EFI_PCI_DEVICE_INFO) / sizeof (UINT64); + + // + // Check whether the PCI device matches the device in the incompatible devices list? + // If not, ship next + // + if (DeviceCheck (PciDeviceInfo, Header) != EFI_SUCCESS) { + continue; + } + + // + // Matched an item, check whether access matches? + // + for (; *ListPtr == DEVICE_RES_TAG;) { + ListPtr ++; + if (((EFI_PCI_REGISTER_VALUE_DESCRIPTOR *)ListPtr)->Offset == (Offset & 0xfc)) { + if (((EFI_PCI_REGISTER_VALUE_DESCRIPTOR *)ListPtr)->AccessType == AccessType) { + + Dsc = (EFI_PCI_REGISTER_VALUE_DATA *) (ListPtr + 2); + RegisterPtr = AllocateZeroPool (sizeof (EFI_PCI_REGISTER_VALUE_DATA)); + + RegisterPtr->AndValue = Dsc->AndValue; + RegisterPtr->OrValue = Dsc->OrValue; + + *(VOID **) Configuration = RegisterPtr; + + return EFI_SUCCESS; + } + } + ListPtr += sizeof (EFI_PCI_REGISTER_VALUE_DESCRIPTOR) / (sizeof (UINT64)); + } + return EFI_UNSUPPORTED; + + case DEVICE_RES_TAG: + // + // Adjust the pointer to the next item + // + ListPtr = ListPtr + 1 + ((sizeof (EFI_PCI_REGISTER_VALUE_DESCRIPTOR)) / sizeof (UINT64)); + break; + + default: + return EFI_UNSUPPORTED; + } + } + + return EFI_UNSUPPORTED; +} + +/** + Check the incompatible device list for access width incompatibility and + return the configuration + + This function searches the incompatible device list for access width + incompatibility according to request information. If the PCI device + belongs to the devices list, corresponding configuration informtion + will be returned, in the meantime return EFI_SUCCESS. + + @param PciDeviceInfo A pointer to PCI device information. + @param AccessType Access type, READ or WRITE. + @param Offset The address within the PCI configuration space. + @param AccessWidth Access width needs to check incompatibility. + @param Configuration Returned information. + + @retval returns EFI_SUCCESS if check incompatible device ok. + Otherwise return EFI_UNSUPPORTED. +**/ +RETURN_STATUS +EFIAPI +PciRegisterAccessCheck ( + IN EFI_PCI_DEVICE_INFO *PciDeviceInfo, + IN UINT64 AccessType, + IN UINT64 Offset, + IN UINT64 AccessWidth, + OUT VOID *Configuration + ) +{ + EFI_PCI_DEVICE_INFO *Header; + UINT64 Tag; + UINT64 *ListPtr; + EFI_PCI_REGISTER_ACCESS_DATA *RegisterPtr; + EFI_PCI_REGISTER_ACCESS_DATA *Dsc; + + ASSERT (PciDeviceInfo != NULL); + + ListPtr = DeviceListForAccessWidth; + + // + // Initialize the return value to NULL + // + * (VOID **) Configuration = NULL; + + while (*ListPtr != LIST_END_TAG) { + + Tag = *ListPtr; + + switch (Tag) { + case DEVICE_INF_TAG: + Header = (EFI_PCI_DEVICE_INFO *) (ListPtr + 1); + ListPtr = ListPtr + 1 + sizeof (EFI_PCI_DEVICE_INFO) / sizeof (UINT64); + + // + // Check whether the PCI device matches the device in the incompatible devices list? + // If not, ship next + // + if (DeviceCheck (PciDeviceInfo, Header) != EFI_SUCCESS) { + continue; + } + + // + // Matched an item, check whether access matches? + // + for (; *ListPtr == DEVICE_RES_TAG;) { + ListPtr ++; + if (((EFI_PCI_REGISTER_ACCESS_DESCRIPTOR *) ListPtr)->AccessType == AccessType && + ((EFI_PCI_REGISTER_ACCESS_DESCRIPTOR *) ListPtr)->AccessWidth == AccessWidth ) { + + Dsc = (EFI_PCI_REGISTER_ACCESS_DATA *) (ListPtr + 2); + + if((Dsc->StartOffset <= Offset) && (Dsc->EndOffset > Offset)) { + + RegisterPtr = AllocateZeroPool (sizeof (EFI_PCI_REGISTER_ACCESS_DATA)); + + RegisterPtr->StartOffset = Dsc->StartOffset; + RegisterPtr->EndOffset = Dsc->EndOffset; + RegisterPtr->Width = Dsc->Width; + + *(VOID **) Configuration = RegisterPtr; + + return EFI_SUCCESS; + } + } + ListPtr += sizeof (EFI_PCI_REGISTER_ACCESS_DESCRIPTOR) / (sizeof (UINT64)); + } + return EFI_UNSUPPORTED; + + case DEVICE_RES_TAG: + // + // Adjust the pointer to the next item + // + ListPtr = ListPtr + 1 + ((sizeof (EFI_PCI_REGISTER_ACCESS_DESCRIPTOR)) / sizeof (UINT64)); + break; + + default: + return EFI_UNSUPPORTED; + } + } + + return EFI_UNSUPPORTED; +} + diff --git a/IntelFrameworkModulePkg/Library/PciIncompatibleDeviceSupportLib/PciIncompatibleDeviceSupportLib.inf b/IntelFrameworkModulePkg/Library/PciIncompatibleDeviceSupportLib/PciIncompatibleDeviceSupportLib.inf new file mode 100644 index 0000000000..23c01aa035 --- /dev/null +++ b/IntelFrameworkModulePkg/Library/PciIncompatibleDeviceSupportLib/PciIncompatibleDeviceSupportLib.inf @@ -0,0 +1,82 @@ +#/** @file +# PCI Incompatible device support Library +# +# Check PCI incompatible devices and set necessary configuration +# Copyright (c) 2007, Intel Corporation. +# +# All rights reserved. This program and the accompanying materials +# are licensed and made available under the terms and conditions of the BSD License +# which accompanies this distribution. The full text of the license may be found at +# http://opensource.org/licenses/bsd-license.php +# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. +# +# +#**/ + +################################################################################ +# +# Defines Section - statements that will be processed to create a Makefile. +# +################################################################################ +[Defines] + INF_VERSION = 0x00010005 + BASE_NAME = EdkPciIncompatibleDeviceSupportLib + FILE_GUID = 1ca1c1f9-5baf-4204-b6e5-5e24109a4e4e + MODULE_TYPE = DXE_DRIVER + VERSION_STRING = 1.0 + LIBRARY_CLASS = PciIncompatibleDeviceSupportLib + EDK_RELEASE_VERSION = 0x00020000 + EFI_SPECIFICATION_VERSION = 0x00020000 + + +# +# The following information is for reference only and not required by the build tools. +# +# VALID_ARCHITECTURES = IA32 X64 IPF EBC +# + +################################################################################ +# +# Sources Section - list of files that are required for the build to succeed. +# +################################################################################ + +[Sources.common] + IncompatiblePciDeviceList.h + PciIncompatibleDeviceSupportLib.c + CommonHeader.h + + +################################################################################ +# +# Includes Section - list of Include locations that are required for +# this module. +# +################################################################################ + +[Includes] + $(WORKSPACE)/MdePkg/Include + $(WORKSPACE)/IntelFrameworkModulePkg/Include + +################################################################################ +# +# Package Dependency Section - list of Package files that are required for +# this module. +# +################################################################################ + +[Packages] + MdePkg/MdePkg.dec + IntelFrameworkModulePkg/IntelFrameworkModulePkg.dec + +################################################################################ +# +# Library Class Section - list of Library Classes that are required for +# this module. +# +################################################################################ + +[LibraryClasses] + MemoryAllocationLib + DebugLib diff --git a/IntelFrameworkModulePkg/Library/PciIncompatibleDeviceSupportLib/PciIncompatibleDeviceSupportLib.msa b/IntelFrameworkModulePkg/Library/PciIncompatibleDeviceSupportLib/PciIncompatibleDeviceSupportLib.msa new file mode 100644 index 0000000000..4807dcbb1b --- /dev/null +++ b/IntelFrameworkModulePkg/Library/PciIncompatibleDeviceSupportLib/PciIncompatibleDeviceSupportLib.msa @@ -0,0 +1,47 @@ + + + + EdkPciIncompatibleDeviceSuppportLib + DXE_DRIVER + 1ca1c1f9-5baf-4204-b6e5-5e24109a4e4e + 1.0 + PCI Incompatible device support Library + Check PCI incompatible devices and set necessary configuration + Copyright (c) 2007, Intel Corporation. + All rights reserved. This program and the accompanying materials + are licensed and made available under the terms and conditions of the BSD License + which accompanies this distribution. The full text of the license may be found at + http://opensource.org/licenses/bsd-license.php + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + FRAMEWORK_BUILD_PACKAGING_SPECIFICATION 0x00000052 + + + IA32 X64 IPF EBC + false + EdkPciIncompatibleDeviceSupportLib + + + + PciIncompatibleDeviceSupportLib + + + MemoryAllocationLib + + + DebugLib + + + + PciIncompatibleDeviceSupportLib.c + IncompatiblePciDeviceList.h + + + + + + + EFI_SPECIFICATION_VERSION 0x00020000 + EDK_RELEASE_VERSION 0x00020000 + + \ No newline at end of file -- 2.39.2