root / hw / intc / gic_internal.h @ 285b4432
History | View | Annotate | Download (5.2 kB)
1 | 1e8cae4d | Peter Maydell | /*
|
---|---|---|---|
2 | 1e8cae4d | Peter Maydell | * ARM GIC support - internal interfaces
|
3 | 1e8cae4d | Peter Maydell | *
|
4 | 1e8cae4d | Peter Maydell | * Copyright (c) 2012 Linaro Limited
|
5 | 1e8cae4d | Peter Maydell | * Written by Peter Maydell
|
6 | 1e8cae4d | Peter Maydell | *
|
7 | 1e8cae4d | Peter Maydell | * This program is free software; you can redistribute it and/or modify
|
8 | 1e8cae4d | Peter Maydell | * it under the terms of the GNU General Public License as published by
|
9 | 1e8cae4d | Peter Maydell | * the Free Software Foundation, either version 2 of the License, or
|
10 | 1e8cae4d | Peter Maydell | * (at your option) any later version.
|
11 | 1e8cae4d | Peter Maydell | *
|
12 | 1e8cae4d | Peter Maydell | * This program is distributed in the hope that it will be useful,
|
13 | 1e8cae4d | Peter Maydell | * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
14 | 1e8cae4d | Peter Maydell | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
15 | 1e8cae4d | Peter Maydell | * GNU General Public License for more details.
|
16 | 1e8cae4d | Peter Maydell | *
|
17 | 1e8cae4d | Peter Maydell | * You should have received a copy of the GNU General Public License along
|
18 | 1e8cae4d | Peter Maydell | * with this program; if not, see <http://www.gnu.org/licenses/>.
|
19 | 1e8cae4d | Peter Maydell | */
|
20 | 1e8cae4d | Peter Maydell | |
21 | 1e8cae4d | Peter Maydell | #ifndef QEMU_ARM_GIC_INTERNAL_H
|
22 | 1e8cae4d | Peter Maydell | #define QEMU_ARM_GIC_INTERNAL_H
|
23 | 1e8cae4d | Peter Maydell | |
24 | 83c9f4ca | Paolo Bonzini | #include "hw/sysbus.h" |
25 | 1e8cae4d | Peter Maydell | |
26 | 1e8cae4d | Peter Maydell | /* Maximum number of possible interrupts, determined by the GIC architecture */
|
27 | 1e8cae4d | Peter Maydell | #define GIC_MAXIRQ 1020 |
28 | 1e8cae4d | Peter Maydell | /* First 32 are private to each CPU (SGIs and PPIs). */
|
29 | 1e8cae4d | Peter Maydell | #define GIC_INTERNAL 32 |
30 | 1e8cae4d | Peter Maydell | /* Maximum number of possible CPU interfaces, determined by GIC architecture */
|
31 | 1e8cae4d | Peter Maydell | #define NCPU 8 |
32 | 1e8cae4d | Peter Maydell | |
33 | 1e8cae4d | Peter Maydell | #define ALL_CPU_MASK ((unsigned)(((1 << NCPU) - 1))) |
34 | 1e8cae4d | Peter Maydell | |
35 | 1e8cae4d | Peter Maydell | /* The NVIC has 16 internal vectors. However these are not exposed
|
36 | 1e8cae4d | Peter Maydell | through the normal GIC interface. */
|
37 | 1e8cae4d | Peter Maydell | #define GIC_BASE_IRQ ((s->revision == REV_NVIC) ? 32 : 0) |
38 | 1e8cae4d | Peter Maydell | |
39 | 1e8cae4d | Peter Maydell | #define GIC_SET_ENABLED(irq, cm) s->irq_state[irq].enabled |= (cm)
|
40 | 1e8cae4d | Peter Maydell | #define GIC_CLEAR_ENABLED(irq, cm) s->irq_state[irq].enabled &= ~(cm)
|
41 | 1e8cae4d | Peter Maydell | #define GIC_TEST_ENABLED(irq, cm) ((s->irq_state[irq].enabled & (cm)) != 0) |
42 | 1e8cae4d | Peter Maydell | #define GIC_SET_PENDING(irq, cm) s->irq_state[irq].pending |= (cm)
|
43 | 1e8cae4d | Peter Maydell | #define GIC_CLEAR_PENDING(irq, cm) s->irq_state[irq].pending &= ~(cm)
|
44 | 1e8cae4d | Peter Maydell | #define GIC_TEST_PENDING(irq, cm) ((s->irq_state[irq].pending & (cm)) != 0) |
45 | 1e8cae4d | Peter Maydell | #define GIC_SET_ACTIVE(irq, cm) s->irq_state[irq].active |= (cm)
|
46 | 1e8cae4d | Peter Maydell | #define GIC_CLEAR_ACTIVE(irq, cm) s->irq_state[irq].active &= ~(cm)
|
47 | 1e8cae4d | Peter Maydell | #define GIC_TEST_ACTIVE(irq, cm) ((s->irq_state[irq].active & (cm)) != 0) |
48 | c3037774 | Peter Maydell | #define GIC_SET_MODEL(irq) s->irq_state[irq].model = true |
49 | c3037774 | Peter Maydell | #define GIC_CLEAR_MODEL(irq) s->irq_state[irq].model = false |
50 | 1e8cae4d | Peter Maydell | #define GIC_TEST_MODEL(irq) s->irq_state[irq].model
|
51 | 1e8cae4d | Peter Maydell | #define GIC_SET_LEVEL(irq, cm) s->irq_state[irq].level = (cm)
|
52 | 1e8cae4d | Peter Maydell | #define GIC_CLEAR_LEVEL(irq, cm) s->irq_state[irq].level &= ~(cm)
|
53 | 1e8cae4d | Peter Maydell | #define GIC_TEST_LEVEL(irq, cm) ((s->irq_state[irq].level & (cm)) != 0) |
54 | c3037774 | Peter Maydell | #define GIC_SET_TRIGGER(irq) s->irq_state[irq].trigger = true |
55 | c3037774 | Peter Maydell | #define GIC_CLEAR_TRIGGER(irq) s->irq_state[irq].trigger = false |
56 | 1e8cae4d | Peter Maydell | #define GIC_TEST_TRIGGER(irq) s->irq_state[irq].trigger
|
57 | 1e8cae4d | Peter Maydell | #define GIC_GET_PRIORITY(irq, cpu) (((irq) < GIC_INTERNAL) ? \
|
58 | 1e8cae4d | Peter Maydell | s->priority1[irq][cpu] : \ |
59 | 1e8cae4d | Peter Maydell | s->priority2[(irq) - GIC_INTERNAL]) |
60 | 1e8cae4d | Peter Maydell | #define GIC_TARGET(irq) s->irq_target[irq]
|
61 | 1e8cae4d | Peter Maydell | |
62 | 1e8cae4d | Peter Maydell | typedef struct gic_irq_state { |
63 | 1e8cae4d | Peter Maydell | /* The enable bits are only banked for per-cpu interrupts. */
|
64 | c3037774 | Peter Maydell | uint8_t enabled; |
65 | c3037774 | Peter Maydell | uint8_t pending; |
66 | c3037774 | Peter Maydell | uint8_t active; |
67 | c3037774 | Peter Maydell | uint8_t level; |
68 | c3037774 | Peter Maydell | bool model; /* 0 = N:N, 1 = 1:N */ |
69 | c3037774 | Peter Maydell | bool trigger; /* nonzero = edge triggered. */ |
70 | 1e8cae4d | Peter Maydell | } gic_irq_state; |
71 | 1e8cae4d | Peter Maydell | |
72 | fae15286 | Peter Maydell | typedef struct GICState { |
73 | 285b4432 | Andreas Färber | /*< private >*/
|
74 | 285b4432 | Andreas Färber | SysBusDevice parent_obj; |
75 | 285b4432 | Andreas Färber | /*< public >*/
|
76 | 285b4432 | Andreas Färber | |
77 | 1e8cae4d | Peter Maydell | qemu_irq parent_irq[NCPU]; |
78 | c3037774 | Peter Maydell | bool enabled;
|
79 | c3037774 | Peter Maydell | bool cpu_enabled[NCPU];
|
80 | 1e8cae4d | Peter Maydell | |
81 | 1e8cae4d | Peter Maydell | gic_irq_state irq_state[GIC_MAXIRQ]; |
82 | c3037774 | Peter Maydell | uint8_t irq_target[GIC_MAXIRQ]; |
83 | c3037774 | Peter Maydell | uint8_t priority1[GIC_INTERNAL][NCPU]; |
84 | c3037774 | Peter Maydell | uint8_t priority2[GIC_MAXIRQ - GIC_INTERNAL]; |
85 | c3037774 | Peter Maydell | uint16_t last_active[GIC_MAXIRQ][NCPU]; |
86 | 1e8cae4d | Peter Maydell | |
87 | c3037774 | Peter Maydell | uint16_t priority_mask[NCPU]; |
88 | c3037774 | Peter Maydell | uint16_t running_irq[NCPU]; |
89 | c3037774 | Peter Maydell | uint16_t running_priority[NCPU]; |
90 | c3037774 | Peter Maydell | uint16_t current_pending[NCPU]; |
91 | 1e8cae4d | Peter Maydell | |
92 | 1e8cae4d | Peter Maydell | uint32_t num_cpu; |
93 | 1e8cae4d | Peter Maydell | |
94 | 1e8cae4d | Peter Maydell | MemoryRegion iomem; /* Distributor */
|
95 | 1e8cae4d | Peter Maydell | /* This is just so we can have an opaque pointer which identifies
|
96 | 1e8cae4d | Peter Maydell | * both this GIC and which CPU interface we should be accessing.
|
97 | 1e8cae4d | Peter Maydell | */
|
98 | fae15286 | Peter Maydell | struct GICState *backref[NCPU];
|
99 | 1e8cae4d | Peter Maydell | MemoryRegion cpuiomem[NCPU+1]; /* CPU interfaces */ |
100 | 1e8cae4d | Peter Maydell | uint32_t num_irq; |
101 | 1e8cae4d | Peter Maydell | uint32_t revision; |
102 | fae15286 | Peter Maydell | } GICState; |
103 | 1e8cae4d | Peter Maydell | |
104 | 1e8cae4d | Peter Maydell | /* The special cases for the revision property: */
|
105 | 1e8cae4d | Peter Maydell | #define REV_11MPCORE 0 |
106 | 1e8cae4d | Peter Maydell | #define REV_NVIC 0xffffffff |
107 | 1e8cae4d | Peter Maydell | |
108 | fae15286 | Peter Maydell | void gic_set_pending_private(GICState *s, int cpu, int irq); |
109 | fae15286 | Peter Maydell | uint32_t gic_acknowledge_irq(GICState *s, int cpu);
|
110 | fae15286 | Peter Maydell | void gic_complete_irq(GICState *s, int cpu, int irq); |
111 | fae15286 | Peter Maydell | void gic_update(GICState *s);
|
112 | fae15286 | Peter Maydell | void gic_init_irqs_and_distributor(GICState *s, int num_irq); |
113 | 1e8cae4d | Peter Maydell | |
114 | 1e8cae4d | Peter Maydell | #define TYPE_ARM_GIC_COMMON "arm_gic_common" |
115 | 1e8cae4d | Peter Maydell | #define ARM_GIC_COMMON(obj) \
|
116 | fae15286 | Peter Maydell | OBJECT_CHECK(GICState, (obj), TYPE_ARM_GIC_COMMON) |
117 | 1e8cae4d | Peter Maydell | #define ARM_GIC_COMMON_CLASS(klass) \
|
118 | 1e8cae4d | Peter Maydell | OBJECT_CLASS_CHECK(ARMGICCommonClass, (klass), TYPE_ARM_GIC_COMMON) |
119 | 1e8cae4d | Peter Maydell | #define ARM_GIC_COMMON_GET_CLASS(obj) \
|
120 | 1e8cae4d | Peter Maydell | OBJECT_GET_CLASS(ARMGICCommonClass, (obj), TYPE_ARM_GIC_COMMON) |
121 | 1e8cae4d | Peter Maydell | |
122 | 1e8cae4d | Peter Maydell | typedef struct ARMGICCommonClass { |
123 | 1e8cae4d | Peter Maydell | SysBusDeviceClass parent_class; |
124 | 9ecb9926 | Peter Maydell | void (*pre_save)(GICState *s);
|
125 | 9ecb9926 | Peter Maydell | void (*post_load)(GICState *s);
|
126 | 1e8cae4d | Peter Maydell | } ARMGICCommonClass; |
127 | 1e8cae4d | Peter Maydell | |
128 | 1e8cae4d | Peter Maydell | #define TYPE_ARM_GIC "arm_gic" |
129 | 1e8cae4d | Peter Maydell | #define ARM_GIC(obj) \
|
130 | fae15286 | Peter Maydell | OBJECT_CHECK(GICState, (obj), TYPE_ARM_GIC) |
131 | 1e8cae4d | Peter Maydell | #define ARM_GIC_CLASS(klass) \
|
132 | 1e8cae4d | Peter Maydell | OBJECT_CLASS_CHECK(ARMGICClass, (klass), TYPE_ARM_GIC) |
133 | 1e8cae4d | Peter Maydell | #define ARM_GIC_GET_CLASS(obj) \
|
134 | 1e8cae4d | Peter Maydell | OBJECT_GET_CLASS(ARMGICClass, (obj), TYPE_ARM_GIC) |
135 | 1e8cae4d | Peter Maydell | |
136 | 1e8cae4d | Peter Maydell | typedef struct ARMGICClass { |
137 | 1e8cae4d | Peter Maydell | ARMGICCommonClass parent_class; |
138 | 53111180 | Peter Maydell | DeviceRealize parent_realize; |
139 | 1e8cae4d | Peter Maydell | } ARMGICClass; |
140 | 1e8cae4d | Peter Maydell | |
141 | 1e8cae4d | Peter Maydell | #endif /* !QEMU_ARM_GIC_INTERNAL_H */ |