Merge branch 'oprofile/ring_buffer' into oprofile/oprofile-for-tip
[linux-2.6] / 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_func has its refcount elevated by pci_get_slot()
36  *    when the driver is loaded or when an insertion event occurs.  It loses
37  *    a refcount when its ejected or the driver unloads.
38  *  - The one in acpiphp_bridge has its refcount elevated by pci_get_slot()
39  *    when the bridge is scanned and it loses a refcount when the bridge
40  *    is removed.
41  */
42
43 #include <linux/init.h>
44 #include <linux/module.h>
45
46 #include <linux/kernel.h>
47 #include <linux/pci.h>
48 #include <linux/pci_hotplug.h>
49 #include <linux/mutex.h>
50
51 #include "../pci.h"
52 #include "acpiphp.h"
53
54 static LIST_HEAD(bridge_list);
55 static LIST_HEAD(ioapic_list);
56 static DEFINE_SPINLOCK(ioapic_list_lock);
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(acpi_handle handle, struct pci_bus *bus);
63 static void handle_hotplug_event_func(acpi_handle handle, u32 type, void *context);
64
65
66 /*
67  * initialization & terminatation routines
68  */
69
70 /**
71  * is_ejectable - determine if a slot is ejectable
72  * @handle: handle to acpi namespace
73  *
74  * Ejectable slot should satisfy at least these conditions:
75  *
76  *  1. has _ADR method
77  *  2. has _EJ0 method
78  *
79  * optionally
80  *
81  *  1. has _STA method
82  *  2. has _PS0 method
83  *  3. has _PS3 method
84  *  4. ..
85  */
86 static int is_ejectable(acpi_handle handle)
87 {
88         acpi_status status;
89         acpi_handle tmp;
90
91         status = acpi_get_handle(handle, "_ADR", &tmp);
92         if (ACPI_FAILURE(status)) {
93                 return 0;
94         }
95
96         status = acpi_get_handle(handle, "_EJ0", &tmp);
97         if (ACPI_FAILURE(status)) {
98                 return 0;
99         }
100
101         return 1;
102 }
103
104
105 /* callback routine to check for the existence of ejectable slots */
106 static acpi_status
107 is_ejectable_slot(acpi_handle handle, u32 lvl, void *context, void **rv)
108 {
109         int *count = (int *)context;
110
111         if (is_ejectable(handle)) {
112                 (*count)++;
113                 /* only one ejectable slot is enough */
114                 return AE_CTRL_TERMINATE;
115         } else {
116                 return AE_OK;
117         }
118 }
119
120 /* callback routine to check for the existence of a pci dock device */
121 static acpi_status
122 is_pci_dock_device(acpi_handle handle, u32 lvl, void *context, void **rv)
123 {
124         int *count = (int *)context;
125
126         if (is_dock_device(handle)) {
127                 (*count)++;
128                 return AE_CTRL_TERMINATE;
129         } else {
130                 return AE_OK;
131         }
132 }
133
134
135
136
137 /*
138  * the _DCK method can do funny things... and sometimes not
139  * hah-hah funny.
140  *
141  * TBD - figure out a way to only call fixups for
142  * systems that require them.
143  */
144 static int post_dock_fixups(struct notifier_block *nb, unsigned long val,
145         void *v)
146 {
147         struct acpiphp_func *func = container_of(nb, struct acpiphp_func, nb);
148         struct pci_bus *bus = func->slot->bridge->pci_bus;
149         u32 buses;
150
151         if (!bus->self)
152                 return  NOTIFY_OK;
153
154         /* fixup bad _DCK function that rewrites
155          * secondary bridge on slot
156          */
157         pci_read_config_dword(bus->self,
158                         PCI_PRIMARY_BUS,
159                         &buses);
160
161         if (((buses >> 8) & 0xff) != bus->secondary) {
162                 buses = (buses & 0xff000000)
163                         | ((unsigned int)(bus->primary)     <<  0)
164                         | ((unsigned int)(bus->secondary)   <<  8)
165                         | ((unsigned int)(bus->subordinate) << 16);
166                 pci_write_config_dword(bus->self, PCI_PRIMARY_BUS, buses);
167         }
168         return NOTIFY_OK;
169 }
170
171
172 static struct acpi_dock_ops acpiphp_dock_ops = {
173         .handler = handle_hotplug_event_func,
174 };
175
176 /* callback routine to register each ACPI PCI slot object */
177 static acpi_status
178 register_slot(acpi_handle handle, u32 lvl, void *context, void **rv)
179 {
180         struct acpiphp_bridge *bridge = (struct acpiphp_bridge *)context;
181         struct acpiphp_slot *slot;
182         struct acpiphp_func *newfunc;
183         acpi_handle tmp;
184         acpi_status status = AE_OK;
185         unsigned long long adr, sun;
186         int device, function, retval;
187
188         status = acpi_evaluate_integer(handle, "_ADR", NULL, &adr);
189
190         if (ACPI_FAILURE(status))
191                 return AE_OK;
192
193         status = acpi_get_handle(handle, "_EJ0", &tmp);
194
195         if (ACPI_FAILURE(status) && !(is_dock_device(handle)))
196                 return AE_OK;
197
198         device = (adr >> 16) & 0xffff;
199         function = adr & 0xffff;
200
201         newfunc = kzalloc(sizeof(struct acpiphp_func), GFP_KERNEL);
202         if (!newfunc)
203                 return AE_NO_MEMORY;
204
205         INIT_LIST_HEAD(&newfunc->sibling);
206         newfunc->handle = handle;
207         newfunc->function = function;
208         if (ACPI_SUCCESS(status))
209                 newfunc->flags = FUNC_HAS_EJ0;
210
211         if (ACPI_SUCCESS(acpi_get_handle(handle, "_STA", &tmp)))
212                 newfunc->flags |= FUNC_HAS_STA;
213
214         if (ACPI_SUCCESS(acpi_get_handle(handle, "_PS0", &tmp)))
215                 newfunc->flags |= FUNC_HAS_PS0;
216
217         if (ACPI_SUCCESS(acpi_get_handle(handle, "_PS3", &tmp)))
218                 newfunc->flags |= FUNC_HAS_PS3;
219
220         if (ACPI_SUCCESS(acpi_get_handle(handle, "_DCK", &tmp)))
221                 newfunc->flags |= FUNC_HAS_DCK;
222
223         status = acpi_evaluate_integer(handle, "_SUN", NULL, &sun);
224         if (ACPI_FAILURE(status)) {
225                 /*
226                  * use the count of the number of slots we've found
227                  * for the number of the slot
228                  */
229                 sun = bridge->nr_slots+1;
230         }
231
232         /* search for objects that share the same slot */
233         for (slot = bridge->slots; slot; slot = slot->next)
234                 if (slot->device == device) {
235                         if (slot->sun != sun)
236                                 warn("sibling found, but _SUN doesn't match!\n");
237                         break;
238                 }
239
240         if (!slot) {
241                 slot = kzalloc(sizeof(struct acpiphp_slot), GFP_KERNEL);
242                 if (!slot) {
243                         kfree(newfunc);
244                         return AE_NO_MEMORY;
245                 }
246
247                 slot->bridge = bridge;
248                 slot->device = device;
249                 slot->sun = sun;
250                 INIT_LIST_HEAD(&slot->funcs);
251                 mutex_init(&slot->crit_sect);
252
253                 slot->next = bridge->slots;
254                 bridge->slots = slot;
255
256                 bridge->nr_slots++;
257
258                 dbg("found ACPI PCI Hotplug slot %llu at PCI %04x:%02x:%02x\n",
259                                 slot->sun, pci_domain_nr(bridge->pci_bus),
260                                 bridge->pci_bus->number, slot->device);
261                 retval = acpiphp_register_hotplug_slot(slot);
262                 if (retval) {
263                         if (retval == -EBUSY)
264                                 warn("Slot %llu already registered by another "
265                                         "hotplug driver\n", slot->sun);
266                         else
267                                 warn("acpiphp_register_hotplug_slot failed "
268                                         "(err code = 0x%x)\n", retval);
269                         goto err_exit;
270                 }
271         }
272
273         newfunc->slot = slot;
274         list_add_tail(&newfunc->sibling, &slot->funcs);
275
276         /* associate corresponding pci_dev */
277         newfunc->pci_dev = pci_get_slot(bridge->pci_bus,
278                                          PCI_DEVFN(device, function));
279         if (newfunc->pci_dev) {
280                 slot->flags |= (SLOT_ENABLED | SLOT_POWEREDON);
281         }
282
283         if (is_dock_device(handle)) {
284                 /* we don't want to call this device's _EJ0
285                  * because we want the dock notify handler
286                  * to call it after it calls _DCK
287                  */
288                 newfunc->flags &= ~FUNC_HAS_EJ0;
289                 if (register_hotplug_dock_device(handle,
290                         &acpiphp_dock_ops, newfunc))
291                         dbg("failed to register dock device\n");
292
293                 /* we need to be notified when dock events happen
294                  * outside of the hotplug operation, since we may
295                  * need to do fixups before we can hotplug.
296                  */
297                 newfunc->nb.notifier_call = post_dock_fixups;
298                 if (register_dock_notifier(&newfunc->nb))
299                         dbg("failed to register a dock notifier");
300         }
301
302         /* install notify handler */
303         if (!(newfunc->flags & FUNC_HAS_DCK)) {
304                 status = acpi_install_notify_handler(handle,
305                                              ACPI_SYSTEM_NOTIFY,
306                                              handle_hotplug_event_func,
307                                              newfunc);
308
309                 if (ACPI_FAILURE(status))
310                         err("failed to register interrupt notify handler\n");
311         } else
312                 status = AE_OK;
313
314         return status;
315
316  err_exit:
317         bridge->nr_slots--;
318         bridge->slots = slot->next;
319         kfree(slot);
320         kfree(newfunc);
321
322         return AE_OK;
323 }
324
325
326 /* see if it's worth looking at this bridge */
327 static int detect_ejectable_slots(acpi_handle *bridge_handle)
328 {
329         acpi_status status;
330         int count;
331
332         count = 0;
333
334         /* only check slots defined directly below bridge object */
335         status = acpi_walk_namespace(ACPI_TYPE_DEVICE, bridge_handle, (u32)1,
336                                      is_ejectable_slot, (void *)&count, NULL);
337
338         /*
339          * we also need to add this bridge if there is a dock bridge or
340          * other pci device on a dock station (removable)
341          */
342         if (!count)
343                 status = acpi_walk_namespace(ACPI_TYPE_DEVICE, bridge_handle,
344                                 (u32)1, is_pci_dock_device, (void *)&count,
345                                 NULL);
346
347         return count;
348 }
349
350
351 /* decode ACPI 2.0 _HPP hot plug parameters */
352 static void decode_hpp(struct acpiphp_bridge *bridge)
353 {
354         acpi_status status;
355
356         status = acpi_get_hp_params_from_firmware(bridge->pci_bus, &bridge->hpp);
357         if (ACPI_FAILURE(status) ||
358             !bridge->hpp.t0 || (bridge->hpp.t0->revision > 1)) {
359                 /* use default numbers */
360                 printk(KERN_WARNING
361                        "%s: Could not get hotplug parameters. Use defaults\n",
362                        __func__);
363                 bridge->hpp.t0 = &bridge->hpp.type0_data;
364                 bridge->hpp.t0->revision = 0;
365                 bridge->hpp.t0->cache_line_size = 0x10;
366                 bridge->hpp.t0->latency_timer = 0x40;
367                 bridge->hpp.t0->enable_serr = 0;
368                 bridge->hpp.t0->enable_perr = 0;
369         }
370 }
371
372
373
374 /* initialize miscellaneous stuff for both root and PCI-to-PCI bridge */
375 static void init_bridge_misc(struct acpiphp_bridge *bridge)
376 {
377         acpi_status status;
378
379         /* decode ACPI 2.0 _HPP (hot plug parameters) */
380         decode_hpp(bridge);
381
382         /* must be added to the list prior to calling register_slot */
383         list_add(&bridge->list, &bridge_list);
384
385         /* register all slot objects under this bridge */
386         status = acpi_walk_namespace(ACPI_TYPE_DEVICE, bridge->handle, (u32)1,
387                                      register_slot, bridge, NULL);
388         if (ACPI_FAILURE(status)) {
389                 list_del(&bridge->list);
390                 return;
391         }
392
393         /* install notify handler */
394         if (bridge->type != BRIDGE_TYPE_HOST) {
395                 if ((bridge->flags & BRIDGE_HAS_EJ0) && bridge->func) {
396                         status = acpi_remove_notify_handler(bridge->func->handle,
397                                                 ACPI_SYSTEM_NOTIFY,
398                                                 handle_hotplug_event_func);
399                         if (ACPI_FAILURE(status))
400                                 err("failed to remove notify handler\n");
401                 }
402                 status = acpi_install_notify_handler(bridge->handle,
403                                              ACPI_SYSTEM_NOTIFY,
404                                              handle_hotplug_event_bridge,
405                                              bridge);
406
407                 if (ACPI_FAILURE(status)) {
408                         err("failed to register interrupt notify handler\n");
409                 }
410         }
411 }
412
413
414 /* find acpiphp_func from acpiphp_bridge */
415 static struct acpiphp_func *acpiphp_bridge_handle_to_function(acpi_handle handle)
416 {
417         struct list_head *node, *l;
418         struct acpiphp_bridge *bridge;
419         struct acpiphp_slot *slot;
420         struct acpiphp_func *func;
421
422         list_for_each(node, &bridge_list) {
423                 bridge = list_entry(node, struct acpiphp_bridge, list);
424                 for (slot = bridge->slots; slot; slot = slot->next) {
425                         list_for_each(l, &slot->funcs) {
426                                 func = list_entry(l, struct acpiphp_func,
427                                                         sibling);
428                                 if (func->handle == handle)
429                                         return func;
430                         }
431                 }
432         }
433
434         return NULL;
435 }
436
437
438 static inline void config_p2p_bridge_flags(struct acpiphp_bridge *bridge)
439 {
440         acpi_handle dummy_handle;
441
442         if (ACPI_SUCCESS(acpi_get_handle(bridge->handle,
443                                         "_STA", &dummy_handle)))
444                 bridge->flags |= BRIDGE_HAS_STA;
445
446         if (ACPI_SUCCESS(acpi_get_handle(bridge->handle,
447                                         "_EJ0", &dummy_handle)))
448                 bridge->flags |= BRIDGE_HAS_EJ0;
449
450         if (ACPI_SUCCESS(acpi_get_handle(bridge->handle,
451                                         "_PS0", &dummy_handle)))
452                 bridge->flags |= BRIDGE_HAS_PS0;
453
454         if (ACPI_SUCCESS(acpi_get_handle(bridge->handle,
455                                         "_PS3", &dummy_handle)))
456                 bridge->flags |= BRIDGE_HAS_PS3;
457
458         /* is this ejectable p2p bridge? */
459         if (bridge->flags & BRIDGE_HAS_EJ0) {
460                 struct acpiphp_func *func;
461
462                 dbg("found ejectable p2p bridge\n");
463
464                 /* make link between PCI bridge and PCI function */
465                 func = acpiphp_bridge_handle_to_function(bridge->handle);
466                 if (!func)
467                         return;
468                 bridge->func = func;
469                 func->bridge = bridge;
470         }
471 }
472
473
474 /* allocate and initialize host bridge data structure */
475 static void add_host_bridge(acpi_handle *handle, struct pci_bus *pci_bus)
476 {
477         struct acpiphp_bridge *bridge;
478
479         bridge = kzalloc(sizeof(struct acpiphp_bridge), GFP_KERNEL);
480         if (bridge == NULL)
481                 return;
482
483         bridge->type = BRIDGE_TYPE_HOST;
484         bridge->handle = handle;
485
486         bridge->pci_bus = pci_bus;
487
488         spin_lock_init(&bridge->res_lock);
489
490         init_bridge_misc(bridge);
491 }
492
493
494 /* allocate and initialize PCI-to-PCI bridge data structure */
495 static void add_p2p_bridge(acpi_handle *handle, struct pci_dev *pci_dev)
496 {
497         struct acpiphp_bridge *bridge;
498
499         bridge = kzalloc(sizeof(struct acpiphp_bridge), GFP_KERNEL);
500         if (bridge == NULL) {
501                 err("out of memory\n");
502                 return;
503         }
504
505         bridge->type = BRIDGE_TYPE_P2P;
506         bridge->handle = handle;
507         config_p2p_bridge_flags(bridge);
508
509         bridge->pci_dev = pci_dev_get(pci_dev);
510         bridge->pci_bus = pci_dev->subordinate;
511         if (!bridge->pci_bus) {
512                 err("This is not a PCI-to-PCI bridge!\n");
513                 goto err;
514         }
515
516         spin_lock_init(&bridge->res_lock);
517
518         init_bridge_misc(bridge);
519         return;
520  err:
521         pci_dev_put(pci_dev);
522         kfree(bridge);
523         return;
524 }
525
526
527 /* callback routine to find P2P bridges */
528 static acpi_status
529 find_p2p_bridge(acpi_handle handle, u32 lvl, void *context, void **rv)
530 {
531         acpi_status status;
532         acpi_handle dummy_handle;
533         unsigned long long tmp;
534         int device, function;
535         struct pci_dev *dev;
536         struct pci_bus *pci_bus = context;
537
538         status = acpi_get_handle(handle, "_ADR", &dummy_handle);
539         if (ACPI_FAILURE(status))
540                 return AE_OK;           /* continue */
541
542         status = acpi_evaluate_integer(handle, "_ADR", NULL, &tmp);
543         if (ACPI_FAILURE(status)) {
544                 dbg("%s: _ADR evaluation failure\n", __func__);
545                 return AE_OK;
546         }
547
548         device = (tmp >> 16) & 0xffff;
549         function = tmp & 0xffff;
550
551         dev = pci_get_slot(pci_bus, PCI_DEVFN(device, function));
552
553         if (!dev || !dev->subordinate)
554                 goto out;
555
556         /* check if this bridge has ejectable slots */
557         if ((detect_ejectable_slots(handle) > 0)) {
558                 dbg("found PCI-to-PCI bridge at PCI %s\n", pci_name(dev));
559                 add_p2p_bridge(handle, dev);
560         }
561
562         /* search P2P bridges under this p2p bridge */
563         status = acpi_walk_namespace(ACPI_TYPE_DEVICE, handle, (u32)1,
564                                      find_p2p_bridge, dev->subordinate, NULL);
565         if (ACPI_FAILURE(status))
566                 warn("find_p2p_bridge failed (error code = 0x%x)\n", status);
567
568  out:
569         pci_dev_put(dev);
570         return AE_OK;
571 }
572
573
574 /* find hot-pluggable slots, and then find P2P bridge */
575 static int add_bridge(acpi_handle handle)
576 {
577         acpi_status status;
578         unsigned long long tmp;
579         int seg, bus;
580         acpi_handle dummy_handle;
581         struct pci_bus *pci_bus;
582
583         /* if the bridge doesn't have _STA, we assume it is always there */
584         status = acpi_get_handle(handle, "_STA", &dummy_handle);
585         if (ACPI_SUCCESS(status)) {
586                 status = acpi_evaluate_integer(handle, "_STA", NULL, &tmp);
587                 if (ACPI_FAILURE(status)) {
588                         dbg("%s: _STA evaluation failure\n", __func__);
589                         return 0;
590                 }
591                 if ((tmp & ACPI_STA_FUNCTIONING) == 0)
592                         /* don't register this object */
593                         return 0;
594         }
595
596         /* get PCI segment number */
597         status = acpi_evaluate_integer(handle, "_SEG", NULL, &tmp);
598
599         seg = ACPI_SUCCESS(status) ? tmp : 0;
600
601         /* get PCI bus number */
602         status = acpi_evaluate_integer(handle, "_BBN", NULL, &tmp);
603
604         if (ACPI_SUCCESS(status)) {
605                 bus = tmp;
606         } else {
607                 warn("can't get bus number, assuming 0\n");
608                 bus = 0;
609         }
610
611         pci_bus = pci_find_bus(seg, bus);
612         if (!pci_bus) {
613                 err("Can't find bus %04x:%02x\n", seg, bus);
614                 return 0;
615         }
616
617         /* check if this bridge has ejectable slots */
618         if (detect_ejectable_slots(handle) > 0) {
619                 dbg("found PCI host-bus bridge with hot-pluggable slots\n");
620                 add_host_bridge(handle, pci_bus);
621         }
622
623         /* search P2P bridges under this host bridge */
624         status = acpi_walk_namespace(ACPI_TYPE_DEVICE, handle, (u32)1,
625                                      find_p2p_bridge, pci_bus, NULL);
626
627         if (ACPI_FAILURE(status))
628                 warn("find_p2p_bridge failed (error code = 0x%x)\n", status);
629
630         return 0;
631 }
632
633 static struct acpiphp_bridge *acpiphp_handle_to_bridge(acpi_handle handle)
634 {
635         struct list_head *head;
636         list_for_each(head, &bridge_list) {
637                 struct acpiphp_bridge *bridge = list_entry(head,
638                                                 struct acpiphp_bridge, list);
639                 if (bridge->handle == handle)
640                         return bridge;
641         }
642
643         return NULL;
644 }
645
646 static void cleanup_bridge(struct acpiphp_bridge *bridge)
647 {
648         struct list_head *list, *tmp;
649         struct acpiphp_slot *slot;
650         acpi_status status;
651         acpi_handle handle = bridge->handle;
652
653         status = acpi_remove_notify_handler(handle, ACPI_SYSTEM_NOTIFY,
654                                             handle_hotplug_event_bridge);
655         if (ACPI_FAILURE(status))
656                 err("failed to remove notify handler\n");
657
658         if ((bridge->type != BRIDGE_TYPE_HOST) &&
659             ((bridge->flags & BRIDGE_HAS_EJ0) && bridge->func)) {
660                 status = acpi_install_notify_handler(bridge->func->handle,
661                                                 ACPI_SYSTEM_NOTIFY,
662                                                 handle_hotplug_event_func,
663                                                 bridge->func);
664                 if (ACPI_FAILURE(status))
665                         err("failed to install interrupt notify handler\n");
666         }
667
668         slot = bridge->slots;
669         while (slot) {
670                 struct acpiphp_slot *next = slot->next;
671                 list_for_each_safe (list, tmp, &slot->funcs) {
672                         struct acpiphp_func *func;
673                         func = list_entry(list, struct acpiphp_func, sibling);
674                         if (is_dock_device(func->handle)) {
675                                 unregister_hotplug_dock_device(func->handle);
676                                 unregister_dock_notifier(&func->nb);
677                         }
678                         if (!(func->flags & FUNC_HAS_DCK)) {
679                                 status = acpi_remove_notify_handler(func->handle,
680                                                 ACPI_SYSTEM_NOTIFY,
681                                                 handle_hotplug_event_func);
682                                 if (ACPI_FAILURE(status))
683                                         err("failed to remove notify handler\n");
684                         }
685                         pci_dev_put(func->pci_dev);
686                         list_del(list);
687                         kfree(func);
688                 }
689                 acpiphp_unregister_hotplug_slot(slot);
690                 list_del(&slot->funcs);
691                 kfree(slot);
692                 slot = next;
693         }
694
695         pci_dev_put(bridge->pci_dev);
696         list_del(&bridge->list);
697         kfree(bridge);
698 }
699
700 static acpi_status
701 cleanup_p2p_bridge(acpi_handle handle, u32 lvl, void *context, void **rv)
702 {
703         struct acpiphp_bridge *bridge;
704
705         /* cleanup p2p bridges under this P2P bridge
706            in a depth-first manner */
707         acpi_walk_namespace(ACPI_TYPE_DEVICE, handle, (u32)1,
708                                 cleanup_p2p_bridge, NULL, NULL);
709
710         bridge = acpiphp_handle_to_bridge(handle);
711         if (bridge)
712                 cleanup_bridge(bridge);
713
714         return AE_OK;
715 }
716
717 static void remove_bridge(acpi_handle handle)
718 {
719         struct acpiphp_bridge *bridge;
720
721         /* cleanup p2p bridges under this host bridge
722            in a depth-first manner */
723         acpi_walk_namespace(ACPI_TYPE_DEVICE, handle,
724                                 (u32)1, cleanup_p2p_bridge, NULL, NULL);
725
726         /*
727          * On root bridges with hotplug slots directly underneath (ie,
728          * no p2p bridge inbetween), we call cleanup_bridge(). 
729          *
730          * The else clause cleans up root bridges that either had no
731          * hotplug slots at all, or had a p2p bridge underneath.
732          */
733         bridge = acpiphp_handle_to_bridge(handle);
734         if (bridge)
735                 cleanup_bridge(bridge);
736         else
737                 acpi_remove_notify_handler(handle, ACPI_SYSTEM_NOTIFY,
738                                            handle_hotplug_event_bridge);
739 }
740
741 static struct pci_dev * get_apic_pci_info(acpi_handle handle)
742 {
743         struct acpi_pci_id id;
744         struct pci_bus *bus;
745         struct pci_dev *dev;
746
747         if (ACPI_FAILURE(acpi_get_pci_id(handle, &id)))
748                 return NULL;
749
750         bus = pci_find_bus(id.segment, id.bus);
751         if (!bus)
752                 return NULL;
753
754         dev = pci_get_slot(bus, PCI_DEVFN(id.device, id.function));
755         if (!dev)
756                 return NULL;
757
758         if ((dev->class != PCI_CLASS_SYSTEM_PIC_IOAPIC) &&
759             (dev->class != PCI_CLASS_SYSTEM_PIC_IOXAPIC))
760         {
761                 pci_dev_put(dev);
762                 return NULL;
763         }
764
765         return dev;
766 }
767
768 static int get_gsi_base(acpi_handle handle, u32 *gsi_base)
769 {
770         acpi_status status;
771         int result = -1;
772         unsigned long long gsb;
773         struct acpi_buffer buffer = {ACPI_ALLOCATE_BUFFER, NULL};
774         union acpi_object *obj;
775         void *table;
776
777         status = acpi_evaluate_integer(handle, "_GSB", NULL, &gsb);
778         if (ACPI_SUCCESS(status)) {
779                 *gsi_base = (u32)gsb;
780                 return 0;
781         }
782
783         status = acpi_evaluate_object(handle, "_MAT", NULL, &buffer);
784         if (ACPI_FAILURE(status) || !buffer.length || !buffer.pointer)
785                 return -1;
786
787         obj = buffer.pointer;
788         if (obj->type != ACPI_TYPE_BUFFER)
789                 goto out;
790
791         table = obj->buffer.pointer;
792         switch (((struct acpi_subtable_header *)table)->type) {
793         case ACPI_MADT_TYPE_IO_SAPIC:
794                 *gsi_base = ((struct acpi_madt_io_sapic *)table)->global_irq_base;
795                 result = 0;
796                 break;
797         case ACPI_MADT_TYPE_IO_APIC:
798                 *gsi_base = ((struct acpi_madt_io_apic *)table)->global_irq_base;
799                 result = 0;
800                 break;
801         default:
802                 break;
803         }
804  out:
805         kfree(buffer.pointer);
806         return result;
807 }
808
809 static acpi_status
810 ioapic_add(acpi_handle handle, u32 lvl, void *context, void **rv)
811 {
812         acpi_status status;
813         unsigned long long sta;
814         acpi_handle tmp;
815         struct pci_dev *pdev;
816         u32 gsi_base;
817         u64 phys_addr;
818         struct acpiphp_ioapic *ioapic;
819
820         /* Evaluate _STA if present */
821         status = acpi_evaluate_integer(handle, "_STA", NULL, &sta);
822         if (ACPI_SUCCESS(status) && sta != ACPI_STA_ALL)
823                 return AE_CTRL_DEPTH;
824
825         /* Scan only PCI bus scope */
826         status = acpi_get_handle(handle, "_HID", &tmp);
827         if (ACPI_SUCCESS(status))
828                 return AE_CTRL_DEPTH;
829
830         if (get_gsi_base(handle, &gsi_base))
831                 return AE_OK;
832
833         ioapic = kmalloc(sizeof(*ioapic), GFP_KERNEL);
834         if (!ioapic)
835                 return AE_NO_MEMORY;
836
837         pdev = get_apic_pci_info(handle);
838         if (!pdev)
839                 goto exit_kfree;
840
841         if (pci_enable_device(pdev))
842                 goto exit_pci_dev_put;
843
844         pci_set_master(pdev);
845
846         if (pci_request_region(pdev, 0, "I/O APIC(acpiphp)"))
847                 goto exit_pci_disable_device;
848
849         phys_addr = pci_resource_start(pdev, 0);
850         if (acpi_register_ioapic(handle, phys_addr, gsi_base))
851                 goto exit_pci_release_region;
852
853         ioapic->gsi_base = gsi_base;
854         ioapic->dev = pdev;
855         spin_lock(&ioapic_list_lock);
856         list_add_tail(&ioapic->list, &ioapic_list);
857         spin_unlock(&ioapic_list_lock);
858
859         return AE_OK;
860
861  exit_pci_release_region:
862         pci_release_region(pdev, 0);
863  exit_pci_disable_device:
864         pci_disable_device(pdev);
865  exit_pci_dev_put:
866         pci_dev_put(pdev);
867  exit_kfree:
868         kfree(ioapic);
869
870         return AE_OK;
871 }
872
873 static acpi_status
874 ioapic_remove(acpi_handle handle, u32 lvl, void *context, void **rv)
875 {
876         acpi_status status;
877         unsigned long long sta;
878         acpi_handle tmp;
879         u32 gsi_base;
880         struct acpiphp_ioapic *pos, *n, *ioapic = NULL;
881
882         /* Evaluate _STA if present */
883         status = acpi_evaluate_integer(handle, "_STA", NULL, &sta);
884         if (ACPI_SUCCESS(status) && sta != ACPI_STA_ALL)
885                 return AE_CTRL_DEPTH;
886
887         /* Scan only PCI bus scope */
888         status = acpi_get_handle(handle, "_HID", &tmp);
889         if (ACPI_SUCCESS(status))
890                 return AE_CTRL_DEPTH;
891
892         if (get_gsi_base(handle, &gsi_base))
893                 return AE_OK;
894
895         acpi_unregister_ioapic(handle, gsi_base);
896
897         spin_lock(&ioapic_list_lock);
898         list_for_each_entry_safe(pos, n, &ioapic_list, list) {
899                 if (pos->gsi_base != gsi_base)
900                         continue;
901                 ioapic = pos;
902                 list_del(&ioapic->list);
903                 break;
904         }
905         spin_unlock(&ioapic_list_lock);
906
907         if (!ioapic)
908                 return AE_OK;
909
910         pci_release_region(ioapic->dev, 0);
911         pci_disable_device(ioapic->dev);
912         pci_dev_put(ioapic->dev);
913         kfree(ioapic);
914
915         return AE_OK;
916 }
917
918 static int acpiphp_configure_ioapics(acpi_handle handle)
919 {
920         ioapic_add(handle, 0, NULL, NULL);
921         acpi_walk_namespace(ACPI_TYPE_DEVICE, handle,
922                             ACPI_UINT32_MAX, ioapic_add, NULL, NULL);
923         return 0;
924 }
925
926 static int acpiphp_unconfigure_ioapics(acpi_handle handle)
927 {
928         ioapic_remove(handle, 0, NULL, NULL);
929         acpi_walk_namespace(ACPI_TYPE_DEVICE, handle,
930                             ACPI_UINT32_MAX, ioapic_remove, NULL, NULL);
931         return 0;
932 }
933
934 static int power_on_slot(struct acpiphp_slot *slot)
935 {
936         acpi_status status;
937         struct acpiphp_func *func;
938         struct list_head *l;
939         int retval = 0;
940
941         /* if already enabled, just skip */
942         if (slot->flags & SLOT_POWEREDON)
943                 goto err_exit;
944
945         list_for_each (l, &slot->funcs) {
946                 func = list_entry(l, struct acpiphp_func, sibling);
947
948                 if (func->flags & FUNC_HAS_PS0) {
949                         dbg("%s: executing _PS0\n", __func__);
950                         status = acpi_evaluate_object(func->handle, "_PS0", NULL, NULL);
951                         if (ACPI_FAILURE(status)) {
952                                 warn("%s: _PS0 failed\n", __func__);
953                                 retval = -1;
954                                 goto err_exit;
955                         } else
956                                 break;
957                 }
958         }
959
960         /* TBD: evaluate _STA to check if the slot is enabled */
961
962         slot->flags |= SLOT_POWEREDON;
963
964  err_exit:
965         return retval;
966 }
967
968
969 static int power_off_slot(struct acpiphp_slot *slot)
970 {
971         acpi_status status;
972         struct acpiphp_func *func;
973         struct list_head *l;
974
975         int retval = 0;
976
977         /* if already disabled, just skip */
978         if ((slot->flags & SLOT_POWEREDON) == 0)
979                 goto err_exit;
980
981         list_for_each (l, &slot->funcs) {
982                 func = list_entry(l, struct acpiphp_func, sibling);
983
984                 if (func->flags & FUNC_HAS_PS3) {
985                         status = acpi_evaluate_object(func->handle, "_PS3", NULL, NULL);
986                         if (ACPI_FAILURE(status)) {
987                                 warn("%s: _PS3 failed\n", __func__);
988                                 retval = -1;
989                                 goto err_exit;
990                         } else
991                                 break;
992                 }
993         }
994
995         /* TBD: evaluate _STA to check if the slot is disabled */
996
997         slot->flags &= (~SLOT_POWEREDON);
998
999  err_exit:
1000         return retval;
1001 }
1002
1003
1004
1005 /**
1006  * acpiphp_max_busnr - return the highest reserved bus number under the given bus.
1007  * @bus: bus to start search with
1008  */
1009 static unsigned char acpiphp_max_busnr(struct pci_bus *bus)
1010 {
1011         struct list_head *tmp;
1012         unsigned char max, n;
1013
1014         /*
1015          * pci_bus_max_busnr will return the highest
1016          * reserved busnr for all these children.
1017          * that is equivalent to the bus->subordinate
1018          * value.  We don't want to use the parent's
1019          * bus->subordinate value because it could have
1020          * padding in it.
1021          */
1022         max = bus->secondary;
1023
1024         list_for_each(tmp, &bus->children) {
1025                 n = pci_bus_max_busnr(pci_bus_b(tmp));
1026                 if (n > max)
1027                         max = n;
1028         }
1029         return max;
1030 }
1031
1032
1033 /**
1034  * acpiphp_bus_add - add a new bus to acpi subsystem
1035  * @func: acpiphp_func of the bridge
1036  */
1037 static int acpiphp_bus_add(struct acpiphp_func *func)
1038 {
1039         acpi_handle phandle;
1040         struct acpi_device *device, *pdevice;
1041         int ret_val;
1042
1043         acpi_get_parent(func->handle, &phandle);
1044         if (acpi_bus_get_device(phandle, &pdevice)) {
1045                 dbg("no parent device, assuming NULL\n");
1046                 pdevice = NULL;
1047         }
1048         if (!acpi_bus_get_device(func->handle, &device)) {
1049                 dbg("bus exists... trim\n");
1050                 /* this shouldn't be in here, so remove
1051                  * the bus then re-add it...
1052                  */
1053                 ret_val = acpi_bus_trim(device, 1);
1054                 dbg("acpi_bus_trim return %x\n", ret_val);
1055         }
1056
1057         ret_val = acpi_bus_add(&device, pdevice, func->handle,
1058                 ACPI_BUS_TYPE_DEVICE);
1059         if (ret_val) {
1060                 dbg("error adding bus, %x\n",
1061                         -ret_val);
1062                 goto acpiphp_bus_add_out;
1063         }
1064         /*
1065          * try to start anyway.  We could have failed to add
1066          * simply because this bus had previously been added
1067          * on another add.  Don't bother with the return value
1068          * we just keep going.
1069          */
1070         ret_val = acpi_bus_start(device);
1071
1072 acpiphp_bus_add_out:
1073         return ret_val;
1074 }
1075
1076
1077 /**
1078  * acpiphp_bus_trim - trim a bus from acpi subsystem
1079  * @handle: handle to acpi namespace
1080  */
1081 static int acpiphp_bus_trim(acpi_handle handle)
1082 {
1083         struct acpi_device *device;
1084         int retval;
1085
1086         retval = acpi_bus_get_device(handle, &device);
1087         if (retval) {
1088                 dbg("acpi_device not found\n");
1089                 return retval;
1090         }
1091
1092         retval = acpi_bus_trim(device, 1);
1093         if (retval)
1094                 err("cannot remove from acpi list\n");
1095
1096         return retval;
1097 }
1098
1099 /**
1100  * enable_device - enable, configure a slot
1101  * @slot: slot to be enabled
1102  *
1103  * This function should be called per *physical slot*,
1104  * not per each slot object in ACPI namespace.
1105  */
1106 static int __ref enable_device(struct acpiphp_slot *slot)
1107 {
1108         struct pci_dev *dev;
1109         struct pci_bus *bus = slot->bridge->pci_bus;
1110         struct list_head *l;
1111         struct acpiphp_func *func;
1112         int retval = 0;
1113         int num, max, pass;
1114         acpi_status status;
1115
1116         if (slot->flags & SLOT_ENABLED)
1117                 goto err_exit;
1118
1119         /* sanity check: dev should be NULL when hot-plugged in */
1120         dev = pci_get_slot(bus, PCI_DEVFN(slot->device, 0));
1121         if (dev) {
1122                 /* This case shouldn't happen */
1123                 err("pci_dev structure already exists.\n");
1124                 pci_dev_put(dev);
1125                 retval = -1;
1126                 goto err_exit;
1127         }
1128
1129         num = pci_scan_slot(bus, PCI_DEVFN(slot->device, 0));
1130         if (num == 0) {
1131                 err("No new device found\n");
1132                 retval = -1;
1133                 goto err_exit;
1134         }
1135
1136         max = acpiphp_max_busnr(bus);
1137         for (pass = 0; pass < 2; pass++) {
1138                 list_for_each_entry(dev, &bus->devices, bus_list) {
1139                         if (PCI_SLOT(dev->devfn) != slot->device)
1140                                 continue;
1141                         if (dev->hdr_type == PCI_HEADER_TYPE_BRIDGE ||
1142                             dev->hdr_type == PCI_HEADER_TYPE_CARDBUS) {
1143                                 max = pci_scan_bridge(bus, dev, max, pass);
1144                                 if (pass && dev->subordinate)
1145                                         pci_bus_size_bridges(dev->subordinate);
1146                         }
1147                 }
1148         }
1149
1150         list_for_each (l, &slot->funcs) {
1151                 func = list_entry(l, struct acpiphp_func, sibling);
1152                 acpiphp_bus_add(func);
1153         }
1154
1155         pci_bus_assign_resources(bus);
1156         acpiphp_sanitize_bus(bus);
1157         acpiphp_set_hpp_values(slot->bridge->handle, bus);
1158         list_for_each_entry(func, &slot->funcs, sibling)
1159                 acpiphp_configure_ioapics(func->handle);
1160         pci_enable_bridges(bus);
1161         pci_bus_add_devices(bus);
1162
1163         /* associate pci_dev to our representation */
1164         list_for_each (l, &slot->funcs) {
1165                 func = list_entry(l, struct acpiphp_func, sibling);
1166                 func->pci_dev = pci_get_slot(bus, PCI_DEVFN(slot->device,
1167                                                         func->function));
1168                 if (!func->pci_dev)
1169                         continue;
1170
1171                 if (func->pci_dev->hdr_type != PCI_HEADER_TYPE_BRIDGE &&
1172                     func->pci_dev->hdr_type != PCI_HEADER_TYPE_CARDBUS)
1173                         continue;
1174
1175                 status = find_p2p_bridge(func->handle, (u32)1, bus, NULL);
1176                 if (ACPI_FAILURE(status))
1177                         warn("find_p2p_bridge failed (error code = 0x%x)\n",
1178                                 status);
1179         }
1180
1181         slot->flags |= SLOT_ENABLED;
1182
1183  err_exit:
1184         return retval;
1185 }
1186
1187 static void disable_bridges(struct pci_bus *bus)
1188 {
1189         struct pci_dev *dev;
1190         list_for_each_entry(dev, &bus->devices, bus_list) {
1191                 if (dev->subordinate) {
1192                         disable_bridges(dev->subordinate);
1193                         pci_disable_device(dev);
1194                 }
1195         }
1196 }
1197
1198 /**
1199  * disable_device - disable a slot
1200  * @slot: ACPI PHP slot
1201  */
1202 static int disable_device(struct acpiphp_slot *slot)
1203 {
1204         int retval = 0;
1205         struct acpiphp_func *func;
1206         struct list_head *l;
1207
1208         /* is this slot already disabled? */
1209         if (!(slot->flags & SLOT_ENABLED))
1210                 goto err_exit;
1211
1212         list_for_each (l, &slot->funcs) {
1213                 func = list_entry(l, struct acpiphp_func, sibling);
1214
1215                 if (func->bridge) {
1216                         /* cleanup p2p bridges under this P2P bridge */
1217                         cleanup_p2p_bridge(func->bridge->handle,
1218                                                 (u32)1, NULL, NULL);
1219                         func->bridge = NULL;
1220                 }
1221
1222                 if (func->pci_dev) {
1223                         pci_stop_bus_device(func->pci_dev);
1224                         if (func->pci_dev->subordinate) {
1225                                 disable_bridges(func->pci_dev->subordinate);
1226                                 pci_disable_device(func->pci_dev);
1227                         }
1228                 }
1229         }
1230
1231         list_for_each (l, &slot->funcs) {
1232                 func = list_entry(l, struct acpiphp_func, sibling);
1233
1234                 acpiphp_unconfigure_ioapics(func->handle);
1235                 acpiphp_bus_trim(func->handle);
1236                 /* try to remove anyway.
1237                  * acpiphp_bus_add might have been failed */
1238
1239                 if (!func->pci_dev)
1240                         continue;
1241
1242                 pci_remove_bus_device(func->pci_dev);
1243                 pci_dev_put(func->pci_dev);
1244                 func->pci_dev = NULL;
1245         }
1246
1247         slot->flags &= (~SLOT_ENABLED);
1248
1249  err_exit:
1250         return retval;
1251 }
1252
1253
1254 /**
1255  * get_slot_status - get ACPI slot status
1256  * @slot: ACPI PHP slot
1257  *
1258  * If a slot has _STA for each function and if any one of them
1259  * returned non-zero status, return it.
1260  *
1261  * If a slot doesn't have _STA and if any one of its functions'
1262  * configuration space is configured, return 0x0f as a _STA.
1263  *
1264  * Otherwise return 0.
1265  */
1266 static unsigned int get_slot_status(struct acpiphp_slot *slot)
1267 {
1268         acpi_status status;
1269         unsigned long long sta = 0;
1270         u32 dvid;
1271         struct list_head *l;
1272         struct acpiphp_func *func;
1273
1274         list_for_each (l, &slot->funcs) {
1275                 func = list_entry(l, struct acpiphp_func, sibling);
1276
1277                 if (func->flags & FUNC_HAS_STA) {
1278                         status = acpi_evaluate_integer(func->handle, "_STA", NULL, &sta);
1279                         if (ACPI_SUCCESS(status) && sta)
1280                                 break;
1281                 } else {
1282                         pci_bus_read_config_dword(slot->bridge->pci_bus,
1283                                                   PCI_DEVFN(slot->device,
1284                                                             func->function),
1285                                                   PCI_VENDOR_ID, &dvid);
1286                         if (dvid != 0xffffffff) {
1287                                 sta = ACPI_STA_ALL;
1288                                 break;
1289                         }
1290                 }
1291         }
1292
1293         return (unsigned int)sta;
1294 }
1295
1296 /**
1297  * acpiphp_eject_slot - physically eject the slot
1298  * @slot: ACPI PHP slot
1299  */
1300 int acpiphp_eject_slot(struct acpiphp_slot *slot)
1301 {
1302         acpi_status status;
1303         struct acpiphp_func *func;
1304         struct list_head *l;
1305         struct acpi_object_list arg_list;
1306         union acpi_object arg;
1307
1308         list_for_each (l, &slot->funcs) {
1309                 func = list_entry(l, struct acpiphp_func, sibling);
1310
1311                 /* We don't want to call _EJ0 on non-existing functions. */
1312                 if ((func->flags & FUNC_HAS_EJ0)) {
1313                         /* _EJ0 method take one argument */
1314                         arg_list.count = 1;
1315                         arg_list.pointer = &arg;
1316                         arg.type = ACPI_TYPE_INTEGER;
1317                         arg.integer.value = 1;
1318
1319                         status = acpi_evaluate_object(func->handle, "_EJ0", &arg_list, NULL);
1320                         if (ACPI_FAILURE(status)) {
1321                                 warn("%s: _EJ0 failed\n", __func__);
1322                                 return -1;
1323                         } else
1324                                 break;
1325                 }
1326         }
1327         return 0;
1328 }
1329
1330 /**
1331  * acpiphp_check_bridge - re-enumerate devices
1332  * @bridge: where to begin re-enumeration
1333  *
1334  * Iterate over all slots under this bridge and make sure that if a
1335  * card is present they are enabled, and if not they are disabled.
1336  */
1337 static int acpiphp_check_bridge(struct acpiphp_bridge *bridge)
1338 {
1339         struct acpiphp_slot *slot;
1340         int retval = 0;
1341         int enabled, disabled;
1342
1343         enabled = disabled = 0;
1344
1345         for (slot = bridge->slots; slot; slot = slot->next) {
1346                 unsigned int status = get_slot_status(slot);
1347                 if (slot->flags & SLOT_ENABLED) {
1348                         if (status == ACPI_STA_ALL)
1349                                 continue;
1350                         retval = acpiphp_disable_slot(slot);
1351                         if (retval) {
1352                                 err("Error occurred in disabling\n");
1353                                 goto err_exit;
1354                         } else {
1355                                 acpiphp_eject_slot(slot);
1356                         }
1357                         disabled++;
1358                 } else {
1359                         if (status != ACPI_STA_ALL)
1360                                 continue;
1361                         retval = acpiphp_enable_slot(slot);
1362                         if (retval) {
1363                                 err("Error occurred in enabling\n");
1364                                 goto err_exit;
1365                         }
1366                         enabled++;
1367                 }
1368         }
1369
1370         dbg("%s: %d enabled, %d disabled\n", __func__, enabled, disabled);
1371
1372  err_exit:
1373         return retval;
1374 }
1375
1376 static void program_hpp(struct pci_dev *dev, struct acpiphp_bridge *bridge)
1377 {
1378         u16 pci_cmd, pci_bctl;
1379         struct pci_dev *cdev;
1380
1381         /* Program hpp values for this device */
1382         if (!(dev->hdr_type == PCI_HEADER_TYPE_NORMAL ||
1383                         (dev->hdr_type == PCI_HEADER_TYPE_BRIDGE &&
1384                         (dev->class >> 8) == PCI_CLASS_BRIDGE_PCI)))
1385                 return;
1386
1387         if ((dev->class >> 8) == PCI_CLASS_BRIDGE_HOST)
1388                 return;
1389
1390         pci_write_config_byte(dev, PCI_CACHE_LINE_SIZE,
1391                         bridge->hpp.t0->cache_line_size);
1392         pci_write_config_byte(dev, PCI_LATENCY_TIMER,
1393                         bridge->hpp.t0->latency_timer);
1394         pci_read_config_word(dev, PCI_COMMAND, &pci_cmd);
1395         if (bridge->hpp.t0->enable_serr)
1396                 pci_cmd |= PCI_COMMAND_SERR;
1397         else
1398                 pci_cmd &= ~PCI_COMMAND_SERR;
1399         if (bridge->hpp.t0->enable_perr)
1400                 pci_cmd |= PCI_COMMAND_PARITY;
1401         else
1402                 pci_cmd &= ~PCI_COMMAND_PARITY;
1403         pci_write_config_word(dev, PCI_COMMAND, pci_cmd);
1404
1405         /* Program bridge control value and child devices */
1406         if ((dev->class >> 8) == PCI_CLASS_BRIDGE_PCI) {
1407                 pci_write_config_byte(dev, PCI_SEC_LATENCY_TIMER,
1408                                 bridge->hpp.t0->latency_timer);
1409                 pci_read_config_word(dev, PCI_BRIDGE_CONTROL, &pci_bctl);
1410                 if (bridge->hpp.t0->enable_serr)
1411                         pci_bctl |= PCI_BRIDGE_CTL_SERR;
1412                 else
1413                         pci_bctl &= ~PCI_BRIDGE_CTL_SERR;
1414                 if (bridge->hpp.t0->enable_perr)
1415                         pci_bctl |= PCI_BRIDGE_CTL_PARITY;
1416                 else
1417                         pci_bctl &= ~PCI_BRIDGE_CTL_PARITY;
1418                 pci_write_config_word(dev, PCI_BRIDGE_CONTROL, pci_bctl);
1419                 if (dev->subordinate) {
1420                         list_for_each_entry(cdev, &dev->subordinate->devices,
1421                                         bus_list)
1422                                 program_hpp(cdev, bridge);
1423                 }
1424         }
1425 }
1426
1427 static void acpiphp_set_hpp_values(acpi_handle handle, struct pci_bus *bus)
1428 {
1429         struct acpiphp_bridge bridge;
1430         struct pci_dev *dev;
1431
1432         memset(&bridge, 0, sizeof(bridge));
1433         bridge.handle = handle;
1434         bridge.pci_bus = bus;
1435         bridge.pci_dev = bus->self;
1436         decode_hpp(&bridge);
1437         list_for_each_entry(dev, &bus->devices, bus_list)
1438                 program_hpp(dev, &bridge);
1439
1440 }
1441
1442 /*
1443  * Remove devices for which we could not assign resources, call
1444  * arch specific code to fix-up the bus
1445  */
1446 static void acpiphp_sanitize_bus(struct pci_bus *bus)
1447 {
1448         struct pci_dev *dev;
1449         int i;
1450         unsigned long type_mask = IORESOURCE_IO | IORESOURCE_MEM;
1451
1452         list_for_each_entry(dev, &bus->devices, bus_list) {
1453                 for (i=0; i<PCI_BRIDGE_RESOURCES; i++) {
1454                         struct resource *res = &dev->resource[i];
1455                         if ((res->flags & type_mask) && !res->start &&
1456                                         res->end) {
1457                                 /* Could not assign a required resources
1458                                  * for this device, remove it */
1459                                 pci_remove_bus_device(dev);
1460                                 break;
1461                         }
1462                 }
1463         }
1464 }
1465
1466 /* Program resources in newly inserted bridge */
1467 static int acpiphp_configure_bridge (acpi_handle handle)
1468 {
1469         struct acpi_pci_id pci_id;
1470         struct pci_bus *bus;
1471
1472         if (ACPI_FAILURE(acpi_get_pci_id(handle, &pci_id))) {
1473                 err("cannot get PCI domain and bus number for bridge\n");
1474                 return -EINVAL;
1475         }
1476         bus = pci_find_bus(pci_id.segment, pci_id.bus);
1477         if (!bus) {
1478                 err("cannot find bus %d:%d\n",
1479                                 pci_id.segment, pci_id.bus);
1480                 return -EINVAL;
1481         }
1482
1483         pci_bus_size_bridges(bus);
1484         pci_bus_assign_resources(bus);
1485         acpiphp_sanitize_bus(bus);
1486         acpiphp_set_hpp_values(handle, bus);
1487         pci_enable_bridges(bus);
1488         acpiphp_configure_ioapics(handle);
1489         return 0;
1490 }
1491
1492 static void handle_bridge_insertion(acpi_handle handle, u32 type)
1493 {
1494         struct acpi_device *device, *pdevice;
1495         acpi_handle phandle;
1496
1497         if ((type != ACPI_NOTIFY_BUS_CHECK) &&
1498                         (type != ACPI_NOTIFY_DEVICE_CHECK)) {
1499                 err("unexpected notification type %d\n", type);
1500                 return;
1501         }
1502
1503         acpi_get_parent(handle, &phandle);
1504         if (acpi_bus_get_device(phandle, &pdevice)) {
1505                 dbg("no parent device, assuming NULL\n");
1506                 pdevice = NULL;
1507         }
1508         if (acpi_bus_add(&device, pdevice, handle, ACPI_BUS_TYPE_DEVICE)) {
1509                 err("cannot add bridge to acpi list\n");
1510                 return;
1511         }
1512         if (!acpiphp_configure_bridge(handle) &&
1513                 !acpi_bus_start(device))
1514                 add_bridge(handle);
1515         else
1516                 err("cannot configure and start bridge\n");
1517
1518 }
1519
1520 /*
1521  * ACPI event handlers
1522  */
1523
1524 static acpi_status
1525 count_sub_bridges(acpi_handle handle, u32 lvl, void *context, void **rv)
1526 {
1527         int *count = (int *)context;
1528         struct acpiphp_bridge *bridge;
1529
1530         bridge = acpiphp_handle_to_bridge(handle);
1531         if (bridge)
1532                 (*count)++;
1533         return AE_OK ;
1534 }
1535
1536 static acpi_status
1537 check_sub_bridges(acpi_handle handle, u32 lvl, void *context, void **rv)
1538 {
1539         struct acpiphp_bridge *bridge;
1540         char objname[64];
1541         struct acpi_buffer buffer = { .length = sizeof(objname),
1542                                       .pointer = objname };
1543
1544         bridge = acpiphp_handle_to_bridge(handle);
1545         if (bridge) {
1546                 acpi_get_name(handle, ACPI_FULL_PATHNAME, &buffer);
1547                 dbg("%s: re-enumerating slots under %s\n",
1548                         __func__, objname);
1549                 acpiphp_check_bridge(bridge);
1550         }
1551         return AE_OK ;
1552 }
1553
1554 /**
1555  * handle_hotplug_event_bridge - handle ACPI event on bridges
1556  * @handle: Notify()'ed acpi_handle
1557  * @type: Notify code
1558  * @context: pointer to acpiphp_bridge structure
1559  *
1560  * Handles ACPI event notification on {host,p2p} bridges.
1561  */
1562 static void handle_hotplug_event_bridge(acpi_handle handle, u32 type, void *context)
1563 {
1564         struct acpiphp_bridge *bridge;
1565         char objname[64];
1566         struct acpi_buffer buffer = { .length = sizeof(objname),
1567                                       .pointer = objname };
1568         struct acpi_device *device;
1569         int num_sub_bridges = 0;
1570
1571         if (acpi_bus_get_device(handle, &device)) {
1572                 /* This bridge must have just been physically inserted */
1573                 handle_bridge_insertion(handle, type);
1574                 return;
1575         }
1576
1577         bridge = acpiphp_handle_to_bridge(handle);
1578         if (type == ACPI_NOTIFY_BUS_CHECK) {
1579                 acpi_walk_namespace(ACPI_TYPE_DEVICE, handle, ACPI_UINT32_MAX,
1580                         count_sub_bridges, &num_sub_bridges, NULL);
1581         }
1582
1583         if (!bridge && !num_sub_bridges) {
1584                 err("cannot get bridge info\n");
1585                 return;
1586         }
1587
1588         acpi_get_name(handle, ACPI_FULL_PATHNAME, &buffer);
1589
1590         switch (type) {
1591         case ACPI_NOTIFY_BUS_CHECK:
1592                 /* bus re-enumerate */
1593                 dbg("%s: Bus check notify on %s\n", __func__, objname);
1594                 if (bridge) {
1595                         dbg("%s: re-enumerating slots under %s\n",
1596                                 __func__, objname);
1597                         acpiphp_check_bridge(bridge);
1598                 }
1599                 if (num_sub_bridges)
1600                         acpi_walk_namespace(ACPI_TYPE_DEVICE, handle,
1601                                 ACPI_UINT32_MAX, check_sub_bridges, NULL, NULL);
1602                 break;
1603
1604         case ACPI_NOTIFY_DEVICE_CHECK:
1605                 /* device check */
1606                 dbg("%s: Device check notify on %s\n", __func__, objname);
1607                 acpiphp_check_bridge(bridge);
1608                 break;
1609
1610         case ACPI_NOTIFY_DEVICE_WAKE:
1611                 /* wake event */
1612                 dbg("%s: Device wake notify on %s\n", __func__, objname);
1613                 break;
1614
1615         case ACPI_NOTIFY_EJECT_REQUEST:
1616                 /* request device eject */
1617                 dbg("%s: Device eject notify on %s\n", __func__, objname);
1618                 if ((bridge->type != BRIDGE_TYPE_HOST) &&
1619                     (bridge->flags & BRIDGE_HAS_EJ0)) {
1620                         struct acpiphp_slot *slot;
1621                         slot = bridge->func->slot;
1622                         if (!acpiphp_disable_slot(slot))
1623                                 acpiphp_eject_slot(slot);
1624                 }
1625                 break;
1626
1627         case ACPI_NOTIFY_FREQUENCY_MISMATCH:
1628                 printk(KERN_ERR "Device %s cannot be configured due"
1629                                 " to a frequency mismatch\n", objname);
1630                 break;
1631
1632         case ACPI_NOTIFY_BUS_MODE_MISMATCH:
1633                 printk(KERN_ERR "Device %s cannot be configured due"
1634                                 " to a bus mode mismatch\n", objname);
1635                 break;
1636
1637         case ACPI_NOTIFY_POWER_FAULT:
1638                 printk(KERN_ERR "Device %s has suffered a power fault\n",
1639                                 objname);
1640                 break;
1641
1642         default:
1643                 warn("notify_handler: unknown event type 0x%x for %s\n", type, objname);
1644                 break;
1645         }
1646 }
1647
1648 /**
1649  * handle_hotplug_event_func - handle ACPI event on functions (i.e. slots)
1650  * @handle: Notify()'ed acpi_handle
1651  * @type: Notify code
1652  * @context: pointer to acpiphp_func structure
1653  *
1654  * Handles ACPI event notification on slots.
1655  */
1656 static void handle_hotplug_event_func(acpi_handle handle, u32 type, void *context)
1657 {
1658         struct acpiphp_func *func;
1659         char objname[64];
1660         struct acpi_buffer buffer = { .length = sizeof(objname),
1661                                       .pointer = objname };
1662
1663         acpi_get_name(handle, ACPI_FULL_PATHNAME, &buffer);
1664
1665         func = (struct acpiphp_func *)context;
1666
1667         switch (type) {
1668         case ACPI_NOTIFY_BUS_CHECK:
1669                 /* bus re-enumerate */
1670                 dbg("%s: Bus check notify on %s\n", __func__, objname);
1671                 acpiphp_enable_slot(func->slot);
1672                 break;
1673
1674         case ACPI_NOTIFY_DEVICE_CHECK:
1675                 /* device check : re-enumerate from parent bus */
1676                 dbg("%s: Device check notify on %s\n", __func__, objname);
1677                 acpiphp_check_bridge(func->slot->bridge);
1678                 break;
1679
1680         case ACPI_NOTIFY_DEVICE_WAKE:
1681                 /* wake event */
1682                 dbg("%s: Device wake notify on %s\n", __func__, objname);
1683                 break;
1684
1685         case ACPI_NOTIFY_EJECT_REQUEST:
1686                 /* request device eject */
1687                 dbg("%s: Device eject notify on %s\n", __func__, objname);
1688                 if (!(acpiphp_disable_slot(func->slot)))
1689                         acpiphp_eject_slot(func->slot);
1690                 break;
1691
1692         default:
1693                 warn("notify_handler: unknown event type 0x%x for %s\n", type, objname);
1694                 break;
1695         }
1696 }
1697
1698
1699 static acpi_status
1700 find_root_bridges(acpi_handle handle, u32 lvl, void *context, void **rv)
1701 {
1702         int *count = (int *)context;
1703
1704         if (acpi_root_bridge(handle)) {
1705                 acpi_install_notify_handler(handle, ACPI_SYSTEM_NOTIFY,
1706                                 handle_hotplug_event_bridge, NULL);
1707                         (*count)++;
1708         }
1709         return AE_OK ;
1710 }
1711
1712 static struct acpi_pci_driver acpi_pci_hp_driver = {
1713         .add =          add_bridge,
1714         .remove =       remove_bridge,
1715 };
1716
1717 /**
1718  * acpiphp_glue_init - initializes all PCI hotplug - ACPI glue data structures
1719  */
1720 int __init acpiphp_glue_init(void)
1721 {
1722         int num = 0;
1723
1724         acpi_walk_namespace(ACPI_TYPE_DEVICE, ACPI_ROOT_OBJECT,
1725                         ACPI_UINT32_MAX, find_root_bridges, &num, NULL);
1726
1727         if (num <= 0)
1728                 return -1;
1729         else
1730                 acpi_pci_register_driver(&acpi_pci_hp_driver);
1731
1732         return 0;
1733 }
1734
1735
1736 /**
1737  * acpiphp_glue_exit - terminates all PCI hotplug - ACPI glue data structures
1738  *
1739  * This function frees all data allocated in acpiphp_glue_init().
1740  */
1741 void  acpiphp_glue_exit(void)
1742 {
1743         acpi_pci_unregister_driver(&acpi_pci_hp_driver);
1744 }
1745
1746
1747 /**
1748  * acpiphp_get_num_slots - count number of slots in a system
1749  */
1750 int __init acpiphp_get_num_slots(void)
1751 {
1752         struct acpiphp_bridge *bridge;
1753         int num_slots = 0;
1754
1755         list_for_each_entry (bridge, &bridge_list, list) {
1756                 dbg("Bus %04x:%02x has %d slot%s\n",
1757                                 pci_domain_nr(bridge->pci_bus),
1758                                 bridge->pci_bus->number, bridge->nr_slots,
1759                                 bridge->nr_slots == 1 ? "" : "s");
1760                 num_slots += bridge->nr_slots;
1761         }
1762
1763         dbg("Total %d slots\n", num_slots);
1764         return num_slots;
1765 }
1766
1767
1768 #if 0
1769 /**
1770  * acpiphp_for_each_slot - call function for each slot
1771  * @fn: callback function
1772  * @data: context to be passed to callback function
1773  */
1774 static int acpiphp_for_each_slot(acpiphp_callback fn, void *data)
1775 {
1776         struct list_head *node;
1777         struct acpiphp_bridge *bridge;
1778         struct acpiphp_slot *slot;
1779         int retval = 0;
1780
1781         list_for_each (node, &bridge_list) {
1782                 bridge = (struct acpiphp_bridge *)node;
1783                 for (slot = bridge->slots; slot; slot = slot->next) {
1784                         retval = fn(slot, data);
1785                         if (!retval)
1786                                 goto err_exit;
1787                 }
1788         }
1789
1790  err_exit:
1791         return retval;
1792 }
1793 #endif
1794
1795
1796 /**
1797  * acpiphp_enable_slot - power on slot
1798  * @slot: ACPI PHP slot
1799  */
1800 int acpiphp_enable_slot(struct acpiphp_slot *slot)
1801 {
1802         int retval;
1803
1804         mutex_lock(&slot->crit_sect);
1805
1806         /* wake up all functions */
1807         retval = power_on_slot(slot);
1808         if (retval)
1809                 goto err_exit;
1810
1811         if (get_slot_status(slot) == ACPI_STA_ALL) {
1812                 /* configure all functions */
1813                 retval = enable_device(slot);
1814                 if (retval)
1815                         power_off_slot(slot);
1816         } else {
1817                 dbg("%s: Slot status is not ACPI_STA_ALL\n", __func__);
1818                 power_off_slot(slot);
1819         }
1820
1821  err_exit:
1822         mutex_unlock(&slot->crit_sect);
1823         return retval;
1824 }
1825
1826 /**
1827  * acpiphp_disable_slot - power off slot
1828  * @slot: ACPI PHP slot
1829  */
1830 int acpiphp_disable_slot(struct acpiphp_slot *slot)
1831 {
1832         int retval = 0;
1833
1834         mutex_lock(&slot->crit_sect);
1835
1836         /* unconfigure all functions */
1837         retval = disable_device(slot);
1838         if (retval)
1839                 goto err_exit;
1840
1841         /* power off all functions */
1842         retval = power_off_slot(slot);
1843         if (retval)
1844                 goto err_exit;
1845
1846  err_exit:
1847         mutex_unlock(&slot->crit_sect);
1848         return retval;
1849 }
1850
1851
1852 /*
1853  * slot enabled:  1
1854  * slot disabled: 0
1855  */
1856 u8 acpiphp_get_power_status(struct acpiphp_slot *slot)
1857 {
1858         return (slot->flags & SLOT_POWEREDON);
1859 }
1860
1861
1862 /*
1863  * latch   open:  1
1864  * latch closed:  0
1865  */
1866 u8 acpiphp_get_latch_status(struct acpiphp_slot *slot)
1867 {
1868         unsigned int sta;
1869
1870         sta = get_slot_status(slot);
1871
1872         return (sta & ACPI_STA_SHOW_IN_UI) ? 0 : 1;
1873 }
1874
1875
1876 /*
1877  * adapter presence : 1
1878  *          absence : 0
1879  */
1880 u8 acpiphp_get_adapter_status(struct acpiphp_slot *slot)
1881 {
1882         unsigned int sta;
1883
1884         sta = get_slot_status(slot);
1885
1886         return (sta == 0) ? 0 : 1;
1887 }