pci-driver.c 34.9 KB
Newer Older
L
Linus Torvalds 已提交
1 2 3
/*
 * drivers/pci/pci-driver.c
 *
4 5 6 7 8
 * (C) Copyright 2002-2004, 2007 Greg Kroah-Hartman <greg@kroah.com>
 * (C) Copyright 2007 Novell Inc.
 *
 * Released under the GPL v2 only.
 *
L
Linus Torvalds 已提交
9 10 11 12 13 14
 */

#include <linux/pci.h>
#include <linux/module.h>
#include <linux/init.h>
#include <linux/device.h>
15
#include <linux/mempolicy.h>
T
Tim Schmielau 已提交
16 17
#include <linux/string.h>
#include <linux/slab.h>
18
#include <linux/sched.h>
19
#include <linux/cpu.h>
20
#include <linux/pm_runtime.h>
21
#include <linux/suspend.h>
22
#include <linux/kexec.h>
L
Linus Torvalds 已提交
23 24
#include "pci.h"

25 26 27 28
struct pci_dynid {
	struct list_head node;
	struct pci_device_id id;
};
L
Linus Torvalds 已提交
29

T
Tejun Heo 已提交
30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69
/**
 * pci_add_dynid - add a new PCI device ID to this driver and re-probe devices
 * @drv: target pci driver
 * @vendor: PCI vendor ID
 * @device: PCI device ID
 * @subvendor: PCI subvendor ID
 * @subdevice: PCI subdevice ID
 * @class: PCI class
 * @class_mask: PCI class mask
 * @driver_data: private driver data
 *
 * Adds a new dynamic pci device ID to this driver and causes the
 * driver to probe for all devices again.  @drv must have been
 * registered prior to calling this function.
 *
 * CONTEXT:
 * Does GFP_KERNEL allocation.
 *
 * RETURNS:
 * 0 on success, -errno on failure.
 */
int pci_add_dynid(struct pci_driver *drv,
		  unsigned int vendor, unsigned int device,
		  unsigned int subvendor, unsigned int subdevice,
		  unsigned int class, unsigned int class_mask,
		  unsigned long driver_data)
{
	struct pci_dynid *dynid;

	dynid = kzalloc(sizeof(*dynid), GFP_KERNEL);
	if (!dynid)
		return -ENOMEM;

	dynid->id.vendor = vendor;
	dynid->id.device = device;
	dynid->id.subvendor = subvendor;
	dynid->id.subdevice = subdevice;
	dynid->id.class = class;
	dynid->id.class_mask = class_mask;
	dynid->id.driver_data = driver_data;
70

T
Tejun Heo 已提交
71 72 73 74
	spin_lock(&drv->dynids.lock);
	list_add_tail(&dynid->node, &drv->dynids.list);
	spin_unlock(&drv->dynids.lock);

75
	return driver_attach(&drv->driver);
T
Tejun Heo 已提交
76
}
77
EXPORT_SYMBOL_GPL(pci_add_dynid);
T
Tejun Heo 已提交
78 79 80 81

static void pci_free_dynids(struct pci_driver *drv)
{
	struct pci_dynid *dynid, *n;
82

T
Tejun Heo 已提交
83 84 85 86 87 88 89 90
	spin_lock(&drv->dynids.lock);
	list_for_each_entry_safe(dynid, n, &drv->dynids.list, node) {
		list_del(&dynid->node);
		kfree(dynid);
	}
	spin_unlock(&drv->dynids.lock);
}

L
Linus Torvalds 已提交
91
/**
T
Tejun Heo 已提交
92
 * store_new_id - sysfs frontend to pci_add_dynid()
R
Randy Dunlap 已提交
93 94 95
 * @driver: target device driver
 * @buf: buffer for scanning device ID data
 * @count: input size
L
Linus Torvalds 已提交
96
 *
T
Tejun Heo 已提交
97
 * Allow PCI IDs to be added to an existing driver via sysfs.
L
Linus Torvalds 已提交
98
 */
R
Ryan Desfosses 已提交
99 100
static ssize_t store_new_id(struct device_driver *driver, const char *buf,
			    size_t count)
L
Linus Torvalds 已提交
101 102
{
	struct pci_driver *pdrv = to_pci_driver(driver);
103
	const struct pci_device_id *ids = pdrv->id_table;
R
Ryan Desfosses 已提交
104 105 106 107
	__u32 vendor, device, subvendor = PCI_ANY_ID,
		subdevice = PCI_ANY_ID, class = 0, class_mask = 0;
	unsigned long driver_data = 0;
	int fields = 0;
108
	int retval = 0;
L
Linus Torvalds 已提交
109

110
	fields = sscanf(buf, "%x %x %x %x %x %x %lx",
L
Linus Torvalds 已提交
111 112
			&vendor, &device, &subvendor, &subdevice,
			&class, &class_mask, &driver_data);
113
	if (fields < 2)
L
Linus Torvalds 已提交
114 115
		return -EINVAL;

116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135
	if (fields != 7) {
		struct pci_dev *pdev = kzalloc(sizeof(*pdev), GFP_KERNEL);
		if (!pdev)
			return -ENOMEM;

		pdev->vendor = vendor;
		pdev->device = device;
		pdev->subsystem_vendor = subvendor;
		pdev->subsystem_device = subdevice;
		pdev->class = class;

		if (pci_match_id(pdrv->id_table, pdev))
			retval = -EEXIST;

		kfree(pdev);

		if (retval)
			return retval;
	}

136 137
	/* Only accept driver_data values that match an existing id_table
	   entry */
138 139 140 141 142 143 144 145
	if (ids) {
		retval = -EINVAL;
		while (ids->vendor || ids->subvendor || ids->class_mask) {
			if (driver_data == ids->driver_data) {
				retval = 0;
				break;
			}
			ids++;
146
		}
147 148
		if (retval)	/* No match */
			return retval;
149 150
	}

T
Tejun Heo 已提交
151 152
	retval = pci_add_dynid(pdrv, vendor, device, subvendor, subdevice,
			       class, class_mask, driver_data);
153 154
	if (retval)
		return retval;
L
Linus Torvalds 已提交
155 156
	return count;
}
157
static DRIVER_ATTR(new_id, S_IWUSR, NULL, store_new_id);
L
Linus Torvalds 已提交
158

C
Chris Wright 已提交
159 160 161 162 163 164 165 166
/**
 * store_remove_id - remove a PCI device ID from this driver
 * @driver: target device driver
 * @buf: buffer for scanning device ID data
 * @count: input size
 *
 * Removes a dynamic pci device ID to this driver.
 */
R
Ryan Desfosses 已提交
167 168
static ssize_t store_remove_id(struct device_driver *driver, const char *buf,
			       size_t count)
C
Chris Wright 已提交
169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202
{
	struct pci_dynid *dynid, *n;
	struct pci_driver *pdrv = to_pci_driver(driver);
	__u32 vendor, device, subvendor = PCI_ANY_ID,
		subdevice = PCI_ANY_ID, class = 0, class_mask = 0;
	int fields = 0;
	int retval = -ENODEV;

	fields = sscanf(buf, "%x %x %x %x %x %x",
			&vendor, &device, &subvendor, &subdevice,
			&class, &class_mask);
	if (fields < 2)
		return -EINVAL;

	spin_lock(&pdrv->dynids.lock);
	list_for_each_entry_safe(dynid, n, &pdrv->dynids.list, node) {
		struct pci_device_id *id = &dynid->id;
		if ((id->vendor == vendor) &&
		    (id->device == device) &&
		    (subvendor == PCI_ANY_ID || id->subvendor == subvendor) &&
		    (subdevice == PCI_ANY_ID || id->subdevice == subdevice) &&
		    !((id->class ^ class) & class_mask)) {
			list_del(&dynid->node);
			kfree(dynid);
			retval = 0;
			break;
		}
	}
	spin_unlock(&pdrv->dynids.lock);

	if (retval)
		return retval;
	return count;
}
203
static DRIVER_ATTR(remove_id, S_IWUSR, NULL, store_remove_id);
C
Chris Wright 已提交
204

205 206 207 208
static struct attribute *pci_drv_attrs[] = {
	&driver_attr_new_id.attr,
	&driver_attr_remove_id.attr,
	NULL,
209
};
210
ATTRIBUTE_GROUPS(pci_drv);
C
Chris Wright 已提交
211

L
Linus Torvalds 已提交
212
/**
213
 * pci_match_id - See if a pci device matches a given pci_id table
L
Linus Torvalds 已提交
214
 * @ids: array of PCI device id structures to search in
215 216
 * @dev: the PCI device structure to match against.
 *
L
Linus Torvalds 已提交
217
 * Used by a driver to check whether a PCI device present in the
218
 * system is in its list of supported devices.  Returns the matching
L
Linus Torvalds 已提交
219
 * pci_device_id structure or %NULL if there is no match.
220
 *
R
Randy Dunlap 已提交
221
 * Deprecated, don't use this as it will not catch any dynamic ids
222
 * that a driver might want to check for.
L
Linus Torvalds 已提交
223
 */
224 225
const struct pci_device_id *pci_match_id(const struct pci_device_id *ids,
					 struct pci_dev *dev)
L
Linus Torvalds 已提交
226
{
227 228 229 230 231 232
	if (ids) {
		while (ids->vendor || ids->subvendor || ids->class_mask) {
			if (pci_match_one_device(ids, dev))
				return ids;
			ids++;
		}
L
Linus Torvalds 已提交
233 234 235
	}
	return NULL;
}
236
EXPORT_SYMBOL(pci_match_id);
L
Linus Torvalds 已提交
237

238 239 240 241 242 243 244
static const struct pci_device_id pci_device_id_any = {
	.vendor = PCI_ANY_ID,
	.device = PCI_ANY_ID,
	.subvendor = PCI_ANY_ID,
	.subdevice = PCI_ANY_ID,
};

L
Linus Torvalds 已提交
245
/**
R
Randy Dunlap 已提交
246
 * pci_match_device - Tell if a PCI device structure has a matching PCI device id structure
247
 * @drv: the PCI driver to match against
248
 * @dev: the PCI device structure to match against
249 250 251 252
 *
 * Used by a driver to check whether a PCI device present in the
 * system is in its list of supported devices.  Returns the matching
 * pci_device_id structure or %NULL if there is no match.
L
Linus Torvalds 已提交
253
 */
A
Adrian Bunk 已提交
254 255
static const struct pci_device_id *pci_match_device(struct pci_driver *drv,
						    struct pci_dev *dev)
256 257
{
	struct pci_dynid *dynid;
258 259 260 261 262
	const struct pci_device_id *found_id = NULL;

	/* When driver_override is set, only bind to the matching driver */
	if (dev->driver_override && strcmp(dev->driver_override, drv->name))
		return NULL;
L
Linus Torvalds 已提交
263

264
	/* Look at the dynamic ids first, before the static ones */
265 266 267
	spin_lock(&drv->dynids.lock);
	list_for_each_entry(dynid, &drv->dynids.list, node) {
		if (pci_match_one_device(&dynid->id, dev)) {
268 269
			found_id = &dynid->id;
			break;
270
		}
L
Linus Torvalds 已提交
271
	}
272
	spin_unlock(&drv->dynids.lock);
273

274 275 276 277 278 279 280 281
	if (!found_id)
		found_id = pci_match_id(drv->id_table, dev);

	/* driver_override will always match, send a dummy id */
	if (!found_id && dev->driver_override)
		found_id = &pci_device_id_any;

	return found_id;
L
Linus Torvalds 已提交
282 283
}

284 285 286 287 288 289 290 291 292
struct drv_dev_and_id {
	struct pci_driver *drv;
	struct pci_dev *dev;
	const struct pci_device_id *id;
};

static long local_pci_probe(void *_ddi)
{
	struct drv_dev_and_id *ddi = _ddi;
293 294 295
	struct pci_dev *pci_dev = ddi->dev;
	struct pci_driver *pci_drv = ddi->drv;
	struct device *dev = &pci_dev->dev;
296 297
	int rc;

298 299 300 301 302 303 304
	/*
	 * Unbound PCI devices are always put in D0, regardless of
	 * runtime PM status.  During probe, the device is set to
	 * active and the usage count is incremented.  If the driver
	 * supports runtime PM, it should call pm_runtime_put_noidle()
	 * in its probe routine and pm_runtime_get_noresume() in its
	 * remove routine.
305
	 */
306 307 308
	pm_runtime_get_sync(dev);
	pci_dev->driver = pci_drv;
	rc = pci_drv->probe(pci_dev, ddi->id);
309 310 311
	if (!rc)
		return rc;
	if (rc < 0) {
312 313
		pci_dev->driver = NULL;
		pm_runtime_put_sync(dev);
314
		return rc;
315
	}
316 317 318 319 320 321
	/*
	 * Probe function should return < 0 for failure, 0 for success
	 * Treat values > 0 as success, but warn.
	 */
	dev_warn(dev, "Driver probe function unexpectedly returned %d\n", rc);
	return 0;
322 323
}

324 325 326
static int pci_call_probe(struct pci_driver *drv, struct pci_dev *dev,
			  const struct pci_device_id *id)
{
327 328 329
	int error, node;
	struct drv_dev_and_id ddi = { drv, dev, id };

330 331 332 333 334
	/*
	 * Execute driver initialization on node where the device is
	 * attached.  This way the driver likely allocates its local memory
	 * on the right node.
	 */
335
	node = dev_to_node(&dev->dev);
336 337 338 339 340 341 342 343 344 345 346 347 348 349 350

	/*
	 * On NUMA systems, we are likely to call a PF probe function using
	 * work_on_cpu().  If that probe calls pci_enable_sriov() (which
	 * adds the VF devices via pci_bus_add_device()), we may re-enter
	 * this function to call the VF probe function.  Calling
	 * work_on_cpu() again will cause a lockdep warning.  Since VFs are
	 * always on the same node as the PF, we can work around this by
	 * avoiding work_on_cpu() when we're already on the correct node.
	 *
	 * Preemption is enabled, so it's theoretically unsafe to use
	 * numa_node_id(), but even if we run the probe function on the
	 * wrong node, it should be functionally correct.
	 */
	if (node >= 0 && node != numa_node_id()) {
351 352 353
		int cpu;

		get_online_cpus();
354
		cpu = cpumask_any_and(cpumask_of_node(node), cpu_online_mask);
355 356 357 358 359 360 361
		if (cpu < nr_cpu_ids)
			error = work_on_cpu(cpu, local_pci_probe, &ddi);
		else
			error = local_pci_probe(&ddi);
		put_online_cpus();
	} else
		error = local_pci_probe(&ddi);
362

363 364 365
	return error;
}

L
Linus Torvalds 已提交
366
/**
367
 * __pci_device_probe - check if a driver wants to claim a specific PCI device
R
Randy Dunlap 已提交
368 369
 * @drv: driver to call to check if it wants the PCI device
 * @pci_dev: PCI device being probed
370
 *
R
Randy Dunlap 已提交
371
 * returns 0 on success, else error.
L
Linus Torvalds 已提交
372 373
 * side-effect: pci_dev->driver is set to drv when drv claims pci_dev.
 */
R
Ryan Desfosses 已提交
374
static int __pci_device_probe(struct pci_driver *drv, struct pci_dev *pci_dev)
375 376
{
	const struct pci_device_id *id;
L
Linus Torvalds 已提交
377 378 379
	int error = 0;

	if (!pci_dev->driver && drv->probe) {
380 381 382 383
		error = -ENODEV;

		id = pci_match_device(drv, pci_dev);
		if (id)
384
			error = pci_call_probe(drv, pci_dev, id);
385
		if (error >= 0)
386
			error = 0;
L
Linus Torvalds 已提交
387 388 389 390
	}
	return error;
}

391 392 393 394 395 396 397 398 399
int __weak pcibios_alloc_irq(struct pci_dev *dev)
{
	return 0;
}

void __weak pcibios_free_irq(struct pci_dev *dev)
{
}

R
Ryan Desfosses 已提交
400
static int pci_device_probe(struct device *dev)
L
Linus Torvalds 已提交
401
{
402 403 404 405 406 407 408
	int error;
	struct pci_dev *pci_dev = to_pci_dev(dev);
	struct pci_driver *drv = to_pci_driver(dev->driver);

	error = pcibios_alloc_irq(pci_dev);
	if (error < 0)
		return error;
L
Linus Torvalds 已提交
409 410 411

	pci_dev_get(pci_dev);
	error = __pci_device_probe(drv, pci_dev);
412 413
	if (error) {
		pcibios_free_irq(pci_dev);
L
Linus Torvalds 已提交
414
		pci_dev_put(pci_dev);
415
	}
L
Linus Torvalds 已提交
416 417 418 419

	return error;
}

R
Ryan Desfosses 已提交
420
static int pci_device_remove(struct device *dev)
L
Linus Torvalds 已提交
421
{
R
Ryan Desfosses 已提交
422 423
	struct pci_dev *pci_dev = to_pci_dev(dev);
	struct pci_driver *drv = pci_dev->driver;
L
Linus Torvalds 已提交
424 425

	if (drv) {
426 427
		if (drv->remove) {
			pm_runtime_get_sync(dev);
L
Linus Torvalds 已提交
428
			drv->remove(pci_dev);
429 430
			pm_runtime_put_noidle(dev);
		}
431
		pcibios_free_irq(pci_dev);
L
Linus Torvalds 已提交
432 433 434
		pci_dev->driver = NULL;
	}

435
	/* Undo the runtime PM settings in local_pci_probe() */
436
	pm_runtime_put_sync(dev);
437

438 439 440 441 442 443 444
	/*
	 * If the device is still on, set the power state as "unknown",
	 * since it might change by the next time we load the driver.
	 */
	if (pci_dev->current_state == PCI_D0)
		pci_dev->current_state = PCI_UNKNOWN;

L
Linus Torvalds 已提交
445 446 447 448
	/*
	 * We would love to complain here if pci_dev->is_enabled is set, that
	 * the driver should have called pci_disable_device(), but the
	 * unfortunate fact is there are too many odd BIOS and bridge setups
449
	 * that don't like drivers doing that all of the time.
L
Linus Torvalds 已提交
450 451 452 453 454 455 456 457
	 * Oh well, we can dream of sane hardware when we sleep, no matter how
	 * horrible the crap we have to deal with is when we are awake...
	 */

	pci_dev_put(pci_dev);
	return 0;
}

458 459 460 461 462
static void pci_device_shutdown(struct device *dev)
{
	struct pci_dev *pci_dev = to_pci_dev(dev);
	struct pci_driver *drv = pci_dev->driver;

H
Huang Ying 已提交
463 464
	pm_runtime_resume(dev);

465 466 467 468
	if (drv && drv->shutdown)
		drv->shutdown(pci_dev);
	pci_msi_shutdown(pci_dev);
	pci_msix_shutdown(pci_dev);
469

470
#ifdef CONFIG_KEXEC
471
	/*
472 473 474 475 476
	 * If this is a kexec reboot, turn off Bus Master bit on the
	 * device to tell it to not continue to do DMA. Don't touch
	 * devices in D3cold or unknown states.
	 * If it is not a kexec reboot, firmware will hit the PCI
	 * devices with big hammer and stop their DMA any way.
477
	 */
478
	if (kexec_in_progress && (pci_dev->current_state <= PCI_D3hot))
479
		pci_clear_master(pci_dev);
480
#endif
481 482
}

R
Rafael J. Wysocki 已提交
483
#ifdef CONFIG_PM
484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500

/* Auxiliary functions used for system resume and run-time resume. */

/**
 * pci_restore_standard_config - restore standard config registers of PCI device
 * @pci_dev: PCI device to handle
 */
static int pci_restore_standard_config(struct pci_dev *pci_dev)
{
	pci_update_current_state(pci_dev, PCI_UNKNOWN);

	if (pci_dev->current_state != PCI_D0) {
		int error = pci_set_power_state(pci_dev, PCI_D0);
		if (error)
			return error;
	}

501 502
	pci_restore_state(pci_dev);
	return 0;
503 504
}

505 506 507 508
#endif

#ifdef CONFIG_PM_SLEEP

509 510
static void pci_pm_default_resume_early(struct pci_dev *pci_dev)
{
511 512
	pci_power_up(pci_dev);
	pci_restore_state(pci_dev);
513 514 515
	pci_fixup_device(pci_fixup_resume_early, pci_dev);
}

516 517 518
/*
 * Default "suspend" method for devices that have no driver provided suspend,
 * or not even a driver at all (second part).
519
 */
520
static void pci_pm_set_unknown_state(struct pci_dev *pci_dev)
521 522 523 524 525 526 527 528 529
{
	/*
	 * mark its power state as "unknown", since we don't know if
	 * e.g. the BIOS will change its device state when we suspend.
	 */
	if (pci_dev->current_state == PCI_D0)
		pci_dev->current_state = PCI_UNKNOWN;
}

530 531 532 533
/*
 * Default "resume" method for devices that have no driver provided resume,
 * or not even a driver at all (second part).
 */
534
static int pci_pm_reenable_device(struct pci_dev *pci_dev)
535 536 537
{
	int retval;

538 539 540 541 542 543 544 545 546 547 548 549 550
	/* if the device was enabled before suspend, reenable */
	retval = pci_reenable_device(pci_dev);
	/*
	 * if the device was busmaster before the suspend, make it busmaster
	 * again
	 */
	if (pci_dev->is_busmaster)
		pci_set_master(pci_dev);

	return retval;
}

static int pci_legacy_suspend(struct device *dev, pm_message_t state)
L
Linus Torvalds 已提交
551
{
R
Ryan Desfosses 已提交
552 553
	struct pci_dev *pci_dev = to_pci_dev(dev);
	struct pci_driver *drv = pci_dev->driver;
554

555
	if (drv && drv->suspend) {
556
		pci_power_t prev = pci_dev->current_state;
557
		int error;
558

559 560 561 562
		error = drv->suspend(pci_dev, state);
		suspend_report_result(drv->suspend, error);
		if (error)
			return error;
563

564
		if (!pci_dev->state_saved && pci_dev->current_state != PCI_D0
565 566 567 568 569
		    && pci_dev->current_state != PCI_UNKNOWN) {
			WARN_ONCE(pci_dev->current_state != prev,
				"PCI PM: Device state not saved by %pF\n",
				drv->suspend);
		}
570
	}
571 572 573

	pci_fixup_device(pci_fixup_suspend, pci_dev);

574
	return 0;
L
Linus Torvalds 已提交
575 576
}

577
static int pci_legacy_suspend_late(struct device *dev, pm_message_t state)
L
Linus Torvalds 已提交
578
{
R
Ryan Desfosses 已提交
579 580
	struct pci_dev *pci_dev = to_pci_dev(dev);
	struct pci_driver *drv = pci_dev->driver;
L
Linus Torvalds 已提交
581 582

	if (drv && drv->suspend_late) {
583 584 585
		pci_power_t prev = pci_dev->current_state;
		int error;

586 587
		error = drv->suspend_late(pci_dev, state);
		suspend_report_result(drv->suspend_late, error);
588 589 590 591 592 593 594 595
		if (error)
			return error;

		if (!pci_dev->state_saved && pci_dev->current_state != PCI_D0
		    && pci_dev->current_state != PCI_UNKNOWN) {
			WARN_ONCE(pci_dev->current_state != prev,
				"PCI PM: Device state not saved by %pF\n",
				drv->suspend_late);
596
			goto Fixup;
597
		}
L
Linus Torvalds 已提交
598
	}
599 600 601 602 603 604

	if (!pci_dev->state_saved)
		pci_save_state(pci_dev);

	pci_pm_set_unknown_state(pci_dev);

605 606 607
Fixup:
	pci_fixup_device(pci_fixup_suspend_late, pci_dev);

608
	return 0;
L
Linus Torvalds 已提交
609
}
L
Linus Torvalds 已提交
610

611 612
static int pci_legacy_resume_early(struct device *dev)
{
R
Ryan Desfosses 已提交
613 614
	struct pci_dev *pci_dev = to_pci_dev(dev);
	struct pci_driver *drv = pci_dev->driver;
615

616 617
	return drv && drv->resume_early ?
			drv->resume_early(pci_dev) : 0;
618 619
}

620
static int pci_legacy_resume(struct device *dev)
L
Linus Torvalds 已提交
621
{
R
Ryan Desfosses 已提交
622 623
	struct pci_dev *pci_dev = to_pci_dev(dev);
	struct pci_driver *drv = pci_dev->driver;
L
Linus Torvalds 已提交
624

625 626
	pci_fixup_device(pci_fixup_resume, pci_dev);

627 628
	return drv && drv->resume ?
			drv->resume(pci_dev) : pci_pm_reenable_device(pci_dev);
L
Linus Torvalds 已提交
629 630
}

631 632
/* Auxiliary functions used by the new power management framework */

633
static void pci_pm_default_resume(struct pci_dev *pci_dev)
634
{
635 636
	pci_fixup_device(pci_fixup_resume, pci_dev);

637
	if (!pci_has_subordinate(pci_dev))
638
		pci_enable_wake(pci_dev, PCI_D0, false);
639 640
}

641
static void pci_pm_default_suspend(struct pci_dev *pci_dev)
642
{
643
	/* Disable non-bridge devices without PM support */
644
	if (!pci_has_subordinate(pci_dev))
645
		pci_disable_enabled_device(pci_dev);
646 647
}

648 649 650
static bool pci_has_legacy_pm_support(struct pci_dev *pci_dev)
{
	struct pci_driver *drv = pci_dev->driver;
651
	bool ret = drv && (drv->suspend || drv->suspend_late || drv->resume
652
		|| drv->resume_early);
653 654 655 656 657 658

	/*
	 * Legacy PM support is used by default, so warn if the new framework is
	 * supported as well.  Drivers are supposed to support either the
	 * former, or the latter, but not both at the same time.
	 */
659 660
	WARN(ret && drv->driver.pm, "driver %s device %04x:%04x\n",
		drv->name, pci_dev->vendor, pci_dev->device);
661 662

	return ret;
663 664
}

665 666
/* New power management framework */

667 668 669 670
static int pci_pm_prepare(struct device *dev)
{
	struct device_driver *drv = dev->driver;

671
	/*
672 673
	 * Devices having power.ignore_children set may still be necessary for
	 * suspending their children in the next phase of device suspend.
674
	 */
675 676
	if (dev->power.ignore_children)
		pm_runtime_resume(dev);
677

678 679 680 681 682 683
	if (drv && drv->pm && drv->pm->prepare) {
		int error = drv->pm->prepare(dev);
		if (error)
			return error;
	}
	return pci_dev_keep_suspended(to_pci_dev(dev));
684 685 686
}


687 688 689 690 691 692
#else /* !CONFIG_PM_SLEEP */

#define pci_pm_prepare	NULL

#endif /* !CONFIG_PM_SLEEP */

693 694 695 696 697
#ifdef CONFIG_SUSPEND

static int pci_pm_suspend(struct device *dev)
{
	struct pci_dev *pci_dev = to_pci_dev(dev);
698
	const struct dev_pm_ops *pm = dev->driver ? dev->driver->pm : NULL;
699

700 701
	if (pci_has_legacy_pm_support(pci_dev))
		return pci_legacy_suspend(dev, PMSG_SUSPEND);
702

703 704 705 706 707
	if (!pm) {
		pci_pm_default_suspend(pci_dev);
		goto Fixup;
	}

708 709 710 711 712 713 714 715 716 717
	/*
	 * PCI devices suspended at run time need to be resumed at this point,
	 * because in general it is necessary to reconfigure them for system
	 * suspend.  Namely, if the device is supposed to wake up the system
	 * from the sleep state, we may need to reconfigure it for this purpose.
	 * In turn, if the device is not supposed to wake up the system from the
	 * sleep state, we'll have to prevent it from signaling wake-up.
	 */
	pm_runtime_resume(dev);

718
	pci_dev->state_saved = false;
719 720 721 722
	if (pm->suspend) {
		pci_power_t prev = pci_dev->current_state;
		int error;

723 724
		error = pm->suspend(dev);
		suspend_report_result(pm->suspend, error);
725 726 727
		if (error)
			return error;

728
		if (!pci_dev->state_saved && pci_dev->current_state != PCI_D0
729 730 731 732 733
		    && pci_dev->current_state != PCI_UNKNOWN) {
			WARN_ONCE(pci_dev->current_state != prev,
				"PCI PM: State of device not saved by %pF\n",
				pm->suspend);
		}
734
	}
735

736 737 738 739
 Fixup:
	pci_fixup_device(pci_fixup_suspend, pci_dev);

	return 0;
740 741 742
}

static int pci_pm_suspend_noirq(struct device *dev)
G
Greg KH 已提交
743
{
744
	struct pci_dev *pci_dev = to_pci_dev(dev);
745
	const struct dev_pm_ops *pm = dev->driver ? dev->driver->pm : NULL;
G
Greg KH 已提交
746

747 748 749
	if (pci_has_legacy_pm_support(pci_dev))
		return pci_legacy_suspend_late(dev, PMSG_SUSPEND);

750 751
	if (!pm) {
		pci_save_state(pci_dev);
752
		goto Fixup;
753
	}
754 755 756 757 758 759 760 761 762 763 764 765 766 767 768

	if (pm->suspend_noirq) {
		pci_power_t prev = pci_dev->current_state;
		int error;

		error = pm->suspend_noirq(dev);
		suspend_report_result(pm->suspend_noirq, error);
		if (error)
			return error;

		if (!pci_dev->state_saved && pci_dev->current_state != PCI_D0
		    && pci_dev->current_state != PCI_UNKNOWN) {
			WARN_ONCE(pci_dev->current_state != prev,
				"PCI PM: State of device not saved by %pF\n",
				pm->suspend_noirq);
769
			goto Fixup;
770
		}
771 772
	}

773 774
	if (!pci_dev->state_saved) {
		pci_save_state(pci_dev);
775
		if (!pci_has_subordinate(pci_dev))
776 777
			pci_prepare_to_sleep(pci_dev);
	}
778

779 780
	pci_pm_set_unknown_state(pci_dev);

781 782 783 784 785 786 787 788 789 790 791 792
	/*
	 * Some BIOSes from ASUS have a bug: If a USB EHCI host controller's
	 * PCI COMMAND register isn't 0, the BIOS assumes that the controller
	 * hasn't been quiesced and tries to turn it off.  If the controller
	 * is already in D3, this can hang or cause memory corruption.
	 *
	 * Since the value of the COMMAND register doesn't matter once the
	 * device has been suspended, we can safely set it to 0 here.
	 */
	if (pci_dev->class == PCI_CLASS_SERIAL_USB_EHCI)
		pci_write_config_word(pci_dev, PCI_COMMAND, 0);

793 794 795
Fixup:
	pci_fixup_device(pci_fixup_suspend_late, pci_dev);

796
	return 0;
G
Greg KH 已提交
797
}
L
Linus Torvalds 已提交
798

799
static int pci_pm_resume_noirq(struct device *dev)
800 801 802
{
	struct pci_dev *pci_dev = to_pci_dev(dev);
	struct device_driver *drv = dev->driver;
803
	int error = 0;
804

805
	pci_pm_default_resume_early(pci_dev);
806

807
	if (pci_has_legacy_pm_support(pci_dev))
808
		return pci_legacy_resume_early(dev);
809

810 811
	if (drv && drv->pm && drv->pm->resume_noirq)
		error = drv->pm->resume_noirq(dev);
812 813 814 815

	return error;
}

816
static int pci_pm_resume(struct device *dev)
817
{
818
	struct pci_dev *pci_dev = to_pci_dev(dev);
819
	const struct dev_pm_ops *pm = dev->driver ? dev->driver->pm : NULL;
820 821
	int error = 0;

822 823 824 825 826 827 828
	/*
	 * This is necessary for the suspend error path in which resume is
	 * called without restoring the standard config registers of the device.
	 */
	if (pci_dev->state_saved)
		pci_restore_standard_config(pci_dev);

829
	if (pci_has_legacy_pm_support(pci_dev))
830
		return pci_legacy_resume(dev);
831

832
	pci_pm_default_resume(pci_dev);
833

834 835 836 837 838 839
	if (pm) {
		if (pm->resume)
			error = pm->resume(dev);
	} else {
		pci_pm_reenable_device(pci_dev);
	}
840

841
	return error;
842 843 844 845 846 847 848 849 850 851 852
}

#else /* !CONFIG_SUSPEND */

#define pci_pm_suspend		NULL
#define pci_pm_suspend_noirq	NULL
#define pci_pm_resume		NULL
#define pci_pm_resume_noirq	NULL

#endif /* !CONFIG_SUSPEND */

853
#ifdef CONFIG_HIBERNATE_CALLBACKS
854

855 856 857 858 859 860 861

/*
 * pcibios_pm_ops - provide arch-specific hooks when a PCI device is doing
 * a hibernate transition
 */
struct dev_pm_ops __weak pcibios_pm_ops;

862 863 864
static int pci_pm_freeze(struct device *dev)
{
	struct pci_dev *pci_dev = to_pci_dev(dev);
865
	const struct dev_pm_ops *pm = dev->driver ? dev->driver->pm : NULL;
866

867 868
	if (pci_has_legacy_pm_support(pci_dev))
		return pci_legacy_suspend(dev, PMSG_FREEZE);
869

870 871 872
	if (!pm) {
		pci_pm_default_suspend(pci_dev);
		return 0;
873 874
	}

875 876 877 878 879 880 881 882
	/*
	 * This used to be done in pci_pm_prepare() for all devices and some
	 * drivers may depend on it, so do it here.  Ideally, runtime-suspended
	 * devices should not be touched during freeze/thaw transitions,
	 * however.
	 */
	pm_runtime_resume(dev);

883
	pci_dev->state_saved = false;
884 885 886 887 888 889 890 891 892
	if (pm->freeze) {
		int error;

		error = pm->freeze(dev);
		suspend_report_result(pm->freeze, error);
		if (error)
			return error;
	}

893 894 895
	if (pcibios_pm_ops.freeze)
		return pcibios_pm_ops.freeze(dev);

896
	return 0;
897 898 899 900
}

static int pci_pm_freeze_noirq(struct device *dev)
{
901
	struct pci_dev *pci_dev = to_pci_dev(dev);
902
	struct device_driver *drv = dev->driver;
903

904 905 906
	if (pci_has_legacy_pm_support(pci_dev))
		return pci_legacy_suspend_late(dev, PMSG_FREEZE);

907
	if (drv && drv->pm && drv->pm->freeze_noirq) {
908 909
		int error;

910 911
		error = drv->pm->freeze_noirq(dev);
		suspend_report_result(drv->pm->freeze_noirq, error);
912 913
		if (error)
			return error;
914 915
	}

916 917
	if (!pci_dev->state_saved)
		pci_save_state(pci_dev);
918

919 920
	pci_pm_set_unknown_state(pci_dev);

921 922 923
	if (pcibios_pm_ops.freeze_noirq)
		return pcibios_pm_ops.freeze_noirq(dev);

924
	return 0;
925 926
}

927
static int pci_pm_thaw_noirq(struct device *dev)
928
{
929
	struct pci_dev *pci_dev = to_pci_dev(dev);
930 931 932
	struct device_driver *drv = dev->driver;
	int error = 0;

933 934 935 936 937 938
	if (pcibios_pm_ops.thaw_noirq) {
		error = pcibios_pm_ops.thaw_noirq(dev);
		if (error)
			return error;
	}

939
	if (pci_has_legacy_pm_support(pci_dev))
940
		return pci_legacy_resume_early(dev);
941

942
	pci_update_current_state(pci_dev, PCI_D0);
943

944 945
	if (drv && drv->pm && drv->pm->thaw_noirq)
		error = drv->pm->thaw_noirq(dev);
946 947 948 949

	return error;
}

950
static int pci_pm_thaw(struct device *dev)
951
{
952
	struct pci_dev *pci_dev = to_pci_dev(dev);
953
	const struct dev_pm_ops *pm = dev->driver ? dev->driver->pm : NULL;
954 955
	int error = 0;

956 957 958 959 960 961
	if (pcibios_pm_ops.thaw) {
		error = pcibios_pm_ops.thaw(dev);
		if (error)
			return error;
	}

962
	if (pci_has_legacy_pm_support(pci_dev))
963
		return pci_legacy_resume(dev);
964

965 966 967 968 969 970
	if (pm) {
		if (pm->thaw)
			error = pm->thaw(dev);
	} else {
		pci_pm_reenable_device(pci_dev);
	}
971

972 973
	pci_dev->state_saved = false;

974 975 976 977 978
	return error;
}

static int pci_pm_poweroff(struct device *dev)
{
979
	struct pci_dev *pci_dev = to_pci_dev(dev);
980
	const struct dev_pm_ops *pm = dev->driver ? dev->driver->pm : NULL;
981

982 983
	if (pci_has_legacy_pm_support(pci_dev))
		return pci_legacy_suspend(dev, PMSG_HIBERNATE);
984

985 986 987 988 989
	if (!pm) {
		pci_pm_default_suspend(pci_dev);
		goto Fixup;
	}

990 991 992
	/* The reason to do that is the same as in pci_pm_suspend(). */
	pm_runtime_resume(dev);

993
	pci_dev->state_saved = false;
994
	if (pm->poweroff) {
995 996
		int error;

997 998
		error = pm->poweroff(dev);
		suspend_report_result(pm->poweroff, error);
999 1000
		if (error)
			return error;
1001 1002
	}

1003 1004
 Fixup:
	pci_fixup_device(pci_fixup_suspend, pci_dev);
1005

1006 1007 1008
	if (pcibios_pm_ops.poweroff)
		return pcibios_pm_ops.poweroff(dev);

1009
	return 0;
1010 1011 1012 1013
}

static int pci_pm_poweroff_noirq(struct device *dev)
{
1014
	struct pci_dev *pci_dev = to_pci_dev(dev);
1015
	struct device_driver *drv = dev->driver;
1016

1017 1018 1019
	if (pci_has_legacy_pm_support(to_pci_dev(dev)))
		return pci_legacy_suspend_late(dev, PMSG_HIBERNATE);

1020 1021
	if (!drv || !drv->pm) {
		pci_fixup_device(pci_fixup_suspend_late, pci_dev);
1022
		return 0;
1023
	}
1024 1025 1026 1027

	if (drv->pm->poweroff_noirq) {
		int error;

1028 1029
		error = drv->pm->poweroff_noirq(dev);
		suspend_report_result(drv->pm->poweroff_noirq, error);
1030 1031
		if (error)
			return error;
1032 1033
	}

1034
	if (!pci_dev->state_saved && !pci_has_subordinate(pci_dev))
1035 1036
		pci_prepare_to_sleep(pci_dev);

1037 1038 1039 1040 1041 1042 1043
	/*
	 * The reason for doing this here is the same as for the analogous code
	 * in pci_pm_suspend_noirq().
	 */
	if (pci_dev->class == PCI_CLASS_SERIAL_USB_EHCI)
		pci_write_config_word(pci_dev, PCI_COMMAND, 0);

1044 1045
	pci_fixup_device(pci_fixup_suspend_late, pci_dev);

1046 1047 1048
	if (pcibios_pm_ops.poweroff_noirq)
		return pcibios_pm_ops.poweroff_noirq(dev);

1049
	return 0;
1050 1051
}

1052
static int pci_pm_restore_noirq(struct device *dev)
1053 1054 1055
{
	struct pci_dev *pci_dev = to_pci_dev(dev);
	struct device_driver *drv = dev->driver;
1056
	int error = 0;
1057

1058 1059 1060 1061 1062 1063
	if (pcibios_pm_ops.restore_noirq) {
		error = pcibios_pm_ops.restore_noirq(dev);
		if (error)
			return error;
	}

1064
	pci_pm_default_resume_early(pci_dev);
1065

1066
	if (pci_has_legacy_pm_support(pci_dev))
1067
		return pci_legacy_resume_early(dev);
1068

1069 1070
	if (drv && drv->pm && drv->pm->restore_noirq)
		error = drv->pm->restore_noirq(dev);
1071 1072 1073 1074

	return error;
}

1075
static int pci_pm_restore(struct device *dev)
1076 1077
{
	struct pci_dev *pci_dev = to_pci_dev(dev);
1078
	const struct dev_pm_ops *pm = dev->driver ? dev->driver->pm : NULL;
1079 1080
	int error = 0;

1081 1082 1083 1084 1085 1086
	if (pcibios_pm_ops.restore) {
		error = pcibios_pm_ops.restore(dev);
		if (error)
			return error;
	}

1087 1088 1089 1090 1091 1092 1093
	/*
	 * This is necessary for the hibernation error path in which restore is
	 * called without restoring the standard config registers of the device.
	 */
	if (pci_dev->state_saved)
		pci_restore_standard_config(pci_dev);

1094
	if (pci_has_legacy_pm_support(pci_dev))
1095
		return pci_legacy_resume(dev);
1096

1097
	pci_pm_default_resume(pci_dev);
1098

1099 1100 1101 1102 1103 1104
	if (pm) {
		if (pm->restore)
			error = pm->restore(dev);
	} else {
		pci_pm_reenable_device(pci_dev);
	}
1105 1106

	return error;
G
Greg KH 已提交
1107
}
L
Linus Torvalds 已提交
1108

1109
#else /* !CONFIG_HIBERNATE_CALLBACKS */
1110 1111 1112 1113 1114 1115 1116 1117 1118 1119

#define pci_pm_freeze		NULL
#define pci_pm_freeze_noirq	NULL
#define pci_pm_thaw		NULL
#define pci_pm_thaw_noirq	NULL
#define pci_pm_poweroff		NULL
#define pci_pm_poweroff_noirq	NULL
#define pci_pm_restore		NULL
#define pci_pm_restore_noirq	NULL

1120
#endif /* !CONFIG_HIBERNATE_CALLBACKS */
1121

1122
#ifdef CONFIG_PM
1123 1124 1125 1126 1127 1128 1129 1130

static int pci_pm_runtime_suspend(struct device *dev)
{
	struct pci_dev *pci_dev = to_pci_dev(dev);
	const struct dev_pm_ops *pm = dev->driver ? dev->driver->pm : NULL;
	pci_power_t prev = pci_dev->current_state;
	int error;

1131 1132 1133 1134 1135 1136 1137
	/*
	 * If pci_dev->driver is not set (unbound), the device should
	 * always remain in D0 regardless of the runtime PM status
	 */
	if (!pci_dev->driver)
		return 0;

1138 1139 1140
	if (!pm || !pm->runtime_suspend)
		return -ENOSYS;

1141
	pci_dev->state_saved = false;
1142
	pci_dev->no_d3cold = false;
1143 1144 1145 1146
	error = pm->runtime_suspend(dev);
	suspend_report_result(pm->runtime_suspend, error);
	if (error)
		return error;
1147 1148
	if (!pci_dev->d3cold_allowed)
		pci_dev->no_d3cold = true;
1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159

	pci_fixup_device(pci_fixup_suspend, pci_dev);

	if (!pci_dev->state_saved && pci_dev->current_state != PCI_D0
	    && pci_dev->current_state != PCI_UNKNOWN) {
		WARN_ONCE(pci_dev->current_state != prev,
			"PCI PM: State of device not saved by %pF\n",
			pm->runtime_suspend);
		return 0;
	}

1160
	if (!pci_dev->state_saved) {
1161
		pci_save_state(pci_dev);
1162 1163
		pci_finish_runtime_suspend(pci_dev);
	}
1164 1165 1166 1167 1168 1169

	return 0;
}

static int pci_pm_runtime_resume(struct device *dev)
{
1170
	int rc;
1171 1172 1173
	struct pci_dev *pci_dev = to_pci_dev(dev);
	const struct dev_pm_ops *pm = dev->driver ? dev->driver->pm : NULL;

1174 1175 1176 1177 1178 1179 1180
	/*
	 * If pci_dev->driver is not set (unbound), the device should
	 * always remain in D0 regardless of the runtime PM status
	 */
	if (!pci_dev->driver)
		return 0;

1181 1182 1183
	if (!pm || !pm->runtime_resume)
		return -ENOSYS;

1184 1185
	pci_restore_standard_config(pci_dev);
	pci_fixup_device(pci_fixup_resume_early, pci_dev);
1186 1187 1188
	__pci_enable_wake(pci_dev, PCI_D0, true, false);
	pci_fixup_device(pci_fixup_resume, pci_dev);

1189 1190 1191 1192 1193
	rc = pm->runtime_resume(dev);

	pci_dev->runtime_d3cold = false;

	return rc;
1194 1195 1196 1197
}

static int pci_pm_runtime_idle(struct device *dev)
{
1198
	struct pci_dev *pci_dev = to_pci_dev(dev);
1199
	const struct dev_pm_ops *pm = dev->driver ? dev->driver->pm : NULL;
1200
	int ret = 0;
1201

1202 1203 1204 1205 1206
	/*
	 * If pci_dev->driver is not set (unbound), the device should
	 * always remain in D0 regardless of the runtime PM status
	 */
	if (!pci_dev->driver)
1207
		return 0;
1208

1209 1210 1211
	if (!pm)
		return -ENOSYS;

1212 1213
	if (pm->runtime_idle)
		ret = pm->runtime_idle(dev);
1214

1215
	return ret;
1216 1217
}

S
Sachin Kamat 已提交
1218
static const struct dev_pm_ops pci_dev_pm_ops = {
1219 1220 1221 1222 1223 1224 1225
	.prepare = pci_pm_prepare,
	.suspend = pci_pm_suspend,
	.resume = pci_pm_resume,
	.freeze = pci_pm_freeze,
	.thaw = pci_pm_thaw,
	.poweroff = pci_pm_poweroff,
	.restore = pci_pm_restore,
1226 1227 1228 1229 1230 1231
	.suspend_noirq = pci_pm_suspend_noirq,
	.resume_noirq = pci_pm_resume_noirq,
	.freeze_noirq = pci_pm_freeze_noirq,
	.thaw_noirq = pci_pm_thaw_noirq,
	.poweroff_noirq = pci_pm_poweroff_noirq,
	.restore_noirq = pci_pm_restore_noirq,
1232 1233 1234
	.runtime_suspend = pci_pm_runtime_suspend,
	.runtime_resume = pci_pm_runtime_resume,
	.runtime_idle = pci_pm_runtime_idle,
1235 1236
};

1237
#define PCI_PM_OPS_PTR	(&pci_dev_pm_ops)
1238

1239 1240 1241 1242 1243
#else /* !CONFIG_PM */

#define pci_pm_runtime_suspend	NULL
#define pci_pm_runtime_resume	NULL
#define pci_pm_runtime_idle	NULL
1244 1245 1246

#define PCI_PM_OPS_PTR	NULL

1247
#endif /* !CONFIG_PM */
1248

L
Linus Torvalds 已提交
1249
/**
1250
 * __pci_register_driver - register a new pci driver
L
Linus Torvalds 已提交
1251
 * @drv: the driver structure to register
1252
 * @owner: owner module of drv
1253
 * @mod_name: module name string
1254
 *
L
Linus Torvalds 已提交
1255
 * Adds the driver structure to the list of registered drivers.
1256 1257
 * Returns a negative value on error, otherwise 0.
 * If no error occurred, the driver remains registered even if
L
Linus Torvalds 已提交
1258 1259
 * no device was claimed during registration.
 */
1260 1261
int __pci_register_driver(struct pci_driver *drv, struct module *owner,
			  const char *mod_name)
L
Linus Torvalds 已提交
1262 1263 1264 1265
{
	/* initialize common driver fields */
	drv->driver.name = drv->name;
	drv->driver.bus = &pci_bus_type;
1266
	drv->driver.owner = owner;
1267
	drv->driver.mod_name = mod_name;
A
Alan Cox 已提交
1268

1269 1270
	spin_lock_init(&drv->dynids.lock);
	INIT_LIST_HEAD(&drv->dynids.list);
L
Linus Torvalds 已提交
1271 1272

	/* register with core */
1273
	return driver_register(&drv->driver);
L
Linus Torvalds 已提交
1274
}
1275
EXPORT_SYMBOL(__pci_register_driver);
L
Linus Torvalds 已提交
1276 1277 1278 1279

/**
 * pci_unregister_driver - unregister a pci driver
 * @drv: the driver structure to unregister
1280
 *
L
Linus Torvalds 已提交
1281 1282 1283 1284 1285 1286
 * Deletes the driver structure from the list of registered PCI drivers,
 * gives it a chance to clean up by calling its remove() function for
 * each device it was responsible for, and marks those devices as
 * driverless.
 */

R
Ryan Desfosses 已提交
1287
void pci_unregister_driver(struct pci_driver *drv)
L
Linus Torvalds 已提交
1288 1289 1290 1291
{
	driver_unregister(&drv->driver);
	pci_free_dynids(drv);
}
1292
EXPORT_SYMBOL(pci_unregister_driver);
L
Linus Torvalds 已提交
1293 1294 1295 1296 1297 1298 1299 1300 1301

static struct pci_driver pci_compat_driver = {
	.name = "compat"
};

/**
 * pci_dev_driver - get the pci_driver of a device
 * @dev: the device to query
 *
1302
 * Returns the appropriate pci_driver structure or %NULL if there is no
L
Linus Torvalds 已提交
1303 1304
 * registered driver for the device.
 */
R
Ryan Desfosses 已提交
1305
struct pci_driver *pci_dev_driver(const struct pci_dev *dev)
L
Linus Torvalds 已提交
1306 1307 1308 1309 1310
{
	if (dev->driver)
		return dev->driver;
	else {
		int i;
R
Ryan Desfosses 已提交
1311
		for (i = 0; i <= PCI_ROM_RESOURCE; i++)
L
Linus Torvalds 已提交
1312 1313 1314 1315 1316
			if (dev->resource[i].flags & IORESOURCE_BUSY)
				return &pci_compat_driver;
	}
	return NULL;
}
1317
EXPORT_SYMBOL(pci_dev_driver);
L
Linus Torvalds 已提交
1318 1319 1320 1321

/**
 * pci_bus_match - Tell if a PCI device structure has a matching PCI device id structure
 * @dev: the PCI device structure to match against
R
Randy Dunlap 已提交
1322
 * @drv: the device driver to search for matching PCI device id structures
1323
 *
L
Linus Torvalds 已提交
1324
 * Used by a driver to check whether a PCI device present in the
R
Randy Dunlap 已提交
1325
 * system is in its list of supported devices. Returns the matching
L
Linus Torvalds 已提交
1326 1327
 * pci_device_id structure or %NULL if there is no match.
 */
1328
static int pci_bus_match(struct device *dev, struct device_driver *drv)
L
Linus Torvalds 已提交
1329
{
1330
	struct pci_dev *pci_dev = to_pci_dev(dev);
1331
	struct pci_driver *pci_drv;
L
Linus Torvalds 已提交
1332 1333
	const struct pci_device_id *found_id;

1334 1335 1336 1337
	if (!pci_dev->match_driver)
		return 0;

	pci_drv = to_pci_driver(drv);
1338
	found_id = pci_match_device(pci_drv, pci_dev);
L
Linus Torvalds 已提交
1339 1340 1341
	if (found_id)
		return 1;

1342
	return 0;
L
Linus Torvalds 已提交
1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 1362
}

/**
 * pci_dev_get - increments the reference count of the pci device structure
 * @dev: the device being referenced
 *
 * Each live reference to a device should be refcounted.
 *
 * Drivers for PCI devices should normally record such references in
 * their probe() methods, when they bind to a device, and release
 * them by calling pci_dev_put(), in their disconnect() methods.
 *
 * A pointer to the device with the incremented reference counter is returned.
 */
struct pci_dev *pci_dev_get(struct pci_dev *dev)
{
	if (dev)
		get_device(&dev->dev);
	return dev;
}
1363
EXPORT_SYMBOL(pci_dev_get);
L
Linus Torvalds 已提交
1364 1365 1366 1367 1368 1369 1370 1371 1372 1373 1374 1375 1376

/**
 * pci_dev_put - release a use of the pci device structure
 * @dev: device that's been disconnected
 *
 * Must be called when a user of a device is finished with it.  When the last
 * user of the device calls this function, the memory of the device is freed.
 */
void pci_dev_put(struct pci_dev *dev)
{
	if (dev)
		put_device(&dev->dev);
}
1377
EXPORT_SYMBOL(pci_dev_put);
L
Linus Torvalds 已提交
1378

1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400
static int pci_uevent(struct device *dev, struct kobj_uevent_env *env)
{
	struct pci_dev *pdev;

	if (!dev)
		return -ENODEV;

	pdev = to_pci_dev(dev);

	if (add_uevent_var(env, "PCI_CLASS=%04X", pdev->class))
		return -ENOMEM;

	if (add_uevent_var(env, "PCI_ID=%04X:%04X", pdev->vendor, pdev->device))
		return -ENOMEM;

	if (add_uevent_var(env, "PCI_SUBSYS_ID=%04X:%04X", pdev->subsystem_vendor,
			   pdev->subsystem_device))
		return -ENOMEM;

	if (add_uevent_var(env, "PCI_SLOT_NAME=%s", pci_name(pdev)))
		return -ENOMEM;

1401
	if (add_uevent_var(env, "MODALIAS=pci:v%08Xd%08Xsv%08Xsd%08Xbc%02Xsc%02Xi%02X",
1402 1403 1404 1405 1406
			   pdev->vendor, pdev->device,
			   pdev->subsystem_vendor, pdev->subsystem_device,
			   (u8)(pdev->class >> 16), (u8)(pdev->class >> 8),
			   (u8)(pdev->class)))
		return -ENOMEM;
B
Bjorn Helgaas 已提交
1407

1408 1409 1410
	return 0;
}

L
Linus Torvalds 已提交
1411 1412 1413
struct bus_type pci_bus_type = {
	.name		= "pci",
	.match		= pci_bus_match,
1414
	.uevent		= pci_uevent,
1415 1416
	.probe		= pci_device_probe,
	.remove		= pci_device_remove,
L
Linus Torvalds 已提交
1417
	.shutdown	= pci_device_shutdown,
1418
	.dev_groups	= pci_dev_groups,
1419
	.bus_groups	= pci_bus_groups,
1420
	.drv_groups	= pci_drv_groups,
1421
	.pm		= PCI_PM_OPS_PTR,
L
Linus Torvalds 已提交
1422
};
1423
EXPORT_SYMBOL(pci_bus_type);
L
Linus Torvalds 已提交
1424 1425 1426 1427 1428 1429

static int __init pci_driver_init(void)
{
	return bus_register(&pci_bus_type);
}
postcore_initcall(pci_driver_init);