blob: 7a9c625820b1c23751e6e013919188192b1808ed [file] [log] [blame]
/*
* Copyright 2017, Data61
* Commonwealth Scientific and Industrial Research Organisation (CSIRO)
* ABN 41 687 119 230.
*
* This software may be distributed and modified according to the terms of
* the BSD 2-Clause license. Note that NO WARRANTY is provided.
* See "LICENSE_BSD2.txt" for details.
*
* @TAG(DATA61_BSD)
*/
#include <autoconf.h>
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <sel4/sel4.h>
#include <simple-default/simple-default.h>
#include <vspace/page.h>
seL4_Error simple_default_get_irq(void *data, int irq, seL4_CNode root, seL4_Word index, uint8_t depth)
{
return seL4_IRQControl_Get(seL4_CapIRQControl, irq, root, index, depth);
}
seL4_Error simple_default_get_irq_trigger(void *data, int irq, int trigger, UNUSED int core, seL4_CNode root,
seL4_Word index, uint8_t depth)
{
#if CONFIG_MAX_NUM_NODES > 1
return seL4_IRQControl_GetTriggerCore(seL4_CapIRQControl, irq, trigger, root, index, depth, core);
#else
return seL4_IRQControl_GetTrigger(seL4_CapIRQControl, irq, trigger, root, index, depth);
#endif
}
#ifdef CONFIG_TK1_SMMU
seL4_Error simple_default_get_iospace_cap_count(void *data, int *count)
{
seL4_BootInfo *bi = data;
seL4_SlotRegion reg;
if (!bi) {
ZF_LOGE("BootInfo pointer is NULL");
*count = 0;
return seL4_InvalidArgument;
}
reg = bi->ioSpaceCaps;
if (reg.end <= reg.start) {
ZF_LOGE("BootInfo for iospace caps is incorrect");
*count = 0;
return seL4_InvalidArgument;
}
*count = reg.end - reg.start;
return seL4_NoError;
}
seL4_CPtr simple_default_get_iospace_nth_cap(void *data, int n)
{
seL4_BootInfo *bi = data;
seL4_SlotRegion reg;
seL4_CPtr cap;
if (!bi) {
ZF_LOGE("BootInfo pointer is NULL");
return seL4_CapNull;
}
reg = bi->ioSpaceCaps;
if (reg.end <= reg.start) {
ZF_LOGE("BootInfo for iospace caps is incorrect");
return seL4_CapNull;
}
cap = reg.start;
cap += n;
if (cap >= reg.end || cap < reg.start) {
ZF_LOGE("Invalid IOSpace cap");
return seL4_CapNull;
}
return cap;
}
#endif
void simple_default_init_arch_simple(arch_simple_t *simple, void *data)
{
simple->data = data;
simple->irq = simple_default_get_irq;
simple->irq_trigger = simple_default_get_irq_trigger;
#ifdef CONFIG_TK1_SMMU
simple->iospace_cap_count = simple_default_get_iospace_cap_count;
simple->iospace_get_nth_cap = simple_default_get_iospace_nth_cap;
#endif
}