alder_lake_bios/Intel/AlderLake/AlderLakeChipsetPkg/Features/AMT/AmtLockPs2ConInDxe/AmtLockPs2ConInDxe.c

269 lines
7.4 KiB
C

/** @file
This file include all platform action which can be customized by IBV/OEM.
;******************************************************************************
;* Copyright (c) 2014 - 2021, 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 <UefiBootManagerLib.h>
#include <Guid/AdmiSecureBoot.h>
#include <Uefi.h>
#include "AmtLockPs2ConInDxe.h"
UINT8 gTDSBlockConInProtocol = 0;
BOOLEAN mLockConsole = FALSE;
EFI_DRIVER_BINDING_PROTOCOL gAmtPs2ConInLockrDriver = {
AmtPs2ConInLockrDriverBindingSupported,
AmtPs2ConInLockrDriverBindingStart,
AmtPs2ConInLockrDriverBindingStop,
0x18,
NULL,
NULL
};
EFI_STATUS
EFIAPI
AmtPs2ConInLockrDriverBindingSupported (
IN EFI_DRIVER_BINDING_PROTOCOL *This,
IN EFI_HANDLE Controller,
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
)
{
EFI_STATUS Status;
EFI_ISA_IO_PROTOCOL *IsaIo;
UINT8 Data;
Data = 0;
//
// Open the IO Abstraction(s) needed to perform the supported test
//
Status = gBS->OpenProtocol (
Controller,
&gEfiIsaIoProtocolGuid,
(VOID **) &IsaIo,
This->DriverBindingHandle,
Controller,
EFI_OPEN_PROTOCOL_BY_DRIVER
);
if (EFI_ERROR (Status)) {
return Status;
}
//
// Use the ISA I/O Protocol to see if Controller is the Keyboard controller
//
if (IsaIo->ResourceList->Device.HID != EISA_PNP_ID (0x303) || IsaIo->ResourceList->Device.UID != 0) {
Status = EFI_UNSUPPORTED;
} else {
Status = IsaIo->Io.Read (
IsaIo,
EfiIsaIoWidthUint8,
KEYBOARD_8042_STATUS_REGISTER,
1,
&Data
);
if ((EFI_ERROR (Status)) || (Data == 0xFF)) {
//
//if status register is FF then KBC is missing
//
Status = EFI_UNSUPPORTED;
}
}
//
// Close the I/O Abstraction(s) used to perform the supported test
//
gBS->CloseProtocol (
Controller,
&gEfiIsaIoProtocolGuid,
This->DriverBindingHandle,
Controller
);
return Status;
}
/**
Start.
@param This EFI_DRIVER_BINDING_PROTOCOL
@param Controller Controller handle
@param RemainingDevicePath EFI_DEVICE_PATH_PROTOCOL
@retval EFI_SUCCESS Success
@retval EFI_OUT_OF_RESOURCES Can't allocate memory
@retval EFI_UNSUPPORTED The Start routine fail
**/
EFI_STATUS
EFIAPI
AmtPs2ConInLockrDriverBindingStart (
IN EFI_DRIVER_BINDING_PROTOCOL *This,
IN EFI_HANDLE Controller,
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
)
{
EFI_STATUS Status;
EFI_ISA_IO_PROTOCOL *IsaIo;
UINT8 TDSBlockConIn;
gBS->InstallMultipleProtocolInterfaces (&Controller, &gTDSBlockConInProtocolGuid, &gTDSBlockConInProtocol, NULL);
if (PcdGetBool (PcdTDSBlockConInEnable) || mLockConsole) {
//
// It's TDS boot or MPM lock mode.
// Open IsaIo protocol.
//
Status = gBS->OpenProtocol (
Controller,
&gEfiIsaIoProtocolGuid,
(VOID **) &IsaIo,
This->DriverBindingHandle,
Controller,
EFI_OPEN_PROTOCOL_BY_DRIVER
);
}
//
// Create relationship for disconnecting.
//
Status = gBS->OpenProtocol (
Controller,
&gTDSBlockConInProtocolGuid,
(VOID **) &TDSBlockConIn,
This->DriverBindingHandle,
Controller,
EFI_OPEN_PROTOCOL_BY_DRIVER
);
return Status;
}
/**
Stop.
@param This EFI_DRIVER_BINDING_PROTOCOL
@param Controller Controller handle
@param NumberOfChildren Child handle number
@param ChildHandleBuffer Child handle buffer
@retval EFI_SUCCESS Success
@retval EFI_UNSUPPORTED Can't support
**/
EFI_STATUS
EFIAPI
AmtPs2ConInLockrDriverBindingStop (
IN EFI_DRIVER_BINDING_PROTOCOL *This,
IN EFI_HANDLE Controller,
IN UINTN NumberOfChildren,
IN EFI_HANDLE *ChildHandleBuffer
)
{
if (mLockConsole) {
//
// MPM lock mode. Don't unlock Input device.
//
return EFI_UNSUPPORTED;
}
gBS->CloseProtocol (
Controller,
&gEfiIsaIoProtocolGuid,
This->DriverBindingHandle,
Controller
);
gBS->CloseProtocol (
Controller,
&gTDSBlockConInProtocolGuid,
This->DriverBindingHandle,
Controller
);
gBS->UninstallMultipleProtocolInterfaces (Controller, &gTDSBlockConInProtocolGuid, &gTDSBlockConInProtocol, NULL);
return EFI_SUCCESS;
}
EFI_STATUS
EFIAPI
AmtLockPs2ConInDxeEntryPoint (
IN EFI_HANDLE ImageHandle,
IN EFI_SYSTEM_TABLE *SystemTable
)
{
EFI_STATUS Status;
UINT8 SpecialCommandParamHighByte;
SETUP_DATA SystemConfiguration;
UINTN VarSize;
BOOLEAN TrustedDeviceSetupSetupVar;
AMT_WRAPPER_PROTOCOL *AmtWrapper;
EFI_STATUS TDSStatus;
EFI_STATUS LockConStatus;
SpecialCommandParamHighByte = 0;
TrustedDeviceSetupSetupVar = FALSE;
TDSStatus = EFI_SUCCESS;
LockConStatus = EFI_SUCCESS;
Status = gBS->LocateProtocol (&gAmtWrapperProtocolGuid, NULL, (VOID **) &AmtWrapper);
if (!EFI_ERROR (Status)) {
if (AmtWrapper->IsConsoleLocked()) {
mLockConsole = TRUE;
} else {
LockConStatus = EFI_UNSUPPORTED;
}
}
//
// Check ME status
//
SpecialCommandParamHighByte = AsfGetSpecialCmdParamHighByte ();
//
// Check SCU TDS option
//
VarSize = sizeof (SETUP_DATA);
Status = gRT->GetVariable (
L"Setup",
&gSetupVariableGuid,
NULL,
&VarSize,
&SystemConfiguration
);
if (!EFI_ERROR (Status)) {
TrustedDeviceSetupSetupVar = SystemConfiguration.TrustedDeviceSetupBoot;
}
if ((SpecialCommandParamHighByte & TDS_ENABLE_BITS) != TDS_ENABLE_BITS && !TrustedDeviceSetupSetupVar) {
TDSStatus = EFI_UNSUPPORTED;
} else {
Status = PcdSetBoolS (PcdTDSBlockConInEnable, TRUE);
if (EFI_ERROR (Status)) {
TDSStatus = EFI_UNSUPPORTED;
}
}
if (EFI_ERROR (LockConStatus) && EFI_ERROR (TDSStatus)) {
return EFI_UNSUPPORTED;
}
Status = EfiLibInstallDriverBindingComponentName2 (
ImageHandle,
SystemTable,
&gAmtPs2ConInLockrDriver,
ImageHandle,
NULL,
NULL
);
ASSERT_EFI_ERROR (Status);
return Status;
}