]> git.karo-electronics.de Git - karo-tx-linux.git/blob - drivers/pci/hotplug/acpiphp_glue.c
ACPI / hotplug / PCI: Drop redundant checks from check_hotplug_bridge()
[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         /* quirk, or pcie could set it already */
590         if (dev->is_hotplug_bridge)
591                 return;
592
593         list_for_each_entry(func, &slot->funcs, sibling) {
594                 if (PCI_FUNC(dev->devfn) == func->function) {
595                         dev->is_hotplug_bridge = 1;
596                         break;
597                 }
598         }
599 }
600
601 /**
602  * enable_device - enable, configure a slot
603  * @slot: slot to be enabled
604  *
605  * This function should be called per *physical slot*,
606  * not per each slot object in ACPI namespace.
607  */
608 static int __ref enable_device(struct acpiphp_slot *slot)
609 {
610         struct pci_dev *dev;
611         struct pci_bus *bus = slot->bus;
612         struct acpiphp_func *func;
613         int num, max, pass;
614         LIST_HEAD(add_list);
615
616         if (slot->flags & SLOT_ENABLED)
617                 goto err_exit;
618
619         list_for_each_entry(func, &slot->funcs, sibling)
620                 acpiphp_bus_add(func_to_handle(func));
621
622         num = pci_scan_slot(bus, PCI_DEVFN(slot->device, 0));
623         if (num == 0) {
624                 /* Maybe only part of funcs are added. */
625                 dbg("No new device found\n");
626                 goto err_exit;
627         }
628
629         max = acpiphp_max_busnr(bus);
630         for (pass = 0; pass < 2; pass++) {
631                 list_for_each_entry(dev, &bus->devices, bus_list) {
632                         if (PCI_SLOT(dev->devfn) != slot->device)
633                                 continue;
634                         if (dev->hdr_type == PCI_HEADER_TYPE_BRIDGE ||
635                             dev->hdr_type == PCI_HEADER_TYPE_CARDBUS) {
636                                 max = pci_scan_bridge(bus, dev, max, pass);
637                                 if (pass && dev->subordinate) {
638                                         check_hotplug_bridge(slot, dev);
639                                         pcibios_resource_survey_bus(dev->subordinate);
640                                         __pci_bus_size_bridges(dev->subordinate,
641                                                                &add_list);
642                                 }
643                         }
644                 }
645         }
646
647         __pci_bus_assign_resources(bus, &add_list, NULL);
648         acpiphp_sanitize_bus(bus);
649         acpiphp_set_hpp_values(bus);
650         acpiphp_set_acpi_region(slot);
651         pci_enable_bridges(bus);
652
653         list_for_each_entry(dev, &bus->devices, bus_list) {
654                 /* Assume that newly added devices are powered on already. */
655                 if (!dev->is_added)
656                         dev->current_state = PCI_D0;
657         }
658
659         pci_bus_add_devices(bus);
660
661         slot->flags |= SLOT_ENABLED;
662         list_for_each_entry(func, &slot->funcs, sibling) {
663                 dev = pci_get_slot(bus, PCI_DEVFN(slot->device,
664                                                   func->function));
665                 if (!dev) {
666                         /* Do not set SLOT_ENABLED flag if some funcs
667                            are not added. */
668                         slot->flags &= (~SLOT_ENABLED);
669                         continue;
670                 }
671         }
672
673
674  err_exit:
675         return 0;
676 }
677
678 /* return first device in slot, acquiring a reference on it */
679 static struct pci_dev *dev_in_slot(struct acpiphp_slot *slot)
680 {
681         struct pci_bus *bus = slot->bus;
682         struct pci_dev *dev;
683         struct pci_dev *ret = NULL;
684
685         down_read(&pci_bus_sem);
686         list_for_each_entry(dev, &bus->devices, bus_list)
687                 if (PCI_SLOT(dev->devfn) == slot->device) {
688                         ret = pci_dev_get(dev);
689                         break;
690                 }
691         up_read(&pci_bus_sem);
692
693         return ret;
694 }
695
696 /**
697  * disable_device - disable a slot
698  * @slot: ACPI PHP slot
699  */
700 static int disable_device(struct acpiphp_slot *slot)
701 {
702         struct acpiphp_func *func;
703         struct pci_dev *pdev;
704
705         /*
706          * enable_device() enumerates all functions in this device via
707          * pci_scan_slot(), whether they have associated ACPI hotplug
708          * methods (_EJ0, etc.) or not.  Therefore, we remove all functions
709          * here.
710          */
711         while ((pdev = dev_in_slot(slot))) {
712                 pci_stop_and_remove_bus_device(pdev);
713                 pci_dev_put(pdev);
714         }
715
716         list_for_each_entry(func, &slot->funcs, sibling)
717                 acpiphp_bus_trim(func_to_handle(func));
718
719         slot->flags &= (~SLOT_ENABLED);
720
721         return 0;
722 }
723
724
725 /**
726  * get_slot_status - get ACPI slot status
727  * @slot: ACPI PHP slot
728  *
729  * If a slot has _STA for each function and if any one of them
730  * returned non-zero status, return it.
731  *
732  * If a slot doesn't have _STA and if any one of its functions'
733  * configuration space is configured, return 0x0f as a _STA.
734  *
735  * Otherwise return 0.
736  */
737 static unsigned int get_slot_status(struct acpiphp_slot *slot)
738 {
739         unsigned long long sta = 0;
740         struct acpiphp_func *func;
741
742         list_for_each_entry(func, &slot->funcs, sibling) {
743                 if (func->flags & FUNC_HAS_STA) {
744                         acpi_status status;
745
746                         status = acpi_evaluate_integer(func_to_handle(func),
747                                                        "_STA", NULL, &sta);
748                         if (ACPI_SUCCESS(status) && sta)
749                                 break;
750                 } else {
751                         u32 dvid;
752
753                         pci_bus_read_config_dword(slot->bus,
754                                                   PCI_DEVFN(slot->device,
755                                                             func->function),
756                                                   PCI_VENDOR_ID, &dvid);
757                         if (dvid != 0xffffffff) {
758                                 sta = ACPI_STA_ALL;
759                                 break;
760                         }
761                 }
762         }
763
764         return (unsigned int)sta;
765 }
766
767 /**
768  * acpiphp_eject_slot - physically eject the slot
769  * @slot: ACPI PHP slot
770  */
771 int acpiphp_eject_slot(struct acpiphp_slot *slot)
772 {
773         struct acpiphp_func *func;
774
775         list_for_each_entry(func, &slot->funcs, sibling) {
776                 /* We don't want to call _EJ0 on non-existing functions. */
777                 if (!(func->flags & FUNC_HAS_EJ0))
778                         continue;
779
780                 if (ACPI_FAILURE(acpi_evaluate_ej0(func_to_handle(func))))
781                         return -1;
782                 else
783                         break;
784         }
785         return 0;
786 }
787
788 /**
789  * acpiphp_check_bridge - re-enumerate devices
790  * @bridge: where to begin re-enumeration
791  *
792  * Iterate over all slots under this bridge and make sure that if a
793  * card is present they are enabled, and if not they are disabled.
794  */
795 static int acpiphp_check_bridge(struct acpiphp_bridge *bridge)
796 {
797         struct acpiphp_slot *slot;
798         int retval = 0;
799         int enabled, disabled;
800
801         enabled = disabled = 0;
802
803         list_for_each_entry(slot, &bridge->slots, node) {
804                 unsigned int status = get_slot_status(slot);
805                 if (slot->flags & SLOT_ENABLED) {
806                         if (status == ACPI_STA_ALL)
807                                 continue;
808                         retval = acpiphp_disable_slot(slot);
809                         if (retval) {
810                                 err("Error occurred in disabling\n");
811                                 goto err_exit;
812                         } else {
813                                 acpiphp_eject_slot(slot);
814                         }
815                         disabled++;
816                 } else {
817                         if (status != ACPI_STA_ALL)
818                                 continue;
819                         retval = acpiphp_enable_slot(slot);
820                         if (retval) {
821                                 err("Error occurred in enabling\n");
822                                 goto err_exit;
823                         }
824                         enabled++;
825                 }
826         }
827
828         dbg("%s: %d enabled, %d disabled\n", __func__, enabled, disabled);
829
830  err_exit:
831         return retval;
832 }
833
834 static void acpiphp_set_hpp_values(struct pci_bus *bus)
835 {
836         struct pci_dev *dev;
837
838         list_for_each_entry(dev, &bus->devices, bus_list)
839                 pci_configure_slot(dev);
840 }
841
842 /*
843  * Remove devices for which we could not assign resources, call
844  * arch specific code to fix-up the bus
845  */
846 static void acpiphp_sanitize_bus(struct pci_bus *bus)
847 {
848         struct pci_dev *dev, *tmp;
849         int i;
850         unsigned long type_mask = IORESOURCE_IO | IORESOURCE_MEM;
851
852         list_for_each_entry_safe(dev, tmp, &bus->devices, bus_list) {
853                 for (i=0; i<PCI_BRIDGE_RESOURCES; i++) {
854                         struct resource *res = &dev->resource[i];
855                         if ((res->flags & type_mask) && !res->start &&
856                                         res->end) {
857                                 /* Could not assign a required resources
858                                  * for this device, remove it */
859                                 pci_stop_and_remove_bus_device(dev);
860                                 break;
861                         }
862                 }
863         }
864 }
865
866 /*
867  * ACPI event handlers
868  */
869
870 static acpi_status
871 check_sub_bridges(acpi_handle handle, u32 lvl, void *context, void **rv)
872 {
873         struct acpiphp_bridge *bridge;
874         char objname[64];
875         struct acpi_buffer buffer = { .length = sizeof(objname),
876                                       .pointer = objname };
877
878         bridge = acpiphp_handle_to_bridge(handle);
879         if (bridge) {
880                 acpi_get_name(handle, ACPI_FULL_PATHNAME, &buffer);
881                 dbg("%s: re-enumerating slots under %s\n",
882                         __func__, objname);
883                 acpiphp_check_bridge(bridge);
884                 put_bridge(bridge);
885         }
886         return AE_OK ;
887 }
888
889 void acpiphp_check_host_bridge(acpi_handle handle)
890 {
891         struct acpiphp_bridge *bridge;
892
893         bridge = acpiphp_handle_to_bridge(handle);
894         if (bridge) {
895                 acpiphp_check_bridge(bridge);
896                 put_bridge(bridge);
897         }
898
899         acpi_walk_namespace(ACPI_TYPE_DEVICE, handle,
900                 ACPI_UINT32_MAX, check_sub_bridges, NULL, NULL, NULL);
901 }
902
903 static void hotplug_event(acpi_handle handle, u32 type, void *data)
904 {
905         struct acpiphp_context *context = data;
906         struct acpiphp_func *func = &context->func;
907         struct acpiphp_bridge *bridge;
908         char objname[64];
909         struct acpi_buffer buffer = { .length = sizeof(objname),
910                                       .pointer = objname };
911
912         mutex_lock(&acpiphp_context_lock);
913         bridge = context->bridge;
914         if (bridge)
915                 get_bridge(bridge);
916
917         mutex_unlock(&acpiphp_context_lock);
918
919         acpi_get_name(handle, ACPI_FULL_PATHNAME, &buffer);
920
921         switch (type) {
922         case ACPI_NOTIFY_BUS_CHECK:
923                 /* bus re-enumerate */
924                 dbg("%s: Bus check notify on %s\n", __func__, objname);
925                 dbg("%s: re-enumerating slots under %s\n", __func__, objname);
926                 if (bridge) {
927                         acpiphp_check_bridge(bridge);
928                         acpi_walk_namespace(ACPI_TYPE_DEVICE, handle,
929                                             ACPI_UINT32_MAX, check_sub_bridges,
930                                             NULL, NULL, NULL);
931                 } else {
932                         acpiphp_enable_slot(func->slot);
933                 }
934                 break;
935
936         case ACPI_NOTIFY_DEVICE_CHECK:
937                 /* device check */
938                 dbg("%s: Device check notify on %s\n", __func__, objname);
939                 if (bridge)
940                         acpiphp_check_bridge(bridge);
941                 else
942                         acpiphp_check_bridge(func->parent);
943
944                 break;
945
946         case ACPI_NOTIFY_DEVICE_WAKE:
947                 /* wake event */
948                 dbg("%s: Device wake notify on %s\n", __func__, objname);
949                 break;
950
951         case ACPI_NOTIFY_EJECT_REQUEST:
952                 /* request device eject */
953                 dbg("%s: Device eject notify on %s\n", __func__, objname);
954                 if (!(acpiphp_disable_slot(func->slot)))
955                         acpiphp_eject_slot(func->slot);
956
957                 break;
958
959         case ACPI_NOTIFY_FREQUENCY_MISMATCH:
960                 printk(KERN_ERR "Device %s cannot be configured due"
961                                 " to a frequency mismatch\n", objname);
962                 break;
963
964         case ACPI_NOTIFY_BUS_MODE_MISMATCH:
965                 printk(KERN_ERR "Device %s cannot be configured due"
966                                 " to a bus mode mismatch\n", objname);
967                 break;
968
969         case ACPI_NOTIFY_POWER_FAULT:
970                 printk(KERN_ERR "Device %s has suffered a power fault\n",
971                                 objname);
972                 break;
973
974         default:
975                 warn("notify_handler: unknown event type 0x%x for %s\n", type,
976                      objname);
977                 break;
978         }
979
980         if (bridge)
981                 put_bridge(bridge);
982 }
983
984 static void hotplug_event_work(struct work_struct *work)
985 {
986         struct acpiphp_context *context;
987         struct acpi_hp_work *hp_work;
988
989         hp_work = container_of(work, struct acpi_hp_work, work);
990         context = hp_work->context;
991         acpi_scan_lock_acquire();
992
993         hotplug_event(hp_work->handle, hp_work->type, context);
994
995         acpi_scan_lock_release();
996         kfree(hp_work); /* allocated in handle_hotplug_event() */
997         put_bridge(context->func.parent);
998 }
999
1000 /**
1001  * handle_hotplug_event - handle ACPI hotplug event
1002  * @handle: Notify()'ed acpi_handle
1003  * @type: Notify code
1004  * @data: pointer to acpiphp_context structure
1005  *
1006  * Handles ACPI event notification on slots.
1007  */
1008 static void handle_hotplug_event(acpi_handle handle, u32 type, void *data)
1009 {
1010         struct acpiphp_context *context;
1011
1012         mutex_lock(&acpiphp_context_lock);
1013         context = acpiphp_get_context(handle);
1014         if (context) {
1015                 get_bridge(context->func.parent);
1016                 acpiphp_put_context(context);
1017         }
1018         mutex_unlock(&acpiphp_context_lock);
1019         /*
1020          * Currently the code adds all hotplug events to the kacpid_wq
1021          * queue when it should add hotplug events to the kacpi_hotplug_wq.
1022          * The proper way to fix this is to reorganize the code so that
1023          * drivers (dock, etc.) do not call acpi_os_execute(), etc.
1024          * For now just re-add this work to the kacpi_hotplug_wq so we
1025          * don't deadlock on hotplug actions.
1026          */
1027         if (context)
1028                 alloc_acpi_hp_work(handle, type, context, hotplug_event_work);
1029 }
1030
1031 /*
1032  * Create hotplug slots for the PCI bus.
1033  * It should always return 0 to avoid skipping following notifiers.
1034  */
1035 void acpiphp_enumerate_slots(struct pci_bus *bus)
1036 {
1037         struct acpiphp_bridge *bridge;
1038         acpi_handle handle;
1039         acpi_status status;
1040
1041         if (acpiphp_disabled)
1042                 return;
1043
1044         handle = ACPI_HANDLE(bus->bridge);
1045         if (!handle)
1046                 return;
1047
1048         bridge = kzalloc(sizeof(struct acpiphp_bridge), GFP_KERNEL);
1049         if (!bridge) {
1050                 acpi_handle_err(handle, "No memory for bridge object\n");
1051                 return;
1052         }
1053
1054         INIT_LIST_HEAD(&bridge->slots);
1055         kref_init(&bridge->ref);
1056         bridge->pci_dev = pci_dev_get(bus->self);
1057         bridge->pci_bus = bus;
1058
1059         /*
1060          * Grab a ref to the subordinate PCI bus in case the bus is
1061          * removed via PCI core logical hotplug. The ref pins the bus
1062          * (which we access during module unload).
1063          */
1064         get_device(&bus->dev);
1065
1066         if (!pci_is_root_bus(bridge->pci_bus)) {
1067                 struct acpiphp_context *context;
1068
1069                 /*
1070                  * This bridge should have been registered as a hotplug function
1071                  * under its parent, so the context has to be there.  If not, we
1072                  * are in deep goo.
1073                  */
1074                 mutex_lock(&acpiphp_context_lock);
1075                 context = acpiphp_get_context(handle);
1076                 if (WARN_ON(!context)) {
1077                         mutex_unlock(&acpiphp_context_lock);
1078                         put_device(&bus->dev);
1079                         kfree(bridge);
1080                         return;
1081                 }
1082                 bridge->context = context;
1083                 context->bridge = bridge;
1084                 /* Get a reference to the parent bridge. */
1085                 get_bridge(context->func.parent);
1086                 mutex_unlock(&acpiphp_context_lock);
1087         }
1088
1089         /* must be added to the list prior to calling register_slot */
1090         mutex_lock(&bridge_mutex);
1091         list_add(&bridge->list, &bridge_list);
1092         mutex_unlock(&bridge_mutex);
1093
1094         /* register all slot objects under this bridge */
1095         status = acpi_walk_namespace(ACPI_TYPE_DEVICE, handle, 1,
1096                                      register_slot, NULL, bridge, NULL);
1097         if (ACPI_FAILURE(status)) {
1098                 acpi_handle_err(handle, "failed to register slots\n");
1099                 cleanup_bridge(bridge);
1100                 put_bridge(bridge);
1101         }
1102 }
1103
1104 /* Destroy hotplug slots associated with the PCI bus */
1105 void acpiphp_remove_slots(struct pci_bus *bus)
1106 {
1107         struct acpiphp_bridge *bridge, *tmp;
1108
1109         if (acpiphp_disabled)
1110                 return;
1111
1112         list_for_each_entry_safe(bridge, tmp, &bridge_list, list)
1113                 if (bridge->pci_bus == bus) {
1114                         cleanup_bridge(bridge);
1115                         put_bridge(bridge);
1116                         break;
1117                 }
1118 }
1119
1120 /**
1121  * acpiphp_enable_slot - power on slot
1122  * @slot: ACPI PHP slot
1123  */
1124 int acpiphp_enable_slot(struct acpiphp_slot *slot)
1125 {
1126         int retval;
1127
1128         mutex_lock(&slot->crit_sect);
1129
1130         /* wake up all functions */
1131         retval = power_on_slot(slot);
1132         if (retval)
1133                 goto err_exit;
1134
1135         if (get_slot_status(slot) == ACPI_STA_ALL) {
1136                 /* configure all functions */
1137                 retval = enable_device(slot);
1138                 if (retval)
1139                         power_off_slot(slot);
1140         } else {
1141                 dbg("%s: Slot status is not ACPI_STA_ALL\n", __func__);
1142                 power_off_slot(slot);
1143         }
1144
1145  err_exit:
1146         mutex_unlock(&slot->crit_sect);
1147         return retval;
1148 }
1149
1150 /**
1151  * acpiphp_disable_slot - power off slot
1152  * @slot: ACPI PHP slot
1153  */
1154 int acpiphp_disable_slot(struct acpiphp_slot *slot)
1155 {
1156         int retval = 0;
1157
1158         mutex_lock(&slot->crit_sect);
1159
1160         /* unconfigure all functions */
1161         retval = disable_device(slot);
1162         if (retval)
1163                 goto err_exit;
1164
1165         /* power off all functions */
1166         retval = power_off_slot(slot);
1167         if (retval)
1168                 goto err_exit;
1169
1170  err_exit:
1171         mutex_unlock(&slot->crit_sect);
1172         return retval;
1173 }
1174
1175
1176 /*
1177  * slot enabled:  1
1178  * slot disabled: 0
1179  */
1180 u8 acpiphp_get_power_status(struct acpiphp_slot *slot)
1181 {
1182         return (slot->flags & SLOT_POWEREDON);
1183 }
1184
1185
1186 /*
1187  * latch   open:  1
1188  * latch closed:  0
1189  */
1190 u8 acpiphp_get_latch_status(struct acpiphp_slot *slot)
1191 {
1192         unsigned int sta;
1193
1194         sta = get_slot_status(slot);
1195
1196         return (sta & ACPI_STA_DEVICE_UI) ? 0 : 1;
1197 }
1198
1199
1200 /*
1201  * adapter presence : 1
1202  *          absence : 0
1203  */
1204 u8 acpiphp_get_adapter_status(struct acpiphp_slot *slot)
1205 {
1206         unsigned int sta;
1207
1208         sta = get_slot_status(slot);
1209
1210         return (sta == 0) ? 0 : 1;
1211 }