alder_lake_bios/Intel/AlderLake/AlderLakePlatSamplePkg/Include/Library/BaseEcFlashLib.h

179 lines
7.2 KiB
C

/** @file
@copyright
INTEL CONFIDENTIAL
Copyright 2014 - 2016 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 a 'Sample Driver' and is licensed as such under the terms
of your license agreement with Intel or your vendor. This file may be modified
by the user, subject to the additional terms of the license agreement.
@par Specification Reference:
**/
#ifndef _EC_FLASH_H_
#define _EC_FLASH_H_
#define IMAGE_SIGNATURE 0x2202L // Flash image signature (EC) offset.
#define IMAGE_VERSION_NUM 0x106L // Flash image version number offset.
#define IMAGE_SIZE_OFFSET 0x140L // Flash image size is stored here.
#define PLAT_SIG_OFFSET 0x142L // 8 byte platform signature stored here.
#define IMAGE_ECFW1_OFFSET 0x20000L // Offset of ECFW Image 1
#define IMAGE_ECFW2_OFFSET 0x1000L // Offset of ECFW Image 2(Recovery)
#define UPDATE_FULL 0x0 // update SPIHeader + ECFW1 + ECFW2
#define UPDATE_ECFW1 0x1 // update ECFW1
#define UPDATE_ECFW1_ECFW2 0x2 // update ECFW1 + ECFW2
#define TOTAL_BLKS 0x448 // Total number of 128 byte blocks.
#define FBLOCK_SIZE 128L // Flash line size
#define ECCOMMANDPORT 0x66 // Using EC ports for flashing.
#define ECSTATUSPORT 0x66
#define ECDATAPORT 0x62
//
// EC FLASH COMMANDS:
//
#define FLASHLOADER 0x91 // Command for FLASH reprogram mode.
#define NMIDISABLE 0x93 // Command for H8 NMI Disable.
#define INITERASE 0x01 // Load erase code into RAM and initialize
#define SETERASEBLKNUM 0x02 // Set block num for erase.
#define ERASEFLASHBLK 0x03 // Erase flash block.
#define BLANKCHECK 0x04 // Blank check the part.
#define INITPROGCODE 0x05 // Initialize programming code.
#define LOADFLASHBLK 0x06 // Load flash block for programming.
#define SETFLASHWRITEADDR 0x07 // Set starting address for writes.
#define PROGRAMFLASHBLK 0x08 // Program flash block.
#define VERIFYFLASHBLK 0x09 // Verify flash block.
#define ERASEFLASH 0x0A // Erase entire flash.
#define RESETEC 0x0B // Controller hard reset.
#define READFLASHBYTE 0x0C // Read a byte at address
#define READBLOCK 0x0D // Read a block at address
//
// EC RUNTIME COMMANDS:
//
#define READBYTE 0x01 // Read byte
#define WRITEBYTE 0x02 // Write byte
#define GETSWITCHSTATUS 0x0A // Get switch status
#define ENABLE_POWER_BTN 0x23 // Disable power button functionality
#define DISABLE_POWER_BTN 0x24 // Enable power button functionality
#define READECREVISION 0x90 // Read EC firmware revision number.
#define READECMEM 0x80 // Read the EC memory
#define QUERYSYSSTATUS 0x06 // Returns 1 byte of information about the system status
#define SYS_STATUS_FAN 0x40 // Fan status (1 = ON)
#define SYS_STATUS_DOCK 0x20 // Dock status (1 = Docked)
#define SYS_STATUS_AC 0x10 // AC power (1 = AC powered)
#define SYS_STATUS_THER 0x0F // CPU thermal state (0 ~ 9)
#define PLATFORM_UNKNOWN 0xFF // Unknown platform
#define m_CR 0x0D
#define m_LF 0x0A
#define PCIINDEX 0xCF8
#define PCIDATA 0xCFC
#define ICH_DEVNUM 0x1F
#define ICH_GPIO_BAR 0x58
#define FN0 0x00
#define NMIGPIO_REG 0x38
#define NMIGPIO_BIT 0x01
#define DEVINQSIZE 0x32
#define RMCMDSTRUCTSIZE 128+32
#define BBLKSIZE_OFFSET 0x50 // Offset of boot block size in image
#define EC_SEGMENT 8*1024L
#define TMKBC_SEGMENT 72*1024L
#define ECSEGSIZE_OFFSET 8768L // 8*1024 + 240h
#define PORT1 0x3F8
#define EC_TIME_OUT 0x50000
#define EC_STALL_TIME_OUT 100
#define EC_S_OBF BIT0
#define EC_S_IBF BIT1
/// Note that capacity and voltage are 16 bit values, thus you need to read them from
/// ACPI space with two reads (little Endian).
#define EC_VIRTUAL_BAT_STATUS 48 ///< Status of the virtual battery (present)
#define EC_VIRTUAL_BAT_PRESENT_MASK 0x10 ///< Bit 4 is the indicator
#define EC_REAL_BAT1_STATUS 50 ///< Status of the first real battery (present, charging)
#define EC_REAL_BAT1_REMAINING_PERCENT 52 ///< Remaining capacity in percentage
#define EC_REAL_BAT1_REMAINING_CAPACITY 89 ///< Remaining capacity in mWh
#define EC_REAL_BAT1_RESOLUTION_VOLTAGE 93 ///< Full resolution voltage in mV
#define EC_REAL_BAT2_STATUS 54 ///< Status of the second real battery (present, charging)
#define EC_REAL_BAT2_REMAINING_PERCENT 56 ///< Remaining capacity in percentage
#define EC_REAL_BAT2_REMAINING_CAPACITY 99 ///< Remaining capacity in mWh
#define EC_REAL_BAT2_RESOLUTION_VOLTAGE 103 ///< Full resolution voltage in mV
#define EC_REAL_BAT_PRESENT_MASK 0x8 ///< Bit 3 is the indicator
#define EC_REAL_BAT_CHARGING_MASK 0x1 ///< Bit 1 is the indicator
//
// Function prototypes
//
VOID WaitInputBufferEmpty(VOID);
VOID WaitOutputBufferFull(VOID);
UINT32 EraseFlashBlock(UINT32 BlkNum);
UINT32 WriteFlashBlock(UINT32 *FBufPtr);
UINT32 ComputeBuffChksum(UINT32 *BufPtr, UINT32 BufSize);
void SendEcCommand(UINT32 CmdNum);
void SendEcData(UINT32 Data);
UINT32 ReceiveEcData(void);
UINT32 NmiActive(void);
void Port80(UINT32);
void EcReset(void);
VOID ReadEcRegister(UINT8 Reg, UINT8 *RetValue);
EFI_STATUS EcFlash(UINT8* pFcntrlBin, UINT32 FcntrlBinSize, UINT8* pEcBin, UINT32 EcBinSize);
BOOLEAN IsEcVersionIdentical (UINT8* pEcBin);
//
// Globals
//
UINT32 FlashBuf[FBLOCK_SIZE];
UINT32 *FlashBufPtr;
UINT32 FBlkStartAddr;//ulong
UINT32 FlashBlock;
UINT32 ImageLen;
UINT32 ImageVer;
UINT64 FcntrlLen; //ulong
UINT64 FecSize;
UINT32 FcntrlLenLow;
UINT32 FcntrlLenHigh;
CHAR16 Buff[16];
CHAR16* ptBuff;
CHAR16 PlatformID[9];
UINT32 DevInquirySize;
UINT32 DevInquiryBuff[DEVINQSIZE];
UINT32* DevInqBuffPtr;
UINT32 RMDevCode[4];
CHAR16 RMProdName[10];
UINT32 RMCmdStruct[RMCMDSTRUCTSIZE];
#define EFI_PROPER_VERSION(MajorVer, MinorVer) (gBS->Hdr.Revision >= (MajorVer << 16 | MinorVer))
#endif