Lines Matching +full:on +full:- +full:chip
1 // SPDX-License-Identifier: GPL-2.0
15 * irq_reserve_ipi() - Setup an IPI to destination cpumask
21 * On success it'll return linux irq number and error code on failure
31 pr_warn("Reservation on a non IPI domain\n"); in irq_reserve_ipi()
32 return -EINVAL; in irq_reserve_ipi()
37 return -EINVAL; in irq_reserve_ipi()
43 return -EINVAL; in irq_reserve_ipi()
48 * If the underlying implementation uses a single HW irq on in irq_reserve_ipi()
59 * The IPI requires a separate HW irq on each CPU. We require in irq_reserve_ipi()
74 return -EINVAL; in irq_reserve_ipi()
78 virq = irq_domain_alloc_descs(-1, nr_irqs, 0, NUMA_NO_NODE, NULL); in irq_reserve_ipi()
81 return -ENOMEM; in irq_reserve_ipi()
94 cpumask_copy(data->common->affinity, dest); in irq_reserve_ipi()
95 data->common->ipi_offset = offset; in irq_reserve_ipi()
102 return -EBUSY; in irq_reserve_ipi()
106 * irq_destroy_ipi() - unreserve an IPI that was previously allocated
113 * Return 0 on success or error code on failure.
123 return -EINVAL; in irq_destroy_ipi()
125 domain = data->domain; in irq_destroy_ipi()
127 return -EINVAL; in irq_destroy_ipi()
131 return -EINVAL; in irq_destroy_ipi()
139 return -EINVAL; in irq_destroy_ipi()
142 irq = irq + cpumask_first(dest) - data->common->ipi_offset; in irq_destroy_ipi()
153 * ipi_get_hwirq - Get the hwirq associated with an IPI to a cpu
160 * Returns hwirq value on success and INVALID_HWIRQ on failure.
179 if (irq_domain_is_ipi_per_cpu(data->domain)) in ipi_get_hwirq()
180 data = irq_get_irq_data(irq + cpu - data->common->ipi_offset); in ipi_get_hwirq()
186 static int ipi_send_verify(struct irq_chip *chip, struct irq_data *data, in ipi_send_verify() argument
191 if (!chip || !ipimask) in ipi_send_verify()
192 return -EINVAL; in ipi_send_verify()
194 if (!chip->ipi_send_single && !chip->ipi_send_mask) in ipi_send_verify()
195 return -EINVAL; in ipi_send_verify()
198 return -EINVAL; in ipi_send_verify()
202 return -EINVAL; in ipi_send_verify()
205 return -EINVAL; in ipi_send_verify()
211 * __ipi_send_single - send an IPI to a target Linux SMP CPU
219 * Returns zero on success and negative error number on failure.
224 struct irq_chip *chip = irq_data_get_irq_chip(data); in __ipi_send_single() local
232 if (WARN_ON_ONCE(ipi_send_verify(chip, data, NULL, cpu))) in __ipi_send_single()
233 return -EINVAL; in __ipi_send_single()
235 if (!chip->ipi_send_single) { in __ipi_send_single()
236 chip->ipi_send_mask(data, cpumask_of(cpu)); in __ipi_send_single()
241 if (irq_domain_is_ipi_per_cpu(data->domain) && in __ipi_send_single()
242 cpu != data->common->ipi_offset) { in __ipi_send_single()
244 unsigned irq = data->irq + cpu - data->common->ipi_offset; in __ipi_send_single()
248 chip->ipi_send_single(data, cpu); in __ipi_send_single()
253 * ipi_send_mask - send an IPI to target Linux SMP CPU(s)
261 * Returns zero on success and negative error number on failure.
266 struct irq_chip *chip = irq_data_get_irq_chip(data); in __ipi_send_mask() local
275 if (WARN_ON_ONCE(ipi_send_verify(chip, data, dest, 0))) in __ipi_send_mask()
276 return -EINVAL; in __ipi_send_mask()
278 if (chip->ipi_send_mask) { in __ipi_send_mask()
279 chip->ipi_send_mask(data, dest); in __ipi_send_mask()
283 if (irq_domain_is_ipi_per_cpu(data->domain)) { in __ipi_send_mask()
284 unsigned int base = data->irq; in __ipi_send_mask()
287 unsigned irq = base + cpu - data->common->ipi_offset; in __ipi_send_mask()
290 chip->ipi_send_single(data, cpu); in __ipi_send_mask()
294 chip->ipi_send_single(data, cpu); in __ipi_send_mask()
300 * ipi_send_single - Send an IPI to a single CPU
305 * Returns zero on success and negative error number on failure.
311 struct irq_chip *chip = data ? irq_data_get_irq_chip(data) : NULL; in ipi_send_single() local
313 if (WARN_ON_ONCE(ipi_send_verify(chip, data, NULL, cpu))) in ipi_send_single()
314 return -EINVAL; in ipi_send_single()
321 * ipi_send_mask - Send an IPI to target CPU(s)
326 * Returns zero on success and negative error number on failure.
332 struct irq_chip *chip = data ? irq_data_get_irq_chip(data) : NULL; in ipi_send_mask() local
334 if (WARN_ON_ONCE(ipi_send_verify(chip, data, dest, 0))) in ipi_send_mask()
335 return -EINVAL; in ipi_send_mask()