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:
oliviermartin 2011-06-03 09:33:35 +00:00
parent 23792dea0c
commit ce9cc403bd
5 changed files with 32 additions and 11 deletions

View File

@ -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

View File

@ -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) {

View File

@ -48,6 +48,7 @@
gHardwareInterruptProtocolGuid gHardwareInterruptProtocolGuid
[Pcd.common] [Pcd.common]
gArmPlatformTokenSpaceGuid.PcdSP804FrequencyInMHz
gEmbeddedTokenSpaceGuid.PcdTimerPeriod gEmbeddedTokenSpaceGuid.PcdTimerPeriod
[Depex] [Depex]

View File

@ -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);
} }

View File

@ -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