Lines Matching refs:xive
72 struct kvmppc_xive *xive = xc->xive; in kvmppc_xive_check_save_restore() local
74 if (xive->flags & KVMPPC_XIVE_FLAG_SAVE_RESTORE) in kvmppc_xive_check_save_restore()
334 struct kvmppc_xive *xive = xc->xive; in xive_provision_queue() local
343 qpage = (__be32 *)__get_free_pages(GFP_KERNEL, xive->q_page_order); in xive_provision_queue()
349 memset(qpage, 0, 1 << xive->q_order); in xive_provision_queue()
359 xive->q_order, true); in xive_provision_queue()
369 struct kvmppc_xive *xive = kvm->arch.xive; in xive_check_provisioning() local
373 lockdep_assert_held(&xive->lock); in xive_check_provisioning()
376 if (xive->qmap & (1 << prio)) in xive_check_provisioning()
386 if (rc == 0 && !kvmppc_xive_has_single_escalation(xive)) in xive_check_provisioning()
388 kvmppc_xive_has_single_escalation(xive)); in xive_check_provisioning()
395 xive->qmap |= (1 << prio); in xive_check_provisioning()
477 static u8 xive_lock_and_mask(struct kvmppc_xive *xive, in xive_lock_and_mask() argument
536 static void xive_finish_unmask(struct kvmppc_xive *xive, in xive_finish_unmask() argument
580 struct kvmppc_xive *xive = kvm->arch.xive; in xive_target_interrupt() local
617 kvmppc_xive_vp(xive, server), in xive_target_interrupt()
664 struct kvmppc_xive *xive = kvm->arch.xive; in kvmppc_xive_set_xive() local
671 if (!xive) in kvmppc_xive_set_xive()
679 mutex_lock(&xive->lock); in kvmppc_xive_set_xive()
680 rc = xive_check_provisioning(xive->kvm, in kvmppc_xive_set_xive()
682 mutex_unlock(&xive->lock); in kvmppc_xive_set_xive()
689 sb = kvmppc_xive_find_source(xive, irq, &idx); in kvmppc_xive_set_xive()
709 xive_lock_and_mask(xive, sb, state); in kvmppc_xive_set_xive()
750 xive_finish_unmask(xive, sb, state, priority); in kvmppc_xive_set_xive()
765 struct kvmppc_xive *xive = kvm->arch.xive; in kvmppc_xive_get_xive() local
770 if (!xive) in kvmppc_xive_get_xive()
773 sb = kvmppc_xive_find_source(xive, irq, &idx); in kvmppc_xive_get_xive()
787 struct kvmppc_xive *xive = kvm->arch.xive; in kvmppc_xive_int_on() local
792 if (!xive) in kvmppc_xive_int_on()
795 sb = kvmppc_xive_find_source(xive, irq, &idx); in kvmppc_xive_int_on()
818 xive_finish_unmask(xive, sb, state, state->saved_priority); in kvmppc_xive_int_on()
826 struct kvmppc_xive *xive = kvm->arch.xive; in kvmppc_xive_int_off() local
831 if (!xive) in kvmppc_xive_int_off()
834 sb = kvmppc_xive_find_source(xive, irq, &idx); in kvmppc_xive_int_off()
844 state->saved_priority = xive_lock_and_mask(xive, sb, state); in kvmppc_xive_int_off()
850 static bool xive_restore_pending_irq(struct kvmppc_xive *xive, u32 irq) in xive_restore_pending_irq() argument
856 sb = kvmppc_xive_find_source(xive, irq, &idx); in xive_restore_pending_irq()
888 struct kvmppc_xive *xive = vcpu->kvm->arch.xive; in kvmppc_xive_set_icp() local
892 if (!xc || !xive) in kvmppc_xive_set_icp()
935 if (xisr > XICS_IPI && !xive_restore_pending_irq(xive, xisr)) { in kvmppc_xive_set_icp()
937 xive->delayed_irqs++; in kvmppc_xive_set_icp()
947 struct kvmppc_xive *xive = kvm->arch.xive; in kvmppc_xive_set_mapped() local
957 if (!xive) in kvmppc_xive_set_mapped()
963 sb = kvmppc_xive_find_source(xive, guest_irq, &idx); in kvmppc_xive_set_mapped()
992 prio = xive_lock_and_mask(xive, sb, state); in kvmppc_xive_set_mapped()
1003 if (xive->ops && xive->ops->reset_mapped) in kvmppc_xive_set_mapped()
1004 xive->ops->reset_mapped(kvm, guest_irq); in kvmppc_xive_set_mapped()
1017 kvmppc_xive_vp(xive, state->act_server), in kvmppc_xive_set_mapped()
1045 struct kvmppc_xive *xive = kvm->arch.xive; in kvmppc_xive_clr_mapped() local
1052 if (!xive) in kvmppc_xive_clr_mapped()
1057 sb = kvmppc_xive_find_source(xive, guest_irq, &idx); in kvmppc_xive_clr_mapped()
1067 prio = xive_lock_and_mask(xive, sb, state); in kvmppc_xive_clr_mapped()
1094 if (xive->ops && xive->ops->reset_mapped) { in kvmppc_xive_clr_mapped()
1095 xive->ops->reset_mapped(kvm, guest_irq); in kvmppc_xive_clr_mapped()
1100 kvmppc_xive_vp(xive, state->act_server), in kvmppc_xive_clr_mapped()
1126 struct kvmppc_xive *xive = kvm->arch.xive; in kvmppc_xive_disable_vcpu_interrupts() local
1129 for (i = 0; i <= xive->max_sbid; i++) { in kvmppc_xive_disable_vcpu_interrupts()
1130 struct kvmppc_xive_src_block *sb = xive->src_blocks[i]; in kvmppc_xive_disable_vcpu_interrupts()
1201 struct kvmppc_xive *xive = vcpu->kvm->arch.xive; in kvmppc_xive_cleanup_vcpu() local
1222 if (kvmppc_xive_has_single_escalation(xc->xive)) in kvmppc_xive_cleanup_vcpu()
1244 xive->q_page_order); in kvmppc_xive_cleanup_vcpu()
1262 static bool kvmppc_xive_vcpu_id_valid(struct kvmppc_xive *xive, u32 cpu) in kvmppc_xive_vcpu_id_valid() argument
1267 return kvmppc_pack_vcpu_id(xive->kvm, cpu) < xive->nr_servers; in kvmppc_xive_vcpu_id_valid()
1270 int kvmppc_xive_compute_vp_id(struct kvmppc_xive *xive, u32 cpu, u32 *vp) in kvmppc_xive_compute_vp_id() argument
1274 if (!kvmppc_xive_vcpu_id_valid(xive, cpu)) { in kvmppc_xive_compute_vp_id()
1279 if (xive->vp_base == XIVE_INVALID_VP) { in kvmppc_xive_compute_vp_id()
1280 xive->vp_base = xive_native_alloc_vp_block(xive->nr_servers); in kvmppc_xive_compute_vp_id()
1281 pr_devel("VP_Base=%x nr_servers=%d\n", xive->vp_base, xive->nr_servers); in kvmppc_xive_compute_vp_id()
1283 if (xive->vp_base == XIVE_INVALID_VP) in kvmppc_xive_compute_vp_id()
1287 vp_id = kvmppc_xive_vp(xive, cpu); in kvmppc_xive_compute_vp_id()
1288 if (kvmppc_xive_vp_in_use(xive->kvm, vp_id)) { in kvmppc_xive_compute_vp_id()
1301 struct kvmppc_xive *xive = dev->private; in kvmppc_xive_connect_vcpu() local
1312 if (xive->kvm != vcpu->kvm) in kvmppc_xive_connect_vcpu()
1318 mutex_lock(&xive->lock); in kvmppc_xive_connect_vcpu()
1320 r = kvmppc_xive_compute_vp_id(xive, cpu, &vp_id); in kvmppc_xive_connect_vcpu()
1331 xc->xive = xive; in kvmppc_xive_connect_vcpu()
1369 r = xive_native_enable_vp(xc->vp_id, kvmppc_xive_has_single_escalation(xive)); in kvmppc_xive_connect_vcpu()
1386 if (i == 7 && kvmppc_xive_has_single_escalation(xive)) in kvmppc_xive_connect_vcpu()
1390 if (xive->qmap & (1 << i)) { in kvmppc_xive_connect_vcpu()
1392 if (r == 0 && !kvmppc_xive_has_single_escalation(xive)) in kvmppc_xive_connect_vcpu()
1394 vcpu, i, kvmppc_xive_has_single_escalation(xive)); in kvmppc_xive_connect_vcpu()
1409 r = kvmppc_xive_attach_escalation(vcpu, 0, kvmppc_xive_has_single_escalation(xive)); in kvmppc_xive_connect_vcpu()
1419 mutex_unlock(&xive->lock); in kvmppc_xive_connect_vcpu()
1432 static void xive_pre_save_set_queued(struct kvmppc_xive *xive, u32 irq) in xive_pre_save_set_queued() argument
1438 sb = kvmppc_xive_find_source(xive, irq, &idx); in xive_pre_save_set_queued()
1462 static void xive_pre_save_mask_irq(struct kvmppc_xive *xive, in xive_pre_save_mask_irq() argument
1472 state->saved_scan_prio = xive_lock_and_mask(xive, sb, state); in xive_pre_save_mask_irq()
1482 static void xive_pre_save_unmask_irq(struct kvmppc_xive *xive, in xive_pre_save_unmask_irq() argument
1500 xive_finish_unmask(xive, sb, state, state->saved_scan_prio); in xive_pre_save_unmask_irq()
1506 static void xive_pre_save_queue(struct kvmppc_xive *xive, struct xive_q *q) in xive_pre_save_queue() argument
1515 xive_pre_save_set_queued(xive, irq); in xive_pre_save_queue()
1519 static void xive_pre_save_scan(struct kvmppc_xive *xive) in xive_pre_save_scan() argument
1528 for (i = 0; i <= xive->max_sbid; i++) { in xive_pre_save_scan()
1529 struct kvmppc_xive_src_block *sb = xive->src_blocks[i]; in xive_pre_save_scan()
1533 xive_pre_save_mask_irq(xive, sb, j); in xive_pre_save_scan()
1537 kvm_for_each_vcpu(i, vcpu, xive->kvm) { in xive_pre_save_scan()
1543 xive_pre_save_queue(xive, &xc->queues[j]); in xive_pre_save_scan()
1548 for (i = 0; i <= xive->max_sbid; i++) { in xive_pre_save_scan()
1549 struct kvmppc_xive_src_block *sb = xive->src_blocks[i]; in xive_pre_save_scan()
1553 xive_pre_save_unmask_irq(xive, sb, j); in xive_pre_save_scan()
1557 static void xive_post_save_scan(struct kvmppc_xive *xive) in xive_post_save_scan() argument
1562 for (i = 0; i <= xive->max_sbid; i++) { in xive_post_save_scan()
1563 struct kvmppc_xive_src_block *sb = xive->src_blocks[i]; in xive_post_save_scan()
1571 xive->saved_src_count = 0; in xive_post_save_scan()
1577 static int xive_get_source(struct kvmppc_xive *xive, long irq, u64 addr) in xive_get_source() argument
1585 sb = kvmppc_xive_find_source(xive, irq, &idx); in xive_get_source()
1612 if (xive->saved_src_count == 0) in xive_get_source()
1613 xive_pre_save_scan(xive); in xive_get_source()
1614 xive->saved_src_count++; in xive_get_source()
1650 if (xive->saved_src_count == xive->src_count) in xive_get_source()
1651 xive_post_save_scan(xive); in xive_get_source()
1661 struct kvmppc_xive *xive, int irq) in kvmppc_xive_create_src_block() argument
1668 mutex_lock(&xive->lock); in kvmppc_xive_create_src_block()
1671 if (xive->src_blocks[bid]) in kvmppc_xive_create_src_block()
1689 xive->src_blocks[bid] = sb; in kvmppc_xive_create_src_block()
1691 if (bid > xive->max_sbid) in kvmppc_xive_create_src_block()
1692 xive->max_sbid = bid; in kvmppc_xive_create_src_block()
1695 mutex_unlock(&xive->lock); in kvmppc_xive_create_src_block()
1696 return xive->src_blocks[bid]; in kvmppc_xive_create_src_block()
1699 static bool xive_check_delayed_irq(struct kvmppc_xive *xive, u32 irq) in xive_check_delayed_irq() argument
1701 struct kvm *kvm = xive->kvm; in xive_check_delayed_irq()
1713 xive->delayed_irqs--; in xive_check_delayed_irq()
1720 static int xive_set_source(struct kvmppc_xive *xive, long irq, u64 addr) in xive_set_source() argument
1737 sb = kvmppc_xive_find_source(xive, irq, &idx); in xive_set_source()
1740 sb = kvmppc_xive_create_src_block(xive, irq); in xive_set_source()
1782 xive_lock_and_mask(xive, sb, state); in xive_set_source()
1805 mutex_lock(&xive->lock); in xive_set_source()
1806 rc = xive_check_provisioning(xive->kvm, act_prio); in xive_set_source()
1807 mutex_unlock(&xive->lock); in xive_set_source()
1811 rc = xive_target_interrupt(xive->kvm, state, in xive_set_source()
1824 if (xive->delayed_irqs && xive_check_delayed_irq(xive, irq)) { in xive_set_source()
1871 xive_finish_unmask(xive, sb, state, guest_prio); in xive_set_source()
1877 xive->src_count++; in xive_set_source()
1886 struct kvmppc_xive *xive = kvm->arch.xive; in kvmppc_xive_set_irq() local
1891 if (!xive) in kvmppc_xive_set_irq()
1894 sb = kvmppc_xive_find_source(xive, irq, &idx); in kvmppc_xive_set_irq()
1920 int kvmppc_xive_set_nr_servers(struct kvmppc_xive *xive, u64 addr) in kvmppc_xive_set_nr_servers() argument
1934 mutex_lock(&xive->lock); in kvmppc_xive_set_nr_servers()
1935 if (xive->vp_base != XIVE_INVALID_VP) in kvmppc_xive_set_nr_servers()
1948 xive->nr_servers = KVM_MAX_VCPUS; in kvmppc_xive_set_nr_servers()
1950 xive->nr_servers = nr_servers; in kvmppc_xive_set_nr_servers()
1952 mutex_unlock(&xive->lock); in kvmppc_xive_set_nr_servers()
1959 struct kvmppc_xive *xive = dev->private; in xive_set_attr() local
1964 return xive_set_source(xive, attr->attr, attr->addr); in xive_set_attr()
1968 return kvmppc_xive_set_nr_servers(xive, attr->addr); in xive_set_attr()
1976 struct kvmppc_xive *xive = dev->private; in xive_get_attr() local
1981 return xive_get_source(xive, attr->attr, attr->addr); in xive_get_attr()
2037 struct kvmppc_xive *xive = dev->private; in kvmppc_xive_release() local
2038 struct kvm *kvm = xive->kvm; in kvmppc_xive_release()
2053 debugfs_remove(xive->dentry); in kvmppc_xive_release()
2078 kvm->arch.xive = NULL; in kvmppc_xive_release()
2081 for (i = 0; i <= xive->max_sbid; i++) { in kvmppc_xive_release()
2082 if (xive->src_blocks[i]) in kvmppc_xive_release()
2083 kvmppc_xive_free_sources(xive->src_blocks[i]); in kvmppc_xive_release()
2084 kfree(xive->src_blocks[i]); in kvmppc_xive_release()
2085 xive->src_blocks[i] = NULL; in kvmppc_xive_release()
2088 if (xive->vp_base != XIVE_INVALID_VP) in kvmppc_xive_release()
2089 xive_native_free_vp_block(xive->vp_base); in kvmppc_xive_release()
2115 struct kvmppc_xive *xive = *kvm_xive_device; in kvmppc_xive_get_device() local
2117 if (!xive) { in kvmppc_xive_get_device()
2118 xive = kzalloc(sizeof(*xive), GFP_KERNEL); in kvmppc_xive_get_device()
2119 *kvm_xive_device = xive; in kvmppc_xive_get_device()
2121 memset(xive, 0, sizeof(*xive)); in kvmppc_xive_get_device()
2124 return xive; in kvmppc_xive_get_device()
2132 struct kvmppc_xive *xive; in kvmppc_xive_create() local
2138 if (kvm->arch.xive) in kvmppc_xive_create()
2141 xive = kvmppc_xive_get_device(kvm, type); in kvmppc_xive_create()
2142 if (!xive) in kvmppc_xive_create()
2145 dev->private = xive; in kvmppc_xive_create()
2146 xive->dev = dev; in kvmppc_xive_create()
2147 xive->kvm = kvm; in kvmppc_xive_create()
2148 mutex_init(&xive->lock); in kvmppc_xive_create()
2151 xive->q_order = xive_native_default_eq_shift(); in kvmppc_xive_create()
2152 if (xive->q_order < PAGE_SHIFT) in kvmppc_xive_create()
2153 xive->q_page_order = 0; in kvmppc_xive_create()
2155 xive->q_page_order = xive->q_order - PAGE_SHIFT; in kvmppc_xive_create()
2158 xive->vp_base = XIVE_INVALID_VP; in kvmppc_xive_create()
2162 xive->nr_servers = KVM_MAX_VCPUS; in kvmppc_xive_create()
2165 xive->flags |= KVMPPC_XIVE_FLAG_SINGLE_ESCALATION; in kvmppc_xive_create()
2168 xive->flags |= KVMPPC_XIVE_FLAG_SAVE_RESTORE; in kvmppc_xive_create()
2170 kvm->arch.xive = xive; in kvmppc_xive_create()
2281 struct kvmppc_xive *xive = m->private; in xive_debug_show() local
2282 struct kvm *kvm = xive->kvm; in xive_debug_show()
2337 for (i = 0; i <= xive->max_sbid; i++) { in xive_debug_show()
2338 struct kvmppc_xive_src_block *sb = xive->src_blocks[i]; in xive_debug_show()
2352 static void xive_debugfs_init(struct kvmppc_xive *xive) in xive_debugfs_init() argument
2356 name = kasprintf(GFP_KERNEL, "kvm-xive-%p", xive); in xive_debugfs_init()
2362 xive->dentry = debugfs_create_file(name, S_IRUGO, arch_debugfs_dir, in xive_debugfs_init()
2363 xive, &xive_debug_fops); in xive_debugfs_init()
2371 struct kvmppc_xive *xive = (struct kvmppc_xive *)dev->private; in kvmppc_xive_init() local
2374 xive_debugfs_init(xive); in kvmppc_xive_init()