Matteo Concas created a merge request: 
https://gitlab.rtems.org/rtems/rtos/rtems/-/merge_requests/1332

Project:Branches: matteo.concas/rtems-gaisler:matteo/irqmp-irqmap-support to 
rtems/rtos/rtems:main
Author:   Matteo Concas
Assignee: Matteo Concas


## Summary

bsps/leon3: Add support for IRQMP IRQMAP

This support is added in the form of two public functions,
`leon3_irqmap_get_unchecked()` that will directly return the mapped
interrupt and `leon3_irqmap_get()` that will perform a check (<63) before
reading the mapping.

>From the [GRLIB IP Core User’s 
>Manual](https://download.gaisler.com/products/GRLIB/doc/grip.pdf) section 
>95.2.6 _Interrupt (re)map functionality_:
> The interrupt controller can optionally be implemented (as an alternative to 
> the two-level interrupt scheme) with functionality to allow dynamic remapping 
> between bus interrupt lines and interrupt controller interrupt lines. [...]

> The interrupt map registers contain one field for each bus interrupt line in 
> the system. The value within this field determines to which interrupt 
> controller line the bus interrupt line is connected. In case several bus 
> interrupt lines are mapped to the same controller interrupt line (several 
> fields in the Interrupt map registers have the same value) then the bus 
> interrupt lines will be OR:ed together.

> Note that if bus interrupt line X is remapped to controller interrupt line Y 
> then bit Y of the pending register will be set when a peripheral asserts 
> interrupt X. Remapping interrupt lines via the Interrupt map registers has 
> the same effect as changing the interrupt assignments in the RTL code.

Implementation wise this translates to a 64 byte array of byte values: 
`IRQMAP[n] = X` where `n` is the interrupt bus line (as can be read from PnP) 
and `X` is the interrupt controller line, i.e. the interrupt that will be shown 
as pending in the Interrupt Pending Register when a device with interrupt line 
`n` raises an interrupt.

This implementation is pretty simple so it reads the mapping once at 
initialization and then treats it as constant. It does not allow for modifying 
the mapping during RTEMS runtime (although a previous booting stage could do 
it).

Any user registering an interrupt for a device on a system with IRQ 
(re-)mapping implemented is expected to first translate that interrupt with 
`leon3_irqmap_get()` or `leon3_irqmap_get_unchecked()`, similarly to what one 
would do with `RISCV_INTERRUPT_VECTOR_EXTERNAL()`. The driver manager uses the 
AMBA PnP interface to register device interrupts so it will work natively with 
those systems.

<!-- Default settings, if it is a dropdown it will set after submission -->

-- 
View it on GitLab: 
https://gitlab.rtems.org/rtems/rtos/rtems/-/merge_requests/1332
You're receiving this email because of your account on gitlab.rtems.org. 
Unsubscribe from this thread: 
https://gitlab.rtems.org/-/sent_notifications/4-0smdw59hncijqj0ms2o9ufxd4-1d/unsubscribe
 | Manage all notifications: https://gitlab.rtems.org/-/profile/notifications | 
Help: https://gitlab.rtems.org/help


_______________________________________________
bugs mailing list
[email protected]
http://lists.rtems.org/mailman/listinfo/bugs

Reply via email to