]> Git Repo - linux.git/blob - drivers/pci/of.c
Linux 6.14-rc3
[linux.git] / drivers / pci / of.c
1 // SPDX-License-Identifier: GPL-2.0+
2 /*
3  * PCI <-> OF mapping helpers
4  *
5  * Copyright 2011 IBM Corp.
6  */
7 #define pr_fmt(fmt)     "PCI: OF: " fmt
8
9 #include <linux/cleanup.h>
10 #include <linux/irqdomain.h>
11 #include <linux/kernel.h>
12 #include <linux/pci.h>
13 #include <linux/of.h>
14 #include <linux/of_irq.h>
15 #include <linux/of_address.h>
16 #include <linux/of_pci.h>
17 #include <linux/platform_device.h>
18 #include "pci.h"
19
20 #ifdef CONFIG_PCI
21 /**
22  * pci_set_of_node - Find and set device's DT device_node
23  * @dev: the PCI device structure to fill
24  *
25  * Returns 0 on success with of_node set or when no device is described in the
26  * DT. Returns -ENODEV if the device is present, but disabled in the DT.
27  */
28 int pci_set_of_node(struct pci_dev *dev)
29 {
30         if (!dev->bus->dev.of_node)
31                 return 0;
32
33         struct device_node *node __free(device_node) =
34                 of_pci_find_child_device(dev->bus->dev.of_node, dev->devfn);
35         if (!node)
36                 return 0;
37
38         struct device *pdev __free(put_device) =
39                 bus_find_device_by_of_node(&platform_bus_type, node);
40         if (pdev)
41                 dev->bus->dev.of_node_reused = true;
42
43         device_set_node(&dev->dev, of_fwnode_handle(no_free_ptr(node)));
44         return 0;
45 }
46
47 void pci_release_of_node(struct pci_dev *dev)
48 {
49         of_node_put(dev->dev.of_node);
50         device_set_node(&dev->dev, NULL);
51 }
52
53 void pci_set_bus_of_node(struct pci_bus *bus)
54 {
55         struct device_node *node;
56
57         if (bus->self == NULL) {
58                 node = pcibios_get_phb_of_node(bus);
59         } else {
60                 node = of_node_get(bus->self->dev.of_node);
61                 if (node && of_property_read_bool(node, "external-facing"))
62                         bus->self->external_facing = true;
63         }
64
65         device_set_node(&bus->dev, of_fwnode_handle(node));
66 }
67
68 void pci_release_bus_of_node(struct pci_bus *bus)
69 {
70         of_node_put(bus->dev.of_node);
71         device_set_node(&bus->dev, NULL);
72 }
73
74 struct device_node * __weak pcibios_get_phb_of_node(struct pci_bus *bus)
75 {
76         /* This should only be called for PHBs */
77         if (WARN_ON(bus->self || bus->parent))
78                 return NULL;
79
80         /*
81          * Look for a node pointer in either the intermediary device we
82          * create above the root bus or its own parent. Normally only
83          * the later is populated.
84          */
85         if (bus->bridge->of_node)
86                 return of_node_get(bus->bridge->of_node);
87         if (bus->bridge->parent && bus->bridge->parent->of_node)
88                 return of_node_get(bus->bridge->parent->of_node);
89         return NULL;
90 }
91
92 struct irq_domain *pci_host_bridge_of_msi_domain(struct pci_bus *bus)
93 {
94 #ifdef CONFIG_IRQ_DOMAIN
95         struct irq_domain *d;
96
97         if (!bus->dev.of_node)
98                 return NULL;
99
100         /* Start looking for a phandle to an MSI controller. */
101         d = of_msi_get_domain(&bus->dev, bus->dev.of_node, DOMAIN_BUS_PCI_MSI);
102         if (d)
103                 return d;
104
105         /*
106          * If we don't have an msi-parent property, look for a domain
107          * directly attached to the host bridge.
108          */
109         d = irq_find_matching_host(bus->dev.of_node, DOMAIN_BUS_PCI_MSI);
110         if (d)
111                 return d;
112
113         return irq_find_host(bus->dev.of_node);
114 #else
115         return NULL;
116 #endif
117 }
118
119 bool pci_host_of_has_msi_map(struct device *dev)
120 {
121         if (dev && dev->of_node)
122                 return of_get_property(dev->of_node, "msi-map", NULL);
123         return false;
124 }
125
126 static inline int __of_pci_pci_compare(struct device_node *node,
127                                        unsigned int data)
128 {
129         int devfn;
130
131         devfn = of_pci_get_devfn(node);
132         if (devfn < 0)
133                 return 0;
134
135         return devfn == data;
136 }
137
138 struct device_node *of_pci_find_child_device(struct device_node *parent,
139                                              unsigned int devfn)
140 {
141         struct device_node *node, *node2;
142
143         for_each_child_of_node(parent, node) {
144                 if (__of_pci_pci_compare(node, devfn))
145                         return node;
146                 /*
147                  * Some OFs create a parent node "multifunc-device" as
148                  * a fake root for all functions of a multi-function
149                  * device we go down them as well.
150                  */
151                 if (of_node_name_eq(node, "multifunc-device")) {
152                         for_each_child_of_node(node, node2) {
153                                 if (__of_pci_pci_compare(node2, devfn)) {
154                                         of_node_put(node);
155                                         return node2;
156                                 }
157                         }
158                 }
159         }
160         return NULL;
161 }
162 EXPORT_SYMBOL_GPL(of_pci_find_child_device);
163
164 /**
165  * of_pci_get_devfn() - Get device and function numbers for a device node
166  * @np: device node
167  *
168  * Parses a standard 5-cell PCI resource and returns an 8-bit value that can
169  * be passed to the PCI_SLOT() and PCI_FUNC() macros to extract the device
170  * and function numbers respectively. On error a negative error code is
171  * returned.
172  */
173 int of_pci_get_devfn(struct device_node *np)
174 {
175         u32 reg[5];
176         int error;
177
178         error = of_property_read_u32_array(np, "reg", reg, ARRAY_SIZE(reg));
179         if (error)
180                 return error;
181
182         return (reg[0] >> 8) & 0xff;
183 }
184 EXPORT_SYMBOL_GPL(of_pci_get_devfn);
185
186 /**
187  * of_pci_parse_bus_range() - parse the bus-range property of a PCI device
188  * @node: device node
189  * @res: address to a struct resource to return the bus-range
190  *
191  * Returns 0 on success or a negative error-code on failure.
192  */
193 static int of_pci_parse_bus_range(struct device_node *node,
194                                   struct resource *res)
195 {
196         u32 bus_range[2];
197         int error;
198
199         error = of_property_read_u32_array(node, "bus-range", bus_range,
200                                            ARRAY_SIZE(bus_range));
201         if (error)
202                 return error;
203
204         res->name = node->name;
205         res->start = bus_range[0];
206         res->end = bus_range[1];
207         res->flags = IORESOURCE_BUS;
208
209         return 0;
210 }
211
212 /**
213  * of_get_pci_domain_nr - Find the host bridge domain number
214  *                        of the given device node.
215  * @node: Device tree node with the domain information.
216  *
217  * This function will try to obtain the host bridge domain number by finding
218  * a property called "linux,pci-domain" of the given device node.
219  *
220  * Return:
221  * * > 0        - On success, an associated domain number.
222  * * -EINVAL    - The property "linux,pci-domain" does not exist.
223  * * -ENODATA   - The linux,pci-domain" property does not have value.
224  * * -EOVERFLOW - Invalid "linux,pci-domain" property value.
225  *
226  * Returns the associated domain number from DT in the range [0-0xffff], or
227  * a negative value if the required property is not found.
228  */
229 int of_get_pci_domain_nr(struct device_node *node)
230 {
231         u32 domain;
232         int error;
233
234         error = of_property_read_u32(node, "linux,pci-domain", &domain);
235         if (error)
236                 return error;
237
238         return (u16)domain;
239 }
240 EXPORT_SYMBOL_GPL(of_get_pci_domain_nr);
241
242 /**
243  * of_pci_preserve_config - Return true if the boot configuration needs to
244  *                          be preserved
245  * @node: Device tree node.
246  *
247  * Look for "linux,pci-probe-only" property for a given PCI controller's
248  * node and return true if found. Also look in the chosen node if the
249  * property is not found in the given controller's node.  Having this
250  * property ensures that the kernel doesn't reconfigure the BARs and bridge
251  * windows that are already done by the platform firmware.
252  *
253  * Return: true if the property exists; false otherwise.
254  */
255 bool of_pci_preserve_config(struct device_node *node)
256 {
257         u32 val = 0;
258         int ret;
259
260         if (!node) {
261                 pr_warn("device node is NULL, trying with of_chosen\n");
262                 node = of_chosen;
263         }
264
265 retry:
266         ret = of_property_read_u32(node, "linux,pci-probe-only", &val);
267         if (ret) {
268                 if (ret == -ENODATA || ret == -EOVERFLOW) {
269                         pr_warn("Incorrect value for linux,pci-probe-only in %pOF, ignoring\n",
270                                 node);
271                         return false;
272                 }
273                 if (ret == -EINVAL) {
274                         if (node == of_chosen)
275                                 return false;
276
277                         node = of_chosen;
278                         goto retry;
279                 }
280         }
281
282         if (val)
283                 return true;
284         else
285                 return false;
286 }
287
288 /**
289  * of_pci_check_probe_only - Setup probe only mode if linux,pci-probe-only
290  *                           is present and valid
291  */
292 void of_pci_check_probe_only(void)
293 {
294         if (of_pci_preserve_config(of_chosen))
295                 pci_add_flags(PCI_PROBE_ONLY);
296         else
297                 pci_clear_flags(PCI_PROBE_ONLY);
298 }
299 EXPORT_SYMBOL_GPL(of_pci_check_probe_only);
300
301 /**
302  * devm_of_pci_get_host_bridge_resources() - Resource-managed parsing of PCI
303  *                                           host bridge resources from DT
304  * @dev: host bridge device
305  * @resources: list where the range of resources will be added after DT parsing
306  * @ib_resources: list where the range of inbound resources (with addresses
307  *                from 'dma-ranges') will be added after DT parsing
308  * @io_base: pointer to a variable that will contain on return the physical
309  * address for the start of the I/O range. Can be NULL if the caller doesn't
310  * expect I/O ranges to be present in the device tree.
311  *
312  * This function will parse the "ranges" property of a PCI host bridge device
313  * node and setup the resource mapping based on its content. It is expected
314  * that the property conforms with the Power ePAPR document.
315  *
316  * It returns zero if the range parsing has been successful or a standard error
317  * value if it failed.
318  */
319 static int devm_of_pci_get_host_bridge_resources(struct device *dev,
320                         struct list_head *resources,
321                         struct list_head *ib_resources,
322                         resource_size_t *io_base)
323 {
324         struct device_node *dev_node = dev->of_node;
325         struct resource *res, tmp_res;
326         struct resource *bus_range;
327         struct of_pci_range range;
328         struct of_pci_range_parser parser;
329         const char *range_type;
330         int err;
331
332         if (io_base)
333                 *io_base = (resource_size_t)OF_BAD_ADDR;
334
335         bus_range = devm_kzalloc(dev, sizeof(*bus_range), GFP_KERNEL);
336         if (!bus_range)
337                 return -ENOMEM;
338
339         dev_info(dev, "host bridge %pOF ranges:\n", dev_node);
340
341         err = of_pci_parse_bus_range(dev_node, bus_range);
342         if (err) {
343                 bus_range->start = 0;
344                 bus_range->end = 0xff;
345                 bus_range->flags = IORESOURCE_BUS;
346         } else {
347                 if (bus_range->end > 0xff) {
348                         dev_warn(dev, "  Invalid end bus number in %pR, defaulting to 0xff\n",
349                                  bus_range);
350                         bus_range->end = 0xff;
351                 }
352         }
353         pci_add_resource(resources, bus_range);
354
355         /* Check for ranges property */
356         err = of_pci_range_parser_init(&parser, dev_node);
357         if (err)
358                 return 0;
359
360         dev_dbg(dev, "Parsing ranges property...\n");
361         for_each_of_pci_range(&parser, &range) {
362                 /* Read next ranges element */
363                 if ((range.flags & IORESOURCE_TYPE_BITS) == IORESOURCE_IO)
364                         range_type = "IO";
365                 else if ((range.flags & IORESOURCE_TYPE_BITS) == IORESOURCE_MEM)
366                         range_type = "MEM";
367                 else
368                         range_type = "err";
369                 dev_info(dev, "  %6s %#012llx..%#012llx -> %#012llx\n",
370                          range_type, range.cpu_addr,
371                          range.cpu_addr + range.size - 1, range.pci_addr);
372
373                 /*
374                  * If we failed translation or got a zero-sized region
375                  * then skip this range
376                  */
377                 if (range.cpu_addr == OF_BAD_ADDR || range.size == 0)
378                         continue;
379
380                 err = of_pci_range_to_resource(&range, dev_node, &tmp_res);
381                 if (err)
382                         continue;
383
384                 res = devm_kmemdup(dev, &tmp_res, sizeof(tmp_res), GFP_KERNEL);
385                 if (!res) {
386                         err = -ENOMEM;
387                         goto failed;
388                 }
389
390                 if (resource_type(res) == IORESOURCE_IO) {
391                         if (!io_base) {
392                                 dev_err(dev, "I/O range found for %pOF. Please provide an io_base pointer to save CPU base address\n",
393                                         dev_node);
394                                 err = -EINVAL;
395                                 goto failed;
396                         }
397                         if (*io_base != (resource_size_t)OF_BAD_ADDR)
398                                 dev_warn(dev, "More than one I/O resource converted for %pOF. CPU base address for old range lost!\n",
399                                          dev_node);
400                         *io_base = range.cpu_addr;
401                 } else if (resource_type(res) == IORESOURCE_MEM) {
402                         res->flags &= ~IORESOURCE_MEM_64;
403                 }
404
405                 pci_add_resource_offset(resources, res, res->start - range.pci_addr);
406         }
407
408         /* Check for dma-ranges property */
409         if (!ib_resources)
410                 return 0;
411         err = of_pci_dma_range_parser_init(&parser, dev_node);
412         if (err)
413                 return 0;
414
415         dev_dbg(dev, "Parsing dma-ranges property...\n");
416         for_each_of_pci_range(&parser, &range) {
417                 /*
418                  * If we failed translation or got a zero-sized region
419                  * then skip this range
420                  */
421                 if (((range.flags & IORESOURCE_TYPE_BITS) != IORESOURCE_MEM) ||
422                     range.cpu_addr == OF_BAD_ADDR || range.size == 0)
423                         continue;
424
425                 dev_info(dev, "  %6s %#012llx..%#012llx -> %#012llx\n",
426                          "IB MEM", range.cpu_addr,
427                          range.cpu_addr + range.size - 1, range.pci_addr);
428
429
430                 err = of_pci_range_to_resource(&range, dev_node, &tmp_res);
431                 if (err)
432                         continue;
433
434                 res = devm_kmemdup(dev, &tmp_res, sizeof(tmp_res), GFP_KERNEL);
435                 if (!res) {
436                         err = -ENOMEM;
437                         goto failed;
438                 }
439
440                 pci_add_resource_offset(ib_resources, res,
441                                         res->start - range.pci_addr);
442         }
443
444         return 0;
445
446 failed:
447         pci_free_resource_list(resources);
448         return err;
449 }
450
451 #if IS_ENABLED(CONFIG_OF_IRQ)
452 /**
453  * of_irq_parse_pci - Resolve the interrupt for a PCI device
454  * @pdev:       the device whose interrupt is to be resolved
455  * @out_irq:    structure of_phandle_args filled by this function
456  *
457  * This function resolves the PCI interrupt for a given PCI device. If a
458  * device-node exists for a given pci_dev, it will use normal OF tree
459  * walking. If not, it will implement standard swizzling and walk up the
460  * PCI tree until an device-node is found, at which point it will finish
461  * resolving using the OF tree walking.
462  */
463 static int of_irq_parse_pci(const struct pci_dev *pdev, struct of_phandle_args *out_irq)
464 {
465         struct device_node *dn, *ppnode = NULL;
466         struct pci_dev *ppdev;
467         __be32 laddr[3];
468         u8 pin;
469         int rc;
470
471         /*
472          * Check if we have a device node, if yes, fallback to standard
473          * device tree parsing
474          */
475         dn = pci_device_to_OF_node(pdev);
476         if (dn) {
477                 rc = of_irq_parse_one(dn, 0, out_irq);
478                 if (!rc)
479                         return rc;
480         }
481
482         /*
483          * Ok, we don't, time to have fun. Let's start by building up an
484          * interrupt spec.  we assume #interrupt-cells is 1, which is standard
485          * for PCI. If you do different, then don't use that routine.
486          */
487         rc = pci_read_config_byte(pdev, PCI_INTERRUPT_PIN, &pin);
488         if (rc != 0)
489                 goto err;
490         /* No pin, exit with no error message. */
491         if (pin == 0)
492                 return -ENODEV;
493
494         /* Local interrupt-map in the device node? Use it! */
495         if (of_property_present(dn, "interrupt-map")) {
496                 pin = pci_swizzle_interrupt_pin(pdev, pin);
497                 ppnode = dn;
498         }
499
500         /* Now we walk up the PCI tree */
501         while (!ppnode) {
502                 /* Get the pci_dev of our parent */
503                 ppdev = pdev->bus->self;
504
505                 /* Ouch, it's a host bridge... */
506                 if (ppdev == NULL) {
507                         ppnode = pci_bus_to_OF_node(pdev->bus);
508
509                         /* No node for host bridge ? give up */
510                         if (ppnode == NULL) {
511                                 rc = -EINVAL;
512                                 goto err;
513                         }
514                 } else {
515                         /* We found a P2P bridge, check if it has a node */
516                         ppnode = pci_device_to_OF_node(ppdev);
517                 }
518
519                 /*
520                  * Ok, we have found a parent with a device-node, hand over to
521                  * the OF parsing code.
522                  * We build a unit address from the linux device to be used for
523                  * resolution. Note that we use the linux bus number which may
524                  * not match your firmware bus numbering.
525                  * Fortunately, in most cases, interrupt-map-mask doesn't
526                  * include the bus number as part of the matching.
527                  * You should still be careful about that though if you intend
528                  * to rely on this function (you ship a firmware that doesn't
529                  * create device nodes for all PCI devices).
530                  */
531                 if (ppnode)
532                         break;
533
534                 /*
535                  * We can only get here if we hit a P2P bridge with no node;
536                  * let's do standard swizzling and try again
537                  */
538                 pin = pci_swizzle_interrupt_pin(pdev, pin);
539                 pdev = ppdev;
540         }
541
542         out_irq->np = ppnode;
543         out_irq->args_count = 1;
544         out_irq->args[0] = pin;
545         laddr[0] = cpu_to_be32((pdev->bus->number << 16) | (pdev->devfn << 8));
546         laddr[1] = laddr[2] = cpu_to_be32(0);
547         rc = of_irq_parse_raw(laddr, out_irq);
548         if (rc)
549                 goto err;
550         return 0;
551 err:
552         if (rc == -ENOENT) {
553                 dev_warn(&pdev->dev,
554                         "%s: no interrupt-map found, INTx interrupts not available\n",
555                         __func__);
556                 pr_warn_once("%s: possibly some PCI slots don't have level triggered interrupts capability\n",
557                         __func__);
558         } else {
559                 dev_err(&pdev->dev, "%s: failed with rc=%d\n", __func__, rc);
560         }
561         return rc;
562 }
563
564 /**
565  * of_irq_parse_and_map_pci() - Decode a PCI IRQ from the device tree and map to a VIRQ
566  * @dev: The PCI device needing an IRQ
567  * @slot: PCI slot number; passed when used as map_irq callback. Unused
568  * @pin: PCI IRQ pin number; passed when used as map_irq callback. Unused
569  *
570  * @slot and @pin are unused, but included in the function so that this
571  * function can be used directly as the map_irq callback to
572  * pci_assign_irq() and struct pci_host_bridge.map_irq pointer
573  */
574 int of_irq_parse_and_map_pci(const struct pci_dev *dev, u8 slot, u8 pin)
575 {
576         struct of_phandle_args oirq;
577         int ret;
578
579         ret = of_irq_parse_pci(dev, &oirq);
580         if (ret)
581                 return 0; /* Proper return code 0 == NO_IRQ */
582
583         return irq_create_of_mapping(&oirq);
584 }
585 EXPORT_SYMBOL_GPL(of_irq_parse_and_map_pci);
586 #endif  /* CONFIG_OF_IRQ */
587
588 static int pci_parse_request_of_pci_ranges(struct device *dev,
589                                            struct pci_host_bridge *bridge)
590 {
591         int err, res_valid = 0;
592         resource_size_t iobase;
593         struct resource_entry *win, *tmp;
594
595         INIT_LIST_HEAD(&bridge->windows);
596         INIT_LIST_HEAD(&bridge->dma_ranges);
597
598         err = devm_of_pci_get_host_bridge_resources(dev, &bridge->windows,
599                                                     &bridge->dma_ranges, &iobase);
600         if (err)
601                 return err;
602
603         err = devm_request_pci_bus_resources(dev, &bridge->windows);
604         if (err)
605                 return err;
606
607         resource_list_for_each_entry_safe(win, tmp, &bridge->windows) {
608                 struct resource *res = win->res;
609
610                 switch (resource_type(res)) {
611                 case IORESOURCE_IO:
612                         err = devm_pci_remap_iospace(dev, res, iobase);
613                         if (err) {
614                                 dev_warn(dev, "error %d: failed to map resource %pR\n",
615                                          err, res);
616                                 resource_list_destroy_entry(win);
617                         }
618                         break;
619                 case IORESOURCE_MEM:
620                         res_valid |= !(res->flags & IORESOURCE_PREFETCH);
621
622                         if (!(res->flags & IORESOURCE_PREFETCH))
623                                 if (upper_32_bits(resource_size(res)))
624                                         dev_warn(dev, "Memory resource size exceeds max for 32 bits\n");
625
626                         break;
627                 }
628         }
629
630         if (!res_valid)
631                 dev_warn(dev, "non-prefetchable memory resource required\n");
632
633         return 0;
634 }
635
636 int devm_of_pci_bridge_init(struct device *dev, struct pci_host_bridge *bridge)
637 {
638         if (!dev->of_node)
639                 return 0;
640
641         bridge->swizzle_irq = pci_common_swizzle;
642         bridge->map_irq = of_irq_parse_and_map_pci;
643
644         return pci_parse_request_of_pci_ranges(dev, bridge);
645 }
646
647 #ifdef CONFIG_PCI_DYNAMIC_OF_NODES
648
649 void of_pci_remove_node(struct pci_dev *pdev)
650 {
651         struct device_node *np;
652
653         np = pci_device_to_OF_node(pdev);
654         if (!np || !of_node_check_flag(np, OF_DYNAMIC))
655                 return;
656         pdev->dev.of_node = NULL;
657
658         of_changeset_revert(np->data);
659         of_changeset_destroy(np->data);
660         of_node_put(np);
661 }
662
663 void of_pci_make_dev_node(struct pci_dev *pdev)
664 {
665         struct device_node *ppnode, *np = NULL;
666         const char *pci_type;
667         struct of_changeset *cset;
668         const char *name;
669         int ret;
670
671         /*
672          * If there is already a device tree node linked to this device,
673          * return immediately.
674          */
675         if (pci_device_to_OF_node(pdev))
676                 return;
677
678         /* Check if there is device tree node for parent device */
679         if (!pdev->bus->self)
680                 ppnode = pdev->bus->dev.of_node;
681         else
682                 ppnode = pdev->bus->self->dev.of_node;
683         if (!ppnode)
684                 return;
685
686         if (pci_is_bridge(pdev))
687                 pci_type = "pci";
688         else
689                 pci_type = "dev";
690
691         name = kasprintf(GFP_KERNEL, "%s@%x,%x", pci_type,
692                          PCI_SLOT(pdev->devfn), PCI_FUNC(pdev->devfn));
693         if (!name)
694                 return;
695
696         cset = kmalloc(sizeof(*cset), GFP_KERNEL);
697         if (!cset)
698                 goto out_free_name;
699         of_changeset_init(cset);
700
701         np = of_changeset_create_node(cset, ppnode, name);
702         if (!np)
703                 goto out_destroy_cset;
704
705         ret = of_pci_add_properties(pdev, cset, np);
706         if (ret)
707                 goto out_free_node;
708
709         ret = of_changeset_apply(cset);
710         if (ret)
711                 goto out_free_node;
712
713         np->data = cset;
714         pdev->dev.of_node = np;
715         kfree(name);
716
717         return;
718
719 out_free_node:
720         of_node_put(np);
721 out_destroy_cset:
722         of_changeset_destroy(cset);
723         kfree(cset);
724 out_free_name:
725         kfree(name);
726 }
727 #endif
728
729 /**
730  * of_pci_supply_present() - Check if the power supply is present for the PCI
731  *                              device
732  * @np: Device tree node
733  *
734  * Check if the power supply for the PCI device is present in the device tree
735  * node or not.
736  *
737  * Return: true if at least one power supply exists; false otherwise.
738  */
739 bool of_pci_supply_present(struct device_node *np)
740 {
741         struct property *prop;
742         char *supply;
743
744         if (!np)
745                 return false;
746
747         for_each_property_of_node(np, prop) {
748                 supply = strrchr(prop->name, '-');
749                 if (supply && !strcmp(supply, "-supply"))
750                         return true;
751         }
752
753         return false;
754 }
755
756 #endif /* CONFIG_PCI */
757
758 /**
759  * of_pci_get_max_link_speed - Find the maximum link speed of the given device node.
760  * @node: Device tree node with the maximum link speed information.
761  *
762  * This function will try to find the limitation of link speed by finding
763  * a property called "max-link-speed" of the given device node.
764  *
765  * Return:
766  * * > 0        - On success, a maximum link speed.
767  * * -EINVAL    - Invalid "max-link-speed" property value, or failure to access
768  *                the property of the device tree node.
769  *
770  * Returns the associated max link speed from DT, or a negative value if the
771  * required property is not found or is invalid.
772  */
773 int of_pci_get_max_link_speed(struct device_node *node)
774 {
775         u32 max_link_speed;
776
777         if (of_property_read_u32(node, "max-link-speed", &max_link_speed) ||
778             max_link_speed == 0 || max_link_speed > 4)
779                 return -EINVAL;
780
781         return max_link_speed;
782 }
783 EXPORT_SYMBOL_GPL(of_pci_get_max_link_speed);
784
785 /**
786  * of_pci_get_slot_power_limit - Parses the "slot-power-limit-milliwatt"
787  *                               property.
788  *
789  * @node: device tree node with the slot power limit information
790  * @slot_power_limit_value: pointer where the value should be stored in PCIe
791  *                          Slot Capabilities Register format
792  * @slot_power_limit_scale: pointer where the scale should be stored in PCIe
793  *                          Slot Capabilities Register format
794  *
795  * Returns the slot power limit in milliwatts and if @slot_power_limit_value
796  * and @slot_power_limit_scale pointers are non-NULL, fills in the value and
797  * scale in format used by PCIe Slot Capabilities Register.
798  *
799  * If the property is not found or is invalid, returns 0.
800  */
801 u32 of_pci_get_slot_power_limit(struct device_node *node,
802                                 u8 *slot_power_limit_value,
803                                 u8 *slot_power_limit_scale)
804 {
805         u32 slot_power_limit_mw;
806         u8 value, scale;
807
808         if (of_property_read_u32(node, "slot-power-limit-milliwatt",
809                                  &slot_power_limit_mw))
810                 slot_power_limit_mw = 0;
811
812         /* Calculate Slot Power Limit Value and Slot Power Limit Scale */
813         if (slot_power_limit_mw == 0) {
814                 value = 0x00;
815                 scale = 0;
816         } else if (slot_power_limit_mw <= 255) {
817                 value = slot_power_limit_mw;
818                 scale = 3;
819         } else if (slot_power_limit_mw <= 255*10) {
820                 value = slot_power_limit_mw / 10;
821                 scale = 2;
822                 slot_power_limit_mw = slot_power_limit_mw / 10 * 10;
823         } else if (slot_power_limit_mw <= 255*100) {
824                 value = slot_power_limit_mw / 100;
825                 scale = 1;
826                 slot_power_limit_mw = slot_power_limit_mw / 100 * 100;
827         } else if (slot_power_limit_mw <= 239*1000) {
828                 value = slot_power_limit_mw / 1000;
829                 scale = 0;
830                 slot_power_limit_mw = slot_power_limit_mw / 1000 * 1000;
831         } else if (slot_power_limit_mw < 250*1000) {
832                 value = 0xEF;
833                 scale = 0;
834                 slot_power_limit_mw = 239*1000;
835         } else if (slot_power_limit_mw <= 600*1000) {
836                 value = 0xF0 + (slot_power_limit_mw / 1000 - 250) / 25;
837                 scale = 0;
838                 slot_power_limit_mw = slot_power_limit_mw / (1000*25) * (1000*25);
839         } else {
840                 value = 0xFE;
841                 scale = 0;
842                 slot_power_limit_mw = 600*1000;
843         }
844
845         if (slot_power_limit_value)
846                 *slot_power_limit_value = value;
847
848         if (slot_power_limit_scale)
849                 *slot_power_limit_scale = scale;
850
851         return slot_power_limit_mw;
852 }
853 EXPORT_SYMBOL_GPL(of_pci_get_slot_power_limit);
This page took 0.083643 seconds and 4 git commands to generate.