linux-old/arch/sparc64/kernel/pci_common.c
<<
>>
Prefs
   1/* $Id: pci_common.c,v 1.27.2.5 2002/03/10 05:21:26 davem Exp $
   2 * pci_common.c: PCI controller common support.
   3 *
   4 * Copyright (C) 1999 David S. Miller (davem@redhat.com)
   5 */
   6
   7#include <linux/string.h>
   8#include <linux/slab.h>
   9#include <linux/init.h>
  10
  11#include <asm/pbm.h>
  12
  13/* Fix self device of BUS and hook it into BUS->self.
  14 * The pci_scan_bus does not do this for the host bridge.
  15 */
  16void __init pci_fixup_host_bridge_self(struct pci_bus *pbus)
  17{
  18        struct list_head *walk = &pbus->devices;
  19
  20        walk = walk->next;
  21        while (walk != &pbus->devices) {
  22                struct pci_dev *pdev = pci_dev_b(walk);
  23
  24                if (pdev->class >> 8 == PCI_CLASS_BRIDGE_HOST) {
  25                        pbus->self = pdev;
  26                        return;
  27                }
  28
  29                walk = walk->next;
  30        }
  31
  32        prom_printf("PCI: Critical error, cannot find host bridge PDEV.\n");
  33        prom_halt();
  34}
  35
  36/* Find the OBP PROM device tree node for a PCI device.
  37 * Return zero if not found.
  38 */
  39static int __init find_device_prom_node(struct pci_pbm_info *pbm,
  40                                        struct pci_dev *pdev,
  41                                        int bus_prom_node,
  42                                        struct linux_prom_pci_registers *pregs,
  43                                        int *nregs)
  44{
  45        int node;
  46
  47        /*
  48         * Return the PBM's PROM node in case we are it's PCI device,
  49         * as the PBM's reg property is different to standard PCI reg
  50         * properties. We would delete this device entry otherwise,
  51         * which confuses XFree86's device probing...
  52         */
  53        if ((pdev->bus->number == pbm->pci_bus->number) && (pdev->devfn == 0) &&
  54            (pdev->vendor == PCI_VENDOR_ID_SUN) &&
  55            (pdev->device == PCI_DEVICE_ID_SUN_PBM ||
  56             pdev->device == PCI_DEVICE_ID_SUN_SCHIZO ||
  57             pdev->device == PCI_DEVICE_ID_SUN_TOMATILLO ||
  58             pdev->device == PCI_DEVICE_ID_SUN_SABRE ||
  59             pdev->device == PCI_DEVICE_ID_SUN_HUMMINGBIRD)) {
  60                *nregs = 0;
  61                return bus_prom_node;
  62        }
  63
  64        node = prom_getchild(bus_prom_node);
  65        while (node != 0) {
  66                int err = prom_getproperty(node, "reg",
  67                                           (char *)pregs,
  68                                           sizeof(*pregs) * PROMREG_MAX);
  69                if (err == 0 || err == -1)
  70                        goto do_next_sibling;
  71                if (((pregs[0].phys_hi >> 8) & 0xff) == pdev->devfn) {
  72                        *nregs = err / sizeof(*pregs);
  73                        return node;
  74                }
  75
  76        do_next_sibling:
  77                node = prom_getsibling(node);
  78        }
  79        return 0;
  80}
  81
  82/* Remove a PCI device from the device trees, then
  83 * free it up.  Note that this must run before
  84 * the device's resources are registered because we
  85 * do not handle unregistering them here.
  86 */
  87static void pci_device_delete(struct pci_dev *pdev)
  88{
  89        list_del(&pdev->global_list);
  90        list_del(&pdev->bus_list);
  91
  92        /* Ok, all references are gone, free it up. */
  93        kfree(pdev);
  94}
  95
  96/* Older versions of OBP on PCI systems encode 64-bit MEM
  97 * space assignments incorrectly, this fixes them up.  We also
  98 * take the opportunity here to hide other kinds of bogus
  99 * assignments.
 100 */
 101static void __init fixup_obp_assignments(struct pci_dev *pdev,
 102                                         struct pcidev_cookie *pcp)
 103{
 104        int i;
 105
 106        if (pdev->vendor == PCI_VENDOR_ID_AL &&
 107            (pdev->device == PCI_DEVICE_ID_AL_M7101 ||
 108             pdev->device == PCI_DEVICE_ID_AL_M1533)) {
 109                int i;
 110
 111                /* Zap all of the normal resources, they are
 112                 * meaningless and generate bogus resource collision
 113                 * messages.  This is OpenBoot's ill-fated attempt to
 114                 * represent the implicit resources that these devices
 115                 * have.
 116                 */
 117                pcp->num_prom_assignments = 0;
 118                for (i = 0; i < 6; i++) {
 119                        pdev->resource[i].start =
 120                                pdev->resource[i].end =
 121                                pdev->resource[i].flags = 0;
 122                }
 123                pdev->resource[PCI_ROM_RESOURCE].start =
 124                        pdev->resource[PCI_ROM_RESOURCE].end =
 125                        pdev->resource[PCI_ROM_RESOURCE].flags = 0;
 126                return;
 127        }
 128
 129        for (i = 0; i < pcp->num_prom_assignments; i++) {
 130                struct linux_prom_pci_registers *ap;
 131                int space;
 132
 133                ap = &pcp->prom_assignments[i];
 134                space = ap->phys_hi >> 24;
 135                if ((space & 0x3) == 2 &&
 136                    (space & 0x4) != 0) {
 137                        ap->phys_hi &= ~(0x7 << 24);
 138                        ap->phys_hi |= 0x3 << 24;
 139                }
 140        }
 141}
 142
 143/* Fill in the PCI device cookie sysdata for the given
 144 * PCI device.  This cookie is the means by which one
 145 * can get to OBP and PCI controller specific information
 146 * for a PCI device.
 147 */
 148static void __init pdev_cookie_fillin(struct pci_pbm_info *pbm,
 149                                      struct pci_dev *pdev,
 150                                      int bus_prom_node)
 151{
 152        struct linux_prom_pci_registers pregs[PROMREG_MAX];
 153        struct pcidev_cookie *pcp;
 154        int device_prom_node, nregs, err;
 155
 156        device_prom_node = find_device_prom_node(pbm, pdev, bus_prom_node,
 157                                                 pregs, &nregs);
 158        if (device_prom_node == 0) {
 159                /* If it is not in the OBP device tree then
 160                 * there must be a damn good reason for it.
 161                 *
 162                 * So what we do is delete the device from the
 163                 * PCI device tree completely.  This scenerio
 164                 * is seen, for example, on CP1500 for the
 165                 * second EBUS/HappyMeal pair if the external
 166                 * connector for it is not present.
 167                 */
 168                pci_device_delete(pdev);
 169                return;
 170        }
 171
 172        pcp = kmalloc(sizeof(*pcp), GFP_ATOMIC);
 173        if (pcp == NULL) {
 174                prom_printf("PCI_COOKIE: Fatal malloc error, aborting...\n");
 175                prom_halt();
 176        }
 177        pcp->pbm = pbm;
 178        pcp->prom_node = device_prom_node;
 179        memcpy(pcp->prom_regs, pregs, sizeof(pcp->prom_regs));
 180        pcp->num_prom_regs = nregs;
 181        err = prom_getproperty(device_prom_node, "name",
 182                               pcp->prom_name, sizeof(pcp->prom_name));
 183        if (err > 0)
 184                pcp->prom_name[err] = 0;
 185        else
 186                pcp->prom_name[0] = 0;
 187
 188        err = prom_getproperty(device_prom_node,
 189                               "assigned-addresses",
 190                               (char *)pcp->prom_assignments,
 191                               sizeof(pcp->prom_assignments));
 192        if (err == 0 || err == -1)
 193                pcp->num_prom_assignments = 0;
 194        else
 195                pcp->num_prom_assignments =
 196                        (err / sizeof(pcp->prom_assignments[0]));
 197
 198        if (strcmp(pcp->prom_name, "ebus") == 0) {
 199                struct linux_prom_ebus_ranges erng[PROM_PCIRNG_MAX];
 200                int iter;
 201
 202                /* EBUS is special... */
 203                err = prom_getproperty(device_prom_node, "ranges",
 204                                       (char *)&erng[0], sizeof(erng));
 205                if (err == 0 || err == -1) {
 206                        prom_printf("EBUS: Fatal error, no range property\n");
 207                        prom_halt();
 208                }
 209                err = (err / sizeof(erng[0]));
 210                for(iter = 0; iter < err; iter++) {
 211                        struct linux_prom_ebus_ranges *ep = &erng[iter];
 212                        struct linux_prom_pci_registers *ap;
 213
 214                        ap = &pcp->prom_assignments[iter];
 215
 216                        ap->phys_hi = ep->parent_phys_hi;
 217                        ap->phys_mid = ep->parent_phys_mid;
 218                        ap->phys_lo = ep->parent_phys_lo;
 219                        ap->size_hi = 0;
 220                        ap->size_lo = ep->size;
 221                }
 222                pcp->num_prom_assignments = err;
 223        }
 224
 225        fixup_obp_assignments(pdev, pcp);
 226
 227        pdev->sysdata = pcp;
 228}
 229
 230void __init pci_fill_in_pbm_cookies(struct pci_bus *pbus,
 231                                    struct pci_pbm_info *pbm,
 232                                    int prom_node)
 233{
 234        struct list_head *walk = &pbus->devices;
 235
 236        /* This loop is coded like this because the cookie
 237         * fillin routine can delete devices from the tree.
 238         */
 239        walk = walk->next;
 240        while (walk != &pbus->devices) {
 241                struct pci_dev *pdev = pci_dev_b(walk);
 242                struct list_head *walk_next = walk->next;
 243
 244                pdev_cookie_fillin(pbm, pdev, prom_node);
 245
 246                walk = walk_next;
 247        }
 248
 249        walk = &pbus->children;
 250        walk = walk->next;
 251        while (walk != &pbus->children) {
 252                struct pci_bus *this_pbus = pci_bus_b(walk);
 253                struct pcidev_cookie *pcp = this_pbus->self->sysdata;
 254                struct list_head *walk_next = walk->next;
 255
 256                pci_fill_in_pbm_cookies(this_pbus, pbm, pcp->prom_node);
 257
 258                walk = walk_next;
 259        }
 260}
 261
 262static void __init bad_assignment(struct pci_dev *pdev,
 263                                  struct linux_prom_pci_registers *ap,
 264                                  struct resource *res,
 265                                  int do_prom_halt)
 266{
 267        prom_printf("PCI: Bogus PROM assignment. BUS[%02x] DEVFN[%x]\n",
 268                    pdev->bus->number, pdev->devfn);
 269        if (ap)
 270                prom_printf("PCI: phys[%08x:%08x:%08x] size[%08x:%08x]\n",
 271                            ap->phys_hi, ap->phys_mid, ap->phys_lo,
 272                            ap->size_hi, ap->size_lo);
 273        if (res)
 274                prom_printf("PCI: RES[%016lx-->%016lx:(%lx)]\n",
 275                            res->start, res->end, res->flags);
 276        prom_printf("Please email this information to davem@redhat.com\n");
 277        if (do_prom_halt)
 278                prom_halt();
 279}
 280
 281static struct resource *
 282__init get_root_resource(struct linux_prom_pci_registers *ap,
 283                         struct pci_pbm_info *pbm)
 284{
 285        int space = (ap->phys_hi >> 24) & 3;
 286
 287        switch (space) {
 288        case 0:
 289                /* Configuration space, silently ignore it. */
 290                return NULL;
 291
 292        case 1:
 293                /* 16-bit IO space */
 294                return &pbm->io_space;
 295
 296        case 2:
 297                /* 32-bit MEM space */
 298                return &pbm->mem_space;
 299
 300        case 3:
 301                /* 64-bit MEM space, these are allocated out of
 302                 * the 32-bit mem_space range for the PBM, ie.
 303                 * we just zero out the upper 32-bits.
 304                 */
 305                return &pbm->mem_space;
 306
 307        default:
 308                printk("PCI: What is resource space %x? "
 309                       "Tell davem@redhat.com about it!\n", space);
 310                return NULL;
 311        };
 312}
 313
 314static struct resource *
 315__init get_device_resource(struct linux_prom_pci_registers *ap,
 316                           struct pci_dev *pdev)
 317{
 318        struct resource *res;
 319        int breg = (ap->phys_hi & 0xff);
 320
 321        switch (breg) {
 322        case  PCI_ROM_ADDRESS:
 323                /* Unfortunately I have seen several cases where
 324                 * buggy FCODE uses a space value of '1' (I/O space)
 325                 * in the register property for the ROM address
 326                 * so disable this sanity check for now.
 327                 */
 328#if 0
 329        {
 330                int space = (ap->phys_hi >> 24) & 3;
 331
 332                /* It had better be MEM space. */
 333                if (space != 2)
 334                        bad_assignment(pdev, ap, NULL, 0);
 335        }
 336#endif
 337                res = &pdev->resource[PCI_ROM_RESOURCE];
 338                break;
 339
 340        case PCI_BASE_ADDRESS_0:
 341        case PCI_BASE_ADDRESS_1:
 342        case PCI_BASE_ADDRESS_2:
 343        case PCI_BASE_ADDRESS_3:
 344        case PCI_BASE_ADDRESS_4:
 345        case PCI_BASE_ADDRESS_5:
 346                res = &pdev->resource[(breg - PCI_BASE_ADDRESS_0) / 4];
 347                break;
 348
 349        default:
 350                bad_assignment(pdev, ap, NULL, 0);
 351                res = NULL;
 352                break;
 353        };
 354
 355        return res;
 356}
 357
 358static int __init pdev_resource_collisions_expected(struct pci_dev *pdev)
 359{
 360        if (pdev->vendor != PCI_VENDOR_ID_SUN)
 361                return 0;
 362
 363        if (pdev->device == PCI_DEVICE_ID_SUN_RIO_EBUS ||
 364            pdev->device == PCI_DEVICE_ID_SUN_RIO_1394 ||
 365            pdev->device == PCI_DEVICE_ID_SUN_RIO_USB)
 366                return 1;
 367
 368        return 0;
 369}
 370
 371static void __init pdev_record_assignments(struct pci_pbm_info *pbm,
 372                                           struct pci_dev *pdev)
 373{
 374        struct pcidev_cookie *pcp = pdev->sysdata;
 375        int i;
 376
 377        for (i = 0; i < pcp->num_prom_assignments; i++) {
 378                struct linux_prom_pci_registers *ap;
 379                struct resource *root, *res;
 380
 381                /* The format of this property is specified in
 382                 * the PCI Bus Binding to IEEE1275-1994.
 383                 */
 384                ap = &pcp->prom_assignments[i];
 385                root = get_root_resource(ap, pbm);
 386                res = get_device_resource(ap, pdev);
 387                if (root == NULL || res == NULL ||
 388                    res->flags == 0)
 389                        continue;
 390
 391                /* Ok we know which resource this PROM assignment is
 392                 * for, sanity check it.
 393                 */
 394                if ((res->start & 0xffffffffUL) != ap->phys_lo)
 395                        bad_assignment(pdev, ap, res, 1);
 396
 397                /* If it is a 64-bit MEM space assignment, verify that
 398                 * the resource is too and that the upper 32-bits match.
 399                 */
 400                if (((ap->phys_hi >> 24) & 3) == 3) {
 401                        if (((res->flags & IORESOURCE_MEM) == 0) ||
 402                            ((res->flags & PCI_BASE_ADDRESS_MEM_TYPE_MASK)
 403                             != PCI_BASE_ADDRESS_MEM_TYPE_64))
 404                                bad_assignment(pdev, ap, res, 1);
 405                        if ((res->start >> 32) != ap->phys_mid)
 406                                bad_assignment(pdev, ap, res, 1);
 407
 408                        /* PBM cannot generate cpu initiated PIOs
 409                         * to the full 64-bit space.  Therefore the
 410                         * upper 32-bits better be zero.  If it is
 411                         * not, just skip it and we will assign it
 412                         * properly ourselves.
 413                         */
 414                        if ((res->start >> 32) != 0UL) {
 415                                printk(KERN_ERR "PCI: OBP assigns out of range MEM address "
 416                                       "%016lx for region %ld on device %s\n",
 417                                       res->start, (res - &pdev->resource[0]), pdev->name);
 418                                continue;
 419                        }
 420                }
 421
 422                /* Adjust the resource into the physical address space
 423                 * of this PBM.
 424                 */
 425                pbm->parent->resource_adjust(pdev, res, root);
 426
 427                if (request_resource(root, res) < 0) {
 428                        /* OK, there is some conflict.  But this is fine
 429                         * since we'll reassign it in the fixup pass.
 430                         *
 431                         * We notify the user that OBP made an error if it
 432                         * is a case we don't expect.
 433                         */
 434                        if (!pdev_resource_collisions_expected(pdev)) {
 435                                printk(KERN_ERR "PCI: Address space collision on region %ld "
 436                                       "[%016lx:%016lx] of device %s\n",
 437                                       (res - &pdev->resource[0]),
 438                                       res->start, res->end,
 439                                       pdev->name);
 440                        }
 441                }
 442        }
 443}
 444
 445void __init pci_record_assignments(struct pci_pbm_info *pbm,
 446                                   struct pci_bus *pbus)
 447{
 448        struct list_head *walk = &pbus->devices;
 449
 450        for (walk = walk->next; walk != &pbus->devices; walk = walk->next)
 451                pdev_record_assignments(pbm, pci_dev_b(walk));
 452
 453        walk = &pbus->children;
 454        for (walk = walk->next; walk != &pbus->children; walk = walk->next)
 455                pci_record_assignments(pbm, pci_bus_b(walk));
 456}
 457
 458/* Return non-zero if PDEV has implicit I/O resources even
 459 * though it may not have an I/O base address register
 460 * active.
 461 */
 462static int __init has_implicit_io(struct pci_dev *pdev)
 463{
 464        int class = pdev->class >> 8;
 465
 466        if (class == PCI_CLASS_NOT_DEFINED ||
 467            class == PCI_CLASS_NOT_DEFINED_VGA ||
 468            class == PCI_CLASS_STORAGE_IDE ||
 469            (pdev->class >> 16) == PCI_BASE_CLASS_DISPLAY)
 470                return 1;
 471
 472        return 0;
 473}
 474
 475static void __init pdev_assign_unassigned(struct pci_pbm_info *pbm,
 476                                          struct pci_dev *pdev)
 477{
 478        u32 reg;
 479        u16 cmd;
 480        int i, io_seen, mem_seen;
 481
 482        io_seen = mem_seen = 0;
 483        for (i = 0; i < PCI_NUM_RESOURCES; i++) {
 484                struct resource *root, *res;
 485                unsigned long size, min, max, align;
 486
 487                res = &pdev->resource[i];
 488
 489                if (res->flags & IORESOURCE_IO)
 490                        io_seen++;
 491                else if (res->flags & IORESOURCE_MEM)
 492                        mem_seen++;
 493
 494                /* If it is already assigned or the resource does
 495                 * not exist, there is nothing to do.
 496                 */
 497                if (res->parent != NULL || res->flags == 0UL)
 498                        continue;
 499
 500                /* Determine the root we allocate from. */
 501                if (res->flags & IORESOURCE_IO) {
 502                        root = &pbm->io_space;
 503                        min = root->start + 0x400UL;
 504                        max = root->end;
 505                } else {
 506                        root = &pbm->mem_space;
 507                        min = root->start;
 508                        max = min + 0x80000000UL;
 509                }
 510
 511                size = res->end - res->start;
 512                align = size + 1;
 513                if (allocate_resource(root, res, size + 1, min, max, align, NULL, NULL) < 0) {
 514                        /* uh oh */
 515                        prom_printf("PCI: Failed to allocate resource %d for %s\n",
 516                                    i, pdev->name);
 517                        prom_halt();
 518                }
 519
 520                /* Update PCI config space. */
 521                pbm->parent->base_address_update(pdev, i);
 522        }
 523
 524        /* Special case, disable the ROM.  Several devices
 525         * act funny (ie. do not respond to memory space writes)
 526         * when it is left enabled.  A good example are Qlogic,ISP
 527         * adapters.
 528         */
 529        pci_read_config_dword(pdev, PCI_ROM_ADDRESS, &reg);
 530        reg &= ~PCI_ROM_ADDRESS_ENABLE;
 531        pci_write_config_dword(pdev, PCI_ROM_ADDRESS, reg);
 532
 533        /* If we saw I/O or MEM resources, enable appropriate
 534         * bits in PCI command register.
 535         */
 536        if (io_seen || mem_seen) {
 537                pci_read_config_word(pdev, PCI_COMMAND, &cmd);
 538                if (io_seen || has_implicit_io(pdev))
 539                        cmd |= PCI_COMMAND_IO;
 540                if (mem_seen)
 541                        cmd |= PCI_COMMAND_MEMORY;
 542                pci_write_config_word(pdev, PCI_COMMAND, cmd);
 543        }
 544
 545        /* If this is a PCI bridge or an IDE controller,
 546         * enable bus mastering.  In the former case also
 547         * set the cache line size correctly.
 548         */
 549        if (((pdev->class >> 8) == PCI_CLASS_BRIDGE_PCI) ||
 550            (((pdev->class >> 8) == PCI_CLASS_STORAGE_IDE) &&
 551             ((pdev->class & 0x80) != 0))) {
 552                pci_read_config_word(pdev, PCI_COMMAND, &cmd);
 553                cmd |= PCI_COMMAND_MASTER;
 554                pci_write_config_word(pdev, PCI_COMMAND, cmd);
 555
 556                if ((pdev->class >> 8) == PCI_CLASS_BRIDGE_PCI)
 557                        pci_write_config_byte(pdev,
 558                                              PCI_CACHE_LINE_SIZE,
 559                                              (64 / sizeof(u32)));
 560        }
 561}
 562
 563void __init pci_assign_unassigned(struct pci_pbm_info *pbm,
 564                                  struct pci_bus *pbus)
 565{
 566        struct list_head *walk = &pbus->devices;
 567
 568        for (walk = walk->next; walk != &pbus->devices; walk = walk->next)
 569                pdev_assign_unassigned(pbm, pci_dev_b(walk));
 570
 571        walk = &pbus->children;
 572        for (walk = walk->next; walk != &pbus->children; walk = walk->next)
 573                pci_assign_unassigned(pbm, pci_bus_b(walk));
 574}
 575
 576static int __init pci_intmap_match(struct pci_dev *pdev, unsigned int *interrupt)
 577{
 578        struct linux_prom_pci_intmap bridge_local_intmap[PROM_PCIIMAP_MAX], *intmap;
 579        struct linux_prom_pci_intmask bridge_local_intmask, *intmask;
 580        struct pcidev_cookie *dev_pcp = pdev->sysdata;
 581        struct pci_pbm_info *pbm = dev_pcp->pbm;
 582        struct linux_prom_pci_registers *pregs = dev_pcp->prom_regs;
 583        unsigned int hi, mid, lo, irq;
 584        int i, num_intmap, map_slot;
 585
 586        intmap = &pbm->pbm_intmap[0];
 587        intmask = &pbm->pbm_intmask;
 588        num_intmap = pbm->num_pbm_intmap;
 589        map_slot = 0;
 590
 591        /* If we are underneath a PCI bridge, use PROM register
 592         * property of the parent bridge which is closest to
 593         * the PBM.
 594         *
 595         * However if that parent bridge has interrupt map/mask
 596         * properties of it's own we use the PROM register property
 597         * of the next child device on the path to PDEV.
 598         *
 599         * In detail the two cases are (note that the 'X' below is the
 600         * 'next child on the path to PDEV' mentioned above):
 601         *
 602         * 1) PBM --> PCI bus lacking int{map,mask} --> X ... PDEV
 603         *
 604         *    Here we use regs of 'PCI bus' device.
 605         *
 606         * 2) PBM --> PCI bus with int{map,mask} --> X ... PDEV
 607         *
 608         *    Here we use regs of 'X'.  Note that X can be PDEV.
 609         */
 610        if (pdev->bus->number != pbm->pci_first_busno) {
 611                struct pcidev_cookie *bus_pcp, *regs_pcp;
 612                struct pci_dev *bus_dev, *regs_dev;
 613                int plen;
 614
 615                bus_dev = pdev->bus->self;
 616                regs_dev = pdev;
 617
 618                while (bus_dev->bus &&
 619                       bus_dev->bus->number != pbm->pci_first_busno) {
 620                        regs_dev = bus_dev;
 621                        bus_dev = bus_dev->bus->self;
 622                }
 623
 624                regs_pcp = regs_dev->sysdata;
 625                pregs = regs_pcp->prom_regs;
 626
 627                bus_pcp = bus_dev->sysdata;
 628
 629                /* But if the PCI bridge has it's own interrupt map
 630                 * and mask properties, use that and the regs of the
 631                 * PCI entity at the next level down on the path to the
 632                 * device.
 633                 */
 634                plen = prom_getproperty(bus_pcp->prom_node, "interrupt-map",
 635                                        (char *) &bridge_local_intmap[0],
 636                                        sizeof(bridge_local_intmap));
 637                if (plen != -1) {
 638                        intmap = &bridge_local_intmap[0];
 639                        num_intmap = plen / sizeof(struct linux_prom_pci_intmap);
 640                        plen = prom_getproperty(bus_pcp->prom_node,
 641                                                "interrupt-map-mask",
 642                                                (char *) &bridge_local_intmask,
 643                                                sizeof(bridge_local_intmask));
 644                        if (plen == -1) {
 645                                printk("pci_intmap_match: Warning! Bridge has intmap "
 646                                       "but no intmask.\n");
 647                                printk("pci_intmap_match: Trying to recover.\n");
 648                                return 0;
 649                        }
 650
 651                        if (pdev->bus->self != bus_dev)
 652                                map_slot = 1;
 653                } else {
 654                        pregs = bus_pcp->prom_regs;
 655                        map_slot = 1;
 656                }
 657        }
 658
 659        if (map_slot) {
 660                *interrupt = ((*interrupt
 661                               - 1
 662                               + PCI_SLOT(pdev->devfn)) & 0x3) + 1;
 663        }
 664
 665        hi   = pregs->phys_hi & intmask->phys_hi;
 666        mid  = pregs->phys_mid & intmask->phys_mid;
 667        lo   = pregs->phys_lo & intmask->phys_lo;
 668        irq  = *interrupt & intmask->interrupt;
 669
 670        for (i = 0; i < num_intmap; i++) {
 671                if (intmap[i].phys_hi  == hi    &&
 672                    intmap[i].phys_mid == mid   &&
 673                    intmap[i].phys_lo  == lo    &&
 674                    intmap[i].interrupt == irq) {
 675                        *interrupt = intmap[i].cinterrupt;
 676                        printk("PCI-IRQ: Routing bus[%2x] slot[%2x] map[%d] to INO[%02x]\n",
 677                               pdev->bus->number, PCI_SLOT(pdev->devfn),
 678                               map_slot, *interrupt);
 679                        return 1;
 680                }
 681        }
 682
 683        /* We will run this code even if pbm->num_pbm_intmap is zero, just so
 684         * we can apply the slot mapping to the PROM interrupt property value.
 685         * So do not spit out these warnings in that case.
 686         */
 687        if (num_intmap != 0) {
 688                /* Print it both to OBP console and kernel one so that if bootup
 689                 * hangs here the user has the information to report.
 690                 */
 691                prom_printf("pci_intmap_match: bus %02x, devfn %02x: ",
 692                            pdev->bus->number, pdev->devfn);
 693                prom_printf("IRQ [%08x.%08x.%08x.%08x] not found in interrupt-map\n",
 694                            pregs->phys_hi, pregs->phys_mid, pregs->phys_lo, *interrupt);
 695                prom_printf("Please email this information to davem@redhat.com\n");
 696
 697                printk("pci_intmap_match: bus %02x, devfn %02x: ",
 698                       pdev->bus->number, pdev->devfn);
 699                printk("IRQ [%08x.%08x.%08x.%08x] not found in interrupt-map\n",
 700                       pregs->phys_hi, pregs->phys_mid, pregs->phys_lo, *interrupt);
 701                printk("Please email this information to davem@redhat.com\n");
 702        }
 703
 704        return 0;
 705}
 706
 707static void __init pdev_fixup_irq(struct pci_dev *pdev)
 708{
 709        struct pcidev_cookie *pcp = pdev->sysdata;
 710        struct pci_pbm_info *pbm = pcp->pbm;
 711        struct pci_controller_info *p = pbm->parent;
 712        unsigned int portid = pbm->portid;
 713        unsigned int prom_irq;
 714        int prom_node = pcp->prom_node;
 715        int err;
 716
 717        /* If this is an empty EBUS device, sometimes OBP fails to
 718         * give it a valid fully specified interrupts property.
 719         * The EBUS hooked up to SunHME on PCI I/O boards of
 720         * Ex000 systems is one such case.
 721         *
 722         * The interrupt is not important so just ignore it.
 723         */
 724        if (pdev->vendor == PCI_VENDOR_ID_SUN &&
 725            pdev->device == PCI_DEVICE_ID_SUN_EBUS &&
 726            !prom_getchild(prom_node)) {
 727                pdev->irq = 0;
 728                return;
 729        }
 730
 731        err = prom_getproperty(prom_node, "interrupts",
 732                               (char *)&prom_irq, sizeof(prom_irq));
 733        if (err == 0 || err == -1) {
 734                pdev->irq = 0;
 735                return;
 736        }
 737
 738        /* Fully specified already? */
 739        if (((prom_irq & PCI_IRQ_IGN) >> 6) == portid) {
 740                pdev->irq = p->irq_build(pbm, pdev, prom_irq);
 741                goto have_irq;
 742        }
 743
 744        /* An onboard device? (bit 5 set) */
 745        if ((prom_irq & PCI_IRQ_INO) & 0x20) {
 746                pdev->irq = p->irq_build(pbm, pdev, (portid << 6 | prom_irq));
 747                goto have_irq;
 748        }
 749
 750        /* Can we find a matching entry in the interrupt-map? */
 751        if (pci_intmap_match(pdev, &prom_irq)) {
 752                pdev->irq = p->irq_build(pbm, pdev, (portid << 6) | prom_irq);
 753                goto have_irq;
 754        }
 755
 756        /* Ok, we have to do it the hard way. */
 757        {
 758                unsigned int bus, slot, line;
 759
 760                bus = (pbm == &pbm->parent->pbm_B) ? (1 << 4) : 0;
 761
 762                /* If we have a legal interrupt property, use it as
 763                 * the IRQ line.
 764                 */
 765                if (prom_irq > 0 && prom_irq < 5) {
 766                        line = ((prom_irq - 1) & 3);
 767                } else {
 768                        u8 pci_irq_line;
 769
 770                        /* Else just directly consult PCI config space. */
 771                        pci_read_config_byte(pdev, PCI_INTERRUPT_PIN, &pci_irq_line);
 772                        line = ((pci_irq_line - 1) & 3);
 773                }
 774
 775                /* Now figure out the slot.
 776                 *
 777                 * Basically, device number zero on the top-level bus is
 778                 * always the PCI host controller.  Slot 0 is then device 1.
 779                 * PBM A supports two external slots (0 and 1), and PBM B
 780                 * supports 4 external slots (0, 1, 2, and 3).  On-board PCI
 781                 * devices are wired to device numbers outside of these
 782                 * ranges. -DaveM
 783                 */
 784                if (pdev->bus->number == pbm->pci_first_busno) {
 785                        slot = PCI_SLOT(pdev->devfn) - pbm->pci_first_slot;
 786                } else {
 787                        struct pci_dev *bus_dev;
 788
 789                        /* Underneath a bridge, use slot number of parent
 790                         * bridge which is closest to the PBM.
 791                         */
 792                        bus_dev = pdev->bus->self;
 793                        while (bus_dev->bus &&
 794                               bus_dev->bus->number != pbm->pci_first_busno)
 795                                bus_dev = bus_dev->bus->self;
 796
 797                        slot = PCI_SLOT(bus_dev->devfn) - pbm->pci_first_slot;
 798                }
 799                slot = slot << 2;
 800
 801                pdev->irq = p->irq_build(pbm, pdev,
 802                                         ((portid << 6) & PCI_IRQ_IGN) |
 803                                         (bus | slot | line));
 804        }
 805
 806have_irq:
 807        pci_write_config_byte(pdev, PCI_INTERRUPT_LINE,
 808                              pdev->irq & PCI_IRQ_INO);
 809}
 810
 811void __init pci_fixup_irq(struct pci_pbm_info *pbm,
 812                          struct pci_bus *pbus)
 813{
 814        struct list_head *walk = &pbus->devices;
 815
 816        for (walk = walk->next; walk != &pbus->devices; walk = walk->next)
 817                pdev_fixup_irq(pci_dev_b(walk));
 818
 819        walk = &pbus->children;
 820        for (walk = walk->next; walk != &pbus->children; walk = walk->next)
 821                pci_fixup_irq(pbm, pci_bus_b(walk));
 822}
 823
 824static void pdev_setup_busmastering(struct pci_dev *pdev, int is_66mhz)
 825{
 826        u16 cmd;
 827        u8 hdr_type, min_gnt, ltimer;
 828
 829        pci_read_config_word(pdev, PCI_COMMAND, &cmd);
 830        cmd |= PCI_COMMAND_MASTER;
 831        pci_write_config_word(pdev, PCI_COMMAND, cmd);
 832
 833        /* Read it back, if the mastering bit did not
 834         * get set, the device does not support bus
 835         * mastering so we have nothing to do here.
 836         */
 837        pci_read_config_word(pdev, PCI_COMMAND, &cmd);
 838        if ((cmd & PCI_COMMAND_MASTER) == 0)
 839                return;
 840
 841        /* Set correct cache line size, 64-byte on all
 842         * Sparc64 PCI systems.  Note that the value is
 843         * measured in 32-bit words.
 844         */
 845        pci_write_config_byte(pdev, PCI_CACHE_LINE_SIZE,
 846                              64 / sizeof(u32));
 847
 848        pci_read_config_byte(pdev, PCI_HEADER_TYPE, &hdr_type);
 849        hdr_type &= ~0x80;
 850        if (hdr_type != PCI_HEADER_TYPE_NORMAL)
 851                return;
 852
 853        /* If the latency timer is already programmed with a non-zero
 854         * value, assume whoever set it (OBP or whoever) knows what
 855         * they are doing.
 856         */
 857        pci_read_config_byte(pdev, PCI_LATENCY_TIMER, &ltimer);
 858        if (ltimer != 0)
 859                return;
 860
 861        /* XXX Since I'm tipping off the min grant value to
 862         * XXX choose a suitable latency timer value, I also
 863         * XXX considered making use of the max latency value
 864         * XXX as well.  Unfortunately I've seen too many bogusly
 865         * XXX low settings for it to the point where it lacks
 866         * XXX any usefulness.  In one case, an ethernet card
 867         * XXX claimed a min grant of 10 and a max latency of 5.
 868         * XXX Now, if I had two such cards on the same bus I
 869         * XXX could not set the desired burst period (calculated
 870         * XXX from min grant) without violating the max latency
 871         * XXX bound.  Duh...
 872         * XXX
 873         * XXX I blame dumb PC bios implementors for stuff like
 874         * XXX this, most of them don't even try to do something
 875         * XXX sensible with latency timer values and just set some
 876         * XXX default value (usually 32) into every device.
 877         */
 878
 879        pci_read_config_byte(pdev, PCI_MIN_GNT, &min_gnt);
 880
 881        if (min_gnt == 0) {
 882                /* If no min_gnt setting then use a default
 883                 * value.
 884                 */
 885                if (is_66mhz)
 886                        ltimer = 16;
 887                else
 888                        ltimer = 32;
 889        } else {
 890                int shift_factor;
 891
 892                if (is_66mhz)
 893                        shift_factor = 2;
 894                else
 895                        shift_factor = 3;
 896
 897                /* Use a default value when the min_gnt value
 898                 * is erroneously high.
 899                 */
 900                if (((unsigned int) min_gnt << shift_factor) > 512 ||
 901                    ((min_gnt << shift_factor) & 0xff) == 0) {
 902                        ltimer = 8 << shift_factor;
 903                } else {
 904                        ltimer = min_gnt << shift_factor;
 905                }
 906        }
 907
 908        pci_write_config_byte(pdev, PCI_LATENCY_TIMER, ltimer);
 909}
 910
 911void pci_determine_66mhz_disposition(struct pci_pbm_info *pbm,
 912                                     struct pci_bus *pbus)
 913{
 914        struct list_head *walk;
 915        int all_are_66mhz;
 916        u16 status;
 917
 918        if (pbm->is_66mhz_capable == 0) {
 919                all_are_66mhz = 0;
 920                goto out;
 921        }
 922
 923        walk = &pbus->devices;
 924        all_are_66mhz = 1;
 925        for (walk = walk->next; walk != &pbus->devices; walk = walk->next) {
 926                struct pci_dev *pdev = pci_dev_b(walk);
 927
 928                pci_read_config_word(pdev, PCI_STATUS, &status);
 929                if (!(status & PCI_STATUS_66MHZ)) {
 930                        all_are_66mhz = 0;
 931                        break;
 932                }
 933        }
 934out:
 935        pbm->all_devs_66mhz = all_are_66mhz;
 936
 937        printk("PCI%d(PBM%c): Bus running at %dMHz\n",
 938               pbm->parent->index,
 939               (pbm == &pbm->parent->pbm_A) ? 'A' : 'B',
 940               (all_are_66mhz ? 66 : 33));
 941}
 942
 943void pci_setup_busmastering(struct pci_pbm_info *pbm,
 944                            struct pci_bus *pbus)
 945{
 946        struct list_head *walk = &pbus->devices;
 947        int is_66mhz;
 948
 949        is_66mhz = pbm->is_66mhz_capable && pbm->all_devs_66mhz;
 950
 951        for (walk = walk->next; walk != &pbus->devices; walk = walk->next)
 952                pdev_setup_busmastering(pci_dev_b(walk), is_66mhz);
 953
 954        walk = &pbus->children;
 955        for (walk = walk->next; walk != &pbus->children; walk = walk->next)
 956                pci_setup_busmastering(pbm, pci_bus_b(walk));
 957}
 958
 959void pci_register_legacy_regions(struct resource *io_res,
 960                                 struct resource *mem_res)
 961{
 962        struct resource *p;
 963
 964        /* VGA Video RAM. */
 965        p = kmalloc(sizeof(*p), GFP_KERNEL);
 966        if (!p)
 967                return;
 968
 969        memset(p, 0, sizeof(*p));
 970        p->name = "Video RAM area";
 971        p->start = mem_res->start + 0xa0000UL;
 972        p->end = p->start + 0x1ffffUL;
 973        p->flags = IORESOURCE_BUSY;
 974        request_resource(mem_res, p);
 975
 976        p = kmalloc(sizeof(*p), GFP_KERNEL);
 977        if (!p)
 978                return;
 979
 980        memset(p, 0, sizeof(*p));
 981        p->name = "System ROM";
 982        p->start = mem_res->start + 0xf0000UL;
 983        p->end = p->start + 0xffffUL;
 984        p->flags = IORESOURCE_BUSY;
 985        request_resource(mem_res, p);
 986
 987        p = kmalloc(sizeof(*p), GFP_KERNEL);
 988        if (!p)
 989                return;
 990
 991        memset(p, 0, sizeof(*p));
 992        p->name = "Video ROM";
 993        p->start = mem_res->start + 0xc0000UL;
 994        p->end = p->start + 0x7fffUL;
 995        p->flags = IORESOURCE_BUSY;
 996        request_resource(mem_res, p);
 997}
 998
 999/* Generic helper routines for PCI error reporting. */
1000void pci_scan_for_target_abort(struct pci_controller_info *p,
1001                               struct pci_pbm_info *pbm,
1002                               struct pci_bus *pbus)
1003{
1004        struct list_head *walk = &pbus->devices;
1005
1006        for (walk = walk->next; walk != &pbus->devices; walk = walk->next) {
1007                struct pci_dev *pdev = pci_dev_b(walk);
1008                u16 status, error_bits;
1009
1010                pci_read_config_word(pdev, PCI_STATUS, &status);
1011                error_bits =
1012                        (status & (PCI_STATUS_SIG_TARGET_ABORT |
1013                                   PCI_STATUS_REC_TARGET_ABORT));
1014                if (error_bits) {
1015                        pci_write_config_word(pdev, PCI_STATUS, error_bits);
1016                        printk("PCI%d(PBM%c): Device [%s] saw Target Abort [%016x]\n",
1017                               p->index, ((pbm == &p->pbm_A) ? 'A' : 'B'),
1018                               pdev->name, status);
1019                }
1020        }
1021
1022        walk = &pbus->children;
1023        for (walk = walk->next; walk != &pbus->children; walk = walk->next)
1024                pci_scan_for_target_abort(p, pbm, pci_bus_b(walk));
1025}
1026
1027void pci_scan_for_master_abort(struct pci_controller_info *p,
1028                               struct pci_pbm_info *pbm,
1029                               struct pci_bus *pbus)
1030{
1031        struct list_head *walk = &pbus->devices;
1032
1033        for (walk = walk->next; walk != &pbus->devices; walk = walk->next) {
1034                struct pci_dev *pdev = pci_dev_b(walk);
1035                u16 status, error_bits;
1036
1037                pci_read_config_word(pdev, PCI_STATUS, &status);
1038                error_bits =
1039                        (status & (PCI_STATUS_REC_MASTER_ABORT));
1040                if (error_bits) {
1041                        pci_write_config_word(pdev, PCI_STATUS, error_bits);
1042                        printk("PCI%d(PBM%c): Device [%s] received Master Abort [%016x]\n",
1043                               p->index, ((pbm == &p->pbm_A) ? 'A' : 'B'),
1044                               pdev->name, status);
1045                }
1046        }
1047
1048        walk = &pbus->children;
1049        for (walk = walk->next; walk != &pbus->children; walk = walk->next)
1050                pci_scan_for_master_abort(p, pbm, pci_bus_b(walk));
1051}
1052
1053void pci_scan_for_parity_error(struct pci_controller_info *p,
1054                               struct pci_pbm_info *pbm,
1055                               struct pci_bus *pbus)
1056{
1057        struct list_head *walk = &pbus->devices;
1058
1059        for (walk = walk->next; walk != &pbus->devices; walk = walk->next) {
1060                struct pci_dev *pdev = pci_dev_b(walk);
1061                u16 status, error_bits;
1062
1063                pci_read_config_word(pdev, PCI_STATUS, &status);
1064                error_bits =
1065                        (status & (PCI_STATUS_PARITY |
1066                                   PCI_STATUS_DETECTED_PARITY));
1067                if (error_bits) {
1068                        pci_write_config_word(pdev, PCI_STATUS, error_bits);
1069                        printk("PCI%d(PBM%c): Device [%s] saw Parity Error [%016x]\n",
1070                               p->index, ((pbm == &p->pbm_A) ? 'A' : 'B'),
1071                               pdev->name, status);
1072                }
1073        }
1074
1075        walk = &pbus->children;
1076        for (walk = walk->next; walk != &pbus->children; walk = walk->next)
1077                pci_scan_for_parity_error(p, pbm, pci_bus_b(walk));
1078}
1079
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.