linux/drivers/of/fdt.c
<<
>>
Prefs
   1/*
   2 * Functions for working with the Flattened Device Tree data format
   3 *
   4 * Copyright 2009 Benjamin Herrenschmidt, IBM Corp
   5 * benh@kernel.crashing.org
   6 *
   7 * This program is free software; you can redistribute it and/or
   8 * modify it under the terms of the GNU General Public License
   9 * version 2 as published by the Free Software Foundation.
  10 */
  11
  12#include <linux/crc32.h>
  13#include <linux/kernel.h>
  14#include <linux/initrd.h>
  15#include <linux/memblock.h>
  16#include <linux/of.h>
  17#include <linux/of_fdt.h>
  18#include <linux/of_reserved_mem.h>
  19#include <linux/sizes.h>
  20#include <linux/string.h>
  21#include <linux/errno.h>
  22#include <linux/slab.h>
  23#include <linux/libfdt.h>
  24#include <linux/debugfs.h>
  25#include <linux/serial_core.h>
  26#include <linux/sysfs.h>
  27
  28#include <asm/setup.h>  /* for COMMAND_LINE_SIZE */
  29#include <asm/page.h>
  30
  31/*
  32 * of_fdt_limit_memory - limit the number of regions in the /memory node
  33 * @limit: maximum entries
  34 *
  35 * Adjust the flattened device tree to have at most 'limit' number of
  36 * memory entries in the /memory node. This function may be called
  37 * any time after initial_boot_param is set.
  38 */
  39void of_fdt_limit_memory(int limit)
  40{
  41        int memory;
  42        int len;
  43        const void *val;
  44        int nr_address_cells = OF_ROOT_NODE_ADDR_CELLS_DEFAULT;
  45        int nr_size_cells = OF_ROOT_NODE_SIZE_CELLS_DEFAULT;
  46        const uint32_t *addr_prop;
  47        const uint32_t *size_prop;
  48        int root_offset;
  49        int cell_size;
  50
  51        root_offset = fdt_path_offset(initial_boot_params, "/");
  52        if (root_offset < 0)
  53                return;
  54
  55        addr_prop = fdt_getprop(initial_boot_params, root_offset,
  56                                "#address-cells", NULL);
  57        if (addr_prop)
  58                nr_address_cells = fdt32_to_cpu(*addr_prop);
  59
  60        size_prop = fdt_getprop(initial_boot_params, root_offset,
  61                                "#size-cells", NULL);
  62        if (size_prop)
  63                nr_size_cells = fdt32_to_cpu(*size_prop);
  64
  65        cell_size = sizeof(uint32_t)*(nr_address_cells + nr_size_cells);
  66
  67        memory = fdt_path_offset(initial_boot_params, "/memory");
  68        if (memory > 0) {
  69                val = fdt_getprop(initial_boot_params, memory, "reg", &len);
  70                if (len > limit*cell_size) {
  71                        len = limit*cell_size;
  72                        pr_debug("Limiting number of entries to %d\n", limit);
  73                        fdt_setprop(initial_boot_params, memory, "reg", val,
  74                                        len);
  75                }
  76        }
  77}
  78
  79/**
  80 * of_fdt_is_compatible - Return true if given node from the given blob has
  81 * compat in its compatible list
  82 * @blob: A device tree blob
  83 * @node: node to test
  84 * @compat: compatible string to compare with compatible list.
  85 *
  86 * On match, returns a non-zero value with smaller values returned for more
  87 * specific compatible values.
  88 */
  89int of_fdt_is_compatible(const void *blob,
  90                      unsigned long node, const char *compat)
  91{
  92        const char *cp;
  93        int cplen;
  94        unsigned long l, score = 0;
  95
  96        cp = fdt_getprop(blob, node, "compatible", &cplen);
  97        if (cp == NULL)
  98                return 0;
  99        while (cplen > 0) {
 100                score++;
 101                if (of_compat_cmp(cp, compat, strlen(compat)) == 0)
 102                        return score;
 103                l = strlen(cp) + 1;
 104                cp += l;
 105                cplen -= l;
 106        }
 107
 108        return 0;
 109}
 110
 111/**
 112 * of_fdt_match - Return true if node matches a list of compatible values
 113 */
 114int of_fdt_match(const void *blob, unsigned long node,
 115                 const char *const *compat)
 116{
 117        unsigned int tmp, score = 0;
 118
 119        if (!compat)
 120                return 0;
 121
 122        while (*compat) {
 123                tmp = of_fdt_is_compatible(blob, node, *compat);
 124                if (tmp && (score == 0 || (tmp < score)))
 125                        score = tmp;
 126                compat++;
 127        }
 128
 129        return score;
 130}
 131
 132static void *unflatten_dt_alloc(void **mem, unsigned long size,
 133                                       unsigned long align)
 134{
 135        void *res;
 136
 137        *mem = PTR_ALIGN(*mem, align);
 138        res = *mem;
 139        *mem += size;
 140
 141        return res;
 142}
 143
 144/**
 145 * unflatten_dt_node - Alloc and populate a device_node from the flat tree
 146 * @blob: The parent device tree blob
 147 * @mem: Memory chunk to use for allocating device nodes and properties
 148 * @p: pointer to node in flat tree
 149 * @dad: Parent struct device_node
 150 * @fpsize: Size of the node path up at the current depth.
 151 */
 152static void * unflatten_dt_node(void *blob,
 153                                void *mem,
 154                                int *poffset,
 155                                struct device_node *dad,
 156                                struct device_node **nodepp,
 157                                unsigned long fpsize,
 158                                bool dryrun)
 159{
 160        const __be32 *p;
 161        struct device_node *np;
 162        struct property *pp, **prev_pp = NULL;
 163        const char *pathp;
 164        unsigned int l, allocl;
 165        static int depth = 0;
 166        int old_depth;
 167        int offset;
 168        int has_name = 0;
 169        int new_format = 0;
 170
 171        pathp = fdt_get_name(blob, *poffset, &l);
 172        if (!pathp)
 173                return mem;
 174
 175        allocl = l++;
 176
 177        /* version 0x10 has a more compact unit name here instead of the full
 178         * path. we accumulate the full path size using "fpsize", we'll rebuild
 179         * it later. We detect this because the first character of the name is
 180         * not '/'.
 181         */
 182        if ((*pathp) != '/') {
 183                new_format = 1;
 184                if (fpsize == 0) {
 185                        /* root node: special case. fpsize accounts for path
 186                         * plus terminating zero. root node only has '/', so
 187                         * fpsize should be 2, but we want to avoid the first
 188                         * level nodes to have two '/' so we use fpsize 1 here
 189                         */
 190                        fpsize = 1;
 191                        allocl = 2;
 192                        l = 1;
 193                        pathp = "";
 194                } else {
 195                        /* account for '/' and path size minus terminal 0
 196                         * already in 'l'
 197                         */
 198                        fpsize += l;
 199                        allocl = fpsize;
 200                }
 201        }
 202
 203        np = unflatten_dt_alloc(&mem, sizeof(struct device_node) + allocl,
 204                                __alignof__(struct device_node));
 205        if (!dryrun) {
 206                char *fn;
 207                of_node_init(np);
 208                np->full_name = fn = ((char *)np) + sizeof(*np);
 209                if (new_format) {
 210                        /* rebuild full path for new format */
 211                        if (dad && dad->parent) {
 212                                strcpy(fn, dad->full_name);
 213#ifdef DEBUG
 214                                if ((strlen(fn) + l + 1) != allocl) {
 215                                        pr_debug("%s: p: %d, l: %d, a: %d\n",
 216                                                pathp, (int)strlen(fn),
 217                                                l, allocl);
 218                                }
 219#endif
 220                                fn += strlen(fn);
 221                        }
 222                        *(fn++) = '/';
 223                }
 224                memcpy(fn, pathp, l);
 225
 226                prev_pp = &np->properties;
 227                if (dad != NULL) {
 228                        np->parent = dad;
 229                        np->sibling = dad->child;
 230                        dad->child = np;
 231                }
 232        }
 233        /* process properties */
 234        for (offset = fdt_first_property_offset(blob, *poffset);
 235             (offset >= 0);
 236             (offset = fdt_next_property_offset(blob, offset))) {
 237                const char *pname;
 238                u32 sz;
 239
 240                if (!(p = fdt_getprop_by_offset(blob, offset, &pname, &sz))) {
 241                        offset = -FDT_ERR_INTERNAL;
 242                        break;
 243                }
 244
 245                if (pname == NULL) {
 246                        pr_info("Can't find property name in list !\n");
 247                        break;
 248                }
 249                if (strcmp(pname, "name") == 0)
 250                        has_name = 1;
 251                pp = unflatten_dt_alloc(&mem, sizeof(struct property),
 252                                        __alignof__(struct property));
 253                if (!dryrun) {
 254                        /* We accept flattened tree phandles either in
 255                         * ePAPR-style "phandle" properties, or the
 256                         * legacy "linux,phandle" properties.  If both
 257                         * appear and have different values, things
 258                         * will get weird.  Don't do that. */
 259                        if ((strcmp(pname, "phandle") == 0) ||
 260                            (strcmp(pname, "linux,phandle") == 0)) {
 261                                if (np->phandle == 0)
 262                                        np->phandle = be32_to_cpup(p);
 263                        }
 264                        /* And we process the "ibm,phandle" property
 265                         * used in pSeries dynamic device tree
 266                         * stuff */
 267                        if (strcmp(pname, "ibm,phandle") == 0)
 268                                np->phandle = be32_to_cpup(p);
 269                        pp->name = (char *)pname;
 270                        pp->length = sz;
 271                        pp->value = (__be32 *)p;
 272                        *prev_pp = pp;
 273                        prev_pp = &pp->next;
 274                }
 275        }
 276        /* with version 0x10 we may not have the name property, recreate
 277         * it here from the unit name if absent
 278         */
 279        if (!has_name) {
 280                const char *p1 = pathp, *ps = pathp, *pa = NULL;
 281                int sz;
 282
 283                while (*p1) {
 284                        if ((*p1) == '@')
 285                                pa = p1;
 286                        if ((*p1) == '/')
 287                                ps = p1 + 1;
 288                        p1++;
 289                }
 290                if (pa < ps)
 291                        pa = p1;
 292                sz = (pa - ps) + 1;
 293                pp = unflatten_dt_alloc(&mem, sizeof(struct property) + sz,
 294                                        __alignof__(struct property));
 295                if (!dryrun) {
 296                        pp->name = "name";
 297                        pp->length = sz;
 298                        pp->value = pp + 1;
 299                        *prev_pp = pp;
 300                        prev_pp = &pp->next;
 301                        memcpy(pp->value, ps, sz - 1);
 302                        ((char *)pp->value)[sz - 1] = 0;
 303                        pr_debug("fixed up name for %s -> %s\n", pathp,
 304                                (char *)pp->value);
 305                }
 306        }
 307        if (!dryrun) {
 308                *prev_pp = NULL;
 309                np->name = of_get_property(np, "name", NULL);
 310                np->type = of_get_property(np, "device_type", NULL);
 311
 312                if (!np->name)
 313                        np->name = "<NULL>";
 314                if (!np->type)
 315                        np->type = "<NULL>";
 316        }
 317
 318        old_depth = depth;
 319        *poffset = fdt_next_node(blob, *poffset, &depth);
 320        if (depth < 0)
 321                depth = 0;
 322        while (*poffset > 0 && depth > old_depth)
 323                mem = unflatten_dt_node(blob, mem, poffset, np, NULL,
 324                                        fpsize, dryrun);
 325
 326        if (*poffset < 0 && *poffset != -FDT_ERR_NOTFOUND)
 327                pr_err("unflatten: error %d processing FDT\n", *poffset);
 328
 329        /*
 330         * Reverse the child list. Some drivers assumes node order matches .dts
 331         * node order
 332         */
 333        if (!dryrun && np->child) {
 334                struct device_node *child = np->child;
 335                np->child = NULL;
 336                while (child) {
 337                        struct device_node *next = child->sibling;
 338                        child->sibling = np->child;
 339                        np->child = child;
 340                        child = next;
 341                }
 342        }
 343
 344        if (nodepp)
 345                *nodepp = np;
 346
 347        return mem;
 348}
 349
 350/**
 351 * __unflatten_device_tree - create tree of device_nodes from flat blob
 352 *
 353 * unflattens a device-tree, creating the
 354 * tree of struct device_node. It also fills the "name" and "type"
 355 * pointers of the nodes so the normal device-tree walking functions
 356 * can be used.
 357 * @blob: The blob to expand
 358 * @mynodes: The device_node tree created by the call
 359 * @dt_alloc: An allocator that provides a virtual address to memory
 360 * for the resulting tree
 361 */
 362static void __unflatten_device_tree(void *blob,
 363                             struct device_node **mynodes,
 364                             void * (*dt_alloc)(u64 size, u64 align))
 365{
 366        unsigned long size;
 367        int start;
 368        void *mem;
 369
 370        pr_debug(" -> unflatten_device_tree()\n");
 371
 372        if (!blob) {
 373                pr_debug("No device tree pointer\n");
 374                return;
 375        }
 376
 377        pr_debug("Unflattening device tree:\n");
 378        pr_debug("magic: %08x\n", fdt_magic(blob));
 379        pr_debug("size: %08x\n", fdt_totalsize(blob));
 380        pr_debug("version: %08x\n", fdt_version(blob));
 381
 382        if (fdt_check_header(blob)) {
 383                pr_err("Invalid device tree blob header\n");
 384                return;
 385        }
 386
 387        /* First pass, scan for size */
 388        start = 0;
 389        size = (unsigned long)unflatten_dt_node(blob, NULL, &start, NULL, NULL, 0, true);
 390        size = ALIGN(size, 4);
 391
 392        pr_debug("  size is %lx, allocating...\n", size);
 393
 394        /* Allocate memory for the expanded device tree */
 395        mem = dt_alloc(size + 4, __alignof__(struct device_node));
 396        memset(mem, 0, size);
 397
 398        *(__be32 *)(mem + size) = cpu_to_be32(0xdeadbeef);
 399
 400        pr_debug("  unflattening %p...\n", mem);
 401
 402        /* Second pass, do actual unflattening */
 403        start = 0;
 404        unflatten_dt_node(blob, mem, &start, NULL, mynodes, 0, false);
 405        if (be32_to_cpup(mem + size) != 0xdeadbeef)
 406                pr_warning("End of tree marker overwritten: %08x\n",
 407                           be32_to_cpup(mem + size));
 408
 409        pr_debug(" <- unflatten_device_tree()\n");
 410}
 411
 412static void *kernel_tree_alloc(u64 size, u64 align)
 413{
 414        return kzalloc(size, GFP_KERNEL);
 415}
 416
 417/**
 418 * of_fdt_unflatten_tree - create tree of device_nodes from flat blob
 419 *
 420 * unflattens the device-tree passed by the firmware, creating the
 421 * tree of struct device_node. It also fills the "name" and "type"
 422 * pointers of the nodes so the normal device-tree walking functions
 423 * can be used.
 424 */
 425void of_fdt_unflatten_tree(unsigned long *blob,
 426                        struct device_node **mynodes)
 427{
 428        __unflatten_device_tree(blob, mynodes, &kernel_tree_alloc);
 429}
 430EXPORT_SYMBOL_GPL(of_fdt_unflatten_tree);
 431
 432/* Everything below here references initial_boot_params directly. */
 433int __initdata dt_root_addr_cells;
 434int __initdata dt_root_size_cells;
 435
 436void *initial_boot_params;
 437
 438#ifdef CONFIG_OF_EARLY_FLATTREE
 439
 440static u32 of_fdt_crc32;
 441
 442/**
 443 * res_mem_reserve_reg() - reserve all memory described in 'reg' property
 444 */
 445static int __init __reserved_mem_reserve_reg(unsigned long node,
 446                                             const char *uname)
 447{
 448        int t_len = (dt_root_addr_cells + dt_root_size_cells) * sizeof(__be32);
 449        phys_addr_t base, size;
 450        int len;
 451        const __be32 *prop;
 452        int nomap, first = 1;
 453
 454        prop = of_get_flat_dt_prop(node, "reg", &len);
 455        if (!prop)
 456                return -ENOENT;
 457
 458        if (len && len % t_len != 0) {
 459                pr_err("Reserved memory: invalid reg property in '%s', skipping node.\n",
 460                       uname);
 461                return -EINVAL;
 462        }
 463
 464        nomap = of_get_flat_dt_prop(node, "no-map", NULL) != NULL;
 465
 466        while (len >= t_len) {
 467                base = dt_mem_next_cell(dt_root_addr_cells, &prop);
 468                size = dt_mem_next_cell(dt_root_size_cells, &prop);
 469
 470                if (size &&
 471                    early_init_dt_reserve_memory_arch(base, size, nomap) == 0)
 472                        pr_debug("Reserved memory: reserved region for node '%s': base %pa, size %ld MiB\n",
 473                                uname, &base, (unsigned long)size / SZ_1M);
 474                else
 475                        pr_info("Reserved memory: failed to reserve memory for node '%s': base %pa, size %ld MiB\n",
 476                                uname, &base, (unsigned long)size / SZ_1M);
 477
 478                len -= t_len;
 479                if (first) {
 480                        fdt_reserved_mem_save_node(node, uname, base, size);
 481                        first = 0;
 482                }
 483        }
 484        return 0;
 485}
 486
 487/**
 488 * __reserved_mem_check_root() - check if #size-cells, #address-cells provided
 489 * in /reserved-memory matches the values supported by the current implementation,
 490 * also check if ranges property has been provided
 491 */
 492static int __init __reserved_mem_check_root(unsigned long node)
 493{
 494        const __be32 *prop;
 495
 496        prop = of_get_flat_dt_prop(node, "#size-cells", NULL);
 497        if (!prop || be32_to_cpup(prop) != dt_root_size_cells)
 498                return -EINVAL;
 499
 500        prop = of_get_flat_dt_prop(node, "#address-cells", NULL);
 501        if (!prop || be32_to_cpup(prop) != dt_root_addr_cells)
 502                return -EINVAL;
 503
 504        prop = of_get_flat_dt_prop(node, "ranges", NULL);
 505        if (!prop)
 506                return -EINVAL;
 507        return 0;
 508}
 509
 510/**
 511 * fdt_scan_reserved_mem() - scan a single FDT node for reserved memory
 512 */
 513static int __init __fdt_scan_reserved_mem(unsigned long node, const char *uname,
 514                                          int depth, void *data)
 515{
 516        static int found;
 517        const char *status;
 518        int err;
 519
 520        if (!found && depth == 1 && strcmp(uname, "reserved-memory") == 0) {
 521                if (__reserved_mem_check_root(node) != 0) {
 522                        pr_err("Reserved memory: unsupported node format, ignoring\n");
 523                        /* break scan */
 524                        return 1;
 525                }
 526                found = 1;
 527                /* scan next node */
 528                return 0;
 529        } else if (!found) {
 530                /* scan next node */
 531                return 0;
 532        } else if (found && depth < 2) {
 533                /* scanning of /reserved-memory has been finished */
 534                return 1;
 535        }
 536
 537        status = of_get_flat_dt_prop(node, "status", NULL);
 538        if (status && strcmp(status, "okay") != 0 && strcmp(status, "ok") != 0)
 539                return 0;
 540
 541        err = __reserved_mem_reserve_reg(node, uname);
 542        if (err == -ENOENT && of_get_flat_dt_prop(node, "size", NULL))
 543                fdt_reserved_mem_save_node(node, uname, 0, 0);
 544
 545        /* scan next node */
 546        return 0;
 547}
 548
 549/**
 550 * early_init_fdt_scan_reserved_mem() - create reserved memory regions
 551 *
 552 * This function grabs memory from early allocator for device exclusive use
 553 * defined in device tree structures. It should be called by arch specific code
 554 * once the early allocator (i.e. memblock) has been fully activated.
 555 */
 556void __init early_init_fdt_scan_reserved_mem(void)
 557{
 558        int n;
 559        u64 base, size;
 560
 561        if (!initial_boot_params)
 562                return;
 563
 564        /* Reserve the dtb region */
 565        early_init_dt_reserve_memory_arch(__pa(initial_boot_params),
 566                                          fdt_totalsize(initial_boot_params),
 567                                          0);
 568
 569        /* Process header /memreserve/ fields */
 570        for (n = 0; ; n++) {
 571                fdt_get_mem_rsv(initial_boot_params, n, &base, &size);
 572                if (!size)
 573                        break;
 574                early_init_dt_reserve_memory_arch(base, size, 0);
 575        }
 576
 577        of_scan_flat_dt(__fdt_scan_reserved_mem, NULL);
 578        fdt_init_reserved_mem();
 579}
 580
 581/**
 582 * of_scan_flat_dt - scan flattened tree blob and call callback on each.
 583 * @it: callback function
 584 * @data: context data pointer
 585 *
 586 * This function is used to scan the flattened device-tree, it is
 587 * used to extract the memory information at boot before we can
 588 * unflatten the tree
 589 */
 590int __init of_scan_flat_dt(int (*it)(unsigned long node,
 591                                     const char *uname, int depth,
 592                                     void *data),
 593                           void *data)
 594{
 595        const void *blob = initial_boot_params;
 596        const char *pathp;
 597        int offset, rc = 0, depth = -1;
 598
 599        for (offset = fdt_next_node(blob, -1, &depth);
 600             offset >= 0 && depth >= 0 && !rc;
 601             offset = fdt_next_node(blob, offset, &depth)) {
 602
 603                pathp = fdt_get_name(blob, offset, NULL);
 604                if (*pathp == '/')
 605                        pathp = kbasename(pathp);
 606                rc = it(offset, pathp, depth, data);
 607        }
 608        return rc;
 609}
 610
 611/**
 612 * of_get_flat_dt_root - find the root node in the flat blob
 613 */
 614unsigned long __init of_get_flat_dt_root(void)
 615{
 616        return 0;
 617}
 618
 619/**
 620 * of_get_flat_dt_size - Return the total size of the FDT
 621 */
 622int __init of_get_flat_dt_size(void)
 623{
 624        return fdt_totalsize(initial_boot_params);
 625}
 626
 627/**
 628 * of_get_flat_dt_prop - Given a node in the flat blob, return the property ptr
 629 *
 630 * This function can be used within scan_flattened_dt callback to get
 631 * access to properties
 632 */
 633const void *__init of_get_flat_dt_prop(unsigned long node, const char *name,
 634                                       int *size)
 635{
 636        return fdt_getprop(initial_boot_params, node, name, size);
 637}
 638
 639/**
 640 * of_flat_dt_is_compatible - Return true if given node has compat in compatible list
 641 * @node: node to test
 642 * @compat: compatible string to compare with compatible list.
 643 */
 644int __init of_flat_dt_is_compatible(unsigned long node, const char *compat)
 645{
 646        return of_fdt_is_compatible(initial_boot_params, node, compat);
 647}
 648
 649/**
 650 * of_flat_dt_match - Return true if node matches a list of compatible values
 651 */
 652int __init of_flat_dt_match(unsigned long node, const char *const *compat)
 653{
 654        return of_fdt_match(initial_boot_params, node, compat);
 655}
 656
 657struct fdt_scan_status {
 658        const char *name;
 659        int namelen;
 660        int depth;
 661        int found;
 662        int (*iterator)(unsigned long node, const char *uname, int depth, void *data);
 663        void *data;
 664};
 665
 666const char * __init of_flat_dt_get_machine_name(void)
 667{
 668        const char *name;
 669        unsigned long dt_root = of_get_flat_dt_root();
 670
 671        name = of_get_flat_dt_prop(dt_root, "model", NULL);
 672        if (!name)
 673                name = of_get_flat_dt_prop(dt_root, "compatible", NULL);
 674        return name;
 675}
 676
 677/**
 678 * of_flat_dt_match_machine - Iterate match tables to find matching machine.
 679 *
 680 * @default_match: A machine specific ptr to return in case of no match.
 681 * @get_next_compat: callback function to return next compatible match table.
 682 *
 683 * Iterate through machine match tables to find the best match for the machine
 684 * compatible string in the FDT.
 685 */
 686const void * __init of_flat_dt_match_machine(const void *default_match,
 687                const void * (*get_next_compat)(const char * const**))
 688{
 689        const void *data = NULL;
 690        const void *best_data = default_match;
 691        const char *const *compat;
 692        unsigned long dt_root;
 693        unsigned int best_score = ~1, score = 0;
 694
 695        dt_root = of_get_flat_dt_root();
 696        while ((data = get_next_compat(&compat))) {
 697                score = of_flat_dt_match(dt_root, compat);
 698                if (score > 0 && score < best_score) {
 699                        best_data = data;
 700                        best_score = score;
 701                }
 702        }
 703        if (!best_data) {
 704                const char *prop;
 705                int size;
 706
 707                pr_err("\n unrecognized device tree list:\n[ ");
 708
 709                prop = of_get_flat_dt_prop(dt_root, "compatible", &size);
 710                if (prop) {
 711                        while (size > 0) {
 712                                printk("'%s' ", prop);
 713                                size -= strlen(prop) + 1;
 714                                prop += strlen(prop) + 1;
 715                        }
 716                }
 717                printk("]\n\n");
 718                return NULL;
 719        }
 720
 721        pr_info("Machine model: %s\n", of_flat_dt_get_machine_name());
 722
 723        return best_data;
 724}
 725
 726#ifdef CONFIG_BLK_DEV_INITRD
 727/**
 728 * early_init_dt_check_for_initrd - Decode initrd location from flat tree
 729 * @node: reference to node containing initrd location ('chosen')
 730 */
 731static void __init early_init_dt_check_for_initrd(unsigned long node)
 732{
 733        u64 start, end;
 734        int len;
 735        const __be32 *prop;
 736
 737        pr_debug("Looking for initrd properties... ");
 738
 739        prop = of_get_flat_dt_prop(node, "linux,initrd-start", &len);
 740        if (!prop)
 741                return;
 742        start = of_read_number(prop, len/4);
 743
 744        prop = of_get_flat_dt_prop(node, "linux,initrd-end", &len);
 745        if (!prop)
 746                return;
 747        end = of_read_number(prop, len/4);
 748
 749        initrd_start = (unsigned long)__va(start);
 750        initrd_end = (unsigned long)__va(end);
 751        initrd_below_start_ok = 1;
 752
 753        pr_debug("initrd_start=0x%llx  initrd_end=0x%llx\n",
 754                 (unsigned long long)start, (unsigned long long)end);
 755}
 756#else
 757static inline void early_init_dt_check_for_initrd(unsigned long node)
 758{
 759}
 760#endif /* CONFIG_BLK_DEV_INITRD */
 761
 762#ifdef CONFIG_SERIAL_EARLYCON
 763extern struct of_device_id __earlycon_of_table[];
 764
 765static int __init early_init_dt_scan_chosen_serial(void)
 766{
 767        int offset;
 768        const char *p;
 769        int l;
 770        const struct of_device_id *match = __earlycon_of_table;
 771        const void *fdt = initial_boot_params;
 772
 773        offset = fdt_path_offset(fdt, "/chosen");
 774        if (offset < 0)
 775                offset = fdt_path_offset(fdt, "/chosen@0");
 776        if (offset < 0)
 777                return -ENOENT;
 778
 779        p = fdt_getprop(fdt, offset, "stdout-path", &l);
 780        if (!p)
 781                p = fdt_getprop(fdt, offset, "linux,stdout-path", &l);
 782        if (!p || !l)
 783                return -ENOENT;
 784
 785        /* Get the node specified by stdout-path */
 786        offset = fdt_path_offset(fdt, p);
 787        if (offset < 0)
 788                return -ENODEV;
 789
 790        while (match->compatible[0]) {
 791                unsigned long addr;
 792                if (fdt_node_check_compatible(fdt, offset, match->compatible)) {
 793                        match++;
 794                        continue;
 795                }
 796
 797                addr = fdt_translate_address(fdt, offset);
 798                if (!addr)
 799                        return -ENXIO;
 800
 801                of_setup_earlycon(addr, match->data);
 802                return 0;
 803        }
 804        return -ENODEV;
 805}
 806
 807static int __init setup_of_earlycon(char *buf)
 808{
 809        if (buf)
 810                return 0;
 811
 812        return early_init_dt_scan_chosen_serial();
 813}
 814early_param("earlycon", setup_of_earlycon);
 815#endif
 816
 817/**
 818 * early_init_dt_scan_root - fetch the top level address and size cells
 819 */
 820int __init early_init_dt_scan_root(unsigned long node, const char *uname,
 821                                   int depth, void *data)
 822{
 823        const __be32 *prop;
 824
 825        if (depth != 0)
 826                return 0;
 827
 828        dt_root_size_cells = OF_ROOT_NODE_SIZE_CELLS_DEFAULT;
 829        dt_root_addr_cells = OF_ROOT_NODE_ADDR_CELLS_DEFAULT;
 830
 831        prop = of_get_flat_dt_prop(node, "#size-cells", NULL);
 832        if (prop)
 833                dt_root_size_cells = be32_to_cpup(prop);
 834        pr_debug("dt_root_size_cells = %x\n", dt_root_size_cells);
 835
 836        prop = of_get_flat_dt_prop(node, "#address-cells", NULL);
 837        if (prop)
 838                dt_root_addr_cells = be32_to_cpup(prop);
 839        pr_debug("dt_root_addr_cells = %x\n", dt_root_addr_cells);
 840
 841        /* break now */
 842        return 1;
 843}
 844
 845u64 __init dt_mem_next_cell(int s, const __be32 **cellp)
 846{
 847        const __be32 *p = *cellp;
 848
 849        *cellp = p + s;
 850        return of_read_number(p, s);
 851}
 852
 853/**
 854 * early_init_dt_scan_memory - Look for an parse memory nodes
 855 */
 856int __init early_init_dt_scan_memory(unsigned long node, const char *uname,
 857                                     int depth, void *data)
 858{
 859        const char *type = of_get_flat_dt_prop(node, "device_type", NULL);
 860        const __be32 *reg, *endp;
 861        int l;
 862
 863        /* We are scanning "memory" nodes only */
 864        if (type == NULL) {
 865                /*
 866                 * The longtrail doesn't have a device_type on the
 867                 * /memory node, so look for the node called /memory@0.
 868                 */
 869                if (!IS_ENABLED(CONFIG_PPC32) || depth != 1 || strcmp(uname, "memory@0") != 0)
 870                        return 0;
 871        } else if (strcmp(type, "memory") != 0)
 872                return 0;
 873
 874        reg = of_get_flat_dt_prop(node, "linux,usable-memory", &l);
 875        if (reg == NULL)
 876                reg = of_get_flat_dt_prop(node, "reg", &l);
 877        if (reg == NULL)
 878                return 0;
 879
 880        endp = reg + (l / sizeof(__be32));
 881
 882        pr_debug("memory scan node %s, reg size %d, data: %x %x %x %x,\n",
 883            uname, l, reg[0], reg[1], reg[2], reg[3]);
 884
 885        while ((endp - reg) >= (dt_root_addr_cells + dt_root_size_cells)) {
 886                u64 base, size;
 887
 888                base = dt_mem_next_cell(dt_root_addr_cells, &reg);
 889                size = dt_mem_next_cell(dt_root_size_cells, &reg);
 890
 891                if (size == 0)
 892                        continue;
 893                pr_debug(" - %llx ,  %llx\n", (unsigned long long)base,
 894                    (unsigned long long)size);
 895
 896                early_init_dt_add_memory_arch(base, size);
 897        }
 898
 899        return 0;
 900}
 901
 902int __init early_init_dt_scan_chosen(unsigned long node, const char *uname,
 903                                     int depth, void *data)
 904{
 905        int l;
 906        const char *p;
 907
 908        pr_debug("search \"chosen\", depth: %d, uname: %s\n", depth, uname);
 909
 910        if (depth != 1 || !data ||
 911            (strcmp(uname, "chosen") != 0 && strcmp(uname, "chosen@0") != 0))
 912                return 0;
 913
 914        early_init_dt_check_for_initrd(node);
 915
 916        /* Retrieve command line */
 917        p = of_get_flat_dt_prop(node, "bootargs", &l);
 918        if (p != NULL && l > 0)
 919                strlcpy(data, p, min((int)l, COMMAND_LINE_SIZE));
 920
 921        /*
 922         * CONFIG_CMDLINE is meant to be a default in case nothing else
 923         * managed to set the command line, unless CONFIG_CMDLINE_FORCE
 924         * is set in which case we override whatever was found earlier.
 925         */
 926#ifdef CONFIG_CMDLINE
 927#ifndef CONFIG_CMDLINE_FORCE
 928        if (!((char *)data)[0])
 929#endif
 930                strlcpy(data, CONFIG_CMDLINE, COMMAND_LINE_SIZE);
 931#endif /* CONFIG_CMDLINE */
 932
 933        pr_debug("Command line is: %s\n", (char*)data);
 934
 935        /* break now */
 936        return 1;
 937}
 938
 939#ifdef CONFIG_HAVE_MEMBLOCK
 940#define MAX_PHYS_ADDR   ((phys_addr_t)~0)
 941
 942void __init __weak early_init_dt_add_memory_arch(u64 base, u64 size)
 943{
 944        const u64 phys_offset = __pa(PAGE_OFFSET);
 945
 946        if (!PAGE_ALIGNED(base)) {
 947                if (size < PAGE_SIZE - (base & ~PAGE_MASK)) {
 948                        pr_warn("Ignoring memory block 0x%llx - 0x%llx\n",
 949                                base, base + size);
 950                        return;
 951                }
 952                size -= PAGE_SIZE - (base & ~PAGE_MASK);
 953                base = PAGE_ALIGN(base);
 954        }
 955        size &= PAGE_MASK;
 956
 957        if (base > MAX_PHYS_ADDR) {
 958                pr_warning("Ignoring memory block 0x%llx - 0x%llx\n",
 959                                base, base + size);
 960                return;
 961        }
 962
 963        if (base + size - 1 > MAX_PHYS_ADDR) {
 964                pr_warning("Ignoring memory range 0x%llx - 0x%llx\n",
 965                                ((u64)MAX_PHYS_ADDR) + 1, base + size);
 966                size = MAX_PHYS_ADDR - base + 1;
 967        }
 968
 969        if (base + size < phys_offset) {
 970                pr_warning("Ignoring memory block 0x%llx - 0x%llx\n",
 971                           base, base + size);
 972                return;
 973        }
 974        if (base < phys_offset) {
 975                pr_warning("Ignoring memory range 0x%llx - 0x%llx\n",
 976                           base, phys_offset);
 977                size -= phys_offset - base;
 978                base = phys_offset;
 979        }
 980        memblock_add(base, size);
 981}
 982
 983int __init __weak early_init_dt_reserve_memory_arch(phys_addr_t base,
 984                                        phys_addr_t size, bool nomap)
 985{
 986        if (nomap)
 987                return memblock_remove(base, size);
 988        return memblock_reserve(base, size);
 989}
 990
 991/*
 992 * called from unflatten_device_tree() to bootstrap devicetree itself
 993 * Architectures can override this definition if memblock isn't used
 994 */
 995void * __init __weak early_init_dt_alloc_memory_arch(u64 size, u64 align)
 996{
 997        return __va(memblock_alloc(size, align));
 998}
 999#else
1000int __init __weak early_init_dt_reserve_memory_arch(phys_addr_t base,
1001                                        phys_addr_t size, bool nomap)
1002{
1003        pr_err("Reserved memory not supported, ignoring range 0x%pa - 0x%pa%s\n",
1004                  &base, &size, nomap ? " (nomap)" : "");
1005        return -ENOSYS;
1006}
1007#endif
1008
1009bool __init early_init_dt_verify(void *params)
1010{
1011        if (!params)
1012                return false;
1013
1014        /* check device tree validity */
1015        if (fdt_check_header(params))
1016                return false;
1017
1018        /* Setup flat device-tree pointer */
1019        initial_boot_params = params;
1020        of_fdt_crc32 = crc32_be(~0, initial_boot_params,
1021                                fdt_totalsize(initial_boot_params));
1022        return true;
1023}
1024
1025
1026void __init early_init_dt_scan_nodes(void)
1027{
1028        /* Retrieve various information from the /chosen node */
1029        of_scan_flat_dt(early_init_dt_scan_chosen, boot_command_line);
1030
1031        /* Initialize {size,address}-cells info */
1032        of_scan_flat_dt(early_init_dt_scan_root, NULL);
1033
1034        /* Setup memory, calling early_init_dt_add_memory_arch */
1035        of_scan_flat_dt(early_init_dt_scan_memory, NULL);
1036}
1037
1038bool __init early_init_dt_scan(void *params)
1039{
1040        bool status;
1041
1042        status = early_init_dt_verify(params);
1043        if (!status)
1044                return false;
1045
1046        early_init_dt_scan_nodes();
1047        return true;
1048}
1049
1050/**
1051 * unflatten_device_tree - create tree of device_nodes from flat blob
1052 *
1053 * unflattens the device-tree passed by the firmware, creating the
1054 * tree of struct device_node. It also fills the "name" and "type"
1055 * pointers of the nodes so the normal device-tree walking functions
1056 * can be used.
1057 */
1058void __init unflatten_device_tree(void)
1059{
1060        __unflatten_device_tree(initial_boot_params, &of_root,
1061                                early_init_dt_alloc_memory_arch);
1062
1063        /* Get pointer to "/chosen" and "/aliases" nodes for use everywhere */
1064        of_alias_scan(early_init_dt_alloc_memory_arch);
1065}
1066
1067/**
1068 * unflatten_and_copy_device_tree - copy and create tree of device_nodes from flat blob
1069 *
1070 * Copies and unflattens the device-tree passed by the firmware, creating the
1071 * tree of struct device_node. It also fills the "name" and "type"
1072 * pointers of the nodes so the normal device-tree walking functions
1073 * can be used. This should only be used when the FDT memory has not been
1074 * reserved such is the case when the FDT is built-in to the kernel init
1075 * section. If the FDT memory is reserved already then unflatten_device_tree
1076 * should be used instead.
1077 */
1078void __init unflatten_and_copy_device_tree(void)
1079{
1080        int size;
1081        void *dt;
1082
1083        if (!initial_boot_params) {
1084                pr_warn("No valid device tree found, continuing without\n");
1085                return;
1086        }
1087
1088        size = fdt_totalsize(initial_boot_params);
1089        dt = early_init_dt_alloc_memory_arch(size,
1090                                             roundup_pow_of_two(FDT_V17_SIZE));
1091
1092        if (dt) {
1093                memcpy(dt, initial_boot_params, size);
1094                initial_boot_params = dt;
1095        }
1096        unflatten_device_tree();
1097}
1098
1099#ifdef CONFIG_SYSFS
1100static ssize_t of_fdt_raw_read(struct file *filp, struct kobject *kobj,
1101                               struct bin_attribute *bin_attr,
1102                               char *buf, loff_t off, size_t count)
1103{
1104        memcpy(buf, initial_boot_params + off, count);
1105        return count;
1106}
1107
1108static int __init of_fdt_raw_init(void)
1109{
1110        static struct bin_attribute of_fdt_raw_attr =
1111                __BIN_ATTR(fdt, S_IRUSR, of_fdt_raw_read, NULL, 0);
1112
1113        if (!initial_boot_params)
1114                return 0;
1115
1116        if (of_fdt_crc32 != crc32_be(~0, initial_boot_params,
1117                                     fdt_totalsize(initial_boot_params))) {
1118                pr_warn("fdt: not creating '/sys/firmware/fdt': CRC check failed\n");
1119                return 0;
1120        }
1121        of_fdt_raw_attr.size = fdt_totalsize(initial_boot_params);
1122        return sysfs_create_bin_file(firmware_kobj, &of_fdt_raw_attr);
1123}
1124late_initcall(of_fdt_raw_init);
1125#endif
1126
1127#endif /* CONFIG_OF_EARLY_FLATTREE */
1128