xref: /rk3399_ARM-atf/drivers/arm/sbsa/sbsa.c (revision 76fef4757253fd140ca62c8450e4d2921a81a9da)
1f79abf5eSAditya Angadi /*
2*e8166d3eSMadhukar Pappireddy  * Copyright (c) 2019-2023, Arm Limited. All rights reserved.
3f79abf5eSAditya Angadi  *
4f79abf5eSAditya Angadi  * SPDX-License-Identifier: BSD-3-Clause
5f79abf5eSAditya Angadi  */
6f79abf5eSAditya Angadi 
7b382ac68SBence Szépkúti #include <assert.h>
8b382ac68SBence Szépkúti #include <stdint.h>
9f79abf5eSAditya Angadi #include <drivers/arm/sbsa.h>
10f79abf5eSAditya Angadi #include <lib/mmio.h>
11b382ac68SBence Szépkúti #include <plat/common/platform.h>
12f79abf5eSAditya Angadi 
sbsa_watchdog_offset_reg_write(uintptr_t base,uint64_t value)13f79abf5eSAditya Angadi void sbsa_watchdog_offset_reg_write(uintptr_t base, uint64_t value)
14f79abf5eSAditya Angadi {
15f79abf5eSAditya Angadi 	assert((value >> SBSA_WDOG_WOR_WIDTH) == 0);
16f79abf5eSAditya Angadi 	mmio_write_32(base + SBSA_WDOG_WOR_LOW_OFFSET,
17f79abf5eSAditya Angadi 		 ((uint32_t)value & UINT32_MAX));
18f79abf5eSAditya Angadi 	mmio_write_32(base + SBSA_WDOG_WOR_HIGH_OFFSET, (uint32_t)(value >> 32));
19f79abf5eSAditya Angadi }
20f79abf5eSAditya Angadi 
21f79abf5eSAditya Angadi /*
22f79abf5eSAditya Angadi  * Start the watchdog timer at base address "base" for a
23f79abf5eSAditya Angadi  * period of "ms" milliseconds.The watchdog has to be
24f79abf5eSAditya Angadi  * refreshed within this time period.
25f79abf5eSAditya Angadi  */
sbsa_wdog_start(uintptr_t base,uint64_t ms)26f79abf5eSAditya Angadi void sbsa_wdog_start(uintptr_t base, uint64_t ms)
27f79abf5eSAditya Angadi {
28f79abf5eSAditya Angadi 	uint64_t counter_freq;
29f79abf5eSAditya Angadi 	uint64_t offset_reg_value;
30f79abf5eSAditya Angadi 
31f79abf5eSAditya Angadi 	counter_freq = (uint64_t)plat_get_syscnt_freq2();
32f79abf5eSAditya Angadi 	offset_reg_value = ms * counter_freq / 1000;
33f79abf5eSAditya Angadi 
34f79abf5eSAditya Angadi 	sbsa_watchdog_offset_reg_write(base, offset_reg_value);
35f79abf5eSAditya Angadi 	mmio_write_32(base + SBSA_WDOG_WCS_OFFSET, SBSA_WDOG_WCS_EN);
36f79abf5eSAditya Angadi }
37f79abf5eSAditya Angadi 
38f79abf5eSAditya Angadi /* Stop the watchdog */
sbsa_wdog_stop(uintptr_t base)39f79abf5eSAditya Angadi void sbsa_wdog_stop(uintptr_t base)
40f79abf5eSAditya Angadi {
41f79abf5eSAditya Angadi 	mmio_write_32(base + SBSA_WDOG_WCS_OFFSET, (0x0));
42f79abf5eSAditya Angadi }
43*e8166d3eSMadhukar Pappireddy 
44*e8166d3eSMadhukar Pappireddy /* Refresh the secure watchdog timer explicitly */
sbsa_wdog_refresh(uintptr_t refresh_base)45*e8166d3eSMadhukar Pappireddy void sbsa_wdog_refresh(uintptr_t refresh_base)
46*e8166d3eSMadhukar Pappireddy {
47*e8166d3eSMadhukar Pappireddy 	mmio_write_32(refresh_base + SBSA_WDOG_WRR_OFFSET, SBSA_WDOG_WRR_REFRESH);
48*e8166d3eSMadhukar Pappireddy }
49