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