/*
 * Copyright 2014, NICTA
 *
 * 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(NICTA_BSD)
 */

#include <autoconf.h>

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>

#include <sel4/sel4.h>

#include <simple-default/simple-default.h>
#include <utils/util.h>
#include <vspace/page.h>

seL4_Error
simple_default_get_ioapic(void *data, seL4_CNode root, seL4_Word index, uint8_t depth, 
                          seL4_Word ioapic, seL4_Word pin, seL4_Word level, seL4_Word polarity,
                          seL4_Word vector)
{
    return seL4_IRQControl_GetIOAPIC(seL4_CapIRQControl, root, index, depth, ioapic, pin, level,
                                     polarity, vector);
}

seL4_Error 
simple_default_get_irq(void *data, int irq, seL4_CNode root, seL4_Word index, uint8_t depth) {

    if (config_set(CONFIG_IRQ_IOAPIC)) {
        /* we need to try and guess how to map a requested IRQ to an IOAPIC
         * pin, as well as what the edge and polarity detection mode is.
         * Without any way to inspect the ACPI tables here we make the following
         * assumptions
         *   + There is an override for ISA-IRQ-0 -> GSI 2
         *   + Only one IOAPIC and error on IRQs >= 24
         *   + IRQs below 16 are ISA and edge detected polarity high
         *   + IRQs 16 and above are PCI and level detected polarity low
         */
        int vector = irq;
        if (irq == 0) {
            irq = 2;
        }
        int level;
        int low_polarity;
        if (irq >= 16) {
            level = 1;
            low_polarity = 1;
        } else {
            level = 0;
            low_polarity = 0;
        }
        return simple_default_get_ioapic(data, root, index, depth, 0, irq, level, low_polarity, vector);
    } else {
        return seL4_IRQControl_Get(seL4_CapIRQControl, irq, root, index, depth);
    }
}

seL4_Error
simple_default_get_msi(void *data, seL4_CNode root, seL4_Word index, uint8_t depth, 
                       seL4_Word pci_bus, seL4_Word pci_dev, seL4_Word pci_func, seL4_Word handle,
                       seL4_Word vector) 
{
    return seL4_IRQControl_GetMSI(seL4_CapIRQControl, root, index, depth, pci_bus, pci_dev,
                                  pci_func, handle, vector);
}

seL4_CPtr 
simple_default_get_IOPort_cap(void *data, uint16_t start_port, uint16_t end_port) {
    return seL4_CapIOPort;
}

void
simple_default_init_arch_simple(arch_simple_t *simple, void *data) 
{
    simple->data = data;
    simple->msi = simple_default_get_msi;
    simple->irq = simple_default_get_irq;
    simple->ioapic = simple_default_get_ioapic;
    simple->IOPort_cap = simple_default_get_IOPort_cap;
}

