156 lines
5.1 KiB
C
156 lines
5.1 KiB
C
/*****************************************************************************
|
|
*
|
|
*
|
|
* Copyright (c) 2012 - 2015, Hefei LCFC Information Technology Co.Ltd.
|
|
* And/or its affiliates. All rights reserved.
|
|
* Hefei LCFC Information Technology Co.Ltd. PROPRIETARY/CONFIDENTIAL.
|
|
* Use is subject to license terms.
|
|
*
|
|
*****************************************************************************/
|
|
//---------------------------------------------------------------------------
|
|
// Header Files
|
|
//---------------------------------------------------------------------------
|
|
#include <PiPei.h>
|
|
#include <Pi/PiBootMode.h>
|
|
#include <Ppi/Stall.h>
|
|
#include <Library/PeiServicesLib.h>
|
|
|
|
#include <Library/OemSvcLfcCardReaderCfg.h>
|
|
#include <Library/OemSvcLfcRealtekCardReaderCfg.h>
|
|
|
|
//---------------------------------------------------------------------------
|
|
// Variables Defination
|
|
//---------------------------------------------------------------------------
|
|
|
|
PCI_REG_TABLE RTS5232SPciRegTable[] = {
|
|
{ 0x817, 0x00000000, 0x00000080 }, //Unlock
|
|
{ 0x724, 0x00000000, 0x000000AA },
|
|
{ 0x725, 0x00000000, 0x000000FF },
|
|
{ 0x726, 0x00000000, 0x000000FF },
|
|
{ 0x727, 0x00000000, 0x000000EE }, //Disable L0s=bit0, Enable L1=bit1.
|
|
{ 0x814, 0x00000000, 0x00000060 },
|
|
{ 0x815, 0x00000000, 0x00000000 },
|
|
{ 0x816, 0x00000000, 0x00000004 },
|
|
{ 0x817, 0x00000000, 0x00000000 }, //Lock
|
|
};
|
|
|
|
//---------------------------------------------------------------------------
|
|
// Functions
|
|
//---------------------------------------------------------------------------
|
|
|
|
EFI_STATUS
|
|
EFIAPI
|
|
CheckAndProgramRealtekCardReader (
|
|
IN EFI_PEI_SERVICES **PeiServices,
|
|
UINT8 BrgBusNum,
|
|
UINT8 BrgDevNum,
|
|
UINT8 BrgFunNum,
|
|
UINT8 BusNum,
|
|
UINTN MemBaseAddr,
|
|
UINT16 VendorId,
|
|
UINT16 DeviceId
|
|
)
|
|
{
|
|
EFI_STATUS Status;
|
|
UINT32 Temp32;
|
|
UINT8 Temp8;
|
|
UINT8 Index;
|
|
|
|
EFI_PEI_STALL_PPI *StallPpi;
|
|
|
|
DEBUG((DEBUG_INFO, __FUNCTION__" Entry\n"));
|
|
//
|
|
// Determine device by Vendor ID and Device ID.
|
|
//
|
|
if ((VendorId != Realtek_Card_Reader_VID)||(DeviceId != Realtek_Card_Reader_DID)) {
|
|
return EFI_UNSUPPORTED;
|
|
}
|
|
Status = (**PeiServices).LocatePpi (
|
|
PeiServices,
|
|
&gEfiPeiStallPpiGuid,
|
|
0,
|
|
NULL,
|
|
(VOID **)&StallPpi
|
|
);
|
|
if(EFI_ERROR(Status))
|
|
{
|
|
DEBUG((DEBUG_ERROR, "StallPpi Not Ready\n"));
|
|
return Status;
|
|
}
|
|
|
|
DEBUG((DEBUG_INFO, "Config Start\n"));
|
|
//
|
|
// Write Value To Crc Register
|
|
//
|
|
for(Index = 0 ; Index < sizeof(RTS5232SPciRegTable)/sizeof(PCI_REG_TABLE) ; Index ++) {
|
|
UINT8 i = 0;
|
|
|
|
if(RTS5232SPciRegTable[Index].Offset == 0xFFFFFFFF) break;
|
|
|
|
do {
|
|
//
|
|
// Get Current setting.
|
|
//
|
|
Temp8 = MmioRead8((UINTN) (MemBaseAddr + RTS5232SPciRegTable[Index].Offset));
|
|
|
|
//
|
|
// Prepare OEM Setting.
|
|
//
|
|
Temp8 = (UINT8) ((Temp8 & RTS5232SPciRegTable[Index].AndMask) | RTS5232SPciRegTable[Index].OrValue);
|
|
|
|
//
|
|
// Write OEM Setting.
|
|
//
|
|
MmioWrite8((UINTN) (MemBaseAddr + RTS5232SPciRegTable[Index].Offset), Temp8);
|
|
|
|
//
|
|
// Delay 100 us
|
|
//
|
|
StallPpi->Stall (PeiServices, StallPpi, 100);
|
|
i ++ ;
|
|
} while ( (MmioRead8((UINTN) (MemBaseAddr + RTS5232SPciRegTable[Index].Offset))!=Temp8) && (i<5) );
|
|
}
|
|
|
|
DEBUG((DEBUG_INFO, "Config SSID\n"));
|
|
|
|
//
|
|
// Config SSID
|
|
//
|
|
Temp32 = 0xFE35FF2C;
|
|
MmioWrite32((UINTN) (MemBaseAddr + REALTEK_CMD_REGISTER), Temp32);
|
|
StallPpi->Stall (PeiServices, StallPpi, 50);
|
|
|
|
Temp32 = 0xFE36FF00;
|
|
MmioWrite32((UINTN) (MemBaseAddr + REALTEK_CMD_REGISTER), Temp32);
|
|
while (MmioRead32((UINTN) (MemBaseAddr + REALTEK_CMD_REGISTER)) & REALTEK_SD_BUSY_BIT);
|
|
|
|
Temp32 = 0xFE37FF00 | (LENOVO_RTS5232S_SSVID_SSID&0xFF);
|
|
MmioWrite32((UINTN) (MemBaseAddr + REALTEK_CMD_REGISTER), Temp32);
|
|
while (MmioRead32((UINTN) (MemBaseAddr + REALTEK_CMD_REGISTER)) & REALTEK_SD_BUSY_BIT);
|
|
|
|
Temp32 = 0xFE38FF00 | ((LENOVO_RTS5232S_SSVID_SSID>>8)&0xFF);
|
|
MmioWrite32((UINTN) (MemBaseAddr + REALTEK_CMD_REGISTER), Temp32);
|
|
while (MmioRead32((UINTN) (MemBaseAddr + REALTEK_CMD_REGISTER)) & REALTEK_SD_BUSY_BIT);
|
|
|
|
Temp32 = 0xFE39FF00 | ((LENOVO_RTS5232S_SSVID_SSID>>16)&0xFF);
|
|
MmioWrite32((UINTN) (MemBaseAddr + REALTEK_CMD_REGISTER), Temp32);
|
|
while (MmioRead32((UINTN) (MemBaseAddr + REALTEK_CMD_REGISTER)) & REALTEK_SD_BUSY_BIT);
|
|
|
|
Temp32 = 0xFE3AFF00 | ((LENOVO_RTS5232S_SSVID_SSID>>24)&0xFF);
|
|
MmioWrite32((UINTN) (MemBaseAddr + REALTEK_CMD_REGISTER), Temp32);
|
|
while (MmioRead32((UINTN) (MemBaseAddr + REALTEK_CMD_REGISTER)) & REALTEK_SD_BUSY_BIT);
|
|
|
|
Temp32 = 0xFE3BFF8F;
|
|
MmioWrite32((UINTN) (MemBaseAddr + REALTEK_CMD_REGISTER), Temp32);
|
|
while (MmioRead32((UINTN) (MemBaseAddr + REALTEK_CMD_REGISTER)) & REALTEK_SD_BUSY_BIT);
|
|
|
|
StallPpi->Stall (PeiServices, StallPpi, 50);
|
|
Temp32 = 0xBE3BFF00;
|
|
MmioWrite32((UINTN) (MemBaseAddr + REALTEK_CMD_REGISTER), Temp32);
|
|
while (MmioRead32((UINTN) (MemBaseAddr + REALTEK_CMD_REGISTER)) & REALTEK_SD_BUSY_BIT);
|
|
|
|
DEBUG((DEBUG_INFO, __FUNCTION__" End\n"));
|
|
return EFI_SUCCESS;
|
|
}
|
|
|