ARM Packages: Fixed line endings
This large code change only modifies the line endings to be CRLF to be compliant with the EDK2 coding convention document. git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@14088 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
@@ -1,76 +1,76 @@
|
||||
/** @file
|
||||
*
|
||||
* Copyright (c) 2011-2012, ARM Limited. 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 <PiDxe.h>
|
||||
#include <Library/ArmPlatformGlobalVariableLib.h>
|
||||
#include <Library/BaseMemoryLib.h>
|
||||
#include <Library/DebugLib.h>
|
||||
#include <Library/HobLib.h>
|
||||
#include <Library/PcdLib.h>
|
||||
|
||||
#include <Guid/ArmGlobalVariableHob.h>
|
||||
|
||||
UINTN mGlobalVariableBase = 0;
|
||||
|
||||
RETURN_STATUS
|
||||
EFIAPI
|
||||
ArmPlatformGlobalVariableConstructor (
|
||||
VOID
|
||||
)
|
||||
{
|
||||
ARM_HOB_GLOBAL_VARIABLE *Hob;
|
||||
|
||||
Hob = GetFirstGuidHob (&gArmGlobalVariableGuid);
|
||||
ASSERT (Hob != NULL);
|
||||
|
||||
mGlobalVariableBase = Hob->GlobalVariableBase;
|
||||
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
VOID
|
||||
ArmPlatformGetGlobalVariable (
|
||||
IN UINTN VariableOffset,
|
||||
IN UINTN VariableSize,
|
||||
OUT VOID* Variable
|
||||
)
|
||||
{
|
||||
if (mGlobalVariableBase == 0) {
|
||||
ArmPlatformGlobalVariableConstructor ();
|
||||
}
|
||||
|
||||
CopyMem (Variable, (VOID*)(mGlobalVariableBase + VariableOffset), VariableSize);
|
||||
}
|
||||
|
||||
VOID
|
||||
ArmPlatformSetGlobalVariable (
|
||||
IN UINTN VariableOffset,
|
||||
IN UINTN VariableSize,
|
||||
OUT VOID* Variable
|
||||
)
|
||||
{
|
||||
if (mGlobalVariableBase == 0) {
|
||||
ArmPlatformGlobalVariableConstructor ();
|
||||
}
|
||||
|
||||
CopyMem ((VOID*)(mGlobalVariableBase + VariableOffset), Variable, VariableSize);
|
||||
}
|
||||
|
||||
VOID*
|
||||
ArmPlatformGetGlobalVariableAddress (
|
||||
IN UINTN VariableOffset
|
||||
)
|
||||
{
|
||||
return (VOID*)(mGlobalVariableBase + VariableOffset);
|
||||
}
|
||||
/** @file
|
||||
*
|
||||
* Copyright (c) 2011-2012, ARM Limited. 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 <PiDxe.h>
|
||||
#include <Library/ArmPlatformGlobalVariableLib.h>
|
||||
#include <Library/BaseMemoryLib.h>
|
||||
#include <Library/DebugLib.h>
|
||||
#include <Library/HobLib.h>
|
||||
#include <Library/PcdLib.h>
|
||||
|
||||
#include <Guid/ArmGlobalVariableHob.h>
|
||||
|
||||
UINTN mGlobalVariableBase = 0;
|
||||
|
||||
RETURN_STATUS
|
||||
EFIAPI
|
||||
ArmPlatformGlobalVariableConstructor (
|
||||
VOID
|
||||
)
|
||||
{
|
||||
ARM_HOB_GLOBAL_VARIABLE *Hob;
|
||||
|
||||
Hob = GetFirstGuidHob (&gArmGlobalVariableGuid);
|
||||
ASSERT (Hob != NULL);
|
||||
|
||||
mGlobalVariableBase = Hob->GlobalVariableBase;
|
||||
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
VOID
|
||||
ArmPlatformGetGlobalVariable (
|
||||
IN UINTN VariableOffset,
|
||||
IN UINTN VariableSize,
|
||||
OUT VOID* Variable
|
||||
)
|
||||
{
|
||||
if (mGlobalVariableBase == 0) {
|
||||
ArmPlatformGlobalVariableConstructor ();
|
||||
}
|
||||
|
||||
CopyMem (Variable, (VOID*)(mGlobalVariableBase + VariableOffset), VariableSize);
|
||||
}
|
||||
|
||||
VOID
|
||||
ArmPlatformSetGlobalVariable (
|
||||
IN UINTN VariableOffset,
|
||||
IN UINTN VariableSize,
|
||||
OUT VOID* Variable
|
||||
)
|
||||
{
|
||||
if (mGlobalVariableBase == 0) {
|
||||
ArmPlatformGlobalVariableConstructor ();
|
||||
}
|
||||
|
||||
CopyMem ((VOID*)(mGlobalVariableBase + VariableOffset), Variable, VariableSize);
|
||||
}
|
||||
|
||||
VOID*
|
||||
ArmPlatformGetGlobalVariableAddress (
|
||||
IN UINTN VariableOffset
|
||||
)
|
||||
{
|
||||
return (VOID*)(mGlobalVariableBase + VariableOffset);
|
||||
}
|
||||
|
@@ -1,44 +1,44 @@
|
||||
#/** @file
|
||||
# Timer library implementation
|
||||
#
|
||||
#
|
||||
# Copyright (c) 2011-2012, ARM Ltd. All rights reserved.<BR>
|
||||
#
|
||||
# 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.
|
||||
#
|
||||
#**/
|
||||
|
||||
[Defines]
|
||||
INF_VERSION = 0x00010005
|
||||
BASE_NAME = DxeArmPlatformGlobalVariableLib
|
||||
FILE_GUID = 53fa3cc3-23b7-4ec2-9bfa-30257d7e1135
|
||||
MODULE_TYPE = BASE
|
||||
VERSION_STRING = 1.0
|
||||
LIBRARY_CLASS = ArmPlatformGlobalVariableLib
|
||||
|
||||
CONSTRUCTOR = ArmPlatformGlobalVariableConstructor
|
||||
|
||||
[Sources.common]
|
||||
DxeArmPlatformGlobalVariableLib.c
|
||||
|
||||
[Packages]
|
||||
MdePkg/MdePkg.dec
|
||||
ArmPlatformPkg/ArmPlatformPkg.dec
|
||||
|
||||
[LibraryClasses]
|
||||
BaseLib
|
||||
DebugLib
|
||||
HobLib
|
||||
|
||||
[Guids]
|
||||
gArmGlobalVariableGuid
|
||||
|
||||
[FixedPcd]
|
||||
gArmPlatformTokenSpaceGuid.PcdPeiGlobalVariableSize
|
||||
|
||||
#/** @file
|
||||
# Timer library implementation
|
||||
#
|
||||
#
|
||||
# Copyright (c) 2011-2012, ARM Ltd. All rights reserved.<BR>
|
||||
#
|
||||
# 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.
|
||||
#
|
||||
#**/
|
||||
|
||||
[Defines]
|
||||
INF_VERSION = 0x00010005
|
||||
BASE_NAME = DxeArmPlatformGlobalVariableLib
|
||||
FILE_GUID = 53fa3cc3-23b7-4ec2-9bfa-30257d7e1135
|
||||
MODULE_TYPE = BASE
|
||||
VERSION_STRING = 1.0
|
||||
LIBRARY_CLASS = ArmPlatformGlobalVariableLib
|
||||
|
||||
CONSTRUCTOR = ArmPlatformGlobalVariableConstructor
|
||||
|
||||
[Sources.common]
|
||||
DxeArmPlatformGlobalVariableLib.c
|
||||
|
||||
[Packages]
|
||||
MdePkg/MdePkg.dec
|
||||
ArmPlatformPkg/ArmPlatformPkg.dec
|
||||
|
||||
[LibraryClasses]
|
||||
BaseLib
|
||||
DebugLib
|
||||
HobLib
|
||||
|
||||
[Guids]
|
||||
gArmGlobalVariableGuid
|
||||
|
||||
[FixedPcd]
|
||||
gArmPlatformTokenSpaceGuid.PcdPeiGlobalVariableSize
|
||||
|
||||
|
@@ -1,84 +1,84 @@
|
||||
/** @file
|
||||
*
|
||||
* Copyright (c) 2011-2012, ARM Limited. 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 <Uefi.h>
|
||||
#include <Library/ArmPlatformGlobalVariableLib.h>
|
||||
#include <Library/BaseLib.h>
|
||||
#include <Library/BaseMemoryLib.h>
|
||||
#include <Library/PcdLib.h>
|
||||
#include <Library/DebugLib.h>
|
||||
|
||||
// Declared by ArmPlatformPkg/PrePi Module
|
||||
extern UINTN mGlobalVariableBase;
|
||||
|
||||
VOID
|
||||
ArmPlatformGetGlobalVariable (
|
||||
IN UINTN VariableOffset,
|
||||
IN UINTN VariableSize,
|
||||
OUT VOID* Variable
|
||||
)
|
||||
{
|
||||
UINTN GlobalVariableBase;
|
||||
|
||||
// Ensure the Global Variable Size have been initialized
|
||||
ASSERT (VariableOffset < PcdGet32 (PcdPeiGlobalVariableSize));
|
||||
|
||||
GlobalVariableBase = PcdGet32 (PcdCPUCoresStackBase) + PcdGet32 (PcdCPUCorePrimaryStackSize) - PcdGet32 (PcdPeiGlobalVariableSize);
|
||||
|
||||
if (VariableSize == 4) {
|
||||
*(UINT32*)Variable = ReadUnaligned32 ((CONST UINT32*)(GlobalVariableBase + VariableOffset));
|
||||
} else if (VariableSize == 8) {
|
||||
*(UINT64*)Variable = ReadUnaligned64 ((CONST UINT64*)(GlobalVariableBase + VariableOffset));
|
||||
} else {
|
||||
CopyMem (Variable, (VOID*)(GlobalVariableBase + VariableOffset), VariableSize);
|
||||
}
|
||||
}
|
||||
|
||||
VOID
|
||||
ArmPlatformSetGlobalVariable (
|
||||
IN UINTN VariableOffset,
|
||||
IN UINTN VariableSize,
|
||||
OUT VOID* Variable
|
||||
)
|
||||
{
|
||||
UINTN GlobalVariableBase;
|
||||
|
||||
// Ensure the Global Variable Size have been initialized
|
||||
ASSERT (VariableOffset < PcdGet32 (PcdPeiGlobalVariableSize));
|
||||
|
||||
GlobalVariableBase = PcdGet32 (PcdCPUCoresStackBase) + PcdGet32 (PcdCPUCorePrimaryStackSize) - PcdGet32 (PcdPeiGlobalVariableSize);
|
||||
|
||||
if (VariableSize == 4) {
|
||||
WriteUnaligned32 ((UINT32*)(GlobalVariableBase + VariableOffset), *(UINT32*)Variable);
|
||||
} else if (VariableSize == 8) {
|
||||
WriteUnaligned64 ((UINT64*)(GlobalVariableBase + VariableOffset), *(UINT64*)Variable);
|
||||
} else {
|
||||
CopyMem ((VOID*)(GlobalVariableBase + VariableOffset), Variable, VariableSize);
|
||||
}
|
||||
}
|
||||
|
||||
VOID*
|
||||
ArmPlatformGetGlobalVariableAddress (
|
||||
IN UINTN VariableOffset
|
||||
)
|
||||
{
|
||||
UINTN GlobalVariableBase;
|
||||
|
||||
// Ensure the Global Variable Size have been initialized
|
||||
ASSERT (VariableOffset < PcdGet32 (PcdPeiGlobalVariableSize));
|
||||
|
||||
GlobalVariableBase = PcdGet32 (PcdCPUCoresStackBase) + PcdGet32 (PcdCPUCorePrimaryStackSize) - PcdGet32 (PcdPeiGlobalVariableSize);
|
||||
|
||||
return (VOID*)(GlobalVariableBase + VariableOffset);
|
||||
}
|
||||
/** @file
|
||||
*
|
||||
* Copyright (c) 2011-2012, ARM Limited. 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 <Uefi.h>
|
||||
#include <Library/ArmPlatformGlobalVariableLib.h>
|
||||
#include <Library/BaseLib.h>
|
||||
#include <Library/BaseMemoryLib.h>
|
||||
#include <Library/PcdLib.h>
|
||||
#include <Library/DebugLib.h>
|
||||
|
||||
// Declared by ArmPlatformPkg/PrePi Module
|
||||
extern UINTN mGlobalVariableBase;
|
||||
|
||||
VOID
|
||||
ArmPlatformGetGlobalVariable (
|
||||
IN UINTN VariableOffset,
|
||||
IN UINTN VariableSize,
|
||||
OUT VOID* Variable
|
||||
)
|
||||
{
|
||||
UINTN GlobalVariableBase;
|
||||
|
||||
// Ensure the Global Variable Size have been initialized
|
||||
ASSERT (VariableOffset < PcdGet32 (PcdPeiGlobalVariableSize));
|
||||
|
||||
GlobalVariableBase = PcdGet32 (PcdCPUCoresStackBase) + PcdGet32 (PcdCPUCorePrimaryStackSize) - PcdGet32 (PcdPeiGlobalVariableSize);
|
||||
|
||||
if (VariableSize == 4) {
|
||||
*(UINT32*)Variable = ReadUnaligned32 ((CONST UINT32*)(GlobalVariableBase + VariableOffset));
|
||||
} else if (VariableSize == 8) {
|
||||
*(UINT64*)Variable = ReadUnaligned64 ((CONST UINT64*)(GlobalVariableBase + VariableOffset));
|
||||
} else {
|
||||
CopyMem (Variable, (VOID*)(GlobalVariableBase + VariableOffset), VariableSize);
|
||||
}
|
||||
}
|
||||
|
||||
VOID
|
||||
ArmPlatformSetGlobalVariable (
|
||||
IN UINTN VariableOffset,
|
||||
IN UINTN VariableSize,
|
||||
OUT VOID* Variable
|
||||
)
|
||||
{
|
||||
UINTN GlobalVariableBase;
|
||||
|
||||
// Ensure the Global Variable Size have been initialized
|
||||
ASSERT (VariableOffset < PcdGet32 (PcdPeiGlobalVariableSize));
|
||||
|
||||
GlobalVariableBase = PcdGet32 (PcdCPUCoresStackBase) + PcdGet32 (PcdCPUCorePrimaryStackSize) - PcdGet32 (PcdPeiGlobalVariableSize);
|
||||
|
||||
if (VariableSize == 4) {
|
||||
WriteUnaligned32 ((UINT32*)(GlobalVariableBase + VariableOffset), *(UINT32*)Variable);
|
||||
} else if (VariableSize == 8) {
|
||||
WriteUnaligned64 ((UINT64*)(GlobalVariableBase + VariableOffset), *(UINT64*)Variable);
|
||||
} else {
|
||||
CopyMem ((VOID*)(GlobalVariableBase + VariableOffset), Variable, VariableSize);
|
||||
}
|
||||
}
|
||||
|
||||
VOID*
|
||||
ArmPlatformGetGlobalVariableAddress (
|
||||
IN UINTN VariableOffset
|
||||
)
|
||||
{
|
||||
UINTN GlobalVariableBase;
|
||||
|
||||
// Ensure the Global Variable Size have been initialized
|
||||
ASSERT (VariableOffset < PcdGet32 (PcdPeiGlobalVariableSize));
|
||||
|
||||
GlobalVariableBase = PcdGet32 (PcdCPUCoresStackBase) + PcdGet32 (PcdCPUCorePrimaryStackSize) - PcdGet32 (PcdPeiGlobalVariableSize);
|
||||
|
||||
return (VOID*)(GlobalVariableBase + VariableOffset);
|
||||
}
|
||||
|
@@ -1,40 +1,40 @@
|
||||
#/** @file
|
||||
# ArmPlatformGlobalVariableLib library implementation
|
||||
#
|
||||
# Copyright (c) 2011-2012, ARM Ltd. All rights reserved.<BR>
|
||||
#
|
||||
# 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.
|
||||
#
|
||||
#**/
|
||||
|
||||
[Defines]
|
||||
INF_VERSION = 0x00010005
|
||||
BASE_NAME = PeiArmPlatformGlobalVariableLib
|
||||
FILE_GUID = 3e03daf2-b7b4-45f7-80b2-12aba043391f
|
||||
MODULE_TYPE = BASE
|
||||
VERSION_STRING = 1.0
|
||||
LIBRARY_CLASS = ArmPlatformGlobalVariableLib
|
||||
|
||||
[Sources.common]
|
||||
PeiArmPlatformGlobalVariableLib.c
|
||||
|
||||
[Packages]
|
||||
MdePkg/MdePkg.dec
|
||||
ArmPlatformPkg/ArmPlatformPkg.dec
|
||||
|
||||
[LibraryClasses]
|
||||
BaseLib
|
||||
DebugLib
|
||||
PcdLib
|
||||
|
||||
[FixedPcd]
|
||||
gArmPlatformTokenSpaceGuid.PcdCPUCoresStackBase
|
||||
gArmPlatformTokenSpaceGuid.PcdCPUCorePrimaryStackSize
|
||||
gArmPlatformTokenSpaceGuid.PcdPeiGlobalVariableSize
|
||||
|
||||
#/** @file
|
||||
# ArmPlatformGlobalVariableLib library implementation
|
||||
#
|
||||
# Copyright (c) 2011-2012, ARM Ltd. All rights reserved.<BR>
|
||||
#
|
||||
# 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.
|
||||
#
|
||||
#**/
|
||||
|
||||
[Defines]
|
||||
INF_VERSION = 0x00010005
|
||||
BASE_NAME = PeiArmPlatformGlobalVariableLib
|
||||
FILE_GUID = 3e03daf2-b7b4-45f7-80b2-12aba043391f
|
||||
MODULE_TYPE = BASE
|
||||
VERSION_STRING = 1.0
|
||||
LIBRARY_CLASS = ArmPlatformGlobalVariableLib
|
||||
|
||||
[Sources.common]
|
||||
PeiArmPlatformGlobalVariableLib.c
|
||||
|
||||
[Packages]
|
||||
MdePkg/MdePkg.dec
|
||||
ArmPlatformPkg/ArmPlatformPkg.dec
|
||||
|
||||
[LibraryClasses]
|
||||
BaseLib
|
||||
DebugLib
|
||||
PcdLib
|
||||
|
||||
[FixedPcd]
|
||||
gArmPlatformTokenSpaceGuid.PcdCPUCoresStackBase
|
||||
gArmPlatformTokenSpaceGuid.PcdCPUCorePrimaryStackSize
|
||||
gArmPlatformTokenSpaceGuid.PcdPeiGlobalVariableSize
|
||||
|
||||
|
@@ -1,105 +1,105 @@
|
||||
/** @file
|
||||
*
|
||||
* Copyright (c) 2011-2012, ARM Limited. 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 <Uefi.h>
|
||||
#include <Library/ArmPlatformGlobalVariableLib.h>
|
||||
#include <Library/BaseLib.h>
|
||||
#include <Library/BaseMemoryLib.h>
|
||||
#include <Library/PcdLib.h>
|
||||
#include <Library/DebugLib.h>
|
||||
|
||||
#define IS_XIP() (((UINT32)PcdGet32 (PcdFdBaseAddress) > (UINT32)(PcdGet32 (PcdSystemMemoryBase) + PcdGet32 (PcdSystemMemorySize))) || \
|
||||
((PcdGet32 (PcdFdBaseAddress) + PcdGet32 (PcdFdSize)) < PcdGet32 (PcdSystemMemoryBase)))
|
||||
|
||||
// Declared by ArmPlatformPkg/PrePi Module
|
||||
extern UINTN mGlobalVariableBase;
|
||||
|
||||
VOID
|
||||
ArmPlatformGetGlobalVariable (
|
||||
IN UINTN VariableOffset,
|
||||
IN UINTN VariableSize,
|
||||
OUT VOID* Variable
|
||||
)
|
||||
{
|
||||
UINTN GlobalVariableBase;
|
||||
|
||||
// Ensure the Global Variable Size have been initialized
|
||||
ASSERT (VariableOffset < PcdGet32 (PcdPeiGlobalVariableSize));
|
||||
|
||||
if (IS_XIP()) {
|
||||
// In Case of XIP, we expect the Primary Stack at the top of the System Memory
|
||||
// The size must be 64bit aligned to allow 64bit variable to be aligned
|
||||
GlobalVariableBase = PcdGet32 (PcdSystemMemoryBase) + PcdGet32 (PcdSystemMemorySize) - ALIGN_VALUE(PcdGet32 (PcdPeiGlobalVariableSize),0x8);
|
||||
} else {
|
||||
GlobalVariableBase = mGlobalVariableBase;
|
||||
}
|
||||
|
||||
if (VariableSize == 4) {
|
||||
*(UINT32*)Variable = ReadUnaligned32 ((CONST UINT32*)(GlobalVariableBase + VariableOffset));
|
||||
} else if (VariableSize == 8) {
|
||||
*(UINT64*)Variable = ReadUnaligned64 ((CONST UINT64*)(GlobalVariableBase + VariableOffset));
|
||||
} else {
|
||||
CopyMem (Variable, (VOID*)(GlobalVariableBase + VariableOffset), VariableSize);
|
||||
}
|
||||
}
|
||||
|
||||
VOID
|
||||
ArmPlatformSetGlobalVariable (
|
||||
IN UINTN VariableOffset,
|
||||
IN UINTN VariableSize,
|
||||
OUT VOID* Variable
|
||||
)
|
||||
{
|
||||
UINTN GlobalVariableBase;
|
||||
|
||||
// Ensure the Global Variable Size have been initialized
|
||||
ASSERT (VariableOffset < PcdGet32 (PcdPeiGlobalVariableSize));
|
||||
|
||||
if (IS_XIP()) {
|
||||
// In Case of XIP, we expect the Primary Stack at the top of the System Memory
|
||||
// The size must be 64bit aligned to allow 64bit variable to be aligned
|
||||
GlobalVariableBase = PcdGet32 (PcdSystemMemoryBase) + PcdGet32 (PcdSystemMemorySize) - ALIGN_VALUE(PcdGet32 (PcdPeiGlobalVariableSize),0x8);
|
||||
} else {
|
||||
GlobalVariableBase = mGlobalVariableBase;
|
||||
}
|
||||
|
||||
if (VariableSize == 4) {
|
||||
WriteUnaligned32 ((UINT32*)(GlobalVariableBase + VariableOffset), *(UINT32*)Variable);
|
||||
} else if (VariableSize == 8) {
|
||||
WriteUnaligned64 ((UINT64*)(GlobalVariableBase + VariableOffset), *(UINT64*)Variable);
|
||||
} else {
|
||||
CopyMem ((VOID*)(GlobalVariableBase + VariableOffset), Variable, VariableSize);
|
||||
}
|
||||
}
|
||||
|
||||
VOID*
|
||||
ArmPlatformGetGlobalVariableAddress (
|
||||
IN UINTN VariableOffset
|
||||
)
|
||||
{
|
||||
UINTN GlobalVariableBase;
|
||||
|
||||
// Ensure the Global Variable Size have been initialized
|
||||
ASSERT (VariableOffset < PcdGet32 (PcdPeiGlobalVariableSize));
|
||||
|
||||
if (IS_XIP()) {
|
||||
// In Case of XIP, we expect the Primary Stack at the top of the System Memory
|
||||
// The size must be 64bit aligned to allow 64bit variable to be aligned
|
||||
GlobalVariableBase = PcdGet32 (PcdSystemMemoryBase) + PcdGet32 (PcdSystemMemorySize) - ALIGN_VALUE(PcdGet32 (PcdPeiGlobalVariableSize),0x8);
|
||||
} else {
|
||||
GlobalVariableBase = mGlobalVariableBase;
|
||||
}
|
||||
|
||||
return (VOID*)(GlobalVariableBase + VariableOffset);
|
||||
}
|
||||
/** @file
|
||||
*
|
||||
* Copyright (c) 2011-2012, ARM Limited. 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 <Uefi.h>
|
||||
#include <Library/ArmPlatformGlobalVariableLib.h>
|
||||
#include <Library/BaseLib.h>
|
||||
#include <Library/BaseMemoryLib.h>
|
||||
#include <Library/PcdLib.h>
|
||||
#include <Library/DebugLib.h>
|
||||
|
||||
#define IS_XIP() (((UINT32)PcdGet32 (PcdFdBaseAddress) > (UINT32)(PcdGet32 (PcdSystemMemoryBase) + PcdGet32 (PcdSystemMemorySize))) || \
|
||||
((PcdGet32 (PcdFdBaseAddress) + PcdGet32 (PcdFdSize)) < PcdGet32 (PcdSystemMemoryBase)))
|
||||
|
||||
// Declared by ArmPlatformPkg/PrePi Module
|
||||
extern UINTN mGlobalVariableBase;
|
||||
|
||||
VOID
|
||||
ArmPlatformGetGlobalVariable (
|
||||
IN UINTN VariableOffset,
|
||||
IN UINTN VariableSize,
|
||||
OUT VOID* Variable
|
||||
)
|
||||
{
|
||||
UINTN GlobalVariableBase;
|
||||
|
||||
// Ensure the Global Variable Size have been initialized
|
||||
ASSERT (VariableOffset < PcdGet32 (PcdPeiGlobalVariableSize));
|
||||
|
||||
if (IS_XIP()) {
|
||||
// In Case of XIP, we expect the Primary Stack at the top of the System Memory
|
||||
// The size must be 64bit aligned to allow 64bit variable to be aligned
|
||||
GlobalVariableBase = PcdGet32 (PcdSystemMemoryBase) + PcdGet32 (PcdSystemMemorySize) - ALIGN_VALUE(PcdGet32 (PcdPeiGlobalVariableSize),0x8);
|
||||
} else {
|
||||
GlobalVariableBase = mGlobalVariableBase;
|
||||
}
|
||||
|
||||
if (VariableSize == 4) {
|
||||
*(UINT32*)Variable = ReadUnaligned32 ((CONST UINT32*)(GlobalVariableBase + VariableOffset));
|
||||
} else if (VariableSize == 8) {
|
||||
*(UINT64*)Variable = ReadUnaligned64 ((CONST UINT64*)(GlobalVariableBase + VariableOffset));
|
||||
} else {
|
||||
CopyMem (Variable, (VOID*)(GlobalVariableBase + VariableOffset), VariableSize);
|
||||
}
|
||||
}
|
||||
|
||||
VOID
|
||||
ArmPlatformSetGlobalVariable (
|
||||
IN UINTN VariableOffset,
|
||||
IN UINTN VariableSize,
|
||||
OUT VOID* Variable
|
||||
)
|
||||
{
|
||||
UINTN GlobalVariableBase;
|
||||
|
||||
// Ensure the Global Variable Size have been initialized
|
||||
ASSERT (VariableOffset < PcdGet32 (PcdPeiGlobalVariableSize));
|
||||
|
||||
if (IS_XIP()) {
|
||||
// In Case of XIP, we expect the Primary Stack at the top of the System Memory
|
||||
// The size must be 64bit aligned to allow 64bit variable to be aligned
|
||||
GlobalVariableBase = PcdGet32 (PcdSystemMemoryBase) + PcdGet32 (PcdSystemMemorySize) - ALIGN_VALUE(PcdGet32 (PcdPeiGlobalVariableSize),0x8);
|
||||
} else {
|
||||
GlobalVariableBase = mGlobalVariableBase;
|
||||
}
|
||||
|
||||
if (VariableSize == 4) {
|
||||
WriteUnaligned32 ((UINT32*)(GlobalVariableBase + VariableOffset), *(UINT32*)Variable);
|
||||
} else if (VariableSize == 8) {
|
||||
WriteUnaligned64 ((UINT64*)(GlobalVariableBase + VariableOffset), *(UINT64*)Variable);
|
||||
} else {
|
||||
CopyMem ((VOID*)(GlobalVariableBase + VariableOffset), Variable, VariableSize);
|
||||
}
|
||||
}
|
||||
|
||||
VOID*
|
||||
ArmPlatformGetGlobalVariableAddress (
|
||||
IN UINTN VariableOffset
|
||||
)
|
||||
{
|
||||
UINTN GlobalVariableBase;
|
||||
|
||||
// Ensure the Global Variable Size have been initialized
|
||||
ASSERT (VariableOffset < PcdGet32 (PcdPeiGlobalVariableSize));
|
||||
|
||||
if (IS_XIP()) {
|
||||
// In Case of XIP, we expect the Primary Stack at the top of the System Memory
|
||||
// The size must be 64bit aligned to allow 64bit variable to be aligned
|
||||
GlobalVariableBase = PcdGet32 (PcdSystemMemoryBase) + PcdGet32 (PcdSystemMemorySize) - ALIGN_VALUE(PcdGet32 (PcdPeiGlobalVariableSize),0x8);
|
||||
} else {
|
||||
GlobalVariableBase = mGlobalVariableBase;
|
||||
}
|
||||
|
||||
return (VOID*)(GlobalVariableBase + VariableOffset);
|
||||
}
|
||||
|
@@ -1,81 +1,81 @@
|
||||
/** @file
|
||||
*
|
||||
* Copyright (c) 2011-2012, ARM Limited. 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 <Uefi.h>
|
||||
#include <Library/ArmPlatformGlobalVariableLib.h>
|
||||
#include <Library/BaseLib.h>
|
||||
#include <Library/BaseMemoryLib.h>
|
||||
#include <Library/PcdLib.h>
|
||||
#include <Library/DebugLib.h>
|
||||
|
||||
VOID
|
||||
ArmPlatformGetGlobalVariable (
|
||||
IN UINTN VariableOffset,
|
||||
IN UINTN VariableSize,
|
||||
OUT VOID* Variable
|
||||
)
|
||||
{
|
||||
UINTN GlobalVariableBase;
|
||||
|
||||
// Ensure the Global Variable Size have been initialized
|
||||
ASSERT (VariableOffset < PcdGet32 (PcdSecGlobalVariableSize));
|
||||
|
||||
GlobalVariableBase = PcdGet32 (PcdCPUCoresSecStackBase) + PcdGet32 (PcdCPUCoreSecPrimaryStackSize) - PcdGet32 (PcdSecGlobalVariableSize);
|
||||
|
||||
if (VariableSize == 4) {
|
||||
*(UINT32*)Variable = ReadUnaligned32 ((CONST UINT32*)(GlobalVariableBase + VariableOffset));
|
||||
} else if (VariableSize == 8) {
|
||||
*(UINT64*)Variable = ReadUnaligned64 ((CONST UINT64*)(GlobalVariableBase + VariableOffset));
|
||||
} else {
|
||||
CopyMem (Variable, (VOID*)(GlobalVariableBase + VariableOffset), VariableSize);
|
||||
}
|
||||
}
|
||||
|
||||
VOID
|
||||
ArmPlatformSetGlobalVariable (
|
||||
IN UINTN VariableOffset,
|
||||
IN UINTN VariableSize,
|
||||
OUT VOID* Variable
|
||||
)
|
||||
{
|
||||
UINTN GlobalVariableBase;
|
||||
|
||||
// Ensure the Global Variable Size have been initialized
|
||||
ASSERT (VariableOffset < PcdGet32 (PcdSecGlobalVariableSize));
|
||||
|
||||
GlobalVariableBase = PcdGet32 (PcdCPUCoresSecStackBase) + PcdGet32 (PcdCPUCoreSecPrimaryStackSize) - PcdGet32 (PcdSecGlobalVariableSize);
|
||||
|
||||
if (VariableSize == 4) {
|
||||
WriteUnaligned32 ((UINT32*)(GlobalVariableBase + VariableOffset), *(UINT32*)Variable);
|
||||
} else if (VariableSize == 8) {
|
||||
WriteUnaligned64 ((UINT64*)(GlobalVariableBase + VariableOffset), *(UINT64*)Variable);
|
||||
} else {
|
||||
CopyMem ((VOID*)(GlobalVariableBase + VariableOffset), Variable, VariableSize);
|
||||
}
|
||||
}
|
||||
|
||||
VOID*
|
||||
ArmPlatformGetGlobalVariableAddress (
|
||||
IN UINTN VariableOffset
|
||||
)
|
||||
{
|
||||
UINTN GlobalVariableBase;
|
||||
|
||||
// Ensure the Global Variable Size have been initialized
|
||||
ASSERT (VariableOffset < PcdGet32 (PcdSecGlobalVariableSize));
|
||||
|
||||
GlobalVariableBase = PcdGet32 (PcdCPUCoresSecStackBase) + PcdGet32 (PcdCPUCoreSecPrimaryStackSize) - PcdGet32 (PcdSecGlobalVariableSize);
|
||||
|
||||
return (VOID*)(GlobalVariableBase + VariableOffset);
|
||||
}
|
||||
/** @file
|
||||
*
|
||||
* Copyright (c) 2011-2012, ARM Limited. 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 <Uefi.h>
|
||||
#include <Library/ArmPlatformGlobalVariableLib.h>
|
||||
#include <Library/BaseLib.h>
|
||||
#include <Library/BaseMemoryLib.h>
|
||||
#include <Library/PcdLib.h>
|
||||
#include <Library/DebugLib.h>
|
||||
|
||||
VOID
|
||||
ArmPlatformGetGlobalVariable (
|
||||
IN UINTN VariableOffset,
|
||||
IN UINTN VariableSize,
|
||||
OUT VOID* Variable
|
||||
)
|
||||
{
|
||||
UINTN GlobalVariableBase;
|
||||
|
||||
// Ensure the Global Variable Size have been initialized
|
||||
ASSERT (VariableOffset < PcdGet32 (PcdSecGlobalVariableSize));
|
||||
|
||||
GlobalVariableBase = PcdGet32 (PcdCPUCoresSecStackBase) + PcdGet32 (PcdCPUCoreSecPrimaryStackSize) - PcdGet32 (PcdSecGlobalVariableSize);
|
||||
|
||||
if (VariableSize == 4) {
|
||||
*(UINT32*)Variable = ReadUnaligned32 ((CONST UINT32*)(GlobalVariableBase + VariableOffset));
|
||||
} else if (VariableSize == 8) {
|
||||
*(UINT64*)Variable = ReadUnaligned64 ((CONST UINT64*)(GlobalVariableBase + VariableOffset));
|
||||
} else {
|
||||
CopyMem (Variable, (VOID*)(GlobalVariableBase + VariableOffset), VariableSize);
|
||||
}
|
||||
}
|
||||
|
||||
VOID
|
||||
ArmPlatformSetGlobalVariable (
|
||||
IN UINTN VariableOffset,
|
||||
IN UINTN VariableSize,
|
||||
OUT VOID* Variable
|
||||
)
|
||||
{
|
||||
UINTN GlobalVariableBase;
|
||||
|
||||
// Ensure the Global Variable Size have been initialized
|
||||
ASSERT (VariableOffset < PcdGet32 (PcdSecGlobalVariableSize));
|
||||
|
||||
GlobalVariableBase = PcdGet32 (PcdCPUCoresSecStackBase) + PcdGet32 (PcdCPUCoreSecPrimaryStackSize) - PcdGet32 (PcdSecGlobalVariableSize);
|
||||
|
||||
if (VariableSize == 4) {
|
||||
WriteUnaligned32 ((UINT32*)(GlobalVariableBase + VariableOffset), *(UINT32*)Variable);
|
||||
} else if (VariableSize == 8) {
|
||||
WriteUnaligned64 ((UINT64*)(GlobalVariableBase + VariableOffset), *(UINT64*)Variable);
|
||||
} else {
|
||||
CopyMem ((VOID*)(GlobalVariableBase + VariableOffset), Variable, VariableSize);
|
||||
}
|
||||
}
|
||||
|
||||
VOID*
|
||||
ArmPlatformGetGlobalVariableAddress (
|
||||
IN UINTN VariableOffset
|
||||
)
|
||||
{
|
||||
UINTN GlobalVariableBase;
|
||||
|
||||
// Ensure the Global Variable Size have been initialized
|
||||
ASSERT (VariableOffset < PcdGet32 (PcdSecGlobalVariableSize));
|
||||
|
||||
GlobalVariableBase = PcdGet32 (PcdCPUCoresSecStackBase) + PcdGet32 (PcdCPUCoreSecPrimaryStackSize) - PcdGet32 (PcdSecGlobalVariableSize);
|
||||
|
||||
return (VOID*)(GlobalVariableBase + VariableOffset);
|
||||
}
|
||||
|
@@ -1,164 +1,164 @@
|
||||
/** @file
|
||||
*
|
||||
* Copyright (c) 2011-2012, ARM Limited. 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 <Library/ArmLib.h>
|
||||
#include <Library/ArmPlatformLib.h>
|
||||
|
||||
#include <Ppi/ArmMpCoreInfo.h>
|
||||
|
||||
|
||||
ARM_CORE_INFO mArmPlatformNullMpCoreInfoTable[] = {
|
||||
{
|
||||
// Cluster 0, Core 0
|
||||
0x0, 0x0,
|
||||
|
||||
// MP Core MailBox Set/Get/Clear Addresses and Clear Value
|
||||
(EFI_PHYSICAL_ADDRESS)0,
|
||||
(EFI_PHYSICAL_ADDRESS)0,
|
||||
(EFI_PHYSICAL_ADDRESS)0,
|
||||
(UINT64)0xFFFFFFFF
|
||||
},
|
||||
{
|
||||
// Cluster 0, Core 1
|
||||
0x0, 0x1,
|
||||
|
||||
// MP Core MailBox Set/Get/Clear Addresses and Clear Value
|
||||
(EFI_PHYSICAL_ADDRESS)0,
|
||||
(EFI_PHYSICAL_ADDRESS)0,
|
||||
(EFI_PHYSICAL_ADDRESS)0,
|
||||
(UINT64)0xFFFFFFFF
|
||||
},
|
||||
{
|
||||
// Cluster 0, Core 2
|
||||
0x0, 0x2,
|
||||
|
||||
// MP Core MailBox Set/Get/Clear Addresses and Clear Value
|
||||
(EFI_PHYSICAL_ADDRESS)0,
|
||||
(EFI_PHYSICAL_ADDRESS)0,
|
||||
(EFI_PHYSICAL_ADDRESS)0,
|
||||
(UINT64)0xFFFFFFFF
|
||||
},
|
||||
{
|
||||
// Cluster 0, Core 3
|
||||
0x0, 0x3,
|
||||
|
||||
// MP Core MailBox Set/Get/Clear Addresses and Clear Value
|
||||
(EFI_PHYSICAL_ADDRESS)0,
|
||||
(EFI_PHYSICAL_ADDRESS)0,
|
||||
(EFI_PHYSICAL_ADDRESS)0,
|
||||
(UINT64)0xFFFFFFFF
|
||||
}
|
||||
};
|
||||
|
||||
// This function should be better located into TimerLib implementation
|
||||
RETURN_STATUS
|
||||
EFIAPI
|
||||
TimerConstructor (
|
||||
VOID
|
||||
)
|
||||
{
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
/**
|
||||
Return the current Boot Mode
|
||||
|
||||
This function returns the boot reason on the platform
|
||||
|
||||
**/
|
||||
EFI_BOOT_MODE
|
||||
ArmPlatformGetBootMode (
|
||||
VOID
|
||||
)
|
||||
{
|
||||
return BOOT_WITH_FULL_CONFIGURATION;
|
||||
}
|
||||
|
||||
/**
|
||||
Initialize controllers that must setup in the normal world
|
||||
|
||||
This function is called by the ArmPlatformPkg/PrePi or ArmPlatformPkg/PlatformPei
|
||||
in the PEI phase.
|
||||
|
||||
**/
|
||||
RETURN_STATUS
|
||||
ArmPlatformInitialize (
|
||||
IN UINTN MpId
|
||||
)
|
||||
{
|
||||
if (!IS_PRIMARY_CORE(MpId)) {
|
||||
return RETURN_SUCCESS;
|
||||
}
|
||||
|
||||
//TODO: Implement me
|
||||
|
||||
return RETURN_SUCCESS;
|
||||
}
|
||||
|
||||
/**
|
||||
Initialize the system (or sometimes called permanent) memory
|
||||
|
||||
This memory is generally represented by the DRAM.
|
||||
|
||||
**/
|
||||
VOID
|
||||
ArmPlatformInitializeSystemMemory (
|
||||
VOID
|
||||
)
|
||||
{
|
||||
//TODO: Implement me
|
||||
}
|
||||
|
||||
EFI_STATUS
|
||||
PrePeiCoreGetMpCoreInfo (
|
||||
OUT UINTN *CoreCount,
|
||||
OUT ARM_CORE_INFO **ArmCoreTable
|
||||
)
|
||||
{
|
||||
if (ArmIsMpCore()) {
|
||||
*CoreCount = sizeof(mArmPlatformNullMpCoreInfoTable) / sizeof(ARM_CORE_INFO);
|
||||
*ArmCoreTable = mArmPlatformNullMpCoreInfoTable;
|
||||
return EFI_SUCCESS;
|
||||
} else {
|
||||
return EFI_UNSUPPORTED;
|
||||
}
|
||||
}
|
||||
|
||||
// Needs to be declared in the file. Otherwise gArmMpCoreInfoPpiGuid is undefined in the contect of PrePeiCore
|
||||
EFI_GUID mArmMpCoreInfoPpiGuid = ARM_MP_CORE_INFO_PPI_GUID;
|
||||
ARM_MP_CORE_INFO_PPI mMpCoreInfoPpi = { PrePeiCoreGetMpCoreInfo };
|
||||
|
||||
EFI_PEI_PPI_DESCRIPTOR gPlatformPpiTable[] = {
|
||||
{
|
||||
EFI_PEI_PPI_DESCRIPTOR_PPI,
|
||||
&mArmMpCoreInfoPpiGuid,
|
||||
&mMpCoreInfoPpi
|
||||
}
|
||||
};
|
||||
|
||||
VOID
|
||||
ArmPlatformGetPlatformPpiList (
|
||||
OUT UINTN *PpiListSize,
|
||||
OUT EFI_PEI_PPI_DESCRIPTOR **PpiList
|
||||
)
|
||||
{
|
||||
if (ArmIsMpCore()) {
|
||||
*PpiListSize = sizeof(gPlatformPpiTable);
|
||||
*PpiList = gPlatformPpiTable;
|
||||
} else {
|
||||
*PpiListSize = 0;
|
||||
*PpiList = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
/** @file
|
||||
*
|
||||
* Copyright (c) 2011-2012, ARM Limited. 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 <Library/ArmLib.h>
|
||||
#include <Library/ArmPlatformLib.h>
|
||||
|
||||
#include <Ppi/ArmMpCoreInfo.h>
|
||||
|
||||
|
||||
ARM_CORE_INFO mArmPlatformNullMpCoreInfoTable[] = {
|
||||
{
|
||||
// Cluster 0, Core 0
|
||||
0x0, 0x0,
|
||||
|
||||
// MP Core MailBox Set/Get/Clear Addresses and Clear Value
|
||||
(EFI_PHYSICAL_ADDRESS)0,
|
||||
(EFI_PHYSICAL_ADDRESS)0,
|
||||
(EFI_PHYSICAL_ADDRESS)0,
|
||||
(UINT64)0xFFFFFFFF
|
||||
},
|
||||
{
|
||||
// Cluster 0, Core 1
|
||||
0x0, 0x1,
|
||||
|
||||
// MP Core MailBox Set/Get/Clear Addresses and Clear Value
|
||||
(EFI_PHYSICAL_ADDRESS)0,
|
||||
(EFI_PHYSICAL_ADDRESS)0,
|
||||
(EFI_PHYSICAL_ADDRESS)0,
|
||||
(UINT64)0xFFFFFFFF
|
||||
},
|
||||
{
|
||||
// Cluster 0, Core 2
|
||||
0x0, 0x2,
|
||||
|
||||
// MP Core MailBox Set/Get/Clear Addresses and Clear Value
|
||||
(EFI_PHYSICAL_ADDRESS)0,
|
||||
(EFI_PHYSICAL_ADDRESS)0,
|
||||
(EFI_PHYSICAL_ADDRESS)0,
|
||||
(UINT64)0xFFFFFFFF
|
||||
},
|
||||
{
|
||||
// Cluster 0, Core 3
|
||||
0x0, 0x3,
|
||||
|
||||
// MP Core MailBox Set/Get/Clear Addresses and Clear Value
|
||||
(EFI_PHYSICAL_ADDRESS)0,
|
||||
(EFI_PHYSICAL_ADDRESS)0,
|
||||
(EFI_PHYSICAL_ADDRESS)0,
|
||||
(UINT64)0xFFFFFFFF
|
||||
}
|
||||
};
|
||||
|
||||
// This function should be better located into TimerLib implementation
|
||||
RETURN_STATUS
|
||||
EFIAPI
|
||||
TimerConstructor (
|
||||
VOID
|
||||
)
|
||||
{
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
/**
|
||||
Return the current Boot Mode
|
||||
|
||||
This function returns the boot reason on the platform
|
||||
|
||||
**/
|
||||
EFI_BOOT_MODE
|
||||
ArmPlatformGetBootMode (
|
||||
VOID
|
||||
)
|
||||
{
|
||||
return BOOT_WITH_FULL_CONFIGURATION;
|
||||
}
|
||||
|
||||
/**
|
||||
Initialize controllers that must setup in the normal world
|
||||
|
||||
This function is called by the ArmPlatformPkg/PrePi or ArmPlatformPkg/PlatformPei
|
||||
in the PEI phase.
|
||||
|
||||
**/
|
||||
RETURN_STATUS
|
||||
ArmPlatformInitialize (
|
||||
IN UINTN MpId
|
||||
)
|
||||
{
|
||||
if (!IS_PRIMARY_CORE(MpId)) {
|
||||
return RETURN_SUCCESS;
|
||||
}
|
||||
|
||||
//TODO: Implement me
|
||||
|
||||
return RETURN_SUCCESS;
|
||||
}
|
||||
|
||||
/**
|
||||
Initialize the system (or sometimes called permanent) memory
|
||||
|
||||
This memory is generally represented by the DRAM.
|
||||
|
||||
**/
|
||||
VOID
|
||||
ArmPlatformInitializeSystemMemory (
|
||||
VOID
|
||||
)
|
||||
{
|
||||
//TODO: Implement me
|
||||
}
|
||||
|
||||
EFI_STATUS
|
||||
PrePeiCoreGetMpCoreInfo (
|
||||
OUT UINTN *CoreCount,
|
||||
OUT ARM_CORE_INFO **ArmCoreTable
|
||||
)
|
||||
{
|
||||
if (ArmIsMpCore()) {
|
||||
*CoreCount = sizeof(mArmPlatformNullMpCoreInfoTable) / sizeof(ARM_CORE_INFO);
|
||||
*ArmCoreTable = mArmPlatformNullMpCoreInfoTable;
|
||||
return EFI_SUCCESS;
|
||||
} else {
|
||||
return EFI_UNSUPPORTED;
|
||||
}
|
||||
}
|
||||
|
||||
// Needs to be declared in the file. Otherwise gArmMpCoreInfoPpiGuid is undefined in the contect of PrePeiCore
|
||||
EFI_GUID mArmMpCoreInfoPpiGuid = ARM_MP_CORE_INFO_PPI_GUID;
|
||||
ARM_MP_CORE_INFO_PPI mMpCoreInfoPpi = { PrePeiCoreGetMpCoreInfo };
|
||||
|
||||
EFI_PEI_PPI_DESCRIPTOR gPlatformPpiTable[] = {
|
||||
{
|
||||
EFI_PEI_PPI_DESCRIPTOR_PPI,
|
||||
&mArmMpCoreInfoPpiGuid,
|
||||
&mMpCoreInfoPpi
|
||||
}
|
||||
};
|
||||
|
||||
VOID
|
||||
ArmPlatformGetPlatformPpiList (
|
||||
OUT UINTN *PpiListSize,
|
||||
OUT EFI_PEI_PPI_DESCRIPTOR **PpiList
|
||||
)
|
||||
{
|
||||
if (ArmIsMpCore()) {
|
||||
*PpiListSize = sizeof(gPlatformPpiTable);
|
||||
*PpiList = gPlatformPpiTable;
|
||||
} else {
|
||||
*PpiListSize = 0;
|
||||
*PpiList = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -1,74 +1,74 @@
|
||||
/** @file
|
||||
*
|
||||
* Copyright (c) 2011-2012, ARM Limited. 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 <Library/ArmPlatformLib.h>
|
||||
#include <Library/DebugLib.h>
|
||||
#include <Library/PcdLib.h>
|
||||
|
||||
/**
|
||||
Initialize the Secure peripherals and memory regions
|
||||
|
||||
If Trustzone is supported by your platform then this function makes the required initialization
|
||||
of the secure peripherals and memory regions.
|
||||
|
||||
**/
|
||||
VOID
|
||||
ArmPlatformSecTrustzoneInit (
|
||||
IN UINTN MpId
|
||||
)
|
||||
{
|
||||
// Secondary cores might have to set the Secure SGIs into the GICD_IGROUPR0
|
||||
if (!IS_PRIMARY_CORE(MpId)) {
|
||||
return;
|
||||
}
|
||||
|
||||
ASSERT(FALSE);
|
||||
}
|
||||
|
||||
/**
|
||||
Initialize controllers that must setup at the early stage
|
||||
|
||||
Some peripherals must be initialized in Secure World.
|
||||
For example, some L2x0 requires to be initialized in Secure World
|
||||
|
||||
**/
|
||||
RETURN_STATUS
|
||||
ArmPlatformSecInitialize (
|
||||
IN UINTN MpId
|
||||
)
|
||||
{
|
||||
// If it is not the primary core then there is nothing to do
|
||||
if (!IS_PRIMARY_CORE(MpId)) {
|
||||
return RETURN_SUCCESS;
|
||||
}
|
||||
|
||||
// Do nothing yet
|
||||
return RETURN_SUCCESS;
|
||||
}
|
||||
|
||||
/**
|
||||
Call before jumping to Normal World
|
||||
|
||||
This function allows the firmware platform to do extra actions before
|
||||
jumping to the Normal World
|
||||
|
||||
**/
|
||||
VOID
|
||||
ArmPlatformSecExtraAction (
|
||||
IN UINTN MpId,
|
||||
OUT UINTN* JumpAddress
|
||||
)
|
||||
{
|
||||
*JumpAddress = PcdGet32(PcdFvBaseAddress);
|
||||
}
|
||||
/** @file
|
||||
*
|
||||
* Copyright (c) 2011-2012, ARM Limited. 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 <Library/ArmPlatformLib.h>
|
||||
#include <Library/DebugLib.h>
|
||||
#include <Library/PcdLib.h>
|
||||
|
||||
/**
|
||||
Initialize the Secure peripherals and memory regions
|
||||
|
||||
If Trustzone is supported by your platform then this function makes the required initialization
|
||||
of the secure peripherals and memory regions.
|
||||
|
||||
**/
|
||||
VOID
|
||||
ArmPlatformSecTrustzoneInit (
|
||||
IN UINTN MpId
|
||||
)
|
||||
{
|
||||
// Secondary cores might have to set the Secure SGIs into the GICD_IGROUPR0
|
||||
if (!IS_PRIMARY_CORE(MpId)) {
|
||||
return;
|
||||
}
|
||||
|
||||
ASSERT(FALSE);
|
||||
}
|
||||
|
||||
/**
|
||||
Initialize controllers that must setup at the early stage
|
||||
|
||||
Some peripherals must be initialized in Secure World.
|
||||
For example, some L2x0 requires to be initialized in Secure World
|
||||
|
||||
**/
|
||||
RETURN_STATUS
|
||||
ArmPlatformSecInitialize (
|
||||
IN UINTN MpId
|
||||
)
|
||||
{
|
||||
// If it is not the primary core then there is nothing to do
|
||||
if (!IS_PRIMARY_CORE(MpId)) {
|
||||
return RETURN_SUCCESS;
|
||||
}
|
||||
|
||||
// Do nothing yet
|
||||
return RETURN_SUCCESS;
|
||||
}
|
||||
|
||||
/**
|
||||
Call before jumping to Normal World
|
||||
|
||||
This function allows the firmware platform to do extra actions before
|
||||
jumping to the Normal World
|
||||
|
||||
**/
|
||||
VOID
|
||||
ArmPlatformSecExtraAction (
|
||||
IN UINTN MpId,
|
||||
OUT UINTN* JumpAddress
|
||||
)
|
||||
{
|
||||
*JumpAddress = PcdGet32(PcdFvBaseAddress);
|
||||
}
|
||||
|
@@ -1,55 +1,55 @@
|
||||
#/* @file
|
||||
# Copyright (c) 2011-2012, ARM Limited. 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.
|
||||
#
|
||||
#*/
|
||||
|
||||
[Defines]
|
||||
INF_VERSION = 0x00010005
|
||||
BASE_NAME = DebugSecExtraActionLib
|
||||
FILE_GUID = 8fff7a60-a6f8-11e0-990a-0002a5d5c51b
|
||||
MODULE_TYPE = BASE
|
||||
VERSION_STRING = 1.0
|
||||
LIBRARY_CLASS = ArmPlatformSecExtraActionLib
|
||||
|
||||
#
|
||||
# The following information is for reference only and not required by the build tools.
|
||||
#
|
||||
# VALID_ARCHITECTURES = ARM
|
||||
#
|
||||
|
||||
[Sources.common]
|
||||
DebugSecExtraActionLib.c
|
||||
|
||||
[Packages]
|
||||
MdePkg/MdePkg.dec
|
||||
ArmPkg/ArmPkg.dec
|
||||
ArmPlatformPkg/ArmPlatformPkg.dec
|
||||
|
||||
[LibraryClasses]
|
||||
DebugLib
|
||||
PcdLib
|
||||
ArmGicLib
|
||||
PrintLib
|
||||
SerialPortLib
|
||||
|
||||
[FeaturePcd]
|
||||
gArmPlatformTokenSpaceGuid.PcdStandalone
|
||||
gArmPlatformTokenSpaceGuid.PcdSystemMemoryInitializeInSec
|
||||
|
||||
[FixedPcd]
|
||||
gArmTokenSpaceGuid.PcdFvBaseAddress
|
||||
|
||||
gArmTokenSpaceGuid.PcdArmPrimaryCoreMask
|
||||
gArmTokenSpaceGuid.PcdArmPrimaryCore
|
||||
|
||||
gArmTokenSpaceGuid.PcdGicDistributorBase
|
||||
gArmTokenSpaceGuid.PcdGicInterruptInterfaceBase
|
||||
gArmTokenSpaceGuid.PcdGicSgiIntId
|
||||
#/* @file
|
||||
# Copyright (c) 2011-2012, ARM Limited. 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.
|
||||
#
|
||||
#*/
|
||||
|
||||
[Defines]
|
||||
INF_VERSION = 0x00010005
|
||||
BASE_NAME = DebugSecExtraActionLib
|
||||
FILE_GUID = 8fff7a60-a6f8-11e0-990a-0002a5d5c51b
|
||||
MODULE_TYPE = BASE
|
||||
VERSION_STRING = 1.0
|
||||
LIBRARY_CLASS = ArmPlatformSecExtraActionLib
|
||||
|
||||
#
|
||||
# The following information is for reference only and not required by the build tools.
|
||||
#
|
||||
# VALID_ARCHITECTURES = ARM
|
||||
#
|
||||
|
||||
[Sources.common]
|
||||
DebugSecExtraActionLib.c
|
||||
|
||||
[Packages]
|
||||
MdePkg/MdePkg.dec
|
||||
ArmPkg/ArmPkg.dec
|
||||
ArmPlatformPkg/ArmPlatformPkg.dec
|
||||
|
||||
[LibraryClasses]
|
||||
DebugLib
|
||||
PcdLib
|
||||
ArmGicLib
|
||||
PrintLib
|
||||
SerialPortLib
|
||||
|
||||
[FeaturePcd]
|
||||
gArmPlatformTokenSpaceGuid.PcdStandalone
|
||||
gArmPlatformTokenSpaceGuid.PcdSystemMemoryInitializeInSec
|
||||
|
||||
[FixedPcd]
|
||||
gArmTokenSpaceGuid.PcdFvBaseAddress
|
||||
|
||||
gArmTokenSpaceGuid.PcdArmPrimaryCoreMask
|
||||
gArmTokenSpaceGuid.PcdArmPrimaryCore
|
||||
|
||||
gArmTokenSpaceGuid.PcdGicDistributorBase
|
||||
gArmTokenSpaceGuid.PcdGicInterruptInterfaceBase
|
||||
gArmTokenSpaceGuid.PcdGicSgiIntId
|
||||
|
@@ -1,184 +1,184 @@
|
||||
/** @file
|
||||
Serial I/O Port library functions with no library constructor/destructor
|
||||
|
||||
Copyright (c) 2008 - 2010, Apple Inc. All rights reserved.<BR>
|
||||
Copyright (c) 2012, ARM Ltd. All rights reserved.<BR>
|
||||
|
||||
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 <Base.h>
|
||||
|
||||
#include <Library/IoLib.h>
|
||||
#include <Library/PcdLib.h>
|
||||
#include <Library/SerialPortLib.h>
|
||||
#include <Library/SerialPortExtLib.h>
|
||||
|
||||
#include <Drivers/PL011Uart.h>
|
||||
|
||||
|
||||
/**
|
||||
|
||||
Programmed hardware of Serial port.
|
||||
|
||||
@return Always return RETURN_UNSUPPORTED.
|
||||
|
||||
**/
|
||||
RETURN_STATUS
|
||||
EFIAPI
|
||||
SerialPortInitialize (
|
||||
VOID
|
||||
)
|
||||
{
|
||||
return PL011UartInitializePort (
|
||||
(UINTN)PcdGet64 (PcdSerialRegisterBase),
|
||||
(UINTN)PcdGet64 (PcdUartDefaultBaudRate),
|
||||
0, // Use the default value for Fifo depth
|
||||
(EFI_PARITY_TYPE)PcdGet8 (PcdUartDefaultParity),
|
||||
PcdGet8 (PcdUartDefaultDataBits),
|
||||
(EFI_STOP_BITS_TYPE) PcdGet8 (PcdUartDefaultStopBits));
|
||||
}
|
||||
|
||||
/**
|
||||
Write data to serial device.
|
||||
|
||||
@param Buffer Point of data buffer which need to be written.
|
||||
@param NumberOfBytes Number of output bytes which are cached in Buffer.
|
||||
|
||||
@retval 0 Write data failed.
|
||||
@retval !0 Actual number of bytes written to serial device.
|
||||
|
||||
**/
|
||||
UINTN
|
||||
EFIAPI
|
||||
SerialPortWrite (
|
||||
IN UINT8 *Buffer,
|
||||
IN UINTN NumberOfBytes
|
||||
)
|
||||
{
|
||||
return PL011UartWrite ((UINTN)PcdGet64 (PcdSerialRegisterBase), Buffer, NumberOfBytes);
|
||||
}
|
||||
|
||||
/**
|
||||
Read data from serial device and save the data in buffer.
|
||||
|
||||
@param Buffer Point of data buffer which need to be written.
|
||||
@param NumberOfBytes Number of output bytes which are cached in Buffer.
|
||||
|
||||
@retval 0 Read data failed.
|
||||
@retval !0 Actual number of bytes read from serial device.
|
||||
|
||||
**/
|
||||
UINTN
|
||||
EFIAPI
|
||||
SerialPortRead (
|
||||
OUT UINT8 *Buffer,
|
||||
IN UINTN NumberOfBytes
|
||||
)
|
||||
{
|
||||
return PL011UartRead ((UINTN)PcdGet64 (PcdSerialRegisterBase), Buffer, NumberOfBytes);
|
||||
}
|
||||
|
||||
/**
|
||||
Check to see if any data is available to be read from the debug device.
|
||||
|
||||
@retval EFI_SUCCESS At least one byte of data is available to be read
|
||||
@retval EFI_NOT_READY No data is available to be read
|
||||
@retval EFI_DEVICE_ERROR The serial device is not functioning properly
|
||||
|
||||
**/
|
||||
BOOLEAN
|
||||
EFIAPI
|
||||
SerialPortPoll (
|
||||
VOID
|
||||
)
|
||||
{
|
||||
return PL011UartPoll ((UINTN)PcdGet64 (PcdSerialRegisterBase));
|
||||
}
|
||||
|
||||
/**
|
||||
Set new attributes to PL011.
|
||||
|
||||
@param BaudRate The baud rate of the serial device. If the baud rate is not supported,
|
||||
the speed will be reduced down to the nearest supported one and the
|
||||
variable's value will be updated accordingly.
|
||||
@param ReceiveFifoDepth The number of characters the device will buffer on input. If the specified
|
||||
value is not supported, the variable's value will be reduced down to the
|
||||
nearest supported one.
|
||||
@param Timeout If applicable, the number of microseconds the device will wait
|
||||
before timing out a Read or a Write operation.
|
||||
@param Parity If applicable, this is the EFI_PARITY_TYPE that is computer or checked
|
||||
as each character is transmitted or received. If the device does not
|
||||
support parity, the value is the default parity value.
|
||||
@param DataBits The number of data bits in each character
|
||||
@param StopBits If applicable, the EFI_STOP_BITS_TYPE number of stop bits per character.
|
||||
If the device does not support stop bits, the value is the default stop
|
||||
bit value.
|
||||
|
||||
@retval EFI_SUCCESS All attributes were set correctly on the serial device.
|
||||
@retval EFI_INVALID_PARAMETERS One or more of the attributes has an unsupported value.
|
||||
|
||||
**/
|
||||
RETURN_STATUS
|
||||
EFIAPI
|
||||
SerialPortSetAttributes (
|
||||
IN UINT64 BaudRate,
|
||||
IN UINT32 ReceiveFifoDepth,
|
||||
IN UINT32 Timeout,
|
||||
IN EFI_PARITY_TYPE Parity,
|
||||
IN UINT8 DataBits,
|
||||
IN EFI_STOP_BITS_TYPE StopBits
|
||||
)
|
||||
{
|
||||
return PL011UartInitializePort (
|
||||
(UINTN)PcdGet64 (PcdSerialRegisterBase),
|
||||
BaudRate,
|
||||
ReceiveFifoDepth,
|
||||
Parity,
|
||||
DataBits,
|
||||
StopBits);
|
||||
}
|
||||
|
||||
/**
|
||||
Set the serial device control bits.
|
||||
|
||||
@param Control Control bits which are to be set on the serial device.
|
||||
|
||||
@retval EFI_SUCCESS The new control bits were set on the serial device.
|
||||
@retval EFI_UNSUPPORTED The serial device does not support this operation.
|
||||
@retval EFI_DEVICE_ERROR The serial device is not functioning correctly.
|
||||
|
||||
**/
|
||||
RETURN_STATUS
|
||||
EFIAPI
|
||||
SerialPortSetControl (
|
||||
IN UINT32 Control
|
||||
)
|
||||
{
|
||||
return PL011UartSetControl((UINTN)PcdGet64 (PcdSerialRegisterBase), Control);
|
||||
}
|
||||
|
||||
/**
|
||||
Get the serial device control bits.
|
||||
|
||||
@param Control Control signals read from the serial device.
|
||||
|
||||
@retval EFI_SUCCESS The control bits were read from the serial device.
|
||||
@retval EFI_DEVICE_ERROR The serial device is not functioning correctly.
|
||||
|
||||
**/
|
||||
RETURN_STATUS
|
||||
EFIAPI
|
||||
SerialPortGetControl (
|
||||
OUT UINT32 *Control
|
||||
)
|
||||
{
|
||||
return PL011UartGetControl((UINTN)PcdGet64 (PcdSerialRegisterBase), Control);
|
||||
}
|
||||
/** @file
|
||||
Serial I/O Port library functions with no library constructor/destructor
|
||||
|
||||
Copyright (c) 2008 - 2010, Apple Inc. All rights reserved.<BR>
|
||||
Copyright (c) 2012, ARM Ltd. All rights reserved.<BR>
|
||||
|
||||
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 <Base.h>
|
||||
|
||||
#include <Library/IoLib.h>
|
||||
#include <Library/PcdLib.h>
|
||||
#include <Library/SerialPortLib.h>
|
||||
#include <Library/SerialPortExtLib.h>
|
||||
|
||||
#include <Drivers/PL011Uart.h>
|
||||
|
||||
|
||||
/**
|
||||
|
||||
Programmed hardware of Serial port.
|
||||
|
||||
@return Always return RETURN_UNSUPPORTED.
|
||||
|
||||
**/
|
||||
RETURN_STATUS
|
||||
EFIAPI
|
||||
SerialPortInitialize (
|
||||
VOID
|
||||
)
|
||||
{
|
||||
return PL011UartInitializePort (
|
||||
(UINTN)PcdGet64 (PcdSerialRegisterBase),
|
||||
(UINTN)PcdGet64 (PcdUartDefaultBaudRate),
|
||||
0, // Use the default value for Fifo depth
|
||||
(EFI_PARITY_TYPE)PcdGet8 (PcdUartDefaultParity),
|
||||
PcdGet8 (PcdUartDefaultDataBits),
|
||||
(EFI_STOP_BITS_TYPE) PcdGet8 (PcdUartDefaultStopBits));
|
||||
}
|
||||
|
||||
/**
|
||||
Write data to serial device.
|
||||
|
||||
@param Buffer Point of data buffer which need to be written.
|
||||
@param NumberOfBytes Number of output bytes which are cached in Buffer.
|
||||
|
||||
@retval 0 Write data failed.
|
||||
@retval !0 Actual number of bytes written to serial device.
|
||||
|
||||
**/
|
||||
UINTN
|
||||
EFIAPI
|
||||
SerialPortWrite (
|
||||
IN UINT8 *Buffer,
|
||||
IN UINTN NumberOfBytes
|
||||
)
|
||||
{
|
||||
return PL011UartWrite ((UINTN)PcdGet64 (PcdSerialRegisterBase), Buffer, NumberOfBytes);
|
||||
}
|
||||
|
||||
/**
|
||||
Read data from serial device and save the data in buffer.
|
||||
|
||||
@param Buffer Point of data buffer which need to be written.
|
||||
@param NumberOfBytes Number of output bytes which are cached in Buffer.
|
||||
|
||||
@retval 0 Read data failed.
|
||||
@retval !0 Actual number of bytes read from serial device.
|
||||
|
||||
**/
|
||||
UINTN
|
||||
EFIAPI
|
||||
SerialPortRead (
|
||||
OUT UINT8 *Buffer,
|
||||
IN UINTN NumberOfBytes
|
||||
)
|
||||
{
|
||||
return PL011UartRead ((UINTN)PcdGet64 (PcdSerialRegisterBase), Buffer, NumberOfBytes);
|
||||
}
|
||||
|
||||
/**
|
||||
Check to see if any data is available to be read from the debug device.
|
||||
|
||||
@retval EFI_SUCCESS At least one byte of data is available to be read
|
||||
@retval EFI_NOT_READY No data is available to be read
|
||||
@retval EFI_DEVICE_ERROR The serial device is not functioning properly
|
||||
|
||||
**/
|
||||
BOOLEAN
|
||||
EFIAPI
|
||||
SerialPortPoll (
|
||||
VOID
|
||||
)
|
||||
{
|
||||
return PL011UartPoll ((UINTN)PcdGet64 (PcdSerialRegisterBase));
|
||||
}
|
||||
|
||||
/**
|
||||
Set new attributes to PL011.
|
||||
|
||||
@param BaudRate The baud rate of the serial device. If the baud rate is not supported,
|
||||
the speed will be reduced down to the nearest supported one and the
|
||||
variable's value will be updated accordingly.
|
||||
@param ReceiveFifoDepth The number of characters the device will buffer on input. If the specified
|
||||
value is not supported, the variable's value will be reduced down to the
|
||||
nearest supported one.
|
||||
@param Timeout If applicable, the number of microseconds the device will wait
|
||||
before timing out a Read or a Write operation.
|
||||
@param Parity If applicable, this is the EFI_PARITY_TYPE that is computer or checked
|
||||
as each character is transmitted or received. If the device does not
|
||||
support parity, the value is the default parity value.
|
||||
@param DataBits The number of data bits in each character
|
||||
@param StopBits If applicable, the EFI_STOP_BITS_TYPE number of stop bits per character.
|
||||
If the device does not support stop bits, the value is the default stop
|
||||
bit value.
|
||||
|
||||
@retval EFI_SUCCESS All attributes were set correctly on the serial device.
|
||||
@retval EFI_INVALID_PARAMETERS One or more of the attributes has an unsupported value.
|
||||
|
||||
**/
|
||||
RETURN_STATUS
|
||||
EFIAPI
|
||||
SerialPortSetAttributes (
|
||||
IN UINT64 BaudRate,
|
||||
IN UINT32 ReceiveFifoDepth,
|
||||
IN UINT32 Timeout,
|
||||
IN EFI_PARITY_TYPE Parity,
|
||||
IN UINT8 DataBits,
|
||||
IN EFI_STOP_BITS_TYPE StopBits
|
||||
)
|
||||
{
|
||||
return PL011UartInitializePort (
|
||||
(UINTN)PcdGet64 (PcdSerialRegisterBase),
|
||||
BaudRate,
|
||||
ReceiveFifoDepth,
|
||||
Parity,
|
||||
DataBits,
|
||||
StopBits);
|
||||
}
|
||||
|
||||
/**
|
||||
Set the serial device control bits.
|
||||
|
||||
@param Control Control bits which are to be set on the serial device.
|
||||
|
||||
@retval EFI_SUCCESS The new control bits were set on the serial device.
|
||||
@retval EFI_UNSUPPORTED The serial device does not support this operation.
|
||||
@retval EFI_DEVICE_ERROR The serial device is not functioning correctly.
|
||||
|
||||
**/
|
||||
RETURN_STATUS
|
||||
EFIAPI
|
||||
SerialPortSetControl (
|
||||
IN UINT32 Control
|
||||
)
|
||||
{
|
||||
return PL011UartSetControl((UINTN)PcdGet64 (PcdSerialRegisterBase), Control);
|
||||
}
|
||||
|
||||
/**
|
||||
Get the serial device control bits.
|
||||
|
||||
@param Control Control signals read from the serial device.
|
||||
|
||||
@retval EFI_SUCCESS The control bits were read from the serial device.
|
||||
@retval EFI_DEVICE_ERROR The serial device is not functioning correctly.
|
||||
|
||||
**/
|
||||
RETURN_STATUS
|
||||
EFIAPI
|
||||
SerialPortGetControl (
|
||||
OUT UINT32 *Control
|
||||
)
|
||||
{
|
||||
return PL011UartGetControl((UINTN)PcdGet64 (PcdSerialRegisterBase), Control);
|
||||
}
|
||||
|
@@ -1,260 +1,260 @@
|
||||
/** @file
|
||||
|
||||
Copyright (c) 2008 - 2010, Apple Inc. All rights reserved.<BR>
|
||||
Copyright (c) 2011, ARM Limited. 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 <Base.h>
|
||||
|
||||
#include <Library/BaseLib.h>
|
||||
#include <Library/TimerLib.h>
|
||||
#include <Library/DebugLib.h>
|
||||
#include <Library/PcdLib.h>
|
||||
#include <Library/IoLib.h>
|
||||
#include <Drivers/SP804Timer.h>
|
||||
|
||||
#define SP804_TIMER_METRONOME_BASE ((UINTN)PcdGet32 (PcdSP804TimerMetronomeBase))
|
||||
#define SP804_TIMER_PERFORMANCE_BASE ((UINTN)PcdGet32 (PcdSP804TimerPerformanceBase))
|
||||
|
||||
// Setup SP810's Timer2 for managing delay functions. And Timer3 for Performance counter
|
||||
// Note: ArmVE's Timer0 and Timer1 are used by TimerDxe.
|
||||
RETURN_STATUS
|
||||
EFIAPI
|
||||
TimerConstructor (
|
||||
VOID
|
||||
)
|
||||
{
|
||||
// Check if the Metronome Timer is already initialized
|
||||
if (MmioRead32(SP804_TIMER_METRONOME_BASE + SP804_TIMER_CONTROL_REG) & SP804_TIMER_CTRL_ENABLE) {
|
||||
return RETURN_SUCCESS;
|
||||
} else {
|
||||
// Configure the Metronome Timer for free running operation, 32 bits, no prescaler, and interrupt disabled
|
||||
MmioWrite32 (SP804_TIMER_METRONOME_BASE + SP804_TIMER_CONTROL_REG, SP804_TIMER_CTRL_32BIT | SP804_PRESCALE_DIV_1);
|
||||
|
||||
// Start the Metronome Timer ticking
|
||||
MmioOr32 (SP804_TIMER_METRONOME_BASE + SP804_TIMER_CONTROL_REG, SP804_TIMER_CTRL_ENABLE);
|
||||
}
|
||||
|
||||
// Check if the Performance Timer is already initialized
|
||||
if (MmioRead32(SP804_TIMER_PERFORMANCE_BASE + SP804_TIMER_CONTROL_REG) & SP804_TIMER_CTRL_ENABLE) {
|
||||
return RETURN_SUCCESS;
|
||||
} else {
|
||||
// Configure the Performance timer for free running operation, 32 bits, no prescaler, interrupt disabled
|
||||
MmioWrite32 (SP804_TIMER_PERFORMANCE_BASE + SP804_TIMER_CONTROL_REG, SP804_TIMER_CTRL_32BIT | SP804_PRESCALE_DIV_1);
|
||||
|
||||
// Start the Performance Timer ticking
|
||||
MmioOr32 (SP804_TIMER_PERFORMANCE_BASE + SP804_TIMER_CONTROL_REG, SP804_TIMER_CTRL_ENABLE);
|
||||
}
|
||||
|
||||
return RETURN_SUCCESS;
|
||||
}
|
||||
|
||||
/**
|
||||
Stalls the CPU for at least the given number of microseconds.
|
||||
|
||||
Stalls the CPU for the number of microseconds specified by MicroSeconds.
|
||||
The hardware timer is 32 bits.
|
||||
The maximum possible delay is (0xFFFFFFFF / TimerFrequencyMHz), i.e. ([32bits] / FreqInMHz)
|
||||
For example:
|
||||
+----------------+------------+----------+----------+
|
||||
| TimerFrequency | MaxDelay | MaxDelay | MaxDelay |
|
||||
| (MHz) | (us) | (s) | (min) |
|
||||
+----------------+------------+----------+----------+
|
||||
| 1 | 0xFFFFFFFF | 4294 | 71.5 |
|
||||
| 5 | 0x33333333 | 859 | 14.3 |
|
||||
| 10 | 0x19999999 | 429 | 7.2 |
|
||||
| 50 | 0x051EB851 | 86 | 1.4 |
|
||||
+----------------+------------+----------+----------+
|
||||
If it becomes necessary to support higher delays, then consider using the
|
||||
real time clock.
|
||||
|
||||
During this delay, the cpu is not yielded to any other process, with one exception:
|
||||
events that are triggered off a timer and which execute at a higher TPL than
|
||||
this function. These events may call MicroSecondDelay (or NanoSecondDelay) to
|
||||
fulfil their own needs.
|
||||
Therefore, this function must be re-entrant, as it may be interrupted and re-started.
|
||||
|
||||
@param MicroSeconds The minimum number of microseconds to delay.
|
||||
|
||||
@return The value of MicroSeconds inputted.
|
||||
|
||||
**/
|
||||
UINTN
|
||||
EFIAPI
|
||||
MicroSecondDelay (
|
||||
IN UINTN MicroSeconds
|
||||
)
|
||||
{
|
||||
UINT64 DelayTicks64; // Convert from microseconds to timer ticks, more bits to detect over-range conditions.
|
||||
UINTN DelayTicks; // Convert from microseconds to timer ticks, native size for general calculations.
|
||||
UINTN StartTicks; // Timer value snapshot at the start of the delay
|
||||
UINTN TargetTicks; // Timer value to signal the end of the delay
|
||||
UINTN CurrentTicks; // Current value of the 64-bit timer value at any given moment
|
||||
|
||||
// If we snapshot the timer at the start of the delay function then we minimise unaccounted overheads.
|
||||
StartTicks = MmioRead32 (SP804_TIMER_METRONOME_BASE + SP804_TIMER_CURRENT_REG);
|
||||
|
||||
// We are operating at the limit of 32bits. For the range checking work in 64 bits to avoid overflows.
|
||||
DelayTicks64 = MultU64x32((UINT64)MicroSeconds, PcdGet32(PcdSP804TimerFrequencyInMHz));
|
||||
|
||||
// We are limited to 32 bits.
|
||||
// If the specified delay is exactly equal to the max range of the timer,
|
||||
// then the start will be equal to the stop plus one timer overflow (wrap-around).
|
||||
// To avoid having to check for that, reduce the maximum acceptable range by 1 tick,
|
||||
// i.e. reject delays equal or greater than the max range of the timer.
|
||||
if (DelayTicks64 >= (UINT64)SP804_MAX_TICKS) {
|
||||
DEBUG((EFI_D_ERROR,"MicroSecondDelay: ERROR: MicroSeconds=%d exceed SP804 count range. Max MicroSeconds=%d\n",
|
||||
MicroSeconds,
|
||||
((UINTN)SP804_MAX_TICKS/PcdGet32(PcdSP804TimerFrequencyInMHz))));
|
||||
}
|
||||
ASSERT(DelayTicks64 < (UINT64)SP804_MAX_TICKS);
|
||||
|
||||
// From now on do calculations only in native bit size.
|
||||
DelayTicks = (UINTN)DelayTicks64;
|
||||
|
||||
// Calculate the target value of the timer.
|
||||
|
||||
//Note: SP804 timer is counting down
|
||||
if (StartTicks >= DelayTicks) {
|
||||
// In this case we do not expect a wrap-around of the timer to occur.
|
||||
// CurrentTicks must be less than StartTicks and higher than TargetTicks.
|
||||
// If this is not the case, then the delay has been reached and may even have been exceeded if this
|
||||
// function was suspended by a higher priority interrupt.
|
||||
|
||||
TargetTicks = StartTicks - DelayTicks;
|
||||
|
||||
do {
|
||||
CurrentTicks = MmioRead32 (SP804_TIMER_METRONOME_BASE + SP804_TIMER_CURRENT_REG);
|
||||
} while ((CurrentTicks > TargetTicks) && (CurrentTicks <= StartTicks));
|
||||
|
||||
} else {
|
||||
// In this case TargetTicks is larger than StartTicks.
|
||||
// This means we expect a wrap-around of the timer to occur and we must wait for it.
|
||||
// Before the wrap-around, CurrentTicks must be less than StartTicks and less than TargetTicks.
|
||||
// After the wrap-around, CurrentTicks must be larger than StartTicks and larger than TargetTicks.
|
||||
// If this is not the case, then the delay has been reached and may even have been exceeded if this
|
||||
// function was suspended by a higher priority interrupt.
|
||||
|
||||
// The order of operations is essential to avoid arithmetic overflow problems
|
||||
TargetTicks = ((UINTN)SP804_MAX_TICKS - DelayTicks) + StartTicks;
|
||||
|
||||
// First wait for the wrap-around to occur
|
||||
do {
|
||||
CurrentTicks = MmioRead32 (SP804_TIMER_METRONOME_BASE + SP804_TIMER_CURRENT_REG);
|
||||
} while (CurrentTicks <= StartTicks);
|
||||
|
||||
// Then wait for the target
|
||||
do {
|
||||
CurrentTicks = MmioRead32 (SP804_TIMER_METRONOME_BASE + SP804_TIMER_CURRENT_REG);
|
||||
} while (CurrentTicks > TargetTicks);
|
||||
}
|
||||
|
||||
return MicroSeconds;
|
||||
}
|
||||
|
||||
/**
|
||||
Stalls the CPU for at least the given number of nanoseconds.
|
||||
|
||||
Stalls the CPU for the number of nanoseconds specified by NanoSeconds.
|
||||
|
||||
When the timer frequency is 1MHz, each tick corresponds to 1 microsecond.
|
||||
Therefore, the nanosecond delay will be rounded up to the nearest 1 microsecond.
|
||||
|
||||
@param NanoSeconds The minimum number of nanoseconds to delay.
|
||||
|
||||
@return The value of NanoSeconds inputted.
|
||||
|
||||
**/
|
||||
UINTN
|
||||
EFIAPI
|
||||
NanoSecondDelay (
|
||||
IN UINTN NanoSeconds
|
||||
)
|
||||
{
|
||||
UINTN MicroSeconds;
|
||||
|
||||
// Round up to 1us Tick Number
|
||||
MicroSeconds = NanoSeconds / 1000;
|
||||
MicroSeconds += ((NanoSeconds % 1000) == 0) ? 0 : 1;
|
||||
|
||||
MicroSecondDelay (MicroSeconds);
|
||||
|
||||
return NanoSeconds;
|
||||
}
|
||||
|
||||
/**
|
||||
Retrieves the current value of a 64-bit free running performance counter.
|
||||
|
||||
The counter can either count up by 1 or count down by 1. If the physical
|
||||
performance counter counts by a larger increment, then the counter values
|
||||
must be translated. The properties of the counter can be retrieved from
|
||||
GetPerformanceCounterProperties().
|
||||
|
||||
@return The current value of the free running performance counter.
|
||||
|
||||
**/
|
||||
UINT64
|
||||
EFIAPI
|
||||
GetPerformanceCounter (
|
||||
VOID
|
||||
)
|
||||
{
|
||||
// Free running 64-bit/32-bit counter is needed here.
|
||||
// Don't think we need this to boot, just to do performance profile
|
||||
UINT64 Value;
|
||||
Value = MmioRead32 (SP804_TIMER_PERFORMANCE_BASE + SP804_TIMER_CURRENT_REG);
|
||||
return Value;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Retrieves the 64-bit frequency in Hz and the range of performance counter
|
||||
values.
|
||||
|
||||
If StartValue is not NULL, then the value that the performance counter starts
|
||||
with immediately after is it rolls over is returned in StartValue. If
|
||||
EndValue is not NULL, then the value that the performance counter end with
|
||||
immediately before it rolls over is returned in EndValue. The 64-bit
|
||||
frequency of the performance counter in Hz is always returned. If StartValue
|
||||
is less than EndValue, then the performance counter counts up. If StartValue
|
||||
is greater than EndValue, then the performance counter counts down. For
|
||||
example, a 64-bit free running counter that counts up would have a StartValue
|
||||
of 0 and an EndValue of 0xFFFFFFFFFFFFFFFF. A 24-bit free running counter
|
||||
that counts down would have a StartValue of 0xFFFFFF and an EndValue of 0.
|
||||
|
||||
@param StartValue The value the performance counter starts with when it
|
||||
rolls over.
|
||||
@param EndValue The value that the performance counter ends with before
|
||||
it rolls over.
|
||||
|
||||
@return The frequency in Hz.
|
||||
|
||||
**/
|
||||
UINT64
|
||||
EFIAPI
|
||||
GetPerformanceCounterProperties (
|
||||
OUT UINT64 *StartValue, OPTIONAL
|
||||
OUT UINT64 *EndValue OPTIONAL
|
||||
)
|
||||
{
|
||||
if (StartValue != NULL) {
|
||||
// Timer starts with the reload value
|
||||
*StartValue = 0xFFFFFFFF;
|
||||
}
|
||||
|
||||
if (EndValue != NULL) {
|
||||
// Timer counts down to 0x0
|
||||
*EndValue = (UINT64)0ULL;
|
||||
}
|
||||
|
||||
return PcdGet64 (PcdEmbeddedPerformanceCounterFrequencyInHz);
|
||||
}
|
||||
/** @file
|
||||
|
||||
Copyright (c) 2008 - 2010, Apple Inc. All rights reserved.<BR>
|
||||
Copyright (c) 2011, ARM Limited. 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 <Base.h>
|
||||
|
||||
#include <Library/BaseLib.h>
|
||||
#include <Library/TimerLib.h>
|
||||
#include <Library/DebugLib.h>
|
||||
#include <Library/PcdLib.h>
|
||||
#include <Library/IoLib.h>
|
||||
#include <Drivers/SP804Timer.h>
|
||||
|
||||
#define SP804_TIMER_METRONOME_BASE ((UINTN)PcdGet32 (PcdSP804TimerMetronomeBase))
|
||||
#define SP804_TIMER_PERFORMANCE_BASE ((UINTN)PcdGet32 (PcdSP804TimerPerformanceBase))
|
||||
|
||||
// Setup SP810's Timer2 for managing delay functions. And Timer3 for Performance counter
|
||||
// Note: ArmVE's Timer0 and Timer1 are used by TimerDxe.
|
||||
RETURN_STATUS
|
||||
EFIAPI
|
||||
TimerConstructor (
|
||||
VOID
|
||||
)
|
||||
{
|
||||
// Check if the Metronome Timer is already initialized
|
||||
if (MmioRead32(SP804_TIMER_METRONOME_BASE + SP804_TIMER_CONTROL_REG) & SP804_TIMER_CTRL_ENABLE) {
|
||||
return RETURN_SUCCESS;
|
||||
} else {
|
||||
// Configure the Metronome Timer for free running operation, 32 bits, no prescaler, and interrupt disabled
|
||||
MmioWrite32 (SP804_TIMER_METRONOME_BASE + SP804_TIMER_CONTROL_REG, SP804_TIMER_CTRL_32BIT | SP804_PRESCALE_DIV_1);
|
||||
|
||||
// Start the Metronome Timer ticking
|
||||
MmioOr32 (SP804_TIMER_METRONOME_BASE + SP804_TIMER_CONTROL_REG, SP804_TIMER_CTRL_ENABLE);
|
||||
}
|
||||
|
||||
// Check if the Performance Timer is already initialized
|
||||
if (MmioRead32(SP804_TIMER_PERFORMANCE_BASE + SP804_TIMER_CONTROL_REG) & SP804_TIMER_CTRL_ENABLE) {
|
||||
return RETURN_SUCCESS;
|
||||
} else {
|
||||
// Configure the Performance timer for free running operation, 32 bits, no prescaler, interrupt disabled
|
||||
MmioWrite32 (SP804_TIMER_PERFORMANCE_BASE + SP804_TIMER_CONTROL_REG, SP804_TIMER_CTRL_32BIT | SP804_PRESCALE_DIV_1);
|
||||
|
||||
// Start the Performance Timer ticking
|
||||
MmioOr32 (SP804_TIMER_PERFORMANCE_BASE + SP804_TIMER_CONTROL_REG, SP804_TIMER_CTRL_ENABLE);
|
||||
}
|
||||
|
||||
return RETURN_SUCCESS;
|
||||
}
|
||||
|
||||
/**
|
||||
Stalls the CPU for at least the given number of microseconds.
|
||||
|
||||
Stalls the CPU for the number of microseconds specified by MicroSeconds.
|
||||
The hardware timer is 32 bits.
|
||||
The maximum possible delay is (0xFFFFFFFF / TimerFrequencyMHz), i.e. ([32bits] / FreqInMHz)
|
||||
For example:
|
||||
+----------------+------------+----------+----------+
|
||||
| TimerFrequency | MaxDelay | MaxDelay | MaxDelay |
|
||||
| (MHz) | (us) | (s) | (min) |
|
||||
+----------------+------------+----------+----------+
|
||||
| 1 | 0xFFFFFFFF | 4294 | 71.5 |
|
||||
| 5 | 0x33333333 | 859 | 14.3 |
|
||||
| 10 | 0x19999999 | 429 | 7.2 |
|
||||
| 50 | 0x051EB851 | 86 | 1.4 |
|
||||
+----------------+------------+----------+----------+
|
||||
If it becomes necessary to support higher delays, then consider using the
|
||||
real time clock.
|
||||
|
||||
During this delay, the cpu is not yielded to any other process, with one exception:
|
||||
events that are triggered off a timer and which execute at a higher TPL than
|
||||
this function. These events may call MicroSecondDelay (or NanoSecondDelay) to
|
||||
fulfil their own needs.
|
||||
Therefore, this function must be re-entrant, as it may be interrupted and re-started.
|
||||
|
||||
@param MicroSeconds The minimum number of microseconds to delay.
|
||||
|
||||
@return The value of MicroSeconds inputted.
|
||||
|
||||
**/
|
||||
UINTN
|
||||
EFIAPI
|
||||
MicroSecondDelay (
|
||||
IN UINTN MicroSeconds
|
||||
)
|
||||
{
|
||||
UINT64 DelayTicks64; // Convert from microseconds to timer ticks, more bits to detect over-range conditions.
|
||||
UINTN DelayTicks; // Convert from microseconds to timer ticks, native size for general calculations.
|
||||
UINTN StartTicks; // Timer value snapshot at the start of the delay
|
||||
UINTN TargetTicks; // Timer value to signal the end of the delay
|
||||
UINTN CurrentTicks; // Current value of the 64-bit timer value at any given moment
|
||||
|
||||
// If we snapshot the timer at the start of the delay function then we minimise unaccounted overheads.
|
||||
StartTicks = MmioRead32 (SP804_TIMER_METRONOME_BASE + SP804_TIMER_CURRENT_REG);
|
||||
|
||||
// We are operating at the limit of 32bits. For the range checking work in 64 bits to avoid overflows.
|
||||
DelayTicks64 = MultU64x32((UINT64)MicroSeconds, PcdGet32(PcdSP804TimerFrequencyInMHz));
|
||||
|
||||
// We are limited to 32 bits.
|
||||
// If the specified delay is exactly equal to the max range of the timer,
|
||||
// then the start will be equal to the stop plus one timer overflow (wrap-around).
|
||||
// To avoid having to check for that, reduce the maximum acceptable range by 1 tick,
|
||||
// i.e. reject delays equal or greater than the max range of the timer.
|
||||
if (DelayTicks64 >= (UINT64)SP804_MAX_TICKS) {
|
||||
DEBUG((EFI_D_ERROR,"MicroSecondDelay: ERROR: MicroSeconds=%d exceed SP804 count range. Max MicroSeconds=%d\n",
|
||||
MicroSeconds,
|
||||
((UINTN)SP804_MAX_TICKS/PcdGet32(PcdSP804TimerFrequencyInMHz))));
|
||||
}
|
||||
ASSERT(DelayTicks64 < (UINT64)SP804_MAX_TICKS);
|
||||
|
||||
// From now on do calculations only in native bit size.
|
||||
DelayTicks = (UINTN)DelayTicks64;
|
||||
|
||||
// Calculate the target value of the timer.
|
||||
|
||||
//Note: SP804 timer is counting down
|
||||
if (StartTicks >= DelayTicks) {
|
||||
// In this case we do not expect a wrap-around of the timer to occur.
|
||||
// CurrentTicks must be less than StartTicks and higher than TargetTicks.
|
||||
// If this is not the case, then the delay has been reached and may even have been exceeded if this
|
||||
// function was suspended by a higher priority interrupt.
|
||||
|
||||
TargetTicks = StartTicks - DelayTicks;
|
||||
|
||||
do {
|
||||
CurrentTicks = MmioRead32 (SP804_TIMER_METRONOME_BASE + SP804_TIMER_CURRENT_REG);
|
||||
} while ((CurrentTicks > TargetTicks) && (CurrentTicks <= StartTicks));
|
||||
|
||||
} else {
|
||||
// In this case TargetTicks is larger than StartTicks.
|
||||
// This means we expect a wrap-around of the timer to occur and we must wait for it.
|
||||
// Before the wrap-around, CurrentTicks must be less than StartTicks and less than TargetTicks.
|
||||
// After the wrap-around, CurrentTicks must be larger than StartTicks and larger than TargetTicks.
|
||||
// If this is not the case, then the delay has been reached and may even have been exceeded if this
|
||||
// function was suspended by a higher priority interrupt.
|
||||
|
||||
// The order of operations is essential to avoid arithmetic overflow problems
|
||||
TargetTicks = ((UINTN)SP804_MAX_TICKS - DelayTicks) + StartTicks;
|
||||
|
||||
// First wait for the wrap-around to occur
|
||||
do {
|
||||
CurrentTicks = MmioRead32 (SP804_TIMER_METRONOME_BASE + SP804_TIMER_CURRENT_REG);
|
||||
} while (CurrentTicks <= StartTicks);
|
||||
|
||||
// Then wait for the target
|
||||
do {
|
||||
CurrentTicks = MmioRead32 (SP804_TIMER_METRONOME_BASE + SP804_TIMER_CURRENT_REG);
|
||||
} while (CurrentTicks > TargetTicks);
|
||||
}
|
||||
|
||||
return MicroSeconds;
|
||||
}
|
||||
|
||||
/**
|
||||
Stalls the CPU for at least the given number of nanoseconds.
|
||||
|
||||
Stalls the CPU for the number of nanoseconds specified by NanoSeconds.
|
||||
|
||||
When the timer frequency is 1MHz, each tick corresponds to 1 microsecond.
|
||||
Therefore, the nanosecond delay will be rounded up to the nearest 1 microsecond.
|
||||
|
||||
@param NanoSeconds The minimum number of nanoseconds to delay.
|
||||
|
||||
@return The value of NanoSeconds inputted.
|
||||
|
||||
**/
|
||||
UINTN
|
||||
EFIAPI
|
||||
NanoSecondDelay (
|
||||
IN UINTN NanoSeconds
|
||||
)
|
||||
{
|
||||
UINTN MicroSeconds;
|
||||
|
||||
// Round up to 1us Tick Number
|
||||
MicroSeconds = NanoSeconds / 1000;
|
||||
MicroSeconds += ((NanoSeconds % 1000) == 0) ? 0 : 1;
|
||||
|
||||
MicroSecondDelay (MicroSeconds);
|
||||
|
||||
return NanoSeconds;
|
||||
}
|
||||
|
||||
/**
|
||||
Retrieves the current value of a 64-bit free running performance counter.
|
||||
|
||||
The counter can either count up by 1 or count down by 1. If the physical
|
||||
performance counter counts by a larger increment, then the counter values
|
||||
must be translated. The properties of the counter can be retrieved from
|
||||
GetPerformanceCounterProperties().
|
||||
|
||||
@return The current value of the free running performance counter.
|
||||
|
||||
**/
|
||||
UINT64
|
||||
EFIAPI
|
||||
GetPerformanceCounter (
|
||||
VOID
|
||||
)
|
||||
{
|
||||
// Free running 64-bit/32-bit counter is needed here.
|
||||
// Don't think we need this to boot, just to do performance profile
|
||||
UINT64 Value;
|
||||
Value = MmioRead32 (SP804_TIMER_PERFORMANCE_BASE + SP804_TIMER_CURRENT_REG);
|
||||
return Value;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Retrieves the 64-bit frequency in Hz and the range of performance counter
|
||||
values.
|
||||
|
||||
If StartValue is not NULL, then the value that the performance counter starts
|
||||
with immediately after is it rolls over is returned in StartValue. If
|
||||
EndValue is not NULL, then the value that the performance counter end with
|
||||
immediately before it rolls over is returned in EndValue. The 64-bit
|
||||
frequency of the performance counter in Hz is always returned. If StartValue
|
||||
is less than EndValue, then the performance counter counts up. If StartValue
|
||||
is greater than EndValue, then the performance counter counts down. For
|
||||
example, a 64-bit free running counter that counts up would have a StartValue
|
||||
of 0 and an EndValue of 0xFFFFFFFFFFFFFFFF. A 24-bit free running counter
|
||||
that counts down would have a StartValue of 0xFFFFFF and an EndValue of 0.
|
||||
|
||||
@param StartValue The value the performance counter starts with when it
|
||||
rolls over.
|
||||
@param EndValue The value that the performance counter ends with before
|
||||
it rolls over.
|
||||
|
||||
@return The frequency in Hz.
|
||||
|
||||
**/
|
||||
UINT64
|
||||
EFIAPI
|
||||
GetPerformanceCounterProperties (
|
||||
OUT UINT64 *StartValue, OPTIONAL
|
||||
OUT UINT64 *EndValue OPTIONAL
|
||||
)
|
||||
{
|
||||
if (StartValue != NULL) {
|
||||
// Timer starts with the reload value
|
||||
*StartValue = 0xFFFFFFFF;
|
||||
}
|
||||
|
||||
if (EndValue != NULL) {
|
||||
// Timer counts down to 0x0
|
||||
*EndValue = (UINT64)0ULL;
|
||||
}
|
||||
|
||||
return PcdGet64 (PcdEmbeddedPerformanceCounterFrequencyInHz);
|
||||
}
|
||||
|
@@ -1,44 +1,44 @@
|
||||
#/** @file
|
||||
# Timer library implementation
|
||||
#
|
||||
#
|
||||
# Copyright (c) 2011, ARM Ltd. All rights reserved.<BR>
|
||||
# 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.
|
||||
#
|
||||
#**/
|
||||
|
||||
[Defines]
|
||||
INF_VERSION = 0x00010005
|
||||
BASE_NAME = SP804TimerLib
|
||||
FILE_GUID = 09cefa99-0d07-487f-a651-fb44f094b1c7
|
||||
MODULE_TYPE = BASE
|
||||
VERSION_STRING = 1.0
|
||||
LIBRARY_CLASS = TimerLib
|
||||
|
||||
CONSTRUCTOR = TimerConstructor
|
||||
|
||||
[Sources.common]
|
||||
SP804TimerLib.c
|
||||
|
||||
[Packages]
|
||||
MdePkg/MdePkg.dec
|
||||
ArmPkg/ArmPkg.dec
|
||||
ArmPlatformPkg/ArmPlatformPkg.dec
|
||||
EmbeddedPkg/EmbeddedPkg.dec
|
||||
|
||||
[LibraryClasses]
|
||||
DebugLib
|
||||
IoLib
|
||||
BaseLib
|
||||
|
||||
[Pcd]
|
||||
gArmPlatformTokenSpaceGuid.PcdSP804TimerFrequencyInMHz
|
||||
gArmPlatformTokenSpaceGuid.PcdSP804TimerPerformanceBase
|
||||
gArmPlatformTokenSpaceGuid.PcdSP804TimerMetronomeBase
|
||||
gEmbeddedTokenSpaceGuid.PcdEmbeddedPerformanceCounterFrequencyInHz
|
||||
#/** @file
|
||||
# Timer library implementation
|
||||
#
|
||||
#
|
||||
# Copyright (c) 2011, ARM Ltd. All rights reserved.<BR>
|
||||
# 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.
|
||||
#
|
||||
#**/
|
||||
|
||||
[Defines]
|
||||
INF_VERSION = 0x00010005
|
||||
BASE_NAME = SP804TimerLib
|
||||
FILE_GUID = 09cefa99-0d07-487f-a651-fb44f094b1c7
|
||||
MODULE_TYPE = BASE
|
||||
VERSION_STRING = 1.0
|
||||
LIBRARY_CLASS = TimerLib
|
||||
|
||||
CONSTRUCTOR = TimerConstructor
|
||||
|
||||
[Sources.common]
|
||||
SP804TimerLib.c
|
||||
|
||||
[Packages]
|
||||
MdePkg/MdePkg.dec
|
||||
ArmPkg/ArmPkg.dec
|
||||
ArmPlatformPkg/ArmPlatformPkg.dec
|
||||
EmbeddedPkg/EmbeddedPkg.dec
|
||||
|
||||
[LibraryClasses]
|
||||
DebugLib
|
||||
IoLib
|
||||
BaseLib
|
||||
|
||||
[Pcd]
|
||||
gArmPlatformTokenSpaceGuid.PcdSP804TimerFrequencyInMHz
|
||||
gArmPlatformTokenSpaceGuid.PcdSP804TimerPerformanceBase
|
||||
gArmPlatformTokenSpaceGuid.PcdSP804TimerMetronomeBase
|
||||
gEmbeddedTokenSpaceGuid.PcdEmbeddedPerformanceCounterFrequencyInHz
|
||||
|
Reference in New Issue
Block a user