blob: b357972e418623302b01efd4c0a6073a66bdf24a [file] [log] [blame]
/*
* Copyright (c) 2016, ARM Limited and Contributors. All rights reserved.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
#include <arch_helpers.h>
#include <debug.h>
#include <mmio.h>
#include <mt_cpuxgpt.h>
#include <platform.h>
#include <stdint.h>
#define CPUXGPT_BASE 0x10200000
#define INDEX_BASE (CPUXGPT_BASE+0x0674)
#define CTL_BASE (CPUXGPT_BASE+0x0670)
uint64_t normal_time_base;
uint64_t atf_time_base;
void sched_clock_init(uint64_t normal_base, uint64_t atf_base)
{
normal_time_base = normal_base;
atf_time_base = atf_base;
}
uint64_t sched_clock(void)
{
uint64_t cval;
cval = (((read_cntpct_el0() - atf_time_base)*1000)/
SYS_COUNTER_FREQ_IN_MHZ) + normal_time_base;
return cval;
}
/*
* Return: 0 - Trying to disable the CPUXGPT control bit,
* and not allowed to disable it.
* Return: 1 - reg_addr is not realted to disable the control bit.
*/
unsigned char check_cpuxgpt_write_permission(unsigned int reg_addr,
unsigned int reg_value)
{
unsigned int idx;
unsigned int ctl_val;
if (reg_addr == CTL_BASE) {
idx = mmio_read_32(INDEX_BASE);
/* idx 0: CPUXGPT system control */
if (idx == 0) {
ctl_val = mmio_read_32(CTL_BASE);
if (ctl_val & 1) {
/*
* if enable bit already set,
* then bit 0 is not allow to set as 0
*/
if (!(reg_value & 1))
return 0;
}
}
}
return 1;
}