blob: d011e1546861986f78bde2a44869644412fc0a51 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
|
# Platform Interrupt Message Controller (PIMC)
The PIMC is responsible for receiving Interrupt Requests (IRQs) from peripherals
and routing them to a processor. There can be several peripherals in the system,
each connected to their respective IRQ lines.
## PIMC Signals
| Signal | Purpose |
| ---------- | --------------------------- |
| IRQACK | Interrupt acknowledgement |
| LINENO[7:0] | IRQ line to be serviced |
| NOTIFY# | Signals an active IRQ |
| MMIO_ADDR | MMIO r/w address |
| MMIO_RE | MMIO read enable |
| MMIO_WE | MMIO write enable |
| MMIO_WDATA | MMIO write data |
| MMIO_RDATA | MMIO read data |
| CLK | PIMC Clock |
## PIMC Startup State
| Signal | State |
| ---------- | -------- |
| IRQACK | LOW (0) |
| LINENO[7:0] | UNDEFINED |
| NOTIFY# | UNDEFINED |
## PIMC Initialization Process
During system startup, LINENO[7:0] and NOTIFY# will be in an undefined state. Stage 1 firmware
is responsible for initializing the PIMC before it is ready for operation. The PIMC is initialized
by pulsing IRQACK high for at least 2 ms.
As soon as a rising edge of the PIMC CLK signal occurs with IRQACK pulled high, NOTIFY# is pulled high
and LINENO[7:0] becomes zero.
## Signalling
When a peripheral needs to signal an event, it pulses its IRQ line high for 1 ms which results in
NOTIFY# being pulled low and LINENO[7:0] set to the source line number. After an IRQ has been handled,
it can be acknowledged by pulsing IRQACK high for 2 ms. After an IRQ has been acknowledged, NOTIFY#
is pulled high and LINENO[7:0] is cleared to zero.
![signals](images/irq.png)
## MMIO Interface
Some registers within the PIMC chip are memory mapped and can be accessed through the MMIO interface. For example,
the IRQ table is accessed through physical address 0x1000 + OFFSET.
### MMIO Interface Semantics
The MMIO_ADDR input from mainbus is set to the address being accessed. The MMIO_RE (Read Enable) and
MMIO_WE (Write Enable) signals are used for read/write operations and are mutually exclusive. As soon as one
of these signals are pulled high, data transfer begins.
- Pulse MMIO_RE high to read data onto MMIO_RDATA.
- Pulse MMIO_WE high to write data from MMIO_WDATA.
![masking](images/irqmask.png)
### MMIO Interface Registers
#### IRQ Table
The IRQ table is a set of registers that manage where and how IRQs get directed.
The IRQ line number acts as the index into this table.
| Bits | Field |
| ----------- | ------------- |
| 7:0 | Processor ID |
| 8 | Line mask |
| 31:9 | Reserved |
The Processor ID field contains the ID of the processor for this IRQ to be directed to.
If the Line Mask bit is set to 1, the PIMC chip will ignore interrupts from this line.
|