Lines Matching full:imsic
7 #define pr_fmt(fmt) "riscv-imsic: " fmt
22 #include "irq-riscv-imsic-state.h"
59 struct imsic_priv *imsic; variable
63 return imsic ? &imsic->global : NULL; in imsic_get_global_config()
101 * IMSIC EIEx and EIPx registers. These registers in __imsic_eix_update()
112 * The IMSIC EIEx and EIPx registers are indirectly in __imsic_eix_update()
136 for_each_set_bit(i, lpriv->dirty_bitmap, imsic->global.nr_ids + 1) { in __imsic_local_sync()
186 tlocal = per_cpu_ptr(imsic->global.local, tvec->cpu); in __imsic_local_sync()
190 mlocal = per_cpu_ptr(imsic->global.local, mvec->cpu); in __imsic_local_sync()
195 mlocal = per_cpu_ptr(imsic->global.local, mvec->cpu); in __imsic_local_sync()
228 struct imsic_local_priv *lpriv = this_cpu_ptr(imsic->lpriv); in imsic_local_sync_all()
234 bitmap_fill(lpriv->dirty_bitmap, imsic->global.nr_ids + 1); in imsic_local_sync_all()
296 lpriv = per_cpu_ptr(imsic->lpriv, vec->cpu); in imsic_vector_mask()
318 lpriv = per_cpu_ptr(imsic->lpriv, vec->cpu); in imsic_vector_unmask()
342 lpriv = per_cpu_ptr(imsic->lpriv, vec->cpu); in imsic_vector_force_move_cleanup()
387 old_lpriv = per_cpu_ptr(imsic->lpriv, old_vec->cpu); in imsic_vector_move()
391 new_lpriv = per_cpu_ptr(imsic->lpriv, new_vec->cpu); in imsic_vector_move()
412 lpriv = per_cpu_ptr(imsic->lpriv, vec->cpu); in imsic_vector_debug_show()
433 irq_matrix_debug_show(m, imsic->matrix, ind); in imsic_vector_debug_show_summary()
439 struct imsic_local_priv *lpriv = per_cpu_ptr(imsic->lpriv, cpu); in imsic_vector_from_local_id()
441 if (!lpriv || imsic->global.nr_ids < local_id) in imsic_vector_from_local_id()
455 raw_spin_lock_irqsave(&imsic->matrix_lock, flags); in imsic_vector_alloc()
456 local_id = irq_matrix_alloc(imsic->matrix, mask, false, &cpu); in imsic_vector_alloc()
457 raw_spin_unlock_irqrestore(&imsic->matrix_lock, flags); in imsic_vector_alloc()
461 lpriv = per_cpu_ptr(imsic->lpriv, cpu); in imsic_vector_alloc()
475 raw_spin_lock_irqsave(&imsic->matrix_lock, flags); in imsic_vector_free()
477 irq_matrix_free(imsic->matrix, vec->cpu, vec->local_id, false); in imsic_vector_free()
478 raw_spin_unlock_irqrestore(&imsic->matrix_lock, flags); in imsic_vector_free()
487 lpriv = per_cpu_ptr(imsic->lpriv, cpu); in imsic_local_cleanup()
493 free_percpu(imsic->lpriv); in imsic_local_cleanup()
498 struct imsic_global_config *global = &imsic->global; in imsic_local_init()
504 imsic->lpriv = alloc_percpu(typeof(*imsic->lpriv)); in imsic_local_init()
505 if (!imsic->lpriv) in imsic_local_init()
510 lpriv = per_cpu_ptr(imsic->lpriv, cpu); in imsic_local_init()
550 raw_spin_lock_irqsave(&imsic->matrix_lock, flags); in imsic_state_online()
551 irq_matrix_online(imsic->matrix); in imsic_state_online()
552 raw_spin_unlock_irqrestore(&imsic->matrix_lock, flags); in imsic_state_online()
559 raw_spin_lock_irqsave(&imsic->matrix_lock, flags); in imsic_state_offline()
560 irq_matrix_offline(imsic->matrix); in imsic_state_offline()
561 raw_spin_unlock_irqrestore(&imsic->matrix_lock, flags); in imsic_state_offline()
564 struct imsic_local_priv *lpriv = this_cpu_ptr(imsic->lpriv); in imsic_state_offline()
574 struct imsic_global_config *global = &imsic->global; in imsic_matrix_init()
576 raw_spin_lock_init(&imsic->matrix_lock); in imsic_matrix_init()
577 imsic->matrix = irq_alloc_matrix(global->nr_ids + 1, in imsic_matrix_init()
579 if (!imsic->matrix) in imsic_matrix_init()
583 irq_matrix_assign_system(imsic->matrix, 0, false); in imsic_matrix_init()
587 irq_matrix_assign_system(imsic->matrix, IMSIC_IPI_ID, false); in imsic_matrix_init()
622 * If not specified assumed the default APLIC-IMSIC configuration. in imsic_populate_global_dt()
650 struct acpi_madt_imsic *imsic = (struct acpi_madt_imsic *)opaque; in imsic_populate_global_acpi() local
652 global->guest_index_bits = imsic->guest_index_bits; in imsic_populate_global_acpi()
653 global->hart_index_bits = imsic->hart_index_bits; in imsic_populate_global_acpi()
654 global->group_index_bits = imsic->group_index_bits; in imsic_populate_global_acpi()
655 global->group_index_shift = imsic->group_index_shift; in imsic_populate_global_acpi()
656 global->nr_ids = imsic->num_ids; in imsic_populate_global_acpi()
657 global->nr_guest_ids = imsic->num_guest_ids; in imsic_populate_global_acpi()
807 * Only one IMSIC instance allowed in a platform for clean in imsic_setup_state()
811 * will have multiple MMIO regions for one IMSIC instance. in imsic_setup_state()
813 if (imsic) { in imsic_setup_state()
823 imsic = kzalloc(sizeof(*imsic), GFP_KERNEL); in imsic_setup_state()
824 if (!imsic) in imsic_setup_state()
826 imsic->fwnode = fwnode; in imsic_setup_state()
827 global = &imsic->global; in imsic_setup_state()
835 /* Parse IMSIC fwnode */ in imsic_setup_state()
964 free_percpu(imsic->global.local); in imsic_setup_state()
966 kfree(imsic); in imsic_setup_state()
967 imsic = NULL; in imsic_setup_state()