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