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

/*# NB: only simple & arm types are "tested" #*/

/*- macro check_setting(v, attr, expect) -*/
    /*- if v is none -*/
        /*? raise(TemplateError('Setting %s.%s is not defined; expecting %s' % (from_instance.name, attr, expect))) ?*/
    /*- endif -*/
    /*- if not isinstance(v, numbers.Integral) -*/
        /*? raise(TemplateError('Setting %s.%s is not an integer; expecting %s' % (from_instance.name, attr, expect))) ?*/
    /*- endif -*/
/*- endmacro -*/

/*- macro register_irq(configuration, from_end, irq_prefix, ntfn) -*/
    /*- set from_instance = from_end.instance -*/
    /*- set from_interface = from_end.interface -*/

    /*- set type_attr = '%s_irq_type' % from_interface.name -*/
    /*- set type = configuration[from_instance.name].get(type_attr, 'simple') -*/
    /*- if type == 'simple' -*/
        /*- set attr = '%s_irq_number' % from_interface.name -*/
        /*- set _irq = configuration[from_instance.name].get(attr) -*/
        /*- do check_setting(_irq, attr, 'IRQ number') -*/

        /*- set spi_attr = '%s_spi_number' % from_interface.name -*/
        /*- set _irq_spi = configuration[from_instance.name].get(spi_attr) -*/
        /*- if (isinstance(_irq_spi, numbers.Integral)) and (_irq_spi == 0) -*/
            /*- set _irq = _irq + 32 -*/
        /*- endif -*/

        /*- set irq = alloc(irq_prefix.lower(), seL4_IRQHandler, number=_irq, notification=ntfn) -*/
const /*? irq_prefix ?*/_NUMBER: usize = /*? _irq ?*/;
const /*? irq_prefix ?*/_HANDLER: sel4_sys::seL4_CPtr = /*? irq ?*/;
    /*- elif type in ['arm'] -*/
        /*- set attr = '%s_irq_trigger' % from_interface.name -*/
        /*- set trigger = configuration[from_instance.name].get(attr, "level") -*/
        /*- if trigger == "level" -*/
            /*- set trigger = seL4_ARM_IRQ_LEVEL -*/
            /*- set sel4_trigger_param = 0 -*/
        /*- elif trigger == "edge" -*/
            /*- set trigger = seL4_ARM_IRQ_EDGE -*/
            /*- set sel4_trigger_param = 1 -*/
        /*- else -*/
            /*? raise(TemplateError('Setting %s.%s that should specify an IRQ trigger mode can only be "edge" or "level" but is set to: %s' % (from_instance.name, attr, trigger))) ?*/
        /*- endif -*/

        /*- set attr = '%s_irq_number' % from_interface.name -*/
        /*- set _irq = configuration[from_instance.name].get(attr) -*/
        /*- do check_setting(_irq, attr, 'IRQ number') -*/

        /*- set attr = '%s_irq_target' % from_interface.name -*/
        /*- set target = configuration[from_instance.name].get(attr, 0) -*/
        /*- do check_setting(target, attr, 'target core') -*/

        /*- set irq = alloc(irq_prefix.lower(), seL4_IRQHandler, number=_irq, trigger=trigger, target=target, notification=ntfn) -*/
const /*? irq_prefix ?*/_TRIGGER: usize = /*? trigger ?*/;
const /*? irq_prefix ?*/_CPU_IDX: usize = /*? cpu_idx ?*/;
const /*? irq_prefix ?*/_NUMBER: usize = /*? _irq ?*/;
const /*? irq_prefix ?*/_HANDLER: sel4_sys::seL4_CPtr = /*? irq ?*/;
    /*- elif type in ['ioapic','isa','pci'] -*/
        /*- if type == 'isa' -*/
            /*- set level = 0 -*/
            /*- set polarity = 0 -*/
        /*- elif type == 'pci' -*/
            /*- set level = 1 -*/
            /*- set polarity = 1 -*/
        /*- else -*/
            /*- set attr = '%s_irq_level' % from_interface.name -*/
            /*- set level = configuration[from_instance.name].get(attr) -*/
            /*- do check_setting(level, attr, 'IOAPIC interrupt level') -*/

            /*- set attr = '%s_irq_polarity' % from_interface.name -*/
            /*- set polarity = configuration[from_instance.name].get(attr) -*/
            /*- do check_setting(polarity, attr, 'IOAPIC interrupt polarity') -*/
        /*- endif -*/

        /*- set attr = '%s_irq_ioapic' % from_interface.name -*/
        /*- set ioapic = configuration[from_instance.name].get(attr) -*/
        /*- do check_setting(ioapic, attr, 'IOAPIC controller number') -*/

        /*- set attr = '%s_irq_ioapic_pin' % from_interface.name -*/
        /*- set ioapic_pin = configuration[from_instance.name].get(attr) -*/
        /*- do check_setting(ioapic_pin, attr, 'IOAPIC pin number') -*/

        /*- set attr = '%s_irq_vector' % from_interface.name -*/
        /*- set vector = configuration[from_instance.name].get(attr) -*/
        /*- do check_setting(vector, attr, 'IRQ vector') -*/

        /*- set irq = alloc(irq_prefix.lower(), seL4_IRQHandler, vector=vector, ioapic=ioapic, ioapic_pin=ioapic_pin, level=level, polarity=polarity, notification=ntfn) -*/
const /*? irq_prefix ?*/_IOAPIC: usize = /*? ioapic ?*/;
const /*? irq_prefix ?*/_PIN: usize = /*? ioapic_pin ?*/;
const /*? irq_prefix ?*/_LEVEL: usize = /*? level ?*/;
const /*? irq_prefix ?*/_POLARITY: usize = /*? polarity ?*/;
const /*? irq_prefix ?*/_VECTOR: usize = /*? vector ?*/;
const /*? irq_prefix ?*/_HANDLER: sel4_sys::seL4_CPtr = /*? irq ?*/;
    /*- elif type == 'msi' -*/
        /*- set attr = '%s_irq_handle' % from_interface.name -*/
        /*- set handle = configuration[from_instance.name].get(attr) -*/
        /*- do check_setting(handle, attr, 'MSI handle') -*/

        /*- set attr = '%s_irq_pci_bus' % from_interface.name -*/
        /*- set pci_bus = configuration[from_instance.name].get(attr) -*/
        /*- do check_setting(pci_bus, attr, 'PCI bus') -*/

        /*- set attr = '%s_irq_pci_dev' % from_interface.name -*/
        /*- set pci_dev = configuration[from_instance.name].get(attr) -*/
        /*- do check_setting(pci_dev, attr, 'PCI device') -*/

        /*- set attr = '%s_irq_pci_fun' % from_interface.name -*/
        /*- set pci_fun = configuration[from_instance.name].get(attr) -*/
        /*- do check_setting(pci_fun, attr, 'PCI function') -*/

        /*- set attr = '%s_irq_vector' % from_interface.name -*/
        /*- set vector = configuration[from_instance.name].get(attr) -*/
        /*- do check_setting(vector, attr, 'IRQ vector') -*/

        /*- set irq = alloc(irq_prefix.lower(), seL4_IRQHandler, vector=vector, handle=handle, pci_bus=pci_bus, pci_dev=pci_dev, pci_fun=pci_fun, notification=ntfn) -*/
const /*? irq_prefix ?*/_BUS: usize = /*? pci_bus ?*/;
const /*? irq_prefix ?*/_DEV: usize = /*? pci_dev ?*/;
const /*? irq_prefix ?*/_FUNC: usize = {/*? pci_func ?*/;
const /*? irq_prefix ?*/_HANDLE: usize = /*? handle ?*/;
const /*? irq_prefix ?*/_VECTOR: usize = /*? vector ?*/;
const /*? irq_prefix ?*/_HANDLER: sel4_sys::seL4_CPtr = /*? irq ?*/;
    /*- else -*/
        /*? raise(TemplateError('Unknown irq type specified by %s.%s' % (from_instance.name, type_attr))) ?*/
    /*- endif -*/
/*- endmacro -*/

/*- set ntfn_prefix = me.interface.name.upper() -*/

/*- set ntfn_obj = alloc_obj('ntfn', seL4_NotificationObject) -*/
/*- set root_ntfn = alloc_cap('ntfn', ntfn_obj, read=True) -*/
pub const /*? ntfn_prefix ?*/_NOTIFICATION: sel4_sys::seL4_CPtr = /*? root_ntfn ?*/;

/*- for (i, end) in enumerate(me.parent.from_ends) -*/
    /*- set irq_prefix = end.interface.name.upper() -*/
    /*- set irq_badge = pow(2, i) -*/
    /*- set irq_ntfn = Cap(ntfn_obj, read=True, badge=irq_badge) -*/
    /*? register_irq(configuration, end, irq_prefix, irq_ntfn) ?*/
static_irq!(/*? irq_prefix.lower() ?*/, /*? irq_badge ?*/, /*? ntfn_prefix ?*/_NOTIFICATION);
/*- endfor -*/
