pci_root.c 20.1 KB
Newer Older
L
Linus Torvalds 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
/*
 *  pci_root.c - ACPI PCI Root Bridge Driver ($Revision: 40 $)
 *
 *  Copyright (C) 2001, 2002 Andy Grover <andrew.grover@intel.com>
 *  Copyright (C) 2001, 2002 Paul Diefenbaugh <paul.s.diefenbaugh@intel.com>
 *
 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 *
 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 2 of the License, or (at
 *  your option) any later version.
 *
 *  This program is distributed in the hope that it will be useful, but
 *  WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License along
 *  with this program; if not, write to the Free Software Foundation, Inc.,
 *  59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
 *
 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 */

#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/init.h>
#include <linux/types.h>
30
#include <linux/mutex.h>
L
Linus Torvalds 已提交
31
#include <linux/pm.h>
32
#include <linux/pm_runtime.h>
L
Linus Torvalds 已提交
33
#include <linux/pci.h>
34
#include <linux/pci-acpi.h>
35
#include <linux/pci-aspm.h>
L
Linus Torvalds 已提交
36
#include <linux/acpi.h>
37
#include <linux/slab.h>
L
Linus Torvalds 已提交
38 39
#include <acpi/acpi_bus.h>
#include <acpi/acpi_drivers.h>
40
#include <acpi/apei.h>
L
Linus Torvalds 已提交
41

42 43
#define PREFIX "ACPI: "

L
Linus Torvalds 已提交
44
#define _COMPONENT		ACPI_PCI_COMPONENT
45
ACPI_MODULE_NAME("pci_root");
L
Linus Torvalds 已提交
46 47
#define ACPI_PCI_ROOT_CLASS		"pci_bridge"
#define ACPI_PCI_ROOT_DEVICE_NAME	"PCI Root Bridge"
48 49 50
static int acpi_pci_root_add(struct acpi_device *device,
			     const struct acpi_device_id *not_used);
static void acpi_pci_root_remove(struct acpi_device *device);
L
Linus Torvalds 已提交
51

52 53 54 55 56
#define ACPI_PCIE_REQ_SUPPORT (OSC_EXT_PCI_CONFIG_SUPPORT \
				| OSC_ACTIVE_STATE_PWR_SUPPORT \
				| OSC_CLOCK_PWR_CAPABILITY_SUPPORT \
				| OSC_MSI_SUPPORT)

57
static const struct acpi_device_id root_device_ids[] = {
58 59 60 61
	{"PNP0A03", 0},
	{"", 0},
};

62
static struct acpi_scan_handler pci_root_handler = {
63
	.ids = root_device_ids,
64 65
	.attach = acpi_pci_root_add,
	.detach = acpi_pci_root_remove,
L
Linus Torvalds 已提交
66 67
};

68 69
/* Lock to protect both acpi_pci_roots and acpi_pci_drivers lists */
static DEFINE_MUTEX(acpi_pci_root_lock);
L
Linus Torvalds 已提交
70
static LIST_HEAD(acpi_pci_roots);
71
static LIST_HEAD(acpi_pci_drivers);
L
Linus Torvalds 已提交
72

73
static DEFINE_MUTEX(osc_lock);
L
Linus Torvalds 已提交
74 75 76 77

int acpi_pci_register_driver(struct acpi_pci_driver *driver)
{
	int n = 0;
78
	struct acpi_pci_root *root;
L
Linus Torvalds 已提交
79

80
	mutex_lock(&acpi_pci_root_lock);
81
	list_add_tail(&driver->node, &acpi_pci_drivers);
82 83
	if (driver->add)
		list_for_each_entry(root, &acpi_pci_roots, node) {
84
			driver->add(root);
85 86 87
			n++;
		}
	mutex_unlock(&acpi_pci_root_lock);
L
Linus Torvalds 已提交
88 89 90 91 92 93 94

	return n;
}
EXPORT_SYMBOL(acpi_pci_register_driver);

void acpi_pci_unregister_driver(struct acpi_pci_driver *driver)
{
95
	struct acpi_pci_root *root;
L
Linus Torvalds 已提交
96

97
	mutex_lock(&acpi_pci_root_lock);
98
	list_del(&driver->node);
99 100
	if (driver->remove)
		list_for_each_entry(root, &acpi_pci_roots, node)
101
			driver->remove(root);
102
	mutex_unlock(&acpi_pci_root_lock);
L
Linus Torvalds 已提交
103 104 105
}
EXPORT_SYMBOL(acpi_pci_unregister_driver);

106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129
/**
 * acpi_is_root_bridge - determine whether an ACPI CA node is a PCI root bridge
 * @handle - the ACPI CA node in question.
 *
 * Note: we could make this API take a struct acpi_device * instead, but
 * for now, it's more convenient to operate on an acpi_handle.
 */
int acpi_is_root_bridge(acpi_handle handle)
{
	int ret;
	struct acpi_device *device;

	ret = acpi_bus_get_device(handle, &device);
	if (ret)
		return 0;

	ret = acpi_match_device_ids(device, root_device_ids);
	if (ret)
		return 0;
	else
		return 1;
}
EXPORT_SYMBOL_GPL(acpi_is_root_bridge);

L
Linus Torvalds 已提交
130
static acpi_status
L
Len Brown 已提交
131
get_root_bridge_busnr_callback(struct acpi_resource *resource, void *data)
L
Linus Torvalds 已提交
132
{
133
	struct resource *res = data;
L
Linus Torvalds 已提交
134 135
	struct acpi_resource_address64 address;

B
Bob Moore 已提交
136 137 138
	if (resource->type != ACPI_RESOURCE_TYPE_ADDRESS16 &&
	    resource->type != ACPI_RESOURCE_TYPE_ADDRESS32 &&
	    resource->type != ACPI_RESOURCE_TYPE_ADDRESS64)
L
Linus Torvalds 已提交
139 140 141
		return AE_OK;

	acpi_resource_to_address64(resource, &address);
L
Len Brown 已提交
142
	if ((address.address_length > 0) &&
143 144 145 146
	    (address.resource_type == ACPI_BUS_NUMBER_RANGE)) {
		res->start = address.minimum;
		res->end = address.minimum + address.address_length - 1;
	}
L
Linus Torvalds 已提交
147 148 149 150

	return AE_OK;
}

151
static acpi_status try_get_root_bridge_busnr(acpi_handle handle,
152
					     struct resource *res)
L
Linus Torvalds 已提交
153 154 155
{
	acpi_status status;

156
	res->start = -1;
L
Len Brown 已提交
157 158
	status =
	    acpi_walk_resources(handle, METHOD_NAME__CRS,
159
				get_root_bridge_busnr_callback, res);
L
Linus Torvalds 已提交
160 161
	if (ACPI_FAILURE(status))
		return status;
162
	if (res->start == -1)
L
Linus Torvalds 已提交
163 164 165 166
		return AE_ERROR;
	return AE_OK;
}

S
Shaohua Li 已提交
167
static u8 pci_osc_uuid_str[] = "33DB4D5B-1FF7-401C-9657-7441C03DD766";
168 169 170 171

static acpi_status acpi_pci_run_osc(acpi_handle handle,
				    const u32 *capbuf, u32 *retval)
{
S
Shaohua Li 已提交
172 173 174 175 176 177
	struct acpi_osc_context context = {
		.uuid_str = pci_osc_uuid_str,
		.rev = 1,
		.cap.length = 12,
		.cap.pointer = (void *)capbuf,
	};
178 179
	acpi_status status;

S
Shaohua Li 已提交
180 181 182 183
	status = acpi_run_osc(handle, &context);
	if (ACPI_SUCCESS(status)) {
		*retval = *((u32 *)(context.ret.pointer + 8));
		kfree(context.ret.pointer);
184 185 186 187
	}
	return status;
}

188 189 190
static acpi_status acpi_pci_query_osc(struct acpi_pci_root *root,
					u32 support,
					u32 *control)
191 192
{
	acpi_status status;
193 194 195 196
	u32 result, capbuf[3];

	support &= OSC_PCI_SUPPORT_MASKS;
	support |= root->osc_support_set;
197 198

	capbuf[OSC_QUERY_TYPE] = OSC_QUERY_ENABLE;
199 200 201 202 203 204 205 206
	capbuf[OSC_SUPPORT_TYPE] = support;
	if (control) {
		*control &= OSC_PCI_CONTROL_MASKS;
		capbuf[OSC_CONTROL_TYPE] = *control | root->osc_control_set;
	} else {
		/* Run _OSC query for all possible controls. */
		capbuf[OSC_CONTROL_TYPE] = OSC_PCI_CONTROL_MASKS;
	}
207 208 209

	status = acpi_pci_run_osc(root->device->handle, capbuf, &result);
	if (ACPI_SUCCESS(status)) {
210
		root->osc_support_set = support;
211
		if (control)
212
			*control = result;
213 214 215 216 217 218 219 220 221 222 223 224 225
	}
	return status;
}

static acpi_status acpi_pci_osc_support(struct acpi_pci_root *root, u32 flags)
{
	acpi_status status;
	acpi_handle tmp;

	status = acpi_get_handle(root->device->handle, "_OSC", &tmp);
	if (ACPI_FAILURE(status))
		return status;
	mutex_lock(&osc_lock);
226
	status = acpi_pci_query_osc(root, flags, NULL);
227 228 229 230
	mutex_unlock(&osc_lock);
	return status;
}

231
struct acpi_pci_root *acpi_pci_find_root(acpi_handle handle)
232 233
{
	struct acpi_pci_root *root;
234
	struct acpi_device *device;
235

236 237 238 239 240 241 242
	if (acpi_bus_get_device(handle, &device) ||
	    acpi_match_device_ids(device, root_device_ids))
		return NULL;

	root = acpi_driver_data(device);

	return root;
243
}
244
EXPORT_SYMBOL_GPL(acpi_pci_find_root);
245

246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312
struct acpi_handle_node {
	struct list_head node;
	acpi_handle handle;
};

/**
 * acpi_get_pci_dev - convert ACPI CA handle to struct pci_dev
 * @handle: the handle in question
 *
 * Given an ACPI CA handle, the desired PCI device is located in the
 * list of PCI devices.
 *
 * If the device is found, its reference count is increased and this
 * function returns a pointer to its data structure.  The caller must
 * decrement the reference count by calling pci_dev_put().
 * If no device is found, %NULL is returned.
 */
struct pci_dev *acpi_get_pci_dev(acpi_handle handle)
{
	int dev, fn;
	unsigned long long adr;
	acpi_status status;
	acpi_handle phandle;
	struct pci_bus *pbus;
	struct pci_dev *pdev = NULL;
	struct acpi_handle_node *node, *tmp;
	struct acpi_pci_root *root;
	LIST_HEAD(device_list);

	/*
	 * Walk up the ACPI CA namespace until we reach a PCI root bridge.
	 */
	phandle = handle;
	while (!acpi_is_root_bridge(phandle)) {
		node = kzalloc(sizeof(struct acpi_handle_node), GFP_KERNEL);
		if (!node)
			goto out;

		INIT_LIST_HEAD(&node->node);
		node->handle = phandle;
		list_add(&node->node, &device_list);

		status = acpi_get_parent(phandle, &phandle);
		if (ACPI_FAILURE(status))
			goto out;
	}

	root = acpi_pci_find_root(phandle);
	if (!root)
		goto out;

	pbus = root->bus;

	/*
	 * Now, walk back down the PCI device tree until we return to our
	 * original handle. Assumes that everything between the PCI root
	 * bridge and the device we're looking for must be a P2P bridge.
	 */
	list_for_each_entry(node, &device_list, node) {
		acpi_handle hnd = node->handle;
		status = acpi_evaluate_integer(hnd, "_ADR", NULL, &adr);
		if (ACPI_FAILURE(status))
			goto out;
		dev = (adr >> 16) & 0xffff;
		fn  = adr & 0xffff;

		pdev = pci_get_slot(pbus, PCI_DEVFN(dev, fn));
313
		if (!pdev || hnd == handle)
314 315 316 317
			break;

		pbus = pdev->subordinate;
		pci_dev_put(pdev);
318 319 320 321 322 323 324 325 326 327 328

		/*
		 * This function may be called for a non-PCI device that has a
		 * PCI parent (eg. a disk under a PCI SATA controller).  In that
		 * case pdev->subordinate will be NULL for the parent.
		 */
		if (!pbus) {
			dev_dbg(&pdev->dev, "Not a PCI-to-PCI bridge\n");
			pdev = NULL;
			break;
		}
329 330 331 332 333 334 335 336 337
	}
out:
	list_for_each_entry_safe(node, tmp, &device_list, node)
		kfree(node);

	return pdev;
}
EXPORT_SYMBOL_GPL(acpi_get_pci_dev);

338
/**
339 340 341 342
 * acpi_pci_osc_control_set - Request control of PCI root _OSC features.
 * @handle: ACPI handle of a PCI root bridge (or PCIe Root Complex).
 * @mask: Mask of _OSC bits to request control of, place to store control mask.
 * @req: Mask of _OSC bits the control of is essential to the caller.
343
 *
344 345 346 347 348 349 350 351
 * Run _OSC query for @mask and if that is successful, compare the returned
 * mask of control bits with @req.  If all of the @req bits are set in the
 * returned mask, run _OSC request for it.
 *
 * The variable at the @mask address may be modified regardless of whether or
 * not the function returns success.  On success it will contain the mask of
 * _OSC bits the BIOS has granted control of, but its contents are meaningless
 * on failure.
352
 **/
353
acpi_status acpi_pci_osc_control_set(acpi_handle handle, u32 *mask, u32 req)
354
{
355
	struct acpi_pci_root *root;
356
	acpi_status status;
357
	u32 ctrl, capbuf[3];
358 359
	acpi_handle tmp;

360 361 362 363 364
	if (!mask)
		return AE_BAD_PARAMETER;

	ctrl = *mask & OSC_PCI_CONTROL_MASKS;
	if ((ctrl & req) != req)
365 366 367 368 369 370
		return AE_TYPE;

	root = acpi_pci_find_root(handle);
	if (!root)
		return AE_NOT_EXIST;

371 372 373 374
	status = acpi_get_handle(handle, "_OSC", &tmp);
	if (ACPI_FAILURE(status))
		return status;

375
	mutex_lock(&osc_lock);
376 377

	*mask = ctrl | root->osc_control_set;
378
	/* No need to evaluate _OSC if the control was already granted. */
379
	if ((root->osc_control_set & ctrl) == ctrl)
380 381
		goto out;

382 383 384 385 386 387 388 389 390
	/* Need to check the available controls bits before requesting them. */
	while (*mask) {
		status = acpi_pci_query_osc(root, root->osc_support_set, mask);
		if (ACPI_FAILURE(status))
			goto out;
		if (ctrl == *mask)
			break;
		ctrl = *mask;
	}
391

392
	if ((ctrl & req) != req) {
393 394 395 396 397 398
		status = AE_SUPPORT;
		goto out;
	}

	capbuf[OSC_QUERY_TYPE] = 0;
	capbuf[OSC_SUPPORT_TYPE] = root->osc_support_set;
399 400
	capbuf[OSC_CONTROL_TYPE] = ctrl;
	status = acpi_pci_run_osc(handle, capbuf, mask);
401
	if (ACPI_SUCCESS(status))
402
		root->osc_control_set = *mask;
403 404 405 406
out:
	mutex_unlock(&osc_lock);
	return status;
}
407
EXPORT_SYMBOL(acpi_pci_osc_control_set);
408

409 410
static int acpi_pci_root_add(struct acpi_device *device,
			     const struct acpi_device_id *not_used)
L
Linus Torvalds 已提交
411
{
412 413 414 415
	unsigned long long segment, bus;
	acpi_status status;
	int result;
	struct acpi_pci_root *root;
416
	struct acpi_pci_driver *driver;
417
	u32 flags, base_flags;
L
Linus Torvalds 已提交
418

419 420 421 422
	root = kzalloc(sizeof(struct acpi_pci_root), GFP_KERNEL);
	if (!root)
		return -ENOMEM;

423 424 425 426 427
	segment = 0;
	status = acpi_evaluate_integer(device->handle, METHOD_NAME__SEG, NULL,
				       &segment);
	if (ACPI_FAILURE(status) && status != AE_NOT_FOUND) {
		printk(KERN_ERR PREFIX "can't evaluate _SEG\n");
428 429
		result = -ENODEV;
		goto end;
430
	}
L
Linus Torvalds 已提交
431

432
	/* Check _CRS first, then _BBN.  If no _BBN, default to zero. */
433 434
	root->secondary.flags = IORESOURCE_BUS;
	status = try_get_root_bridge_busnr(device->handle, &root->secondary);
435
	if (ACPI_FAILURE(status)) {
436 437 438 439 440 441 442 443 444
		/*
		 * We need both the start and end of the downstream bus range
		 * to interpret _CBA (MMCONFIG base address), so it really is
		 * supposed to be in _CRS.  If we don't find it there, all we
		 * can do is assume [_BBN-0xFF] or [0-0xFF].
		 */
		root->secondary.end = 0xFF;
		printk(KERN_WARNING FW_BUG PREFIX
		       "no secondary bus range in _CRS\n");
J
Jon Mason 已提交
445 446
		status = acpi_evaluate_integer(device->handle, METHOD_NAME__BBN,
					       NULL, &bus);
447 448 449 450 451 452 453 454
		if (ACPI_SUCCESS(status))
			root->secondary.start = bus;
		else if (status == AE_NOT_FOUND)
			root->secondary.start = 0;
		else {
			printk(KERN_ERR PREFIX "can't evaluate _BBN\n");
			result = -ENODEV;
			goto end;
455 456
		}
	}
L
Linus Torvalds 已提交
457

458
	INIT_LIST_HEAD(&root->node);
459
	root->device = device;
460
	root->segment = segment & 0xFFFF;
L
Linus Torvalds 已提交
461 462
	strcpy(acpi_device_name(device), ACPI_PCI_ROOT_DEVICE_NAME);
	strcpy(acpi_device_class(device), ACPI_PCI_ROOT_CLASS);
463
	device->driver_data = root;
L
Linus Torvalds 已提交
464

465
	printk(KERN_INFO PREFIX "%s [%s] (domain %04x %pR)\n",
L
Len Brown 已提交
466
	       acpi_device_name(device), acpi_device_bid(device),
467
	       root->segment, &root->secondary);
L
Linus Torvalds 已提交
468

469
	root->mcfg_addr = acpi_pci_root_get_mcfg_addr(device->handle);
L
Linus Torvalds 已提交
470

471
	/*
472 473
	 * All supported architectures that use ACPI have support for
	 * PCI domains, so we indicate this in _OSC support capabilities.
474
	 */
475
	flags = base_flags = OSC_PCI_SEGMENT_GROUPS_SUPPORT;
476
	acpi_pci_osc_support(root, flags);
477

478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501
	/*
	 * TBD: Need PCI interface for enumeration/configuration of roots.
	 */

	mutex_lock(&acpi_pci_root_lock);
	list_add_tail(&root->node, &acpi_pci_roots);
	mutex_unlock(&acpi_pci_root_lock);

	/*
	 * Scan the Root Bridge
	 * --------------------
	 * Must do this prior to any attempt to bind the root device, as the
	 * PCI namespace does not get created until this call is made (and
	 * thus the root bridge's pci_dev does not exist).
	 */
	root->bus = pci_acpi_scan_root(root);
	if (!root->bus) {
		printk(KERN_ERR PREFIX
			    "Bus %04x:%02x not present in PCI namespace\n",
			    root->segment, (unsigned int)root->secondary.start);
		result = -ENODEV;
		goto out_del_root;
	}

502
	/* Indicate support for various _OSC capabilities. */
503
	if (pci_ext_cfg_avail())
504
		flags |= OSC_EXT_PCI_CONFIG_SUPPORT;
505
	if (pcie_aspm_support_enabled()) {
506
		flags |= OSC_ACTIVE_STATE_PWR_SUPPORT |
507 508
		OSC_CLOCK_PWR_CAPABILITY_SUPPORT;
	}
509 510
	if (pci_msi_enabled())
		flags |= OSC_MSI_SUPPORT;
511 512 513
	if (flags != base_flags) {
		status = acpi_pci_osc_support(root, flags);
		if (ACPI_FAILURE(status)) {
514
			dev_info(&device->dev, "ACPI _OSC support "
515 516 517 518 519
				"notification failed, disabling PCIe ASPM\n");
			pcie_no_aspm();
			flags = base_flags;
		}
	}
520

521 522 523 524 525 526 527 528
	if (!pcie_ports_disabled
	    && (flags & ACPI_PCIE_REQ_SUPPORT) == ACPI_PCIE_REQ_SUPPORT) {
		flags = OSC_PCI_EXPRESS_CAP_STRUCTURE_CONTROL
			| OSC_PCI_EXPRESS_NATIVE_HP_CONTROL
			| OSC_PCI_EXPRESS_PME_CONTROL;

		if (pci_aer_available()) {
			if (aer_acpi_firmware_first())
529
				dev_dbg(&device->dev,
530 531 532 533 534
					"PCIe errors handled by BIOS.\n");
			else
				flags |= OSC_PCI_EXPRESS_AER_CONTROL;
		}

535
		dev_info(&device->dev,
536 537 538
			"Requesting ACPI _OSC control (0x%02x)\n", flags);

		status = acpi_pci_osc_control_set(device->handle, &flags,
539
				       OSC_PCI_EXPRESS_CAP_STRUCTURE_CONTROL);
540
		if (ACPI_SUCCESS(status)) {
541
			dev_info(&device->dev,
542
				"ACPI _OSC control (0x%02x) granted\n", flags);
543 544 545 546 547 548 549
			if (acpi_gbl_FADT.boot_flags & ACPI_FADT_NO_ASPM) {
				/*
				 * We have ASPM control, but the FADT indicates
				 * that it's unsupported. Clear it.
				 */
				pcie_clear_aspm(root->bus);
			}
550
		} else {
551
			dev_info(&device->dev,
552 553 554
				"ACPI _OSC request failed (%s), "
				"returned control mask: 0x%02x\n",
				acpi_format_exception(status), flags);
555 556 557
			pr_info("ACPI _OSC control for PCIe not granted, "
				"disabling ASPM\n");
			pcie_no_aspm();
558
		}
559
	} else {
560
		dev_info(&device->dev,
561 562
			 "Unable to request _OSC control "
			 "(_OSC support mask: 0x%02x)\n", flags);
563 564
	}

565 566 567 568
	pci_acpi_add_bus_pm_notifier(device, root->bus);
	if (device->wakeup.flags.run_wake)
		device_set_run_wake(root->bus->bridge, true);

569 570
	if (system_state != SYSTEM_BOOTING) {
		pcibios_resource_survey_bus(root->bus);
571
		pci_assign_unassigned_bus_resources(root->bus);
572
	}
573

574
	mutex_lock(&acpi_pci_root_lock);
575 576
	list_for_each_entry(driver, &acpi_pci_drivers, node)
		if (driver->add)
577
			driver->add(root);
578
	mutex_unlock(&acpi_pci_root_lock);
579

580 581 582 583
	/* need to after hot-added ioapic is registered */
	if (system_state != SYSTEM_BOOTING)
		pci_enable_bridges(root->bus);

584
	pci_bus_add_devices(root->bus);
585
	return 1;
586 587 588 589 590 591 592 593 594

out_del_root:
	mutex_lock(&acpi_pci_root_lock);
	list_del(&root->node);
	mutex_unlock(&acpi_pci_root_lock);

end:
	kfree(root);
	return result;
595
}
L
Linus Torvalds 已提交
596

597
static void acpi_pci_root_remove(struct acpi_device *device)
L
Linus Torvalds 已提交
598
{
599
	struct acpi_pci_root *root = acpi_driver_data(device);
600 601
	struct acpi_pci_driver *driver;

602 603
	pci_stop_root_bus(root->bus);

604
	mutex_lock(&acpi_pci_root_lock);
605
	list_for_each_entry_reverse(driver, &acpi_pci_drivers, node)
606
		if (driver->remove)
607
			driver->remove(root);
608
	mutex_unlock(&acpi_pci_root_lock);
L
Linus Torvalds 已提交
609

610 611 612
	device_set_run_wake(root->bus->bridge, false);
	pci_acpi_remove_bus_pm_notifier(device);

613 614 615
	pci_remove_root_bus(root->bus);

	mutex_lock(&acpi_pci_root_lock);
616 617
	list_del(&root->node);
	mutex_unlock(&acpi_pci_root_lock);
L
Linus Torvalds 已提交
618 619 620
	kfree(root);
}

621
void __init acpi_pci_root_init(void)
L
Linus Torvalds 已提交
622
{
623 624
	acpi_hest_init();

625 626 627 628
	if (!acpi_pci_disabled) {
		pci_acpi_crs_quirks();
		acpi_scan_add_handler(&pci_root_handler);
	}
L
Linus Torvalds 已提交
629
}
630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646
/* Support root bridge hotplug */

static void handle_root_bridge_insertion(acpi_handle handle)
{
	struct acpi_device *device;

	if (!acpi_bus_get_device(handle, &device)) {
		printk(KERN_DEBUG "acpi device exists...\n");
		return;
	}

	if (acpi_bus_scan(handle))
		printk(KERN_ERR "cannot add bridge to acpi list\n");
}

static void handle_root_bridge_removal(struct acpi_device *device)
{
647
	acpi_status status;
648 649 650 651 652 653 654 655 656 657 658 659 660 661 662
	struct acpi_eject_event *ej_event;

	ej_event = kmalloc(sizeof(*ej_event), GFP_KERNEL);
	if (!ej_event) {
		/* Inform firmware the hot-remove operation has error */
		(void) acpi_evaluate_hotplug_ost(device->handle,
					ACPI_NOTIFY_EJECT_REQUEST,
					ACPI_OST_SC_NON_SPECIFIC_FAILURE,
					NULL);
		return;
	}

	ej_event->device = device;
	ej_event->event = ACPI_NOTIFY_EJECT_REQUEST;

663 664 665
	status = acpi_os_hotplug_execute(acpi_bus_hot_remove_device, ej_event);
	if (ACPI_FAILURE(status))
		kfree(ej_event);
666 667 668 669 670 671 672 673 674 675 676 677 678 679
}

static void _handle_hotplug_event_root(struct work_struct *work)
{
	struct acpi_pci_root *root;
	struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER };
	struct acpi_hp_work *hp_work;
	acpi_handle handle;
	u32 type;

	hp_work = container_of(work, struct acpi_hp_work, work);
	handle = hp_work->handle;
	type = hp_work->type;

680
	acpi_scan_lock_acquire();
681

682
	root = acpi_pci_find_root(handle);
683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715
	acpi_get_name(handle, ACPI_FULL_PATHNAME, &buffer);

	switch (type) {
	case ACPI_NOTIFY_BUS_CHECK:
		/* bus enumerate */
		printk(KERN_DEBUG "%s: Bus check notify on %s\n", __func__,
				 (char *)buffer.pointer);
		if (!root)
			handle_root_bridge_insertion(handle);

		break;

	case ACPI_NOTIFY_DEVICE_CHECK:
		/* device check */
		printk(KERN_DEBUG "%s: Device check notify on %s\n", __func__,
				 (char *)buffer.pointer);
		if (!root)
			handle_root_bridge_insertion(handle);
		break;

	case ACPI_NOTIFY_EJECT_REQUEST:
		/* request device eject */
		printk(KERN_DEBUG "%s: Device eject notify on %s\n", __func__,
				 (char *)buffer.pointer);
		if (root)
			handle_root_bridge_removal(root->device);
		break;
	default:
		printk(KERN_WARNING "notify_handler: unknown event type 0x%x for %s\n",
				 type, (char *)buffer.pointer);
		break;
	}

716
	acpi_scan_lock_release();
717 718 719 720 721 722 723 724 725 726 727 728 729 730
	kfree(hp_work); /* allocated in handle_hotplug_event_bridge */
	kfree(buffer.pointer);
}

static void handle_hotplug_event_root(acpi_handle handle, u32 type,
					void *context)
{
	alloc_acpi_hp_work(handle, type, context,
				_handle_hotplug_event_root);
}

static acpi_status __init
find_root_bridges(acpi_handle handle, u32 lvl, void *context, void **rv)
{
731
	acpi_status status;
732 733 734 735 736 737 738 739 740 741 742 743
	char objname[64];
	struct acpi_buffer buffer = { .length = sizeof(objname),
				      .pointer = objname };
	int *count = (int *)context;

	if (!acpi_is_root_bridge(handle))
		return AE_OK;

	(*count)++;

	acpi_get_name(handle, ACPI_FULL_PATHNAME, &buffer);

744 745 746 747 748 749 750 751
	status = acpi_install_notify_handler(handle, ACPI_SYSTEM_NOTIFY,
					handle_hotplug_event_root, NULL);
	if (ACPI_FAILURE(status))
		printk(KERN_DEBUG "acpi root: %s notify handler is not installed, exit status: %u\n",
				  objname, (unsigned int)status);
	else
		printk(KERN_DEBUG "acpi root: %s notify handler is installed\n",
				 objname);
752 753 754 755 756 757 758 759 760 761 762 763 764

	return AE_OK;
}

void __init acpi_pci_root_hp_init(void)
{
	int num = 0;

	acpi_walk_namespace(ACPI_TYPE_DEVICE, ACPI_ROOT_OBJECT,
		ACPI_UINT32_MAX, find_root_bridges, NULL, &num, NULL);

	printk(KERN_DEBUG "Found %d acpi root devices\n", num);
}