mirror of https://github.com/acidanthera/audk.git
155 lines
3.5 KiB
C
155 lines
3.5 KiB
C
|
/** @file
|
||
|
|
||
|
Copyright (c) 2008-2009, Apple Inc. All rights reserved.
|
||
|
|
||
|
All rights reserved. This program and the accompanying materials
|
||
|
are licensed and made available under the terms and conditions of the BSD License
|
||
|
which accompanies this distribution. The full text of the license may be found at
|
||
|
http://opensource.org/licenses/bsd-license.php
|
||
|
|
||
|
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
||
|
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||
|
|
||
|
**/
|
||
|
|
||
|
#include "CpuDxe.h"
|
||
|
|
||
|
EFI_STATUS
|
||
|
EFIAPI
|
||
|
CpuFlushCpuDataCache (
|
||
|
IN EFI_CPU_ARCH_PROTOCOL *This,
|
||
|
IN EFI_PHYSICAL_ADDRESS Start,
|
||
|
IN UINT64 Length,
|
||
|
IN EFI_CPU_FLUSH_TYPE FlushType
|
||
|
)
|
||
|
{
|
||
|
switch (FlushType) {
|
||
|
case EfiCpuFlushTypeWriteBack:
|
||
|
WriteBackDataCacheRange((VOID *)(UINTN)Start, (UINTN)Length);
|
||
|
break;
|
||
|
case EfiCpuFlushTypeInvalidate:
|
||
|
InvalidateDataCacheRange((VOID *)(UINTN)Start, (UINTN)Length);
|
||
|
break;
|
||
|
case EfiCpuFlushTypeWriteBackInvalidate:
|
||
|
WriteBackInvalidateDataCacheRange((VOID *)(UINTN)Start, (UINTN)Length);
|
||
|
break;
|
||
|
default:
|
||
|
return EFI_INVALID_PARAMETER;
|
||
|
}
|
||
|
|
||
|
return EFI_SUCCESS;
|
||
|
}
|
||
|
|
||
|
EFI_STATUS
|
||
|
EFIAPI
|
||
|
CpuEnableInterrupt (
|
||
|
IN EFI_CPU_ARCH_PROTOCOL *This
|
||
|
)
|
||
|
{
|
||
|
if (ArmProcessorMode() != ARM_PROCESSOR_MODE_IRQ) {
|
||
|
ArmEnableInterrupts();
|
||
|
}
|
||
|
return EFI_SUCCESS;
|
||
|
}
|
||
|
|
||
|
|
||
|
EFI_STATUS
|
||
|
EFIAPI
|
||
|
CpuDisableInterrupt (
|
||
|
IN EFI_CPU_ARCH_PROTOCOL *This
|
||
|
)
|
||
|
{
|
||
|
if (ArmProcessorMode() != ARM_PROCESSOR_MODE_IRQ) {
|
||
|
ArmDisableInterrupts();
|
||
|
}
|
||
|
return EFI_SUCCESS;
|
||
|
}
|
||
|
|
||
|
EFI_STATUS
|
||
|
EFIAPI
|
||
|
CpuGetInterruptState (
|
||
|
IN EFI_CPU_ARCH_PROTOCOL *This,
|
||
|
OUT BOOLEAN *State
|
||
|
)
|
||
|
{
|
||
|
if (State == NULL) {
|
||
|
return EFI_INVALID_PARAMETER;
|
||
|
}
|
||
|
|
||
|
*State = ArmGetInterruptState();
|
||
|
return EFI_SUCCESS;
|
||
|
}
|
||
|
|
||
|
EFI_STATUS
|
||
|
EFIAPI
|
||
|
CpuInit (
|
||
|
IN EFI_CPU_ARCH_PROTOCOL *This,
|
||
|
IN EFI_CPU_INIT_TYPE InitType
|
||
|
)
|
||
|
{
|
||
|
return EFI_UNSUPPORTED;
|
||
|
}
|
||
|
|
||
|
EFI_STATUS
|
||
|
EFIAPI
|
||
|
CpuRegisterInterruptHandler (
|
||
|
IN EFI_CPU_ARCH_PROTOCOL *This,
|
||
|
IN EFI_EXCEPTION_TYPE InterruptType,
|
||
|
IN EFI_CPU_INTERRUPT_HANDLER InterruptHandler
|
||
|
)
|
||
|
{
|
||
|
return RegisterInterruptHandler(InterruptType, InterruptHandler);
|
||
|
}
|
||
|
|
||
|
EFI_STATUS
|
||
|
EFIAPI
|
||
|
CpuGetTimerValue (
|
||
|
IN EFI_CPU_ARCH_PROTOCOL *This,
|
||
|
IN UINT32 TimerIndex,
|
||
|
OUT UINT64 *TimerValue,
|
||
|
OUT UINT64 *TimerPeriod OPTIONAL
|
||
|
)
|
||
|
{
|
||
|
return EFI_UNSUPPORTED;
|
||
|
}
|
||
|
|
||
|
EFI_STATUS
|
||
|
EFIAPI
|
||
|
CpuSetMemoryAttributes (
|
||
|
IN EFI_CPU_ARCH_PROTOCOL *This,
|
||
|
IN EFI_PHYSICAL_ADDRESS BaseAddress,
|
||
|
IN UINT64 Length,
|
||
|
IN UINT64 Attributes
|
||
|
)
|
||
|
{
|
||
|
return EFI_UNSUPPORTED;
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// Globals used to initialize the protocol
|
||
|
//
|
||
|
EFI_HANDLE mCpuHandle = NULL;
|
||
|
EFI_CPU_ARCH_PROTOCOL mCpu = {
|
||
|
CpuFlushCpuDataCache,
|
||
|
CpuEnableInterrupt,
|
||
|
CpuDisableInterrupt,
|
||
|
CpuGetInterruptState,
|
||
|
CpuInit,
|
||
|
CpuRegisterInterruptHandler,
|
||
|
CpuGetTimerValue,
|
||
|
CpuSetMemoryAttributes,
|
||
|
0, // NumberOfTimers
|
||
|
4, // DmaBufferAlignment
|
||
|
};
|
||
|
|
||
|
EFI_STATUS
|
||
|
CpuDxeInitialize (
|
||
|
IN EFI_HANDLE ImageHandle,
|
||
|
IN EFI_SYSTEM_TABLE *SystemTable
|
||
|
)
|
||
|
{
|
||
|
InitializeExceptions(&mCpu);
|
||
|
return gBS->InstallMultipleProtocolInterfaces(&mCpuHandle, &gEfiCpuArchProtocolGuid, &mCpu, NULL);
|
||
|
}
|
||
|
|