• Home
  • Raw
  • Download

Lines Matching refs:xive

248 	struct kvmppc_xive *xive = xc->xive;  in xive_provision_queue()  local
257 qpage = (__be32 *)__get_free_pages(GFP_KERNEL, xive->q_page_order); in xive_provision_queue()
263 memset(qpage, 0, 1 << xive->q_order); in xive_provision_queue()
273 xive->q_order, true); in xive_provision_queue()
283 struct kvmppc_xive *xive = kvm->arch.xive; in xive_check_provisioning() local
287 lockdep_assert_held(&xive->lock); in xive_check_provisioning()
290 if (xive->qmap & (1 << prio)) in xive_check_provisioning()
300 if (rc == 0 && !xive->single_escalation) in xive_check_provisioning()
302 xive->single_escalation); in xive_check_provisioning()
309 xive->qmap |= (1 << prio); in xive_check_provisioning()
391 static u8 xive_lock_and_mask(struct kvmppc_xive *xive, in xive_lock_and_mask() argument
436 kvmppc_xive_vp(xive, state->act_server), in xive_lock_and_mask()
471 static void xive_finish_unmask(struct kvmppc_xive *xive, in xive_finish_unmask() argument
492 kvmppc_xive_vp(xive, state->act_server), in xive_finish_unmask()
532 struct kvmppc_xive *xive = kvm->arch.xive; in xive_target_interrupt() local
569 kvmppc_xive_vp(xive, server), in xive_target_interrupt()
616 struct kvmppc_xive *xive = kvm->arch.xive; in kvmppc_xive_set_xive() local
623 if (!xive) in kvmppc_xive_set_xive()
631 mutex_lock(&xive->lock); in kvmppc_xive_set_xive()
632 rc = xive_check_provisioning(xive->kvm, in kvmppc_xive_set_xive()
634 mutex_unlock(&xive->lock); in kvmppc_xive_set_xive()
641 sb = kvmppc_xive_find_source(xive, irq, &idx); in kvmppc_xive_set_xive()
661 xive_lock_and_mask(xive, sb, state); in kvmppc_xive_set_xive()
702 xive_finish_unmask(xive, sb, state, priority); in kvmppc_xive_set_xive()
717 struct kvmppc_xive *xive = kvm->arch.xive; in kvmppc_xive_get_xive() local
722 if (!xive) in kvmppc_xive_get_xive()
725 sb = kvmppc_xive_find_source(xive, irq, &idx); in kvmppc_xive_get_xive()
739 struct kvmppc_xive *xive = kvm->arch.xive; in kvmppc_xive_int_on() local
744 if (!xive) in kvmppc_xive_int_on()
747 sb = kvmppc_xive_find_source(xive, irq, &idx); in kvmppc_xive_int_on()
770 xive_finish_unmask(xive, sb, state, state->saved_priority); in kvmppc_xive_int_on()
778 struct kvmppc_xive *xive = kvm->arch.xive; in kvmppc_xive_int_off() local
783 if (!xive) in kvmppc_xive_int_off()
786 sb = kvmppc_xive_find_source(xive, irq, &idx); in kvmppc_xive_int_off()
796 state->saved_priority = xive_lock_and_mask(xive, sb, state); in kvmppc_xive_int_off()
802 static bool xive_restore_pending_irq(struct kvmppc_xive *xive, u32 irq) in xive_restore_pending_irq() argument
808 sb = kvmppc_xive_find_source(xive, irq, &idx); in xive_restore_pending_irq()
840 struct kvmppc_xive *xive = vcpu->kvm->arch.xive; in kvmppc_xive_set_icp() local
844 if (!xc || !xive) in kvmppc_xive_set_icp()
887 if (xisr > XICS_IPI && !xive_restore_pending_irq(xive, xisr)) { in kvmppc_xive_set_icp()
889 xive->delayed_irqs++; in kvmppc_xive_set_icp()
899 struct kvmppc_xive *xive = kvm->arch.xive; in kvmppc_xive_set_mapped() local
909 if (!xive) in kvmppc_xive_set_mapped()
914 sb = kvmppc_xive_find_source(xive, guest_irq, &idx); in kvmppc_xive_set_mapped()
943 prio = xive_lock_and_mask(xive, sb, state); in kvmppc_xive_set_mapped()
954 if (xive->ops && xive->ops->reset_mapped) in kvmppc_xive_set_mapped()
955 xive->ops->reset_mapped(kvm, guest_irq); in kvmppc_xive_set_mapped()
968 kvmppc_xive_vp(xive, state->act_server), in kvmppc_xive_set_mapped()
996 struct kvmppc_xive *xive = kvm->arch.xive; in kvmppc_xive_clr_mapped() local
1004 if (!xive) in kvmppc_xive_clr_mapped()
1009 sb = kvmppc_xive_find_source(xive, guest_irq, &idx); in kvmppc_xive_clr_mapped()
1019 prio = xive_lock_and_mask(xive, sb, state); in kvmppc_xive_clr_mapped()
1046 if (xive->ops && xive->ops->reset_mapped) { in kvmppc_xive_clr_mapped()
1047 xive->ops->reset_mapped(kvm, guest_irq); in kvmppc_xive_clr_mapped()
1052 kvmppc_xive_vp(xive, state->act_server), in kvmppc_xive_clr_mapped()
1078 struct kvmppc_xive *xive = kvm->arch.xive; in kvmppc_xive_disable_vcpu_interrupts() local
1081 for (i = 0; i <= xive->max_sbid; i++) { in kvmppc_xive_disable_vcpu_interrupts()
1082 struct kvmppc_xive_src_block *sb = xive->src_blocks[i]; in kvmppc_xive_disable_vcpu_interrupts()
1153 struct kvmppc_xive *xive = vcpu->kvm->arch.xive; in kvmppc_xive_cleanup_vcpu() local
1174 if (xc->xive->single_escalation) in kvmppc_xive_cleanup_vcpu()
1196 xive->q_page_order); in kvmppc_xive_cleanup_vcpu()
1214 static bool kvmppc_xive_vcpu_id_valid(struct kvmppc_xive *xive, u32 cpu) in kvmppc_xive_vcpu_id_valid() argument
1219 return kvmppc_pack_vcpu_id(xive->kvm, cpu) < xive->nr_servers; in kvmppc_xive_vcpu_id_valid()
1222 int kvmppc_xive_compute_vp_id(struct kvmppc_xive *xive, u32 cpu, u32 *vp) in kvmppc_xive_compute_vp_id() argument
1226 if (!kvmppc_xive_vcpu_id_valid(xive, cpu)) { in kvmppc_xive_compute_vp_id()
1231 if (xive->vp_base == XIVE_INVALID_VP) { in kvmppc_xive_compute_vp_id()
1232 xive->vp_base = xive_native_alloc_vp_block(xive->nr_servers); in kvmppc_xive_compute_vp_id()
1233 pr_devel("VP_Base=%x nr_servers=%d\n", xive->vp_base, xive->nr_servers); in kvmppc_xive_compute_vp_id()
1235 if (xive->vp_base == XIVE_INVALID_VP) in kvmppc_xive_compute_vp_id()
1239 vp_id = kvmppc_xive_vp(xive, cpu); in kvmppc_xive_compute_vp_id()
1240 if (kvmppc_xive_vp_in_use(xive->kvm, vp_id)) { in kvmppc_xive_compute_vp_id()
1253 struct kvmppc_xive *xive = dev->private; in kvmppc_xive_connect_vcpu() local
1264 if (xive->kvm != vcpu->kvm) in kvmppc_xive_connect_vcpu()
1270 mutex_lock(&xive->lock); in kvmppc_xive_connect_vcpu()
1272 r = kvmppc_xive_compute_vp_id(xive, cpu, &vp_id); in kvmppc_xive_connect_vcpu()
1283 xc->xive = xive; in kvmppc_xive_connect_vcpu()
1315 r = xive_native_enable_vp(xc->vp_id, xive->single_escalation); in kvmppc_xive_connect_vcpu()
1332 if (i == 7 && xive->single_escalation) in kvmppc_xive_connect_vcpu()
1336 if (xive->qmap & (1 << i)) { in kvmppc_xive_connect_vcpu()
1338 if (r == 0 && !xive->single_escalation) in kvmppc_xive_connect_vcpu()
1340 vcpu, i, xive->single_escalation); in kvmppc_xive_connect_vcpu()
1355 r = kvmppc_xive_attach_escalation(vcpu, 0, xive->single_escalation); in kvmppc_xive_connect_vcpu()
1365 mutex_unlock(&xive->lock); in kvmppc_xive_connect_vcpu()
1378 static void xive_pre_save_set_queued(struct kvmppc_xive *xive, u32 irq) in xive_pre_save_set_queued() argument
1384 sb = kvmppc_xive_find_source(xive, irq, &idx); in xive_pre_save_set_queued()
1408 static void xive_pre_save_mask_irq(struct kvmppc_xive *xive, in xive_pre_save_mask_irq() argument
1418 state->saved_scan_prio = xive_lock_and_mask(xive, sb, state); in xive_pre_save_mask_irq()
1428 static void xive_pre_save_unmask_irq(struct kvmppc_xive *xive, in xive_pre_save_unmask_irq() argument
1446 xive_finish_unmask(xive, sb, state, state->saved_scan_prio); in xive_pre_save_unmask_irq()
1452 static void xive_pre_save_queue(struct kvmppc_xive *xive, struct xive_q *q) in xive_pre_save_queue() argument
1461 xive_pre_save_set_queued(xive, irq); in xive_pre_save_queue()
1465 static void xive_pre_save_scan(struct kvmppc_xive *xive) in xive_pre_save_scan() argument
1474 for (i = 0; i <= xive->max_sbid; i++) { in xive_pre_save_scan()
1475 struct kvmppc_xive_src_block *sb = xive->src_blocks[i]; in xive_pre_save_scan()
1479 xive_pre_save_mask_irq(xive, sb, j); in xive_pre_save_scan()
1483 kvm_for_each_vcpu(i, vcpu, xive->kvm) { in xive_pre_save_scan()
1489 xive_pre_save_queue(xive, &xc->queues[j]); in xive_pre_save_scan()
1494 for (i = 0; i <= xive->max_sbid; i++) { in xive_pre_save_scan()
1495 struct kvmppc_xive_src_block *sb = xive->src_blocks[i]; in xive_pre_save_scan()
1499 xive_pre_save_unmask_irq(xive, sb, j); in xive_pre_save_scan()
1503 static void xive_post_save_scan(struct kvmppc_xive *xive) in xive_post_save_scan() argument
1508 for (i = 0; i <= xive->max_sbid; i++) { in xive_post_save_scan()
1509 struct kvmppc_xive_src_block *sb = xive->src_blocks[i]; in xive_post_save_scan()
1517 xive->saved_src_count = 0; in xive_post_save_scan()
1523 static int xive_get_source(struct kvmppc_xive *xive, long irq, u64 addr) in xive_get_source() argument
1531 sb = kvmppc_xive_find_source(xive, irq, &idx); in xive_get_source()
1558 if (xive->saved_src_count == 0) in xive_get_source()
1559 xive_pre_save_scan(xive); in xive_get_source()
1560 xive->saved_src_count++; in xive_get_source()
1596 if (xive->saved_src_count == xive->src_count) in xive_get_source()
1597 xive_post_save_scan(xive); in xive_get_source()
1607 struct kvmppc_xive *xive, int irq) in kvmppc_xive_create_src_block() argument
1614 mutex_lock(&xive->lock); in kvmppc_xive_create_src_block()
1617 if (xive->src_blocks[bid]) in kvmppc_xive_create_src_block()
1635 xive->src_blocks[bid] = sb; in kvmppc_xive_create_src_block()
1637 if (bid > xive->max_sbid) in kvmppc_xive_create_src_block()
1638 xive->max_sbid = bid; in kvmppc_xive_create_src_block()
1641 mutex_unlock(&xive->lock); in kvmppc_xive_create_src_block()
1642 return xive->src_blocks[bid]; in kvmppc_xive_create_src_block()
1645 static bool xive_check_delayed_irq(struct kvmppc_xive *xive, u32 irq) in xive_check_delayed_irq() argument
1647 struct kvm *kvm = xive->kvm; in xive_check_delayed_irq()
1659 xive->delayed_irqs--; in xive_check_delayed_irq()
1666 static int xive_set_source(struct kvmppc_xive *xive, long irq, u64 addr) in xive_set_source() argument
1683 sb = kvmppc_xive_find_source(xive, irq, &idx); in xive_set_source()
1686 sb = kvmppc_xive_create_src_block(xive, irq); in xive_set_source()
1728 xive_lock_and_mask(xive, sb, state); in xive_set_source()
1751 mutex_lock(&xive->lock); in xive_set_source()
1752 rc = xive_check_provisioning(xive->kvm, act_prio); in xive_set_source()
1753 mutex_unlock(&xive->lock); in xive_set_source()
1757 rc = xive_target_interrupt(xive->kvm, state, in xive_set_source()
1770 if (xive->delayed_irqs && xive_check_delayed_irq(xive, irq)) { in xive_set_source()
1817 xive_finish_unmask(xive, sb, state, guest_prio); in xive_set_source()
1823 xive->src_count++; in xive_set_source()
1832 struct kvmppc_xive *xive = kvm->arch.xive; in kvmppc_xive_set_irq() local
1837 if (!xive) in kvmppc_xive_set_irq()
1840 sb = kvmppc_xive_find_source(xive, irq, &idx); in kvmppc_xive_set_irq()
1866 int kvmppc_xive_set_nr_servers(struct kvmppc_xive *xive, u64 addr) in kvmppc_xive_set_nr_servers() argument
1880 mutex_lock(&xive->lock); in kvmppc_xive_set_nr_servers()
1881 if (xive->vp_base != XIVE_INVALID_VP) in kvmppc_xive_set_nr_servers()
1894 xive->nr_servers = KVM_MAX_VCPUS; in kvmppc_xive_set_nr_servers()
1896 xive->nr_servers = nr_servers; in kvmppc_xive_set_nr_servers()
1898 mutex_unlock(&xive->lock); in kvmppc_xive_set_nr_servers()
1905 struct kvmppc_xive *xive = dev->private; in xive_set_attr() local
1910 return xive_set_source(xive, attr->attr, attr->addr); in xive_set_attr()
1914 return kvmppc_xive_set_nr_servers(xive, attr->addr); in xive_set_attr()
1922 struct kvmppc_xive *xive = dev->private; in xive_get_attr() local
1927 return xive_get_source(xive, attr->attr, attr->addr); in xive_get_attr()
1983 struct kvmppc_xive *xive = dev->private; in kvmppc_xive_release() local
1984 struct kvm *kvm = xive->kvm; in kvmppc_xive_release()
1999 debugfs_remove(xive->dentry); in kvmppc_xive_release()
2024 kvm->arch.xive = NULL; in kvmppc_xive_release()
2027 for (i = 0; i <= xive->max_sbid; i++) { in kvmppc_xive_release()
2028 if (xive->src_blocks[i]) in kvmppc_xive_release()
2029 kvmppc_xive_free_sources(xive->src_blocks[i]); in kvmppc_xive_release()
2030 kfree(xive->src_blocks[i]); in kvmppc_xive_release()
2031 xive->src_blocks[i] = NULL; in kvmppc_xive_release()
2034 if (xive->vp_base != XIVE_INVALID_VP) in kvmppc_xive_release()
2035 xive_native_free_vp_block(xive->vp_base); in kvmppc_xive_release()
2061 struct kvmppc_xive *xive = *kvm_xive_device; in kvmppc_xive_get_device() local
2063 if (!xive) { in kvmppc_xive_get_device()
2064 xive = kzalloc(sizeof(*xive), GFP_KERNEL); in kvmppc_xive_get_device()
2065 *kvm_xive_device = xive; in kvmppc_xive_get_device()
2067 memset(xive, 0, sizeof(*xive)); in kvmppc_xive_get_device()
2070 return xive; in kvmppc_xive_get_device()
2078 struct kvmppc_xive *xive; in kvmppc_xive_create() local
2084 if (kvm->arch.xive) in kvmppc_xive_create()
2087 xive = kvmppc_xive_get_device(kvm, type); in kvmppc_xive_create()
2088 if (!xive) in kvmppc_xive_create()
2091 dev->private = xive; in kvmppc_xive_create()
2092 xive->dev = dev; in kvmppc_xive_create()
2093 xive->kvm = kvm; in kvmppc_xive_create()
2094 mutex_init(&xive->lock); in kvmppc_xive_create()
2097 xive->q_order = xive_native_default_eq_shift(); in kvmppc_xive_create()
2098 if (xive->q_order < PAGE_SHIFT) in kvmppc_xive_create()
2099 xive->q_page_order = 0; in kvmppc_xive_create()
2101 xive->q_page_order = xive->q_order - PAGE_SHIFT; in kvmppc_xive_create()
2104 xive->vp_base = XIVE_INVALID_VP; in kvmppc_xive_create()
2108 xive->nr_servers = KVM_MAX_VCPUS; in kvmppc_xive_create()
2110 xive->single_escalation = xive_native_has_single_escalation(); in kvmppc_xive_create()
2112 kvm->arch.xive = xive; in kvmppc_xive_create()
2156 struct kvmppc_xive *xive = m->private; in xive_debug_show() local
2157 struct kvm *kvm = xive->kvm; in xive_debug_show()
2214 static void xive_debugfs_init(struct kvmppc_xive *xive) in xive_debugfs_init() argument
2218 name = kasprintf(GFP_KERNEL, "kvm-xive-%p", xive); in xive_debugfs_init()
2224 xive->dentry = debugfs_create_file(name, S_IRUGO, powerpc_debugfs_root, in xive_debugfs_init()
2225 xive, &xive_debug_fops); in xive_debugfs_init()
2233 struct kvmppc_xive *xive = (struct kvmppc_xive *)dev->private; in kvmppc_xive_init() local
2236 xive_debugfs_init(xive); in kvmppc_xive_init()