#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>
#include <plat/machine/hardware_gen.h>
#include <arch/benchmark_overflowHandler.h>
#define L2_LINE_SIZE_BITS 5
#define L2_LINE_SIZE BIT(L2_LINE_SIZE_BITS)
#define L2_LINE_START(a) ROUND_DOWN(a, L2_LINE_SIZE_BITS)
#define L2_LINE_INDEX(a) (L2_LINE_START(a)>>L2_LINE_SIZE_BITS)
volatile struct epit_map {
uint32_t epitcr;
uint32_t epitsr;
uint32_t epitlr;
uint32_t epitcmpr;
uint32_t epitcnt;
} *epit1 = (volatile void *)EPIT_PPTR;
enum IPGConstants {
IPG_CLK = 1,
IPG_CLK_HIGHFREQ = 2,
IPG_CLK_32K = 3
};
#define TIMER_INTERVAL_MS (CONFIG_TIMER_TICK_MS)
#define TIMER_CLOCK_SRC IPG_CLK_32K
#define TIMER_CLOCK_HZ 32768
#define TIMER_RELOAD_VAL (TIMER_CLOCK_HZ * TIMER_INTERVAL_MS / 1000)
#if TIMER_RELOAD_VAL <= 0 || TIMER_RELOAD_VAL > 0xffffffff
#error TIMER_RELOAD_VAL out of range
#endif
interrupt_t active_irq = irqInvalid;
void
resetTimer(void)
{
epit1->epitsr = 1;
}
BOOT_CODE void
initTimer(void)
{
epitcr_t epitcr_kludge;
epit1->epitcr = 0;
epitcr_kludge.words[0] = 0;
epitcr_kludge = epitcr_set_clksrc(epitcr_kludge, TIMER_CLOCK_SRC);
epitcr_kludge = epitcr_set_iovw(epitcr_kludge, 1);
epitcr_kludge = epitcr_set_rld(epitcr_kludge, 1);
epitcr_kludge = epitcr_set_ocien(epitcr_kludge, 1);
epitcr_kludge = epitcr_set_enmod(epitcr_kludge, 1);
epit1->epitcr = epitcr_kludge.words[0];
epit1->epitlr = TIMER_RELOAD_VAL;
epit1->epitcmpr = 0;
epit1->epitsr = 1;
epitcr_kludge = epitcr_set_en(epitcr_kludge, 1);
epit1->epitcr = epitcr_kludge.words[0];
}
static void cleanL2(void)
{
imx31_l2cc_flush_regs->clean_by_way = 0xff;
while (imx31_l2cc_flush_regs->clean_by_way);
}
static void invalidateL2(void)
{
imx31_l2cc_flush_regs->inv_by_way = 0xff;
while (imx31_l2cc_flush_regs->inv_by_way);
}
static void finaliseL2Op(void)
{
imx31_l2cc_flush_regs->sync = 1;
}
void plat_cleanL2Range(paddr_t start, paddr_t end)
{
paddr_t line;
word_t index;
for (index = L2_LINE_INDEX(start);
index < L2_LINE_INDEX(end) + 1;
index++) {
line = index << L2_LINE_SIZE_BITS;
imx31_l2cc_flush_regs->clean_by_pa = line;
}
finaliseL2Op();
}
void plat_invalidateL2Range(paddr_t start, paddr_t end)
{
paddr_t line;
word_t index;
for (index = L2_LINE_INDEX(start);
index < L2_LINE_INDEX(end) + 1;
index++) {
line = index << L2_LINE_SIZE_BITS;
imx31_l2cc_flush_regs->inv_by_pa = line;
}
finaliseL2Op();
}
void plat_cleanInvalidateL2Range(paddr_t start, paddr_t end)
{
paddr_t line;
word_t index;
for (index = L2_LINE_INDEX(start);
index < L2_LINE_INDEX(end) + 1;
index++) {
line = index << L2_LINE_SIZE_BITS;
imx31_l2cc_flush_regs->clinv_by_pa = line;
}
finaliseL2Op();
}
void plat_cleanInvalidateCache(void)
{
cleanL2();
invalidateL2();
}
BOOT_CODE void
initL2Cache(void)
{
#ifndef CONFIG_DEBUG_DISABLE_L2_CACHE
imx31_l2cc_ctrl_regs->aux_control = 0x0003001b;
invalidateL2();
imx31_l2cc_ctrl_regs->control = 1;
#endif
}
BOOT_CODE void
initIRQController(void)
{
}
BOOT_CODE void cpu_initLocalIRQController(void)
{
}