alder_lake_bios/Insyde/InsydeModulePkg/Universal/DxeSmmIoLibSmm/DxeSmmIoLibSmm.c

231 lines
5.0 KiB
C

/** @file
A SMM driver for SMM platform initialization.
;******************************************************************************
;* Copyright (c) 2020, 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 "DxeSmmIoLibSmm.h"
UINT64
EFIAPI
IoRead(
UINTN Port,
UINTN Size
)
{
switch (Size) {
case SMM_IO_UINT8:
return IoRead8(Port);
case SMM_IO_UINT16:
return IoRead16(Port);
case SMM_IO_UINT32:
return IoRead32(Port);
case SMM_IO_UINT64:
return IoRead64(Port);
default:
ASSERT (FALSE);
return 0;
}
}
UINT64
EFIAPI
IoWrite(
UINTN Port,
UINTN Size,
UINTN Value
)
{
switch (Size) {
case SMM_IO_UINT8:
return IoWrite8(Port, (UINT8)Value);
case SMM_IO_UINT16:
return IoWrite16(Port, (UINT16)Value);
case SMM_IO_UINT32:
return IoWrite32(Port, (UINT32)Value);
case SMM_IO_UINT64:
return IoWrite64(Port, Value);
default:
ASSERT (FALSE);
return 0;
}
}
VOID
EFIAPI
IoReadFifo (
IN UINTN Port,
IN UINTN Size,
IN UINTN Count,
OUT VOID *Buffer
)
{
switch (Size) {
case SMM_IO_UINT8:
IoReadFifo8(Port, Count, Buffer);
break;
case SMM_IO_UINT16:
IoReadFifo16(Port, Count, Buffer);
break;
case SMM_IO_UINT32:
IoReadFifo32(Port, Count, Buffer);
break;
default:
ASSERT (FALSE);
return;
}
}
VOID
EFIAPI
IoWriteFifo (
IN UINTN Port,
IN UINTN Size,
IN UINTN Count,
IN VOID *Buffer
)
{
switch (Size) {
case SMM_IO_UINT8:
IoWriteFifo8(Port, Count, Buffer);
break;
case SMM_IO_UINT16:
IoWriteFifo16(Port, Count, Buffer);
break;
case SMM_IO_UINT32:
IoWriteFifo32(Port, Count, Buffer);
break;
default:
ASSERT (FALSE);
return;
}
return;
}
UINT64
EFIAPI
MmioRead (
IN UINTN Address,
IN UINTN Size
)
{
switch (Size) {
case SMM_IO_UINT8:
return MmioRead8(Address);
case SMM_IO_UINT16:
return MmioRead16(Address);
case SMM_IO_UINT32:
return MmioRead32(Address);
case SMM_IO_UINT64:
return MmioRead64(Address);
default:
ASSERT (FALSE);
return 0;
}
}
UINT64
EFIAPI
MmioWrite (
IN UINTN Address,
IN UINTN Size,
IN UINT64 Value
)
{
switch (Size) {
case SMM_IO_UINT8:
return MmioWrite8(Address, (UINT8)Value);
case SMM_IO_UINT16:
return MmioWrite16(Address, (UINT16)Value);
case SMM_IO_UINT32:
return MmioWrite32(Address, (UINT32)Value);
case SMM_IO_UINT64:
return MmioWrite64(Address, Value);
default:
ASSERT (FALSE);
return 0;
}
}
EFI_STATUS
DxeSmmIoLibSmmEntryPoint (
IN EFI_HANDLE ImageHandle,
IN EFI_SYSTEM_TABLE *SystemTable
)
{
H2O_DXE_SMM_IO_LIB_PROTOCOL *DxeSmmIoLibProtocol;
EFI_HANDLE DxeSmmIoLibProtocolHandle;
EFI_STATUS Status;
DxeSmmIoLibProtocol = AllocateZeroPool(sizeof(H2O_DXE_SMM_IO_LIB_PROTOCOL));
if (DxeSmmIoLibProtocol == NULL) {
return EFI_OUT_OF_RESOURCES;
}
DxeSmmIoLibProtocol->IoRead = IoRead;
DxeSmmIoLibProtocol->IoWrite = IoWrite;
DxeSmmIoLibProtocol->IoReadFifo = IoReadFifo;
DxeSmmIoLibProtocol->IoWriteFifo = IoWriteFifo;
DxeSmmIoLibProtocol->MmioRead = MmioRead;
DxeSmmIoLibProtocol->MmioWrite = MmioWrite;
DxeSmmIoLibProtocolHandle = NULL;
if (gSmst != NULL) {
Status = gSmst->SmmInstallProtocolInterface (
&DxeSmmIoLibProtocolHandle,
&gH2ODxeSmmIoLibProtocolGuid,
EFI_NATIVE_INTERFACE,
DxeSmmIoLibProtocol
);
} else {
Status = gBS->InstallProtocolInterface (
&DxeSmmIoLibProtocolHandle,
&gH2ODxeSmmIoLibProtocolGuid,
EFI_NATIVE_INTERFACE,
DxeSmmIoLibProtocol
);
}
return EFI_SUCCESS;
}