Lines Matching full:ics

39  * Each ICS has a spin lock protecting the information about the IRQ
51 * ICS
55 * - Make ICS lockless as well, or at least a per-interrupt lock or hashed
59 /* -- ICS routines -- */
72 struct kvmppc_ics *ics; in ics_deliver_irq() local
76 XICS_DBG("ics deliver %#x (level: %d)\n", irq, level); in ics_deliver_irq()
78 ics = kvmppc_xics_find_ics(xics, irq, &src); in ics_deliver_irq()
79 if (!ics) { in ics_deliver_irq()
83 state = &ics->irq_state[src]; in ics_deliver_irq()
125 static void ics_check_resend(struct kvmppc_xics *xics, struct kvmppc_ics *ics, in ics_check_resend() argument
131 struct ics_irq_state *state = &ics->irq_state[i]; in ics_check_resend()
140 static bool write_xive(struct kvmppc_xics *xics, struct kvmppc_ics *ics, in write_xive() argument
148 arch_spin_lock(&ics->lock); in write_xive()
160 arch_spin_unlock(&ics->lock); in write_xive()
170 struct kvmppc_ics *ics; in kvmppc_xics_set_xive() local
177 ics = kvmppc_xics_find_ics(xics, irq, &src); in kvmppc_xics_set_xive()
178 if (!ics) in kvmppc_xics_set_xive()
180 state = &ics->irq_state[src]; in kvmppc_xics_set_xive()
190 if (write_xive(xics, ics, state, server, priority, priority)) in kvmppc_xics_set_xive()
199 struct kvmppc_ics *ics; in kvmppc_xics_get_xive() local
207 ics = kvmppc_xics_find_ics(xics, irq, &src); in kvmppc_xics_get_xive()
208 if (!ics) in kvmppc_xics_get_xive()
210 state = &ics->irq_state[src]; in kvmppc_xics_get_xive()
213 arch_spin_lock(&ics->lock); in kvmppc_xics_get_xive()
216 arch_spin_unlock(&ics->lock); in kvmppc_xics_get_xive()
226 struct kvmppc_ics *ics; in kvmppc_xics_int_on() local
233 ics = kvmppc_xics_find_ics(xics, irq, &src); in kvmppc_xics_int_on()
234 if (!ics) in kvmppc_xics_int_on()
236 state = &ics->irq_state[src]; in kvmppc_xics_int_on()
242 if (write_xive(xics, ics, state, state->server, state->saved_priority, in kvmppc_xics_int_on()
252 struct kvmppc_ics *ics; in kvmppc_xics_int_off() local
259 ics = kvmppc_xics_find_ics(xics, irq, &src); in kvmppc_xics_int_off()
260 if (!ics) in kvmppc_xics_int_off()
262 state = &ics->irq_state[src]; in kvmppc_xics_int_off()
264 write_xive(xics, ics, state, state->server, MASKED, state->priority); in kvmppc_xics_int_off()
326 struct kvmppc_ics *ics = xics->ics[icsid]; in icp_check_resend() local
330 if (!ics) in icp_check_resend()
332 ics_check_resend(xics, ics, icp); in icp_check_resend()
381 struct kvmppc_ics *ics; in icp_deliver_irq() local
402 /* Get the ICS state and lock it */ in icp_deliver_irq()
403 ics = kvmppc_xics_find_ics(xics, new_irq, &src); in icp_deliver_irq()
404 if (!ics) { in icp_deliver_irq()
408 state = &ics->irq_state[src]; in icp_deliver_irq()
410 /* Get a lock on the ICS */ in icp_deliver_irq()
412 arch_spin_lock(&ics->lock); in icp_deliver_irq()
459 * ics spin lock. in icp_deliver_irq()
473 arch_spin_unlock(&ics->lock); in icp_deliver_irq()
482 * resend map bit and mark the ICS state as needing a resend in icp_deliver_irq()
491 set_bit(ics->icsid, icp->resend_map); in icp_deliver_irq()
502 arch_spin_unlock(&ics->lock); in icp_deliver_irq()
509 arch_spin_unlock(&ics->lock); in icp_deliver_irq()
530 * and notify ICS of a potential resend. This is done in icp_down_cppr()
781 struct kvmppc_ics *ics; in ics_eoi() local
787 * ICS EOI handling: For LSI, if P bit is still set, we need to in ics_eoi()
794 ics = kvmppc_xics_find_ics(xics, irq, &src); in ics_eoi()
795 if (!ics) { in ics_eoi()
799 state = &ics->irq_state[src]; in ics_eoi()
833 * The sending of an EOI to the ICS is handled after the in kvmppc_h_eoi()
989 struct kvmppc_ics *ics = xics->ics[icsid]; in xics_debug_show() local
991 if (!ics) in xics_debug_show()
994 seq_printf(m, "=========\nICS state for ICS 0x%x\n=========\n", in xics_debug_show()
998 arch_spin_lock(&ics->lock); in xics_debug_show()
1001 struct ics_irq_state *irq = &ics->irq_state[i]; in xics_debug_show()
1009 arch_spin_unlock(&ics->lock); in xics_debug_show()
1037 struct kvmppc_ics *ics; in kvmppc_xics_create_ics() local
1044 /* ICS already exists - somebody else got here first */ in kvmppc_xics_create_ics()
1045 if (xics->ics[icsid]) in kvmppc_xics_create_ics()
1048 /* Create the ICS */ in kvmppc_xics_create_ics()
1049 ics = kzalloc(sizeof(struct kvmppc_ics), GFP_KERNEL); in kvmppc_xics_create_ics()
1050 if (!ics) in kvmppc_xics_create_ics()
1053 ics->icsid = icsid; in kvmppc_xics_create_ics()
1056 ics->irq_state[i].number = (icsid << KVMPPC_XICS_ICS_SHIFT) | i; in kvmppc_xics_create_ics()
1057 ics->irq_state[i].priority = MASKED; in kvmppc_xics_create_ics()
1058 ics->irq_state[i].saved_priority = MASKED; in kvmppc_xics_create_ics()
1061 xics->ics[icsid] = ics; in kvmppc_xics_create_ics()
1068 return xics->ics[icsid]; in kvmppc_xics_create_ics()
1115 struct kvmppc_ics *ics; in kvmppc_xics_set_icp() local
1140 ics = kvmppc_xics_find_ics(xics, xisr, &src); in kvmppc_xics_set_icp()
1141 if (!ics) in kvmppc_xics_set_icp()
1165 * the ICS states before the ICP states. in kvmppc_xics_set_icp()
1188 struct kvmppc_ics *ics; in xics_get_source() local
1195 ics = kvmppc_xics_find_ics(xics, irq, &idx); in xics_get_source()
1196 if (!ics) in xics_get_source()
1199 irqp = &ics->irq_state[idx]; in xics_get_source()
1201 arch_spin_lock(&ics->lock); in xics_get_source()
1226 arch_spin_unlock(&ics->lock); in xics_get_source()
1237 struct kvmppc_ics *ics; in xics_set_source() local
1249 ics = kvmppc_xics_find_ics(xics, irq, &idx); in xics_set_source()
1250 if (!ics) { in xics_set_source()
1251 ics = kvmppc_xics_create_ics(xics->kvm, xics, irq); in xics_set_source()
1252 if (!ics) in xics_set_source()
1255 irqp = &ics->irq_state[idx]; in xics_set_source()
1266 arch_spin_lock(&ics->lock); in xics_set_source()
1284 arch_spin_unlock(&ics->lock); in xics_set_source()
1382 kfree(xics->ics[i]); in kvmppc_xics_release()
1383 xics->ics[i] = NULL; in kvmppc_xics_release()
1491 struct kvmppc_ics *ics; in kvmppc_xics_set_mapped() local
1494 ics = kvmppc_xics_find_ics(xics, irq, &idx); in kvmppc_xics_set_mapped()
1495 if (!ics) in kvmppc_xics_set_mapped()
1498 ics->irq_state[idx].host_irq = host_irq; in kvmppc_xics_set_mapped()
1499 ics->irq_state[idx].intr_cpu = -1; in kvmppc_xics_set_mapped()
1507 struct kvmppc_ics *ics; in kvmppc_xics_clr_mapped() local
1510 ics = kvmppc_xics_find_ics(xics, irq, &idx); in kvmppc_xics_clr_mapped()
1511 if (!ics) in kvmppc_xics_clr_mapped()
1514 ics->irq_state[idx].host_irq = 0; in kvmppc_xics_clr_mapped()