Lines Matching defs:aplic

29 struct aplic {
40 static u32 aplic_read_sourcecfg(struct aplic *aplic, u32 irq)
46 if (!irq || aplic->nr_irqs <= irq)
48 irqd = &aplic->irqs[irq];
57 static void aplic_write_sourcecfg(struct aplic *aplic, u32 irq, u32 val)
62 if (!irq || aplic->nr_irqs <= irq)
64 irqd = &aplic->irqs[irq];
76 static u32 aplic_read_target(struct aplic *aplic, u32 irq)
82 if (!irq || aplic->nr_irqs <= irq)
84 irqd = &aplic->irqs[irq];
93 static void aplic_write_target(struct aplic *aplic, u32 irq, u32 val)
98 if (!irq || aplic->nr_irqs <= irq)
100 irqd = &aplic->irqs[irq];
111 static bool aplic_read_pending(struct aplic *aplic, u32 irq)
117 if (!irq || aplic->nr_irqs <= irq)
119 irqd = &aplic->irqs[irq];
128 static void aplic_write_pending(struct aplic *aplic, u32 irq, bool pending)
133 if (!irq || aplic->nr_irqs <= irq)
135 irqd = &aplic->irqs[irq];
154 static bool aplic_read_enabled(struct aplic *aplic, u32 irq)
160 if (!irq || aplic->nr_irqs <= irq)
162 irqd = &aplic->irqs[irq];
171 static void aplic_write_enabled(struct aplic *aplic, u32 irq, bool enabled)
176 if (!irq || aplic->nr_irqs <= irq)
178 irqd = &aplic->irqs[irq];
188 static bool aplic_read_input(struct aplic *aplic, u32 irq)
194 if (!irq || aplic->nr_irqs <= irq)
196 irqd = &aplic->irqs[irq];
223 struct aplic *aplic = kvm->arch.aia.aplic_state;
225 if (!(aplic->domaincfg & APLIC_DOMAINCFG_IE))
229 if (!irq || aplic->nr_irqs <= irq)
231 irqd = &aplic->irqs[irq];
256 struct aplic *aplic = kvm->arch.aia.aplic_state;
258 if (!aplic || !source || (aplic->nr_irqs <= source))
260 irqd = &aplic->irqs[source];
261 ie = (aplic->domaincfg & APLIC_DOMAINCFG_IE) ? true : false;
310 static u32 aplic_read_input_word(struct aplic *aplic, u32 word)
315 ret |= aplic_read_input(aplic, word * 32 + i) ? BIT(i) : 0;
320 static u32 aplic_read_pending_word(struct aplic *aplic, u32 word)
325 ret |= aplic_read_pending(aplic, word * 32 + i) ? BIT(i) : 0;
330 static void aplic_write_pending_word(struct aplic *aplic, u32 word,
337 aplic_write_pending(aplic, word * 32 + i, pending);
341 static u32 aplic_read_enabled_word(struct aplic *aplic, u32 word)
346 ret |= aplic_read_enabled(aplic, word * 32 + i) ? BIT(i) : 0;
351 static void aplic_write_enabled_word(struct aplic *aplic, u32 word,
358 aplic_write_enabled(aplic, word * 32 + i, enabled);
365 struct aplic *aplic = kvm->arch.aia.aplic_state;
372 aplic->domaincfg | APLIC_DOMAINCFG_DM;
374 (off < (APLIC_SOURCECFG_BASE + (aplic->nr_irqs - 1) * 4))) {
376 *val32 = aplic_read_sourcecfg(aplic, i);
378 (off < (APLIC_SETIP_BASE + aplic->nr_words * 4))) {
380 *val32 = aplic_read_pending_word(aplic, i);
384 (off < (APLIC_CLRIP_BASE + aplic->nr_words * 4))) {
386 *val32 = aplic_read_input_word(aplic, i);
390 (off < (APLIC_SETIE_BASE + aplic->nr_words * 4))) {
392 *val32 = aplic_read_enabled_word(aplic, i);
396 (off < (APLIC_CLRIE_BASE + aplic->nr_words * 4))) {
405 *val32 = aplic->genmsi;
407 (off < (APLIC_TARGET_BASE + (aplic->nr_irqs - 1) * 4))) {
409 *val32 = aplic_read_target(aplic, i);
430 struct aplic *aplic = kvm->arch.aia.aplic_state;
437 aplic->domaincfg = val32 & APLIC_DOMAINCFG_IE;
439 (off < (APLIC_SOURCECFG_BASE + (aplic->nr_irqs - 1) * 4))) {
441 aplic_write_sourcecfg(aplic, i, val32);
443 (off < (APLIC_SETIP_BASE + aplic->nr_words * 4))) {
445 aplic_write_pending_word(aplic, i, val32, true);
447 aplic_write_pending(aplic, val32, true);
449 (off < (APLIC_CLRIP_BASE + aplic->nr_words * 4))) {
451 aplic_write_pending_word(aplic, i, val32, false);
453 aplic_write_pending(aplic, val32, false);
455 (off < (APLIC_SETIE_BASE + aplic->nr_words * 4))) {
457 aplic_write_enabled_word(aplic, i, val32, true);
459 aplic_write_enabled(aplic, val32, true);
461 (off < (APLIC_CLRIE_BASE + aplic->nr_words * 4))) {
463 aplic_write_enabled_word(aplic, i, val32, false);
465 aplic_write_enabled(aplic, val32, false);
467 aplic_write_pending(aplic, val32, true);
469 aplic_write_pending(aplic, __swab32(val32), true);
471 aplic->genmsi = val32 & ~(APLIC_TARGET_GUEST_IDX_MASK <<
477 (off < (APLIC_TARGET_BASE + (aplic->nr_irqs - 1) * 4))) {
479 aplic_write_target(aplic, i, val32);
483 aplic_update_irq_range(kvm, 1, aplic->nr_irqs - 1);
550 struct aplic *aplic;
557 aplic = kzalloc(sizeof(*aplic), GFP_KERNEL);
558 if (!aplic)
560 kvm->arch.aia.aplic_state = aplic;
563 aplic->nr_irqs = kvm->arch.aia.nr_sources + 1;
564 aplic->nr_words = DIV_ROUND_UP(aplic->nr_irqs, 32);
565 aplic->irqs = kcalloc(aplic->nr_irqs,
566 sizeof(*aplic->irqs), GFP_KERNEL);
567 if (!aplic->irqs) {
571 for (i = 0; i < aplic->nr_irqs; i++)
572 raw_spin_lock_init(&aplic->irqs[i].lock);
575 kvm_iodevice_init(&aplic->iodev, &aplic_iodoev_ops);
580 &aplic->iodev);
586 ret = kvm_riscv_setup_default_irq_routing(kvm, aplic->nr_irqs);
594 kvm_io_bus_unregister_dev(kvm, KVM_MMIO_BUS, &aplic->iodev);
597 kfree(aplic->irqs);
600 kfree(aplic);
606 struct aplic *aplic = kvm->arch.aia.aplic_state;
608 if (!aplic)
612 kvm_io_bus_unregister_dev(kvm, KVM_MMIO_BUS, &aplic->iodev);
615 kfree(aplic->irqs);
618 kfree(aplic);