/*
 * 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 <assert.h>
#include <sel4platsupport/device.h>
#include <sel4platsupport/platsupport.h>
#include <vka/capops.h>
#include <utils/util.h>

seL4_Error
sel4platsupport_copy_irq_cap(vka_t *vka, simple_t *simple, seL4_Word irq_number, cspacepath_t *dest)
{
    seL4_CPtr irq;

    /* allocate a cslot for the irq cap */
    int error = vka_cspace_alloc(vka, &irq);
    if (error != 0) {
        ZF_LOGE("Failed to allocate cslot for irq\n");
        return error;
    }

    vka_cspace_make_path(vka, irq, dest);

    error = simple_get_IRQ_control(simple, irq_number, *dest);
    if  (error != seL4_NoError) {
        ZF_LOGE("Failed to get cap to irq_number %u\n", irq_number);
        vka_cspace_free(vka, irq);
        return error;
    }

    return seL4_NoError;
}
 
seL4_Error
sel4platsupport_copy_frame_cap(vka_t *vka, simple_t *simple, void *paddr, size_t size_bits, cspacepath_t *dest)
{
    /* allocate a cslot for the frame */
    seL4_CPtr frame_cap;
    int error = vka_cspace_alloc(vka, &frame_cap);
    if (error) {
        ZF_LOGE("Failed to allocate cslot for frame cap\n");
        return error;
    }

    /* find the physical frame */
    vka_cspace_make_path(vka, frame_cap, dest);
    error = simple_get_frame_cap(simple, paddr, size_bits, dest);
    if (error) {
        ZF_LOGE("Failed to find frame at paddr %p\n", paddr);
        return error;
    }

    return error;
}

