summaryrefslogtreecommitdiff
path: root/ReferenceCode/Pfat/PfatFlashLib
diff options
context:
space:
mode:
authorraywu <raywu0301@gmail.com>2018-06-15 00:00:50 +0800
committerraywu <raywu0301@gmail.com>2018-06-15 00:00:50 +0800
commitb7c51c9cf4864df6aabb99a1ae843becd577237c (patch)
treeeebe9b0d0ca03062955223097e57da84dd618b9a /ReferenceCode/Pfat/PfatFlashLib
downloadzprj-b7c51c9cf4864df6aabb99a1ae843becd577237c.tar.xz
init. 1AQQW051HEADmaster
Diffstat (limited to 'ReferenceCode/Pfat/PfatFlashLib')
-rw-r--r--ReferenceCode/Pfat/PfatFlashLib/PfatFlashLib.c710
-rw-r--r--ReferenceCode/Pfat/PfatFlashLib/PfatFlashLib.cif12
-rw-r--r--ReferenceCode/Pfat/PfatFlashLib/PfatFlashLib.mak86
-rw-r--r--ReferenceCode/Pfat/PfatFlashLib/PfatFlashLib.sdl95
4 files changed, 903 insertions, 0 deletions
diff --git a/ReferenceCode/Pfat/PfatFlashLib/PfatFlashLib.c b/ReferenceCode/Pfat/PfatFlashLib/PfatFlashLib.c
new file mode 100644
index 0000000..2d144d1
--- /dev/null
+++ b/ReferenceCode/Pfat/PfatFlashLib/PfatFlashLib.c
@@ -0,0 +1,710 @@
+//*************************************************************************
+//*************************************************************************
+//** **
+//** (C)Copyright 1985-2009, American Megatrends, Inc. **
+//** **
+//** All Rights Reserved. **
+//** **
+//** 5555 Oakbrook Parkway, Suite 200, Norcross, GA 30093 **
+//** **
+//** Phone: (770)-246-8600 **
+//** **
+//*************************************************************************
+//*************************************************************************
+
+//**********************************************************************
+// $Header: /Alaska/SOURCE/Modules/SharkBayRefCodes/IntelPfat/Pfatflashlib/PfatFlashLib.c 9 4/24/13 7:39p Fredericko $
+//
+// $Revision: 9 $
+//
+// $Date: 4/24/13 7:39p $
+//
+// $Log: /Alaska/SOURCE/Modules/SharkBayRefCodes/IntelPfat/Pfatflashlib/PfatFlashLib.c $
+//
+// 9 4/24/13 7:39p Fredericko
+// [TAG] EIP120447
+// [Category] Improvement
+// [Description] SHB ULT: PFAT : Update with AFU Tools Fails SUT Locks
+// [Files] PfatFlashLib.c
+// PfatFlashLib.sdl
+//
+// 8 12/19/12 7:23p Fredericko
+// [TAG] EIP109350
+// [Category] Bug Fix
+// [Severity] Minor
+// [Solution] Building error when the token of BUILD_PEI_FLASH_LIB = 1
+// for PFAT module
+// [Files] PfatFlashLib.c
+// PfatFlashLib.mak
+//
+// 7 12/03/12 6:19p Fredericko
+// [TAG] EIP107344
+// [Category] Bug Fix
+// [Severity] Minor
+// [Symptom] Afulnx fails
+// [Solution] AFULNX2(Test BIOS to Test BIOS)_1AQPM016_Pretest
+// [Files] PfatFlashLib.c
+//
+// 6 11/08/12 3:23a Fredericko
+// Changes for flash write. Requires Pi 1.1 and above support
+//
+// 5 11/02/12 8:26p Fredericko
+// [TAG] EIP105153
+// [Description] Possible system hang if NVRAM is access during legacy
+// O.S.
+//
+// 4 10/16/12 6:45p Fredericko
+// [TAG] EIP103945
+// [Category] Bug Fix
+// [Severity] Normal
+// [Symptom] System hang
+// [RootCause] PfatInitialize check failure
+// [Solution] The system can't enter UEFI WIN8 OS when PFAT is Disabled
+// on seutp menu
+// [Files] PfatFlashLib.c
+//
+// 3 9/26/12 11:45a Fredericko
+// [TAG] EIP102376
+// [Description] Pfat CHM
+//
+// 2 9/17/12 4:27p Fredericko
+//
+// Initial Checkin
+//
+//
+//**********************************************************************
+//<AMI_FHDR_START>
+//
+// Name: PfatFlashLib.c
+//
+// Description: Code listing file for Pfat flashlib
+//
+//<AMI_FHDR_END>
+//**********************************************************************
+
+//----------------------------------------------------------------------
+// Includes
+#include <efi.h>
+#include <FlashPart.h>
+#include "token.h"
+#if defined _DXE_FLASH_LIB_
+#include <AmiDxeLib.h>
+#include "Pfat\Pfat.h"
+#include <Protocol\SmmBase2.h>
+#include <Protocol\SmiFlash.h>
+#include <AmiCspLib.h>
+#include "ReferenceCode\Haswell\Include\CpuRegs.h"
+#ifndef BIT35
+#define BIT35 0x0000000800000000ULL
+#endif
+
+
+typedef BOOLEAN (IDENTIFY)(
+ volatile UINT8* pBlockAddress,
+ FLASH_PART **Struct
+ );
+
+extern UINT16 gFlashId;
+FLASH_PART *FlashInitialized = NULL;
+PFAT_PROTOCOL *PfatInstance = NULL;
+extern IDENTIFY* FlashList[];
+EFI_SMM_SYSTEM_TABLE2 *mSmst = NULL;
+EFI_SMM_BASE2_PROTOCOL *gSmmBase2 = NULL;
+BOOLEAN InSmm;
+EFI_EVENT SmmPfatAvailableEvent;
+EFI_EVENT SmmAvailableEvent;
+EFI_GUID gSmmPfatProtocolGuid = SMM_PFAT_PROTOCOL_GUID;
+
+VOID
+PfatFlashEraseCommand (
+ volatile UINT8 *pBlockAddress
+);
+
+
+VOID
+PfatProgramCommand (
+ volatile UINT8 *pByteAddress,
+ UINT8 *Byte,
+ UINT32 *Length
+);
+
+
+VOID
+PfatReadCommand (
+ volatile UINT8 *pByteAddress,
+ UINT8 *Byte,
+ UINT32 *Length
+);
+
+
+BOOLEAN
+PfatIsEraseCompleted (
+ IN volatile UINT8 *pBlockAddress,
+ OUT BOOLEAN *pError,
+ OUT UINTN *pStatus
+);
+
+
+BOOLEAN
+PfatProgramCompleted (
+ volatile UINT8 *pByteAddress,
+ UINT8 *Byte,
+ UINT32 Length,
+ BOOLEAN *pError,
+ UINTN *pStatus
+);
+
+
+VOID
+PfatBlockWriteEnable(
+ UINT8 *pBlockAddress
+);
+
+
+VOID
+PfatBlockWriteDisable (
+ UINT8 *pBlockAddress
+);
+
+
+VOID
+PfatDeviceWriteEnable (
+ VOID
+);
+
+
+VOID
+PfatDeviceWriteDisable (
+ VOID
+);
+
+
+VOID
+PfatDeviceVirtualFixup (
+ EFI_RUNTIME_SERVICES *pRS
+);
+
+
+#define SECTOR_SIZE_4KB 0x1000 // Common 4kBytes sector size
+
+FLASH_PART mPfatFlash =
+ {
+ PfatReadCommand,
+ PfatFlashEraseCommand,
+ PfatProgramCommand,
+ PfatIsEraseCompleted,
+ PfatProgramCompleted,
+ PfatBlockWriteEnable,
+ PfatBlockWriteDisable,
+ PfatDeviceWriteEnable,
+ PfatDeviceWriteDisable,
+ PfatDeviceVirtualFixup,
+ 1,
+ SECTOR_SIZE_4KB
+ };
+
+
+
+
+
+EFI_STATUS
+OnSmmPfatProtocolAvailable (
+ IN EFI_EVENT Event,
+ IN VOID *Context
+ )
+{
+ EFI_STATUS Status;
+
+ if(gSmmBase2 == NULL){
+ Status = pBS->LocateProtocol( &gEfiSmmBase2ProtocolGuid, NULL, &gSmmBase2 );
+ }
+
+ if(gSmmBase2!= NULL){
+ if(mSmst == NULL){
+ Status = gSmmBase2->GetSmstLocation (gSmmBase2, &mSmst);
+ }
+ }
+
+ Status = gSmmBase2->InSmm(gSmmBase2, &InSmm);
+
+ Status = pBS->LocateProtocol (&gSmmPfatProtocolGuid,
+ NULL,
+ &PfatInstance);
+
+ pBS->CloseEvent (SmmPfatAvailableEvent);
+ return EFI_SUCCESS;
+}
+
+
+//<AMI_PHDR_START>
+//----------------------------------------------------------------------
+// Procedure: IdentifyPfatFlash
+//
+// Description: Identifies whether PfatFlash library should control access to
+// SPI flash part
+//
+// Input: volatile UINT8 *pBlockAddress
+//
+// Output: FLASH_PART **FlashStruc
+//
+// Returns: BOOLEAN
+//
+//----------------------------------------------------------------------
+//<AMI_PHDR_END>
+BOOLEAN
+IdentifyPfatFlash (
+ IN volatile UINT8 *pBlockAddress,
+ OUT FLASH_PART **FlashStruc
+)
+{
+ UINTN i;
+ BOOLEAN found = FALSE;
+ EFI_STATUS Status;
+ VOID *Reg;
+
+ if ( !((ReadMsr (MSR_PLATFORM_INFO) & B_MSR_PLATFORM_INFO_PFAT_AVAIL) &&
+ (ReadMsr (MSR_PLAT_FRMW_PROT_CTRL) & B_MSR_PLAT_FRMW_PROT_CTRL_EN)) ) {
+ //
+ // Pfat disabled or not support
+ //
+ return FALSE;
+ }
+
+ if(FlashInitialized == NULL)
+ {
+ for(i=1; !found && FlashList[i]; i++)
+ {
+ found=FlashList[i](pBlockAddress, &FlashInitialized);
+ }
+ }
+
+ if(FlashInitialized == NULL)return FALSE;
+
+ if(found)
+ {
+ *FlashStruc = &mPfatFlash;
+
+ Status = pBS->CreateEvent (EFI_EVENT_NOTIFY_SIGNAL,
+ TPL_CALLBACK,
+ OnSmmPfatProtocolAvailable,
+ NULL,
+ &SmmPfatAvailableEvent);
+
+ if(!EFI_ERROR(Status)){
+ Status = pBS->RegisterProtocolNotify (
+ &gSmmPfatProtocolGuid,
+ SmmPfatAvailableEvent,
+ &Reg);
+ }
+ }
+
+
+ return found;
+}
+
+
+//<AMI_PHDR_START>
+//----------------------------------------------------------------------
+// Procedure: IsPfatFlashInitialized
+//
+// Description: Verifies whether Pfat library has been initialized or not
+//
+// Input: VOID
+//
+// Output: VOID
+//
+// Returns: BOOLEAN
+//
+//----------------------------------------------------------------------
+//<AMI_PHDR_END>
+BOOLEAN
+IsPfatFlashInitialized()
+{
+ EFI_STATUS Status;
+
+ if((PfatInstance == NULL) && (pST->BootServices != NULL)){
+ if(InSmm == FALSE)
+ {
+ if(gSmmBase2 == NULL){
+ Status = pBS->LocateProtocol( &gEfiSmmBase2ProtocolGuid, NULL, &gSmmBase2 );
+ }
+
+ if(gSmmBase2!= NULL){
+ if(mSmst == NULL){
+ Status = gSmmBase2->GetSmstLocation (gSmmBase2, &mSmst);
+ }
+ Status = gSmmBase2->InSmm(gSmmBase2, &InSmm);
+ }
+
+ Status = pBS->LocateProtocol (&gSmmPfatProtocolGuid,
+ NULL,
+ &PfatInstance);
+
+ }
+
+ }
+
+ if( PfatInstance != NULL ){ return TRUE; }
+ PfatInstance = NULL;
+ return FALSE;
+}
+
+
+
+
+//<AMI_PHDR_START>
+//----------------------------------------------------------------------
+// Procedure: PfatFlashEraseCommand
+//
+// Description: Erases SPI via PFAT library
+//
+// Input: IN volatile UINT8* pBlockAddress
+//
+// Output: VOID
+//
+// Returns: VOID
+//
+//----------------------------------------------------------------------
+//<AMI_PHDR_END>
+VOID
+PfatFlashEraseCommand (
+ IN volatile UINT8* pBlockAddress
+)
+{
+ if(IsPfatFlashInitialized()){
+ PfatInstance->Erase(PfatInstance,
+ (UINTN)(EFI_PHYSICAL_ADDRESS)pBlockAddress);
+ }else{
+ if ( FlashInitialized == NULL)return;
+ FlashInitialized->FlashEraseCommand(pBlockAddress);
+ }
+}
+
+
+
+//<AMI_PHDR_START>
+//----------------------------------------------------------------------
+// Procedure: PfatIsEraseCompleted
+//
+// Description: Checks whether PFAT erase command was completed
+//
+// Input: volatile UINT8 *pBlockAddress
+//
+// Output: BOOLEAN *pError
+// UINTN *pStatus
+//
+// Returns: BOOLEAN
+//
+//----------------------------------------------------------------------
+//<AMI_PHDR_END>
+BOOLEAN
+PfatIsEraseCompleted (
+ IN volatile UINT8 *pBlockAddress,
+ OUT BOOLEAN *pError,
+ OUT UINTN *pStatus
+)
+{
+ if(IsPfatFlashInitialized()){
+ *pError = FALSE;
+ *pStatus = EFI_SUCCESS;
+ }else{
+ if ( FlashInitialized == NULL)return FALSE;
+ return (FlashInitialized->FlashIsEraseCompleted(pBlockAddress,\
+ pError, pStatus));
+ }
+
+ return TRUE;
+}
+
+
+
+//<AMI_PHDR_START>
+//----------------------------------------------------------------------
+// Procedure: PfatFlashProgramCommand
+//
+// Description: Programs SPI part via PFAT library
+//
+// Input: volatile UINT8* pByteAddress
+// UINT8 *Byte
+// UINT32 *Length
+//
+// Output: VOID
+//
+// Return: VOID
+//----------------------------------------------------------------------
+//<AMI_PHDR_END>
+VOID
+PfatProgramCommand (
+ IN volatile UINT8* pByteAddress,
+ IN UINT8 *Byte,
+ IN UINT32 *Length
+)
+{
+ if(IsPfatFlashInitialized()){
+ PfatInstance->Write(PfatInstance,
+ (UINTN)pByteAddress,
+ *Length, Byte);
+ if(((*(UINT8 *)(UINTN)0xFED1F890) & BIT4))
+ {
+ (*(UINT16 *)(UINTN)0xFED1F804)|= BIT2;
+ }
+ PfatInstance->Execute(PfatInstance, FALSE);
+ *Length = 0;
+
+ }else{
+ if ( FlashInitialized == NULL)return;
+ FlashInitialized->FlashProgramCommand(pByteAddress, Byte, Length);
+ }
+}
+
+
+
+
+//<AMI_PHDR_START>
+//----------------------------------------------------------------------
+// Procedure: PfatReadCommand
+//
+// Description: Reads the SPI flash part via PFAT library
+//
+//
+// Input: *pBlockAddress - Address to access flash part
+// *Byte - pointer to data to write to the flash part
+// Length - The total amount of data that Byte points to
+//
+// Output: VOID
+//
+// Return: VOID
+//----------------------------------------------------------------------
+//<AMI_PHDR_END>
+VOID
+PfatReadCommand (
+ volatile UINT8 *pByteAddress,
+ UINT8 *Byte,
+ UINT32 *Length
+)
+{
+ if ( FlashInitialized == NULL)return;
+ FlashInitialized->FlashReadCommand(pByteAddress, Byte, Length);
+}
+
+
+//<AMI_PHDR_START>
+//----------------------------------------------------------------------
+// Procedure: PfatProgramCompleted
+//
+// Description: Checks whether Pfat Flash program was completed
+//
+//
+// Input: *pBlockAddress - Address to access flash part
+// *Byte - values previously written to the Flash Device
+// Length - The amount of data that needs to be checked
+// *pError - Boolean that tells if fatal error occured
+// *pStatus - Status of the erase command
+//
+// Output: *pError - Boolean that tells if fatal error occured
+// *pStatus - Status of the erase command
+//
+// Return: TRUE - Program completed, check pError for fatal error
+// FALSE - programming in progress
+//
+//----------------------------------------------------------------------
+//<AMI_PHDR_END>
+BOOLEAN
+PfatProgramCompleted (
+ IN volatile UINT8* pByteAddress,
+ IN UINT8 *Byte,
+ IN UINT32 Length,
+ OUT BOOLEAN *pError,
+ OUT UINTN *pStatus
+)
+{
+ if (pError) *pError = FALSE;
+ return TRUE;
+}
+
+
+//<AMI_PHDR_START>
+//----------------------------------------------------------------------
+// Procedure: PfatBlockWriteEnable
+//
+// Description: This function chooses the correct flash part to call and
+// then enables write operations(erase/programming) for a specific block
+//
+// Input: *pBlockAddress - Address to access flash part
+//
+// Output: VOID
+//
+// Return: VOID
+//
+//----------------------------------------------------------------------
+//<AMI_PHDR_END>
+VOID
+PfatBlockWriteEnable(
+ UINT8 *pBlockAddress
+)
+{
+ if (IsPfatFlashInitialized())return;
+ if ( FlashInitialized == NULL)return;
+ FlashInitialized->FlashBlockWriteEnable(pBlockAddress);
+}
+
+
+//<AMI_PHDR_START>
+//----------------------------------------------------------------------
+// Procedure: PfatBlockWriteDisable
+//
+// Description: This function chooses the correct flash part to call and
+// then disables write operations(erase/programming) for a specific
+// block
+//
+// Input: *pBlockAddress - Address to access flash part
+//
+// Output: VOID
+//
+// Return: VOID
+//
+//----------------------------------------------------------------------
+//<AMI_PHDR_END>
+VOID
+PfatBlockWriteDisable (
+ IN UINT8 *pBlockAddress
+)
+{
+ if (IsPfatFlashInitialized())return;
+ if ( FlashInitialized == NULL)return;
+ FlashInitialized->FlashBlockWriteDisable(pBlockAddress);
+}
+
+
+
+//<AMI_PHDR_START>
+//----------------------------------------------------------------------
+// Procedure: PfatDeviceWriteEnable
+//
+// Description: This function chooses the correct flash part to call and
+// then enables write operation for a flash device
+//
+// Input: VOID
+//
+// Output: VOID
+//
+// Return: VOID
+//
+//----------------------------------------------------------------------
+//<AMI_PHDR_END>
+VOID
+PfatDeviceWriteEnable (VOID)
+{
+ if (IsPfatFlashInitialized())return;
+ if ( FlashInitialized == NULL)return;
+ FlashInitialized->FlashDeviceWriteEnable();
+}
+
+
+
+
+//<AMI_PHDR_START>
+//----------------------------------------------------------------------
+// Procedure: PfatDeviceWriteDisable
+//
+// Description: This function chooses the correct flash part to call and
+// then disables write operation for a flash device
+//
+// Input: VOID
+//
+// Output: VOID
+//
+// Return: VOID
+//
+//----------------------------------------------------------------------
+//<AMI_PHDR_END>
+VOID
+PfatDeviceWriteDisable(VOID)
+{
+ if (IsPfatFlashInitialized())return;
+ if ( FlashInitialized == NULL)return;
+ FlashInitialized->FlashDeviceWriteDisable();
+}
+
+
+
+//<AMI_PHDR_START>
+//----------------------------------------------------------------------
+// Procedure: PfatDeviceVirtualFixup
+//
+// Description: Fixup global data for for a virtual address space.
+// This routine must be called by the library consumer in the
+// EVT_SIGNAL_VIRTUAL_ADDRESS_CHANGE event handler
+//
+// Input: EFI_RUNTIME_SERVICES *pRS - pointer to the Runtime Services Table
+//
+// Output: VOID
+//
+// Return: VOID
+//
+//----------------------------------------------------------------------
+//<AMI_PHDR_END>
+VOID
+PfatDeviceVirtualFixup (
+ IN EFI_RUNTIME_SERVICES *pRS
+)
+{
+ VOID **p;
+
+ if (IsPfatFlashInitialized()){
+ return;
+ }
+
+ if ( FlashInitialized == NULL)return;
+
+ FlashInitialized->FlashVirtualFixup(pRS);
+
+ for(p = (VOID**)FlashInitialized; p < (VOID**)(FlashInitialized + 1); p++)
+ pRS->ConvertPointer(0, p);
+
+ //Fixup FlashAPI pointer
+ pRS->ConvertPointer(0, &FlashInitialized);
+}
+
+#else
+
+BOOLEAN
+IdentifyPfatFlash (
+ IN volatile UINT8 *pBlockAddress,
+ OUT FLASH_PART **FlashStruc
+)
+{
+ return FALSE;
+}
+
+#endif
+
+VOID
+PreventAFUWhenPfatEnable (
+ IN UINT8 SwSmiNum,
+ IN OUT UINT64 Buffer
+)
+{
+ if (SwSmiNum != 0x25) return;
+ if ( ((ReadMsr (MSR_PLATFORM_INFO) & B_MSR_PLATFORM_INFO_PFAT_AVAIL) &&
+ (ReadMsr (MSR_PLAT_FRMW_PROT_CTRL) & B_MSR_PLAT_FRMW_PROT_CTRL_EN)) ) {
+ //
+ // Update Implemented to TRUE, AFU will assume the SMIFlash is no support.
+ //
+ ((INFO_BLOCK*)Buffer)->Implemented = TRUE;
+ }
+}
+
+//*************************************************************************
+//*************************************************************************
+//** **
+//** (C)Copyright 1985-2012, American Megatrends, Inc. **
+//** **
+//** All Rights Reserved. **
+//** **
+//** 5555 Oakbrook Parkway, Suite 200, Norcross, GA 30093 **
+//** **
+//** Phone: (770)-246-8600 **
+//** **
+//*************************************************************************
+//************************************************************************* \ No newline at end of file
diff --git a/ReferenceCode/Pfat/PfatFlashLib/PfatFlashLib.cif b/ReferenceCode/Pfat/PfatFlashLib/PfatFlashLib.cif
new file mode 100644
index 0000000..bf680e6
--- /dev/null
+++ b/ReferenceCode/Pfat/PfatFlashLib/PfatFlashLib.cif
@@ -0,0 +1,12 @@
+<component>
+ name = "PfatFlashLib"
+ category = ModulePart
+ LocalRoot = "ReferenceCode\Pfat\PfatFlashLib"
+ RefName = "PfatFlashLib"
+[files]
+"PfatFlashLib.sdl"
+"PfatFlashLib.mak"
+"PfatFlashLib.c"
+[parts]
+"HandlePfatLegacy"
+<endComponent>
diff --git a/ReferenceCode/Pfat/PfatFlashLib/PfatFlashLib.mak b/ReferenceCode/Pfat/PfatFlashLib/PfatFlashLib.mak
new file mode 100644
index 0000000..43154fd
--- /dev/null
+++ b/ReferenceCode/Pfat/PfatFlashLib/PfatFlashLib.mak
@@ -0,0 +1,86 @@
+#**********************************************************************
+#**********************************************************************
+#** **
+#** (C)Copyright 1985-2012, American Megatrends, Inc. **
+#** **
+#** All Rights Reserved. **
+#** **
+#** 5555 Oakbrook Pkwy, Suite 200, Norcross, GA 30093 **
+#** **
+#** Phone: (770)-246-8600 **
+#** **
+#**********************************************************************
+#**********************************************************************
+# $Header: /Alaska/SOURCE/Modules/SharkBayRefCodes/IntelPfat/Pfatflashlib/PfatFlashLib.mak 3 12/19/12 7:22p Fredericko $
+#
+# $Revision: 3 $
+#
+# $Date: 12/19/12 7:22p $
+#
+# $Log: /Alaska/SOURCE/Modules/SharkBayRefCodes/IntelPfat/Pfatflashlib/PfatFlashLib.mak $
+#
+# 3 12/19/12 7:22p Fredericko
+# [TAG] EIP109350
+# [Category] Bug Fix
+# [Solution] Building error when the token of BUILD_PEI_FLASH_LIB = 1
+# for PFAT module
+# [Files] PfatFlashLib.c
+# PfatFlashLib.mak
+#
+# 2 9/17/12 4:27p Fredericko
+#
+#**********************************************************************
+#<AMI_FHDR_START>
+#
+# Name: PfatFlashLib.mak
+#
+# Description: Make file for PfatFlashLib
+#
+#<AMI_FHDR_END>
+#**********************************************************************
+all : PfatFlashLib
+
+PfatFlashLib : $(BUILD_DIR)\PfatFlashLib.mak PfatFlashLibBin
+
+#---------------------------------------------------------------------------
+#
+#---------------------------------------------------------------------------
+$(BUILD_DIR)\PfatFlashLib.mak : $(PfatFlashLib_DIR)\$(@B).cif $(PfatFlashLib_DIR)\$(@B).mak $(BUILD_RULES)
+ $(CIF2MAK) $(PfatFlashLib_DIR)\$(@B).cif $(CIF2MAK_DEFAULTS)
+
+#---------------------------------------------------------------------------
+#
+#---------------------------------------------------------------------------
+PFAT_CFLAGS = $(CFLAGS:/W4=/W3) \
+ /I$(CpuProtocolLib_DIR) \
+
+PfatFlashLibBin :
+ @set INCLUDE=%%INCLUDE%%
+ $(MAKE) /$(MAKEFLAGS) $(BUILD_DEFAULTS)\
+ /f $(BUILD_DIR)\PfatFlashLib.mak all\
+ "CFLAGS=$(PFAT_CFLAGS) /D_DXE_FLASH_LIB_" \
+ NAME=PfatFlashLib \
+ TYPE=LIBRARY LIBRARY_NAME=$(PFATFLASHLIB)
+!IF "$(x64_BUILD)"=="1" && "$(BUILD_PEI_FLASH_LIB)"=="1"
+ $(MAKE) /$(MAKEFLAGS) BUILD_ROOT=$(BUILD_DIR)\
+ "EXT_OBJS=$(**:Build\=Build\IA32\)" PROJECT_DIR=$(PROJECT_DIR)\
+ /f $(BUILD_DIR)\PfatFlashLib.mak all\
+ "CFLAGS=$(PFAT_CFLAGS)"\
+ BUILD_DIR=$(BUILD_DIR)\IA32\
+ TYPE=PEI_LIBRARY NAME=PfatFlashLib
+!ENDIF
+
+$(PFATFLASHLIB) : PfatFlashLib
+#-----------------------------------------------------------------------
+#**********************************************************************
+#** **
+#** (C)Copyright 1985-2012, American Megatrends, Inc. **
+#** **
+#** All Rights Reserved. **
+#** **
+#** 5555 Oakbrook Pkwy, Suite 200, Norcross, GA 30093 **
+#** **
+#** Phone: (770)-246-8600 **
+#** **
+#**********************************************************************
+#**********************************************************************
diff --git a/ReferenceCode/Pfat/PfatFlashLib/PfatFlashLib.sdl b/ReferenceCode/Pfat/PfatFlashLib/PfatFlashLib.sdl
new file mode 100644
index 0000000..546f37d
--- /dev/null
+++ b/ReferenceCode/Pfat/PfatFlashLib/PfatFlashLib.sdl
@@ -0,0 +1,95 @@
+#**********************************************************************
+#**********************************************************************
+#** **
+#** (C)Copyright 1985-2012, American Megatrends, Inc. **
+#** **
+#** All Rights Reserved. **
+#** **
+#** 5555 Oakbrook Pkwy, Suite 200, Norcross, GA 30093 **
+#** **
+#** Phone: (770)-246-8600 **
+#** **
+#**********************************************************************
+#**********************************************************************
+# $Header: /Alaska/SOURCE/Modules/SharkBayRefCodes/IntelPfat/Pfatflashlib/PfatFlashLib.sdl 3 4/24/13 7:41p Fredericko $
+#
+# $Revision: 3 $
+#
+# $Date: 4/24/13 7:41p $
+#
+# $Log: /Alaska/SOURCE/Modules/SharkBayRefCodes/IntelPfat/Pfatflashlib/PfatFlashLib.sdl $
+#
+# 3 4/24/13 7:41p Fredericko
+# [TAG] EIP120447
+# [Category] Improvement
+# [Description] SHB ULT: PFAT : Update with AFU Tools Fails SUT Locks
+# [Files] PfatFlashLib.c
+# PfatFlashLib.sdl
+#
+# 2 9/17/12 4:26p Fredericko
+#
+#**********************************************************************
+#<AMI_FHDR_START>
+#
+# Name: PfatFlashLib.sdl
+#
+# Description: SDL file for PfatFlashLib
+#
+#<AMI_FHDR_END>
+#**********************************************************************
+
+PATH
+ Name = "PfatFlashLib_DIR"
+ Help = "PfatFlashLib files source directory"
+End
+
+TOKEN
+ Name = "PFATFLASHLIB"
+ Value = "$(BUILD_DIR)\PfatFlashLib.lib"
+ TokenType = Expression
+ TargetMAK = Yes
+End
+
+ELINK
+ Name = "IdentifyPfatFlash ,"
+ Parent = "FlashList"
+ Token = "PfatServices_SUPPORT" "=" "1"
+ Priority = 60
+ InvokeOrder = AfterParent
+End
+
+ELINK
+ Name = "PreventAFUWhenPfatEnable,"
+ Parent = "SMIFlashEndHandlerList"
+ InvokeOrder = AfterParent
+End
+
+MODULE
+ Help = "Includes PfatFlashLib.mak to Project"
+ File = "PfatFlashLib.mak"
+End
+
+ELINK
+ Name = "$(BUILD_DIR)\PfatFlashLib.lib"
+ Parent = "$(PfatFlashLib_DIR)\PfatFlashLib.lib"
+ InvokeOrder = ReplaceParent
+End
+
+ELINK
+ Name = "$(PfatFlashLib_DIR)\PfatFlashLib.lib"
+ Parent = "FLASHLISTLIB"
+ InvokeOrder = AfterParent
+End
+
+#**********************************************************************
+#**********************************************************************
+#** **
+#** (C)Copyright 1985-2012, American Megatrends, Inc. **
+#** **
+#** All Rights Reserved. **
+#** **
+#** 5555 Oakbrook Pkwy, Suite 200, Norcross, GA 30093 **
+#** **
+#** Phone: (770)-246-8600 **
+#** **
+#********************************************************************** \ No newline at end of file