LCOV - code coverage report
Current view: top level - drivers/of - address.c (source / functions) Hit Total Coverage
Test: Real Lines: 132 195 67.7 %
Date: 2020-10-17 15:46:16 Functions: 0 24 0.0 %
Legend: Neither, QEMU, Real, Both Branches: 0 0 -

           Branch data     Line data    Source code
       1                 :            : // SPDX-License-Identifier: GPL-2.0
       2                 :            : #define pr_fmt(fmt)     "OF: " fmt
       3                 :            : 
       4                 :            : #include <linux/device.h>
       5                 :            : #include <linux/fwnode.h>
       6                 :            : #include <linux/io.h>
       7                 :            : #include <linux/ioport.h>
       8                 :            : #include <linux/logic_pio.h>
       9                 :            : #include <linux/module.h>
      10                 :            : #include <linux/of_address.h>
      11                 :            : #include <linux/pci.h>
      12                 :            : #include <linux/pci_regs.h>
      13                 :            : #include <linux/sizes.h>
      14                 :            : #include <linux/slab.h>
      15                 :            : #include <linux/string.h>
      16                 :            : 
      17                 :            : #include "of_private.h"
      18                 :            : 
      19                 :            : /* Max address size we deal with */
      20                 :            : #define OF_MAX_ADDR_CELLS       4
      21                 :            : #define OF_CHECK_ADDR_COUNT(na) ((na) > 0 && (na) <= OF_MAX_ADDR_CELLS)
      22                 :            : #define OF_CHECK_COUNTS(na, ns) (OF_CHECK_ADDR_COUNT(na) && (ns) > 0)
      23                 :            : 
      24                 :            : static struct of_bus *of_match_bus(struct device_node *np);
      25                 :            : static int __of_address_to_resource(struct device_node *dev,
      26                 :            :                 const __be32 *addrp, u64 size, unsigned int flags,
      27                 :            :                 const char *name, struct resource *r);
      28                 :            : 
      29                 :            : /* Debug utility */
      30                 :            : #ifdef DEBUG
      31                 :            : static void of_dump_addr(const char *s, const __be32 *addr, int na)
      32                 :            : {
      33                 :            :         pr_debug("%s", s);
      34                 :            :         while (na--)
      35                 :            :                 pr_cont(" %08x", be32_to_cpu(*(addr++)));
      36                 :            :         pr_cont("\n");
      37                 :            : }
      38                 :            : #else
      39                 :            : static void of_dump_addr(const char *s, const __be32 *addr, int na) { }
      40                 :            : #endif
      41                 :            : 
      42                 :            : /* Callbacks for bus specific translators */
      43                 :            : struct of_bus {
      44                 :            :         const char      *name;
      45                 :            :         const char      *addresses;
      46                 :            :         int             (*match)(struct device_node *parent);
      47                 :            :         void            (*count_cells)(struct device_node *child,
      48                 :            :                                        int *addrc, int *sizec);
      49                 :            :         u64             (*map)(__be32 *addr, const __be32 *range,
      50                 :            :                                 int na, int ns, int pna);
      51                 :            :         int             (*translate)(__be32 *addr, u64 offset, int na);
      52                 :            :         unsigned int    (*get_flags)(const __be32 *addr);
      53                 :            : };
      54                 :            : 
      55                 :            : /*
      56                 :            :  * Default translator (generic bus)
      57                 :            :  */
      58                 :            : 
      59                 :          3 : static void of_bus_default_count_cells(struct device_node *dev,
      60                 :            :                                        int *addrc, int *sizec)
      61                 :            : {
      62                 :          3 :         if (addrc)
      63                 :          3 :                 *addrc = of_n_addr_cells(dev);
      64                 :          3 :         if (sizec)
      65                 :          3 :                 *sizec = of_n_size_cells(dev);
      66                 :          3 : }
      67                 :            : 
      68                 :          3 : static u64 of_bus_default_map(__be32 *addr, const __be32 *range,
      69                 :            :                 int na, int ns, int pna)
      70                 :            : {
      71                 :            :         u64 cp, s, da;
      72                 :            : 
      73                 :            :         cp = of_read_number(range, na);
      74                 :          3 :         s  = of_read_number(range + na + pna, ns);
      75                 :            :         da = of_read_number(addr, na);
      76                 :            : 
      77                 :            :         pr_debug("default map, cp=%llx, s=%llx, da=%llx\n",
      78                 :            :                  (unsigned long long)cp, (unsigned long long)s,
      79                 :            :                  (unsigned long long)da);
      80                 :            : 
      81                 :          3 :         if (da < cp || da >= (cp + s))
      82                 :            :                 return OF_BAD_ADDR;
      83                 :          3 :         return da - cp;
      84                 :            : }
      85                 :            : 
      86                 :          3 : static int of_bus_default_translate(__be32 *addr, u64 offset, int na)
      87                 :            : {
      88                 :            :         u64 a = of_read_number(addr, na);
      89                 :          3 :         memset(addr, 0, na * 4);
      90                 :          3 :         a += offset;
      91                 :          3 :         if (na > 1)
      92                 :          0 :                 addr[na - 2] = cpu_to_be32(a >> 32);
      93                 :          3 :         addr[na - 1] = cpu_to_be32(a & 0xffffffffu);
      94                 :            : 
      95                 :          3 :         return 0;
      96                 :            : }
      97                 :            : 
      98                 :          3 : static unsigned int of_bus_default_get_flags(const __be32 *addr)
      99                 :            : {
     100                 :          3 :         return IORESOURCE_MEM;
     101                 :            : }
     102                 :            : 
     103                 :            : #ifdef CONFIG_PCI
     104                 :            : /*
     105                 :            :  * PCI bus specific translator
     106                 :            :  */
     107                 :            : 
     108                 :            : static int of_bus_pci_match(struct device_node *np)
     109                 :            : {
     110                 :            :         /*
     111                 :            :          * "pciex" is PCI Express
     112                 :            :          * "vci" is for the /chaos bridge on 1st-gen PCI powermacs
     113                 :            :          * "ht" is hypertransport
     114                 :            :          */
     115                 :            :         return of_node_is_type(np, "pci") || of_node_is_type(np, "pciex") ||
     116                 :            :                 of_node_is_type(np, "vci") || of_node_is_type(np, "ht");
     117                 :            : }
     118                 :            : 
     119                 :            : static void of_bus_pci_count_cells(struct device_node *np,
     120                 :            :                                    int *addrc, int *sizec)
     121                 :            : {
     122                 :            :         if (addrc)
     123                 :            :                 *addrc = 3;
     124                 :            :         if (sizec)
     125                 :            :                 *sizec = 2;
     126                 :            : }
     127                 :            : 
     128                 :            : static unsigned int of_bus_pci_get_flags(const __be32 *addr)
     129                 :            : {
     130                 :            :         unsigned int flags = 0;
     131                 :            :         u32 w = be32_to_cpup(addr);
     132                 :            : 
     133                 :            :         switch((w >> 24) & 0x03) {
     134                 :            :         case 0x01:
     135                 :            :                 flags |= IORESOURCE_IO;
     136                 :            :                 break;
     137                 :            :         case 0x02: /* 32 bits */
     138                 :            :         case 0x03: /* 64 bits */
     139                 :            :                 flags |= IORESOURCE_MEM;
     140                 :            :                 break;
     141                 :            :         }
     142                 :            :         if (w & 0x40000000)
     143                 :            :                 flags |= IORESOURCE_PREFETCH;
     144                 :            :         return flags;
     145                 :            : }
     146                 :            : 
     147                 :            : static u64 of_bus_pci_map(__be32 *addr, const __be32 *range, int na, int ns,
     148                 :            :                 int pna)
     149                 :            : {
     150                 :            :         u64 cp, s, da;
     151                 :            :         unsigned int af, rf;
     152                 :            : 
     153                 :            :         af = of_bus_pci_get_flags(addr);
     154                 :            :         rf = of_bus_pci_get_flags(range);
     155                 :            : 
     156                 :            :         /* Check address type match */
     157                 :            :         if ((af ^ rf) & (IORESOURCE_MEM | IORESOURCE_IO))
     158                 :            :                 return OF_BAD_ADDR;
     159                 :            : 
     160                 :            :         /* Read address values, skipping high cell */
     161                 :            :         cp = of_read_number(range + 1, na - 1);
     162                 :            :         s  = of_read_number(range + na + pna, ns);
     163                 :            :         da = of_read_number(addr + 1, na - 1);
     164                 :            : 
     165                 :            :         pr_debug("PCI map, cp=%llx, s=%llx, da=%llx\n",
     166                 :            :                  (unsigned long long)cp, (unsigned long long)s,
     167                 :            :                  (unsigned long long)da);
     168                 :            : 
     169                 :            :         if (da < cp || da >= (cp + s))
     170                 :            :                 return OF_BAD_ADDR;
     171                 :            :         return da - cp;
     172                 :            : }
     173                 :            : 
     174                 :            : static int of_bus_pci_translate(__be32 *addr, u64 offset, int na)
     175                 :            : {
     176                 :            :         return of_bus_default_translate(addr + 1, offset, na - 1);
     177                 :            : }
     178                 :            : 
     179                 :            : const __be32 *of_get_pci_address(struct device_node *dev, int bar_no, u64 *size,
     180                 :            :                         unsigned int *flags)
     181                 :            : {
     182                 :            :         const __be32 *prop;
     183                 :            :         unsigned int psize;
     184                 :            :         struct device_node *parent;
     185                 :            :         struct of_bus *bus;
     186                 :            :         int onesize, i, na, ns;
     187                 :            : 
     188                 :            :         /* Get parent & match bus type */
     189                 :            :         parent = of_get_parent(dev);
     190                 :            :         if (parent == NULL)
     191                 :            :                 return NULL;
     192                 :            :         bus = of_match_bus(parent);
     193                 :            :         if (strcmp(bus->name, "pci")) {
     194                 :            :                 of_node_put(parent);
     195                 :            :                 return NULL;
     196                 :            :         }
     197                 :            :         bus->count_cells(dev, &na, &ns);
     198                 :            :         of_node_put(parent);
     199                 :            :         if (!OF_CHECK_ADDR_COUNT(na))
     200                 :            :                 return NULL;
     201                 :            : 
     202                 :            :         /* Get "reg" or "assigned-addresses" property */
     203                 :            :         prop = of_get_property(dev, bus->addresses, &psize);
     204                 :            :         if (prop == NULL)
     205                 :            :                 return NULL;
     206                 :            :         psize /= 4;
     207                 :            : 
     208                 :            :         onesize = na + ns;
     209                 :            :         for (i = 0; psize >= onesize; psize -= onesize, prop += onesize, i++) {
     210                 :            :                 u32 val = be32_to_cpu(prop[0]);
     211                 :            :                 if ((val & 0xff) == ((bar_no * 4) + PCI_BASE_ADDRESS_0)) {
     212                 :            :                         if (size)
     213                 :            :                                 *size = of_read_number(prop + na, ns);
     214                 :            :                         if (flags)
     215                 :            :                                 *flags = bus->get_flags(prop);
     216                 :            :                         return prop;
     217                 :            :                 }
     218                 :            :         }
     219                 :            :         return NULL;
     220                 :            : }
     221                 :            : EXPORT_SYMBOL(of_get_pci_address);
     222                 :            : 
     223                 :            : int of_pci_address_to_resource(struct device_node *dev, int bar,
     224                 :            :                                struct resource *r)
     225                 :            : {
     226                 :            :         const __be32    *addrp;
     227                 :            :         u64             size;
     228                 :            :         unsigned int    flags;
     229                 :            : 
     230                 :            :         addrp = of_get_pci_address(dev, bar, &size, &flags);
     231                 :            :         if (addrp == NULL)
     232                 :            :                 return -EINVAL;
     233                 :            :         return __of_address_to_resource(dev, addrp, size, flags, NULL, r);
     234                 :            : }
     235                 :            : EXPORT_SYMBOL_GPL(of_pci_address_to_resource);
     236                 :            : 
     237                 :            : static int parser_init(struct of_pci_range_parser *parser,
     238                 :            :                         struct device_node *node, const char *name)
     239                 :            : {
     240                 :            :         const int na = 3, ns = 2;
     241                 :            :         int rlen;
     242                 :            : 
     243                 :            :         parser->node = node;
     244                 :            :         parser->pna = of_n_addr_cells(node);
     245                 :            :         parser->np = parser->pna + na + ns;
     246                 :            : 
     247                 :            :         parser->range = of_get_property(node, name, &rlen);
     248                 :            :         if (parser->range == NULL)
     249                 :            :                 return -ENOENT;
     250                 :            : 
     251                 :            :         parser->end = parser->range + rlen / sizeof(__be32);
     252                 :            : 
     253                 :            :         return 0;
     254                 :            : }
     255                 :            : 
     256                 :            : int of_pci_range_parser_init(struct of_pci_range_parser *parser,
     257                 :            :                                 struct device_node *node)
     258                 :            : {
     259                 :            :         return parser_init(parser, node, "ranges");
     260                 :            : }
     261                 :            : EXPORT_SYMBOL_GPL(of_pci_range_parser_init);
     262                 :            : 
     263                 :            : int of_pci_dma_range_parser_init(struct of_pci_range_parser *parser,
     264                 :            :                                 struct device_node *node)
     265                 :            : {
     266                 :            :         return parser_init(parser, node, "dma-ranges");
     267                 :            : }
     268                 :            : EXPORT_SYMBOL_GPL(of_pci_dma_range_parser_init);
     269                 :            : 
     270                 :            : struct of_pci_range *of_pci_range_parser_one(struct of_pci_range_parser *parser,
     271                 :            :                                                 struct of_pci_range *range)
     272                 :            : {
     273                 :            :         const int na = 3, ns = 2;
     274                 :            : 
     275                 :            :         if (!range)
     276                 :            :                 return NULL;
     277                 :            : 
     278                 :            :         if (!parser->range || parser->range + parser->np > parser->end)
     279                 :            :                 return NULL;
     280                 :            : 
     281                 :            :         range->pci_space = be32_to_cpup(parser->range);
     282                 :            :         range->flags = of_bus_pci_get_flags(parser->range);
     283                 :            :         range->pci_addr = of_read_number(parser->range + 1, ns);
     284                 :            :         range->cpu_addr = of_translate_address(parser->node,
     285                 :            :                                 parser->range + na);
     286                 :            :         range->size = of_read_number(parser->range + parser->pna + na, ns);
     287                 :            : 
     288                 :            :         parser->range += parser->np;
     289                 :            : 
     290                 :            :         /* Now consume following elements while they are contiguous */
     291                 :            :         while (parser->range + parser->np <= parser->end) {
     292                 :            :                 u32 flags;
     293                 :            :                 u64 pci_addr, cpu_addr, size;
     294                 :            : 
     295                 :            :                 flags = of_bus_pci_get_flags(parser->range);
     296                 :            :                 pci_addr = of_read_number(parser->range + 1, ns);
     297                 :            :                 cpu_addr = of_translate_address(parser->node,
     298                 :            :                                 parser->range + na);
     299                 :            :                 size = of_read_number(parser->range + parser->pna + na, ns);
     300                 :            : 
     301                 :            :                 if (flags != range->flags)
     302                 :            :                         break;
     303                 :            :                 if (pci_addr != range->pci_addr + range->size ||
     304                 :            :                     cpu_addr != range->cpu_addr + range->size)
     305                 :            :                         break;
     306                 :            : 
     307                 :            :                 range->size += size;
     308                 :            :                 parser->range += parser->np;
     309                 :            :         }
     310                 :            : 
     311                 :            :         return range;
     312                 :            : }
     313                 :            : EXPORT_SYMBOL_GPL(of_pci_range_parser_one);
     314                 :            : 
     315                 :            : /*
     316                 :            :  * of_pci_range_to_resource - Create a resource from an of_pci_range
     317                 :            :  * @range:      the PCI range that describes the resource
     318                 :            :  * @np:         device node where the range belongs to
     319                 :            :  * @res:        pointer to a valid resource that will be updated to
     320                 :            :  *              reflect the values contained in the range.
     321                 :            :  *
     322                 :            :  * Returns EINVAL if the range cannot be converted to resource.
     323                 :            :  *
     324                 :            :  * Note that if the range is an IO range, the resource will be converted
     325                 :            :  * using pci_address_to_pio() which can fail if it is called too early or
     326                 :            :  * if the range cannot be matched to any host bridge IO space (our case here).
     327                 :            :  * To guard against that we try to register the IO range first.
     328                 :            :  * If that fails we know that pci_address_to_pio() will do too.
     329                 :            :  */
     330                 :            : int of_pci_range_to_resource(struct of_pci_range *range,
     331                 :            :                              struct device_node *np, struct resource *res)
     332                 :            : {
     333                 :            :         int err;
     334                 :            :         res->flags = range->flags;
     335                 :            :         res->parent = res->child = res->sibling = NULL;
     336                 :            :         res->name = np->full_name;
     337                 :            : 
     338                 :            :         if (res->flags & IORESOURCE_IO) {
     339                 :            :                 unsigned long port;
     340                 :            :                 err = pci_register_io_range(&np->fwnode, range->cpu_addr,
     341                 :            :                                 range->size);
     342                 :            :                 if (err)
     343                 :            :                         goto invalid_range;
     344                 :            :                 port = pci_address_to_pio(range->cpu_addr);
     345                 :            :                 if (port == (unsigned long)-1) {
     346                 :            :                         err = -EINVAL;
     347                 :            :                         goto invalid_range;
     348                 :            :                 }
     349                 :            :                 res->start = port;
     350                 :            :         } else {
     351                 :            :                 if ((sizeof(resource_size_t) < 8) &&
     352                 :            :                     upper_32_bits(range->cpu_addr)) {
     353                 :            :                         err = -EINVAL;
     354                 :            :                         goto invalid_range;
     355                 :            :                 }
     356                 :            : 
     357                 :            :                 res->start = range->cpu_addr;
     358                 :            :         }
     359                 :            :         res->end = res->start + range->size - 1;
     360                 :            :         return 0;
     361                 :            : 
     362                 :            : invalid_range:
     363                 :            :         res->start = (resource_size_t)OF_BAD_ADDR;
     364                 :            :         res->end = (resource_size_t)OF_BAD_ADDR;
     365                 :            :         return err;
     366                 :            : }
     367                 :            : EXPORT_SYMBOL(of_pci_range_to_resource);
     368                 :            : #endif /* CONFIG_PCI */
     369                 :            : 
     370                 :            : /*
     371                 :            :  * ISA bus specific translator
     372                 :            :  */
     373                 :            : 
     374                 :          3 : static int of_bus_isa_match(struct device_node *np)
     375                 :            : {
     376                 :          3 :         return of_node_name_eq(np, "isa");
     377                 :            : }
     378                 :            : 
     379                 :          0 : static void of_bus_isa_count_cells(struct device_node *child,
     380                 :            :                                    int *addrc, int *sizec)
     381                 :            : {
     382                 :          0 :         if (addrc)
     383                 :          0 :                 *addrc = 2;
     384                 :          0 :         if (sizec)
     385                 :          0 :                 *sizec = 1;
     386                 :          0 : }
     387                 :            : 
     388                 :          0 : static u64 of_bus_isa_map(__be32 *addr, const __be32 *range, int na, int ns,
     389                 :            :                 int pna)
     390                 :            : {
     391                 :            :         u64 cp, s, da;
     392                 :            : 
     393                 :            :         /* Check address type match */
     394                 :          0 :         if ((addr[0] ^ range[0]) & cpu_to_be32(1))
     395                 :            :                 return OF_BAD_ADDR;
     396                 :            : 
     397                 :            :         /* Read address values, skipping high cell */
     398                 :          0 :         cp = of_read_number(range + 1, na - 1);
     399                 :          0 :         s  = of_read_number(range + na + pna, ns);
     400                 :          0 :         da = of_read_number(addr + 1, na - 1);
     401                 :            : 
     402                 :            :         pr_debug("ISA map, cp=%llx, s=%llx, da=%llx\n",
     403                 :            :                  (unsigned long long)cp, (unsigned long long)s,
     404                 :            :                  (unsigned long long)da);
     405                 :            : 
     406                 :          0 :         if (da < cp || da >= (cp + s))
     407                 :            :                 return OF_BAD_ADDR;
     408                 :          0 :         return da - cp;
     409                 :            : }
     410                 :            : 
     411                 :          0 : static int of_bus_isa_translate(__be32 *addr, u64 offset, int na)
     412                 :            : {
     413                 :          0 :         return of_bus_default_translate(addr + 1, offset, na - 1);
     414                 :            : }
     415                 :            : 
     416                 :          0 : static unsigned int of_bus_isa_get_flags(const __be32 *addr)
     417                 :            : {
     418                 :            :         unsigned int flags = 0;
     419                 :            :         u32 w = be32_to_cpup(addr);
     420                 :            : 
     421                 :          0 :         if (w & 1)
     422                 :            :                 flags |= IORESOURCE_IO;
     423                 :            :         else
     424                 :            :                 flags |= IORESOURCE_MEM;
     425                 :          0 :         return flags;
     426                 :            : }
     427                 :            : 
     428                 :            : /*
     429                 :            :  * Array of bus specific translators
     430                 :            :  */
     431                 :            : 
     432                 :            : static struct of_bus of_busses[] = {
     433                 :            : #ifdef CONFIG_PCI
     434                 :            :         /* PCI */
     435                 :            :         {
     436                 :            :                 .name = "pci",
     437                 :            :                 .addresses = "assigned-addresses",
     438                 :            :                 .match = of_bus_pci_match,
     439                 :            :                 .count_cells = of_bus_pci_count_cells,
     440                 :            :                 .map = of_bus_pci_map,
     441                 :            :                 .translate = of_bus_pci_translate,
     442                 :            :                 .get_flags = of_bus_pci_get_flags,
     443                 :            :         },
     444                 :            : #endif /* CONFIG_PCI */
     445                 :            :         /* ISA */
     446                 :            :         {
     447                 :            :                 .name = "isa",
     448                 :            :                 .addresses = "reg",
     449                 :            :                 .match = of_bus_isa_match,
     450                 :            :                 .count_cells = of_bus_isa_count_cells,
     451                 :            :                 .map = of_bus_isa_map,
     452                 :            :                 .translate = of_bus_isa_translate,
     453                 :            :                 .get_flags = of_bus_isa_get_flags,
     454                 :            :         },
     455                 :            :         /* Default */
     456                 :            :         {
     457                 :            :                 .name = "default",
     458                 :            :                 .addresses = "reg",
     459                 :            :                 .match = NULL,
     460                 :            :                 .count_cells = of_bus_default_count_cells,
     461                 :            :                 .map = of_bus_default_map,
     462                 :            :                 .translate = of_bus_default_translate,
     463                 :            :                 .get_flags = of_bus_default_get_flags,
     464                 :            :         },
     465                 :            : };
     466                 :            : 
     467                 :          3 : static struct of_bus *of_match_bus(struct device_node *np)
     468                 :            : {
     469                 :            :         int i;
     470                 :            : 
     471                 :          3 :         for (i = 0; i < ARRAY_SIZE(of_busses); i++)
     472                 :          3 :                 if (!of_busses[i].match || of_busses[i].match(np))
     473                 :          3 :                         return &of_busses[i];
     474                 :          0 :         BUG();
     475                 :            :         return NULL;
     476                 :            : }
     477                 :            : 
     478                 :            : static int of_empty_ranges_quirk(struct device_node *np)
     479                 :            : {
     480                 :            :         if (IS_ENABLED(CONFIG_PPC)) {
     481                 :            :                 /* To save cycles, we cache the result for global "Mac" setting */
     482                 :            :                 static int quirk_state = -1;
     483                 :            : 
     484                 :            :                 /* PA-SEMI sdc DT bug */
     485                 :            :                 if (of_device_is_compatible(np, "1682m-sdc"))
     486                 :            :                         return true;
     487                 :            : 
     488                 :            :                 /* Make quirk cached */
     489                 :            :                 if (quirk_state < 0)
     490                 :            :                         quirk_state =
     491                 :            :                                 of_machine_is_compatible("Power Macintosh") ||
     492                 :            :                                 of_machine_is_compatible("MacRISC");
     493                 :            :                 return quirk_state;
     494                 :            :         }
     495                 :            :         return false;
     496                 :            : }
     497                 :            : 
     498                 :          3 : static int of_translate_one(struct device_node *parent, struct of_bus *bus,
     499                 :            :                             struct of_bus *pbus, __be32 *addr,
     500                 :            :                             int na, int ns, int pna, const char *rprop)
     501                 :            : {
     502                 :            :         const __be32 *ranges;
     503                 :            :         unsigned int rlen;
     504                 :            :         int rone;
     505                 :            :         u64 offset = OF_BAD_ADDR;
     506                 :            : 
     507                 :            :         /*
     508                 :            :          * Normally, an absence of a "ranges" property means we are
     509                 :            :          * crossing a non-translatable boundary, and thus the addresses
     510                 :            :          * below the current cannot be converted to CPU physical ones.
     511                 :            :          * Unfortunately, while this is very clear in the spec, it's not
     512                 :            :          * what Apple understood, and they do have things like /uni-n or
     513                 :            :          * /ht nodes with no "ranges" property and a lot of perfectly
     514                 :            :          * useable mapped devices below them. Thus we treat the absence of
     515                 :            :          * "ranges" as equivalent to an empty "ranges" property which means
     516                 :            :          * a 1:1 translation at that level. It's up to the caller not to try
     517                 :            :          * to translate addresses that aren't supposed to be translated in
     518                 :            :          * the first place. --BenH.
     519                 :            :          *
     520                 :            :          * As far as we know, this damage only exists on Apple machines, so
     521                 :            :          * This code is only enabled on powerpc. --gcl
     522                 :            :          *
     523                 :            :          * This quirk also applies for 'dma-ranges' which frequently exist in
     524                 :            :          * child nodes without 'dma-ranges' in the parent nodes. --RobH
     525                 :            :          */
     526                 :          3 :         ranges = of_get_property(parent, rprop, &rlen);
     527                 :          3 :         if (ranges == NULL && !of_empty_ranges_quirk(parent) &&
     528                 :          0 :             strcmp(rprop, "dma-ranges")) {
     529                 :            :                 pr_debug("no ranges; cannot translate\n");
     530                 :            :                 return 1;
     531                 :            :         }
     532                 :          3 :         if (ranges == NULL || rlen == 0) {
     533                 :            :                 offset = of_read_number(addr, na);
     534                 :          0 :                 memset(addr, 0, pna * 4);
     535                 :            :                 pr_debug("empty ranges; 1:1 translation\n");
     536                 :          0 :                 goto finish;
     537                 :            :         }
     538                 :            : 
     539                 :            :         pr_debug("walking ranges...\n");
     540                 :            : 
     541                 :            :         /* Now walk through the ranges */
     542                 :          3 :         rlen /= 4;
     543                 :          3 :         rone = na + pna + ns;
     544                 :          3 :         for (; rlen >= rone; rlen -= rone, ranges += rone) {
     545                 :          3 :                 offset = bus->map(addr, ranges, na, ns, pna);
     546                 :          3 :                 if (offset != OF_BAD_ADDR)
     547                 :            :                         break;
     548                 :            :         }
     549                 :          3 :         if (offset == OF_BAD_ADDR) {
     550                 :            :                 pr_debug("not found !\n");
     551                 :            :                 return 1;
     552                 :            :         }
     553                 :          3 :         memcpy(addr, ranges + na, 4 * pna);
     554                 :            : 
     555                 :            :  finish:
     556                 :            :         of_dump_addr("parent translation for:", addr, pna);
     557                 :            :         pr_debug("with offset: %llx\n", (unsigned long long)offset);
     558                 :            : 
     559                 :            :         /* Translate it into parent bus space */
     560                 :          3 :         return pbus->translate(addr, offset, pna);
     561                 :            : }
     562                 :            : 
     563                 :            : /*
     564                 :            :  * Translate an address from the device-tree into a CPU physical address,
     565                 :            :  * this walks up the tree and applies the various bus mappings on the
     566                 :            :  * way.
     567                 :            :  *
     568                 :            :  * Note: We consider that crossing any level with #size-cells == 0 to mean
     569                 :            :  * that translation is impossible (that is we are not dealing with a value
     570                 :            :  * that can be mapped to a cpu physical address). This is not really specified
     571                 :            :  * that way, but this is traditionally the way IBM at least do things
     572                 :            :  *
     573                 :            :  * Whenever the translation fails, the *host pointer will be set to the
     574                 :            :  * device that had registered logical PIO mapping, and the return code is
     575                 :            :  * relative to that node.
     576                 :            :  */
     577                 :          3 : static u64 __of_translate_address(struct device_node *dev,
     578                 :            :                                   struct device_node *(*get_parent)(const struct device_node *),
     579                 :            :                                   const __be32 *in_addr, const char *rprop,
     580                 :            :                                   struct device_node **host)
     581                 :            : {
     582                 :            :         struct device_node *parent = NULL;
     583                 :            :         struct of_bus *bus, *pbus;
     584                 :            :         __be32 addr[OF_MAX_ADDR_CELLS];
     585                 :            :         int na, ns, pna, pns;
     586                 :            :         u64 result = OF_BAD_ADDR;
     587                 :            : 
     588                 :            :         pr_debug("** translation for device %pOF **\n", dev);
     589                 :            : 
     590                 :            :         /* Increase refcount at current level */
     591                 :          3 :         of_node_get(dev);
     592                 :            : 
     593                 :          3 :         *host = NULL;
     594                 :            :         /* Get parent & match bus type */
     595                 :          3 :         parent = get_parent(dev);
     596                 :          3 :         if (parent == NULL)
     597                 :            :                 goto bail;
     598                 :          3 :         bus = of_match_bus(parent);
     599                 :            : 
     600                 :            :         /* Count address cells & copy address locally */
     601                 :          3 :         bus->count_cells(dev, &na, &ns);
     602                 :          3 :         if (!OF_CHECK_COUNTS(na, ns)) {
     603                 :            :                 pr_debug("Bad cell count for %pOF\n", dev);
     604                 :            :                 goto bail;
     605                 :            :         }
     606                 :          3 :         memcpy(addr, in_addr, na * 4);
     607                 :            : 
     608                 :            :         pr_debug("bus is %s (na=%d, ns=%d) on %pOF\n",
     609                 :            :             bus->name, na, ns, parent);
     610                 :            :         of_dump_addr("translating address:", addr, na);
     611                 :            : 
     612                 :            :         /* Translate */
     613                 :            :         for (;;) {
     614                 :            :                 struct logic_pio_hwaddr *iorange;
     615                 :            : 
     616                 :            :                 /* Switch to parent bus */
     617                 :          3 :                 of_node_put(dev);
     618                 :            :                 dev = parent;
     619                 :          3 :                 parent = get_parent(dev);
     620                 :            : 
     621                 :            :                 /* If root, we have finished */
     622                 :          3 :                 if (parent == NULL) {
     623                 :            :                         pr_debug("reached root node\n");
     624                 :          3 :                         result = of_read_number(addr, na);
     625                 :          3 :                         break;
     626                 :            :                 }
     627                 :            : 
     628                 :            :                 /*
     629                 :            :                  * For indirectIO device which has no ranges property, get
     630                 :            :                  * the address from reg directly.
     631                 :            :                  */
     632                 :          3 :                 iorange = find_io_range_by_fwnode(&dev->fwnode);
     633                 :          3 :                 if (iorange && (iorange->flags != LOGIC_PIO_CPU_MMIO)) {
     634                 :          0 :                         result = of_read_number(addr + 1, na - 1);
     635                 :            :                         pr_debug("indirectIO matched(%pOF) 0x%llx\n",
     636                 :            :                                  dev, result);
     637                 :          0 :                         *host = of_node_get(dev);
     638                 :          0 :                         break;
     639                 :            :                 }
     640                 :            : 
     641                 :            :                 /* Get new parent bus and counts */
     642                 :          3 :                 pbus = of_match_bus(parent);
     643                 :          3 :                 pbus->count_cells(dev, &pna, &pns);
     644                 :          3 :                 if (!OF_CHECK_COUNTS(pna, pns)) {
     645                 :          0 :                         pr_err("Bad cell count for %pOF\n", dev);
     646                 :          0 :                         break;
     647                 :            :                 }
     648                 :            : 
     649                 :            :                 pr_debug("parent bus is %s (na=%d, ns=%d) on %pOF\n",
     650                 :            :                     pbus->name, pna, pns, parent);
     651                 :            : 
     652                 :            :                 /* Apply bus translation */
     653                 :          3 :                 if (of_translate_one(dev, bus, pbus, addr, na, ns, pna, rprop))
     654                 :            :                         break;
     655                 :            : 
     656                 :            :                 /* Complete the move up one level */
     657                 :          3 :                 na = pna;
     658                 :          3 :                 ns = pns;
     659                 :            :                 bus = pbus;
     660                 :            : 
     661                 :            :                 of_dump_addr("one level translation:", addr, na);
     662                 :            :         }
     663                 :            :  bail:
     664                 :          3 :         of_node_put(parent);
     665                 :          3 :         of_node_put(dev);
     666                 :            : 
     667                 :          3 :         return result;
     668                 :            : }
     669                 :            : 
     670                 :          3 : u64 of_translate_address(struct device_node *dev, const __be32 *in_addr)
     671                 :            : {
     672                 :            :         struct device_node *host;
     673                 :            :         u64 ret;
     674                 :            : 
     675                 :          3 :         ret = __of_translate_address(dev, of_get_parent,
     676                 :            :                                      in_addr, "ranges", &host);
     677                 :          3 :         if (host) {
     678                 :          0 :                 of_node_put(host);
     679                 :          0 :                 return OF_BAD_ADDR;
     680                 :            :         }
     681                 :            : 
     682                 :            :         return ret;
     683                 :            : }
     684                 :            : EXPORT_SYMBOL(of_translate_address);
     685                 :            : 
     686                 :          3 : static struct device_node *__of_get_dma_parent(const struct device_node *np)
     687                 :            : {
     688                 :            :         struct of_phandle_args args;
     689                 :            :         int ret, index;
     690                 :            : 
     691                 :          3 :         index = of_property_match_string(np, "interconnect-names", "dma-mem");
     692                 :          3 :         if (index < 0)
     693                 :          3 :                 return of_get_parent(np);
     694                 :            : 
     695                 :          0 :         ret = of_parse_phandle_with_args(np, "interconnects",
     696                 :            :                                          "#interconnect-cells",
     697                 :            :                                          index, &args);
     698                 :          0 :         if (ret < 0)
     699                 :          0 :                 return of_get_parent(np);
     700                 :            : 
     701                 :          0 :         return of_node_get(args.np);
     702                 :            : }
     703                 :            : 
     704                 :            : static struct device_node *of_get_next_dma_parent(struct device_node *np)
     705                 :            : {
     706                 :            :         struct device_node *parent;
     707                 :            : 
     708                 :          3 :         parent = __of_get_dma_parent(np);
     709                 :          3 :         of_node_put(np);
     710                 :            : 
     711                 :            :         return parent;
     712                 :            : }
     713                 :            : 
     714                 :          3 : u64 of_translate_dma_address(struct device_node *dev, const __be32 *in_addr)
     715                 :            : {
     716                 :            :         struct device_node *host;
     717                 :            :         u64 ret;
     718                 :            : 
     719                 :          3 :         ret = __of_translate_address(dev, __of_get_dma_parent,
     720                 :            :                                      in_addr, "dma-ranges", &host);
     721                 :            : 
     722                 :          3 :         if (host) {
     723                 :          0 :                 of_node_put(host);
     724                 :          0 :                 return OF_BAD_ADDR;
     725                 :            :         }
     726                 :            : 
     727                 :            :         return ret;
     728                 :            : }
     729                 :            : EXPORT_SYMBOL(of_translate_dma_address);
     730                 :            : 
     731                 :          3 : const __be32 *of_get_address(struct device_node *dev, int index, u64 *size,
     732                 :            :                     unsigned int *flags)
     733                 :            : {
     734                 :            :         const __be32 *prop;
     735                 :            :         unsigned int psize;
     736                 :            :         struct device_node *parent;
     737                 :            :         struct of_bus *bus;
     738                 :            :         int onesize, i, na, ns;
     739                 :            : 
     740                 :            :         /* Get parent & match bus type */
     741                 :          3 :         parent = of_get_parent(dev);
     742                 :          3 :         if (parent == NULL)
     743                 :            :                 return NULL;
     744                 :          3 :         bus = of_match_bus(parent);
     745                 :          3 :         bus->count_cells(dev, &na, &ns);
     746                 :          3 :         of_node_put(parent);
     747                 :          3 :         if (!OF_CHECK_ADDR_COUNT(na))
     748                 :            :                 return NULL;
     749                 :            : 
     750                 :            :         /* Get "reg" or "assigned-addresses" property */
     751                 :          3 :         prop = of_get_property(dev, bus->addresses, &psize);
     752                 :          3 :         if (prop == NULL)
     753                 :            :                 return NULL;
     754                 :          3 :         psize /= 4;
     755                 :            : 
     756                 :          3 :         onesize = na + ns;
     757                 :          3 :         for (i = 0; psize >= onesize; psize -= onesize, prop += onesize, i++)
     758                 :          3 :                 if (i == index) {
     759                 :          3 :                         if (size)
     760                 :          3 :                                 *size = of_read_number(prop + na, ns);
     761                 :          3 :                         if (flags)
     762                 :          3 :                                 *flags = bus->get_flags(prop);
     763                 :          3 :                         return prop;
     764                 :            :                 }
     765                 :            :         return NULL;
     766                 :            : }
     767                 :            : EXPORT_SYMBOL(of_get_address);
     768                 :            : 
     769                 :          0 : static u64 of_translate_ioport(struct device_node *dev, const __be32 *in_addr,
     770                 :            :                         u64 size)
     771                 :            : {
     772                 :            :         u64 taddr;
     773                 :            :         unsigned long port;
     774                 :            :         struct device_node *host;
     775                 :            : 
     776                 :          0 :         taddr = __of_translate_address(dev, of_get_parent,
     777                 :            :                                        in_addr, "ranges", &host);
     778                 :          0 :         if (host) {
     779                 :            :                 /* host-specific port access */
     780                 :          0 :                 port = logic_pio_trans_hwaddr(&host->fwnode, taddr, size);
     781                 :          0 :                 of_node_put(host);
     782                 :            :         } else {
     783                 :            :                 /* memory-mapped I/O range */
     784                 :            :                 port = pci_address_to_pio(taddr);
     785                 :            :         }
     786                 :            : 
     787                 :          0 :         if (port == (unsigned long)-1)
     788                 :            :                 return OF_BAD_ADDR;
     789                 :            : 
     790                 :          0 :         return port;
     791                 :            : }
     792                 :            : 
     793                 :          3 : static int __of_address_to_resource(struct device_node *dev,
     794                 :            :                 const __be32 *addrp, u64 size, unsigned int flags,
     795                 :            :                 const char *name, struct resource *r)
     796                 :            : {
     797                 :            :         u64 taddr;
     798                 :            : 
     799                 :          3 :         if (flags & IORESOURCE_MEM)
     800                 :          3 :                 taddr = of_translate_address(dev, addrp);
     801                 :          0 :         else if (flags & IORESOURCE_IO)
     802                 :          0 :                 taddr = of_translate_ioport(dev, addrp, size);
     803                 :            :         else
     804                 :            :                 return -EINVAL;
     805                 :            : 
     806                 :          3 :         if (taddr == OF_BAD_ADDR)
     807                 :            :                 return -EINVAL;
     808                 :          3 :         memset(r, 0, sizeof(struct resource));
     809                 :            : 
     810                 :          3 :         r->start = taddr;
     811                 :          3 :         r->end = taddr + size - 1;
     812                 :          3 :         r->flags = flags;
     813                 :          3 :         r->name = name ? name : dev->full_name;
     814                 :            : 
     815                 :          3 :         return 0;
     816                 :            : }
     817                 :            : 
     818                 :            : /**
     819                 :            :  * of_address_to_resource - Translate device tree address and return as resource
     820                 :            :  *
     821                 :            :  * Note that if your address is a PIO address, the conversion will fail if
     822                 :            :  * the physical address can't be internally converted to an IO token with
     823                 :            :  * pci_address_to_pio(), that is because it's either called too early or it
     824                 :            :  * can't be matched to any host bridge IO space
     825                 :            :  */
     826                 :          3 : int of_address_to_resource(struct device_node *dev, int index,
     827                 :            :                            struct resource *r)
     828                 :            : {
     829                 :            :         const __be32    *addrp;
     830                 :            :         u64             size;
     831                 :            :         unsigned int    flags;
     832                 :          3 :         const char      *name = NULL;
     833                 :            : 
     834                 :          3 :         addrp = of_get_address(dev, index, &size, &flags);
     835                 :          3 :         if (addrp == NULL)
     836                 :            :                 return -EINVAL;
     837                 :            : 
     838                 :            :         /* Get optional "reg-names" property to add a name to a resource */
     839                 :            :         of_property_read_string_index(dev, "reg-names",       index, &name);
     840                 :            : 
     841                 :          3 :         return __of_address_to_resource(dev, addrp, size, flags, name, r);
     842                 :            : }
     843                 :            : EXPORT_SYMBOL_GPL(of_address_to_resource);
     844                 :            : 
     845                 :          0 : struct device_node *of_find_matching_node_by_address(struct device_node *from,
     846                 :            :                                         const struct of_device_id *matches,
     847                 :            :                                         u64 base_address)
     848                 :            : {
     849                 :            :         struct device_node *dn = of_find_matching_node(from, matches);
     850                 :            :         struct resource res;
     851                 :            : 
     852                 :          0 :         while (dn) {
     853                 :          0 :                 if (!of_address_to_resource(dn, 0, &res) &&
     854                 :          0 :                     res.start == base_address)
     855                 :          0 :                         return dn;
     856                 :            : 
     857                 :            :                 dn = of_find_matching_node(dn, matches);
     858                 :            :         }
     859                 :            : 
     860                 :            :         return NULL;
     861                 :            : }
     862                 :            : 
     863                 :            : 
     864                 :            : /**
     865                 :            :  * of_iomap - Maps the memory mapped IO for a given device_node
     866                 :            :  * @device:     the device whose io range will be mapped
     867                 :            :  * @index:      index of the io range
     868                 :            :  *
     869                 :            :  * Returns a pointer to the mapped memory
     870                 :            :  */
     871                 :          3 : void __iomem *of_iomap(struct device_node *np, int index)
     872                 :            : {
     873                 :            :         struct resource res;
     874                 :            : 
     875                 :          3 :         if (of_address_to_resource(np, index, &res))
     876                 :            :                 return NULL;
     877                 :            : 
     878                 :          3 :         return ioremap(res.start, resource_size(&res));
     879                 :            : }
     880                 :            : EXPORT_SYMBOL(of_iomap);
     881                 :            : 
     882                 :            : /*
     883                 :            :  * of_io_request_and_map - Requests a resource and maps the memory mapped IO
     884                 :            :  *                         for a given device_node
     885                 :            :  * @device:     the device whose io range will be mapped
     886                 :            :  * @index:      index of the io range
     887                 :            :  * @name:       name "override" for the memory region request or NULL
     888                 :            :  *
     889                 :            :  * Returns a pointer to the requested and mapped memory or an ERR_PTR() encoded
     890                 :            :  * error code on failure. Usage example:
     891                 :            :  *
     892                 :            :  *      base = of_io_request_and_map(node, 0, "foo");
     893                 :            :  *      if (IS_ERR(base))
     894                 :            :  *              return PTR_ERR(base);
     895                 :            :  */
     896                 :          0 : void __iomem *of_io_request_and_map(struct device_node *np, int index,
     897                 :            :                                     const char *name)
     898                 :            : {
     899                 :            :         struct resource res;
     900                 :            :         void __iomem *mem;
     901                 :            : 
     902                 :          0 :         if (of_address_to_resource(np, index, &res))
     903                 :            :                 return IOMEM_ERR_PTR(-EINVAL);
     904                 :            : 
     905                 :          0 :         if (!name)
     906                 :          0 :                 name = res.name;
     907                 :          0 :         if (!request_mem_region(res.start, resource_size(&res), name))
     908                 :            :                 return IOMEM_ERR_PTR(-EBUSY);
     909                 :            : 
     910                 :          0 :         mem = ioremap(res.start, resource_size(&res));
     911                 :          0 :         if (!mem) {
     912                 :          0 :                 release_mem_region(res.start, resource_size(&res));
     913                 :          0 :                 return IOMEM_ERR_PTR(-ENOMEM);
     914                 :            :         }
     915                 :            : 
     916                 :            :         return mem;
     917                 :            : }
     918                 :            : EXPORT_SYMBOL(of_io_request_and_map);
     919                 :            : 
     920                 :            : /**
     921                 :            :  * of_dma_get_range - Get DMA range info
     922                 :            :  * @np:         device node to get DMA range info
     923                 :            :  * @dma_addr:   pointer to store initial DMA address of DMA range
     924                 :            :  * @paddr:      pointer to store initial CPU address of DMA range
     925                 :            :  * @size:       pointer to store size of DMA range
     926                 :            :  *
     927                 :            :  * Look in bottom up direction for the first "dma-ranges" property
     928                 :            :  * and parse it.
     929                 :            :  *  dma-ranges format:
     930                 :            :  *      DMA addr (dma_addr)     : naddr cells
     931                 :            :  *      CPU addr (phys_addr_t)  : pna cells
     932                 :            :  *      size                    : nsize cells
     933                 :            :  *
     934                 :            :  * It returns -ENODEV if "dma-ranges" property was not found
     935                 :            :  * for this device in DT.
     936                 :            :  */
     937                 :          3 : int of_dma_get_range(struct device_node *np, u64 *dma_addr, u64 *paddr, u64 *size)
     938                 :            : {
     939                 :          3 :         struct device_node *node = of_node_get(np);
     940                 :            :         const __be32 *ranges = NULL;
     941                 :            :         int len, naddr, nsize, pna;
     942                 :            :         int ret = 0;
     943                 :            :         bool found_dma_ranges = false;
     944                 :            :         u64 dmaaddr;
     945                 :            : 
     946                 :          3 :         while (node) {
     947                 :          3 :                 ranges = of_get_property(node, "dma-ranges", &len);
     948                 :            : 
     949                 :            :                 /* Ignore empty ranges, they imply no translation required */
     950                 :          3 :                 if (ranges && len > 0)
     951                 :            :                         break;
     952                 :            : 
     953                 :            :                 /* Once we find 'dma-ranges', then a missing one is an error */
     954                 :          3 :                 if (found_dma_ranges && !ranges) {
     955                 :            :                         ret = -ENODEV;
     956                 :            :                         goto out;
     957                 :            :                 }
     958                 :            :                 found_dma_ranges = true;
     959                 :            : 
     960                 :            :                 node = of_get_next_dma_parent(node);
     961                 :            :         }
     962                 :            : 
     963                 :          3 :         if (!node || !ranges) {
     964                 :            :                 pr_debug("no dma-ranges found for node(%pOF)\n", np);
     965                 :            :                 ret = -ENODEV;
     966                 :            :                 goto out;
     967                 :            :         }
     968                 :            : 
     969                 :          3 :         naddr = of_bus_n_addr_cells(node);
     970                 :          3 :         nsize = of_bus_n_size_cells(node);
     971                 :          3 :         pna = of_n_addr_cells(node);
     972                 :          3 :         if ((len / sizeof(__be32)) % (pna + naddr + nsize)) {
     973                 :            :                 ret = -EINVAL;
     974                 :            :                 goto out;
     975                 :            :         }
     976                 :            : 
     977                 :            :         /* dma-ranges format:
     978                 :            :          * DMA addr     : naddr cells
     979                 :            :          * CPU addr     : pna cells
     980                 :            :          * size         : nsize cells
     981                 :            :          */
     982                 :            :         dmaaddr = of_read_number(ranges, naddr);
     983                 :          3 :         *paddr = of_translate_dma_address(node, ranges + naddr);
     984                 :          3 :         if (*paddr == OF_BAD_ADDR) {
     985                 :          0 :                 pr_err("translation of DMA address(%pad) to CPU address failed node(%pOF)\n",
     986                 :            :                        dma_addr, np);
     987                 :            :                 ret = -EINVAL;
     988                 :          0 :                 goto out;
     989                 :            :         }
     990                 :          3 :         *dma_addr = dmaaddr;
     991                 :            : 
     992                 :          3 :         *size = of_read_number(ranges + naddr + pna, nsize);
     993                 :            : 
     994                 :            :         pr_debug("dma_addr(%llx) cpu_addr(%llx) size(%llx)\n",
     995                 :            :                  *dma_addr, *paddr, *size);
     996                 :            : 
     997                 :            : out:
     998                 :          3 :         of_node_put(node);
     999                 :            : 
    1000                 :          3 :         return ret;
    1001                 :            : }
    1002                 :            : EXPORT_SYMBOL_GPL(of_dma_get_range);
    1003                 :            : 
    1004                 :            : /**
    1005                 :            :  * of_dma_is_coherent - Check if device is coherent
    1006                 :            :  * @np: device node
    1007                 :            :  *
    1008                 :            :  * It returns true if "dma-coherent" property was found
    1009                 :            :  * for this device in the DT, or if DMA is coherent by
    1010                 :            :  * default for OF devices on the current platform.
    1011                 :            :  */
    1012                 :          3 : bool of_dma_is_coherent(struct device_node *np)
    1013                 :            : {
    1014                 :          3 :         struct device_node *node = of_node_get(np);
    1015                 :            : 
    1016                 :            :         if (IS_ENABLED(CONFIG_OF_DMA_DEFAULT_COHERENT))
    1017                 :            :                 return true;
    1018                 :            : 
    1019                 :          3 :         while (node) {
    1020                 :          3 :                 if (of_property_read_bool(node, "dma-coherent")) {
    1021                 :          0 :                         of_node_put(node);
    1022                 :          0 :                         return true;
    1023                 :            :                 }
    1024                 :            :                 node = of_get_next_dma_parent(node);
    1025                 :            :         }
    1026                 :          3 :         of_node_put(node);
    1027                 :          3 :         return false;
    1028                 :            : }
    1029                 :            : EXPORT_SYMBOL_GPL(of_dma_is_coherent);
    

Generated by: LCOV version 1.14