1 /* 2 * ACPI PCI HotPlug glue functions to ACPI CA subsystem 3 * 4 * Copyright (C) 2002,2003 Takayoshi Kochi (t-kochi@bq.jp.nec.com) 5 * Copyright (C) 2002 Hiroshi Aono (h-aono@ap.jp.nec.com) 6 * Copyright (C) 2002,2003 NEC Corporation 7 * Copyright (C) 2003-2005 Matthew Wilcox (matthew.wilcox@hp.com) 8 * Copyright (C) 2003-2005 Hewlett Packard 9 * Copyright (C) 2005 Rajesh Shah (rajesh.shah@intel.com) 10 * Copyright (C) 2005 Intel Corporation 11 * 12 * All rights reserved. 13 * 14 * This program is free software; you can redistribute it and/or modify 15 * it under the terms of the GNU General Public License as published by 16 * the Free Software Foundation; either version 2 of the License, or (at 17 * your option) any later version. 18 * 19 * This program is distributed in the hope that it will be useful, but 20 * WITHOUT ANY WARRANTY; without even the implied warranty of 21 * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or 22 * NON INFRINGEMENT. See the GNU General Public License for more 23 * details. 24 * 25 * You should have received a copy of the GNU General Public License 26 * along with this program; if not, write to the Free Software 27 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 28 * 29 * Send feedback to <kristen.c.accardi@intel.com> 30 * 31 */ 32 33 /* 34 * Lifetime rules for pci_dev: 35 * - The one in acpiphp_bridge has its refcount elevated by pci_get_slot() 36 * when the bridge is scanned and it loses a refcount when the bridge 37 * is removed. 38 * - When a P2P bridge is present, we elevate the refcount on the subordinate 39 * bus. It loses the refcount when the the driver unloads. 40 */ 41 42 #include <linux/init.h> 43 #include <linux/module.h> 44 45 #include <linux/kernel.h> 46 #include <linux/pci.h> 47 #include <linux/pci_hotplug.h> 48 #include <linux/pci-acpi.h> 49 #include <linux/mutex.h> 50 #include <linux/slab.h> 51 #include <linux/acpi.h> 52 53 #include "../pci.h" 54 #include "acpiphp.h" 55 56 static LIST_HEAD(bridge_list); 57 58 #define MY_NAME "acpiphp_glue" 59 60 static void handle_hotplug_event_bridge (acpi_handle, u32, void *); 61 static void acpiphp_sanitize_bus(struct pci_bus *bus); 62 static void acpiphp_set_hpp_values(struct pci_bus *bus); 63 static void handle_hotplug_event_func(acpi_handle handle, u32 type, void *context); 64 65 /* callback routine to check for the existence of a pci dock device */ 66 static acpi_status 67 is_pci_dock_device(acpi_handle handle, u32 lvl, void *context, void **rv) 68 { 69 int *count = (int *)context; 70 71 if (is_dock_device(handle)) { 72 (*count)++; 73 return AE_CTRL_TERMINATE; 74 } else { 75 return AE_OK; 76 } 77 } 78 79 /* 80 * the _DCK method can do funny things... and sometimes not 81 * hah-hah funny. 82 * 83 * TBD - figure out a way to only call fixups for 84 * systems that require them. 85 */ 86 static int post_dock_fixups(struct notifier_block *nb, unsigned long val, 87 void *v) 88 { 89 struct acpiphp_func *func = container_of(nb, struct acpiphp_func, nb); 90 struct pci_bus *bus = func->slot->bridge->pci_bus; 91 u32 buses; 92 93 if (!bus->self) 94 return NOTIFY_OK; 95 96 /* fixup bad _DCK function that rewrites 97 * secondary bridge on slot 98 */ 99 pci_read_config_dword(bus->self, 100 PCI_PRIMARY_BUS, 101 &buses); 102 103 if (((buses >> 8) & 0xff) != bus->busn_res.start) { 104 buses = (buses & 0xff000000) 105 | ((unsigned int)(bus->primary) << 0) 106 | ((unsigned int)(bus->busn_res.start) << 8) 107 | ((unsigned int)(bus->busn_res.end) << 16); 108 pci_write_config_dword(bus->self, PCI_PRIMARY_BUS, buses); 109 } 110 return NOTIFY_OK; 111 } 112 113 114 static const struct acpi_dock_ops acpiphp_dock_ops = { 115 .handler = handle_hotplug_event_func, 116 }; 117 118 /* callback routine to register each ACPI PCI slot object */ 119 static acpi_status 120 register_slot(acpi_handle handle, u32 lvl, void *context, void **rv) 121 { 122 struct acpiphp_bridge *bridge = (struct acpiphp_bridge *)context; 123 struct acpiphp_slot *slot; 124 struct acpiphp_func *newfunc; 125 acpi_handle tmp; 126 acpi_status status = AE_OK; 127 unsigned long long adr, sun; 128 int device, function, retval; 129 struct pci_bus *pbus = bridge->pci_bus; 130 struct pci_dev *pdev; 131 132 if (!acpi_pci_check_ejectable(pbus, handle) && !is_dock_device(handle)) 133 return AE_OK; 134 135 status = acpi_evaluate_integer(handle, "_ADR", NULL, &adr); 136 if (ACPI_FAILURE(status)) { 137 warn("can't evaluate _ADR (%#x)\n", status); 138 return AE_OK; 139 } 140 141 device = (adr >> 16) & 0xffff; 142 function = adr & 0xffff; 143 144 pdev = pbus->self; 145 if (pdev && pci_is_pcie(pdev)) { 146 tmp = acpi_find_root_bridge_handle(pdev); 147 if (tmp) { 148 struct acpi_pci_root *root = acpi_pci_find_root(tmp); 149 150 if (root && (root->osc_control_set & 151 OSC_PCI_EXPRESS_NATIVE_HP_CONTROL)) 152 return AE_OK; 153 } 154 } 155 156 newfunc = kzalloc(sizeof(struct acpiphp_func), GFP_KERNEL); 157 if (!newfunc) 158 return AE_NO_MEMORY; 159 160 INIT_LIST_HEAD(&newfunc->sibling); 161 newfunc->handle = handle; 162 newfunc->function = function; 163 164 if (ACPI_SUCCESS(acpi_get_handle(handle, "_EJ0", &tmp))) 165 newfunc->flags = FUNC_HAS_EJ0; 166 167 if (ACPI_SUCCESS(acpi_get_handle(handle, "_STA", &tmp))) 168 newfunc->flags |= FUNC_HAS_STA; 169 170 if (ACPI_SUCCESS(acpi_get_handle(handle, "_PS0", &tmp))) 171 newfunc->flags |= FUNC_HAS_PS0; 172 173 if (ACPI_SUCCESS(acpi_get_handle(handle, "_PS3", &tmp))) 174 newfunc->flags |= FUNC_HAS_PS3; 175 176 if (ACPI_SUCCESS(acpi_get_handle(handle, "_DCK", &tmp))) 177 newfunc->flags |= FUNC_HAS_DCK; 178 179 status = acpi_evaluate_integer(handle, "_SUN", NULL, &sun); 180 if (ACPI_FAILURE(status)) { 181 /* 182 * use the count of the number of slots we've found 183 * for the number of the slot 184 */ 185 sun = bridge->nr_slots+1; 186 } 187 188 /* search for objects that share the same slot */ 189 for (slot = bridge->slots; slot; slot = slot->next) 190 if (slot->device == device) { 191 if (slot->sun != sun) 192 warn("sibling found, but _SUN doesn't match!\n"); 193 break; 194 } 195 196 if (!slot) { 197 slot = kzalloc(sizeof(struct acpiphp_slot), GFP_KERNEL); 198 if (!slot) { 199 kfree(newfunc); 200 return AE_NO_MEMORY; 201 } 202 203 slot->bridge = bridge; 204 slot->device = device; 205 slot->sun = sun; 206 INIT_LIST_HEAD(&slot->funcs); 207 mutex_init(&slot->crit_sect); 208 209 slot->next = bridge->slots; 210 bridge->slots = slot; 211 212 bridge->nr_slots++; 213 214 dbg("found ACPI PCI Hotplug slot %llu at PCI %04x:%02x:%02x\n", 215 slot->sun, pci_domain_nr(pbus), pbus->number, device); 216 retval = acpiphp_register_hotplug_slot(slot); 217 if (retval) { 218 if (retval == -EBUSY) 219 warn("Slot %llu already registered by another " 220 "hotplug driver\n", slot->sun); 221 else 222 warn("acpiphp_register_hotplug_slot failed " 223 "(err code = 0x%x)\n", retval); 224 goto err_exit; 225 } 226 } 227 228 newfunc->slot = slot; 229 list_add_tail(&newfunc->sibling, &slot->funcs); 230 231 pdev = pci_get_slot(pbus, PCI_DEVFN(device, function)); 232 if (pdev) { 233 slot->flags |= (SLOT_ENABLED | SLOT_POWEREDON); 234 pci_dev_put(pdev); 235 } 236 237 if (is_dock_device(handle)) { 238 /* we don't want to call this device's _EJ0 239 * because we want the dock notify handler 240 * to call it after it calls _DCK 241 */ 242 newfunc->flags &= ~FUNC_HAS_EJ0; 243 if (register_hotplug_dock_device(handle, 244 &acpiphp_dock_ops, newfunc)) 245 dbg("failed to register dock device\n"); 246 247 /* we need to be notified when dock events happen 248 * outside of the hotplug operation, since we may 249 * need to do fixups before we can hotplug. 250 */ 251 newfunc->nb.notifier_call = post_dock_fixups; 252 if (register_dock_notifier(&newfunc->nb)) 253 dbg("failed to register a dock notifier"); 254 } 255 256 /* install notify handler */ 257 if (!(newfunc->flags & FUNC_HAS_DCK)) { 258 status = acpi_install_notify_handler(handle, 259 ACPI_SYSTEM_NOTIFY, 260 handle_hotplug_event_func, 261 newfunc); 262 263 if (ACPI_FAILURE(status)) 264 err("failed to register interrupt notify handler\n"); 265 } else 266 status = AE_OK; 267 268 return status; 269 270 err_exit: 271 bridge->nr_slots--; 272 bridge->slots = slot->next; 273 kfree(slot); 274 kfree(newfunc); 275 276 return AE_OK; 277 } 278 279 280 /* see if it's worth looking at this bridge */ 281 static int detect_ejectable_slots(acpi_handle handle) 282 { 283 int found = acpi_pci_detect_ejectable(handle); 284 if (!found) { 285 acpi_walk_namespace(ACPI_TYPE_DEVICE, handle, (u32)1, 286 is_pci_dock_device, NULL, (void *)&found, NULL); 287 } 288 return found; 289 } 290 291 /* initialize miscellaneous stuff for both root and PCI-to-PCI bridge */ 292 static void init_bridge_misc(struct acpiphp_bridge *bridge) 293 { 294 acpi_status status; 295 296 /* must be added to the list prior to calling register_slot */ 297 list_add(&bridge->list, &bridge_list); 298 299 /* register all slot objects under this bridge */ 300 status = acpi_walk_namespace(ACPI_TYPE_DEVICE, bridge->handle, (u32)1, 301 register_slot, NULL, bridge, NULL); 302 if (ACPI_FAILURE(status)) { 303 list_del(&bridge->list); 304 return; 305 } 306 307 /* install notify handler */ 308 if (bridge->type != BRIDGE_TYPE_HOST) { 309 if ((bridge->flags & BRIDGE_HAS_EJ0) && bridge->func) { 310 status = acpi_remove_notify_handler(bridge->func->handle, 311 ACPI_SYSTEM_NOTIFY, 312 handle_hotplug_event_func); 313 if (ACPI_FAILURE(status)) 314 err("failed to remove notify handler\n"); 315 } 316 status = acpi_install_notify_handler(bridge->handle, 317 ACPI_SYSTEM_NOTIFY, 318 handle_hotplug_event_bridge, 319 bridge); 320 321 if (ACPI_FAILURE(status)) { 322 err("failed to register interrupt notify handler\n"); 323 } 324 } 325 } 326 327 328 /* find acpiphp_func from acpiphp_bridge */ 329 static struct acpiphp_func *acpiphp_bridge_handle_to_function(acpi_handle handle) 330 { 331 struct acpiphp_bridge *bridge; 332 struct acpiphp_slot *slot; 333 struct acpiphp_func *func; 334 335 list_for_each_entry(bridge, &bridge_list, list) { 336 for (slot = bridge->slots; slot; slot = slot->next) { 337 list_for_each_entry(func, &slot->funcs, sibling) { 338 if (func->handle == handle) 339 return func; 340 } 341 } 342 } 343 344 return NULL; 345 } 346 347 348 static inline void config_p2p_bridge_flags(struct acpiphp_bridge *bridge) 349 { 350 acpi_handle dummy_handle; 351 352 if (ACPI_SUCCESS(acpi_get_handle(bridge->handle, 353 "_STA", &dummy_handle))) 354 bridge->flags |= BRIDGE_HAS_STA; 355 356 if (ACPI_SUCCESS(acpi_get_handle(bridge->handle, 357 "_EJ0", &dummy_handle))) 358 bridge->flags |= BRIDGE_HAS_EJ0; 359 360 if (ACPI_SUCCESS(acpi_get_handle(bridge->handle, 361 "_PS0", &dummy_handle))) 362 bridge->flags |= BRIDGE_HAS_PS0; 363 364 if (ACPI_SUCCESS(acpi_get_handle(bridge->handle, 365 "_PS3", &dummy_handle))) 366 bridge->flags |= BRIDGE_HAS_PS3; 367 368 /* is this ejectable p2p bridge? */ 369 if (bridge->flags & BRIDGE_HAS_EJ0) { 370 struct acpiphp_func *func; 371 372 dbg("found ejectable p2p bridge\n"); 373 374 /* make link between PCI bridge and PCI function */ 375 func = acpiphp_bridge_handle_to_function(bridge->handle); 376 if (!func) 377 return; 378 bridge->func = func; 379 func->bridge = bridge; 380 } 381 } 382 383 384 /* allocate and initialize host bridge data structure */ 385 static void add_host_bridge(struct acpi_pci_root *root) 386 { 387 struct acpiphp_bridge *bridge; 388 acpi_handle handle = root->device->handle; 389 390 bridge = kzalloc(sizeof(struct acpiphp_bridge), GFP_KERNEL); 391 if (bridge == NULL) 392 return; 393 394 bridge->type = BRIDGE_TYPE_HOST; 395 bridge->handle = handle; 396 397 bridge->pci_bus = root->bus; 398 399 init_bridge_misc(bridge); 400 } 401 402 403 /* allocate and initialize PCI-to-PCI bridge data structure */ 404 static void add_p2p_bridge(acpi_handle *handle) 405 { 406 struct acpiphp_bridge *bridge; 407 408 bridge = kzalloc(sizeof(struct acpiphp_bridge), GFP_KERNEL); 409 if (bridge == NULL) { 410 err("out of memory\n"); 411 return; 412 } 413 414 bridge->type = BRIDGE_TYPE_P2P; 415 bridge->handle = handle; 416 config_p2p_bridge_flags(bridge); 417 418 bridge->pci_dev = acpi_get_pci_dev(handle); 419 bridge->pci_bus = bridge->pci_dev->subordinate; 420 if (!bridge->pci_bus) { 421 err("This is not a PCI-to-PCI bridge!\n"); 422 goto err; 423 } 424 425 /* 426 * Grab a ref to the subordinate PCI bus in case the bus is 427 * removed via PCI core logical hotplug. The ref pins the bus 428 * (which we access during module unload). 429 */ 430 get_device(&bridge->pci_bus->dev); 431 432 init_bridge_misc(bridge); 433 return; 434 err: 435 pci_dev_put(bridge->pci_dev); 436 kfree(bridge); 437 return; 438 } 439 440 441 /* callback routine to find P2P bridges */ 442 static acpi_status 443 find_p2p_bridge(acpi_handle handle, u32 lvl, void *context, void **rv) 444 { 445 acpi_status status; 446 struct pci_dev *dev; 447 448 dev = acpi_get_pci_dev(handle); 449 if (!dev || !dev->subordinate) 450 goto out; 451 452 /* check if this bridge has ejectable slots */ 453 if ((detect_ejectable_slots(handle) > 0)) { 454 dbg("found PCI-to-PCI bridge at PCI %s\n", pci_name(dev)); 455 add_p2p_bridge(handle); 456 } 457 458 /* search P2P bridges under this p2p bridge */ 459 status = acpi_walk_namespace(ACPI_TYPE_DEVICE, handle, (u32)1, 460 find_p2p_bridge, NULL, NULL, NULL); 461 if (ACPI_FAILURE(status)) 462 warn("find_p2p_bridge failed (error code = 0x%x)\n", status); 463 464 out: 465 pci_dev_put(dev); 466 return AE_OK; 467 } 468 469 470 /* find hot-pluggable slots, and then find P2P bridge */ 471 static int add_bridge(struct acpi_pci_root *root) 472 { 473 acpi_status status; 474 unsigned long long tmp; 475 acpi_handle dummy_handle; 476 acpi_handle handle = root->device->handle; 477 478 /* if the bridge doesn't have _STA, we assume it is always there */ 479 status = acpi_get_handle(handle, "_STA", &dummy_handle); 480 if (ACPI_SUCCESS(status)) { 481 status = acpi_evaluate_integer(handle, "_STA", NULL, &tmp); 482 if (ACPI_FAILURE(status)) { 483 dbg("%s: _STA evaluation failure\n", __func__); 484 return 0; 485 } 486 if ((tmp & ACPI_STA_FUNCTIONING) == 0) 487 /* don't register this object */ 488 return 0; 489 } 490 491 /* check if this bridge has ejectable slots */ 492 if (detect_ejectable_slots(handle) > 0) { 493 dbg("found PCI host-bus bridge with hot-pluggable slots\n"); 494 add_host_bridge(root); 495 } 496 497 /* search P2P bridges under this host bridge */ 498 status = acpi_walk_namespace(ACPI_TYPE_DEVICE, handle, (u32)1, 499 find_p2p_bridge, NULL, NULL, NULL); 500 501 if (ACPI_FAILURE(status)) 502 warn("find_p2p_bridge failed (error code = 0x%x)\n", status); 503 504 return 0; 505 } 506 507 static struct acpiphp_bridge *acpiphp_handle_to_bridge(acpi_handle handle) 508 { 509 struct acpiphp_bridge *bridge; 510 511 list_for_each_entry(bridge, &bridge_list, list) 512 if (bridge->handle == handle) 513 return bridge; 514 515 return NULL; 516 } 517 518 static void cleanup_bridge(struct acpiphp_bridge *bridge) 519 { 520 struct acpiphp_slot *slot, *next; 521 struct acpiphp_func *func, *tmp; 522 acpi_status status; 523 acpi_handle handle = bridge->handle; 524 525 status = acpi_remove_notify_handler(handle, ACPI_SYSTEM_NOTIFY, 526 handle_hotplug_event_bridge); 527 if (ACPI_FAILURE(status)) 528 err("failed to remove notify handler\n"); 529 530 if ((bridge->type != BRIDGE_TYPE_HOST) && 531 ((bridge->flags & BRIDGE_HAS_EJ0) && bridge->func)) { 532 status = acpi_install_notify_handler(bridge->func->handle, 533 ACPI_SYSTEM_NOTIFY, 534 handle_hotplug_event_func, 535 bridge->func); 536 if (ACPI_FAILURE(status)) 537 err("failed to install interrupt notify handler\n"); 538 } 539 540 slot = bridge->slots; 541 while (slot) { 542 next = slot->next; 543 list_for_each_entry_safe(func, tmp, &slot->funcs, sibling) { 544 if (is_dock_device(func->handle)) { 545 unregister_hotplug_dock_device(func->handle); 546 unregister_dock_notifier(&func->nb); 547 } 548 if (!(func->flags & FUNC_HAS_DCK)) { 549 status = acpi_remove_notify_handler(func->handle, 550 ACPI_SYSTEM_NOTIFY, 551 handle_hotplug_event_func); 552 if (ACPI_FAILURE(status)) 553 err("failed to remove notify handler\n"); 554 } 555 list_del(&func->sibling); 556 kfree(func); 557 } 558 acpiphp_unregister_hotplug_slot(slot); 559 list_del(&slot->funcs); 560 kfree(slot); 561 slot = next; 562 } 563 564 /* 565 * Only P2P bridges have a pci_dev 566 */ 567 if (bridge->pci_dev) 568 put_device(&bridge->pci_bus->dev); 569 570 pci_dev_put(bridge->pci_dev); 571 list_del(&bridge->list); 572 kfree(bridge); 573 } 574 575 static acpi_status 576 cleanup_p2p_bridge(acpi_handle handle, u32 lvl, void *context, void **rv) 577 { 578 struct acpiphp_bridge *bridge; 579 580 /* cleanup p2p bridges under this P2P bridge 581 in a depth-first manner */ 582 acpi_walk_namespace(ACPI_TYPE_DEVICE, handle, (u32)1, 583 cleanup_p2p_bridge, NULL, NULL, NULL); 584 585 bridge = acpiphp_handle_to_bridge(handle); 586 if (bridge) 587 cleanup_bridge(bridge); 588 589 return AE_OK; 590 } 591 592 static void remove_bridge(struct acpi_pci_root *root) 593 { 594 struct acpiphp_bridge *bridge; 595 acpi_handle handle = root->device->handle; 596 597 /* cleanup p2p bridges under this host bridge 598 in a depth-first manner */ 599 acpi_walk_namespace(ACPI_TYPE_DEVICE, handle, 600 (u32)1, cleanup_p2p_bridge, NULL, NULL, NULL); 601 602 /* 603 * On root bridges with hotplug slots directly underneath (ie, 604 * no p2p bridge between), we call cleanup_bridge(). 605 * 606 * The else clause cleans up root bridges that either had no 607 * hotplug slots at all, or had a p2p bridge underneath. 608 */ 609 bridge = acpiphp_handle_to_bridge(handle); 610 if (bridge) 611 cleanup_bridge(bridge); 612 else 613 acpi_remove_notify_handler(handle, ACPI_SYSTEM_NOTIFY, 614 handle_hotplug_event_bridge); 615 } 616 617 static int power_on_slot(struct acpiphp_slot *slot) 618 { 619 acpi_status status; 620 struct acpiphp_func *func; 621 int retval = 0; 622 623 /* if already enabled, just skip */ 624 if (slot->flags & SLOT_POWEREDON) 625 goto err_exit; 626 627 list_for_each_entry(func, &slot->funcs, sibling) { 628 if (func->flags & FUNC_HAS_PS0) { 629 dbg("%s: executing _PS0\n", __func__); 630 status = acpi_evaluate_object(func->handle, "_PS0", NULL, NULL); 631 if (ACPI_FAILURE(status)) { 632 warn("%s: _PS0 failed\n", __func__); 633 retval = -1; 634 goto err_exit; 635 } else 636 break; 637 } 638 } 639 640 /* TBD: evaluate _STA to check if the slot is enabled */ 641 642 slot->flags |= SLOT_POWEREDON; 643 644 err_exit: 645 return retval; 646 } 647 648 649 static int power_off_slot(struct acpiphp_slot *slot) 650 { 651 acpi_status status; 652 struct acpiphp_func *func; 653 654 int retval = 0; 655 656 /* if already disabled, just skip */ 657 if ((slot->flags & SLOT_POWEREDON) == 0) 658 goto err_exit; 659 660 list_for_each_entry(func, &slot->funcs, sibling) { 661 if (func->flags & FUNC_HAS_PS3) { 662 status = acpi_evaluate_object(func->handle, "_PS3", NULL, NULL); 663 if (ACPI_FAILURE(status)) { 664 warn("%s: _PS3 failed\n", __func__); 665 retval = -1; 666 goto err_exit; 667 } else 668 break; 669 } 670 } 671 672 /* TBD: evaluate _STA to check if the slot is disabled */ 673 674 slot->flags &= (~SLOT_POWEREDON); 675 676 err_exit: 677 return retval; 678 } 679 680 681 682 /** 683 * acpiphp_max_busnr - return the highest reserved bus number under the given bus. 684 * @bus: bus to start search with 685 */ 686 static unsigned char acpiphp_max_busnr(struct pci_bus *bus) 687 { 688 struct list_head *tmp; 689 unsigned char max, n; 690 691 /* 692 * pci_bus_max_busnr will return the highest 693 * reserved busnr for all these children. 694 * that is equivalent to the bus->subordinate 695 * value. We don't want to use the parent's 696 * bus->subordinate value because it could have 697 * padding in it. 698 */ 699 max = bus->busn_res.start; 700 701 list_for_each(tmp, &bus->children) { 702 n = pci_bus_max_busnr(pci_bus_b(tmp)); 703 if (n > max) 704 max = n; 705 } 706 return max; 707 } 708 709 710 /** 711 * acpiphp_bus_add - add a new bus to acpi subsystem 712 * @func: acpiphp_func of the bridge 713 */ 714 static int acpiphp_bus_add(struct acpiphp_func *func) 715 { 716 acpi_handle phandle; 717 struct acpi_device *device, *pdevice; 718 int ret_val; 719 720 acpi_get_parent(func->handle, &phandle); 721 if (acpi_bus_get_device(phandle, &pdevice)) { 722 dbg("no parent device, assuming NULL\n"); 723 pdevice = NULL; 724 } 725 if (!acpi_bus_get_device(func->handle, &device)) { 726 dbg("bus exists... trim\n"); 727 /* this shouldn't be in here, so remove 728 * the bus then re-add it... 729 */ 730 ret_val = acpi_bus_trim(device, 1); 731 dbg("acpi_bus_trim return %x\n", ret_val); 732 } 733 734 ret_val = acpi_bus_add(&device, pdevice, func->handle, 735 ACPI_BUS_TYPE_DEVICE); 736 if (ret_val) { 737 dbg("error adding bus, %x\n", 738 -ret_val); 739 goto acpiphp_bus_add_out; 740 } 741 ret_val = acpi_bus_start(device); 742 743 acpiphp_bus_add_out: 744 return ret_val; 745 } 746 747 748 /** 749 * acpiphp_bus_trim - trim a bus from acpi subsystem 750 * @handle: handle to acpi namespace 751 */ 752 static int acpiphp_bus_trim(acpi_handle handle) 753 { 754 struct acpi_device *device; 755 int retval; 756 757 retval = acpi_bus_get_device(handle, &device); 758 if (retval) { 759 dbg("acpi_device not found\n"); 760 return retval; 761 } 762 763 retval = acpi_bus_trim(device, 1); 764 if (retval) 765 err("cannot remove from acpi list\n"); 766 767 return retval; 768 } 769 770 static void acpiphp_set_acpi_region(struct acpiphp_slot *slot) 771 { 772 struct acpiphp_func *func; 773 union acpi_object params[2]; 774 struct acpi_object_list arg_list; 775 776 list_for_each_entry(func, &slot->funcs, sibling) { 777 arg_list.count = 2; 778 arg_list.pointer = params; 779 params[0].type = ACPI_TYPE_INTEGER; 780 params[0].integer.value = ACPI_ADR_SPACE_PCI_CONFIG; 781 params[1].type = ACPI_TYPE_INTEGER; 782 params[1].integer.value = 1; 783 /* _REG is optional, we don't care about if there is failure */ 784 acpi_evaluate_object(func->handle, "_REG", &arg_list, NULL); 785 } 786 } 787 788 /** 789 * enable_device - enable, configure a slot 790 * @slot: slot to be enabled 791 * 792 * This function should be called per *physical slot*, 793 * not per each slot object in ACPI namespace. 794 */ 795 static int __ref enable_device(struct acpiphp_slot *slot) 796 { 797 struct pci_dev *dev; 798 struct pci_bus *bus = slot->bridge->pci_bus; 799 struct acpiphp_func *func; 800 int retval = 0; 801 int num, max, pass; 802 acpi_status status; 803 804 if (slot->flags & SLOT_ENABLED) 805 goto err_exit; 806 807 num = pci_scan_slot(bus, PCI_DEVFN(slot->device, 0)); 808 if (num == 0) { 809 /* Maybe only part of funcs are added. */ 810 dbg("No new device found\n"); 811 goto err_exit; 812 } 813 814 max = acpiphp_max_busnr(bus); 815 for (pass = 0; pass < 2; pass++) { 816 list_for_each_entry(dev, &bus->devices, bus_list) { 817 if (PCI_SLOT(dev->devfn) != slot->device) 818 continue; 819 if (dev->hdr_type == PCI_HEADER_TYPE_BRIDGE || 820 dev->hdr_type == PCI_HEADER_TYPE_CARDBUS) { 821 max = pci_scan_bridge(bus, dev, max, pass); 822 if (pass && dev->subordinate) 823 pci_bus_size_bridges(dev->subordinate); 824 } 825 } 826 } 827 828 list_for_each_entry(func, &slot->funcs, sibling) 829 acpiphp_bus_add(func); 830 831 pci_bus_assign_resources(bus); 832 acpiphp_sanitize_bus(bus); 833 acpiphp_set_hpp_values(bus); 834 acpiphp_set_acpi_region(slot); 835 pci_enable_bridges(bus); 836 837 list_for_each_entry(dev, &bus->devices, bus_list) { 838 /* Assume that newly added devices are powered on already. */ 839 if (!dev->is_added) 840 dev->current_state = PCI_D0; 841 } 842 843 pci_bus_add_devices(bus); 844 845 slot->flags |= SLOT_ENABLED; 846 list_for_each_entry(func, &slot->funcs, sibling) { 847 dev = pci_get_slot(bus, PCI_DEVFN(slot->device, 848 func->function)); 849 if (!dev) { 850 /* Do not set SLOT_ENABLED flag if some funcs 851 are not added. */ 852 slot->flags &= (~SLOT_ENABLED); 853 continue; 854 } 855 856 if (dev->hdr_type != PCI_HEADER_TYPE_BRIDGE && 857 dev->hdr_type != PCI_HEADER_TYPE_CARDBUS) { 858 pci_dev_put(dev); 859 continue; 860 } 861 862 status = find_p2p_bridge(func->handle, (u32)1, bus, NULL); 863 if (ACPI_FAILURE(status)) 864 warn("find_p2p_bridge failed (error code = 0x%x)\n", 865 status); 866 pci_dev_put(dev); 867 } 868 869 870 err_exit: 871 return retval; 872 } 873 874 /* return first device in slot, acquiring a reference on it */ 875 static struct pci_dev *dev_in_slot(struct acpiphp_slot *slot) 876 { 877 struct pci_bus *bus = slot->bridge->pci_bus; 878 struct pci_dev *dev; 879 struct pci_dev *ret = NULL; 880 881 down_read(&pci_bus_sem); 882 list_for_each_entry(dev, &bus->devices, bus_list) 883 if (PCI_SLOT(dev->devfn) == slot->device) { 884 ret = pci_dev_get(dev); 885 break; 886 } 887 up_read(&pci_bus_sem); 888 889 return ret; 890 } 891 892 /** 893 * disable_device - disable a slot 894 * @slot: ACPI PHP slot 895 */ 896 static int disable_device(struct acpiphp_slot *slot) 897 { 898 struct acpiphp_func *func; 899 struct pci_dev *pdev; 900 struct pci_bus *bus = slot->bridge->pci_bus; 901 902 /* The slot will be enabled when func 0 is added, so check 903 func 0 before disable the slot. */ 904 pdev = pci_get_slot(bus, PCI_DEVFN(slot->device, 0)); 905 if (!pdev) 906 goto err_exit; 907 pci_dev_put(pdev); 908 909 list_for_each_entry(func, &slot->funcs, sibling) { 910 if (func->bridge) { 911 /* cleanup p2p bridges under this P2P bridge */ 912 cleanup_p2p_bridge(func->bridge->handle, 913 (u32)1, NULL, NULL); 914 func->bridge = NULL; 915 } 916 } 917 918 /* 919 * enable_device() enumerates all functions in this device via 920 * pci_scan_slot(), whether they have associated ACPI hotplug 921 * methods (_EJ0, etc.) or not. Therefore, we remove all functions 922 * here. 923 */ 924 while ((pdev = dev_in_slot(slot))) { 925 pci_stop_and_remove_bus_device(pdev); 926 pci_dev_put(pdev); 927 } 928 929 list_for_each_entry(func, &slot->funcs, sibling) { 930 acpiphp_bus_trim(func->handle); 931 } 932 933 slot->flags &= (~SLOT_ENABLED); 934 935 err_exit: 936 return 0; 937 } 938 939 940 /** 941 * get_slot_status - get ACPI slot status 942 * @slot: ACPI PHP slot 943 * 944 * If a slot has _STA for each function and if any one of them 945 * returned non-zero status, return it. 946 * 947 * If a slot doesn't have _STA and if any one of its functions' 948 * configuration space is configured, return 0x0f as a _STA. 949 * 950 * Otherwise return 0. 951 */ 952 static unsigned int get_slot_status(struct acpiphp_slot *slot) 953 { 954 acpi_status status; 955 unsigned long long sta = 0; 956 u32 dvid; 957 struct acpiphp_func *func; 958 959 list_for_each_entry(func, &slot->funcs, sibling) { 960 if (func->flags & FUNC_HAS_STA) { 961 status = acpi_evaluate_integer(func->handle, "_STA", NULL, &sta); 962 if (ACPI_SUCCESS(status) && sta) 963 break; 964 } else { 965 pci_bus_read_config_dword(slot->bridge->pci_bus, 966 PCI_DEVFN(slot->device, 967 func->function), 968 PCI_VENDOR_ID, &dvid); 969 if (dvid != 0xffffffff) { 970 sta = ACPI_STA_ALL; 971 break; 972 } 973 } 974 } 975 976 return (unsigned int)sta; 977 } 978 979 /** 980 * acpiphp_eject_slot - physically eject the slot 981 * @slot: ACPI PHP slot 982 */ 983 int acpiphp_eject_slot(struct acpiphp_slot *slot) 984 { 985 acpi_status status; 986 struct acpiphp_func *func; 987 struct acpi_object_list arg_list; 988 union acpi_object arg; 989 990 list_for_each_entry(func, &slot->funcs, sibling) { 991 /* We don't want to call _EJ0 on non-existing functions. */ 992 if ((func->flags & FUNC_HAS_EJ0)) { 993 /* _EJ0 method take one argument */ 994 arg_list.count = 1; 995 arg_list.pointer = &arg; 996 arg.type = ACPI_TYPE_INTEGER; 997 arg.integer.value = 1; 998 999 status = acpi_evaluate_object(func->handle, "_EJ0", &arg_list, NULL); 1000 if (ACPI_FAILURE(status)) { 1001 warn("%s: _EJ0 failed\n", __func__); 1002 return -1; 1003 } else 1004 break; 1005 } 1006 } 1007 return 0; 1008 } 1009 1010 /** 1011 * acpiphp_check_bridge - re-enumerate devices 1012 * @bridge: where to begin re-enumeration 1013 * 1014 * Iterate over all slots under this bridge and make sure that if a 1015 * card is present they are enabled, and if not they are disabled. 1016 */ 1017 static int acpiphp_check_bridge(struct acpiphp_bridge *bridge) 1018 { 1019 struct acpiphp_slot *slot; 1020 int retval = 0; 1021 int enabled, disabled; 1022 1023 enabled = disabled = 0; 1024 1025 for (slot = bridge->slots; slot; slot = slot->next) { 1026 unsigned int status = get_slot_status(slot); 1027 if (slot->flags & SLOT_ENABLED) { 1028 if (status == ACPI_STA_ALL) 1029 continue; 1030 retval = acpiphp_disable_slot(slot); 1031 if (retval) { 1032 err("Error occurred in disabling\n"); 1033 goto err_exit; 1034 } else { 1035 acpiphp_eject_slot(slot); 1036 } 1037 disabled++; 1038 } else { 1039 if (status != ACPI_STA_ALL) 1040 continue; 1041 retval = acpiphp_enable_slot(slot); 1042 if (retval) { 1043 err("Error occurred in enabling\n"); 1044 goto err_exit; 1045 } 1046 enabled++; 1047 } 1048 } 1049 1050 dbg("%s: %d enabled, %d disabled\n", __func__, enabled, disabled); 1051 1052 err_exit: 1053 return retval; 1054 } 1055 1056 static void acpiphp_set_hpp_values(struct pci_bus *bus) 1057 { 1058 struct pci_dev *dev; 1059 1060 list_for_each_entry(dev, &bus->devices, bus_list) 1061 pci_configure_slot(dev); 1062 } 1063 1064 /* 1065 * Remove devices for which we could not assign resources, call 1066 * arch specific code to fix-up the bus 1067 */ 1068 static void acpiphp_sanitize_bus(struct pci_bus *bus) 1069 { 1070 struct pci_dev *dev; 1071 int i; 1072 unsigned long type_mask = IORESOURCE_IO | IORESOURCE_MEM; 1073 1074 list_for_each_entry(dev, &bus->devices, bus_list) { 1075 for (i=0; i<PCI_BRIDGE_RESOURCES; i++) { 1076 struct resource *res = &dev->resource[i]; 1077 if ((res->flags & type_mask) && !res->start && 1078 res->end) { 1079 /* Could not assign a required resources 1080 * for this device, remove it */ 1081 pci_stop_and_remove_bus_device(dev); 1082 break; 1083 } 1084 } 1085 } 1086 } 1087 1088 /* Program resources in newly inserted bridge */ 1089 static int acpiphp_configure_bridge (acpi_handle handle) 1090 { 1091 struct pci_bus *bus; 1092 1093 if (acpi_is_root_bridge(handle)) { 1094 struct acpi_pci_root *root = acpi_pci_find_root(handle); 1095 bus = root->bus; 1096 } else { 1097 struct pci_dev *pdev = acpi_get_pci_dev(handle); 1098 bus = pdev->subordinate; 1099 pci_dev_put(pdev); 1100 } 1101 1102 pci_bus_size_bridges(bus); 1103 pci_bus_assign_resources(bus); 1104 acpiphp_sanitize_bus(bus); 1105 acpiphp_set_hpp_values(bus); 1106 pci_enable_bridges(bus); 1107 return 0; 1108 } 1109 1110 static void handle_bridge_insertion(acpi_handle handle, u32 type) 1111 { 1112 struct acpi_device *device, *pdevice; 1113 acpi_handle phandle; 1114 1115 if ((type != ACPI_NOTIFY_BUS_CHECK) && 1116 (type != ACPI_NOTIFY_DEVICE_CHECK)) { 1117 err("unexpected notification type %d\n", type); 1118 return; 1119 } 1120 1121 acpi_get_parent(handle, &phandle); 1122 if (acpi_bus_get_device(phandle, &pdevice)) { 1123 dbg("no parent device, assuming NULL\n"); 1124 pdevice = NULL; 1125 } 1126 if (acpi_bus_add(&device, pdevice, handle, ACPI_BUS_TYPE_DEVICE)) { 1127 err("cannot add bridge to acpi list\n"); 1128 return; 1129 } 1130 if (!acpiphp_configure_bridge(handle) && 1131 !acpi_bus_start(device)) 1132 add_bridge(handle); 1133 else 1134 err("cannot configure and start bridge\n"); 1135 1136 } 1137 1138 /* 1139 * ACPI event handlers 1140 */ 1141 1142 static acpi_status 1143 count_sub_bridges(acpi_handle handle, u32 lvl, void *context, void **rv) 1144 { 1145 int *count = (int *)context; 1146 struct acpiphp_bridge *bridge; 1147 1148 bridge = acpiphp_handle_to_bridge(handle); 1149 if (bridge) 1150 (*count)++; 1151 return AE_OK ; 1152 } 1153 1154 static acpi_status 1155 check_sub_bridges(acpi_handle handle, u32 lvl, void *context, void **rv) 1156 { 1157 struct acpiphp_bridge *bridge; 1158 char objname[64]; 1159 struct acpi_buffer buffer = { .length = sizeof(objname), 1160 .pointer = objname }; 1161 1162 bridge = acpiphp_handle_to_bridge(handle); 1163 if (bridge) { 1164 acpi_get_name(handle, ACPI_FULL_PATHNAME, &buffer); 1165 dbg("%s: re-enumerating slots under %s\n", 1166 __func__, objname); 1167 acpiphp_check_bridge(bridge); 1168 } 1169 return AE_OK ; 1170 } 1171 1172 struct acpiphp_hp_work { 1173 struct work_struct work; 1174 acpi_handle handle; 1175 u32 type; 1176 void *context; 1177 }; 1178 1179 static void alloc_acpiphp_hp_work(acpi_handle handle, u32 type, 1180 void *context, 1181 void (*func)(struct work_struct *work)) 1182 { 1183 struct acpiphp_hp_work *hp_work; 1184 int ret; 1185 1186 hp_work = kmalloc(sizeof(*hp_work), GFP_KERNEL); 1187 if (!hp_work) 1188 return; 1189 1190 hp_work->handle = handle; 1191 hp_work->type = type; 1192 hp_work->context = context; 1193 1194 INIT_WORK(&hp_work->work, func); 1195 ret = queue_work(kacpi_hotplug_wq, &hp_work->work); 1196 if (!ret) 1197 kfree(hp_work); 1198 } 1199 1200 static void _handle_hotplug_event_bridge(struct work_struct *work) 1201 { 1202 struct acpiphp_bridge *bridge; 1203 char objname[64]; 1204 struct acpi_buffer buffer = { .length = sizeof(objname), 1205 .pointer = objname }; 1206 struct acpi_device *device; 1207 int num_sub_bridges = 0; 1208 struct acpiphp_hp_work *hp_work; 1209 acpi_handle handle; 1210 u32 type; 1211 1212 hp_work = container_of(work, struct acpiphp_hp_work, work); 1213 handle = hp_work->handle; 1214 type = hp_work->type; 1215 1216 if (acpi_bus_get_device(handle, &device)) { 1217 /* This bridge must have just been physically inserted */ 1218 handle_bridge_insertion(handle, type); 1219 goto out; 1220 } 1221 1222 bridge = acpiphp_handle_to_bridge(handle); 1223 if (type == ACPI_NOTIFY_BUS_CHECK) { 1224 acpi_walk_namespace(ACPI_TYPE_DEVICE, handle, ACPI_UINT32_MAX, 1225 count_sub_bridges, NULL, &num_sub_bridges, NULL); 1226 } 1227 1228 if (!bridge && !num_sub_bridges) { 1229 err("cannot get bridge info\n"); 1230 goto out; 1231 } 1232 1233 acpi_get_name(handle, ACPI_FULL_PATHNAME, &buffer); 1234 1235 switch (type) { 1236 case ACPI_NOTIFY_BUS_CHECK: 1237 /* bus re-enumerate */ 1238 dbg("%s: Bus check notify on %s\n", __func__, objname); 1239 if (bridge) { 1240 dbg("%s: re-enumerating slots under %s\n", 1241 __func__, objname); 1242 acpiphp_check_bridge(bridge); 1243 } 1244 if (num_sub_bridges) 1245 acpi_walk_namespace(ACPI_TYPE_DEVICE, handle, 1246 ACPI_UINT32_MAX, check_sub_bridges, NULL, NULL, NULL); 1247 break; 1248 1249 case ACPI_NOTIFY_DEVICE_CHECK: 1250 /* device check */ 1251 dbg("%s: Device check notify on %s\n", __func__, objname); 1252 acpiphp_check_bridge(bridge); 1253 break; 1254 1255 case ACPI_NOTIFY_DEVICE_WAKE: 1256 /* wake event */ 1257 dbg("%s: Device wake notify on %s\n", __func__, objname); 1258 break; 1259 1260 case ACPI_NOTIFY_EJECT_REQUEST: 1261 /* request device eject */ 1262 dbg("%s: Device eject notify on %s\n", __func__, objname); 1263 if ((bridge->type != BRIDGE_TYPE_HOST) && 1264 (bridge->flags & BRIDGE_HAS_EJ0)) { 1265 struct acpiphp_slot *slot; 1266 slot = bridge->func->slot; 1267 if (!acpiphp_disable_slot(slot)) 1268 acpiphp_eject_slot(slot); 1269 } 1270 break; 1271 1272 case ACPI_NOTIFY_FREQUENCY_MISMATCH: 1273 printk(KERN_ERR "Device %s cannot be configured due" 1274 " to a frequency mismatch\n", objname); 1275 break; 1276 1277 case ACPI_NOTIFY_BUS_MODE_MISMATCH: 1278 printk(KERN_ERR "Device %s cannot be configured due" 1279 " to a bus mode mismatch\n", objname); 1280 break; 1281 1282 case ACPI_NOTIFY_POWER_FAULT: 1283 printk(KERN_ERR "Device %s has suffered a power fault\n", 1284 objname); 1285 break; 1286 1287 default: 1288 warn("notify_handler: unknown event type 0x%x for %s\n", type, objname); 1289 break; 1290 } 1291 1292 out: 1293 kfree(hp_work); /* allocated in handle_hotplug_event_bridge */ 1294 } 1295 1296 /** 1297 * handle_hotplug_event_bridge - handle ACPI event on bridges 1298 * @handle: Notify()'ed acpi_handle 1299 * @type: Notify code 1300 * @context: pointer to acpiphp_bridge structure 1301 * 1302 * Handles ACPI event notification on {host,p2p} bridges. 1303 */ 1304 static void handle_hotplug_event_bridge(acpi_handle handle, u32 type, 1305 void *context) 1306 { 1307 /* 1308 * Currently the code adds all hotplug events to the kacpid_wq 1309 * queue when it should add hotplug events to the kacpi_hotplug_wq. 1310 * The proper way to fix this is to reorganize the code so that 1311 * drivers (dock, etc.) do not call acpi_os_execute(), etc. 1312 * For now just re-add this work to the kacpi_hotplug_wq so we 1313 * don't deadlock on hotplug actions. 1314 */ 1315 alloc_acpiphp_hp_work(handle, type, context, 1316 _handle_hotplug_event_bridge); 1317 } 1318 1319 static void _handle_hotplug_event_func(struct work_struct *work) 1320 { 1321 struct acpiphp_func *func; 1322 char objname[64]; 1323 struct acpi_buffer buffer = { .length = sizeof(objname), 1324 .pointer = objname }; 1325 struct acpiphp_hp_work *hp_work; 1326 acpi_handle handle; 1327 u32 type; 1328 void *context; 1329 1330 hp_work = container_of(work, struct acpiphp_hp_work, work); 1331 handle = hp_work->handle; 1332 type = hp_work->type; 1333 context = hp_work->context; 1334 1335 acpi_get_name(handle, ACPI_FULL_PATHNAME, &buffer); 1336 1337 func = (struct acpiphp_func *)context; 1338 1339 switch (type) { 1340 case ACPI_NOTIFY_BUS_CHECK: 1341 /* bus re-enumerate */ 1342 dbg("%s: Bus check notify on %s\n", __func__, objname); 1343 acpiphp_enable_slot(func->slot); 1344 break; 1345 1346 case ACPI_NOTIFY_DEVICE_CHECK: 1347 /* device check : re-enumerate from parent bus */ 1348 dbg("%s: Device check notify on %s\n", __func__, objname); 1349 acpiphp_check_bridge(func->slot->bridge); 1350 break; 1351 1352 case ACPI_NOTIFY_DEVICE_WAKE: 1353 /* wake event */ 1354 dbg("%s: Device wake notify on %s\n", __func__, objname); 1355 break; 1356 1357 case ACPI_NOTIFY_EJECT_REQUEST: 1358 /* request device eject */ 1359 dbg("%s: Device eject notify on %s\n", __func__, objname); 1360 if (!(acpiphp_disable_slot(func->slot))) 1361 acpiphp_eject_slot(func->slot); 1362 break; 1363 1364 default: 1365 warn("notify_handler: unknown event type 0x%x for %s\n", type, objname); 1366 break; 1367 } 1368 1369 kfree(hp_work); /* allocated in handle_hotplug_event_func */ 1370 } 1371 1372 /** 1373 * handle_hotplug_event_func - handle ACPI event on functions (i.e. slots) 1374 * @handle: Notify()'ed acpi_handle 1375 * @type: Notify code 1376 * @context: pointer to acpiphp_func structure 1377 * 1378 * Handles ACPI event notification on slots. 1379 */ 1380 static void handle_hotplug_event_func(acpi_handle handle, u32 type, 1381 void *context) 1382 { 1383 /* 1384 * Currently the code adds all hotplug events to the kacpid_wq 1385 * queue when it should add hotplug events to the kacpi_hotplug_wq. 1386 * The proper way to fix this is to reorganize the code so that 1387 * drivers (dock, etc.) do not call acpi_os_execute(), etc. 1388 * For now just re-add this work to the kacpi_hotplug_wq so we 1389 * don't deadlock on hotplug actions. 1390 */ 1391 alloc_acpiphp_hp_work(handle, type, context, 1392 _handle_hotplug_event_func); 1393 } 1394 1395 static acpi_status 1396 find_root_bridges(acpi_handle handle, u32 lvl, void *context, void **rv) 1397 { 1398 int *count = (int *)context; 1399 1400 if (!acpi_is_root_bridge(handle)) 1401 return AE_OK; 1402 1403 (*count)++; 1404 acpi_install_notify_handler(handle, ACPI_SYSTEM_NOTIFY, 1405 handle_hotplug_event_bridge, NULL); 1406 1407 return AE_OK ; 1408 } 1409 1410 static struct acpi_pci_driver acpi_pci_hp_driver = { 1411 .add = add_bridge, 1412 .remove = remove_bridge, 1413 }; 1414 1415 /** 1416 * acpiphp_glue_init - initializes all PCI hotplug - ACPI glue data structures 1417 */ 1418 int __init acpiphp_glue_init(void) 1419 { 1420 int num = 0; 1421 1422 acpi_walk_namespace(ACPI_TYPE_DEVICE, ACPI_ROOT_OBJECT, 1423 ACPI_UINT32_MAX, find_root_bridges, NULL, &num, NULL); 1424 1425 if (num <= 0) 1426 return -1; 1427 else 1428 acpi_pci_register_driver(&acpi_pci_hp_driver); 1429 1430 return 0; 1431 } 1432 1433 1434 /** 1435 * acpiphp_glue_exit - terminates all PCI hotplug - ACPI glue data structures 1436 * 1437 * This function frees all data allocated in acpiphp_glue_init(). 1438 */ 1439 void acpiphp_glue_exit(void) 1440 { 1441 acpi_pci_unregister_driver(&acpi_pci_hp_driver); 1442 } 1443 1444 1445 /** 1446 * acpiphp_get_num_slots - count number of slots in a system 1447 */ 1448 int __init acpiphp_get_num_slots(void) 1449 { 1450 struct acpiphp_bridge *bridge; 1451 int num_slots = 0; 1452 1453 list_for_each_entry(bridge, &bridge_list, list) { 1454 dbg("Bus %04x:%02x has %d slot%s\n", 1455 pci_domain_nr(bridge->pci_bus), 1456 bridge->pci_bus->number, bridge->nr_slots, 1457 bridge->nr_slots == 1 ? "" : "s"); 1458 num_slots += bridge->nr_slots; 1459 } 1460 1461 dbg("Total %d slots\n", num_slots); 1462 return num_slots; 1463 } 1464 1465 1466 /** 1467 * acpiphp_enable_slot - power on slot 1468 * @slot: ACPI PHP slot 1469 */ 1470 int acpiphp_enable_slot(struct acpiphp_slot *slot) 1471 { 1472 int retval; 1473 1474 mutex_lock(&slot->crit_sect); 1475 1476 /* wake up all functions */ 1477 retval = power_on_slot(slot); 1478 if (retval) 1479 goto err_exit; 1480 1481 if (get_slot_status(slot) == ACPI_STA_ALL) { 1482 /* configure all functions */ 1483 retval = enable_device(slot); 1484 if (retval) 1485 power_off_slot(slot); 1486 } else { 1487 dbg("%s: Slot status is not ACPI_STA_ALL\n", __func__); 1488 power_off_slot(slot); 1489 } 1490 1491 err_exit: 1492 mutex_unlock(&slot->crit_sect); 1493 return retval; 1494 } 1495 1496 /** 1497 * acpiphp_disable_slot - power off slot 1498 * @slot: ACPI PHP slot 1499 */ 1500 int acpiphp_disable_slot(struct acpiphp_slot *slot) 1501 { 1502 int retval = 0; 1503 1504 mutex_lock(&slot->crit_sect); 1505 1506 /* unconfigure all functions */ 1507 retval = disable_device(slot); 1508 if (retval) 1509 goto err_exit; 1510 1511 /* power off all functions */ 1512 retval = power_off_slot(slot); 1513 if (retval) 1514 goto err_exit; 1515 1516 err_exit: 1517 mutex_unlock(&slot->crit_sect); 1518 return retval; 1519 } 1520 1521 1522 /* 1523 * slot enabled: 1 1524 * slot disabled: 0 1525 */ 1526 u8 acpiphp_get_power_status(struct acpiphp_slot *slot) 1527 { 1528 return (slot->flags & SLOT_POWEREDON); 1529 } 1530 1531 1532 /* 1533 * latch open: 1 1534 * latch closed: 0 1535 */ 1536 u8 acpiphp_get_latch_status(struct acpiphp_slot *slot) 1537 { 1538 unsigned int sta; 1539 1540 sta = get_slot_status(slot); 1541 1542 return (sta & ACPI_STA_SHOW_IN_UI) ? 0 : 1; 1543 } 1544 1545 1546 /* 1547 * adapter presence : 1 1548 * absence : 0 1549 */ 1550 u8 acpiphp_get_adapter_status(struct acpiphp_slot *slot) 1551 { 1552 unsigned int sta; 1553 1554 sta = get_slot_status(slot); 1555 1556 return (sta == 0) ? 0 : 1; 1557 } 1558