drivers/sbsa: add sbsa watchdog driver

Add a driver for configuring the SBSA Generic Watchdog which aids in
the detection of errant system behaviour.

Change-Id: I5a1e7149c69fd8b85be7dfbcf511f431339946f4
Signed-off-by: Aditya Angadi <aditya.angadi@arm.com>
This commit is contained in:
Aditya Angadi 2019-04-16 11:30:25 +05:30
parent 5d149bdb18
commit f79abf5e98
2 changed files with 66 additions and 0 deletions

42
drivers/arm/sbsa/sbsa.c Normal file
View File

@ -0,0 +1,42 @@
/*
* Copyright (c) 2019, ARM Limited. All rights reserved.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
#include <plat/common/platform.h>
#include <drivers/arm/sbsa.h>
#include <lib/mmio.h>
#include <stdint_.h>
#include <assert.h>
void sbsa_watchdog_offset_reg_write(uintptr_t base, uint64_t value)
{
assert((value >> SBSA_WDOG_WOR_WIDTH) == 0);
mmio_write_32(base + SBSA_WDOG_WOR_LOW_OFFSET,
((uint32_t)value & UINT32_MAX));
mmio_write_32(base + SBSA_WDOG_WOR_HIGH_OFFSET, (uint32_t)(value >> 32));
}
/*
* Start the watchdog timer at base address "base" for a
* period of "ms" milliseconds.The watchdog has to be
* refreshed within this time period.
*/
void sbsa_wdog_start(uintptr_t base, uint64_t ms)
{
uint64_t counter_freq;
uint64_t offset_reg_value;
counter_freq = (uint64_t)plat_get_syscnt_freq2();
offset_reg_value = ms * counter_freq / 1000;
sbsa_watchdog_offset_reg_write(base, offset_reg_value);
mmio_write_32(base + SBSA_WDOG_WCS_OFFSET, SBSA_WDOG_WCS_EN);
}
/* Stop the watchdog */
void sbsa_wdog_stop(uintptr_t base)
{
mmio_write_32(base + SBSA_WDOG_WCS_OFFSET, (0x0));
}

View File

@ -0,0 +1,24 @@
/*
* Copyright (c) 2019, ARM Limited. All rights reserved.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
#ifndef SBSA_H
#define SBSA_H
#include <stdint.h>
/* Register Offsets */
#define SBSA_WDOG_WCS_OFFSET UL(0x000)
#define SBSA_WDOG_WOR_LOW_OFFSET UL(0x008)
#define SBSA_WDOG_WOR_HIGH_OFFSET UL(0x00C)
#define SBSA_WDOG_WCS_EN U(0x1)
#define SBSA_WDOG_WOR_WIDTH UL(48)
void sbsa_wdog_start(uintptr_t base, uint64_t ms);
void sbsa_wdog_stop(uintptr_t base);
#endif /* SBSA_H */