1 /* 2 * Bus & driver management routines for devices within 3 * a MacIO ASIC. Interface to new driver model mostly 4 * stolen from the PCI version. 5 * 6 * TODO: 7 * 8 * - Don't probe below media bay by default, but instead provide 9 * some hooks for media bay to dynamically add/remove it's own 10 * sub-devices. 11 */ 12 13 #include <linux/config.h> 14 #include <linux/string.h> 15 #include <linux/kernel.h> 16 #include <linux/pci.h> 17 #include <linux/pci_ids.h> 18 #include <linux/init.h> 19 #include <linux/module.h> 20 #include <asm/machdep.h> 21 #include <asm/macio.h> 22 #include <asm/pmac_feature.h> 23 #include <asm/prom.h> 24 #include <asm/pci-bridge.h> 25 26 #undef DEBUG 27 28 #define MAX_NODE_NAME_SIZE (BUS_ID_SIZE - 12) 29 30 static struct macio_chip *macio_on_hold; 31 32 static int macio_bus_match(struct device *dev, struct device_driver *drv) 33 { 34 struct macio_dev * macio_dev = to_macio_device(dev); 35 struct macio_driver * macio_drv = to_macio_driver(drv); 36 const struct of_device_id * matches = macio_drv->match_table; 37 38 if (!matches) 39 return 0; 40 41 return of_match_device(matches, &macio_dev->ofdev) != NULL; 42 } 43 44 struct macio_dev *macio_dev_get(struct macio_dev *dev) 45 { 46 struct device *tmp; 47 48 if (!dev) 49 return NULL; 50 tmp = get_device(&dev->ofdev.dev); 51 if (tmp) 52 return to_macio_device(tmp); 53 else 54 return NULL; 55 } 56 57 void macio_dev_put(struct macio_dev *dev) 58 { 59 if (dev) 60 put_device(&dev->ofdev.dev); 61 } 62 63 64 static int macio_device_probe(struct device *dev) 65 { 66 int error = -ENODEV; 67 struct macio_driver *drv; 68 struct macio_dev *macio_dev; 69 const struct of_device_id *match; 70 71 drv = to_macio_driver(dev->driver); 72 macio_dev = to_macio_device(dev); 73 74 if (!drv->probe) 75 return error; 76 77 macio_dev_get(macio_dev); 78 79 match = of_match_device(drv->match_table, &macio_dev->ofdev); 80 if (match) 81 error = drv->probe(macio_dev, match); 82 if (error) 83 macio_dev_put(macio_dev); 84 85 return error; 86 } 87 88 static int macio_device_remove(struct device *dev) 89 { 90 struct macio_dev * macio_dev = to_macio_device(dev); 91 struct macio_driver * drv = to_macio_driver(dev->driver); 92 93 if (dev->driver && drv->remove) 94 drv->remove(macio_dev); 95 macio_dev_put(macio_dev); 96 97 return 0; 98 } 99 100 static void macio_device_shutdown(struct device *dev) 101 { 102 struct macio_dev * macio_dev = to_macio_device(dev); 103 struct macio_driver * drv = to_macio_driver(dev->driver); 104 105 if (dev->driver && drv->shutdown) 106 drv->shutdown(macio_dev); 107 } 108 109 static int macio_device_suspend(struct device *dev, pm_message_t state) 110 { 111 struct macio_dev * macio_dev = to_macio_device(dev); 112 struct macio_driver * drv = to_macio_driver(dev->driver); 113 114 if (dev->driver && drv->suspend) 115 return drv->suspend(macio_dev, state); 116 return 0; 117 } 118 119 static int macio_device_resume(struct device * dev) 120 { 121 struct macio_dev * macio_dev = to_macio_device(dev); 122 struct macio_driver * drv = to_macio_driver(dev->driver); 123 124 if (dev->driver && drv->resume) 125 return drv->resume(macio_dev); 126 return 0; 127 } 128 129 static int macio_hotplug (struct device *dev, char **envp, int num_envp, 130 char *buffer, int buffer_size) 131 { 132 struct macio_dev * macio_dev; 133 struct of_device * of; 134 char *scratch, *compat; 135 int i = 0; 136 int length = 0; 137 int cplen, seen = 0; 138 139 if (!dev) 140 return -ENODEV; 141 142 macio_dev = to_macio_device(dev); 143 if (!macio_dev) 144 return -ENODEV; 145 146 of = &macio_dev->ofdev; 147 scratch = buffer; 148 149 /* stuff we want to pass to /sbin/hotplug */ 150 envp[i++] = scratch; 151 length += scnprintf (scratch, buffer_size - length, "OF_NAME=%s", 152 of->node->name); 153 if ((buffer_size - length <= 0) || (i >= num_envp)) 154 return -ENOMEM; 155 ++length; 156 scratch += length; 157 158 envp[i++] = scratch; 159 length += scnprintf (scratch, buffer_size - length, "OF_TYPE=%s", 160 of->node->type); 161 if ((buffer_size - length <= 0) || (i >= num_envp)) 162 return -ENOMEM; 163 ++length; 164 scratch += length; 165 166 /* Since the compatible field can contain pretty much anything 167 * it's not really legal to split it out with commas. We split it 168 * up using a number of environment variables instead. */ 169 170 compat = (char *) get_property(of->node, "compatible", &cplen); 171 while (compat && cplen > 0) { 172 int l; 173 envp[i++] = scratch; 174 length += scnprintf (scratch, buffer_size - length, 175 "OF_COMPATIBLE_%d=%s", seen, compat); 176 if ((buffer_size - length <= 0) || (i >= num_envp)) 177 return -ENOMEM; 178 length++; 179 scratch += length; 180 l = strlen (compat) + 1; 181 compat += l; 182 cplen -= l; 183 seen++; 184 } 185 186 envp[i++] = scratch; 187 length += scnprintf (scratch, buffer_size - length, 188 "OF_COMPATIBLE_N=%d", seen); 189 if ((buffer_size - length <= 0) || (i >= num_envp)) 190 return -ENOMEM; 191 ++length; 192 scratch += length; 193 194 envp[i] = NULL; 195 196 return 0; 197 } 198 199 extern struct device_attribute macio_dev_attrs[]; 200 201 struct bus_type macio_bus_type = { 202 .name = "macio", 203 .match = macio_bus_match, 204 .hotplug = macio_hotplug, 205 .suspend = macio_device_suspend, 206 .resume = macio_device_resume, 207 .dev_attrs = macio_dev_attrs, 208 }; 209 210 static int __init macio_bus_driver_init(void) 211 { 212 return bus_register(&macio_bus_type); 213 } 214 215 postcore_initcall(macio_bus_driver_init); 216 217 218 /** 219 * macio_release_dev - free a macio device structure when all users of it are finished. 220 * @dev: device that's been disconnected 221 * 222 * Will be called only by the device core when all users of this macio device are 223 * done. This currently means never as we don't hot remove any macio device yet, 224 * though that will happen with mediabay based devices in a later implementation. 225 */ 226 static void macio_release_dev(struct device *dev) 227 { 228 struct macio_dev *mdev; 229 230 mdev = to_macio_device(dev); 231 kfree(mdev); 232 } 233 234 /** 235 * macio_resource_quirks - tweak or skip some resources for a device 236 * @np: pointer to the device node 237 * @res: resulting resource 238 * @index: index of resource in node 239 * 240 * If this routine returns non-null, then the resource is completely 241 * skipped. 242 */ 243 static int macio_resource_quirks(struct device_node *np, struct resource *res, int index) 244 { 245 if (res->flags & IORESOURCE_MEM) { 246 /* Grand Central has too large resource 0 on some machines */ 247 if (index == 0 && !strcmp(np->name, "gc")) { 248 np->addrs[0].size = 0x20000; 249 res->end = res->start + 0x1ffff; 250 } 251 /* Airport has bogus resource 2 */ 252 if (index >= 2 && !strcmp(np->name, "radio")) 253 return 1; 254 /* DBDMAs may have bogus sizes */ 255 if ((res->start & 0x0001f000) == 0x00008000) { 256 np->addrs[index].size = 0x100; 257 res->end = res->start + 0xff; 258 } 259 /* ESCC parent eats child resources. We could have added a level of hierarchy, 260 * but I don't really feel the need for it */ 261 if (!strcmp(np->name, "escc")) 262 return 1; 263 /* ESCC has bogus resources >= 3 */ 264 if (index >= 3 && !(strcmp(np->name, "ch-a") && strcmp(np->name, "ch-b"))) 265 return 1; 266 /* Media bay has too many resources, keep only first one */ 267 if (index > 0 && !strcmp(np->name, "media-bay")) 268 return 1; 269 /* Some older IDE resources have bogus sizes */ 270 if (!(strcmp(np->name, "IDE") && strcmp(np->name, "ATA") && 271 strcmp(np->type, "ide") && strcmp(np->type, "ata"))) { 272 if (index == 0 && np->addrs[0].size > 0x1000) { 273 np->addrs[0].size = 0x1000; 274 res->end = res->start + 0xfff; 275 } 276 if (index == 1 && np->addrs[1].size > 0x100) { 277 np->addrs[1].size = 0x100; 278 res->end = res->start + 0xff; 279 } 280 } 281 } 282 return 0; 283 } 284 285 286 /** 287 * macio_add_one_device - Add one device from OF node to the device tree 288 * @chip: pointer to the macio_chip holding the device 289 * @np: pointer to the device node in the OF tree 290 * @in_bay: set to 1 if device is part of a media-bay 291 * 292 * When media-bay is changed to hotswap drivers, this function will 293 * be exposed to the bay driver some way... 294 */ 295 static struct macio_dev * macio_add_one_device(struct macio_chip *chip, struct device *parent, 296 struct device_node *np, struct macio_dev *in_bay, 297 struct resource *parent_res) 298 { 299 struct macio_dev *dev; 300 int i, j; 301 u32 *reg; 302 303 if (np == NULL) 304 return NULL; 305 306 dev = kmalloc(sizeof(*dev), GFP_KERNEL); 307 if (!dev) 308 return NULL; 309 memset(dev, 0, sizeof(*dev)); 310 311 dev->bus = &chip->lbus; 312 dev->media_bay = in_bay; 313 dev->ofdev.node = np; 314 dev->ofdev.dma_mask = 0xffffffffUL; 315 dev->ofdev.dev.dma_mask = &dev->ofdev.dma_mask; 316 dev->ofdev.dev.parent = parent; 317 dev->ofdev.dev.bus = &macio_bus_type; 318 dev->ofdev.dev.release = macio_release_dev; 319 320 #ifdef DEBUG 321 printk("preparing mdev @%p, ofdev @%p, dev @%p, kobj @%p\n", 322 dev, &dev->ofdev, &dev->ofdev.dev, &dev->ofdev.dev.kobj); 323 #endif 324 325 /* MacIO itself has a different reg, we use it's PCI base */ 326 if (np == chip->of_node) { 327 sprintf(dev->ofdev.dev.bus_id, "%1d.%08lx:%.*s", chip->lbus.index, 328 #ifdef CONFIG_PCI 329 pci_resource_start(chip->lbus.pdev, 0), 330 #else 331 0, /* NuBus may want to do something better here */ 332 #endif 333 MAX_NODE_NAME_SIZE, np->name); 334 } else { 335 reg = (u32 *)get_property(np, "reg", NULL); 336 sprintf(dev->ofdev.dev.bus_id, "%1d.%08x:%.*s", chip->lbus.index, 337 reg ? *reg : 0, MAX_NODE_NAME_SIZE, np->name); 338 } 339 340 /* For now, we use pre-parsed entries in the device-tree for 341 * interrupt routing and addresses, but we should change that 342 * to dynamically parsed entries and so get rid of most of the 343 * clutter in struct device_node 344 */ 345 for (i = j = 0; i < np->n_intrs; i++) { 346 struct resource *res = &dev->interrupt[j]; 347 348 if (j >= MACIO_DEV_COUNT_IRQS) 349 break; 350 res->start = np->intrs[i].line; 351 res->flags = IORESOURCE_IO; 352 if (np->intrs[j].sense) 353 res->flags |= IORESOURCE_IRQ_LOWLEVEL; 354 else 355 res->flags |= IORESOURCE_IRQ_HIGHEDGE; 356 res->name = dev->ofdev.dev.bus_id; 357 if (macio_resource_quirks(np, res, i)) 358 memset(res, 0, sizeof(struct resource)); 359 else 360 j++; 361 } 362 dev->n_interrupts = j; 363 for (i = j = 0; i < np->n_addrs; i++) { 364 struct resource *res = &dev->resource[j]; 365 366 if (j >= MACIO_DEV_COUNT_RESOURCES) 367 break; 368 res->start = np->addrs[i].address; 369 res->end = np->addrs[i].address + np->addrs[i].size - 1; 370 res->flags = IORESOURCE_MEM; 371 res->name = dev->ofdev.dev.bus_id; 372 if (macio_resource_quirks(np, res, i)) 373 memset(res, 0, sizeof(struct resource)); 374 else { 375 j++; 376 /* Currently, we consider failure as harmless, this may 377 * change in the future, once I've found all the device 378 * tree bugs in older machines & worked around them 379 */ 380 if (insert_resource(parent_res, res)) 381 printk(KERN_WARNING "Can't request resource %d for MacIO" 382 " device %s\n", i, dev->ofdev.dev.bus_id); 383 } 384 } 385 dev->n_resources = j; 386 387 if (of_device_register(&dev->ofdev) != 0) { 388 printk(KERN_DEBUG"macio: device registration error for %s!\n", 389 dev->ofdev.dev.bus_id); 390 kfree(dev); 391 return NULL; 392 } 393 394 return dev; 395 } 396 397 static int macio_skip_device(struct device_node *np) 398 { 399 if (strncmp(np->name, "battery", 7) == 0) 400 return 1; 401 if (strncmp(np->name, "escc-legacy", 11) == 0) 402 return 1; 403 return 0; 404 } 405 406 /** 407 * macio_pci_add_devices - Adds sub-devices of mac-io to the device tree 408 * @chip: pointer to the macio_chip holding the devices 409 * 410 * This function will do the job of extracting devices from the 411 * Open Firmware device tree, build macio_dev structures and add 412 * them to the Linux device tree. 413 * 414 * For now, childs of media-bay are added now as well. This will 415 * change rsn though. 416 */ 417 static void macio_pci_add_devices(struct macio_chip *chip) 418 { 419 struct device_node *np, *pnode; 420 struct macio_dev *rdev, *mdev, *mbdev = NULL, *sdev = NULL; 421 struct device *parent = NULL; 422 struct resource *root_res = &iomem_resource; 423 424 /* Add a node for the macio bus itself */ 425 #ifdef CONFIG_PCI 426 if (chip->lbus.pdev) { 427 parent = &chip->lbus.pdev->dev; 428 root_res = &chip->lbus.pdev->resource[0]; 429 } 430 #endif 431 pnode = of_node_get(chip->of_node); 432 if (pnode == NULL) 433 return; 434 435 /* Add macio itself to hierarchy */ 436 rdev = macio_add_one_device(chip, parent, pnode, NULL, root_res); 437 if (rdev == NULL) 438 return; 439 root_res = &rdev->resource[0]; 440 441 /* First scan 1st level */ 442 for (np = NULL; (np = of_get_next_child(pnode, np)) != NULL;) { 443 if (!macio_skip_device(np)) { 444 of_node_get(np); 445 mdev = macio_add_one_device(chip, &rdev->ofdev.dev, np, NULL, root_res); 446 if (mdev == NULL) 447 of_node_put(np); 448 else if (strncmp(np->name, "media-bay", 9) == 0) 449 mbdev = mdev; 450 else if (strncmp(np->name, "escc", 4) == 0) 451 sdev = mdev; 452 } 453 } 454 455 /* Add media bay devices if any */ 456 if (mbdev) 457 for (np = NULL; (np = of_get_next_child(mbdev->ofdev.node, np)) != NULL;) 458 if (!macio_skip_device(np)) { 459 of_node_get(np); 460 if (macio_add_one_device(chip, &mbdev->ofdev.dev, np, mbdev, 461 root_res) == NULL) 462 of_node_put(np); 463 } 464 /* Add serial ports if any */ 465 if (sdev) { 466 for (np = NULL; (np = of_get_next_child(sdev->ofdev.node, np)) != NULL;) 467 if (!macio_skip_device(np)) { 468 of_node_get(np); 469 if (macio_add_one_device(chip, &sdev->ofdev.dev, np, NULL, 470 root_res) == NULL) 471 of_node_put(np); 472 } 473 } 474 } 475 476 477 /** 478 * macio_register_driver - Registers a new MacIO device driver 479 * @drv: pointer to the driver definition structure 480 */ 481 int macio_register_driver(struct macio_driver *drv) 482 { 483 int count = 0; 484 485 /* initialize common driver fields */ 486 drv->driver.name = drv->name; 487 drv->driver.bus = &macio_bus_type; 488 drv->driver.probe = macio_device_probe; 489 drv->driver.remove = macio_device_remove; 490 drv->driver.shutdown = macio_device_shutdown; 491 492 /* register with core */ 493 count = driver_register(&drv->driver); 494 return count ? count : 1; 495 } 496 497 /** 498 * macio_unregister_driver - Unregisters a new MacIO device driver 499 * @drv: pointer to the driver definition structure 500 */ 501 void macio_unregister_driver(struct macio_driver *drv) 502 { 503 driver_unregister(&drv->driver); 504 } 505 506 /** 507 * macio_request_resource - Request an MMIO resource 508 * @dev: pointer to the device holding the resource 509 * @resource_no: resource number to request 510 * @name: resource name 511 * 512 * Mark memory region number @resource_no associated with MacIO 513 * device @dev as being reserved by owner @name. Do not access 514 * any address inside the memory regions unless this call returns 515 * successfully. 516 * 517 * Returns 0 on success, or %EBUSY on error. A warning 518 * message is also printed on failure. 519 */ 520 int macio_request_resource(struct macio_dev *dev, int resource_no, const char *name) 521 { 522 if (macio_resource_len(dev, resource_no) == 0) 523 return 0; 524 525 if (!request_mem_region(macio_resource_start(dev, resource_no), 526 macio_resource_len(dev, resource_no), 527 name)) 528 goto err_out; 529 530 return 0; 531 532 err_out: 533 printk (KERN_WARNING "MacIO: Unable to reserve resource #%d:%lx@%lx" 534 " for device %s\n", 535 resource_no, 536 macio_resource_len(dev, resource_no), 537 macio_resource_start(dev, resource_no), 538 dev->ofdev.dev.bus_id); 539 return -EBUSY; 540 } 541 542 /** 543 * macio_release_resource - Release an MMIO resource 544 * @dev: pointer to the device holding the resource 545 * @resource_no: resource number to release 546 */ 547 void macio_release_resource(struct macio_dev *dev, int resource_no) 548 { 549 if (macio_resource_len(dev, resource_no) == 0) 550 return; 551 release_mem_region(macio_resource_start(dev, resource_no), 552 macio_resource_len(dev, resource_no)); 553 } 554 555 /** 556 * macio_request_resources - Reserve all memory resources 557 * @dev: MacIO device whose resources are to be reserved 558 * @name: Name to be associated with resource. 559 * 560 * Mark all memory regions associated with MacIO device @dev as 561 * being reserved by owner @name. Do not access any address inside 562 * the memory regions unless this call returns successfully. 563 * 564 * Returns 0 on success, or %EBUSY on error. A warning 565 * message is also printed on failure. 566 */ 567 int macio_request_resources(struct macio_dev *dev, const char *name) 568 { 569 int i; 570 571 for (i = 0; i < dev->n_resources; i++) 572 if (macio_request_resource(dev, i, name)) 573 goto err_out; 574 return 0; 575 576 err_out: 577 while(--i >= 0) 578 macio_release_resource(dev, i); 579 580 return -EBUSY; 581 } 582 583 /** 584 * macio_release_resources - Release reserved memory resources 585 * @dev: MacIO device whose resources were previously reserved 586 */ 587 588 void macio_release_resources(struct macio_dev *dev) 589 { 590 int i; 591 592 for (i = 0; i < dev->n_resources; i++) 593 macio_release_resource(dev, i); 594 } 595 596 597 #ifdef CONFIG_PCI 598 599 static int __devinit macio_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent) 600 { 601 struct device_node* np; 602 struct macio_chip* chip; 603 604 if (ent->vendor != PCI_VENDOR_ID_APPLE) 605 return -ENODEV; 606 607 /* Note regarding refcounting: We assume pci_device_to_OF_node() is ported 608 * to new OF APIs and returns a node with refcount incremented. This isn't 609 * the case today, but on the other hand ppc32 doesn't do refcounting. This 610 * will have to be fixed when going to ppc64. --BenH. 611 */ 612 np = pci_device_to_OF_node(pdev); 613 if (np == NULL) 614 return -ENODEV; 615 616 /* This assumption is wrong, fix that here for now until I fix the arch */ 617 of_node_get(np); 618 619 /* We also assume that pmac_feature will have done a get() on nodes stored 620 * in the macio chips array 621 */ 622 chip = macio_find(np, macio_unknown); 623 of_node_put(np); 624 if (chip == NULL) 625 return -ENODEV; 626 627 /* XXX Need locking ??? */ 628 if (chip->lbus.pdev == NULL) { 629 chip->lbus.pdev = pdev; 630 chip->lbus.chip = chip; 631 pci_set_drvdata(pdev, &chip->lbus); 632 pci_set_master(pdev); 633 } 634 635 printk(KERN_INFO "MacIO PCI driver attached to %s chipset\n", 636 chip->name); 637 638 /* 639 * HACK ALERT: The WallStreet PowerBook and some OHare based machines 640 * have 2 macio ASICs. I must probe the "main" one first or IDE ordering 641 * will be incorrect. So I put on "hold" the second one since it seem to 642 * appear first on PCI 643 */ 644 if (chip->type == macio_gatwick || chip->type == macio_ohareII) 645 if (macio_chips[0].lbus.pdev == NULL) { 646 macio_on_hold = chip; 647 return 0; 648 } 649 650 macio_pci_add_devices(chip); 651 if (macio_on_hold && macio_chips[0].lbus.pdev != NULL) { 652 macio_pci_add_devices(macio_on_hold); 653 macio_on_hold = NULL; 654 } 655 656 return 0; 657 } 658 659 static void __devexit macio_pci_remove(struct pci_dev* pdev) 660 { 661 panic("removing of macio-asic not supported !\n"); 662 } 663 664 /* 665 * MacIO is matched against any Apple ID, it's probe() function 666 * will then decide wether it applies or not 667 */ 668 static const struct pci_device_id __devinitdata pci_ids [] = { { 669 .vendor = PCI_VENDOR_ID_APPLE, 670 .device = PCI_ANY_ID, 671 .subvendor = PCI_ANY_ID, 672 .subdevice = PCI_ANY_ID, 673 674 }, { /* end: all zeroes */ } 675 }; 676 MODULE_DEVICE_TABLE (pci, pci_ids); 677 678 /* pci driver glue; this is a "new style" PCI driver module */ 679 static struct pci_driver macio_pci_driver = { 680 .name = (char *) "macio", 681 .id_table = pci_ids, 682 683 .probe = macio_pci_probe, 684 .remove = macio_pci_remove, 685 }; 686 687 #endif /* CONFIG_PCI */ 688 689 static int __init macio_module_init (void) 690 { 691 #ifdef CONFIG_PCI 692 int rc; 693 694 rc = pci_register_driver(&macio_pci_driver); 695 if (rc) 696 return rc; 697 #endif /* CONFIG_PCI */ 698 return 0; 699 } 700 701 module_init(macio_module_init); 702 703 EXPORT_SYMBOL(macio_register_driver); 704 EXPORT_SYMBOL(macio_unregister_driver); 705 EXPORT_SYMBOL(macio_dev_get); 706 EXPORT_SYMBOL(macio_dev_put); 707 EXPORT_SYMBOL(macio_request_resource); 708 EXPORT_SYMBOL(macio_release_resource); 709 EXPORT_SYMBOL(macio_request_resources); 710 EXPORT_SYMBOL(macio_release_resources); 711