Lines Matching +full:cpu +full:- +full:offset

1 /* SPDX-License-Identifier: GPL-2.0-or-later */
15 #include "hw/qdev-properties.h"
16 #include "exec/address-spaces.h"
24 int ipnum, cpu, found, irq_index, irq_mask; in extioi_update_irq() local
26 ipnum = s->sw_ipmap[irq / 32]; in extioi_update_irq()
27 cpu = s->sw_coremap[irq]; in extioi_update_irq()
33 if (((s->enable[irq_index]) & irq_mask) == 0) { in extioi_update_irq()
36 s->cpu[cpu].coreisr[irq_index] |= irq_mask; in extioi_update_irq()
37 found = find_first_bit(s->cpu[cpu].sw_isr[ipnum], EXTIOI_IRQS); in extioi_update_irq()
38 set_bit(irq, s->cpu[cpu].sw_isr[ipnum]); in extioi_update_irq()
44 s->cpu[cpu].coreisr[irq_index] &= ~irq_mask; in extioi_update_irq()
45 clear_bit(irq, s->cpu[cpu].sw_isr[ipnum]); in extioi_update_irq()
46 found = find_first_bit(s->cpu[cpu].sw_isr[ipnum], EXTIOI_IRQS); in extioi_update_irq()
52 qemu_set_irq(s->cpu[cpu].parent_irq[ipnum], level); in extioi_update_irq()
60 set_bit32(irq, s->isr); in extioi_setirq()
62 clear_bit32(irq, s->isr); in extioi_setirq()
71 unsigned long offset = addr & 0xffff; in extioi_readw() local
72 uint32_t index, cpu; in extioi_readw() local
74 switch (offset) { in extioi_readw()
75 case EXTIOI_NODETYPE_START ... EXTIOI_NODETYPE_END - 1: in extioi_readw()
76 index = (offset - EXTIOI_NODETYPE_START) >> 2; in extioi_readw()
77 *data = s->nodetype[index]; in extioi_readw()
79 case EXTIOI_IPMAP_START ... EXTIOI_IPMAP_END - 1: in extioi_readw()
80 index = (offset - EXTIOI_IPMAP_START) >> 2; in extioi_readw()
81 *data = s->ipmap[index]; in extioi_readw()
83 case EXTIOI_ENABLE_START ... EXTIOI_ENABLE_END - 1: in extioi_readw()
84 index = (offset - EXTIOI_ENABLE_START) >> 2; in extioi_readw()
85 *data = s->enable[index]; in extioi_readw()
87 case EXTIOI_BOUNCE_START ... EXTIOI_BOUNCE_END - 1: in extioi_readw()
88 index = (offset - EXTIOI_BOUNCE_START) >> 2; in extioi_readw()
89 *data = s->bounce[index]; in extioi_readw()
91 case EXTIOI_COREISR_START ... EXTIOI_COREISR_END - 1: in extioi_readw()
92 index = (offset - EXTIOI_COREISR_START) >> 2; in extioi_readw()
93 /* using attrs to get current cpu index */ in extioi_readw()
94 cpu = attrs.requester_id; in extioi_readw()
95 *data = s->cpu[cpu].coreisr[index]; in extioi_readw()
97 case EXTIOI_COREMAP_START ... EXTIOI_COREMAP_END - 1: in extioi_readw()
98 index = (offset - EXTIOI_COREMAP_START) >> 2; in extioi_readw()
99 *data = s->coremap[index]; in extioi_readw()
115 val = mask & s->isr[index]; in extioi_enable_irq()
131 int i, cpu; in extioi_update_sw_coremap() local
140 cpu = val & 0xff; in extioi_update_sw_coremap()
143 if (!(s->status & BIT(EXTIOI_ENABLE_CPU_ENCODE))) { in extioi_update_sw_coremap()
144 cpu = ctz32(cpu); in extioi_update_sw_coremap()
145 cpu = (cpu >= 4) ? 0 : cpu; in extioi_update_sw_coremap()
148 if (s->sw_coremap[irq + i] == cpu) { in extioi_update_sw_coremap()
152 if (notify && test_bit32(irq + i, s->isr)) { in extioi_update_sw_coremap()
154 * lower irq at old cpu and raise irq at new cpu in extioi_update_sw_coremap()
157 s->sw_coremap[irq + i] = cpu; in extioi_update_sw_coremap()
160 s->sw_coremap[irq + i] = cpu; in extioi_update_sw_coremap()
180 s->sw_ipmap[index * 4 + i] = ipnum; in extioi_update_sw_ipmap()
190 int cpu, index, old_data, irq; in extioi_writew() local
191 uint32_t offset; in extioi_writew() local
194 offset = addr & 0xffff; in extioi_writew()
196 switch (offset) { in extioi_writew()
197 case EXTIOI_NODETYPE_START ... EXTIOI_NODETYPE_END - 1: in extioi_writew()
198 index = (offset - EXTIOI_NODETYPE_START) >> 2; in extioi_writew()
199 s->nodetype[index] = val; in extioi_writew()
201 case EXTIOI_IPMAP_START ... EXTIOI_IPMAP_END - 1: in extioi_writew()
206 index = (offset - EXTIOI_IPMAP_START) >> 2; in extioi_writew()
207 s->ipmap[index] = val; in extioi_writew()
210 case EXTIOI_ENABLE_START ... EXTIOI_ENABLE_END - 1: in extioi_writew()
211 index = (offset - EXTIOI_ENABLE_START) >> 2; in extioi_writew()
212 old_data = s->enable[index]; in extioi_writew()
213 s->enable[index] = val; in extioi_writew()
216 val = s->enable[index] & ~old_data; in extioi_writew()
220 val = ~s->enable[index] & old_data; in extioi_writew()
223 case EXTIOI_BOUNCE_START ... EXTIOI_BOUNCE_END - 1: in extioi_writew()
225 index = (offset - EXTIOI_BOUNCE_START) >> 2; in extioi_writew()
226 s->bounce[index] = val; in extioi_writew()
228 case EXTIOI_COREISR_START ... EXTIOI_COREISR_END - 1: in extioi_writew()
229 index = (offset - EXTIOI_COREISR_START) >> 2; in extioi_writew()
230 /* using attrs to get current cpu index */ in extioi_writew()
231 cpu = attrs.requester_id; in extioi_writew()
232 old_data = s->cpu[cpu].coreisr[index]; in extioi_writew()
233 s->cpu[cpu].coreisr[index] = old_data & ~val; in extioi_writew()
243 case EXTIOI_COREMAP_START ... EXTIOI_COREMAP_END - 1: in extioi_writew()
244 irq = offset - EXTIOI_COREMAP_START; in extioi_writew()
246 s->coremap[index] = val; in extioi_writew()
273 *data = s->features; in extioi_virt_readw()
276 *data = s->status; in extioi_virt_readw()
299 if ((s->status & BIT(EXTIOI_ENABLE)) && val) { in extioi_virt_writew()
303 s->status = val & s->features; in extioi_virt_writew()
327 if (s->num_cpu == 0) { in loongarch_extioi_realize()
328 error_setg(errp, "num-cpu must be at least 1"); in loongarch_extioi_realize()
333 sysbus_init_irq(sbd, &s->irq[i]); in loongarch_extioi_realize()
337 memory_region_init_io(&s->extioi_system_mem, OBJECT(s), &extioi_ops, in loongarch_extioi_realize()
339 sysbus_init_mmio(sbd, &s->extioi_system_mem); in loongarch_extioi_realize()
341 if (s->features & BIT(EXTIOI_HAS_VIRT_EXTENSION)) { in loongarch_extioi_realize()
342 memory_region_init_io(&s->virt_extend, OBJECT(s), &extioi_virt_ops, in loongarch_extioi_realize()
344 sysbus_init_mmio(sbd, &s->virt_extend); in loongarch_extioi_realize()
345 s->features |= EXTIOI_VIRT_HAS_FEATURES; in loongarch_extioi_realize()
347 s->status |= BIT(EXTIOI_ENABLE); in loongarch_extioi_realize()
350 s->cpu = g_new0(ExtIOICore, s->num_cpu); in loongarch_extioi_realize()
351 if (s->cpu == NULL) { in loongarch_extioi_realize()
356 for (i = 0; i < s->num_cpu; i++) { in loongarch_extioi_realize()
358 qdev_init_gpio_out(dev, &s->cpu[i].parent_irq[pin], 1); in loongarch_extioi_realize()
367 g_free(s->cpu); in loongarch_extioi_finalize()
374 s->status = 0; in loongarch_extioi_reset()
384 extioi_update_sw_coremap(s, start_irq, s->coremap[i], false); in vmstate_extioi_post_load()
388 extioi_update_sw_ipmap(s, i, s->ipmap[i]); in vmstate_extioi_post_load()
395 .name = "extioi-core",
418 VMSTATE_STRUCT_VARRAY_POINTER_UINT32(cpu, LoongArchExtIOI, num_cpu,
427 DEFINE_PROP_UINT32("num-cpu", LoongArchExtIOI, num_cpu, 1),
428 DEFINE_PROP_BIT("has-virtualization-extension", LoongArchExtIOI, features,
437 dc->realize = loongarch_extioi_realize; in loongarch_extioi_class_init()
440 dc->vmsd = &vmstate_loongarch_extioi; in loongarch_extioi_class_init()