mirror of
https://github.com/acidanthera/audk.git
synced 2025-07-25 22:54:51 +02:00
ArmPlatformPkg/SP805WatchdogDxe: cosmetic cleanup
Before fixing the SP805 driver, let's clean it up a bit. No functional changes. Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org> Reviewed-by: Leif Lindholm <leif.lindholm@linaro.org>
This commit is contained in:
parent
87b920fe22
commit
e3fa3d83e7
@ -1,6 +1,7 @@
|
|||||||
/** @file
|
/** @file
|
||||||
*
|
*
|
||||||
* Copyright (c) 2011-2013, ARM Limited. All rights reserved.
|
* Copyright (c) 2011-2013, ARM Limited. All rights reserved.
|
||||||
|
* Copyright (c) 2018, Linaro Limited. All rights reserved.
|
||||||
*
|
*
|
||||||
* 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
|
||||||
@ -19,16 +20,13 @@
|
|||||||
#include <Library/BaseMemoryLib.h>
|
#include <Library/BaseMemoryLib.h>
|
||||||
#include <Library/DebugLib.h>
|
#include <Library/DebugLib.h>
|
||||||
#include <Library/IoLib.h>
|
#include <Library/IoLib.h>
|
||||||
#include <Library/PcdLib.h>
|
|
||||||
#include <Library/UefiBootServicesTableLib.h>
|
#include <Library/UefiBootServicesTableLib.h>
|
||||||
#include <Library/UefiRuntimeServicesTableLib.h>
|
|
||||||
#include <Library/UefiLib.h>
|
|
||||||
|
|
||||||
#include <Protocol/WatchdogTimer.h>
|
#include <Protocol/WatchdogTimer.h>
|
||||||
|
|
||||||
#include "SP805Watchdog.h"
|
#include "SP805Watchdog.h"
|
||||||
|
|
||||||
EFI_EVENT EfiExitBootServicesEvent = (EFI_EVENT)NULL;
|
STATIC EFI_EVENT mEfiExitBootServicesEvent;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Make sure the SP805 registers are unlocked for writing.
|
Make sure the SP805 registers are unlocked for writing.
|
||||||
@ -43,8 +41,8 @@ SP805Unlock (
|
|||||||
VOID
|
VOID
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
if( MmioRead32(SP805_WDOG_LOCK_REG) == SP805_WDOG_LOCK_IS_LOCKED ) {
|
if (MmioRead32 (SP805_WDOG_LOCK_REG) == SP805_WDOG_LOCK_IS_LOCKED) {
|
||||||
MmioWrite32(SP805_WDOG_LOCK_REG, SP805_WDOG_SPECIAL_UNLOCK_CODE);
|
MmioWrite32 (SP805_WDOG_LOCK_REG, SP805_WDOG_SPECIAL_UNLOCK_CODE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -61,9 +59,9 @@ SP805Lock (
|
|||||||
VOID
|
VOID
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
if( MmioRead32(SP805_WDOG_LOCK_REG) == SP805_WDOG_LOCK_IS_UNLOCKED ) {
|
if (MmioRead32 (SP805_WDOG_LOCK_REG) == SP805_WDOG_LOCK_IS_UNLOCKED) {
|
||||||
// To lock it, just write in any number (except the special unlock code).
|
// To lock it, just write in any number (except the special unlock code).
|
||||||
MmioWrite32(SP805_WDOG_LOCK_REG, SP805_WDOG_LOCK_IS_LOCKED);
|
MmioWrite32 (SP805_WDOG_LOCK_REG, SP805_WDOG_LOCK_IS_LOCKED);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -77,8 +75,8 @@ SP805Stop (
|
|||||||
)
|
)
|
||||||
{
|
{
|
||||||
// Disable interrupts
|
// Disable interrupts
|
||||||
if ( (MmioRead32(SP805_WDOG_CONTROL_REG) & SP805_WDOG_CTRL_INTEN) != 0 ) {
|
if ((MmioRead32 (SP805_WDOG_CONTROL_REG) & SP805_WDOG_CTRL_INTEN) != 0) {
|
||||||
MmioAnd32(SP805_WDOG_CONTROL_REG, ~SP805_WDOG_CTRL_INTEN);
|
MmioAnd32 (SP805_WDOG_CONTROL_REG, ~SP805_WDOG_CTRL_INTEN);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -94,8 +92,8 @@ SP805Start (
|
|||||||
)
|
)
|
||||||
{
|
{
|
||||||
// Enable interrupts
|
// Enable interrupts
|
||||||
if ( (MmioRead32(SP805_WDOG_CONTROL_REG) & SP805_WDOG_CTRL_INTEN) == 0 ) {
|
if ((MmioRead32 (SP805_WDOG_CONTROL_REG) & SP805_WDOG_CTRL_INTEN) == 0) {
|
||||||
MmioOr32(SP805_WDOG_CONTROL_REG, SP805_WDOG_CTRL_INTEN);
|
MmioOr32 (SP805_WDOG_CONTROL_REG, SP805_WDOG_CTRL_INTEN);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -103,6 +101,7 @@ SP805Start (
|
|||||||
On exiting boot services we must make sure the SP805 Watchdog Timer
|
On exiting boot services we must make sure the SP805 Watchdog Timer
|
||||||
is stopped.
|
is stopped.
|
||||||
**/
|
**/
|
||||||
|
STATIC
|
||||||
VOID
|
VOID
|
||||||
EFIAPI
|
EFIAPI
|
||||||
ExitBootServicesEvent (
|
ExitBootServicesEvent (
|
||||||
@ -110,9 +109,9 @@ ExitBootServicesEvent (
|
|||||||
IN VOID *Context
|
IN VOID *Context
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
SP805Unlock();
|
SP805Unlock ();
|
||||||
SP805Stop();
|
SP805Stop ();
|
||||||
SP805Lock();
|
SP805Lock ();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -142,10 +141,11 @@ ExitBootServicesEvent (
|
|||||||
previously registered.
|
previously registered.
|
||||||
|
|
||||||
**/
|
**/
|
||||||
|
STATIC
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
SP805RegisterHandler (
|
SP805RegisterHandler (
|
||||||
IN CONST EFI_WATCHDOG_TIMER_ARCH_PROTOCOL *This,
|
IN EFI_WATCHDOG_TIMER_ARCH_PROTOCOL *This,
|
||||||
IN EFI_WATCHDOG_TIMER_NOTIFY NotifyFunction
|
IN EFI_WATCHDOG_TIMER_NOTIFY NotifyFunction
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
@ -182,22 +182,24 @@ SP805RegisterHandler (
|
|||||||
@retval EFI_DEVICE_ERROR The timer period could not be changed due to a device error.
|
@retval EFI_DEVICE_ERROR The timer period could not be changed due to a device error.
|
||||||
|
|
||||||
**/
|
**/
|
||||||
|
STATIC
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
SP805SetTimerPeriod (
|
SP805SetTimerPeriod (
|
||||||
IN CONST EFI_WATCHDOG_TIMER_ARCH_PROTOCOL *This,
|
IN EFI_WATCHDOG_TIMER_ARCH_PROTOCOL *This,
|
||||||
IN UINT64 TimerPeriod // In 100ns units
|
IN UINT64 TimerPeriod // In 100ns units
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status = EFI_SUCCESS;
|
EFI_STATUS Status;
|
||||||
UINT64 Ticks64bit;
|
UINT64 Ticks64bit;
|
||||||
|
|
||||||
SP805Unlock();
|
SP805Unlock ();
|
||||||
|
|
||||||
if( TimerPeriod == 0 ) {
|
Status = EFI_SUCCESS;
|
||||||
|
|
||||||
|
if (TimerPeriod == 0) {
|
||||||
// This is a watchdog stop request
|
// This is a watchdog stop request
|
||||||
SP805Stop();
|
SP805Stop ();
|
||||||
goto EXIT;
|
|
||||||
} else {
|
} else {
|
||||||
// Calculate the Watchdog ticks required for a delay of (TimerTicks * 100) nanoseconds
|
// Calculate the Watchdog ticks required for a delay of (TimerTicks * 100) nanoseconds
|
||||||
// The SP805 will count down to ZERO once, generate an interrupt and
|
// The SP805 will count down to ZERO once, generate an interrupt and
|
||||||
@ -211,10 +213,11 @@ SP805SetTimerPeriod (
|
|||||||
//
|
//
|
||||||
// WatchdogTicks = (TimerPeriod * SP805_CLOCK_FREQUENCY) / 20 MHz ;
|
// WatchdogTicks = (TimerPeriod * SP805_CLOCK_FREQUENCY) / 20 MHz ;
|
||||||
|
|
||||||
Ticks64bit = DivU64x32(MultU64x32(TimerPeriod, (UINTN)PcdGet32(PcdSP805WatchdogClockFrequencyInHz)), 20000000);
|
Ticks64bit = MultU64x32 (TimerPeriod, PcdGet32 (PcdSP805WatchdogClockFrequencyInHz));
|
||||||
|
Ticks64bit = DivU64x32 (Ticks64bit, 20000000);
|
||||||
|
|
||||||
// The registers in the SP805 are only 32 bits
|
// The registers in the SP805 are only 32 bits
|
||||||
if(Ticks64bit > (UINT64)0xFFFFFFFF) {
|
if (Ticks64bit > MAX_UINT32) {
|
||||||
// We could load the watchdog with the maximum supported value but
|
// We could load the watchdog with the maximum supported value but
|
||||||
// if a smaller value was requested, this could have the watchdog
|
// if a smaller value was requested, this could have the watchdog
|
||||||
// triggering before it was intended.
|
// triggering before it was intended.
|
||||||
@ -224,15 +227,15 @@ SP805SetTimerPeriod (
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Update the watchdog with a 32-bit value.
|
// Update the watchdog with a 32-bit value.
|
||||||
MmioWrite32(SP805_WDOG_LOAD_REG, (UINT32)Ticks64bit);
|
MmioWrite32 (SP805_WDOG_LOAD_REG, (UINT32)Ticks64bit);
|
||||||
|
|
||||||
// Start the watchdog
|
// Start the watchdog
|
||||||
SP805Start();
|
SP805Start ();
|
||||||
}
|
}
|
||||||
|
|
||||||
EXIT:
|
EXIT:
|
||||||
// Ensure the watchdog is locked before exiting.
|
// Ensure the watchdog is locked before exiting.
|
||||||
SP805Lock();
|
SP805Lock ();
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -251,14 +254,14 @@ SP805SetTimerPeriod (
|
|||||||
@retval EFI_INVALID_PARAMETER TimerPeriod is NULL.
|
@retval EFI_INVALID_PARAMETER TimerPeriod is NULL.
|
||||||
|
|
||||||
**/
|
**/
|
||||||
|
STATIC
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
SP805GetTimerPeriod (
|
SP805GetTimerPeriod (
|
||||||
IN CONST EFI_WATCHDOG_TIMER_ARCH_PROTOCOL *This,
|
IN EFI_WATCHDOG_TIMER_ARCH_PROTOCOL *This,
|
||||||
OUT UINT64 *TimerPeriod
|
OUT UINT64 *TimerPeriod
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status = EFI_SUCCESS;
|
|
||||||
UINT64 ReturnValue;
|
UINT64 ReturnValue;
|
||||||
|
|
||||||
if (TimerPeriod == NULL) {
|
if (TimerPeriod == NULL) {
|
||||||
@ -266,19 +269,19 @@ SP805GetTimerPeriod (
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Check if the watchdog is stopped
|
// Check if the watchdog is stopped
|
||||||
if ( (MmioRead32(SP805_WDOG_CONTROL_REG) & SP805_WDOG_CTRL_INTEN) == 0 ) {
|
if ((MmioRead32 (SP805_WDOG_CONTROL_REG) & SP805_WDOG_CTRL_INTEN) == 0) {
|
||||||
// It is stopped, so return zero.
|
// It is stopped, so return zero.
|
||||||
ReturnValue = 0;
|
ReturnValue = 0;
|
||||||
} else {
|
} else {
|
||||||
// Convert the Watchdog ticks into TimerPeriod
|
// Convert the Watchdog ticks into TimerPeriod
|
||||||
// Ensure 64bit arithmetic throughout because the Watchdog ticks may already
|
// Ensure 64bit arithmetic throughout because the Watchdog ticks may already
|
||||||
// be at the maximum 32 bit value and we still need to multiply that by 600.
|
// be at the maximum 32 bit value and we still need to multiply that by 600.
|
||||||
ReturnValue = MultU64x32( MmioRead32(SP805_WDOG_LOAD_REG), 600 );
|
ReturnValue = MultU64x32 (MmioRead32 (SP805_WDOG_LOAD_REG), 600);
|
||||||
}
|
}
|
||||||
|
|
||||||
*TimerPeriod = ReturnValue;
|
*TimerPeriod = ReturnValue;
|
||||||
|
|
||||||
return Status;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -313,10 +316,10 @@ SP805GetTimerPeriod (
|
|||||||
Retrieves the period of the timer interrupt in 100 nS units.
|
Retrieves the period of the timer interrupt in 100 nS units.
|
||||||
|
|
||||||
**/
|
**/
|
||||||
EFI_WATCHDOG_TIMER_ARCH_PROTOCOL gWatchdogTimer = {
|
STATIC EFI_WATCHDOG_TIMER_ARCH_PROTOCOL mWatchdogTimer = {
|
||||||
(EFI_WATCHDOG_TIMER_REGISTER_HANDLER) SP805RegisterHandler,
|
SP805RegisterHandler,
|
||||||
(EFI_WATCHDOG_TIMER_SET_TIMER_PERIOD) SP805SetTimerPeriod,
|
SP805SetTimerPeriod,
|
||||||
(EFI_WATCHDOG_TIMER_GET_TIMER_PERIOD) SP805GetTimerPeriod
|
SP805GetTimerPeriod
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -347,12 +350,12 @@ SP805Initialize (
|
|||||||
SP805Stop ();
|
SP805Stop ();
|
||||||
|
|
||||||
// Set the watchdog to reset the board when triggered
|
// Set the watchdog to reset the board when triggered
|
||||||
if ((MmioRead32(SP805_WDOG_CONTROL_REG) & SP805_WDOG_CTRL_RESEN) == 0) {
|
if ((MmioRead32 (SP805_WDOG_CONTROL_REG) & SP805_WDOG_CTRL_RESEN) == 0) {
|
||||||
MmioOr32 (SP805_WDOG_CONTROL_REG, SP805_WDOG_CTRL_RESEN);
|
MmioOr32 (SP805_WDOG_CONTROL_REG, SP805_WDOG_CTRL_RESEN);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Prohibit any rogue access to SP805 registers
|
// Prohibit any rogue access to SP805 registers
|
||||||
SP805Lock();
|
SP805Lock ();
|
||||||
|
|
||||||
//
|
//
|
||||||
// Make sure the Watchdog Timer Architectural Protocol has not been installed in the system yet.
|
// Make sure the Watchdog Timer Architectural Protocol has not been installed in the system yet.
|
||||||
@ -361,28 +364,26 @@ SP805Initialize (
|
|||||||
ASSERT_PROTOCOL_ALREADY_INSTALLED (NULL, &gEfiWatchdogTimerArchProtocolGuid);
|
ASSERT_PROTOCOL_ALREADY_INSTALLED (NULL, &gEfiWatchdogTimerArchProtocolGuid);
|
||||||
|
|
||||||
// Register for an ExitBootServicesEvent
|
// Register for an ExitBootServicesEvent
|
||||||
Status = gBS->CreateEvent (EVT_SIGNAL_EXIT_BOOT_SERVICES, TPL_NOTIFY, ExitBootServicesEvent, NULL, &EfiExitBootServicesEvent);
|
Status = gBS->CreateEvent (EVT_SIGNAL_EXIT_BOOT_SERVICES, TPL_NOTIFY,
|
||||||
if (EFI_ERROR(Status)) {
|
ExitBootServicesEvent, NULL, &mEfiExitBootServicesEvent);
|
||||||
|
if (EFI_ERROR (Status)) {
|
||||||
Status = EFI_OUT_OF_RESOURCES;
|
Status = EFI_OUT_OF_RESOURCES;
|
||||||
goto EXIT;
|
goto EXIT;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Install the Timer Architectural Protocol onto a new handle
|
// Install the Timer Architectural Protocol onto a new handle
|
||||||
Handle = NULL;
|
Handle = NULL;
|
||||||
Status = gBS->InstallMultipleProtocolInterfaces(
|
Status = gBS->InstallMultipleProtocolInterfaces (
|
||||||
&Handle,
|
&Handle,
|
||||||
&gEfiWatchdogTimerArchProtocolGuid, &gWatchdogTimer,
|
&gEfiWatchdogTimerArchProtocolGuid, &mWatchdogTimer,
|
||||||
NULL
|
NULL
|
||||||
);
|
);
|
||||||
if (EFI_ERROR(Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
Status = EFI_OUT_OF_RESOURCES;
|
Status = EFI_OUT_OF_RESOURCES;
|
||||||
goto EXIT;
|
goto EXIT;
|
||||||
}
|
}
|
||||||
|
|
||||||
EXIT:
|
EXIT:
|
||||||
if(EFI_ERROR(Status)) {
|
ASSERT_EFI_ERROR (Status);
|
||||||
// The watchdog failed to initialize
|
|
||||||
ASSERT(FALSE);
|
|
||||||
}
|
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
/** @file
|
/** @file
|
||||||
*
|
*
|
||||||
* Copyright (c) 2011-2012, ARM Limited. All rights reserved.
|
* Copyright (c) 2011-2012, ARM Limited. All rights reserved.
|
||||||
|
* Copyright (c) 2018, Linaro Limited. All rights reserved.
|
||||||
*
|
*
|
||||||
* 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
|
||||||
@ -18,35 +19,29 @@
|
|||||||
FILE_GUID = ebd705fb-fa92-46a7-b32b-7f566d944614
|
FILE_GUID = ebd705fb-fa92-46a7-b32b-7f566d944614
|
||||||
MODULE_TYPE = DXE_DRIVER
|
MODULE_TYPE = DXE_DRIVER
|
||||||
VERSION_STRING = 1.0
|
VERSION_STRING = 1.0
|
||||||
|
|
||||||
ENTRY_POINT = SP805Initialize
|
ENTRY_POINT = SP805Initialize
|
||||||
|
|
||||||
[Sources.common]
|
[Sources.common]
|
||||||
SP805Watchdog.c
|
SP805Watchdog.c
|
||||||
|
|
||||||
[Packages]
|
[Packages]
|
||||||
MdePkg/MdePkg.dec
|
|
||||||
EmbeddedPkg/EmbeddedPkg.dec
|
|
||||||
ArmPkg/ArmPkg.dec
|
ArmPkg/ArmPkg.dec
|
||||||
ArmPlatformPkg/ArmPlatformPkg.dec
|
ArmPlatformPkg/ArmPlatformPkg.dec
|
||||||
|
MdePkg/MdePkg.dec
|
||||||
|
|
||||||
[LibraryClasses]
|
[LibraryClasses]
|
||||||
BaseLib
|
BaseLib
|
||||||
BaseMemoryLib
|
|
||||||
DebugLib
|
DebugLib
|
||||||
IoLib
|
IoLib
|
||||||
PcdLib
|
|
||||||
UefiLib
|
|
||||||
UefiBootServicesTableLib
|
UefiBootServicesTableLib
|
||||||
UefiDriverEntryPoint
|
UefiDriverEntryPoint
|
||||||
UefiRuntimeServicesTableLib
|
|
||||||
|
|
||||||
[Pcd]
|
[Pcd]
|
||||||
gArmPlatformTokenSpaceGuid.PcdSP805WatchdogBase
|
gArmPlatformTokenSpaceGuid.PcdSP805WatchdogBase
|
||||||
gArmPlatformTokenSpaceGuid.PcdSP805WatchdogClockFrequencyInHz
|
gArmPlatformTokenSpaceGuid.PcdSP805WatchdogClockFrequencyInHz
|
||||||
|
|
||||||
[Protocols]
|
[Protocols]
|
||||||
gEfiWatchdogTimerArchProtocolGuid
|
gEfiWatchdogTimerArchProtocolGuid ## ALWAYS_PRODUCES
|
||||||
|
|
||||||
[Depex]
|
[Depex]
|
||||||
TRUE
|
TRUE
|
||||||
|
Loading…
x
Reference in New Issue
Block a user