Linux kernel mirror (for testing)
git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel
os
linux
1// SPDX-License-Identifier: GPL-2.0+
2/*
3 * Derived from arch/i386/kernel/irq.c
4 * Copyright (C) 1992 Linus Torvalds
5 * Adapted from arch/i386 by Gary Thomas
6 * Copyright (C) 1995-1996 Gary Thomas (gdt@linuxppc.org)
7 * Updated and modified by Cort Dougan <cort@fsmlabs.com>
8 * Copyright (C) 1996-2001 Cort Dougan
9 * Adapted for Power Macintosh by Paul Mackerras
10 * Copyright (C) 1996 Paul Mackerras (paulus@cs.anu.edu.au)
11 *
12 * This file contains the code used to make IRQ descriptions in the
13 * device tree to actual irq numbers on an interrupt controller
14 * driver.
15 */
16
17#define pr_fmt(fmt) "OF: " fmt
18
19#include <linux/cleanup.h>
20#include <linux/device.h>
21#include <linux/errno.h>
22#include <linux/list.h>
23#include <linux/module.h>
24#include <linux/of.h>
25#include <linux/of_irq.h>
26#include <linux/string.h>
27#include <linux/slab.h>
28
29#include "of_private.h"
30
31/**
32 * irq_of_parse_and_map - Parse and map an interrupt into linux virq space
33 * @dev: Device node of the device whose interrupt is to be mapped
34 * @index: Index of the interrupt to map
35 *
36 * This function is a wrapper that chains of_irq_parse_one() and
37 * irq_create_of_mapping() to make things easier to callers
38 */
39unsigned int irq_of_parse_and_map(struct device_node *dev, int index)
40{
41 struct of_phandle_args oirq;
42 unsigned int ret;
43
44 if (of_irq_parse_one(dev, index, &oirq))
45 return 0;
46
47 ret = irq_create_of_mapping(&oirq);
48 of_node_put(oirq.np);
49
50 return ret;
51}
52EXPORT_SYMBOL_GPL(irq_of_parse_and_map);
53
54/**
55 * of_irq_find_parent - Given a device node, find its interrupt parent node
56 * @child: pointer to device node
57 *
58 * Return: A pointer to the interrupt parent node with refcount increased
59 * or NULL if the interrupt parent could not be determined.
60 */
61struct device_node *of_irq_find_parent(struct device_node *child)
62{
63 struct device_node *p;
64 phandle parent;
65
66 if (!of_node_get(child))
67 return NULL;
68
69 do {
70 if (of_property_read_u32(child, "interrupt-parent", &parent)) {
71 p = of_get_parent(child);
72 } else {
73 if (of_irq_workarounds & OF_IMAP_NO_PHANDLE)
74 p = of_node_get(of_irq_dflt_pic);
75 else
76 p = of_find_node_by_phandle(parent);
77 }
78 of_node_put(child);
79 child = p;
80 } while (p && of_get_property(p, "#interrupt-cells", NULL) == NULL);
81
82 return p;
83}
84EXPORT_SYMBOL_GPL(of_irq_find_parent);
85
86/*
87 * These interrupt controllers abuse interrupt-map for unspeakable
88 * reasons and rely on the core code to *ignore* it (the drivers do
89 * their own parsing of the property). The PAsemi entry covers a
90 * non-sensical interrupt-map that is better left ignored.
91 *
92 * If you think of adding to the list for something *new*, think
93 * again. There is a high chance that you will be sent back to the
94 * drawing board.
95 */
96static const char * const of_irq_imap_abusers[] = {
97 "CBEA,platform-spider-pic",
98 "sti,platform-spider-pic",
99 "realtek,rtl-intc",
100 "fsl,ls1021a-extirq",
101 "fsl,ls1043a-extirq",
102 "fsl,ls1088a-extirq",
103 "renesas,rza1-irqc",
104 "pasemi,rootbus",
105 NULL,
106};
107
108const __be32 *of_irq_parse_imap_parent(const __be32 *imap, int len, struct of_phandle_args *out_irq)
109{
110 u32 intsize, addrsize;
111 struct device_node *np;
112
113 /* Get the interrupt parent */
114 if (of_irq_workarounds & OF_IMAP_NO_PHANDLE)
115 np = of_node_get(of_irq_dflt_pic);
116 else
117 np = of_find_node_by_phandle(be32_to_cpup(imap));
118 imap++;
119 len--;
120
121 /* Check if not found */
122 if (!np) {
123 pr_debug(" -> imap parent not found !\n");
124 return NULL;
125 }
126
127 /* Get #interrupt-cells and #address-cells of new parent */
128 if (of_property_read_u32(np, "#interrupt-cells",
129 &intsize)) {
130 pr_debug(" -> parent lacks #interrupt-cells!\n");
131 of_node_put(np);
132 return NULL;
133 }
134 if (of_property_read_u32(np, "#address-cells",
135 &addrsize))
136 addrsize = 0;
137
138 pr_debug(" -> intsize=%d, addrsize=%d\n",
139 intsize, addrsize);
140
141 /* Check for malformed properties */
142 if (WARN_ON(addrsize + intsize > MAX_PHANDLE_ARGS)
143 || (len < (addrsize + intsize))) {
144 of_node_put(np);
145 return NULL;
146 }
147
148 pr_debug(" -> imaplen=%d\n", len);
149
150 imap += addrsize + intsize;
151
152 out_irq->np = np;
153 for (int i = 0; i < intsize; i++)
154 out_irq->args[i] = be32_to_cpup(imap - intsize + i);
155 out_irq->args_count = intsize;
156
157 return imap;
158}
159
160int of_imap_parser_init(struct of_imap_parser *parser, struct device_node *node,
161 struct of_imap_item *item)
162{
163 int imaplen;
164 u32 tmp;
165 int ret;
166
167 /*
168 * parent_offset is the offset where the parent part is starting.
169 * In other words, the offset where the parent interrupt controller
170 * phandle is present.
171 *
172 * Compute this offset (child #interrupt-cells + child #address-cells)
173 */
174 parser->parent_offset = of_bus_n_addr_cells(node);
175
176 ret = of_property_read_u32(node, "#interrupt-cells", &tmp);
177 if (ret)
178 return ret;
179
180 parser->parent_offset += tmp;
181
182 if (WARN(parser->parent_offset > ARRAY_SIZE(item->child_imap),
183 "child part size = %u, cannot fit in array of %zu items",
184 parser->parent_offset, ARRAY_SIZE(item->child_imap)))
185 return -EINVAL;
186
187 parser->imap = of_get_property(node, "interrupt-map", &imaplen);
188 if (!parser->imap)
189 return -ENOENT;
190
191 imaplen /= sizeof(*parser->imap);
192 parser->imap_end = parser->imap + imaplen;
193
194 memset(item, 0, sizeof(*item));
195 item->child_imap_count = parser->parent_offset;
196
197 return 0;
198}
199EXPORT_SYMBOL_GPL(of_imap_parser_init);
200
201struct of_imap_item *of_imap_parser_one(struct of_imap_parser *parser,
202 struct of_imap_item *item)
203{
204 const __be32 *imap_parent, *imap_next;
205 int i;
206
207 /* Release previously get parent node */
208 of_node_put(item->parent_args.np);
209
210 if (parser->imap + parser->parent_offset + 1 >= parser->imap_end)
211 return NULL;
212
213 imap_parent = parser->imap + parser->parent_offset;
214
215 imap_next = of_irq_parse_imap_parent(imap_parent,
216 parser->imap_end - imap_parent,
217 &item->parent_args);
218 if (!imap_next)
219 return NULL;
220
221 for (i = 0; i < parser->parent_offset; i++)
222 item->child_imap[i] = be32_to_cpu(*(parser->imap + i));
223
224 parser->imap = imap_next;
225
226 return item;
227}
228EXPORT_SYMBOL_GPL(of_imap_parser_one);
229
230/**
231 * of_irq_parse_raw - Low level interrupt tree parsing
232 * @addr: address specifier (start of "reg" property of the device) in be32 format
233 * @out_irq: structure of_phandle_args updated by this function
234 *
235 * This function is a low-level interrupt tree walking function. It
236 * can be used to do a partial walk with synthesized reg and interrupts
237 * properties, for example when resolving PCI interrupts when no device
238 * node exist for the parent. It takes an interrupt specifier structure as
239 * input, walks the tree looking for any interrupt-map properties, translates
240 * the specifier for each map, and then returns the translated map.
241 *
242 * Return: 0 on success and a negative number on error
243 *
244 * Note: refcount of node @out_irq->np is increased by 1 on success.
245 */
246int of_irq_parse_raw(const __be32 *addr, struct of_phandle_args *out_irq)
247{
248 struct device_node *ipar, *tnode, *old = NULL;
249 __be32 initial_match_array[MAX_PHANDLE_ARGS];
250 const __be32 *match_array = initial_match_array;
251 const __be32 *tmp, dummy_imask[] = { [0 ... (MAX_PHANDLE_ARGS - 1)] = cpu_to_be32(~0) };
252 u32 intsize = 1, addrsize;
253 int i, rc = -EINVAL;
254
255#ifdef DEBUG
256 of_print_phandle_args("of_irq_parse_raw: ", out_irq);
257#endif
258
259 ipar = of_node_get(out_irq->np);
260
261 /* First get the #interrupt-cells property of the current cursor
262 * that tells us how to interpret the passed-in intspec. If there
263 * is none, we are nice and just walk up the tree
264 */
265 do {
266 if (!of_property_read_u32(ipar, "#interrupt-cells", &intsize))
267 break;
268 tnode = ipar;
269 ipar = of_irq_find_parent(ipar);
270 of_node_put(tnode);
271 } while (ipar);
272 if (ipar == NULL) {
273 pr_debug(" -> no parent found !\n");
274 goto fail;
275 }
276
277 pr_debug("of_irq_parse_raw: ipar=%pOF, size=%d\n", ipar, intsize);
278
279 if (out_irq->args_count != intsize)
280 goto fail;
281
282 /* Look for this #address-cells. We have to implement the old linux
283 * trick of looking for the parent here as some device-trees rely on it
284 */
285 old = of_node_get(ipar);
286 do {
287 tmp = of_get_property(old, "#address-cells", NULL);
288 tnode = of_get_parent(old);
289 of_node_put(old);
290 old = tnode;
291 } while (old && tmp == NULL);
292 of_node_put(old);
293 old = NULL;
294 addrsize = (tmp == NULL) ? 2 : be32_to_cpu(*tmp);
295
296 pr_debug(" -> addrsize=%d\n", addrsize);
297
298 /* Range check so that the temporary buffer doesn't overflow */
299 if (WARN_ON(addrsize + intsize > MAX_PHANDLE_ARGS)) {
300 rc = -EFAULT;
301 goto fail;
302 }
303
304 /* Precalculate the match array - this simplifies match loop */
305 for (i = 0; i < addrsize; i++)
306 initial_match_array[i] = addr ? addr[i] : 0;
307 for (i = 0; i < intsize; i++)
308 initial_match_array[addrsize + i] = cpu_to_be32(out_irq->args[i]);
309
310 /* Now start the actual "proper" walk of the interrupt tree */
311 while (ipar != NULL) {
312 int imaplen, match;
313 const __be32 *imap, *oldimap, *imask;
314 struct device_node *newpar;
315 /*
316 * Now check if cursor is an interrupt-controller and
317 * if it is then we are done, unless there is an
318 * interrupt-map which takes precedence except on one
319 * of these broken platforms that want to parse
320 * interrupt-map themselves for $reason.
321 */
322 bool intc = of_property_read_bool(ipar, "interrupt-controller");
323
324 imap = of_get_property(ipar, "interrupt-map", &imaplen);
325 if (intc &&
326 (!imap || of_device_compatible_match(ipar, of_irq_imap_abusers))) {
327 pr_debug(" -> got it !\n");
328 return 0;
329 }
330
331 /*
332 * interrupt-map parsing does not work without a reg
333 * property when #address-cells != 0
334 */
335 if (addrsize && !addr) {
336 pr_debug(" -> no reg passed in when needed !\n");
337 goto fail;
338 }
339
340 /* No interrupt map, check for an interrupt parent */
341 if (imap == NULL) {
342 pr_debug(" -> no map, getting parent\n");
343 newpar = of_irq_find_parent(ipar);
344 goto skiplevel;
345 }
346 imaplen /= sizeof(u32);
347
348 /* Look for a mask */
349 imask = of_get_property(ipar, "interrupt-map-mask", NULL);
350 if (!imask)
351 imask = dummy_imask;
352
353 /* Parse interrupt-map */
354 match = 0;
355 while (imaplen > (addrsize + intsize + 1)) {
356 /* Compare specifiers */
357 match = 1;
358 for (i = 0; i < (addrsize + intsize); i++, imaplen--)
359 match &= !((match_array[i] ^ *imap++) & imask[i]);
360
361 pr_debug(" -> match=%d (imaplen=%d)\n", match, imaplen);
362
363 oldimap = imap;
364 imap = of_irq_parse_imap_parent(oldimap, imaplen, out_irq);
365 if (!imap)
366 goto fail;
367
368 match &= of_device_is_available(out_irq->np);
369 if (match)
370 break;
371
372 of_node_put(out_irq->np);
373 imaplen -= imap - oldimap;
374 pr_debug(" -> imaplen=%d\n", imaplen);
375 }
376 if (!match)
377 goto fail;
378
379 /*
380 * Successfully parsed an interrupt-map translation; copy new
381 * interrupt specifier into the out_irq structure
382 */
383 match_array = oldimap + 1;
384
385 newpar = out_irq->np;
386 intsize = out_irq->args_count;
387 addrsize = (imap - match_array) - intsize;
388
389 if (ipar == newpar) {
390 /*
391 * We got @ipar's refcount, but the refcount was
392 * gotten again by of_irq_parse_imap_parent() via its
393 * alias @newpar.
394 */
395 of_node_put(ipar);
396 pr_debug("%pOF interrupt-map entry to self\n", ipar);
397 return 0;
398 }
399
400 skiplevel:
401 /* Iterate again with new parent */
402 pr_debug(" -> new parent: %pOF\n", newpar);
403 of_node_put(ipar);
404 ipar = newpar;
405 newpar = NULL;
406 }
407 rc = -ENOENT; /* No interrupt-map found */
408
409 fail:
410 of_node_put(ipar);
411
412 return rc;
413}
414EXPORT_SYMBOL_GPL(of_irq_parse_raw);
415
416/**
417 * of_irq_parse_one - Resolve an interrupt for a device
418 * @device: the device whose interrupt is to be resolved
419 * @index: index of the interrupt to resolve
420 * @out_irq: structure of_phandle_args filled by this function
421 *
422 * This function resolves an interrupt for a node by walking the interrupt tree,
423 * finding which interrupt controller node it is attached to, and returning the
424 * interrupt specifier that can be used to retrieve a Linux IRQ number.
425 *
426 * Note: refcount of node @out_irq->np is increased by 1 on success.
427 */
428int of_irq_parse_one(struct device_node *device, int index, struct of_phandle_args *out_irq)
429{
430 struct device_node __free(device_node) *p = NULL;
431 const __be32 *addr;
432 u32 intsize;
433 int i, res, addr_len;
434 __be32 addr_buf[3] = { 0 };
435
436 pr_debug("of_irq_parse_one: dev=%pOF, index=%d\n", device, index);
437
438 /* OldWorld mac stuff is "special", handle out of line */
439 if (of_irq_workarounds & OF_IMAP_OLDWORLD_MAC)
440 return of_irq_parse_oldworld(device, index, out_irq);
441
442 /* Get the reg property (if any) */
443 addr_len = 0;
444 addr = of_get_property(device, "reg", &addr_len);
445
446 /* Prevent out-of-bounds read in case of longer interrupt parent address size */
447 if (addr_len > sizeof(addr_buf))
448 addr_len = sizeof(addr_buf);
449 if (addr)
450 memcpy(addr_buf, addr, addr_len);
451
452 /* Try the new-style interrupts-extended first */
453 res = of_parse_phandle_with_args(device, "interrupts-extended",
454 "#interrupt-cells", index, out_irq);
455 if (!res) {
456 p = out_irq->np;
457 } else {
458 /* Look for the interrupt parent. */
459 p = of_irq_find_parent(device);
460 /* Get size of interrupt specifier */
461 if (!p || of_property_read_u32(p, "#interrupt-cells", &intsize))
462 return -EINVAL;
463
464 pr_debug(" parent=%pOF, intsize=%d\n", p, intsize);
465
466 /* Copy intspec into irq structure */
467 out_irq->np = p;
468 out_irq->args_count = intsize;
469 for (i = 0; i < intsize; i++) {
470 res = of_property_read_u32_index(device, "interrupts",
471 (index * intsize) + i,
472 out_irq->args + i);
473 if (res)
474 return res;
475 }
476
477 pr_debug(" intspec=%d\n", *out_irq->args);
478 }
479
480 /* Check if there are any interrupt-map translations to process */
481 return of_irq_parse_raw(addr_buf, out_irq);
482}
483EXPORT_SYMBOL_GPL(of_irq_parse_one);
484
485/**
486 * of_irq_to_resource - Decode a node's IRQ and return it as a resource
487 * @dev: pointer to device tree node
488 * @index: zero-based index of the irq
489 * @r: pointer to resource structure to return result into.
490 */
491int of_irq_to_resource(struct device_node *dev, int index, struct resource *r)
492{
493 int irq = of_irq_get(dev, index);
494
495 if (irq < 0)
496 return irq;
497
498 /* Only dereference the resource if both the
499 * resource and the irq are valid. */
500 if (r && irq) {
501 const char *name = NULL;
502
503 memset(r, 0, sizeof(*r));
504 /*
505 * Get optional "interrupt-names" property to add a name
506 * to the resource.
507 */
508 of_property_read_string_index(dev, "interrupt-names", index,
509 &name);
510
511 *r = DEFINE_RES_IRQ_NAMED(irq, name ?: of_node_full_name(dev));
512 r->flags |= irq_get_trigger_type(irq);
513 }
514
515 return irq;
516}
517EXPORT_SYMBOL_GPL(of_irq_to_resource);
518
519/**
520 * of_irq_get - Decode a node's IRQ and return it as a Linux IRQ number
521 * @dev: pointer to device tree node
522 * @index: zero-based index of the IRQ
523 *
524 * Return: Linux IRQ number on success, or 0 on the IRQ mapping failure, or
525 * -EPROBE_DEFER if the IRQ domain is not yet created, or error code in case
526 * of any other failure.
527 */
528int of_irq_get(struct device_node *dev, int index)
529{
530 int rc;
531 struct of_phandle_args oirq;
532 struct irq_domain *domain;
533
534 rc = of_irq_parse_one(dev, index, &oirq);
535 if (rc)
536 return rc;
537
538 domain = irq_find_host(oirq.np);
539 if (!domain) {
540 rc = -EPROBE_DEFER;
541 goto out;
542 }
543
544 rc = irq_create_of_mapping(&oirq);
545out:
546 of_node_put(oirq.np);
547
548 return rc;
549}
550EXPORT_SYMBOL_GPL(of_irq_get);
551
552const struct cpumask *of_irq_get_affinity(struct device_node *dev, int index)
553{
554 struct of_phandle_args oirq;
555 struct irq_fwspec_info info;
556 struct irq_fwspec fwspec;
557 int rc;
558
559 rc = of_irq_parse_one(dev, index, &oirq);
560 if (rc)
561 return NULL;
562
563 of_phandle_args_to_fwspec(oirq.np, oirq.args, oirq.args_count,
564 &fwspec);
565
566 if (irq_populate_fwspec_info(&fwspec, &info))
567 return NULL;
568
569 return info.affinity;
570}
571
572/**
573 * of_irq_get_byname - Decode a node's IRQ and return it as a Linux IRQ number
574 * @dev: pointer to device tree node
575 * @name: IRQ name
576 *
577 * Return: Linux IRQ number on success, or 0 on the IRQ mapping failure, or
578 * -EPROBE_DEFER if the IRQ domain is not yet created, or error code in case
579 * of any other failure.
580 */
581int of_irq_get_byname(struct device_node *dev, const char *name)
582{
583 int index;
584
585 if (unlikely(!name))
586 return -EINVAL;
587
588 index = of_property_match_string(dev, "interrupt-names", name);
589 if (index < 0)
590 return index;
591
592 return of_irq_get(dev, index);
593}
594EXPORT_SYMBOL_GPL(of_irq_get_byname);
595
596/**
597 * of_irq_count - Count the number of IRQs a node uses
598 * @dev: pointer to device tree node
599 */
600int of_irq_count(struct device_node *dev)
601{
602 struct of_phandle_args irq;
603 int nr = 0;
604
605 while (of_irq_parse_one(dev, nr, &irq) == 0) {
606 of_node_put(irq.np);
607 nr++;
608 }
609
610 return nr;
611}
612EXPORT_SYMBOL_GPL(of_irq_count);
613
614/**
615 * of_irq_to_resource_table - Fill in resource table with node's IRQ info
616 * @dev: pointer to device tree node
617 * @res: array of resources to fill in
618 * @nr_irqs: the number of IRQs (and upper bound for num of @res elements)
619 *
620 * Return: The size of the filled in table (up to @nr_irqs).
621 */
622int of_irq_to_resource_table(struct device_node *dev, struct resource *res,
623 int nr_irqs)
624{
625 int i;
626
627 for (i = 0; i < nr_irqs; i++, res++)
628 if (of_irq_to_resource(dev, i, res) <= 0)
629 break;
630
631 return i;
632}
633EXPORT_SYMBOL_GPL(of_irq_to_resource_table);
634
635struct of_intc_desc {
636 struct list_head list;
637 of_irq_init_cb_t irq_init_cb;
638 struct device_node *dev;
639 struct device_node *interrupt_parent;
640};
641
642/**
643 * of_irq_init - Scan and init matching interrupt controllers in DT
644 * @matches: 0 terminated array of nodes to match and init function to call
645 *
646 * This function scans the device tree for matching interrupt controller nodes,
647 * and calls their initialization functions in order with parents first.
648 */
649void __init of_irq_init(const struct of_device_id *matches)
650{
651 const struct of_device_id *match;
652 struct device_node *np, *parent = NULL;
653 struct of_intc_desc *desc, *temp_desc;
654 struct list_head intc_desc_list, intc_parent_list;
655
656 INIT_LIST_HEAD(&intc_desc_list);
657 INIT_LIST_HEAD(&intc_parent_list);
658
659 for_each_matching_node_and_match(np, matches, &match) {
660 if (!of_property_read_bool(np, "interrupt-controller") ||
661 !of_device_is_available(np))
662 continue;
663
664 if (WARN(!match->data, "of_irq_init: no init function for %s\n",
665 match->compatible))
666 continue;
667
668 /*
669 * Here, we allocate and populate an of_intc_desc with the node
670 * pointer, interrupt-parent device_node etc.
671 */
672 desc = kzalloc(sizeof(*desc), GFP_KERNEL);
673 if (!desc) {
674 of_node_put(np);
675 goto err;
676 }
677
678 desc->irq_init_cb = match->data;
679 desc->dev = of_node_get(np);
680 /*
681 * interrupts-extended can reference multiple parent domains.
682 * Arbitrarily pick the first one; assume any other parents
683 * are the same distance away from the root irq controller.
684 */
685 desc->interrupt_parent = of_parse_phandle(np, "interrupts-extended", 0);
686 if (!desc->interrupt_parent && of_property_present(np, "interrupts"))
687 desc->interrupt_parent = of_irq_find_parent(np);
688 else if (!desc->interrupt_parent)
689 desc->interrupt_parent = of_parse_phandle(np, "interrupt-parent", 0);
690 if (desc->interrupt_parent == np) {
691 of_node_put(desc->interrupt_parent);
692 desc->interrupt_parent = NULL;
693 }
694 list_add_tail(&desc->list, &intc_desc_list);
695 }
696
697 /*
698 * The root irq controller is the one without an interrupt-parent.
699 * That one goes first, followed by the controllers that reference it,
700 * followed by the ones that reference the 2nd level controllers, etc.
701 */
702 while (!list_empty(&intc_desc_list)) {
703 /*
704 * Process all controllers with the current 'parent'.
705 * First pass will be looking for NULL as the parent.
706 * The assumption is that NULL parent means a root controller.
707 */
708 list_for_each_entry_safe(desc, temp_desc, &intc_desc_list, list) {
709 int ret;
710
711 if (desc->interrupt_parent != parent)
712 continue;
713
714 list_del(&desc->list);
715
716 of_node_set_flag(desc->dev, OF_POPULATED);
717
718 pr_debug("of_irq_init: init %pOF (%p), parent %p\n",
719 desc->dev,
720 desc->dev, desc->interrupt_parent);
721 ret = desc->irq_init_cb(desc->dev,
722 desc->interrupt_parent);
723 if (ret) {
724 pr_err("%s: Failed to init %pOF (%p), parent %p\n",
725 __func__, desc->dev, desc->dev,
726 desc->interrupt_parent);
727 of_node_clear_flag(desc->dev, OF_POPULATED);
728 of_node_put(desc->interrupt_parent);
729 of_node_put(desc->dev);
730 kfree(desc);
731 continue;
732 }
733
734 /*
735 * This one is now set up; add it to the parent list so
736 * its children can get processed in a subsequent pass.
737 */
738 list_add_tail(&desc->list, &intc_parent_list);
739 }
740
741 /* Get the next pending parent that might have children */
742 desc = list_first_entry_or_null(&intc_parent_list,
743 typeof(*desc), list);
744 if (!desc) {
745 pr_err("of_irq_init: children remain, but no parents\n");
746 break;
747 }
748 list_del(&desc->list);
749 parent = desc->dev;
750 kfree(desc);
751 }
752
753 list_for_each_entry_safe(desc, temp_desc, &intc_parent_list, list) {
754 list_del(&desc->list);
755 kfree(desc);
756 }
757err:
758 list_for_each_entry_safe(desc, temp_desc, &intc_desc_list, list) {
759 list_del(&desc->list);
760 of_node_put(desc->interrupt_parent);
761 of_node_put(desc->dev);
762 kfree(desc);
763 }
764}
765
766static int of_check_msi_parent(struct device_node *dev_node, struct device_node **msi_node)
767{
768 struct of_phandle_args msi_spec;
769 int ret;
770
771 /*
772 * An msi-parent phandle with a missing or == 0 #msi-cells
773 * property identifies a 1:1 ID translation mapping.
774 *
775 * Set the msi controller node if the firmware matches this
776 * condition.
777 */
778 ret = of_parse_phandle_with_optional_args(dev_node, "msi-parent", "#msi-cells",
779 0, &msi_spec);
780 if (ret)
781 return ret;
782
783 if ((*msi_node && *msi_node != msi_spec.np) || msi_spec.args_count != 0)
784 ret = -EINVAL;
785
786 if (!ret) {
787 /* Return with a node reference held */
788 *msi_node = msi_spec.np;
789 return 0;
790 }
791 of_node_put(msi_spec.np);
792
793 return ret;
794}
795
796/**
797 * of_msi_xlate - map a MSI ID and find relevant MSI controller node
798 * @dev: device for which the mapping is to be done.
799 * @msi_np: Pointer to target MSI controller node
800 * @id_in: Device ID.
801 *
802 * Walk up the device hierarchy looking for devices with a "msi-map"
803 * or "msi-parent" property. If found, apply the mapping to @id_in.
804 * If @msi_np points to a non-NULL device node pointer, only entries targeting
805 * that node will be matched; if it points to a NULL value, it will receive the
806 * device node of the first matching target phandle, with a reference held.
807 *
808 * Returns: The mapped MSI id.
809 */
810u32 of_msi_xlate(struct device *dev, struct device_node **msi_np, u32 id_in)
811{
812 struct device *parent_dev;
813 u32 id_out = id_in;
814
815 /*
816 * Walk up the device parent links looking for one with a
817 * "msi-map" or an "msi-parent" property.
818 */
819 for (parent_dev = dev; parent_dev; parent_dev = parent_dev->parent) {
820 if (!of_map_id(parent_dev->of_node, id_in, "msi-map",
821 "msi-map-mask", msi_np, &id_out))
822 break;
823 if (!of_check_msi_parent(parent_dev->of_node, msi_np))
824 break;
825 }
826 return id_out;
827}
828EXPORT_SYMBOL_GPL(of_msi_xlate);
829
830/**
831 * of_msi_map_get_device_domain - Use msi-map to find the relevant MSI domain
832 * @dev: device for which the mapping is to be done.
833 * @id: Device ID.
834 * @bus_token: Bus token
835 *
836 * Walk up the device hierarchy looking for devices with a "msi-map"
837 * property.
838 *
839 * Returns: the MSI domain for this device (or NULL on failure)
840 */
841struct irq_domain *of_msi_map_get_device_domain(struct device *dev, u32 id,
842 u32 bus_token)
843{
844 struct device_node *np = NULL;
845
846 of_msi_xlate(dev, &np, id);
847 return irq_find_matching_host(np, bus_token);
848}
849
850/**
851 * of_msi_get_domain - Use msi-parent to find the relevant MSI domain
852 * @dev: device for which the domain is requested
853 * @np: device node for @dev
854 * @token: bus type for this domain
855 *
856 * Parse the msi-parent property and returns the corresponding MSI domain.
857 *
858 * Returns: the MSI domain for this device (or NULL on failure).
859 */
860struct irq_domain *of_msi_get_domain(struct device *dev,
861 const struct device_node *np,
862 enum irq_domain_bus_token token)
863{
864 struct of_phandle_iterator it;
865 struct irq_domain *d;
866 int err;
867
868 of_for_each_phandle(&it, err, np, "msi-parent", "#msi-cells", 0) {
869 d = irq_find_matching_host(it.node, token);
870 if (d) {
871 of_node_put(it.node);
872 return d;
873 }
874 }
875
876 return NULL;
877}
878EXPORT_SYMBOL_GPL(of_msi_get_domain);
879
880/**
881 * of_msi_configure - Set the msi_domain field of a device
882 * @dev: device structure to associate with an MSI irq domain
883 * @np: device node for that device
884 */
885void of_msi_configure(struct device *dev, const struct device_node *np)
886{
887 dev_set_msi_domain(dev,
888 of_msi_get_domain(dev, np, DOMAIN_BUS_PLATFORM_MSI));
889}
890EXPORT_SYMBOL_GPL(of_msi_configure);