Lines Matching refs:aplic

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