]> git.karo-electronics.de Git - karo-tx-linux.git/blob - drivers/pci/hotplug/acpiphp_glue.c
ACPI / hotplug / PCI: Rework namespace scanning and trimming routines
[karo-tx-linux.git] / drivers / pci / hotplug / acpiphp_glue.c
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 static DEFINE_MUTEX(bridge_mutex);
58 static DEFINE_MUTEX(acpiphp_context_lock);
59
60 #define MY_NAME "acpiphp_glue"
61
62 static void handle_hotplug_event(acpi_handle handle, u32 type, void *data);
63 static void acpiphp_sanitize_bus(struct pci_bus *bus);
64 static void acpiphp_set_hpp_values(struct pci_bus *bus);
65 static void hotplug_event(acpi_handle handle, u32 type, void *data);
66 static void free_bridge(struct kref *kref);
67
68 static void acpiphp_context_handler(acpi_handle handle, void *context)
69 {
70         /* Intentionally empty. */
71 }
72
73 /**
74  * acpiphp_init_context - Create hotplug context and grab a reference to it.
75  * @handle: ACPI object handle to create the context for.
76  *
77  * Call under acpiphp_context_lock.
78  */
79 static struct acpiphp_context *acpiphp_init_context(acpi_handle handle)
80 {
81         struct acpiphp_context *context;
82         acpi_status status;
83
84         context = kzalloc(sizeof(*context), GFP_KERNEL);
85         if (!context)
86                 return NULL;
87
88         context->handle = handle;
89         context->refcount = 1;
90         status = acpi_attach_data(handle, acpiphp_context_handler, context);
91         if (ACPI_FAILURE(status)) {
92                 kfree(context);
93                 return NULL;
94         }
95         return context;
96 }
97
98 /**
99  * acpiphp_get_context - Get hotplug context and grab a reference to it.
100  * @handle: ACPI object handle to get the context for.
101  *
102  * Call under acpiphp_context_lock.
103  */
104 static struct acpiphp_context *acpiphp_get_context(acpi_handle handle)
105 {
106         struct acpiphp_context *context = NULL;
107         acpi_status status;
108         void *data;
109
110         status = acpi_get_data(handle, acpiphp_context_handler, &data);
111         if (ACPI_SUCCESS(status)) {
112                 context = data;
113                 context->refcount++;
114         }
115         return context;
116 }
117
118 /**
119  * acpiphp_put_context - Drop a reference to ACPI hotplug context.
120  * @handle: ACPI object handle to put the context for.
121  *
122  * The context object is removed if there are no more references to it.
123  *
124  * Call under acpiphp_context_lock.
125  */
126 static void acpiphp_put_context(struct acpiphp_context *context)
127 {
128         if (--context->refcount)
129                 return;
130
131         WARN_ON(context->bridge);
132         acpi_detach_data(context->handle, acpiphp_context_handler);
133         kfree(context);
134 }
135
136 static inline void get_bridge(struct acpiphp_bridge *bridge)
137 {
138         kref_get(&bridge->ref);
139 }
140
141 static inline void put_bridge(struct acpiphp_bridge *bridge)
142 {
143         kref_put(&bridge->ref, free_bridge);
144 }
145
146 static void free_bridge(struct kref *kref)
147 {
148         struct acpiphp_context *context;
149         struct acpiphp_bridge *bridge;
150         struct acpiphp_slot *slot, *next;
151         struct acpiphp_func *func, *tmp;
152
153         mutex_lock(&acpiphp_context_lock);
154
155         bridge = container_of(kref, struct acpiphp_bridge, ref);
156
157         list_for_each_entry_safe(slot, next, &bridge->slots, node) {
158                 list_for_each_entry_safe(func, tmp, &slot->funcs, sibling)
159                         acpiphp_put_context(func_to_context(func));
160
161                 kfree(slot);
162         }
163
164         context = bridge->context;
165         /* Root bridges will not have hotplug context. */
166         if (context) {
167                 /* Release the reference taken by acpiphp_enumerate_slots(). */
168                 put_bridge(context->func.parent);
169                 context->bridge = NULL;
170                 acpiphp_put_context(context);
171         }
172
173         put_device(&bridge->pci_bus->dev);
174         pci_dev_put(bridge->pci_dev);
175         kfree(bridge);
176
177         mutex_unlock(&acpiphp_context_lock);
178 }
179
180 /*
181  * the _DCK method can do funny things... and sometimes not
182  * hah-hah funny.
183  *
184  * TBD - figure out a way to only call fixups for
185  * systems that require them.
186  */
187 static void post_dock_fixups(acpi_handle not_used, u32 event, void *data)
188 {
189         struct acpiphp_context *context = data;
190         struct pci_bus *bus = context->func.slot->bus;
191         u32 buses;
192
193         if (!bus->self)
194                 return;
195
196         /* fixup bad _DCK function that rewrites
197          * secondary bridge on slot
198          */
199         pci_read_config_dword(bus->self,
200                         PCI_PRIMARY_BUS,
201                         &buses);
202
203         if (((buses >> 8) & 0xff) != bus->busn_res.start) {
204                 buses = (buses & 0xff000000)
205                         | ((unsigned int)(bus->primary)     <<  0)
206                         | ((unsigned int)(bus->busn_res.start)   <<  8)
207                         | ((unsigned int)(bus->busn_res.end) << 16);
208                 pci_write_config_dword(bus->self, PCI_PRIMARY_BUS, buses);
209         }
210 }
211
212
213 static const struct acpi_dock_ops acpiphp_dock_ops = {
214         .fixup = post_dock_fixups,
215         .handler = hotplug_event,
216 };
217
218 /* Check whether the PCI device is managed by native PCIe hotplug driver */
219 static bool device_is_managed_by_native_pciehp(struct pci_dev *pdev)
220 {
221         u32 reg32;
222         acpi_handle tmp;
223         struct acpi_pci_root *root;
224
225         /* Check whether the PCIe port supports native PCIe hotplug */
226         if (pcie_capability_read_dword(pdev, PCI_EXP_SLTCAP, &reg32))
227                 return false;
228         if (!(reg32 & PCI_EXP_SLTCAP_HPC))
229                 return false;
230
231         /*
232          * Check whether native PCIe hotplug has been enabled for
233          * this PCIe hierarchy.
234          */
235         tmp = acpi_find_root_bridge_handle(pdev);
236         if (!tmp)
237                 return false;
238         root = acpi_pci_find_root(tmp);
239         if (!root)
240                 return false;
241         if (!(root->osc_control_set & OSC_PCI_EXPRESS_NATIVE_HP_CONTROL))
242                 return false;
243
244         return true;
245 }
246
247 static void acpiphp_dock_init(void *data)
248 {
249         struct acpiphp_context *context = data;
250
251         get_bridge(context->func.parent);
252 }
253
254 static void acpiphp_dock_release(void *data)
255 {
256         struct acpiphp_context *context = data;
257
258         put_bridge(context->func.parent);
259 }
260
261 /* callback routine to register each ACPI PCI slot object */
262 static acpi_status register_slot(acpi_handle handle, u32 lvl, void *data,
263                                  void **rv)
264 {
265         struct acpiphp_bridge *bridge = data;
266         struct acpiphp_context *context;
267         struct acpiphp_slot *slot;
268         struct acpiphp_func *newfunc;
269         acpi_status status = AE_OK;
270         unsigned long long adr;
271         int device, function;
272         struct pci_bus *pbus = bridge->pci_bus;
273         struct pci_dev *pdev = bridge->pci_dev;
274         u32 val;
275
276         if (pdev && device_is_managed_by_native_pciehp(pdev))
277                 return AE_OK;
278
279         status = acpi_evaluate_integer(handle, "_ADR", NULL, &adr);
280         if (ACPI_FAILURE(status)) {
281                 acpi_handle_warn(handle, "can't evaluate _ADR (%#x)\n", status);
282                 return AE_OK;
283         }
284
285         device = (adr >> 16) & 0xffff;
286         function = adr & 0xffff;
287
288         mutex_lock(&acpiphp_context_lock);
289         context = acpiphp_init_context(handle);
290         if (!context) {
291                 mutex_unlock(&acpiphp_context_lock);
292                 acpi_handle_err(handle, "No hotplug context\n");
293                 return AE_NOT_EXIST;
294         }
295         newfunc = &context->func;
296         newfunc->function = function;
297         newfunc->parent = bridge;
298         mutex_unlock(&acpiphp_context_lock);
299
300         if (acpi_has_method(handle, "_EJ0"))
301                 newfunc->flags = FUNC_HAS_EJ0;
302
303         if (acpi_has_method(handle, "_STA"))
304                 newfunc->flags |= FUNC_HAS_STA;
305
306         if (acpi_has_method(handle, "_PS0"))
307                 newfunc->flags |= FUNC_HAS_PS0;
308
309         if (acpi_has_method(handle, "_PS3"))
310                 newfunc->flags |= FUNC_HAS_PS3;
311
312         if (acpi_has_method(handle, "_DCK"))
313                 newfunc->flags |= FUNC_HAS_DCK;
314
315         /* search for objects that share the same slot */
316         list_for_each_entry(slot, &bridge->slots, node)
317                 if (slot->device == device)
318                         goto slot_found;
319
320         slot = kzalloc(sizeof(struct acpiphp_slot), GFP_KERNEL);
321         if (!slot) {
322                 status = AE_NO_MEMORY;
323                 goto err;
324         }
325
326         slot->bus = bridge->pci_bus;
327         slot->device = device;
328         INIT_LIST_HEAD(&slot->funcs);
329         mutex_init(&slot->crit_sect);
330
331         mutex_lock(&bridge_mutex);
332         list_add_tail(&slot->node, &bridge->slots);
333         mutex_unlock(&bridge_mutex);
334
335         /* Register slots for ejectable funtions only. */
336         if (acpi_pci_check_ejectable(pbus, handle)  || is_dock_device(handle)) {
337                 unsigned long long sun;
338                 int retval;
339
340                 bridge->nr_slots++;
341                 status = acpi_evaluate_integer(handle, "_SUN", NULL, &sun);
342                 if (ACPI_FAILURE(status))
343                         sun = bridge->nr_slots;
344
345                 dbg("found ACPI PCI Hotplug slot %llu at PCI %04x:%02x:%02x\n",
346                     sun, pci_domain_nr(pbus), pbus->number, device);
347
348                 retval = acpiphp_register_hotplug_slot(slot, sun);
349                 if (retval) {
350                         bridge->nr_slots--;
351                         if (retval == -EBUSY)
352                                 warn("Slot %llu already registered by another "
353                                         "hotplug driver\n", sun);
354                         else
355                                 warn("acpiphp_register_hotplug_slot failed "
356                                         "(err code = 0x%x)\n", retval);
357                 }
358                 /* Even if the slot registration fails, we can still use it. */
359         }
360
361  slot_found:
362         newfunc->slot = slot;
363         mutex_lock(&bridge_mutex);
364         list_add_tail(&newfunc->sibling, &slot->funcs);
365         mutex_unlock(&bridge_mutex);
366
367         if (pci_bus_read_dev_vendor_id(pbus, PCI_DEVFN(device, function),
368                                        &val, 60*1000))
369                 slot->flags |= (SLOT_ENABLED | SLOT_POWEREDON);
370
371         if (is_dock_device(handle)) {
372                 /* we don't want to call this device's _EJ0
373                  * because we want the dock notify handler
374                  * to call it after it calls _DCK
375                  */
376                 newfunc->flags &= ~FUNC_HAS_EJ0;
377                 if (register_hotplug_dock_device(handle,
378                         &acpiphp_dock_ops, context,
379                         acpiphp_dock_init, acpiphp_dock_release))
380                         dbg("failed to register dock device\n");
381         }
382
383         /* install notify handler */
384         if (!(newfunc->flags & FUNC_HAS_DCK)) {
385                 status = acpi_install_notify_handler(handle, ACPI_SYSTEM_NOTIFY,
386                                                      handle_hotplug_event,
387                                                      context);
388                 if (ACPI_FAILURE(status))
389                         acpi_handle_err(handle,
390                                         "failed to install notify handler\n");
391         }
392
393         return AE_OK;
394
395  err:
396         mutex_lock(&acpiphp_context_lock);
397         acpiphp_put_context(context);
398         mutex_unlock(&acpiphp_context_lock);
399         return status;
400 }
401
402 static struct acpiphp_bridge *acpiphp_handle_to_bridge(acpi_handle handle)
403 {
404         struct acpiphp_context *context;
405         struct acpiphp_bridge *bridge = NULL;
406
407         mutex_lock(&acpiphp_context_lock);
408         context = acpiphp_get_context(handle);
409         if (context) {
410                 bridge = context->bridge;
411                 if (bridge)
412                         get_bridge(bridge);
413
414                 acpiphp_put_context(context);
415         }
416         mutex_unlock(&acpiphp_context_lock);
417         return bridge;
418 }
419
420 static void cleanup_bridge(struct acpiphp_bridge *bridge)
421 {
422         struct acpiphp_slot *slot;
423         struct acpiphp_func *func;
424         acpi_status status;
425
426         list_for_each_entry(slot, &bridge->slots, node) {
427                 list_for_each_entry(func, &slot->funcs, sibling) {
428                         acpi_handle handle = func_to_handle(func);
429
430                         if (is_dock_device(handle))
431                                 unregister_hotplug_dock_device(handle);
432
433                         if (!(func->flags & FUNC_HAS_DCK)) {
434                                 status = acpi_remove_notify_handler(handle,
435                                                         ACPI_SYSTEM_NOTIFY,
436                                                         handle_hotplug_event);
437                                 if (ACPI_FAILURE(status))
438                                         err("failed to remove notify handler\n");
439                         }
440                 }
441                 acpiphp_unregister_hotplug_slot(slot);
442         }
443
444         mutex_lock(&bridge_mutex);
445         list_del(&bridge->list);
446         mutex_unlock(&bridge_mutex);
447 }
448
449 static int power_on_slot(struct acpiphp_slot *slot)
450 {
451         acpi_status status;
452         struct acpiphp_func *func;
453         int retval = 0;
454
455         /* if already enabled, just skip */
456         if (slot->flags & SLOT_POWEREDON)
457                 goto err_exit;
458
459         list_for_each_entry(func, &slot->funcs, sibling) {
460                 if (func->flags & FUNC_HAS_PS0) {
461                         dbg("%s: executing _PS0\n", __func__);
462                         status = acpi_evaluate_object(func_to_handle(func),
463                                                       "_PS0", NULL, NULL);
464                         if (ACPI_FAILURE(status)) {
465                                 warn("%s: _PS0 failed\n", __func__);
466                                 retval = -1;
467                                 goto err_exit;
468                         } else
469                                 break;
470                 }
471         }
472
473         /* TBD: evaluate _STA to check if the slot is enabled */
474
475         slot->flags |= SLOT_POWEREDON;
476
477  err_exit:
478         return retval;
479 }
480
481
482 static int power_off_slot(struct acpiphp_slot *slot)
483 {
484         acpi_status status;
485         struct acpiphp_func *func;
486
487         int retval = 0;
488
489         /* if already disabled, just skip */
490         if ((slot->flags & SLOT_POWEREDON) == 0)
491                 goto err_exit;
492
493         list_for_each_entry(func, &slot->funcs, sibling) {
494                 if (func->flags & FUNC_HAS_PS3) {
495                         status = acpi_evaluate_object(func_to_handle(func),
496                                                       "_PS3", NULL, NULL);
497                         if (ACPI_FAILURE(status)) {
498                                 warn("%s: _PS3 failed\n", __func__);
499                                 retval = -1;
500                                 goto err_exit;
501                         } else
502                                 break;
503                 }
504         }
505
506         /* TBD: evaluate _STA to check if the slot is disabled */
507
508         slot->flags &= (~SLOT_POWEREDON);
509
510  err_exit:
511         return retval;
512 }
513
514
515
516 /**
517  * acpiphp_max_busnr - return the highest reserved bus number under the given bus.
518  * @bus: bus to start search with
519  */
520 static unsigned char acpiphp_max_busnr(struct pci_bus *bus)
521 {
522         struct list_head *tmp;
523         unsigned char max, n;
524
525         /*
526          * pci_bus_max_busnr will return the highest
527          * reserved busnr for all these children.
528          * that is equivalent to the bus->subordinate
529          * value.  We don't want to use the parent's
530          * bus->subordinate value because it could have
531          * padding in it.
532          */
533         max = bus->busn_res.start;
534
535         list_for_each(tmp, &bus->children) {
536                 n = pci_bus_max_busnr(pci_bus_b(tmp));
537                 if (n > max)
538                         max = n;
539         }
540         return max;
541 }
542
543 /**
544  * acpiphp_bus_trim - Trim device objects in an ACPI namespace subtree.
545  * @handle: ACPI device object handle to start from.
546  */
547 static void acpiphp_bus_trim(acpi_handle handle)
548 {
549         struct acpi_device *adev = NULL;
550
551         acpi_bus_get_device(handle, &adev);
552         if (adev)
553                 acpi_bus_trim(adev);
554 }
555
556 /**
557  * acpiphp_bus_add - Scan ACPI namespace subtree.
558  * @handle: ACPI object handle to start the scan from.
559  */
560 static void acpiphp_bus_add(acpi_handle handle)
561 {
562         acpiphp_bus_trim(handle);
563         acpi_bus_scan(handle);
564 }
565
566 static void acpiphp_set_acpi_region(struct acpiphp_slot *slot)
567 {
568         struct acpiphp_func *func;
569         union acpi_object params[2];
570         struct acpi_object_list arg_list;
571
572         list_for_each_entry(func, &slot->funcs, sibling) {
573                 arg_list.count = 2;
574                 arg_list.pointer = params;
575                 params[0].type = ACPI_TYPE_INTEGER;
576                 params[0].integer.value = ACPI_ADR_SPACE_PCI_CONFIG;
577                 params[1].type = ACPI_TYPE_INTEGER;
578                 params[1].integer.value = 1;
579                 /* _REG is optional, we don't care about if there is failure */
580                 acpi_evaluate_object(func_to_handle(func), "_REG", &arg_list,
581                                      NULL);
582         }
583 }
584
585 static void check_hotplug_bridge(struct acpiphp_slot *slot, struct pci_dev *dev)
586 {
587         struct acpiphp_func *func;
588
589         if (!dev->subordinate)
590                 return;
591
592         /* quirk, or pcie could set it already */
593         if (dev->is_hotplug_bridge)
594                 return;
595
596         if (PCI_SLOT(dev->devfn) != slot->device)
597                 return;
598
599         list_for_each_entry(func, &slot->funcs, sibling) {
600                 if (PCI_FUNC(dev->devfn) == func->function) {
601                         dev->is_hotplug_bridge = 1;
602                         break;
603                 }
604         }
605 }
606
607 /**
608  * enable_device - enable, configure a slot
609  * @slot: slot to be enabled
610  *
611  * This function should be called per *physical slot*,
612  * not per each slot object in ACPI namespace.
613  */
614 static int __ref enable_device(struct acpiphp_slot *slot)
615 {
616         struct pci_dev *dev;
617         struct pci_bus *bus = slot->bus;
618         struct acpiphp_func *func;
619         int num, max, pass;
620         LIST_HEAD(add_list);
621
622         if (slot->flags & SLOT_ENABLED)
623                 goto err_exit;
624
625         list_for_each_entry(func, &slot->funcs, sibling)
626                 acpiphp_bus_add(func_to_handle(func));
627
628         num = pci_scan_slot(bus, PCI_DEVFN(slot->device, 0));
629         if (num == 0) {
630                 /* Maybe only part of funcs are added. */
631                 dbg("No new device found\n");
632                 goto err_exit;
633         }
634
635         max = acpiphp_max_busnr(bus);
636         for (pass = 0; pass < 2; pass++) {
637                 list_for_each_entry(dev, &bus->devices, bus_list) {
638                         if (PCI_SLOT(dev->devfn) != slot->device)
639                                 continue;
640                         if (dev->hdr_type == PCI_HEADER_TYPE_BRIDGE ||
641                             dev->hdr_type == PCI_HEADER_TYPE_CARDBUS) {
642                                 max = pci_scan_bridge(bus, dev, max, pass);
643                                 if (pass && dev->subordinate) {
644                                         check_hotplug_bridge(slot, dev);
645                                         pcibios_resource_survey_bus(dev->subordinate);
646                                         __pci_bus_size_bridges(dev->subordinate,
647                                                                &add_list);
648                                 }
649                         }
650                 }
651         }
652
653         __pci_bus_assign_resources(bus, &add_list, NULL);
654         acpiphp_sanitize_bus(bus);
655         acpiphp_set_hpp_values(bus);
656         acpiphp_set_acpi_region(slot);
657         pci_enable_bridges(bus);
658
659         list_for_each_entry(dev, &bus->devices, bus_list) {
660                 /* Assume that newly added devices are powered on already. */
661                 if (!dev->is_added)
662                         dev->current_state = PCI_D0;
663         }
664
665         pci_bus_add_devices(bus);
666
667         slot->flags |= SLOT_ENABLED;
668         list_for_each_entry(func, &slot->funcs, sibling) {
669                 dev = pci_get_slot(bus, PCI_DEVFN(slot->device,
670                                                   func->function));
671                 if (!dev) {
672                         /* Do not set SLOT_ENABLED flag if some funcs
673                            are not added. */
674                         slot->flags &= (~SLOT_ENABLED);
675                         continue;
676                 }
677         }
678
679
680  err_exit:
681         return 0;
682 }
683
684 /* return first device in slot, acquiring a reference on it */
685 static struct pci_dev *dev_in_slot(struct acpiphp_slot *slot)
686 {
687         struct pci_bus *bus = slot->bus;
688         struct pci_dev *dev;
689         struct pci_dev *ret = NULL;
690
691         down_read(&pci_bus_sem);
692         list_for_each_entry(dev, &bus->devices, bus_list)
693                 if (PCI_SLOT(dev->devfn) == slot->device) {
694                         ret = pci_dev_get(dev);
695                         break;
696                 }
697         up_read(&pci_bus_sem);
698
699         return ret;
700 }
701
702 /**
703  * disable_device - disable a slot
704  * @slot: ACPI PHP slot
705  */
706 static int disable_device(struct acpiphp_slot *slot)
707 {
708         struct acpiphp_func *func;
709         struct pci_dev *pdev;
710
711         /*
712          * enable_device() enumerates all functions in this device via
713          * pci_scan_slot(), whether they have associated ACPI hotplug
714          * methods (_EJ0, etc.) or not.  Therefore, we remove all functions
715          * here.
716          */
717         while ((pdev = dev_in_slot(slot))) {
718                 pci_stop_and_remove_bus_device(pdev);
719                 pci_dev_put(pdev);
720         }
721
722         list_for_each_entry(func, &slot->funcs, sibling)
723                 acpiphp_bus_trim(func_to_handle(func));
724
725         slot->flags &= (~SLOT_ENABLED);
726
727         return 0;
728 }
729
730
731 /**
732  * get_slot_status - get ACPI slot status
733  * @slot: ACPI PHP slot
734  *
735  * If a slot has _STA for each function and if any one of them
736  * returned non-zero status, return it.
737  *
738  * If a slot doesn't have _STA and if any one of its functions'
739  * configuration space is configured, return 0x0f as a _STA.
740  *
741  * Otherwise return 0.
742  */
743 static unsigned int get_slot_status(struct acpiphp_slot *slot)
744 {
745         unsigned long long sta = 0;
746         struct acpiphp_func *func;
747
748         list_for_each_entry(func, &slot->funcs, sibling) {
749                 if (func->flags & FUNC_HAS_STA) {
750                         acpi_status status;
751
752                         status = acpi_evaluate_integer(func_to_handle(func),
753                                                        "_STA", NULL, &sta);
754                         if (ACPI_SUCCESS(status) && sta)
755                                 break;
756                 } else {
757                         u32 dvid;
758
759                         pci_bus_read_config_dword(slot->bus,
760                                                   PCI_DEVFN(slot->device,
761                                                             func->function),
762                                                   PCI_VENDOR_ID, &dvid);
763                         if (dvid != 0xffffffff) {
764                                 sta = ACPI_STA_ALL;
765                                 break;
766                         }
767                 }
768         }
769
770         return (unsigned int)sta;
771 }
772
773 /**
774  * acpiphp_eject_slot - physically eject the slot
775  * @slot: ACPI PHP slot
776  */
777 int acpiphp_eject_slot(struct acpiphp_slot *slot)
778 {
779         struct acpiphp_func *func;
780
781         list_for_each_entry(func, &slot->funcs, sibling) {
782                 /* We don't want to call _EJ0 on non-existing functions. */
783                 if (!(func->flags & FUNC_HAS_EJ0))
784                         continue;
785
786                 if (ACPI_FAILURE(acpi_evaluate_ej0(func_to_handle(func))))
787                         return -1;
788                 else
789                         break;
790         }
791         return 0;
792 }
793
794 /**
795  * acpiphp_check_bridge - re-enumerate devices
796  * @bridge: where to begin re-enumeration
797  *
798  * Iterate over all slots under this bridge and make sure that if a
799  * card is present they are enabled, and if not they are disabled.
800  */
801 static int acpiphp_check_bridge(struct acpiphp_bridge *bridge)
802 {
803         struct acpiphp_slot *slot;
804         int retval = 0;
805         int enabled, disabled;
806
807         enabled = disabled = 0;
808
809         list_for_each_entry(slot, &bridge->slots, node) {
810                 unsigned int status = get_slot_status(slot);
811                 if (slot->flags & SLOT_ENABLED) {
812                         if (status == ACPI_STA_ALL)
813                                 continue;
814                         retval = acpiphp_disable_slot(slot);
815                         if (retval) {
816                                 err("Error occurred in disabling\n");
817                                 goto err_exit;
818                         } else {
819                                 acpiphp_eject_slot(slot);
820                         }
821                         disabled++;
822                 } else {
823                         if (status != ACPI_STA_ALL)
824                                 continue;
825                         retval = acpiphp_enable_slot(slot);
826                         if (retval) {
827                                 err("Error occurred in enabling\n");
828                                 goto err_exit;
829                         }
830                         enabled++;
831                 }
832         }
833
834         dbg("%s: %d enabled, %d disabled\n", __func__, enabled, disabled);
835
836  err_exit:
837         return retval;
838 }
839
840 static void acpiphp_set_hpp_values(struct pci_bus *bus)
841 {
842         struct pci_dev *dev;
843
844         list_for_each_entry(dev, &bus->devices, bus_list)
845                 pci_configure_slot(dev);
846 }
847
848 /*
849  * Remove devices for which we could not assign resources, call
850  * arch specific code to fix-up the bus
851  */
852 static void acpiphp_sanitize_bus(struct pci_bus *bus)
853 {
854         struct pci_dev *dev, *tmp;
855         int i;
856         unsigned long type_mask = IORESOURCE_IO | IORESOURCE_MEM;
857
858         list_for_each_entry_safe(dev, tmp, &bus->devices, bus_list) {
859                 for (i=0; i<PCI_BRIDGE_RESOURCES; i++) {
860                         struct resource *res = &dev->resource[i];
861                         if ((res->flags & type_mask) && !res->start &&
862                                         res->end) {
863                                 /* Could not assign a required resources
864                                  * for this device, remove it */
865                                 pci_stop_and_remove_bus_device(dev);
866                                 break;
867                         }
868                 }
869         }
870 }
871
872 /*
873  * ACPI event handlers
874  */
875
876 static acpi_status
877 check_sub_bridges(acpi_handle handle, u32 lvl, void *context, void **rv)
878 {
879         struct acpiphp_bridge *bridge;
880         char objname[64];
881         struct acpi_buffer buffer = { .length = sizeof(objname),
882                                       .pointer = objname };
883
884         bridge = acpiphp_handle_to_bridge(handle);
885         if (bridge) {
886                 acpi_get_name(handle, ACPI_FULL_PATHNAME, &buffer);
887                 dbg("%s: re-enumerating slots under %s\n",
888                         __func__, objname);
889                 acpiphp_check_bridge(bridge);
890                 put_bridge(bridge);
891         }
892         return AE_OK ;
893 }
894
895 void acpiphp_check_host_bridge(acpi_handle handle)
896 {
897         struct acpiphp_bridge *bridge;
898
899         bridge = acpiphp_handle_to_bridge(handle);
900         if (bridge) {
901                 acpiphp_check_bridge(bridge);
902                 put_bridge(bridge);
903         }
904
905         acpi_walk_namespace(ACPI_TYPE_DEVICE, handle,
906                 ACPI_UINT32_MAX, check_sub_bridges, NULL, NULL, NULL);
907 }
908
909 static void hotplug_event(acpi_handle handle, u32 type, void *data)
910 {
911         struct acpiphp_context *context = data;
912         struct acpiphp_func *func = &context->func;
913         struct acpiphp_bridge *bridge;
914         char objname[64];
915         struct acpi_buffer buffer = { .length = sizeof(objname),
916                                       .pointer = objname };
917
918         mutex_lock(&acpiphp_context_lock);
919         bridge = context->bridge;
920         if (bridge)
921                 get_bridge(bridge);
922
923         mutex_unlock(&acpiphp_context_lock);
924
925         acpi_get_name(handle, ACPI_FULL_PATHNAME, &buffer);
926
927         switch (type) {
928         case ACPI_NOTIFY_BUS_CHECK:
929                 /* bus re-enumerate */
930                 dbg("%s: Bus check notify on %s\n", __func__, objname);
931                 dbg("%s: re-enumerating slots under %s\n", __func__, objname);
932                 if (bridge) {
933                         acpiphp_check_bridge(bridge);
934                         acpi_walk_namespace(ACPI_TYPE_DEVICE, handle,
935                                             ACPI_UINT32_MAX, check_sub_bridges,
936                                             NULL, NULL, NULL);
937                 } else {
938                         acpiphp_enable_slot(func->slot);
939                 }
940                 break;
941
942         case ACPI_NOTIFY_DEVICE_CHECK:
943                 /* device check */
944                 dbg("%s: Device check notify on %s\n", __func__, objname);
945                 if (bridge)
946                         acpiphp_check_bridge(bridge);
947                 else
948                         acpiphp_check_bridge(func->parent);
949
950                 break;
951
952         case ACPI_NOTIFY_DEVICE_WAKE:
953                 /* wake event */
954                 dbg("%s: Device wake notify on %s\n", __func__, objname);
955                 break;
956
957         case ACPI_NOTIFY_EJECT_REQUEST:
958                 /* request device eject */
959                 dbg("%s: Device eject notify on %s\n", __func__, objname);
960                 if (!(acpiphp_disable_slot(func->slot)))
961                         acpiphp_eject_slot(func->slot);
962
963                 break;
964
965         case ACPI_NOTIFY_FREQUENCY_MISMATCH:
966                 printk(KERN_ERR "Device %s cannot be configured due"
967                                 " to a frequency mismatch\n", objname);
968                 break;
969
970         case ACPI_NOTIFY_BUS_MODE_MISMATCH:
971                 printk(KERN_ERR "Device %s cannot be configured due"
972                                 " to a bus mode mismatch\n", objname);
973                 break;
974
975         case ACPI_NOTIFY_POWER_FAULT:
976                 printk(KERN_ERR "Device %s has suffered a power fault\n",
977                                 objname);
978                 break;
979
980         default:
981                 warn("notify_handler: unknown event type 0x%x for %s\n", type,
982                      objname);
983                 break;
984         }
985
986         if (bridge)
987                 put_bridge(bridge);
988 }
989
990 static void hotplug_event_work(struct work_struct *work)
991 {
992         struct acpiphp_context *context;
993         struct acpi_hp_work *hp_work;
994
995         hp_work = container_of(work, struct acpi_hp_work, work);
996         context = hp_work->context;
997         acpi_scan_lock_acquire();
998
999         hotplug_event(hp_work->handle, hp_work->type, context);
1000
1001         acpi_scan_lock_release();
1002         kfree(hp_work); /* allocated in handle_hotplug_event() */
1003         put_bridge(context->func.parent);
1004 }
1005
1006 /**
1007  * handle_hotplug_event - handle ACPI hotplug event
1008  * @handle: Notify()'ed acpi_handle
1009  * @type: Notify code
1010  * @data: pointer to acpiphp_context structure
1011  *
1012  * Handles ACPI event notification on slots.
1013  */
1014 static void handle_hotplug_event(acpi_handle handle, u32 type, void *data)
1015 {
1016         struct acpiphp_context *context;
1017
1018         mutex_lock(&acpiphp_context_lock);
1019         context = acpiphp_get_context(handle);
1020         if (context) {
1021                 get_bridge(context->func.parent);
1022                 acpiphp_put_context(context);
1023         }
1024         mutex_unlock(&acpiphp_context_lock);
1025         /*
1026          * Currently the code adds all hotplug events to the kacpid_wq
1027          * queue when it should add hotplug events to the kacpi_hotplug_wq.
1028          * The proper way to fix this is to reorganize the code so that
1029          * drivers (dock, etc.) do not call acpi_os_execute(), etc.
1030          * For now just re-add this work to the kacpi_hotplug_wq so we
1031          * don't deadlock on hotplug actions.
1032          */
1033         if (context)
1034                 alloc_acpi_hp_work(handle, type, context, hotplug_event_work);
1035 }
1036
1037 /*
1038  * Create hotplug slots for the PCI bus.
1039  * It should always return 0 to avoid skipping following notifiers.
1040  */
1041 void acpiphp_enumerate_slots(struct pci_bus *bus)
1042 {
1043         struct acpiphp_bridge *bridge;
1044         acpi_handle handle;
1045         acpi_status status;
1046
1047         if (acpiphp_disabled)
1048                 return;
1049
1050         handle = ACPI_HANDLE(bus->bridge);
1051         if (!handle)
1052                 return;
1053
1054         bridge = kzalloc(sizeof(struct acpiphp_bridge), GFP_KERNEL);
1055         if (!bridge) {
1056                 acpi_handle_err(handle, "No memory for bridge object\n");
1057                 return;
1058         }
1059
1060         INIT_LIST_HEAD(&bridge->slots);
1061         kref_init(&bridge->ref);
1062         bridge->pci_dev = pci_dev_get(bus->self);
1063         bridge->pci_bus = bus;
1064
1065         /*
1066          * Grab a ref to the subordinate PCI bus in case the bus is
1067          * removed via PCI core logical hotplug. The ref pins the bus
1068          * (which we access during module unload).
1069          */
1070         get_device(&bus->dev);
1071
1072         if (!pci_is_root_bus(bridge->pci_bus)) {
1073                 struct acpiphp_context *context;
1074
1075                 /*
1076                  * This bridge should have been registered as a hotplug function
1077                  * under its parent, so the context has to be there.  If not, we
1078                  * are in deep goo.
1079                  */
1080                 mutex_lock(&acpiphp_context_lock);
1081                 context = acpiphp_get_context(handle);
1082                 if (WARN_ON(!context)) {
1083                         mutex_unlock(&acpiphp_context_lock);
1084                         put_device(&bus->dev);
1085                         kfree(bridge);
1086                         return;
1087                 }
1088                 bridge->context = context;
1089                 context->bridge = bridge;
1090                 /* Get a reference to the parent bridge. */
1091                 get_bridge(context->func.parent);
1092                 mutex_unlock(&acpiphp_context_lock);
1093         }
1094
1095         /* must be added to the list prior to calling register_slot */
1096         mutex_lock(&bridge_mutex);
1097         list_add(&bridge->list, &bridge_list);
1098         mutex_unlock(&bridge_mutex);
1099
1100         /* register all slot objects under this bridge */
1101         status = acpi_walk_namespace(ACPI_TYPE_DEVICE, handle, 1,
1102                                      register_slot, NULL, bridge, NULL);
1103         if (ACPI_FAILURE(status)) {
1104                 acpi_handle_err(handle, "failed to register slots\n");
1105                 cleanup_bridge(bridge);
1106                 put_bridge(bridge);
1107         }
1108 }
1109
1110 /* Destroy hotplug slots associated with the PCI bus */
1111 void acpiphp_remove_slots(struct pci_bus *bus)
1112 {
1113         struct acpiphp_bridge *bridge, *tmp;
1114
1115         if (acpiphp_disabled)
1116                 return;
1117
1118         list_for_each_entry_safe(bridge, tmp, &bridge_list, list)
1119                 if (bridge->pci_bus == bus) {
1120                         cleanup_bridge(bridge);
1121                         put_bridge(bridge);
1122                         break;
1123                 }
1124 }
1125
1126 /**
1127  * acpiphp_enable_slot - power on slot
1128  * @slot: ACPI PHP slot
1129  */
1130 int acpiphp_enable_slot(struct acpiphp_slot *slot)
1131 {
1132         int retval;
1133
1134         mutex_lock(&slot->crit_sect);
1135
1136         /* wake up all functions */
1137         retval = power_on_slot(slot);
1138         if (retval)
1139                 goto err_exit;
1140
1141         if (get_slot_status(slot) == ACPI_STA_ALL) {
1142                 /* configure all functions */
1143                 retval = enable_device(slot);
1144                 if (retval)
1145                         power_off_slot(slot);
1146         } else {
1147                 dbg("%s: Slot status is not ACPI_STA_ALL\n", __func__);
1148                 power_off_slot(slot);
1149         }
1150
1151  err_exit:
1152         mutex_unlock(&slot->crit_sect);
1153         return retval;
1154 }
1155
1156 /**
1157  * acpiphp_disable_slot - power off slot
1158  * @slot: ACPI PHP slot
1159  */
1160 int acpiphp_disable_slot(struct acpiphp_slot *slot)
1161 {
1162         int retval = 0;
1163
1164         mutex_lock(&slot->crit_sect);
1165
1166         /* unconfigure all functions */
1167         retval = disable_device(slot);
1168         if (retval)
1169                 goto err_exit;
1170
1171         /* power off all functions */
1172         retval = power_off_slot(slot);
1173         if (retval)
1174                 goto err_exit;
1175
1176  err_exit:
1177         mutex_unlock(&slot->crit_sect);
1178         return retval;
1179 }
1180
1181
1182 /*
1183  * slot enabled:  1
1184  * slot disabled: 0
1185  */
1186 u8 acpiphp_get_power_status(struct acpiphp_slot *slot)
1187 {
1188         return (slot->flags & SLOT_POWEREDON);
1189 }
1190
1191
1192 /*
1193  * latch   open:  1
1194  * latch closed:  0
1195  */
1196 u8 acpiphp_get_latch_status(struct acpiphp_slot *slot)
1197 {
1198         unsigned int sta;
1199
1200         sta = get_slot_status(slot);
1201
1202         return (sta & ACPI_STA_DEVICE_UI) ? 0 : 1;
1203 }
1204
1205
1206 /*
1207  * adapter presence : 1
1208  *          absence : 0
1209  */
1210 u8 acpiphp_get_adapter_status(struct acpiphp_slot *slot)
1211 {
1212         unsigned int sta;
1213
1214         sta = get_slot_status(slot);
1215
1216         return (sta == 0) ? 0 : 1;
1217 }