Lines Matching +full:long +full:- +full:summary

1 // SPDX-License-Identifier: GPL-2.0
25 * summary bit vector
26 * FLOATING - summary bit per function
27 * DIRECTED - summary bit per cpu (only used in fallback path)
33 * FLOATING - interrupt bit vector per function
34 * DIRECTED - interrupt bit vector per cpu
41 u64 req = ZPCI_CREATE_REQ(zdev->fh, 0, ZPCI_MOD_FC_REG_INT); in zpci_set_airq()
46 fib.fmt0.sum = 1; /* enable summary notifications */ in zpci_set_airq()
47 fib.fmt0.noi = airq_iv_end(zdev->aibv); in zpci_set_airq()
48 fib.fmt0.aibv = (unsigned long) zdev->aibv->vector; in zpci_set_airq()
50 fib.fmt0.aisb = (unsigned long) zpci_sbv->vector + (zdev->aisb/64)*8; in zpci_set_airq()
51 fib.fmt0.aisbo = zdev->aisb & 63; in zpci_set_airq()
53 return zpci_mod_fc(req, &fib, &status) ? -EIO : 0; in zpci_set_airq()
59 u64 req = ZPCI_CREATE_REQ(zdev->fh, 0, ZPCI_MOD_FC_DEREG_INT); in zpci_clear_airq()
68 return cc ? -EIO : 0; in zpci_clear_airq()
74 u64 req = ZPCI_CREATE_REQ(zdev->fh, 0, ZPCI_MOD_FC_REG_INT_D); in zpci_set_directed_irq()
79 fib.fmt1.noi = zdev->msi_nr_irqs; in zpci_set_directed_irq()
80 fib.fmt1.dibvo = zdev->msi_first_bit; in zpci_set_directed_irq()
82 return zpci_mod_fc(req, &fib, &status) ? -EIO : 0; in zpci_set_directed_irq()
88 u64 req = ZPCI_CREATE_REQ(zdev->fh, 0, ZPCI_MOD_FC_DEREG_INT_D); in zpci_clear_directed_irq()
98 return cc ? -EIO : 0; in zpci_clear_directed_irq()
104 struct msi_desc *entry = irq_get_msi_desc(data->irq); in zpci_set_irq_affinity()
105 struct msi_msg msg = entry->msg; in zpci_set_irq_affinity()
110 pci_write_msi_msg(data->irq, &msg); in zpci_set_irq_affinity()
116 .name = "PCI-MSI",
124 unsigned long bit; in zpci_handle_cpu_local_irq()
130 if (bit == -1UL) { in zpci_handle_cpu_local_irq()
163 unsigned long cpu; in zpci_handle_fallback_irq()
168 if (cpu == -1UL) { in zpci_handle_fallback_irq()
179 if (atomic_inc_return(&cpu_data->scheduled) > 1) in zpci_handle_fallback_irq()
182 cpu_data->csd.func = zpci_handle_remote_irq; in zpci_handle_fallback_irq()
183 cpu_data->csd.info = &cpu_data->scheduled; in zpci_handle_fallback_irq()
184 cpu_data->csd.flags = 0; in zpci_handle_fallback_irq()
185 smp_call_function_single_async(cpu, &cpu_data->csd); in zpci_handle_fallback_irq()
202 unsigned long si, ai; in zpci_floating_irq_handler()
208 /* Scan adapter summary indicator bit vector */ in zpci_floating_irq_handler()
210 if (si == -1UL) { in zpci_floating_irq_handler()
225 if (ai == -1UL) in zpci_floating_irq_handler()
239 unsigned long bit; in arch_setup_msi_irqs()
245 zdev->aisb = -1UL; in arch_setup_msi_irqs()
246 zdev->msi_first_bit = -1U; in arch_setup_msi_irqs()
249 msi_vecs = min_t(unsigned int, nvec, zdev->max_msi); in arch_setup_msi_irqs()
254 if (bit == -1UL) in arch_setup_msi_irqs()
255 return -EIO; in arch_setup_msi_irqs()
257 /* Allocate adapter summary indicator bit */ in arch_setup_msi_irqs()
259 if (bit == -1UL) in arch_setup_msi_irqs()
260 return -EIO; in arch_setup_msi_irqs()
261 zdev->aisb = bit; in arch_setup_msi_irqs()
264 zdev->aibv = airq_iv_create(msi_vecs, AIRQ_IV_DATA | AIRQ_IV_BITLOCK); in arch_setup_msi_irqs()
265 if (!zdev->aibv) in arch_setup_msi_irqs()
266 return -ENOMEM; in arch_setup_msi_irqs()
269 zpci_ibv[bit] = zdev->aibv; in arch_setup_msi_irqs()
277 rc = -EIO; in arch_setup_msi_irqs()
278 if (hwirq - bit >= msi_vecs) in arch_setup_msi_irqs()
280 irq = __irq_alloc_descs(-1, 0, 1, 0, THIS_MODULE, in arch_setup_msi_irqs()
282 msi->affinity : NULL); in arch_setup_msi_irqs()
284 return -ENOMEM; in arch_setup_msi_irqs()
290 msg.data = hwirq - bit; in arch_setup_msi_irqs()
292 if (msi->affinity) in arch_setup_msi_irqs()
293 cpu = cpumask_first(&msi->affinity->mask); in arch_setup_msi_irqs()
298 msg.address_lo = zdev->msi_addr & 0xff0000ff; in arch_setup_msi_irqs()
305 msg.address_lo = zdev->msi_addr & 0xffffffff; in arch_setup_msi_irqs()
306 airq_iv_set_data(zdev->aibv, hwirq, irq); in arch_setup_msi_irqs()
308 msg.address_hi = zdev->msi_addr >> 32; in arch_setup_msi_irqs()
313 zdev->msi_first_bit = bit; in arch_setup_msi_irqs()
314 zdev->msi_nr_irqs = msi_vecs; in arch_setup_msi_irqs()
342 if (!msi->irq) in arch_teardown_msi_irqs()
344 if (msi->msi_attrib.is_msix) in arch_teardown_msi_irqs()
348 irq_set_msi_desc(msi->irq, NULL); in arch_teardown_msi_irqs()
349 irq_free_desc(msi->irq); in arch_teardown_msi_irqs()
350 msi->msg.address_lo = 0; in arch_teardown_msi_irqs()
351 msi->msg.address_hi = 0; in arch_teardown_msi_irqs()
352 msi->msg.data = 0; in arch_teardown_msi_irqs()
353 msi->irq = 0; in arch_teardown_msi_irqs()
356 if (zdev->aisb != -1UL) { in arch_teardown_msi_irqs()
357 zpci_ibv[zdev->aisb] = NULL; in arch_teardown_msi_irqs()
358 airq_iv_free_bit(zpci_sbv, zdev->aisb); in arch_teardown_msi_irqs()
359 zdev->aisb = -1UL; in arch_teardown_msi_irqs()
361 if (zdev->aibv) { in arch_teardown_msi_irqs()
362 airq_iv_release(zdev->aibv); in arch_teardown_msi_irqs()
363 zdev->aibv = NULL; in arch_teardown_msi_irqs()
366 if ((irq_delivery == DIRECTED) && zdev->msi_first_bit != -1U) in arch_teardown_msi_irqs()
367 airq_iv_free(zpci_ibv[0], zdev->msi_first_bit, zdev->msi_nr_irqs); in arch_teardown_msi_irqs()
379 iib.cdiib.dibv_addr = (u64) zpci_ibv[smp_processor_id()]->vector; in cpu_enable_directed_irq()
392 return -ENOMEM; in zpci_directed_irq_init()
396 iib.diib.disb_addr = (u64) zpci_sbv->vector; in zpci_directed_irq_init()
402 return -ENOMEM; in zpci_directed_irq_init()
406 * Per CPU IRQ vectors look the same but bit-allocation in zpci_directed_irq_init()
414 return -ENOMEM; in zpci_directed_irq_init()
427 return -ENOMEM; in zpci_floating_irq_init()
437 return -ENOMEM; in zpci_floating_irq_init()
454 /* Set summary to 1 to be called every time for the ISC. */ in zpci_irq_init()