mirror of
https://github.com/acidanthera/audk.git
synced 2025-07-26 07:04:28 +02:00
ArmPlatformPkg/SP804Timer: Introduce gArmPlatformTokenSpaceGuid.PcdSP804FrequencyInMHz
This PCD defines the speed of the SP804 timer. The default value is 1MHz. git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@11745 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
parent
23792dea0c
commit
ce9cc403bd
@ -61,3 +61,8 @@
|
|||||||
|
|
||||||
# Size of the region reserved for fixed address allocations (Reserved 128MB by default)
|
# Size of the region reserved for fixed address allocations (Reserved 128MB by default)
|
||||||
gArmPlatformTokenSpaceGuid.PcdSystemMemoryFixRegionSize|0x08000000|UINT32|0x00000014
|
gArmPlatformTokenSpaceGuid.PcdSystemMemoryFixRegionSize|0x08000000|UINT32|0x00000014
|
||||||
|
#
|
||||||
|
# ARM Primecells
|
||||||
|
#
|
||||||
|
gArmPlatformTokenSpaceGuid.PcdSP804FrequencyInMHz|1|UINT32|0x0000001D
|
||||||
|
|
||||||
|
@ -218,6 +218,7 @@ TimerDriverSetTimerPeriod (
|
|||||||
} else {
|
} else {
|
||||||
// Convert TimerPeriod into 1MHz clock counts (us units = 100ns units / 10)
|
// Convert TimerPeriod into 1MHz clock counts (us units = 100ns units / 10)
|
||||||
TimerTicks = DivU64x32 (TimerPeriod, 10);
|
TimerTicks = DivU64x32 (TimerPeriod, 10);
|
||||||
|
TimerTicks = MultU64x32 (TimerTicks, PcdGet32(PcdSP804FrequencyInMHz));
|
||||||
|
|
||||||
// if it's larger than 32-bits, pin to highest value
|
// if it's larger than 32-bits, pin to highest value
|
||||||
if (TimerTicks > 0xffffffff) {
|
if (TimerTicks > 0xffffffff) {
|
||||||
|
@ -48,6 +48,7 @@
|
|||||||
gHardwareInterruptProtocolGuid
|
gHardwareInterruptProtocolGuid
|
||||||
|
|
||||||
[Pcd.common]
|
[Pcd.common]
|
||||||
|
gArmPlatformTokenSpaceGuid.PcdSP804FrequencyInMHz
|
||||||
gEmbeddedTokenSpaceGuid.PcdTimerPeriod
|
gEmbeddedTokenSpaceGuid.PcdTimerPeriod
|
||||||
|
|
||||||
[Depex]
|
[Depex]
|
||||||
|
@ -74,11 +74,16 @@ MicroSecondDelay (
|
|||||||
IN UINTN MicroSeconds
|
IN UINTN MicroSeconds
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
// load the timer count register
|
UINTN Index;
|
||||||
MmioWrite32 (SP804_TIMER2_BASE + SP804_TIMER_LOAD_REG, MicroSeconds);
|
|
||||||
|
|
||||||
while (MmioRead32 (SP804_TIMER2_BASE + SP804_TIMER_CURRENT_REG) > 0) {
|
// Reload the counter for each 1Mhz to avoid an overflow in the load value
|
||||||
;
|
for (Index = 0; Index < (UINTN)PcdGet32(PcdSP804FrequencyInMHz); Index++) {
|
||||||
|
// load the timer count register
|
||||||
|
MmioWrite32 (SP804_TIMER2_BASE + SP804_TIMER_LOAD_REG, MicroSeconds);
|
||||||
|
|
||||||
|
while (MmioRead32 (SP804_TIMER2_BASE + SP804_TIMER_CURRENT_REG) > 0) {
|
||||||
|
;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return MicroSeconds;
|
return MicroSeconds;
|
||||||
@ -100,17 +105,21 @@ NanoSecondDelay (
|
|||||||
IN UINTN NanoSeconds
|
IN UINTN NanoSeconds
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
UINT32 MicroSeconds;
|
UINTN Index;
|
||||||
|
UINT32 MicroSeconds;
|
||||||
|
|
||||||
// Round up to 1us Tick Number
|
// Round up to 1us Tick Number
|
||||||
MicroSeconds = (UINT32)NanoSeconds / 1000;
|
MicroSeconds = (UINT32)NanoSeconds / 1000;
|
||||||
MicroSeconds += ((UINT32)NanoSeconds % 1000) == 0 ? 0 : 1;
|
MicroSeconds += ((UINT32)NanoSeconds % 1000) == 0 ? 0 : 1;
|
||||||
|
|
||||||
// load the timer count register
|
// Reload the counter for each 1Mhz to avoid an overflow in the load value
|
||||||
MmioWrite32 (SP804_TIMER2_BASE + SP804_TIMER_LOAD_REG, MicroSeconds);
|
for (Index = 0; Index < (UINTN)PcdGet32(PcdSP804FrequencyInMHz); Index++) {
|
||||||
|
// load the timer count register
|
||||||
|
MmioWrite32 (SP804_TIMER2_BASE + SP804_TIMER_LOAD_REG, MicroSeconds);
|
||||||
|
|
||||||
while (MmioRead32 (SP804_TIMER2_BASE + SP804_TIMER_CURRENT_REG) > 0) {
|
while (MmioRead32 (SP804_TIMER2_BASE + SP804_TIMER_CURRENT_REG) > 0) {
|
||||||
;
|
;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return NanoSeconds;
|
return NanoSeconds;
|
||||||
@ -182,5 +191,5 @@ GetPerformanceCounterProperties (
|
|||||||
*EndValue = 0xFFFFFFFF;
|
*EndValue = 0xFFFFFFFF;
|
||||||
}
|
}
|
||||||
|
|
||||||
return 1000000;
|
return PcdGet64 (PcdEmbeddedPerformanceCounterFrequencyInHz);
|
||||||
}
|
}
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
# Timer library implementation
|
# Timer library implementation
|
||||||
#
|
#
|
||||||
#
|
#
|
||||||
# Copyright (c) 2010, ARM Ltd. All rights reserved.<BR>
|
# Copyright (c) 2011, ARM Ltd. All rights reserved.<BR>
|
||||||
# This program and the accompanying materials
|
# This program and the accompanying materials
|
||||||
# are licensed and made available under the terms and conditions of the BSD License
|
# 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
|
# which accompanies this distribution. The full text of the license may be found at
|
||||||
@ -30,8 +30,13 @@
|
|||||||
MdePkg/MdePkg.dec
|
MdePkg/MdePkg.dec
|
||||||
ArmPkg/ArmPkg.dec
|
ArmPkg/ArmPkg.dec
|
||||||
ArmPlatformPkg/ArmPlatformPkg.dec
|
ArmPlatformPkg/ArmPlatformPkg.dec
|
||||||
|
EmbeddedPkg/EmbeddedPkg.dec
|
||||||
|
|
||||||
[LibraryClasses]
|
[LibraryClasses]
|
||||||
DebugLib
|
DebugLib
|
||||||
IoLib
|
IoLib
|
||||||
BaseLib
|
BaseLib
|
||||||
|
|
||||||
|
[Pcd]
|
||||||
|
gArmPlatformTokenSpaceGuid.PcdSP804FrequencyInMHz
|
||||||
|
gEmbeddedTokenSpaceGuid.PcdEmbeddedPerformanceCounterFrequencyInHz
|
||||||
|
Loading…
x
Reference in New Issue
Block a user