linux/arch/sparc/kernel/of_device_64.c
<<
>>
Prefs
   1#include <linux/string.h>
   2#include <linux/kernel.h>
   3#include <linux/of.h>
   4#include <linux/init.h>
   5#include <linux/export.h>
   6#include <linux/mod_devicetable.h>
   7#include <linux/slab.h>
   8#include <linux/errno.h>
   9#include <linux/irq.h>
  10#include <linux/of_device.h>
  11#include <linux/of_platform.h>
  12#include <asm/spitfire.h>
  13
  14#include "of_device_common.h"
  15
  16void __iomem *of_ioremap(struct resource *res, unsigned long offset, unsigned long size, char *name)
  17{
  18        unsigned long ret = res->start + offset;
  19        struct resource *r;
  20
  21        if (res->flags & IORESOURCE_MEM)
  22                r = request_mem_region(ret, size, name);
  23        else
  24                r = request_region(ret, size, name);
  25        if (!r)
  26                ret = 0;
  27
  28        return (void __iomem *) ret;
  29}
  30EXPORT_SYMBOL(of_ioremap);
  31
  32void of_iounmap(struct resource *res, void __iomem *base, unsigned long size)
  33{
  34        if (res->flags & IORESOURCE_MEM)
  35                release_mem_region((unsigned long) base, size);
  36        else
  37                release_region((unsigned long) base, size);
  38}
  39EXPORT_SYMBOL(of_iounmap);
  40
  41/*
  42 * PCI bus specific translator
  43 */
  44
  45static int of_bus_pci_match(struct device_node *np)
  46{
  47        if (!strcmp(np->name, "pci")) {
  48                const char *model = of_get_property(np, "model", NULL);
  49
  50                if (model && !strcmp(model, "SUNW,simba"))
  51                        return 0;
  52
  53                /* Do not do PCI specific frobbing if the
  54                 * PCI bridge lacks a ranges property.  We
  55                 * want to pass it through up to the next
  56                 * parent as-is, not with the PCI translate
  57                 * method which chops off the top address cell.
  58                 */
  59                if (!of_find_property(np, "ranges", NULL))
  60                        return 0;
  61
  62                return 1;
  63        }
  64
  65        return 0;
  66}
  67
  68static int of_bus_simba_match(struct device_node *np)
  69{
  70        const char *model = of_get_property(np, "model", NULL);
  71
  72        if (model && !strcmp(model, "SUNW,simba"))
  73                return 1;
  74
  75        /* Treat PCI busses lacking ranges property just like
  76         * simba.
  77         */
  78        if (!strcmp(np->name, "pci")) {
  79                if (!of_find_property(np, "ranges", NULL))
  80                        return 1;
  81        }
  82
  83        return 0;
  84}
  85
  86static int of_bus_simba_map(u32 *addr, const u32 *range,
  87                            int na, int ns, int pna)
  88{
  89        return 0;
  90}
  91
  92static void of_bus_pci_count_cells(struct device_node *np,
  93                                   int *addrc, int *sizec)
  94{
  95        if (addrc)
  96                *addrc = 3;
  97        if (sizec)
  98                *sizec = 2;
  99}
 100
 101static int of_bus_pci_map(u32 *addr, const u32 *range,
 102                          int na, int ns, int pna)
 103{
 104        u32 result[OF_MAX_ADDR_CELLS];
 105        int i;
 106
 107        /* Check address type match */
 108        if (!((addr[0] ^ range[0]) & 0x03000000))
 109                goto type_match;
 110
 111        /* Special exception, we can map a 64-bit address into
 112         * a 32-bit range.
 113         */
 114        if ((addr[0] & 0x03000000) == 0x03000000 &&
 115            (range[0] & 0x03000000) == 0x02000000)
 116                goto type_match;
 117
 118        return -EINVAL;
 119
 120type_match:
 121        if (of_out_of_range(addr + 1, range + 1, range + na + pna,
 122                            na - 1, ns))
 123                return -EINVAL;
 124
 125        /* Start with the parent range base.  */
 126        memcpy(result, range + na, pna * 4);
 127
 128        /* Add in the child address offset, skipping high cell.  */
 129        for (i = 0; i < na - 1; i++)
 130                result[pna - 1 - i] +=
 131                        (addr[na - 1 - i] -
 132                         range[na - 1 - i]);
 133
 134        memcpy(addr, result, pna * 4);
 135
 136        return 0;
 137}
 138
 139static unsigned long of_bus_pci_get_flags(const u32 *addr, unsigned long flags)
 140{
 141        u32 w = addr[0];
 142
 143        /* For PCI, we override whatever child busses may have used.  */
 144        flags = 0;
 145        switch((w >> 24) & 0x03) {
 146        case 0x01:
 147                flags |= IORESOURCE_IO;
 148                break;
 149
 150        case 0x02: /* 32 bits */
 151        case 0x03: /* 64 bits */
 152                flags |= IORESOURCE_MEM;
 153                break;
 154        }
 155        if (w & 0x40000000)
 156                flags |= IORESOURCE_PREFETCH;
 157        return flags;
 158}
 159
 160/*
 161 * FHC/Central bus specific translator.
 162 *
 163 * This is just needed to hard-code the address and size cell
 164 * counts.  'fhc' and 'central' nodes lack the #address-cells and
 165 * #size-cells properties, and if you walk to the root on such
 166 * Enterprise boxes all you'll get is a #size-cells of 2 which is
 167 * not what we want to use.
 168 */
 169static int of_bus_fhc_match(struct device_node *np)
 170{
 171        return !strcmp(np->name, "fhc") ||
 172                !strcmp(np->name, "central");
 173}
 174
 175#define of_bus_fhc_count_cells of_bus_sbus_count_cells
 176
 177/*
 178 * Array of bus specific translators
 179 */
 180
 181static struct of_bus of_busses[] = {
 182        /* PCI */
 183        {
 184                .name = "pci",
 185                .addr_prop_name = "assigned-addresses",
 186                .match = of_bus_pci_match,
 187                .count_cells = of_bus_pci_count_cells,
 188                .map = of_bus_pci_map,
 189                .get_flags = of_bus_pci_get_flags,
 190        },
 191        /* SIMBA */
 192        {
 193                .name = "simba",
 194                .addr_prop_name = "assigned-addresses",
 195                .match = of_bus_simba_match,
 196                .count_cells = of_bus_pci_count_cells,
 197                .map = of_bus_simba_map,
 198                .get_flags = of_bus_pci_get_flags,
 199        },
 200        /* SBUS */
 201        {
 202                .name = "sbus",
 203                .addr_prop_name = "reg",
 204                .match = of_bus_sbus_match,
 205                .count_cells = of_bus_sbus_count_cells,
 206                .map = of_bus_default_map,
 207                .get_flags = of_bus_default_get_flags,
 208        },
 209        /* FHC */
 210        {
 211                .name = "fhc",
 212                .addr_prop_name = "reg",
 213                .match = of_bus_fhc_match,
 214                .count_cells = of_bus_fhc_count_cells,
 215                .map = of_bus_default_map,
 216                .get_flags = of_bus_default_get_flags,
 217        },
 218        /* Default */
 219        {
 220                .name = "default",
 221                .addr_prop_name = "reg",
 222                .match = NULL,
 223                .count_cells = of_bus_default_count_cells,
 224                .map = of_bus_default_map,
 225                .get_flags = of_bus_default_get_flags,
 226        },
 227};
 228
 229static struct of_bus *of_match_bus(struct device_node *np)
 230{
 231        int i;
 232
 233        for (i = 0; i < ARRAY_SIZE(of_busses); i ++)
 234                if (!of_busses[i].match || of_busses[i].match(np))
 235                        return &of_busses[i];
 236        BUG();
 237        return NULL;
 238}
 239
 240static int __init build_one_resource(struct device_node *parent,
 241                                     struct of_bus *bus,
 242                                     struct of_bus *pbus,
 243                                     u32 *addr,
 244                                     int na, int ns, int pna)
 245{
 246        const u32 *ranges;
 247        int rone, rlen;
 248
 249        ranges = of_get_property(parent, "ranges", &rlen);
 250        if (ranges == NULL || rlen == 0) {
 251                u32 result[OF_MAX_ADDR_CELLS];
 252                int i;
 253
 254                memset(result, 0, pna * 4);
 255                for (i = 0; i < na; i++)
 256                        result[pna - 1 - i] =
 257                                addr[na - 1 - i];
 258
 259                memcpy(addr, result, pna * 4);
 260                return 0;
 261        }
 262
 263        /* Now walk through the ranges */
 264        rlen /= 4;
 265        rone = na + pna + ns;
 266        for (; rlen >= rone; rlen -= rone, ranges += rone) {
 267                if (!bus->map(addr, ranges, na, ns, pna))
 268                        return 0;
 269        }
 270
 271        /* When we miss an I/O space match on PCI, just pass it up
 272         * to the next PCI bridge and/or controller.
 273         */
 274        if (!strcmp(bus->name, "pci") &&
 275            (addr[0] & 0x03000000) == 0x01000000)
 276                return 0;
 277
 278        return 1;
 279}
 280
 281static int __init use_1to1_mapping(struct device_node *pp)
 282{
 283        /* If we have a ranges property in the parent, use it.  */
 284        if (of_find_property(pp, "ranges", NULL) != NULL)
 285                return 0;
 286
 287        /* If the parent is the dma node of an ISA bus, pass
 288         * the translation up to the root.
 289         *
 290         * Some SBUS devices use intermediate nodes to express
 291         * hierarchy within the device itself.  These aren't
 292         * real bus nodes, and don't have a 'ranges' property.
 293         * But, we should still pass the translation work up
 294         * to the SBUS itself.
 295         */
 296        if (!strcmp(pp->name, "dma") ||
 297            !strcmp(pp->name, "espdma") ||
 298            !strcmp(pp->name, "ledma") ||
 299            !strcmp(pp->name, "lebuffer"))
 300                return 0;
 301
 302        /* Similarly for all PCI bridges, if we get this far
 303         * it lacks a ranges property, and this will include
 304         * cases like Simba.
 305         */
 306        if (!strcmp(pp->name, "pci"))
 307                return 0;
 308
 309        return 1;
 310}
 311
 312static int of_resource_verbose;
 313
 314static void __init build_device_resources(struct platform_device *op,
 315                                          struct device *parent)
 316{
 317        struct platform_device *p_op;
 318        struct of_bus *bus;
 319        int na, ns;
 320        int index, num_reg;
 321        const void *preg;
 322
 323        if (!parent)
 324                return;
 325
 326        p_op = to_platform_device(parent);
 327        bus = of_match_bus(p_op->dev.of_node);
 328        bus->count_cells(op->dev.of_node, &na, &ns);
 329
 330        preg = of_get_property(op->dev.of_node, bus->addr_prop_name, &num_reg);
 331        if (!preg || num_reg == 0)
 332                return;
 333
 334        /* Convert to num-cells.  */
 335        num_reg /= 4;
 336
 337        /* Convert to num-entries.  */
 338        num_reg /= na + ns;
 339
 340        /* Prevent overrunning the op->resources[] array.  */
 341        if (num_reg > PROMREG_MAX) {
 342                printk(KERN_WARNING "%s: Too many regs (%d), "
 343                       "limiting to %d.\n",
 344                       op->dev.of_node->full_name, num_reg, PROMREG_MAX);
 345                num_reg = PROMREG_MAX;
 346        }
 347
 348        op->resource = op->archdata.resource;
 349        op->num_resources = num_reg;
 350        for (index = 0; index < num_reg; index++) {
 351                struct resource *r = &op->resource[index];
 352                u32 addr[OF_MAX_ADDR_CELLS];
 353                const u32 *reg = (preg + (index * ((na + ns) * 4)));
 354                struct device_node *dp = op->dev.of_node;
 355                struct device_node *pp = p_op->dev.of_node;
 356                struct of_bus *pbus, *dbus;
 357                u64 size, result = OF_BAD_ADDR;
 358                unsigned long flags;
 359                int dna, dns;
 360                int pna, pns;
 361
 362                size = of_read_addr(reg + na, ns);
 363                memcpy(addr, reg, na * 4);
 364
 365                flags = bus->get_flags(addr, 0);
 366
 367                if (use_1to1_mapping(pp)) {
 368                        result = of_read_addr(addr, na);
 369                        goto build_res;
 370                }
 371
 372                dna = na;
 373                dns = ns;
 374                dbus = bus;
 375
 376                while (1) {
 377                        dp = pp;
 378                        pp = dp->parent;
 379                        if (!pp) {
 380                                result = of_read_addr(addr, dna);
 381                                break;
 382                        }
 383
 384                        pbus = of_match_bus(pp);
 385                        pbus->count_cells(dp, &pna, &pns);
 386
 387                        if (build_one_resource(dp, dbus, pbus, addr,
 388                                               dna, dns, pna))
 389                                break;
 390
 391                        flags = pbus->get_flags(addr, flags);
 392
 393                        dna = pna;
 394                        dns = pns;
 395                        dbus = pbus;
 396                }
 397
 398        build_res:
 399                memset(r, 0, sizeof(*r));
 400
 401                if (of_resource_verbose)
 402                        printk("%s reg[%d] -> %llx\n",
 403                               op->dev.of_node->full_name, index,
 404                               result);
 405
 406                if (result != OF_BAD_ADDR) {
 407                        if (tlb_type == hypervisor)
 408                                result &= 0x0fffffffffffffffUL;
 409
 410                        r->start = result;
 411                        r->end = result + size - 1;
 412                        r->flags = flags;
 413                }
 414                r->name = op->dev.of_node->name;
 415        }
 416}
 417
 418static struct device_node * __init
 419apply_interrupt_map(struct device_node *dp, struct device_node *pp,
 420                    const u32 *imap, int imlen, const u32 *imask,
 421                    unsigned int *irq_p)
 422{
 423        struct device_node *cp;
 424        unsigned int irq = *irq_p;
 425        struct of_bus *bus;
 426        phandle handle;
 427        const u32 *reg;
 428        int na, num_reg, i;
 429
 430        bus = of_match_bus(pp);
 431        bus->count_cells(dp, &na, NULL);
 432
 433        reg = of_get_property(dp, "reg", &num_reg);
 434        if (!reg || !num_reg)
 435                return NULL;
 436
 437        imlen /= ((na + 3) * 4);
 438        handle = 0;
 439        for (i = 0; i < imlen; i++) {
 440                int j;
 441
 442                for (j = 0; j < na; j++) {
 443                        if ((reg[j] & imask[j]) != imap[j])
 444                                goto next;
 445                }
 446                if (imap[na] == irq) {
 447                        handle = imap[na + 1];
 448                        irq = imap[na + 2];
 449                        break;
 450                }
 451
 452        next:
 453                imap += (na + 3);
 454        }
 455        if (i == imlen) {
 456                /* Psycho and Sabre PCI controllers can have 'interrupt-map'
 457                 * properties that do not include the on-board device
 458                 * interrupts.  Instead, the device's 'interrupts' property
 459                 * is already a fully specified INO value.
 460                 *
 461                 * Handle this by deciding that, if we didn't get a
 462                 * match in the parent's 'interrupt-map', and the
 463                 * parent is an IRQ translator, then use the parent as
 464                 * our IRQ controller.
 465                 */
 466                if (pp->irq_trans)
 467                        return pp;
 468
 469                return NULL;
 470        }
 471
 472        *irq_p = irq;
 473        cp = of_find_node_by_phandle(handle);
 474
 475        return cp;
 476}
 477
 478static unsigned int __init pci_irq_swizzle(struct device_node *dp,
 479                                           struct device_node *pp,
 480                                           unsigned int irq)
 481{
 482        const struct linux_prom_pci_registers *regs;
 483        unsigned int bus, devfn, slot, ret;
 484
 485        if (irq < 1 || irq > 4)
 486                return irq;
 487
 488        regs = of_get_property(dp, "reg", NULL);
 489        if (!regs)
 490                return irq;
 491
 492        bus = (regs->phys_hi >> 16) & 0xff;
 493        devfn = (regs->phys_hi >> 8) & 0xff;
 494        slot = (devfn >> 3) & 0x1f;
 495
 496        if (pp->irq_trans) {
 497                /* Derived from Table 8-3, U2P User's Manual.  This branch
 498                 * is handling a PCI controller that lacks a proper set of
 499                 * interrupt-map and interrupt-map-mask properties.  The
 500                 * Ultra-E450 is one example.
 501                 *
 502                 * The bit layout is BSSLL, where:
 503                 * B: 0 on bus A, 1 on bus B
 504                 * D: 2-bit slot number, derived from PCI device number as
 505                 *    (dev - 1) for bus A, or (dev - 2) for bus B
 506                 * L: 2-bit line number
 507                 */
 508                if (bus & 0x80) {
 509                        /* PBM-A */
 510                        bus  = 0x00;
 511                        slot = (slot - 1) << 2;
 512                } else {
 513                        /* PBM-B */
 514                        bus  = 0x10;
 515                        slot = (slot - 2) << 2;
 516                }
 517                irq -= 1;
 518
 519                ret = (bus | slot | irq);
 520        } else {
 521                /* Going through a PCI-PCI bridge that lacks a set of
 522                 * interrupt-map and interrupt-map-mask properties.
 523                 */
 524                ret = ((irq - 1 + (slot & 3)) & 3) + 1;
 525        }
 526
 527        return ret;
 528}
 529
 530static int of_irq_verbose;
 531
 532static unsigned int __init build_one_device_irq(struct platform_device *op,
 533                                                struct device *parent,
 534                                                unsigned int irq)
 535{
 536        struct device_node *dp = op->dev.of_node;
 537        struct device_node *pp, *ip;
 538        unsigned int orig_irq = irq;
 539        int nid;
 540
 541        if (irq == 0xffffffff)
 542                return irq;
 543
 544        if (dp->irq_trans) {
 545                irq = dp->irq_trans->irq_build(dp, irq,
 546                                               dp->irq_trans->data);
 547
 548                if (of_irq_verbose)
 549                        printk("%s: direct translate %x --> %x\n",
 550                               dp->full_name, orig_irq, irq);
 551
 552                goto out;
 553        }
 554
 555        /* Something more complicated.  Walk up to the root, applying
 556         * interrupt-map or bus specific translations, until we hit
 557         * an IRQ translator.
 558         *
 559         * If we hit a bus type or situation we cannot handle, we
 560         * stop and assume that the original IRQ number was in a
 561         * format which has special meaning to it's immediate parent.
 562         */
 563        pp = dp->parent;
 564        ip = NULL;
 565        while (pp) {
 566                const void *imap, *imsk;
 567                int imlen;
 568
 569                imap = of_get_property(pp, "interrupt-map", &imlen);
 570                imsk = of_get_property(pp, "interrupt-map-mask", NULL);
 571                if (imap && imsk) {
 572                        struct device_node *iret;
 573                        int this_orig_irq = irq;
 574
 575                        iret = apply_interrupt_map(dp, pp,
 576                                                   imap, imlen, imsk,
 577                                                   &irq);
 578
 579                        if (of_irq_verbose)
 580                                printk("%s: Apply [%s:%x] imap --> [%s:%x]\n",
 581                                       op->dev.of_node->full_name,
 582                                       pp->full_name, this_orig_irq,
 583                                       of_node_full_name(iret), irq);
 584
 585                        if (!iret)
 586                                break;
 587
 588                        if (iret->irq_trans) {
 589                                ip = iret;
 590                                break;
 591                        }
 592                } else {
 593                        if (!strcmp(pp->name, "pci")) {
 594                                unsigned int this_orig_irq = irq;
 595
 596                                irq = pci_irq_swizzle(dp, pp, irq);
 597                                if (of_irq_verbose)
 598                                        printk("%s: PCI swizzle [%s] "
 599                                               "%x --> %x\n",
 600                                               op->dev.of_node->full_name,
 601                                               pp->full_name, this_orig_irq,
 602                                               irq);
 603
 604                        }
 605
 606                        if (pp->irq_trans) {
 607                                ip = pp;
 608                                break;
 609                        }
 610                }
 611                dp = pp;
 612                pp = pp->parent;
 613        }
 614        if (!ip)
 615                return orig_irq;
 616
 617        irq = ip->irq_trans->irq_build(op->dev.of_node, irq,
 618                                       ip->irq_trans->data);
 619        if (of_irq_verbose)
 620                printk("%s: Apply IRQ trans [%s] %x --> %x\n",
 621                      op->dev.of_node->full_name, ip->full_name, orig_irq, irq);
 622
 623out:
 624        nid = of_node_to_nid(dp);
 625        if (nid != -1) {
 626                cpumask_t numa_mask;
 627
 628                cpumask_copy(&numa_mask, cpumask_of_node(nid));
 629                irq_set_affinity(irq, &numa_mask);
 630        }
 631
 632        return irq;
 633}
 634
 635static struct platform_device * __init scan_one_device(struct device_node *dp,
 636                                                 struct device *parent)
 637{
 638        struct platform_device *op = kzalloc(sizeof(*op), GFP_KERNEL);
 639        const unsigned int *irq;
 640        struct dev_archdata *sd;
 641        int len, i;
 642
 643        if (!op)
 644                return NULL;
 645
 646        sd = &op->dev.archdata;
 647        sd->op = op;
 648
 649        op->dev.of_node = dp;
 650
 651        irq = of_get_property(dp, "interrupts", &len);
 652        if (irq) {
 653                op->archdata.num_irqs = len / 4;
 654
 655                /* Prevent overrunning the op->irqs[] array.  */
 656                if (op->archdata.num_irqs > PROMINTR_MAX) {
 657                        printk(KERN_WARNING "%s: Too many irqs (%d), "
 658                               "limiting to %d.\n",
 659                               dp->full_name, op->archdata.num_irqs, PROMINTR_MAX);
 660                        op->archdata.num_irqs = PROMINTR_MAX;
 661                }
 662                memcpy(op->archdata.irqs, irq, op->archdata.num_irqs * 4);
 663        } else {
 664                op->archdata.num_irqs = 0;
 665        }
 666
 667        build_device_resources(op, parent);
 668        for (i = 0; i < op->archdata.num_irqs; i++)
 669                op->archdata.irqs[i] = build_one_device_irq(op, parent, op->archdata.irqs[i]);
 670
 671        op->dev.parent = parent;
 672        op->dev.bus = &platform_bus_type;
 673        if (!parent)
 674                dev_set_name(&op->dev, "root");
 675        else
 676                dev_set_name(&op->dev, "%08x", dp->phandle);
 677
 678        if (of_device_register(op)) {
 679                printk("%s: Could not register of device.\n",
 680                       dp->full_name);
 681                kfree(op);
 682                op = NULL;
 683        }
 684
 685        return op;
 686}
 687
 688static void __init scan_tree(struct device_node *dp, struct device *parent)
 689{
 690        while (dp) {
 691                struct platform_device *op = scan_one_device(dp, parent);
 692
 693                if (op)
 694                        scan_tree(dp->child, &op->dev);
 695
 696                dp = dp->sibling;
 697        }
 698}
 699
 700static int __init scan_of_devices(void)
 701{
 702        struct device_node *root = of_find_node_by_path("/");
 703        struct platform_device *parent;
 704
 705        parent = scan_one_device(root, NULL);
 706        if (!parent)
 707                return 0;
 708
 709        scan_tree(root->child, &parent->dev);
 710        return 0;
 711}
 712postcore_initcall(scan_of_devices);
 713
 714static int __init of_debug(char *str)
 715{
 716        int val = 0;
 717
 718        get_option(&str, &val);
 719        if (val & 1)
 720                of_resource_verbose = 1;
 721        if (val & 2)
 722                of_irq_verbose = 1;
 723        return 1;
 724}
 725
 726__setup("of_debug=", of_debug);
 727