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