linux/arch/microblaze/kernel/prom_parse.c
<<
>>
Prefs
   1#undef DEBUG
   2
   3#include <linux/kernel.h>
   4#include <linux/string.h>
   5#include <linux/pci_regs.h>
   6#include <linux/module.h>
   7#include <linux/ioport.h>
   8#include <linux/etherdevice.h>
   9#include <asm/prom.h>
  10#include <asm/pci-bridge.h>
  11
  12#define PRu64   "%llx"
  13
  14/* Max address size we deal with */
  15#define OF_MAX_ADDR_CELLS       4
  16#define OF_CHECK_COUNTS(na, ns) ((na) > 0 && (na) <= OF_MAX_ADDR_CELLS && \
  17                        (ns) > 0)
  18
  19static struct of_bus *of_match_bus(struct device_node *np);
  20static int __of_address_to_resource(struct device_node *dev,
  21                const u32 *addrp, u64 size, unsigned int flags,
  22                struct resource *r);
  23
  24/* Debug utility */
  25#ifdef DEBUG
  26static void of_dump_addr(const char *s, const u32 *addr, int na)
  27{
  28        printk(KERN_INFO "%s", s);
  29        while (na--)
  30                printk(KERN_INFO " %08x", *(addr++));
  31        printk(KERN_INFO "\n");
  32}
  33#else
  34static void of_dump_addr(const char *s, const u32 *addr, int na) { }
  35#endif
  36
  37/* Callbacks for bus specific translators */
  38struct of_bus {
  39        const char      *name;
  40        const char      *addresses;
  41        int             (*match)(struct device_node *parent);
  42        void            (*count_cells)(struct device_node *child,
  43                                        int *addrc, int *sizec);
  44        u64             (*map)(u32 *addr, const u32 *range,
  45                                int na, int ns, int pna);
  46        int             (*translate)(u32 *addr, u64 offset, int na);
  47        unsigned int    (*get_flags)(const u32 *addr);
  48};
  49
  50/*
  51 * Default translator (generic bus)
  52 */
  53
  54static void of_bus_default_count_cells(struct device_node *dev,
  55                                        int *addrc, int *sizec)
  56{
  57        if (addrc)
  58                *addrc = of_n_addr_cells(dev);
  59        if (sizec)
  60                *sizec = of_n_size_cells(dev);
  61}
  62
  63static u64 of_bus_default_map(u32 *addr, const u32 *range,
  64                int na, int ns, int pna)
  65{
  66        u64 cp, s, da;
  67
  68        cp = of_read_number(range, na);
  69        s  = of_read_number(range + na + pna, ns);
  70        da = of_read_number(addr, na);
  71
  72        pr_debug("OF: default map, cp="PRu64", s="PRu64", da="PRu64"\n",
  73                cp, s, da);
  74
  75        if (da < cp || da >= (cp + s))
  76                return OF_BAD_ADDR;
  77        return da - cp;
  78}
  79
  80static int of_bus_default_translate(u32 *addr, u64 offset, int na)
  81{
  82        u64 a = of_read_number(addr, na);
  83        memset(addr, 0, na * 4);
  84        a += offset;
  85        if (na > 1)
  86                addr[na - 2] = a >> 32;
  87        addr[na - 1] = a & 0xffffffffu;
  88
  89        return 0;
  90}
  91
  92static unsigned int of_bus_default_get_flags(const u32 *addr)
  93{
  94        return IORESOURCE_MEM;
  95}
  96
  97#ifdef CONFIG_PCI
  98/*
  99 * PCI bus specific translator
 100 */
 101
 102static int of_bus_pci_match(struct device_node *np)
 103{
 104        /* "vci" is for the /chaos bridge on 1st-gen PCI powermacs */
 105        return !strcmp(np->type, "pci") || !strcmp(np->type, "vci");
 106}
 107
 108static void of_bus_pci_count_cells(struct device_node *np,
 109                                int *addrc, int *sizec)
 110{
 111        if (addrc)
 112                *addrc = 3;
 113        if (sizec)
 114                *sizec = 2;
 115}
 116
 117static u64 of_bus_pci_map(u32 *addr, const u32 *range, int na, int ns, int pna)
 118{
 119        u64 cp, s, da;
 120
 121        /* Check address type match */
 122        if ((addr[0] ^ range[0]) & 0x03000000)
 123                return OF_BAD_ADDR;
 124
 125        /* Read address values, skipping high cell */
 126        cp = of_read_number(range + 1, na - 1);
 127        s  = of_read_number(range + na + pna, ns);
 128        da = of_read_number(addr + 1, na - 1);
 129
 130        pr_debug("OF: PCI map, cp="PRu64", s="PRu64", da="PRu64"\n", cp, s, da);
 131
 132        if (da < cp || da >= (cp + s))
 133                return OF_BAD_ADDR;
 134        return da - cp;
 135}
 136
 137static int of_bus_pci_translate(u32 *addr, u64 offset, int na)
 138{
 139        return of_bus_default_translate(addr + 1, offset, na - 1);
 140}
 141
 142static unsigned int of_bus_pci_get_flags(const u32 *addr)
 143{
 144        unsigned int flags = 0;
 145        u32 w = addr[0];
 146
 147        switch ((w >> 24) & 0x03) {
 148        case 0x01:
 149                flags |= IORESOURCE_IO;
 150                break;
 151        case 0x02: /* 32 bits */
 152        case 0x03: /* 64 bits */
 153                flags |= IORESOURCE_MEM;
 154                break;
 155        }
 156        if (w & 0x40000000)
 157                flags |= IORESOURCE_PREFETCH;
 158        return flags;
 159}
 160
 161const u32 *of_get_pci_address(struct device_node *dev, int bar_no, u64 *size,
 162                        unsigned int *flags)
 163{
 164        const u32 *prop;
 165        unsigned int psize;
 166        struct device_node *parent;
 167        struct of_bus *bus;
 168        int onesize, i, na, ns;
 169
 170        /* Get parent & match bus type */
 171        parent = of_get_parent(dev);
 172        if (parent == NULL)
 173                return NULL;
 174        bus = of_match_bus(parent);
 175        if (strcmp(bus->name, "pci")) {
 176                of_node_put(parent);
 177                return NULL;
 178        }
 179        bus->count_cells(dev, &na, &ns);
 180        of_node_put(parent);
 181        if (!OF_CHECK_COUNTS(na, ns))
 182                return NULL;
 183
 184        /* Get "reg" or "assigned-addresses" property */
 185        prop = of_get_property(dev, bus->addresses, &psize);
 186        if (prop == NULL)
 187                return NULL;
 188        psize /= 4;
 189
 190        onesize = na + ns;
 191        for (i = 0; psize >= onesize; psize -= onesize, prop += onesize, i++)
 192                if ((prop[0] & 0xff) == ((bar_no * 4) + PCI_BASE_ADDRESS_0)) {
 193                        if (size)
 194                                *size = of_read_number(prop + na, ns);
 195                        if (flags)
 196                                *flags = bus->get_flags(prop);
 197                        return prop;
 198                }
 199        return NULL;
 200}
 201EXPORT_SYMBOL(of_get_pci_address);
 202
 203int of_pci_address_to_resource(struct device_node *dev, int bar,
 204                                struct resource *r)
 205{
 206        const u32       *addrp;
 207        u64             size;
 208        unsigned int    flags;
 209
 210        addrp = of_get_pci_address(dev, bar, &size, &flags);
 211        if (addrp == NULL)
 212                return -EINVAL;
 213        return __of_address_to_resource(dev, addrp, size, flags, r);
 214}
 215EXPORT_SYMBOL_GPL(of_pci_address_to_resource);
 216
 217static u8 of_irq_pci_swizzle(u8 slot, u8 pin)
 218{
 219        return (((pin - 1) + slot) % 4) + 1;
 220}
 221
 222int of_irq_map_pci(struct pci_dev *pdev, struct of_irq *out_irq)
 223{
 224        struct device_node *dn, *ppnode;
 225        struct pci_dev *ppdev;
 226        u32 lspec;
 227        u32 laddr[3];
 228        u8 pin;
 229        int rc;
 230
 231        /* Check if we have a device node, if yes, fallback to standard OF
 232         * parsing
 233         */
 234        dn = pci_device_to_OF_node(pdev);
 235        if (dn)
 236                return of_irq_map_one(dn, 0, out_irq);
 237
 238        /* Ok, we don't, time to have fun. Let's start by building up an
 239         * interrupt spec.  we assume #interrupt-cells is 1, which is standard
 240         * for PCI. If you do different, then don't use that routine.
 241         */
 242        rc = pci_read_config_byte(pdev, PCI_INTERRUPT_PIN, &pin);
 243        if (rc != 0)
 244                return rc;
 245        /* No pin, exit */
 246        if (pin == 0)
 247                return -ENODEV;
 248
 249        /* Now we walk up the PCI tree */
 250        lspec = pin;
 251        for (;;) {
 252                /* Get the pci_dev of our parent */
 253                ppdev = pdev->bus->self;
 254
 255                /* Ouch, it's a host bridge... */
 256                if (ppdev == NULL) {
 257                        struct pci_controller *host;
 258                        host = pci_bus_to_host(pdev->bus);
 259                        ppnode = host ? host->arch_data : NULL;
 260                        /* No node for host bridge ? give up */
 261                        if (ppnode == NULL)
 262                                return -EINVAL;
 263                } else
 264                        /* We found a P2P bridge, check if it has a node */
 265                        ppnode = pci_device_to_OF_node(ppdev);
 266
 267                /* Ok, we have found a parent with a device-node, hand over to
 268                 * the OF parsing code.
 269                 * We build a unit address from the linux device to be used for
 270                 * resolution. Note that we use the linux bus number which may
 271                 * not match your firmware bus numbering.
 272                 * Fortunately, in most cases, interrupt-map-mask doesn't
 273                 * include the bus number as part of the matching.
 274                 * You should still be careful about that though if you intend
 275                 * to rely on this function (you ship  a firmware that doesn't
 276                 * create device nodes for all PCI devices).
 277                 */
 278                if (ppnode)
 279                        break;
 280
 281                /* We can only get here if we hit a P2P bridge with no node,
 282                 * let's do standard swizzling and try again
 283                 */
 284                lspec = of_irq_pci_swizzle(PCI_SLOT(pdev->devfn), lspec);
 285                pdev = ppdev;
 286        }
 287
 288        laddr[0] = (pdev->bus->number << 16)
 289                | (pdev->devfn << 8);
 290        laddr[1]  = laddr[2] = 0;
 291        return of_irq_map_raw(ppnode, &lspec, 1, laddr, out_irq);
 292}
 293EXPORT_SYMBOL_GPL(of_irq_map_pci);
 294#endif /* CONFIG_PCI */
 295
 296/*
 297 * ISA bus specific translator
 298 */
 299
 300static int of_bus_isa_match(struct device_node *np)
 301{
 302        return !strcmp(np->name, "isa");
 303}
 304
 305static void of_bus_isa_count_cells(struct device_node *child,
 306                                int *addrc, int *sizec)
 307{
 308        if (addrc)
 309                *addrc = 2;
 310        if (sizec)
 311                *sizec = 1;
 312}
 313
 314static u64 of_bus_isa_map(u32 *addr, const u32 *range, int na, int ns, int pna)
 315{
 316        u64 cp, s, da;
 317
 318        /* Check address type match */
 319        if ((addr[0] ^ range[0]) & 0x00000001)
 320                return OF_BAD_ADDR;
 321
 322        /* Read address values, skipping high cell */
 323        cp = of_read_number(range + 1, na - 1);
 324        s  = of_read_number(range + na + pna, ns);
 325        da = of_read_number(addr + 1, na - 1);
 326
 327        pr_debug("OF: ISA map, cp="PRu64", s="PRu64", da="PRu64"\n", cp, s, da);
 328
 329        if (da < cp || da >= (cp + s))
 330                return OF_BAD_ADDR;
 331        return da - cp;
 332}
 333
 334static int of_bus_isa_translate(u32 *addr, u64 offset, int na)
 335{
 336        return of_bus_default_translate(addr + 1, offset, na - 1);
 337}
 338
 339static unsigned int of_bus_isa_get_flags(const u32 *addr)
 340{
 341        unsigned int flags = 0;
 342        u32 w = addr[0];
 343
 344        if (w & 1)
 345                flags |= IORESOURCE_IO;
 346        else
 347                flags |= IORESOURCE_MEM;
 348        return flags;
 349}
 350
 351/*
 352 * Array of bus specific translators
 353 */
 354
 355static struct of_bus of_busses[] = {
 356#ifdef CONFIG_PCI
 357        /* PCI */
 358        {
 359                .name = "pci",
 360                .addresses = "assigned-addresses",
 361                .match = of_bus_pci_match,
 362                .count_cells = of_bus_pci_count_cells,
 363                .map = of_bus_pci_map,
 364                .translate = of_bus_pci_translate,
 365                .get_flags = of_bus_pci_get_flags,
 366        },
 367#endif /* CONFIG_PCI */
 368        /* ISA */
 369        {
 370                .name = "isa",
 371                .addresses = "reg",
 372                .match = of_bus_isa_match,
 373                .count_cells = of_bus_isa_count_cells,
 374                .map = of_bus_isa_map,
 375                .translate = of_bus_isa_translate,
 376                .get_flags = of_bus_isa_get_flags,
 377        },
 378        /* Default */
 379        {
 380                .name = "default",
 381                .addresses = "reg",
 382                .match = NULL,
 383                .count_cells = of_bus_default_count_cells,
 384                .map = of_bus_default_map,
 385                .translate = of_bus_default_translate,
 386                .get_flags = of_bus_default_get_flags,
 387        },
 388};
 389
 390static struct of_bus *of_match_bus(struct device_node *np)
 391{
 392        int i;
 393
 394        for (i = 0; i < ARRAY_SIZE(of_busses); i++)
 395                if (!of_busses[i].match || of_busses[i].match(np))
 396                        return &of_busses[i];
 397        BUG();
 398        return NULL;
 399}
 400
 401static int of_translate_one(struct device_node *parent, struct of_bus *bus,
 402                        struct of_bus *pbus, u32 *addr,
 403                        int na, int ns, int pna)
 404{
 405        const u32 *ranges;
 406        unsigned int rlen;
 407        int rone;
 408        u64 offset = OF_BAD_ADDR;
 409
 410        /* Normally, an absence of a "ranges" property means we are
 411         * crossing a non-translatable boundary, and thus the addresses
 412         * below the current not cannot be converted to CPU physical ones.
 413         * Unfortunately, while this is very clear in the spec, it's not
 414         * what Apple understood, and they do have things like /uni-n or
 415         * /ht nodes with no "ranges" property and a lot of perfectly
 416         * useable mapped devices below them. Thus we treat the absence of
 417         * "ranges" as equivalent to an empty "ranges" property which means
 418         * a 1:1 translation at that level. It's up to the caller not to try
 419         * to translate addresses that aren't supposed to be translated in
 420         * the first place. --BenH.
 421         */
 422        ranges = of_get_property(parent, "ranges", (int *) &rlen);
 423        if (ranges == NULL || rlen == 0) {
 424                offset = of_read_number(addr, na);
 425                memset(addr, 0, pna * 4);
 426                pr_debug("OF: no ranges, 1:1 translation\n");
 427                goto finish;
 428        }
 429
 430        pr_debug("OF: walking ranges...\n");
 431
 432        /* Now walk through the ranges */
 433        rlen /= 4;
 434        rone = na + pna + ns;
 435        for (; rlen >= rone; rlen -= rone, ranges += rone) {
 436                offset = bus->map(addr, ranges, na, ns, pna);
 437                if (offset != OF_BAD_ADDR)
 438                        break;
 439        }
 440        if (offset == OF_BAD_ADDR) {
 441                pr_debug("OF: not found !\n");
 442                return 1;
 443        }
 444        memcpy(addr, ranges + na, 4 * pna);
 445
 446 finish:
 447        of_dump_addr("OF: parent translation for:", addr, pna);
 448        pr_debug("OF: with offset: "PRu64"\n", offset);
 449
 450        /* Translate it into parent bus space */
 451        return pbus->translate(addr, offset, pna);
 452}
 453
 454/*
 455 * Translate an address from the device-tree into a CPU physical address,
 456 * this walks up the tree and applies the various bus mappings on the
 457 * way.
 458 *
 459 * Note: We consider that crossing any level with #size-cells == 0 to mean
 460 * that translation is impossible (that is we are not dealing with a value
 461 * that can be mapped to a cpu physical address). This is not really specified
 462 * that way, but this is traditionally the way IBM at least do things
 463 */
 464u64 of_translate_address(struct device_node *dev, const u32 *in_addr)
 465{
 466        struct device_node *parent = NULL;
 467        struct of_bus *bus, *pbus;
 468        u32 addr[OF_MAX_ADDR_CELLS];
 469        int na, ns, pna, pns;
 470        u64 result = OF_BAD_ADDR;
 471
 472        pr_debug("OF: ** translation for device %s **\n", dev->full_name);
 473
 474        /* Increase refcount at current level */
 475        of_node_get(dev);
 476
 477        /* Get parent & match bus type */
 478        parent = of_get_parent(dev);
 479        if (parent == NULL)
 480                goto bail;
 481        bus = of_match_bus(parent);
 482
 483        /* Cound address cells & copy address locally */
 484        bus->count_cells(dev, &na, &ns);
 485        if (!OF_CHECK_COUNTS(na, ns)) {
 486                printk(KERN_ERR "prom_parse: Bad cell count for %s\n",
 487                        dev->full_name);
 488                goto bail;
 489        }
 490        memcpy(addr, in_addr, na * 4);
 491
 492        pr_debug("OF: bus is %s (na=%d, ns=%d) on %s\n",
 493                bus->name, na, ns, parent->full_name);
 494        of_dump_addr("OF: translating address:", addr, na);
 495
 496        /* Translate */
 497        for (;;) {
 498                /* Switch to parent bus */
 499                of_node_put(dev);
 500                dev = parent;
 501                parent = of_get_parent(dev);
 502
 503                /* If root, we have finished */
 504                if (parent == NULL) {
 505                        pr_debug("OF: reached root node\n");
 506                        result = of_read_number(addr, na);
 507                        break;
 508                }
 509
 510                /* Get new parent bus and counts */
 511                pbus = of_match_bus(parent);
 512                pbus->count_cells(dev, &pna, &pns);
 513                if (!OF_CHECK_COUNTS(pna, pns)) {
 514                        printk(KERN_ERR "prom_parse: Bad cell count for %s\n",
 515                                dev->full_name);
 516                        break;
 517                }
 518
 519                pr_debug("OF: parent bus is %s (na=%d, ns=%d) on %s\n",
 520                        pbus->name, pna, pns, parent->full_name);
 521
 522                /* Apply bus translation */
 523                if (of_translate_one(dev, bus, pbus, addr, na, ns, pna))
 524                        break;
 525
 526                /* Complete the move up one level */
 527                na = pna;
 528                ns = pns;
 529                bus = pbus;
 530
 531                of_dump_addr("OF: one level translation:", addr, na);
 532        }
 533 bail:
 534        of_node_put(parent);
 535        of_node_put(dev);
 536
 537        return result;
 538}
 539EXPORT_SYMBOL(of_translate_address);
 540
 541const u32 *of_get_address(struct device_node *dev, int index, u64 *size,
 542                        unsigned int *flags)
 543{
 544        const u32 *prop;
 545        unsigned int psize;
 546        struct device_node *parent;
 547        struct of_bus *bus;
 548        int onesize, i, na, ns;
 549
 550        /* Get parent & match bus type */
 551        parent = of_get_parent(dev);
 552        if (parent == NULL)
 553                return NULL;
 554        bus = of_match_bus(parent);
 555        bus->count_cells(dev, &na, &ns);
 556        of_node_put(parent);
 557        if (!OF_CHECK_COUNTS(na, ns))
 558                return NULL;
 559
 560        /* Get "reg" or "assigned-addresses" property */
 561        prop = of_get_property(dev, bus->addresses, (int *) &psize);
 562        if (prop == NULL)
 563                return NULL;
 564        psize /= 4;
 565
 566        onesize = na + ns;
 567        for (i = 0; psize >= onesize; psize -= onesize, prop += onesize, i++)
 568                if (i == index) {
 569                        if (size)
 570                                *size = of_read_number(prop + na, ns);
 571                        if (flags)
 572                                *flags = bus->get_flags(prop);
 573                        return prop;
 574                }
 575        return NULL;
 576}
 577EXPORT_SYMBOL(of_get_address);
 578
 579static int __of_address_to_resource(struct device_node *dev, const u32 *addrp,
 580                                u64 size, unsigned int flags,
 581                                struct resource *r)
 582{
 583        u64 taddr;
 584
 585        if ((flags & (IORESOURCE_IO | IORESOURCE_MEM)) == 0)
 586                return -EINVAL;
 587        taddr = of_translate_address(dev, addrp);
 588        if (taddr == OF_BAD_ADDR)
 589                return -EINVAL;
 590        memset(r, 0, sizeof(struct resource));
 591        if (flags & IORESOURCE_IO) {
 592                unsigned long port;
 593                port = -1; /* pci_address_to_pio(taddr); */
 594                if (port == (unsigned long)-1)
 595                        return -EINVAL;
 596                r->start = port;
 597                r->end = port + size - 1;
 598        } else {
 599                r->start = taddr;
 600                r->end = taddr + size - 1;
 601        }
 602        r->flags = flags;
 603        r->name = dev->name;
 604        return 0;
 605}
 606
 607int of_address_to_resource(struct device_node *dev, int index,
 608                        struct resource *r)
 609{
 610        const u32       *addrp;
 611        u64             size;
 612        unsigned int    flags;
 613
 614        addrp = of_get_address(dev, index, &size, &flags);
 615        if (addrp == NULL)
 616                return -EINVAL;
 617        return __of_address_to_resource(dev, addrp, size, flags, r);
 618}
 619EXPORT_SYMBOL_GPL(of_address_to_resource);
 620
 621void of_parse_dma_window(struct device_node *dn, const void *dma_window_prop,
 622                unsigned long *busno, unsigned long *phys, unsigned long *size)
 623{
 624        const u32 *dma_window;
 625        u32 cells;
 626        const unsigned char *prop;
 627
 628        dma_window = dma_window_prop;
 629
 630        /* busno is always one cell */
 631        *busno = *(dma_window++);
 632
 633        prop = of_get_property(dn, "ibm,#dma-address-cells", NULL);
 634        if (!prop)
 635                prop = of_get_property(dn, "#address-cells", NULL);
 636
 637        cells = prop ? *(u32 *)prop : of_n_addr_cells(dn);
 638        *phys = of_read_number(dma_window, cells);
 639
 640        dma_window += cells;
 641
 642        prop = of_get_property(dn, "ibm,#dma-size-cells", NULL);
 643        cells = prop ? *(u32 *)prop : of_n_size_cells(dn);
 644        *size = of_read_number(dma_window, cells);
 645}
 646
 647/*
 648 * Interrupt remapper
 649 */
 650
 651static unsigned int of_irq_workarounds;
 652static struct device_node *of_irq_dflt_pic;
 653
 654static struct device_node *of_irq_find_parent(struct device_node *child)
 655{
 656        struct device_node *p;
 657        const phandle *parp;
 658
 659        if (!of_node_get(child))
 660                return NULL;
 661
 662        do {
 663                parp = of_get_property(child, "interrupt-parent", NULL);
 664                if (parp == NULL)
 665                        p = of_get_parent(child);
 666                else {
 667                        if (of_irq_workarounds & OF_IMAP_NO_PHANDLE)
 668                                p = of_node_get(of_irq_dflt_pic);
 669                        else
 670                                p = of_find_node_by_phandle(*parp);
 671                }
 672                of_node_put(child);
 673                child = p;
 674        } while (p && of_get_property(p, "#interrupt-cells", NULL) == NULL);
 675
 676        return p;
 677}
 678
 679/* This doesn't need to be called if you don't have any special workaround
 680 * flags to pass
 681 */
 682void of_irq_map_init(unsigned int flags)
 683{
 684        of_irq_workarounds = flags;
 685
 686        /* OldWorld, don't bother looking at other things */
 687        if (flags & OF_IMAP_OLDWORLD_MAC)
 688                return;
 689
 690        /* If we don't have phandles, let's try to locate a default interrupt
 691         * controller (happens when booting with BootX). We do a first match
 692         * here, hopefully, that only ever happens on machines with one
 693         * controller.
 694         */
 695        if (flags & OF_IMAP_NO_PHANDLE) {
 696                struct device_node *np;
 697
 698                for (np = NULL; (np = of_find_all_nodes(np)) != NULL;) {
 699                        if (of_get_property(np, "interrupt-controller", NULL)
 700                                == NULL)
 701                                continue;
 702                        /* Skip /chosen/interrupt-controller */
 703                        if (strcmp(np->name, "chosen") == 0)
 704                                continue;
 705                        /* It seems like at least one person on this planet
 706                         * wants to use BootX on a machine with an AppleKiwi
 707                         * controller which happens to pretend to be an
 708                         * interrupt controller too.
 709                         */
 710                        if (strcmp(np->name, "AppleKiwi") == 0)
 711                                continue;
 712                        /* I think we found one ! */
 713                        of_irq_dflt_pic = np;
 714                        break;
 715                }
 716        }
 717
 718}
 719
 720int of_irq_map_raw(struct device_node *parent, const u32 *intspec, u32 ointsize,
 721                const u32 *addr, struct of_irq *out_irq)
 722{
 723        struct device_node *ipar, *tnode, *old = NULL, *newpar = NULL;
 724        const u32 *tmp, *imap, *imask;
 725        u32 intsize = 1, addrsize, newintsize = 0, newaddrsize = 0;
 726        int imaplen, match, i;
 727
 728        pr_debug("of_irq_map_raw: par=%s,intspec=[0x%08x 0x%08x...],"
 729                "ointsize=%d\n",
 730                parent->full_name, intspec[0], intspec[1], ointsize);
 731
 732        ipar = of_node_get(parent);
 733
 734        /* First get the #interrupt-cells property of the current cursor
 735         * that tells us how to interpret the passed-in intspec. If there
 736         * is none, we are nice and just walk up the tree
 737         */
 738        do {
 739                tmp = of_get_property(ipar, "#interrupt-cells", NULL);
 740                if (tmp != NULL) {
 741                        intsize = *tmp;
 742                        break;
 743                }
 744                tnode = ipar;
 745                ipar = of_irq_find_parent(ipar);
 746                of_node_put(tnode);
 747        } while (ipar);
 748        if (ipar == NULL) {
 749                pr_debug(" -> no parent found !\n");
 750                goto fail;
 751        }
 752
 753        pr_debug("of_irq_map_raw: ipar=%s, size=%d\n",
 754                        ipar->full_name, intsize);
 755
 756        if (ointsize != intsize)
 757                return -EINVAL;
 758
 759        /* Look for this #address-cells. We have to implement the old linux
 760         * trick of looking for the parent here as some device-trees rely on it
 761         */
 762        old = of_node_get(ipar);
 763        do {
 764                tmp = of_get_property(old, "#address-cells", NULL);
 765                tnode = of_get_parent(old);
 766                of_node_put(old);
 767                old = tnode;
 768        } while (old && tmp == NULL);
 769        of_node_put(old);
 770        old = NULL;
 771        addrsize = (tmp == NULL) ? 2 : *tmp;
 772
 773        pr_debug(" -> addrsize=%d\n", addrsize);
 774
 775        /* Now start the actual "proper" walk of the interrupt tree */
 776        while (ipar != NULL) {
 777                /* Now check if cursor is an interrupt-controller and if it is
 778                 * then we are done
 779                 */
 780                if (of_get_property(ipar, "interrupt-controller", NULL) !=
 781                                NULL) {
 782                        pr_debug(" -> got it !\n");
 783                        memcpy(out_irq->specifier, intspec,
 784                                intsize * sizeof(u32));
 785                        out_irq->size = intsize;
 786                        out_irq->controller = ipar;
 787                        of_node_put(old);
 788                        return 0;
 789                }
 790
 791                /* Now look for an interrupt-map */
 792                imap = of_get_property(ipar, "interrupt-map", &imaplen);
 793                /* No interrupt map, check for an interrupt parent */
 794                if (imap == NULL) {
 795                        pr_debug(" -> no map, getting parent\n");
 796                        newpar = of_irq_find_parent(ipar);
 797                        goto skiplevel;
 798                }
 799                imaplen /= sizeof(u32);
 800
 801                /* Look for a mask */
 802                imask = of_get_property(ipar, "interrupt-map-mask", NULL);
 803
 804                /* If we were passed no "reg" property and we attempt to parse
 805                 * an interrupt-map, then #address-cells must be 0.
 806                 * Fail if it's not.
 807                 */
 808                if (addr == NULL && addrsize != 0) {
 809                        pr_debug(" -> no reg passed in when needed !\n");
 810                        goto fail;
 811                }
 812
 813                /* Parse interrupt-map */
 814                match = 0;
 815                while (imaplen > (addrsize + intsize + 1) && !match) {
 816                        /* Compare specifiers */
 817                        match = 1;
 818                        for (i = 0; i < addrsize && match; ++i) {
 819                                u32 mask = imask ? imask[i] : 0xffffffffu;
 820                                match = ((addr[i] ^ imap[i]) & mask) == 0;
 821                        }
 822                        for (; i < (addrsize + intsize) && match; ++i) {
 823                                u32 mask = imask ? imask[i] : 0xffffffffu;
 824                                match =
 825                                        ((intspec[i-addrsize] ^ imap[i])
 826                                                & mask) == 0;
 827                        }
 828                        imap += addrsize + intsize;
 829                        imaplen -= addrsize + intsize;
 830
 831                        pr_debug(" -> match=%d (imaplen=%d)\n", match, imaplen);
 832
 833                        /* Get the interrupt parent */
 834                        if (of_irq_workarounds & OF_IMAP_NO_PHANDLE)
 835                                newpar = of_node_get(of_irq_dflt_pic);
 836                        else
 837                                newpar =
 838                                        of_find_node_by_phandle((phandle)*imap);
 839                        imap++;
 840                        --imaplen;
 841
 842                        /* Check if not found */
 843                        if (newpar == NULL) {
 844                                pr_debug(" -> imap parent not found !\n");
 845                                goto fail;
 846                        }
 847
 848                        /* Get #interrupt-cells and #address-cells of new
 849                         * parent
 850                         */
 851                        tmp = of_get_property(newpar, "#interrupt-cells", NULL);
 852                        if (tmp == NULL) {
 853                                pr_debug(" -> parent lacks "
 854                                                "#interrupt-cells!\n");
 855                                goto fail;
 856                        }
 857                        newintsize = *tmp;
 858                        tmp = of_get_property(newpar, "#address-cells", NULL);
 859                        newaddrsize = (tmp == NULL) ? 0 : *tmp;
 860
 861                        pr_debug(" -> newintsize=%d, newaddrsize=%d\n",
 862                                newintsize, newaddrsize);
 863
 864                        /* Check for malformed properties */
 865                        if (imaplen < (newaddrsize + newintsize))
 866                                goto fail;
 867
 868                        imap += newaddrsize + newintsize;
 869                        imaplen -= newaddrsize + newintsize;
 870
 871                        pr_debug(" -> imaplen=%d\n", imaplen);
 872                }
 873                if (!match)
 874                        goto fail;
 875
 876                of_node_put(old);
 877                old = of_node_get(newpar);
 878                addrsize = newaddrsize;
 879                intsize = newintsize;
 880                intspec = imap - intsize;
 881                addr = intspec - addrsize;
 882
 883skiplevel:
 884                /* Iterate again with new parent */
 885                pr_debug(" -> new parent: %s\n",
 886                                newpar ? newpar->full_name : "<>");
 887                of_node_put(ipar);
 888                ipar = newpar;
 889                newpar = NULL;
 890        }
 891fail:
 892        of_node_put(ipar);
 893        of_node_put(old);
 894        of_node_put(newpar);
 895
 896        return -EINVAL;
 897}
 898EXPORT_SYMBOL_GPL(of_irq_map_raw);
 899
 900int of_irq_map_one(struct device_node *device,
 901                        int index, struct of_irq *out_irq)
 902{
 903        struct device_node *p;
 904        const u32 *intspec, *tmp, *addr;
 905        u32 intsize, intlen;
 906        int res;
 907
 908        pr_debug("of_irq_map_one: dev=%s, index=%d\n",
 909                        device->full_name, index);
 910
 911        /* Get the interrupts property */
 912        intspec = of_get_property(device, "interrupts", (int *) &intlen);
 913        if (intspec == NULL)
 914                return -EINVAL;
 915        intlen /= sizeof(u32);
 916
 917        pr_debug(" intspec=%d intlen=%d\n", *intspec, intlen);
 918
 919        /* Get the reg property (if any) */
 920        addr = of_get_property(device, "reg", NULL);
 921
 922        /* Look for the interrupt parent. */
 923        p = of_irq_find_parent(device);
 924        if (p == NULL)
 925                return -EINVAL;
 926
 927        /* Get size of interrupt specifier */
 928        tmp = of_get_property(p, "#interrupt-cells", NULL);
 929        if (tmp == NULL) {
 930                of_node_put(p);
 931                return -EINVAL;
 932        }
 933        intsize = *tmp;
 934
 935        pr_debug(" intsize=%d intlen=%d\n", intsize, intlen);
 936
 937        /* Check index */
 938        if ((index + 1) * intsize > intlen)
 939                return -EINVAL;
 940
 941        /* Get new specifier and map it */
 942        res = of_irq_map_raw(p, intspec + index * intsize, intsize,
 943                                addr, out_irq);
 944        of_node_put(p);
 945        return res;
 946}
 947EXPORT_SYMBOL_GPL(of_irq_map_one);
 948
 949/**
 950 * Search the device tree for the best MAC address to use.  'mac-address' is
 951 * checked first, because that is supposed to contain to "most recent" MAC
 952 * address. If that isn't set, then 'local-mac-address' is checked next,
 953 * because that is the default address.  If that isn't set, then the obsolete
 954 * 'address' is checked, just in case we're using an old device tree.
 955 *
 956 * Note that the 'address' property is supposed to contain a virtual address of
 957 * the register set, but some DTS files have redefined that property to be the
 958 * MAC address.
 959 *
 960 * All-zero MAC addresses are rejected, because those could be properties that
 961 * exist in the device tree, but were not set by U-Boot.  For example, the
 962 * DTS could define 'mac-address' and 'local-mac-address', with zero MAC
 963 * addresses.  Some older U-Boots only initialized 'local-mac-address'.  In
 964 * this case, the real MAC is in 'local-mac-address', and 'mac-address' exists
 965 * but is all zeros.
 966*/
 967const void *of_get_mac_address(struct device_node *np)
 968{
 969        struct property *pp;
 970
 971        pp = of_find_property(np, "mac-address", NULL);
 972        if (pp && (pp->length == 6) && is_valid_ether_addr(pp->value))
 973                return pp->value;
 974
 975        pp = of_find_property(np, "local-mac-address", NULL);
 976        if (pp && (pp->length == 6) && is_valid_ether_addr(pp->value))
 977                return pp->value;
 978
 979        pp = of_find_property(np, "address", NULL);
 980        if (pp && (pp->length == 6) && is_valid_ether_addr(pp->value))
 981                return pp->value;
 982
 983        return NULL;
 984}
 985EXPORT_SYMBOL(of_get_mac_address);
 986
 987int of_irq_to_resource(struct device_node *dev, int index, struct resource *r)
 988{
 989        struct of_irq out_irq;
 990        int irq;
 991        int res;
 992
 993        res = of_irq_map_one(dev, index, &out_irq);
 994
 995        /* Get irq for the device */
 996        if (res) {
 997                pr_debug("IRQ not found... code = %d", res);
 998                return NO_IRQ;
 999        }
1000        /* Assuming single interrupt controller... */
1001        irq = out_irq.specifier[0];
1002
1003        pr_debug("IRQ found = %d", irq);
1004
1005        /* Only dereference the resource if both the
1006         * resource and the irq are valid. */
1007        if (r && irq != NO_IRQ) {
1008                r->start = r->end = irq;
1009                r->flags = IORESOURCE_IRQ;
1010        }
1011
1012        return irq;
1013}
1014EXPORT_SYMBOL_GPL(of_irq_to_resource);
1015
1016void __iomem *of_iomap(struct device_node *np, int index)
1017{
1018        struct resource res;
1019
1020        if (of_address_to_resource(np, index, &res))
1021                return NULL;
1022
1023        return ioremap(res.start, 1 + res.end - res.start);
1024}
1025EXPORT_SYMBOL(of_iomap);
1026