1 /* 2 * pci_link.c - ACPI PCI Interrupt Link Device Driver ($Revision: 34 $) 3 * 4 * Copyright (C) 2001, 2002 Andy Grover <andrew.grover@intel.com> 5 * Copyright (C) 2001, 2002 Paul Diefenbaugh <paul.s.diefenbaugh@intel.com> 6 * Copyright (C) 2002 Dominik Brodowski <devel@brodo.de> 7 * 8 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 9 * 10 * This program is free software; you can redistribute it and/or modify 11 * it under the terms of the GNU General Public License as published by 12 * the Free Software Foundation; either version 2 of the License, or (at 13 * your option) any later version. 14 * 15 * This program is distributed in the hope that it will be useful, but 16 * WITHOUT ANY WARRANTY; without even the implied warranty of 17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 18 * General Public License for more details. 19 * 20 * You should have received a copy of the GNU General Public License along 21 * with this program; if not, write to the Free Software Foundation, Inc., 22 * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. 23 * 24 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 25 * 26 * TBD: 27 * 1. Support more than one IRQ resource entry per link device (index). 28 * 2. Implement start/stop mechanism and use ACPI Bus Driver facilities 29 * for IRQ management (e.g. start()->_SRS). 30 */ 31 32 #include <linux/sysdev.h> 33 #include <linux/kernel.h> 34 #include <linux/module.h> 35 #include <linux/init.h> 36 #include <linux/types.h> 37 #include <linux/proc_fs.h> 38 #include <linux/spinlock.h> 39 #include <linux/pm.h> 40 #include <linux/pci.h> 41 #include <linux/mutex.h> 42 43 #include <acpi/acpi_bus.h> 44 #include <acpi/acpi_drivers.h> 45 46 #define _COMPONENT ACPI_PCI_COMPONENT 47 ACPI_MODULE_NAME("pci_link"); 48 #define ACPI_PCI_LINK_CLASS "pci_irq_routing" 49 #define ACPI_PCI_LINK_DEVICE_NAME "PCI Interrupt Link" 50 #define ACPI_PCI_LINK_FILE_INFO "info" 51 #define ACPI_PCI_LINK_FILE_STATUS "state" 52 #define ACPI_PCI_LINK_MAX_POSSIBLE 16 53 static int acpi_pci_link_add(struct acpi_device *device); 54 static int acpi_pci_link_remove(struct acpi_device *device, int type); 55 56 static struct acpi_device_id link_device_ids[] = { 57 {"PNP0C0F", 0}, 58 {"", 0}, 59 }; 60 MODULE_DEVICE_TABLE(acpi, link_device_ids); 61 62 static struct acpi_driver acpi_pci_link_driver = { 63 .name = "pci_link", 64 .class = ACPI_PCI_LINK_CLASS, 65 .ids = link_device_ids, 66 .ops = { 67 .add = acpi_pci_link_add, 68 .remove = acpi_pci_link_remove, 69 }, 70 }; 71 72 /* 73 * If a link is initialized, we never change its active and initialized 74 * later even the link is disable. Instead, we just repick the active irq 75 */ 76 struct acpi_pci_link_irq { 77 u8 active; /* Current IRQ */ 78 u8 triggering; /* All IRQs */ 79 u8 polarity; /* All IRQs */ 80 u8 resource_type; 81 u8 possible_count; 82 u8 possible[ACPI_PCI_LINK_MAX_POSSIBLE]; 83 u8 initialized:1; 84 u8 reserved:7; 85 }; 86 87 struct acpi_pci_link { 88 struct list_head node; 89 struct acpi_device *device; 90 struct acpi_pci_link_irq irq; 91 int refcnt; 92 }; 93 94 static struct { 95 int count; 96 struct list_head entries; 97 } acpi_link; 98 static DEFINE_MUTEX(acpi_link_lock); 99 100 /* -------------------------------------------------------------------------- 101 PCI Link Device Management 102 -------------------------------------------------------------------------- */ 103 104 /* 105 * set context (link) possible list from resource list 106 */ 107 static acpi_status 108 acpi_pci_link_check_possible(struct acpi_resource *resource, void *context) 109 { 110 struct acpi_pci_link *link = context; 111 u32 i = 0; 112 113 114 switch (resource->type) { 115 case ACPI_RESOURCE_TYPE_START_DEPENDENT: 116 return AE_OK; 117 case ACPI_RESOURCE_TYPE_IRQ: 118 { 119 struct acpi_resource_irq *p = &resource->data.irq; 120 if (!p || !p->interrupt_count) { 121 printk(KERN_WARNING PREFIX "Blank IRQ resource\n"); 122 return AE_OK; 123 } 124 for (i = 0; 125 (i < p->interrupt_count 126 && i < ACPI_PCI_LINK_MAX_POSSIBLE); i++) { 127 if (!p->interrupts[i]) { 128 printk(KERN_WARNING PREFIX "Invalid IRQ %d\n", 129 p->interrupts[i]); 130 continue; 131 } 132 link->irq.possible[i] = p->interrupts[i]; 133 link->irq.possible_count++; 134 } 135 link->irq.triggering = p->triggering; 136 link->irq.polarity = p->polarity; 137 link->irq.resource_type = ACPI_RESOURCE_TYPE_IRQ; 138 break; 139 } 140 case ACPI_RESOURCE_TYPE_EXTENDED_IRQ: 141 { 142 struct acpi_resource_extended_irq *p = 143 &resource->data.extended_irq; 144 if (!p || !p->interrupt_count) { 145 printk(KERN_WARNING PREFIX 146 "Blank EXT IRQ resource\n"); 147 return AE_OK; 148 } 149 for (i = 0; 150 (i < p->interrupt_count 151 && i < ACPI_PCI_LINK_MAX_POSSIBLE); i++) { 152 if (!p->interrupts[i]) { 153 printk(KERN_WARNING PREFIX "Invalid IRQ %d\n", 154 p->interrupts[i]); 155 continue; 156 } 157 link->irq.possible[i] = p->interrupts[i]; 158 link->irq.possible_count++; 159 } 160 link->irq.triggering = p->triggering; 161 link->irq.polarity = p->polarity; 162 link->irq.resource_type = ACPI_RESOURCE_TYPE_EXTENDED_IRQ; 163 break; 164 } 165 default: 166 printk(KERN_ERR PREFIX "Resource is not an IRQ entry\n"); 167 return AE_OK; 168 } 169 170 return AE_CTRL_TERMINATE; 171 } 172 173 static int acpi_pci_link_get_possible(struct acpi_pci_link *link) 174 { 175 acpi_status status; 176 177 178 if (!link) 179 return -EINVAL; 180 181 status = acpi_walk_resources(link->device->handle, METHOD_NAME__PRS, 182 acpi_pci_link_check_possible, link); 183 if (ACPI_FAILURE(status)) { 184 ACPI_EXCEPTION((AE_INFO, status, "Evaluating _PRS")); 185 return -ENODEV; 186 } 187 188 ACPI_DEBUG_PRINT((ACPI_DB_INFO, 189 "Found %d possible IRQs\n", 190 link->irq.possible_count)); 191 192 return 0; 193 } 194 195 static acpi_status 196 acpi_pci_link_check_current(struct acpi_resource *resource, void *context) 197 { 198 int *irq = (int *)context; 199 200 201 switch (resource->type) { 202 case ACPI_RESOURCE_TYPE_IRQ: 203 { 204 struct acpi_resource_irq *p = &resource->data.irq; 205 if (!p || !p->interrupt_count) { 206 /* 207 * IRQ descriptors may have no IRQ# bits set, 208 * particularly those those w/ _STA disabled 209 */ 210 ACPI_DEBUG_PRINT((ACPI_DB_INFO, 211 "Blank IRQ resource\n")); 212 return AE_OK; 213 } 214 *irq = p->interrupts[0]; 215 break; 216 } 217 case ACPI_RESOURCE_TYPE_EXTENDED_IRQ: 218 { 219 struct acpi_resource_extended_irq *p = 220 &resource->data.extended_irq; 221 if (!p || !p->interrupt_count) { 222 /* 223 * extended IRQ descriptors must 224 * return at least 1 IRQ 225 */ 226 printk(KERN_WARNING PREFIX 227 "Blank EXT IRQ resource\n"); 228 return AE_OK; 229 } 230 *irq = p->interrupts[0]; 231 break; 232 } 233 break; 234 default: 235 printk(KERN_ERR PREFIX "Resource %d isn't an IRQ\n", resource->type); 236 case ACPI_RESOURCE_TYPE_END_TAG: 237 return AE_OK; 238 } 239 return AE_CTRL_TERMINATE; 240 } 241 242 /* 243 * Run _CRS and set link->irq.active 244 * 245 * return value: 246 * 0 - success 247 * !0 - failure 248 */ 249 static int acpi_pci_link_get_current(struct acpi_pci_link *link) 250 { 251 int result = 0; 252 acpi_status status = AE_OK; 253 int irq = 0; 254 255 if (!link) 256 return -EINVAL; 257 258 link->irq.active = 0; 259 260 /* in practice, status disabled is meaningless, ignore it */ 261 if (acpi_strict) { 262 /* Query _STA, set link->device->status */ 263 result = acpi_bus_get_status(link->device); 264 if (result) { 265 printk(KERN_ERR PREFIX "Unable to read status\n"); 266 goto end; 267 } 268 269 if (!link->device->status.enabled) { 270 ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Link disabled\n")); 271 return 0; 272 } 273 } 274 275 /* 276 * Query and parse _CRS to get the current IRQ assignment. 277 */ 278 279 status = acpi_walk_resources(link->device->handle, METHOD_NAME__CRS, 280 acpi_pci_link_check_current, &irq); 281 if (ACPI_FAILURE(status)) { 282 ACPI_EXCEPTION((AE_INFO, status, "Evaluating _CRS")); 283 result = -ENODEV; 284 goto end; 285 } 286 287 if (acpi_strict && !irq) { 288 printk(KERN_ERR PREFIX "_CRS returned 0\n"); 289 result = -ENODEV; 290 } 291 292 link->irq.active = irq; 293 294 ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Link at IRQ %d \n", link->irq.active)); 295 296 end: 297 return result; 298 } 299 300 static int acpi_pci_link_set(struct acpi_pci_link *link, int irq) 301 { 302 int result = 0; 303 acpi_status status = AE_OK; 304 struct { 305 struct acpi_resource res; 306 struct acpi_resource end; 307 } *resource; 308 struct acpi_buffer buffer = { 0, NULL }; 309 310 311 if (!link || !irq) 312 return -EINVAL; 313 314 resource = kzalloc(sizeof(*resource) + 1, irqs_disabled() ? GFP_ATOMIC: GFP_KERNEL); 315 if (!resource) 316 return -ENOMEM; 317 318 buffer.length = sizeof(*resource) + 1; 319 buffer.pointer = resource; 320 321 switch (link->irq.resource_type) { 322 case ACPI_RESOURCE_TYPE_IRQ: 323 resource->res.type = ACPI_RESOURCE_TYPE_IRQ; 324 resource->res.length = sizeof(struct acpi_resource); 325 resource->res.data.irq.triggering = link->irq.triggering; 326 resource->res.data.irq.polarity = 327 link->irq.polarity; 328 if (link->irq.triggering == ACPI_EDGE_SENSITIVE) 329 resource->res.data.irq.sharable = 330 ACPI_EXCLUSIVE; 331 else 332 resource->res.data.irq.sharable = ACPI_SHARED; 333 resource->res.data.irq.interrupt_count = 1; 334 resource->res.data.irq.interrupts[0] = irq; 335 break; 336 337 case ACPI_RESOURCE_TYPE_EXTENDED_IRQ: 338 resource->res.type = ACPI_RESOURCE_TYPE_EXTENDED_IRQ; 339 resource->res.length = sizeof(struct acpi_resource); 340 resource->res.data.extended_irq.producer_consumer = 341 ACPI_CONSUMER; 342 resource->res.data.extended_irq.triggering = 343 link->irq.triggering; 344 resource->res.data.extended_irq.polarity = 345 link->irq.polarity; 346 if (link->irq.triggering == ACPI_EDGE_SENSITIVE) 347 resource->res.data.irq.sharable = 348 ACPI_EXCLUSIVE; 349 else 350 resource->res.data.irq.sharable = ACPI_SHARED; 351 resource->res.data.extended_irq.interrupt_count = 1; 352 resource->res.data.extended_irq.interrupts[0] = irq; 353 /* ignore resource_source, it's optional */ 354 break; 355 default: 356 printk(KERN_ERR PREFIX "Invalid Resource_type %d\n", link->irq.resource_type); 357 result = -EINVAL; 358 goto end; 359 360 } 361 resource->end.type = ACPI_RESOURCE_TYPE_END_TAG; 362 363 /* Attempt to set the resource */ 364 status = acpi_set_current_resources(link->device->handle, &buffer); 365 366 /* check for total failure */ 367 if (ACPI_FAILURE(status)) { 368 ACPI_EXCEPTION((AE_INFO, status, "Evaluating _SRS")); 369 result = -ENODEV; 370 goto end; 371 } 372 373 /* Query _STA, set device->status */ 374 result = acpi_bus_get_status(link->device); 375 if (result) { 376 printk(KERN_ERR PREFIX "Unable to read status\n"); 377 goto end; 378 } 379 if (!link->device->status.enabled) { 380 printk(KERN_WARNING PREFIX 381 "%s [%s] disabled and referenced, BIOS bug\n", 382 acpi_device_name(link->device), 383 acpi_device_bid(link->device)); 384 } 385 386 /* Query _CRS, set link->irq.active */ 387 result = acpi_pci_link_get_current(link); 388 if (result) { 389 goto end; 390 } 391 392 /* 393 * Is current setting not what we set? 394 * set link->irq.active 395 */ 396 if (link->irq.active != irq) { 397 /* 398 * policy: when _CRS doesn't return what we just _SRS 399 * assume _SRS worked and override _CRS value. 400 */ 401 printk(KERN_WARNING PREFIX 402 "%s [%s] BIOS reported IRQ %d, using IRQ %d\n", 403 acpi_device_name(link->device), 404 acpi_device_bid(link->device), link->irq.active, irq); 405 link->irq.active = irq; 406 } 407 408 ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Set IRQ %d\n", link->irq.active)); 409 410 end: 411 kfree(resource); 412 return result; 413 } 414 415 /* -------------------------------------------------------------------------- 416 PCI Link IRQ Management 417 -------------------------------------------------------------------------- */ 418 419 /* 420 * "acpi_irq_balance" (default in APIC mode) enables ACPI to use PIC Interrupt 421 * Link Devices to move the PIRQs around to minimize sharing. 422 * 423 * "acpi_irq_nobalance" (default in PIC mode) tells ACPI not to move any PIC IRQs 424 * that the BIOS has already set to active. This is necessary because 425 * ACPI has no automatic means of knowing what ISA IRQs are used. Note that 426 * if the BIOS doesn't set a Link Device active, ACPI needs to program it 427 * even if acpi_irq_nobalance is set. 428 * 429 * A tables of penalties avoids directing PCI interrupts to well known 430 * ISA IRQs. Boot params are available to over-ride the default table: 431 * 432 * List interrupts that are free for PCI use. 433 * acpi_irq_pci=n[,m] 434 * 435 * List interrupts that should not be used for PCI: 436 * acpi_irq_isa=n[,m] 437 * 438 * Note that PCI IRQ routers have a list of possible IRQs, 439 * which may not include the IRQs this table says are available. 440 * 441 * Since this heuristic can't tell the difference between a link 442 * that no device will attach to, vs. a link which may be shared 443 * by multiple active devices -- it is not optimal. 444 * 445 * If interrupt performance is that important, get an IO-APIC system 446 * with a pin dedicated to each device. Or for that matter, an MSI 447 * enabled system. 448 */ 449 450 #define ACPI_MAX_IRQS 256 451 #define ACPI_MAX_ISA_IRQ 16 452 453 #define PIRQ_PENALTY_PCI_AVAILABLE (0) 454 #define PIRQ_PENALTY_PCI_POSSIBLE (16*16) 455 #define PIRQ_PENALTY_PCI_USING (16*16*16) 456 #define PIRQ_PENALTY_ISA_TYPICAL (16*16*16*16) 457 #define PIRQ_PENALTY_ISA_USED (16*16*16*16*16) 458 #define PIRQ_PENALTY_ISA_ALWAYS (16*16*16*16*16*16) 459 460 static int acpi_irq_penalty[ACPI_MAX_IRQS] = { 461 PIRQ_PENALTY_ISA_ALWAYS, /* IRQ0 timer */ 462 PIRQ_PENALTY_ISA_ALWAYS, /* IRQ1 keyboard */ 463 PIRQ_PENALTY_ISA_ALWAYS, /* IRQ2 cascade */ 464 PIRQ_PENALTY_ISA_TYPICAL, /* IRQ3 serial */ 465 PIRQ_PENALTY_ISA_TYPICAL, /* IRQ4 serial */ 466 PIRQ_PENALTY_ISA_TYPICAL, /* IRQ5 sometimes SoundBlaster */ 467 PIRQ_PENALTY_ISA_TYPICAL, /* IRQ6 */ 468 PIRQ_PENALTY_ISA_TYPICAL, /* IRQ7 parallel, spurious */ 469 PIRQ_PENALTY_ISA_TYPICAL, /* IRQ8 rtc, sometimes */ 470 PIRQ_PENALTY_PCI_AVAILABLE, /* IRQ9 PCI, often acpi */ 471 PIRQ_PENALTY_PCI_AVAILABLE, /* IRQ10 PCI */ 472 PIRQ_PENALTY_PCI_AVAILABLE, /* IRQ11 PCI */ 473 PIRQ_PENALTY_ISA_USED, /* IRQ12 mouse */ 474 PIRQ_PENALTY_ISA_USED, /* IRQ13 fpe, sometimes */ 475 PIRQ_PENALTY_ISA_USED, /* IRQ14 ide0 */ 476 PIRQ_PENALTY_ISA_USED, /* IRQ15 ide1 */ 477 /* >IRQ15 */ 478 }; 479 480 int __init acpi_irq_penalty_init(void) 481 { 482 struct list_head *node = NULL; 483 struct acpi_pci_link *link = NULL; 484 int i = 0; 485 486 487 /* 488 * Update penalties to facilitate IRQ balancing. 489 */ 490 list_for_each(node, &acpi_link.entries) { 491 492 link = list_entry(node, struct acpi_pci_link, node); 493 if (!link) { 494 printk(KERN_ERR PREFIX "Invalid link context\n"); 495 continue; 496 } 497 498 /* 499 * reflect the possible and active irqs in the penalty table -- 500 * useful for breaking ties. 501 */ 502 if (link->irq.possible_count) { 503 int penalty = 504 PIRQ_PENALTY_PCI_POSSIBLE / 505 link->irq.possible_count; 506 507 for (i = 0; i < link->irq.possible_count; i++) { 508 if (link->irq.possible[i] < ACPI_MAX_ISA_IRQ) 509 acpi_irq_penalty[link->irq. 510 possible[i]] += 511 penalty; 512 } 513 514 } else if (link->irq.active) { 515 acpi_irq_penalty[link->irq.active] += 516 PIRQ_PENALTY_PCI_POSSIBLE; 517 } 518 } 519 /* Add a penalty for the SCI */ 520 acpi_irq_penalty[acpi_gbl_FADT.sci_interrupt] += PIRQ_PENALTY_PCI_USING; 521 522 return 0; 523 } 524 525 static int acpi_irq_balance; /* 0: static, 1: balance */ 526 527 static int acpi_pci_link_allocate(struct acpi_pci_link *link) 528 { 529 int irq; 530 int i; 531 532 533 if (link->irq.initialized) { 534 if (link->refcnt == 0) 535 /* This means the link is disabled but initialized */ 536 acpi_pci_link_set(link, link->irq.active); 537 return 0; 538 } 539 540 /* 541 * search for active IRQ in list of possible IRQs. 542 */ 543 for (i = 0; i < link->irq.possible_count; ++i) { 544 if (link->irq.active == link->irq.possible[i]) 545 break; 546 } 547 /* 548 * forget active IRQ that is not in possible list 549 */ 550 if (i == link->irq.possible_count) { 551 if (acpi_strict) 552 printk(KERN_WARNING PREFIX "_CRS %d not found" 553 " in _PRS\n", link->irq.active); 554 link->irq.active = 0; 555 } 556 557 /* 558 * if active found, use it; else pick entry from end of possible list. 559 */ 560 if (link->irq.active) { 561 irq = link->irq.active; 562 } else { 563 irq = link->irq.possible[link->irq.possible_count - 1]; 564 } 565 566 if (acpi_irq_balance || !link->irq.active) { 567 /* 568 * Select the best IRQ. This is done in reverse to promote 569 * the use of IRQs 9, 10, 11, and >15. 570 */ 571 for (i = (link->irq.possible_count - 1); i >= 0; i--) { 572 if (acpi_irq_penalty[irq] > 573 acpi_irq_penalty[link->irq.possible[i]]) 574 irq = link->irq.possible[i]; 575 } 576 } 577 578 /* Attempt to enable the link device at this IRQ. */ 579 if (acpi_pci_link_set(link, irq)) { 580 printk(KERN_ERR PREFIX "Unable to set IRQ for %s [%s]. " 581 "Try pci=noacpi or acpi=off\n", 582 acpi_device_name(link->device), 583 acpi_device_bid(link->device)); 584 return -ENODEV; 585 } else { 586 acpi_irq_penalty[link->irq.active] += PIRQ_PENALTY_PCI_USING; 587 printk(PREFIX "%s [%s] enabled at IRQ %d\n", 588 acpi_device_name(link->device), 589 acpi_device_bid(link->device), link->irq.active); 590 } 591 592 link->irq.initialized = 1; 593 594 return 0; 595 } 596 597 /* 598 * acpi_pci_link_allocate_irq 599 * success: return IRQ >= 0 600 * failure: return -1 601 */ 602 603 int 604 acpi_pci_link_allocate_irq(acpi_handle handle, 605 int index, 606 int *triggering, int *polarity, char **name) 607 { 608 int result = 0; 609 struct acpi_device *device = NULL; 610 struct acpi_pci_link *link = NULL; 611 612 613 result = acpi_bus_get_device(handle, &device); 614 if (result) { 615 printk(KERN_ERR PREFIX "Invalid link device\n"); 616 return -1; 617 } 618 619 link = acpi_driver_data(device); 620 if (!link) { 621 printk(KERN_ERR PREFIX "Invalid link context\n"); 622 return -1; 623 } 624 625 /* TBD: Support multiple index (IRQ) entries per Link Device */ 626 if (index) { 627 printk(KERN_ERR PREFIX "Invalid index %d\n", index); 628 return -1; 629 } 630 631 mutex_lock(&acpi_link_lock); 632 if (acpi_pci_link_allocate(link)) { 633 mutex_unlock(&acpi_link_lock); 634 return -1; 635 } 636 637 if (!link->irq.active) { 638 mutex_unlock(&acpi_link_lock); 639 printk(KERN_ERR PREFIX "Link active IRQ is 0!\n"); 640 return -1; 641 } 642 link->refcnt++; 643 mutex_unlock(&acpi_link_lock); 644 645 if (triggering) 646 *triggering = link->irq.triggering; 647 if (polarity) 648 *polarity = link->irq.polarity; 649 if (name) 650 *name = acpi_device_bid(link->device); 651 ACPI_DEBUG_PRINT((ACPI_DB_INFO, 652 "Link %s is referenced\n", 653 acpi_device_bid(link->device))); 654 return (link->irq.active); 655 } 656 657 /* 658 * We don't change link's irq information here. After it is reenabled, we 659 * continue use the info 660 */ 661 int acpi_pci_link_free_irq(acpi_handle handle) 662 { 663 struct acpi_device *device = NULL; 664 struct acpi_pci_link *link = NULL; 665 acpi_status result; 666 667 668 result = acpi_bus_get_device(handle, &device); 669 if (result) { 670 printk(KERN_ERR PREFIX "Invalid link device\n"); 671 return -1; 672 } 673 674 link = acpi_driver_data(device); 675 if (!link) { 676 printk(KERN_ERR PREFIX "Invalid link context\n"); 677 return -1; 678 } 679 680 mutex_lock(&acpi_link_lock); 681 if (!link->irq.initialized) { 682 mutex_unlock(&acpi_link_lock); 683 printk(KERN_ERR PREFIX "Link isn't initialized\n"); 684 return -1; 685 } 686 #ifdef FUTURE_USE 687 /* 688 * The Link reference count allows us to _DISable an unused link 689 * and suspend time, and set it again on resume. 690 * However, 2.6.12 still has irq_router.resume 691 * which blindly restores the link state. 692 * So we disable the reference count method 693 * to prevent duplicate acpi_pci_link_set() 694 * which would harm some systems 695 */ 696 link->refcnt--; 697 #endif 698 ACPI_DEBUG_PRINT((ACPI_DB_INFO, 699 "Link %s is dereferenced\n", 700 acpi_device_bid(link->device))); 701 702 if (link->refcnt == 0) { 703 acpi_ut_evaluate_object(link->device->handle, "_DIS", 0, NULL); 704 } 705 mutex_unlock(&acpi_link_lock); 706 return (link->irq.active); 707 } 708 709 /* -------------------------------------------------------------------------- 710 Driver Interface 711 -------------------------------------------------------------------------- */ 712 713 static int acpi_pci_link_add(struct acpi_device *device) 714 { 715 int result = 0; 716 struct acpi_pci_link *link = NULL; 717 int i = 0; 718 int found = 0; 719 720 721 if (!device) 722 return -EINVAL; 723 724 link = kzalloc(sizeof(struct acpi_pci_link), GFP_KERNEL); 725 if (!link) 726 return -ENOMEM; 727 728 link->device = device; 729 strcpy(acpi_device_name(device), ACPI_PCI_LINK_DEVICE_NAME); 730 strcpy(acpi_device_class(device), ACPI_PCI_LINK_CLASS); 731 acpi_driver_data(device) = link; 732 733 mutex_lock(&acpi_link_lock); 734 result = acpi_pci_link_get_possible(link); 735 if (result) 736 goto end; 737 738 /* query and set link->irq.active */ 739 acpi_pci_link_get_current(link); 740 741 printk(KERN_INFO PREFIX "%s [%s] (IRQs", acpi_device_name(device), 742 acpi_device_bid(device)); 743 for (i = 0; i < link->irq.possible_count; i++) { 744 if (link->irq.active == link->irq.possible[i]) { 745 printk(" *%d", link->irq.possible[i]); 746 found = 1; 747 } else 748 printk(" %d", link->irq.possible[i]); 749 } 750 751 printk(")"); 752 753 if (!found) 754 printk(" *%d", link->irq.active); 755 756 if (!link->device->status.enabled) 757 printk(", disabled."); 758 759 printk("\n"); 760 761 /* TBD: Acquire/release lock */ 762 list_add_tail(&link->node, &acpi_link.entries); 763 acpi_link.count++; 764 765 end: 766 /* disable all links -- to be activated on use */ 767 acpi_ut_evaluate_object(device->handle, "_DIS", 0, NULL); 768 mutex_unlock(&acpi_link_lock); 769 770 if (result) 771 kfree(link); 772 773 return result; 774 } 775 776 static int acpi_pci_link_resume(struct acpi_pci_link *link) 777 { 778 779 if (link->refcnt && link->irq.active && link->irq.initialized) 780 return (acpi_pci_link_set(link, link->irq.active)); 781 else 782 return 0; 783 } 784 785 static int irqrouter_resume(struct sys_device *dev) 786 { 787 struct list_head *node = NULL; 788 struct acpi_pci_link *link = NULL; 789 790 791 /* Make sure SCI is enabled again (Apple firmware bug?) */ 792 acpi_set_register(ACPI_BITREG_SCI_ENABLE, 1); 793 794 list_for_each(node, &acpi_link.entries) { 795 link = list_entry(node, struct acpi_pci_link, node); 796 if (!link) { 797 printk(KERN_ERR PREFIX "Invalid link context\n"); 798 continue; 799 } 800 acpi_pci_link_resume(link); 801 } 802 return 0; 803 } 804 805 static int acpi_pci_link_remove(struct acpi_device *device, int type) 806 { 807 struct acpi_pci_link *link = NULL; 808 809 810 if (!device || !acpi_driver_data(device)) 811 return -EINVAL; 812 813 link = acpi_driver_data(device); 814 815 mutex_lock(&acpi_link_lock); 816 list_del(&link->node); 817 mutex_unlock(&acpi_link_lock); 818 819 kfree(link); 820 821 return 0; 822 } 823 824 /* 825 * modify acpi_irq_penalty[] from cmdline 826 */ 827 static int __init acpi_irq_penalty_update(char *str, int used) 828 { 829 int i; 830 831 for (i = 0; i < 16; i++) { 832 int retval; 833 int irq; 834 835 retval = get_option(&str, &irq); 836 837 if (!retval) 838 break; /* no number found */ 839 840 if (irq < 0) 841 continue; 842 843 if (irq >= ACPI_MAX_IRQS) 844 continue; 845 846 if (used) 847 acpi_irq_penalty[irq] += PIRQ_PENALTY_ISA_USED; 848 else 849 acpi_irq_penalty[irq] = PIRQ_PENALTY_PCI_AVAILABLE; 850 851 if (retval != 2) /* no next number */ 852 break; 853 } 854 return 1; 855 } 856 857 /* 858 * We'd like PNP to call this routine for the 859 * single ISA_USED value for each legacy device. 860 * But instead it calls us with each POSSIBLE setting. 861 * There is no ISA_POSSIBLE weight, so we simply use 862 * the (small) PCI_USING penalty. 863 */ 864 void acpi_penalize_isa_irq(int irq, int active) 865 { 866 if (active) 867 acpi_irq_penalty[irq] += PIRQ_PENALTY_ISA_USED; 868 else 869 acpi_irq_penalty[irq] += PIRQ_PENALTY_PCI_USING; 870 } 871 872 /* 873 * Over-ride default table to reserve additional IRQs for use by ISA 874 * e.g. acpi_irq_isa=5 875 * Useful for telling ACPI how not to interfere with your ISA sound card. 876 */ 877 static int __init acpi_irq_isa(char *str) 878 { 879 return acpi_irq_penalty_update(str, 1); 880 } 881 882 __setup("acpi_irq_isa=", acpi_irq_isa); 883 884 /* 885 * Over-ride default table to free additional IRQs for use by PCI 886 * e.g. acpi_irq_pci=7,15 887 * Used for acpi_irq_balance to free up IRQs to reduce PCI IRQ sharing. 888 */ 889 static int __init acpi_irq_pci(char *str) 890 { 891 return acpi_irq_penalty_update(str, 0); 892 } 893 894 __setup("acpi_irq_pci=", acpi_irq_pci); 895 896 static int __init acpi_irq_nobalance_set(char *str) 897 { 898 acpi_irq_balance = 0; 899 return 1; 900 } 901 902 __setup("acpi_irq_nobalance", acpi_irq_nobalance_set); 903 904 int __init acpi_irq_balance_set(char *str) 905 { 906 acpi_irq_balance = 1; 907 return 1; 908 } 909 910 __setup("acpi_irq_balance", acpi_irq_balance_set); 911 912 /* FIXME: we will remove this interface after all drivers call pci_disable_device */ 913 static struct sysdev_class irqrouter_sysdev_class = { 914 .name = "irqrouter", 915 .resume = irqrouter_resume, 916 }; 917 918 static struct sys_device device_irqrouter = { 919 .id = 0, 920 .cls = &irqrouter_sysdev_class, 921 }; 922 923 static int __init irqrouter_init_sysfs(void) 924 { 925 int error; 926 927 928 if (acpi_disabled || acpi_noirq) 929 return 0; 930 931 error = sysdev_class_register(&irqrouter_sysdev_class); 932 if (!error) 933 error = sysdev_register(&device_irqrouter); 934 935 return error; 936 } 937 938 device_initcall(irqrouter_init_sysfs); 939 940 static int __init acpi_pci_link_init(void) 941 { 942 943 if (acpi_noirq) 944 return 0; 945 946 acpi_link.count = 0; 947 INIT_LIST_HEAD(&acpi_link.entries); 948 949 if (acpi_bus_register_driver(&acpi_pci_link_driver) < 0) 950 return -ENODEV; 951 952 return 0; 953 } 954 955 subsys_initcall(acpi_pci_link_init); 956