Lines Matching +full:priority +full:- +full:0
18 /* The number of virtual priority levels. 16 user vectors plus the
37 /* Mask containing interrupts with higher priority than this one. */
40 /* Current priority level. */
41 int priority; member
48 { 0x90, 0x11, 0x04, 0x00, 0x0D, 0xf0, 0x05, 0xb1 };
52 return (s->level | s->soft_level) & s->irq_enable & ~s->fiq_select; in pl190_irq_level()
61 set = (level & s->prio_mask[s->priority]) != 0; in pl190_update()
62 qemu_set_irq(s->irq, set); in pl190_update()
63 set = ((s->level | s->soft_level) & s->fiq_select) != 0; in pl190_update()
64 qemu_set_irq(s->fiq, set); in pl190_update()
72 s->level |= 1u << irq; in pl190_set_irq()
74 s->level &= ~(1u << irq); in pl190_set_irq()
84 mask = 0; in pl190_update_vectors()
85 for (i = 0; i < 16; i++) in pl190_update_vectors()
87 s->prio_mask[i] = mask; in pl190_update_vectors()
88 if (s->vect_control[i] & 0x20) in pl190_update_vectors()
90 n = s->vect_control[i] & 0x1f; in pl190_update_vectors()
94 s->prio_mask[16] = mask; in pl190_update_vectors()
104 if (offset >= 0xfe0 && offset < 0x1000) { in pl190_read()
105 return pl190_id[(offset - 0xfe0) >> 2]; in pl190_read()
107 if (offset >= 0x100 && offset < 0x140) { in pl190_read()
108 return s->vect_addr[(offset - 0x100) >> 2]; in pl190_read()
110 if (offset >= 0x200 && offset < 0x240) { in pl190_read()
111 return s->vect_control[(offset - 0x200) >> 2]; in pl190_read()
114 case 0: /* IRQSTATUS */ in pl190_read()
117 return (s->level | s->soft_level) & s->fiq_select; in pl190_read()
119 return s->level | s->soft_level; in pl190_read()
121 return s->fiq_select; in pl190_read()
123 return s->irq_enable; in pl190_read()
125 return s->soft_level; in pl190_read()
127 return s->protected; in pl190_read()
130 * current priority level to that of the current interrupt. in pl190_read()
132 * Since an enabled interrupt X at priority P causes prio_mask[Y] in pl190_read()
134 * i == the priority of the highest priority set interrupt. in pl190_read()
136 for (i = 0; i < s->priority; i++) { in pl190_read()
137 if ((s->level | s->soft_level) & s->prio_mask[i + 1]) { in pl190_read()
145 return s->vect_addr[16]; in pl190_read()
146 if (i < s->priority) in pl190_read()
148 s->prev_prio[i] = s->priority; in pl190_read()
149 s->priority = i; in pl190_read()
152 return s->vect_addr[s->priority]; in pl190_read()
154 return s->vect_addr[16]; in pl190_read()
158 return 0; in pl190_read()
167 if (offset >= 0x100 && offset < 0x140) { in pl190_write()
168 s->vect_addr[(offset - 0x100) >> 2] = val; in pl190_write()
172 if (offset >= 0x200 && offset < 0x240) { in pl190_write()
173 s->vect_control[(offset - 0x200) >> 2] = val; in pl190_write()
178 case 0: /* SELECT */ in pl190_write()
183 s->fiq_select = val; in pl190_write()
186 s->irq_enable |= val; in pl190_write()
189 s->irq_enable &= ~val; in pl190_write()
192 s->soft_level |= val; in pl190_write()
195 s->soft_level &= ~val; in pl190_write()
199 s->protected = val & 1; in pl190_write()
202 /* Restore the previous priority level. The value written is in pl190_write()
204 if (s->priority < PL190_NUM_PRIO) in pl190_write()
205 s->priority = s->prev_prio[s->priority]; in pl190_write()
208 s->vect_addr[16] = val; in pl190_write()
210 case 0xc0: /* ITCR */ in pl190_write()
234 for (i = 0; i < 16; i++) { in pl190_reset()
235 s->vect_addr[i] = 0; in pl190_reset()
236 s->vect_control[i] = 0; in pl190_reset()
238 s->vect_addr[16] = 0; in pl190_reset()
239 s->prio_mask[17] = 0xffffffff; in pl190_reset()
240 s->priority = PL190_NUM_PRIO; in pl190_reset()
250 memory_region_init_io(&s->iomem, obj, &pl190_ops, s, "pl190", 0x1000); in pl190_init()
251 sysbus_init_mmio(sbd, &s->iomem); in pl190_init()
253 sysbus_init_irq(sbd, &s->irq); in pl190_init()
254 sysbus_init_irq(sbd, &s->fiq); in pl190_init()
270 VMSTATE_INT32(priority, PL190State),
281 dc->vmsd = &vmstate_pl190; in pl190_class_init()