blob: 8fa6d6ff0bdeb5b940ff0d36988b158c92622bab [file] [log] [blame]
/*
* 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 -*/