214 lines
7.8 KiB
C
214 lines
7.8 KiB
C
/** @file
|
|
Provides an opportunity for ODM to get Eeprom Data.
|
|
|
|
;******************************************************************************
|
|
;* Copyright (c) 2012 - 2016, Insyde Software Corp. All Rights Reserved.
|
|
;*
|
|
;* You may not reproduce, distribute, publish, display, perform, modify, adapt,
|
|
;* transmit, broadcast, present, recite, release, license or otherwise exploit
|
|
;* any part of this publication in any form, by any means, without the prior
|
|
;* written permission of Insyde Software Corporation.
|
|
;*
|
|
;******************************************************************************
|
|
*/
|
|
|
|
#include <L05Config.h>
|
|
#include <FlashRegionLayout.h>
|
|
#include <Library/FeatureLib/OemSvcSmbiosOverride.h>
|
|
#include <Library/UefiBootServicesTableLib.h>
|
|
#include <Library/PcdLib.h>
|
|
#include <Library/FlashRegionLib.h>
|
|
|
|
//[-start-210623-YUNLEI0104-add]//
|
|
#ifdef LCFC_SUPPORT
|
|
#include <Protocol/LenovoVariable.h>
|
|
#include <Library/BaseMemoryLib.h>
|
|
#endif
|
|
//[-end-210623-YUNLEI0104-add]//
|
|
|
|
/**
|
|
Provides an opportunity for ODM get Eeprom Data.
|
|
(Lenovo Sepcification: Lenovo China Minimum BIOS Spec 128.doc - CH.3.4.6 System Management BIOS (SMBIOS)
|
|
LENOVO_CHINA_EEPROMContents_and_Tools_Spsc 1.14 - All Chapter)
|
|
|
|
@@@@@@ The MTM Data will effect Type1-Offset 19 Data. @@@@@@
|
|
if MTM existed (Data Example: 12345678), Type1-Offset 0x19 will be show LENOVO_MT_XXXXX
|
|
if MTM Not exited (Data: 0x0), Type1-Offset 0x19 will be show LENOVO_BI_IDEAPADXX
|
|
|
|
@param BufferPtr Points to VOID that specifies to EEPROM Data (EFI_L05_EEPROM_MAP)
|
|
String must be ASCII.
|
|
@param EepromSize Input Eeprom length, define in Sepc
|
|
|
|
@retval EFI_UNSUPPORTED Returns unsupported by uesed default rule (Load eerpom from default data).
|
|
@retval EFI_MEDIA_CHANGED Get Eeprom Data success.
|
|
**/
|
|
EFI_STATUS
|
|
OemSvcGetEepromData (
|
|
IN OUT VOID *BufferPtr,
|
|
IN UINT16 EepromSize
|
|
)
|
|
{
|
|
/*++
|
|
Todo:
|
|
Add project specific code in here.
|
|
//
|
|
// ODM could use EC or other method to access EEPROM.
|
|
// If the EEPROM region is put in ROM, you may refer to this sample.
|
|
//
|
|
// Note:
|
|
// The UUID in EEPROM is following SMBIOS SPEC :
|
|
// The UUID {00112233-4455-6677-8899-AABBCCDDEEFF} would thus be represented as:
|
|
// 33 22 11 00 55 44 77 66 88 99 AA BB CC DD EE FF => In EEEPROM Type
|
|
// If your UUID in EEPROM wasn't following, please convert it in this function.
|
|
//
|
|
--*/
|
|
|
|
////
|
|
//// BUGBUG:
|
|
////
|
|
//// The Memeory structure will follow definition EFI_L05_EEPROM_MAP in L05Config.h
|
|
//// !!!!!! Please follow EFI_L05_EEPROM_MAP structure to set data !!!!!!
|
|
//// !!!!!! Sructure mapping definition in Spec LENOVO_CHINA_EEPROMContents_and_Tools_Spsc 1.14 ch.3.7 !!!!!!
|
|
//
|
|
//// Sample code :
|
|
// EFI_L05_EEPROM_MAP *L05EerpomBase;
|
|
// L05EerpomBase = (EFI_L05_EEPROM_MAP *) (UINTN) FdmGetNAtAddr (&gL05H2OFlashMapRegionEepromGuid, 1);
|
|
////
|
|
//// Please set data following EFI_L05_EEPROM_MAP structure
|
|
//// Ex: Set ProductName data
|
|
// gBS->CopyMem(L05EerpomBase->ProductName, AnotherEEPROM->ProductName, L05_EEPROM_PRODUCT_NAME_LENGTH);
|
|
// gBS->CopyMem (BufferPtr, (VOID *)L05EerpomBase, EepromSize);
|
|
// return EFI_MEDIA_CHANGED;
|
|
|
|
//[-start-210623-YUNLEI0104-modify]//
|
|
#ifdef LCFC_SUPPORT
|
|
LENOVO_VARIABLE_PROTOCOL *LenovoVariable = NULL;
|
|
EFI_GUID DefaultGuid = LVAR_PRODUCT_NAME_GUID;
|
|
EFI_STATUS Status;
|
|
UINT32 DataSize;
|
|
UINT8 *TempBufferPtr;
|
|
|
|
Status = gBS->LocateProtocol (&gLenovoVariableProtocolGuid, NULL, &LenovoVariable);
|
|
if (EFI_ERROR (Status)) {
|
|
return EFI_SUCCESS;
|
|
}
|
|
|
|
//Make sure buffer is cleared
|
|
SetMem (BufferPtr, EepromSize, 0);
|
|
|
|
//1-5
|
|
//LVAR_MTM_NUMBER_GUID
|
|
DefaultGuid.Data4[7] = 0x02;
|
|
DataSize = L05_EEPROM_MACHINE_TYPE_MODEL_LENGTH;
|
|
TempBufferPtr = (UINT8*)BufferPtr + L05_EEPROM_MACHINE_TYPE_MODEL_OFFSET;
|
|
Status = LenovoVariable->GetVariable (
|
|
LenovoVariable,
|
|
&DefaultGuid,
|
|
&DataSize,
|
|
TempBufferPtr);
|
|
|
|
//1-6, 3-6
|
|
//LVAR_PRODUCT_NAME_GUID
|
|
DefaultGuid.Data4[7] = 0x00;
|
|
DataSize = L05_EEPROM_PRODUCT_NAME_LENGTH;
|
|
TempBufferPtr = (UINT8*)BufferPtr + L05_EEPROM_PRODUCT_NAME_OFFSET;
|
|
Status = LenovoVariable->GetVariable (
|
|
LenovoVariable,
|
|
&DefaultGuid,
|
|
&DataSize,
|
|
TempBufferPtr);
|
|
|
|
//1-8
|
|
//LVAR_UUID_GUID
|
|
DefaultGuid.Data4[7] = 0x05;
|
|
DataSize = L05_EEPROM_UUID_LENGTH;
|
|
TempBufferPtr = (UINT8*)BufferPtr + L05_EEPROM_UUID_OFFSET;
|
|
Status = LenovoVariable->GetVariable (
|
|
LenovoVariable,
|
|
&DefaultGuid,
|
|
&DataSize,
|
|
TempBufferPtr);
|
|
|
|
//1-1a
|
|
//LVAR_FAMILY_NAME_GUID
|
|
DefaultGuid.Data4[7] = 0x0B;
|
|
DataSize = L05_EEPROM_FAMILY_NAME_LENGTH;
|
|
TempBufferPtr = (UINT8*)BufferPtr + L05_EEPROM_FAMILY_NAME_OFFSET;
|
|
Status = LenovoVariable->GetVariable (
|
|
LenovoVariable,
|
|
&DefaultGuid,
|
|
&DataSize,
|
|
TempBufferPtr);
|
|
|
|
//2-5
|
|
//LVAR_PROJECT_NAME_GUID
|
|
DefaultGuid.Data4[7] = 0x01;
|
|
DataSize = L05_EEPROM_PROJECT_NAME_LENGTH;
|
|
TempBufferPtr = (UINT8*)BufferPtr + L05_EEPROM_PROJECT_NAME_OFFSET;
|
|
Status = LenovoVariable->GetVariable (
|
|
LenovoVariable,
|
|
&DefaultGuid,
|
|
&DataSize,
|
|
TempBufferPtr);
|
|
|
|
//2-6
|
|
//LVAR_OS_PN_NUMBER_GUID
|
|
DefaultGuid.Data4[7] = 0x0F;
|
|
DataSize = L05_EEPROM_OS_PN_NUMBER_LENGTH;
|
|
TempBufferPtr = (UINT8*)BufferPtr + L05_EEPROM_OS_PN_NUMBER_OFFSET;
|
|
Status = LenovoVariable->GetVariable (
|
|
LenovoVariable,
|
|
&DefaultGuid,
|
|
&DataSize,
|
|
TempBufferPtr);
|
|
|
|
//2-6
|
|
//LVAR_OS_DESCRIPTOR_GUID
|
|
DefaultGuid.Data4[7] = 0x10;
|
|
DataSize = L05_EEPROM_OS_DESCRIPTOR_LENGTH;
|
|
TempBufferPtr = (UINT8*)BufferPtr + L05_EEPROM_OS_DESCRIPTOR_OFFSET;
|
|
Status = LenovoVariable->GetVariable (
|
|
LenovoVariable,
|
|
&DefaultGuid,
|
|
&DataSize,
|
|
TempBufferPtr);
|
|
|
|
//2-7, 3-7
|
|
//LVAR_LENOVO_SN_GUID
|
|
DefaultGuid.Data4[7] = 0x04;
|
|
DataSize = L05_EEPROM_SERIAL_NUMBER_LENGTH;
|
|
TempBufferPtr = (UINT8*)BufferPtr + L05_EEPROM_SERIAL_NUMBER_OFFSET;
|
|
Status = LenovoVariable->GetVariable (
|
|
LenovoVariable,
|
|
&DefaultGuid,
|
|
&DataSize,
|
|
TempBufferPtr);
|
|
|
|
//2-8, 3-8
|
|
//LVAR_ASSET_TAG_GUID
|
|
DefaultGuid.Data4[7] = 0x0C;
|
|
DataSize = L05_EEPROM_ASSET_TAG_LENGTH;
|
|
TempBufferPtr = (UINT8*)BufferPtr + L05_EEPROM_ASSET_TAG_OFFSET;
|
|
Status = LenovoVariable->GetVariable (
|
|
LenovoVariable,
|
|
&DefaultGuid,
|
|
&DataSize,
|
|
TempBufferPtr);
|
|
|
|
DefaultGuid.Data4[6] = 0x0b;
|
|
DefaultGuid.Data4[7] = 0x00;
|
|
//DefaultGuid = LVAR_OA3_KEY_ID_GUID;
|
|
DataSize = L05_EEPROM_OA3_KEY_ID_LENGTH;
|
|
TempBufferPtr = (UINT8*)BufferPtr + L05_EEPROM_OA3_KEY_ID_OFFSET;
|
|
Status = LenovoVariable->GetVariable (
|
|
LenovoVariable,
|
|
&DefaultGuid,
|
|
&DataSize,
|
|
TempBufferPtr);
|
|
return EFI_MEDIA_CHANGED;
|
|
#else
|
|
return EFI_UNSUPPORTED;
|
|
#endif
|
|
//[-end-210623-YUNLEI0104-modify]//
|
|
}
|