/*
 * Copyright 2017, Data61, CSIRO (ABN 41 687 119 230)
 *
 * SPDX-License-Identifier: BSD-2-Clause
 */

#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
}
