#include <config.h>
#include <types.h>
#include <machine/io.h>
#include <kernel/vspace.h>
#include <arch/machine.h>
#include <arch/kernel/vspace.h>
#include <plat/machine.h>
#include <arch/linker.h>
#include <plat/machine/devices.h>
#include <plat/machine/hardware.h>
#define INTCPS_SYSCONFIG_SOFTRESET BIT(1)
#define INTCPS_SYSSTATUS_RESETDONE BIT(0)
#define TIMER_INTERVAL_MS (CONFIG_TIMER_TICK_MS)
#define TIOCP_CFG_SOFTRESET BIT(1)
#define TCLR_AUTORELOAD BIT(1)
#define TCLR_COMPAREENABLE BIT(6)
#define TCLR_STARTTIMER BIT(0)
#define TIER_MATCHENABLE BIT(0)
#define TIER_OVERFLOWENABLE BIT(1)
#define TISR_OVF_FLAG BIT(1)
#define TICKS_PER_SECOND 13000000llu
#define TIMER_INTERVAL_TICKS ((int)(1UL * TIMER_INTERVAL_MS * TICKS_PER_SECOND / 1000))
static volatile struct TIMER_map {
uint32_t tidr;
uint32_t padding1[3];
uint32_t cfg;
uint32_t tistat;
uint32_t tisr;
uint32_t tier;
uint32_t twer;
uint32_t tclr;
uint32_t tcrr;
uint32_t tldr;
uint32_t ttgr;
uint32_t twps;
uint32_t tmar;
uint32_t tcar1;
uint32_t tsicr;
uint32_t tcar2;
uint32_t tpir;
uint32_t tnir;
uint32_t tcvr;
uint32_t tocr;
uint32_t towr;
} *timer = (volatile void*)GPTIMER9_PPTR;
void
resetTimer(void)
{
timer->tisr = TISR_OVF_FLAG;
ackInterrupt(GPT9_IRQ);
}
BOOT_CODE void
initTimer(void)
{
timer->cfg = TIOCP_CFG_SOFTRESET;
while (!timer->tistat);
maskInterrupt( true, GPT9_IRQ);
timer->tldr = 0xFFFFFFFFUL - TIMER_INTERVAL_TICKS;
timer->tier = TIER_OVERFLOWENABLE;
timer->tcrr = 0xFFFFFFFFUL - TIMER_INTERVAL_TICKS;
timer->tclr = TCLR_AUTORELOAD | TCLR_STARTTIMER;
}
BOOT_CODE void
initIRQController(void)
{
intc->intcps_sysconfig = INTCPS_SYSCONFIG_SOFTRESET;
while (!(intc->intcps_sysstatus & INTCPS_SYSSTATUS_RESETDONE)) ;
}
BOOT_CODE void cpu_initLocalIRQController(void) {}
void plat_cleanL2Range(paddr_t start, paddr_t end) {}
void plat_invalidateL2Range(paddr_t start, paddr_t end) {}
void plat_cleanInvalidateL2Range(paddr_t start, paddr_t end) {}
void plat_cleanInvalidateCache(void) {}