blob: 1dc78c5cabf8f52175159ef6191a479828497e08 [file] [log] [blame]
Linus Torvalds1da177e2005-04-16 15:20:36 -07001/*
2 * drivers/pci/pci-driver.c
3 *
Greg Kroah-Hartman2b937302007-11-28 12:23:18 -08004 * (C) Copyright 2002-2004, 2007 Greg Kroah-Hartman <greg@kroah.com>
5 * (C) Copyright 2007 Novell Inc.
6 *
7 * Released under the GPL v2 only.
8 *
Linus Torvalds1da177e2005-04-16 15:20:36 -07009 */
10
11#include <linux/pci.h>
12#include <linux/module.h>
13#include <linux/init.h>
14#include <linux/device.h>
Andi Kleend42c6992005-07-06 19:56:03 +020015#include <linux/mempolicy.h>
Tim Schmielau4e57b682005-10-30 15:03:48 -080016#include <linux/string.h>
17#include <linux/slab.h>
Tim Schmielau8c65b4a2005-11-07 00:59:43 -080018#include <linux/sched.h>
Rusty Russell873392c2008-12-31 23:54:56 +103019#include <linux/cpu.h>
Rafael J. Wysocki6cbf8212010-02-17 23:44:58 +010020#include <linux/pm_runtime.h>
Rafael J. Wysockieea3fc032011-07-06 10:51:40 +020021#include <linux/suspend.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070022#include "pci.h"
23
Greg Kroah-Hartman75865852005-06-30 02:18:12 -070024struct pci_dynid {
25 struct list_head node;
26 struct pci_device_id id;
27};
Linus Torvalds1da177e2005-04-16 15:20:36 -070028
29/**
Tejun Heo9dba9102009-09-03 15:26:36 +090030 * pci_add_dynid - add a new PCI device ID to this driver and re-probe devices
31 * @drv: target pci driver
32 * @vendor: PCI vendor ID
33 * @device: PCI device ID
34 * @subvendor: PCI subvendor ID
35 * @subdevice: PCI subdevice ID
36 * @class: PCI class
37 * @class_mask: PCI class mask
38 * @driver_data: private driver data
39 *
40 * Adds a new dynamic pci device ID to this driver and causes the
41 * driver to probe for all devices again. @drv must have been
42 * registered prior to calling this function.
43 *
44 * CONTEXT:
45 * Does GFP_KERNEL allocation.
46 *
47 * RETURNS:
48 * 0 on success, -errno on failure.
49 */
50int pci_add_dynid(struct pci_driver *drv,
51 unsigned int vendor, unsigned int device,
52 unsigned int subvendor, unsigned int subdevice,
53 unsigned int class, unsigned int class_mask,
54 unsigned long driver_data)
55{
56 struct pci_dynid *dynid;
57 int retval;
58
59 dynid = kzalloc(sizeof(*dynid), GFP_KERNEL);
60 if (!dynid)
61 return -ENOMEM;
62
63 dynid->id.vendor = vendor;
64 dynid->id.device = device;
65 dynid->id.subvendor = subvendor;
66 dynid->id.subdevice = subdevice;
67 dynid->id.class = class;
68 dynid->id.class_mask = class_mask;
69 dynid->id.driver_data = driver_data;
70
71 spin_lock(&drv->dynids.lock);
72 list_add_tail(&dynid->node, &drv->dynids.list);
73 spin_unlock(&drv->dynids.lock);
74
Tejun Heo9dba9102009-09-03 15:26:36 +090075 retval = driver_attach(&drv->driver);
Tejun Heo9dba9102009-09-03 15:26:36 +090076
77 return retval;
78}
79
80static void pci_free_dynids(struct pci_driver *drv)
81{
82 struct pci_dynid *dynid, *n;
83
84 spin_lock(&drv->dynids.lock);
85 list_for_each_entry_safe(dynid, n, &drv->dynids.list, node) {
86 list_del(&dynid->node);
87 kfree(dynid);
88 }
89 spin_unlock(&drv->dynids.lock);
90}
91
Tejun Heo9dba9102009-09-03 15:26:36 +090092/**
93 * store_new_id - sysfs frontend to pci_add_dynid()
Randy Dunlap8f7020d2005-10-23 11:57:38 -070094 * @driver: target device driver
95 * @buf: buffer for scanning device ID data
96 * @count: input size
Linus Torvalds1da177e2005-04-16 15:20:36 -070097 *
Tejun Heo9dba9102009-09-03 15:26:36 +090098 * Allow PCI IDs to be added to an existing driver via sysfs.
Linus Torvalds1da177e2005-04-16 15:20:36 -070099 */
Randy Dunlapf8eb1002005-10-28 20:36:51 -0700100static ssize_t
Linus Torvalds1da177e2005-04-16 15:20:36 -0700101store_new_id(struct device_driver *driver, const char *buf, size_t count)
102{
Linus Torvalds1da177e2005-04-16 15:20:36 -0700103 struct pci_driver *pdrv = to_pci_driver(driver);
Jean Delvareb41d6cf2008-08-17 21:06:59 +0200104 const struct pci_device_id *ids = pdrv->id_table;
Jean Delvare6ba18632007-04-07 17:21:28 +0200105 __u32 vendor, device, subvendor=PCI_ANY_ID,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700106 subdevice=PCI_ANY_ID, class=0, class_mask=0;
107 unsigned long driver_data=0;
108 int fields=0;
Tejun Heo9dba9102009-09-03 15:26:36 +0900109 int retval;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700110
Jean Delvareb41d6cf2008-08-17 21:06:59 +0200111 fields = sscanf(buf, "%x %x %x %x %x %x %lx",
Linus Torvalds1da177e2005-04-16 15:20:36 -0700112 &vendor, &device, &subvendor, &subdevice,
113 &class, &class_mask, &driver_data);
Jean Delvare6ba18632007-04-07 17:21:28 +0200114 if (fields < 2)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700115 return -EINVAL;
116
Jean Delvareb41d6cf2008-08-17 21:06:59 +0200117 /* Only accept driver_data values that match an existing id_table
118 entry */
Chris Wright2debb4d2008-11-25 19:36:10 -0800119 if (ids) {
120 retval = -EINVAL;
121 while (ids->vendor || ids->subvendor || ids->class_mask) {
122 if (driver_data == ids->driver_data) {
123 retval = 0;
124 break;
125 }
126 ids++;
Jean Delvareb41d6cf2008-08-17 21:06:59 +0200127 }
Chris Wright2debb4d2008-11-25 19:36:10 -0800128 if (retval) /* No match */
129 return retval;
Jean Delvareb41d6cf2008-08-17 21:06:59 +0200130 }
Jean Delvareb41d6cf2008-08-17 21:06:59 +0200131
Tejun Heo9dba9102009-09-03 15:26:36 +0900132 retval = pci_add_dynid(pdrv, vendor, device, subvendor, subdevice,
133 class, class_mask, driver_data);
Greg Kroah-Hartmanb19441a2006-08-28 11:43:25 -0700134 if (retval)
135 return retval;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700136 return count;
137}
Linus Torvalds1da177e2005-04-16 15:20:36 -0700138
Chris Wright09943752009-02-23 21:52:23 -0800139/**
140 * store_remove_id - remove a PCI device ID from this driver
141 * @driver: target device driver
142 * @buf: buffer for scanning device ID data
143 * @count: input size
144 *
145 * Removes a dynamic pci device ID to this driver.
146 */
147static ssize_t
148store_remove_id(struct device_driver *driver, const char *buf, size_t count)
149{
150 struct pci_dynid *dynid, *n;
151 struct pci_driver *pdrv = to_pci_driver(driver);
152 __u32 vendor, device, subvendor = PCI_ANY_ID,
153 subdevice = PCI_ANY_ID, class = 0, class_mask = 0;
154 int fields = 0;
155 int retval = -ENODEV;
156
157 fields = sscanf(buf, "%x %x %x %x %x %x",
158 &vendor, &device, &subvendor, &subdevice,
159 &class, &class_mask);
160 if (fields < 2)
161 return -EINVAL;
162
163 spin_lock(&pdrv->dynids.lock);
164 list_for_each_entry_safe(dynid, n, &pdrv->dynids.list, node) {
165 struct pci_device_id *id = &dynid->id;
166 if ((id->vendor == vendor) &&
167 (id->device == device) &&
168 (subvendor == PCI_ANY_ID || id->subvendor == subvendor) &&
169 (subdevice == PCI_ANY_ID || id->subdevice == subdevice) &&
170 !((id->class ^ class) & class_mask)) {
171 list_del(&dynid->node);
172 kfree(dynid);
173 retval = 0;
174 break;
175 }
176 }
177 spin_unlock(&pdrv->dynids.lock);
178
179 if (retval)
180 return retval;
181 return count;
182}
Chris Wright09943752009-02-23 21:52:23 -0800183
Konstantin Khlebnikovbfb09a82012-08-08 14:47:51 +0400184static struct driver_attribute pci_drv_attrs[] = {
185 __ATTR(new_id, S_IWUSR, NULL, store_new_id),
186 __ATTR(remove_id, S_IWUSR, NULL, store_remove_id),
187 __ATTR_NULL,
188};
Alan Sterned283e92012-01-24 14:35:13 -0500189
Linus Torvalds1da177e2005-04-16 15:20:36 -0700190/**
Greg Kroah-Hartman75865852005-06-30 02:18:12 -0700191 * pci_match_id - See if a pci device matches a given pci_id table
Linus Torvalds1da177e2005-04-16 15:20:36 -0700192 * @ids: array of PCI device id structures to search in
Greg Kroah-Hartman75865852005-06-30 02:18:12 -0700193 * @dev: the PCI device structure to match against.
194 *
Linus Torvalds1da177e2005-04-16 15:20:36 -0700195 * Used by a driver to check whether a PCI device present in the
Greg Kroah-Hartman75865852005-06-30 02:18:12 -0700196 * system is in its list of supported devices. Returns the matching
Linus Torvalds1da177e2005-04-16 15:20:36 -0700197 * pci_device_id structure or %NULL if there is no match.
Greg Kroah-Hartman75865852005-06-30 02:18:12 -0700198 *
Randy Dunlap8b607562007-05-09 07:19:14 +0200199 * Deprecated, don't use this as it will not catch any dynamic ids
Greg Kroah-Hartman75865852005-06-30 02:18:12 -0700200 * that a driver might want to check for.
Linus Torvalds1da177e2005-04-16 15:20:36 -0700201 */
Greg Kroah-Hartman75865852005-06-30 02:18:12 -0700202const struct pci_device_id *pci_match_id(const struct pci_device_id *ids,
203 struct pci_dev *dev)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700204{
Greg Kroah-Hartman75865852005-06-30 02:18:12 -0700205 if (ids) {
206 while (ids->vendor || ids->subvendor || ids->class_mask) {
207 if (pci_match_one_device(ids, dev))
208 return ids;
209 ids++;
210 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700211 }
212 return NULL;
213}
214
215/**
Randy Dunlapae9608a2007-01-09 21:41:01 -0800216 * pci_match_device - Tell if a PCI device structure has a matching PCI device id structure
Greg Kroah-Hartman75865852005-06-30 02:18:12 -0700217 * @drv: the PCI driver to match against
Henrik Kretzschmar39ba4872006-08-15 10:57:16 +0200218 * @dev: the PCI device structure to match against
Greg Kroah-Hartman75865852005-06-30 02:18:12 -0700219 *
220 * Used by a driver to check whether a PCI device present in the
221 * system is in its list of supported devices. Returns the matching
222 * pci_device_id structure or %NULL if there is no match.
Linus Torvalds1da177e2005-04-16 15:20:36 -0700223 */
Adrian Bunkd73460d2007-10-24 18:27:18 +0200224static const struct pci_device_id *pci_match_device(struct pci_driver *drv,
225 struct pci_dev *dev)
Greg Kroah-Hartman75865852005-06-30 02:18:12 -0700226{
Greg Kroah-Hartman75865852005-06-30 02:18:12 -0700227 struct pci_dynid *dynid;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700228
Russell King7461b602006-11-29 21:18:04 +0000229 /* Look at the dynamic ids first, before the static ones */
Greg Kroah-Hartman75865852005-06-30 02:18:12 -0700230 spin_lock(&drv->dynids.lock);
231 list_for_each_entry(dynid, &drv->dynids.list, node) {
232 if (pci_match_one_device(&dynid->id, dev)) {
233 spin_unlock(&drv->dynids.lock);
234 return &dynid->id;
235 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700236 }
Greg Kroah-Hartman75865852005-06-30 02:18:12 -0700237 spin_unlock(&drv->dynids.lock);
Russell King7461b602006-11-29 21:18:04 +0000238
239 return pci_match_id(drv->id_table, dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700240}
241
Rusty Russell873392c2008-12-31 23:54:56 +1030242struct drv_dev_and_id {
243 struct pci_driver *drv;
244 struct pci_dev *dev;
245 const struct pci_device_id *id;
246};
247
248static long local_pci_probe(void *_ddi)
249{
250 struct drv_dev_and_id *ddi = _ddi;
Alan Sternf3ec4f82010-06-08 15:23:51 -0400251 struct device *dev = &ddi->dev->dev;
Huang Yingea8c88f2012-08-08 09:07:39 +0800252 struct device *parent = dev->parent;
Alan Sternf3ec4f82010-06-08 15:23:51 -0400253 int rc;
Rusty Russell873392c2008-12-31 23:54:56 +1030254
Huang Yingea8c88f2012-08-08 09:07:39 +0800255 /* The parent bridge must be in active state when probing */
256 if (parent)
257 pm_runtime_get_sync(parent);
Alan Sternf3ec4f82010-06-08 15:23:51 -0400258 /* Unbound PCI devices are always set to disabled and suspended.
259 * During probe, the device is set to enabled and active and the
260 * usage count is incremented. If the driver supports runtime PM,
261 * it should call pm_runtime_put_noidle() in its probe routine and
262 * pm_runtime_get_noresume() in its remove routine.
263 */
264 pm_runtime_get_noresume(dev);
265 pm_runtime_set_active(dev);
266 pm_runtime_enable(dev);
267
268 rc = ddi->drv->probe(ddi->dev, ddi->id);
269 if (rc) {
270 pm_runtime_disable(dev);
271 pm_runtime_set_suspended(dev);
272 pm_runtime_put_noidle(dev);
273 }
Huang Yingea8c88f2012-08-08 09:07:39 +0800274 if (parent)
275 pm_runtime_put(parent);
Alan Sternf3ec4f82010-06-08 15:23:51 -0400276 return rc;
Rusty Russell873392c2008-12-31 23:54:56 +1030277}
278
Andi Kleend42c6992005-07-06 19:56:03 +0200279static int pci_call_probe(struct pci_driver *drv, struct pci_dev *dev,
280 const struct pci_device_id *id)
281{
Rusty Russell873392c2008-12-31 23:54:56 +1030282 int error, node;
283 struct drv_dev_and_id ddi = { drv, dev, id };
Mike Travisf70316d2008-04-04 18:11:06 -0700284
Rusty Russell873392c2008-12-31 23:54:56 +1030285 /* Execute driver initialization on node where the device's
286 bus is attached to. This way the driver likely allocates
287 its local memory on the right node without any need to
288 change it. */
289 node = dev_to_node(&dev->dev);
Mike Travisf70316d2008-04-04 18:11:06 -0700290 if (node >= 0) {
Rusty Russell873392c2008-12-31 23:54:56 +1030291 int cpu;
Rusty Russell873392c2008-12-31 23:54:56 +1030292
293 get_online_cpus();
Rusty Russella70f7302009-03-13 14:49:46 +1030294 cpu = cpumask_any_and(cpumask_of_node(node), cpu_online_mask);
Rusty Russell873392c2008-12-31 23:54:56 +1030295 if (cpu < nr_cpu_ids)
296 error = work_on_cpu(cpu, local_pci_probe, &ddi);
297 else
298 error = local_pci_probe(&ddi);
299 put_online_cpus();
300 } else
301 error = local_pci_probe(&ddi);
Andi Kleend42c6992005-07-06 19:56:03 +0200302 return error;
303}
304
Linus Torvalds1da177e2005-04-16 15:20:36 -0700305/**
Randy Dunlap23ea3792010-11-18 15:02:31 -0800306 * __pci_device_probe - check if a driver wants to claim a specific PCI device
Randy Dunlap8f7020d2005-10-23 11:57:38 -0700307 * @drv: driver to call to check if it wants the PCI device
308 * @pci_dev: PCI device being probed
Linus Torvalds1da177e2005-04-16 15:20:36 -0700309 *
Randy Dunlap8f7020d2005-10-23 11:57:38 -0700310 * returns 0 on success, else error.
Linus Torvalds1da177e2005-04-16 15:20:36 -0700311 * side-effect: pci_dev->driver is set to drv when drv claims pci_dev.
312 */
313static int
314__pci_device_probe(struct pci_driver *drv, struct pci_dev *pci_dev)
Greg Kroah-Hartman75865852005-06-30 02:18:12 -0700315{
316 const struct pci_device_id *id;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700317 int error = 0;
318
319 if (!pci_dev->driver && drv->probe) {
Greg Kroah-Hartman75865852005-06-30 02:18:12 -0700320 error = -ENODEV;
321
322 id = pci_match_device(drv, pci_dev);
323 if (id)
Andi Kleend42c6992005-07-06 19:56:03 +0200324 error = pci_call_probe(drv, pci_dev, id);
Greg Kroah-Hartman75865852005-06-30 02:18:12 -0700325 if (error >= 0) {
326 pci_dev->driver = drv;
327 error = 0;
328 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700329 }
330 return error;
331}
332
333static int pci_device_probe(struct device * dev)
334{
335 int error = 0;
336 struct pci_driver *drv;
337 struct pci_dev *pci_dev;
338
339 drv = to_pci_driver(dev->driver);
340 pci_dev = to_pci_dev(dev);
341 pci_dev_get(pci_dev);
342 error = __pci_device_probe(drv, pci_dev);
343 if (error)
344 pci_dev_put(pci_dev);
345
346 return error;
347}
348
349static int pci_device_remove(struct device * dev)
350{
351 struct pci_dev * pci_dev = to_pci_dev(dev);
352 struct pci_driver * drv = pci_dev->driver;
353
354 if (drv) {
Alan Sternf3ec4f82010-06-08 15:23:51 -0400355 if (drv->remove) {
356 pm_runtime_get_sync(dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700357 drv->remove(pci_dev);
Alan Sternf3ec4f82010-06-08 15:23:51 -0400358 pm_runtime_put_noidle(dev);
359 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700360 pci_dev->driver = NULL;
361 }
362
Alan Sternf3ec4f82010-06-08 15:23:51 -0400363 /* Undo the runtime PM settings in local_pci_probe() */
364 pm_runtime_disable(dev);
365 pm_runtime_set_suspended(dev);
366 pm_runtime_put_noidle(dev);
367
Linus Torvalds1da177e2005-04-16 15:20:36 -0700368 /*
Shaohua Li2449e062006-10-20 14:45:32 -0700369 * If the device is still on, set the power state as "unknown",
370 * since it might change by the next time we load the driver.
371 */
372 if (pci_dev->current_state == PCI_D0)
373 pci_dev->current_state = PCI_UNKNOWN;
374
375 /*
Linus Torvalds1da177e2005-04-16 15:20:36 -0700376 * We would love to complain here if pci_dev->is_enabled is set, that
377 * the driver should have called pci_disable_device(), but the
378 * unfortunate fact is there are too many odd BIOS and bridge setups
379 * that don't like drivers doing that all of the time.
380 * Oh well, we can dream of sane hardware when we sleep, no matter how
381 * horrible the crap we have to deal with is when we are awake...
382 */
383
384 pci_dev_put(pci_dev);
385 return 0;
386}
387
Rafael J. Wysockibbb44d92008-05-20 00:49:04 +0200388static void pci_device_shutdown(struct device *dev)
389{
390 struct pci_dev *pci_dev = to_pci_dev(dev);
391 struct pci_driver *drv = pci_dev->driver;
392
Huang Ying3ff2de92012-10-24 14:54:14 +0800393 pm_runtime_resume(dev);
394
Rafael J. Wysockibbb44d92008-05-20 00:49:04 +0200395 if (drv && drv->shutdown)
396 drv->shutdown(pci_dev);
397 pci_msi_shutdown(pci_dev);
398 pci_msix_shutdown(pci_dev);
Rafael J. Wysocki5b415f12012-02-07 00:50:35 +0100399
400 /*
Khalid Azizb566a222012-04-27 13:00:33 -0600401 * Turn off Bus Master bit on the device to tell it to not
402 * continue to do DMA
403 */
404 pci_disable_device(pci_dev);
Rafael J. Wysockibbb44d92008-05-20 00:49:04 +0200405}
406
Rafael J. Wysockiaa338602011-02-11 00:06:54 +0100407#ifdef CONFIG_PM
Rafael J. Wysocki6cbf8212010-02-17 23:44:58 +0100408
409/* Auxiliary functions used for system resume and run-time resume. */
410
411/**
412 * pci_restore_standard_config - restore standard config registers of PCI device
413 * @pci_dev: PCI device to handle
414 */
415static int pci_restore_standard_config(struct pci_dev *pci_dev)
416{
417 pci_update_current_state(pci_dev, PCI_UNKNOWN);
418
419 if (pci_dev->current_state != PCI_D0) {
420 int error = pci_set_power_state(pci_dev, PCI_D0);
421 if (error)
422 return error;
423 }
424
Jon Mason1d3c16a2010-11-30 17:43:26 -0600425 pci_restore_state(pci_dev);
426 return 0;
Rafael J. Wysocki6cbf8212010-02-17 23:44:58 +0100427}
428
Rafael J. Wysocki6cbf8212010-02-17 23:44:58 +0100429#endif
430
Rafael J. Wysockibbb44d92008-05-20 00:49:04 +0200431#ifdef CONFIG_PM_SLEEP
432
Rafael J. Wysockidb288c92012-07-05 15:20:00 -0600433static void pci_pm_default_resume_early(struct pci_dev *pci_dev)
434{
435 pci_power_up(pci_dev);
436 pci_restore_state(pci_dev);
437 pci_fixup_device(pci_fixup_resume_early, pci_dev);
438}
439
Rafael J. Wysockibbb44d92008-05-20 00:49:04 +0200440/*
441 * Default "suspend" method for devices that have no driver provided suspend,
Rafael J. Wysockifa58d302009-01-07 13:03:42 +0100442 * or not even a driver at all (second part).
443 */
Rafael J. Wysockibb808942009-01-07 14:15:17 +0100444static void pci_pm_set_unknown_state(struct pci_dev *pci_dev)
Rafael J. Wysockibbb44d92008-05-20 00:49:04 +0200445{
Rafael J. Wysockibbb44d92008-05-20 00:49:04 +0200446 /*
447 * mark its power state as "unknown", since we don't know if
448 * e.g. the BIOS will change its device state when we suspend.
449 */
450 if (pci_dev->current_state == PCI_D0)
451 pci_dev->current_state = PCI_UNKNOWN;
452}
453
454/*
455 * Default "resume" method for devices that have no driver provided resume,
Rafael J. Wysocki355a72d2008-12-08 00:34:57 +0100456 * or not even a driver at all (second part).
457 */
Rafael J. Wysockibb808942009-01-07 14:15:17 +0100458static int pci_pm_reenable_device(struct pci_dev *pci_dev)
Rafael J. Wysocki355a72d2008-12-08 00:34:57 +0100459{
460 int retval;
461
Rafael J. Wysockibbb44d92008-05-20 00:49:04 +0200462 /* if the device was enabled before suspend, reenable */
463 retval = pci_reenable_device(pci_dev);
464 /*
465 * if the device was busmaster before the suspend, make it busmaster
466 * again
467 */
468 if (pci_dev->is_busmaster)
469 pci_set_master(pci_dev);
470
471 return retval;
472}
473
474static int pci_legacy_suspend(struct device *dev, pm_message_t state)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700475{
476 struct pci_dev * pci_dev = to_pci_dev(dev);
477 struct pci_driver * drv = pci_dev->driver;
Rafael J. Wysocki46939f82009-03-16 22:40:26 +0100478
Andrew Morton02669492006-03-23 01:38:34 -0800479 if (drv && drv->suspend) {
Rafael J. Wysocki99dadce2009-02-04 01:59:09 +0100480 pci_power_t prev = pci_dev->current_state;
Rafael J. Wysocki46939f82009-03-16 22:40:26 +0100481 int error;
Rafael J. Wysockiaa8c6c92009-01-16 21:54:43 +0100482
Frans Pop57ef8022009-03-16 22:39:56 +0100483 error = drv->suspend(pci_dev, state);
484 suspend_report_result(drv->suspend, error);
485 if (error)
486 return error;
Rafael J. Wysockiaa8c6c92009-01-16 21:54:43 +0100487
Rafael J. Wysocki46939f82009-03-16 22:40:26 +0100488 if (!pci_dev->state_saved && pci_dev->current_state != PCI_D0
Rafael J. Wysocki99dadce2009-02-04 01:59:09 +0100489 && pci_dev->current_state != PCI_UNKNOWN) {
490 WARN_ONCE(pci_dev->current_state != prev,
491 "PCI PM: Device state not saved by %pF\n",
492 drv->suspend);
Rafael J. Wysocki99dadce2009-02-04 01:59:09 +0100493 }
Andrew Morton02669492006-03-23 01:38:34 -0800494 }
Rafael J. Wysockiad8cfa12009-01-07 13:09:37 +0100495
496 pci_fixup_device(pci_fixup_suspend, pci_dev);
497
Rafael J. Wysocki46939f82009-03-16 22:40:26 +0100498 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700499}
500
Rafael J. Wysockibbb44d92008-05-20 00:49:04 +0200501static int pci_legacy_suspend_late(struct device *dev, pm_message_t state)
Linus Torvaldscbd69db2006-06-24 14:50:29 -0700502{
503 struct pci_dev * pci_dev = to_pci_dev(dev);
504 struct pci_driver * drv = pci_dev->driver;
Linus Torvaldscbd69db2006-06-24 14:50:29 -0700505
506 if (drv && drv->suspend_late) {
Rafael J. Wysocki46939f82009-03-16 22:40:26 +0100507 pci_power_t prev = pci_dev->current_state;
508 int error;
509
Frans Pop57ef8022009-03-16 22:39:56 +0100510 error = drv->suspend_late(pci_dev, state);
511 suspend_report_result(drv->suspend_late, error);
Rafael J. Wysocki46939f82009-03-16 22:40:26 +0100512 if (error)
513 return error;
514
515 if (!pci_dev->state_saved && pci_dev->current_state != PCI_D0
516 && pci_dev->current_state != PCI_UNKNOWN) {
517 WARN_ONCE(pci_dev->current_state != prev,
518 "PCI PM: Device state not saved by %pF\n",
519 drv->suspend_late);
520 return 0;
521 }
Linus Torvaldscbd69db2006-06-24 14:50:29 -0700522 }
Rafael J. Wysocki46939f82009-03-16 22:40:26 +0100523
524 if (!pci_dev->state_saved)
525 pci_save_state(pci_dev);
526
527 pci_pm_set_unknown_state(pci_dev);
528
529 return 0;
Linus Torvaldscbd69db2006-06-24 14:50:29 -0700530}
Linus Torvalds1da177e2005-04-16 15:20:36 -0700531
Rafael J. Wysockif6dc1e52009-01-07 13:12:22 +0100532static int pci_legacy_resume_early(struct device *dev)
533{
Rafael J. Wysockif6dc1e52009-01-07 13:12:22 +0100534 struct pci_dev * pci_dev = to_pci_dev(dev);
535 struct pci_driver * drv = pci_dev->driver;
536
Rafael J. Wysockiaa8c6c92009-01-16 21:54:43 +0100537 return drv && drv->resume_early ?
538 drv->resume_early(pci_dev) : 0;
Rafael J. Wysockif6dc1e52009-01-07 13:12:22 +0100539}
540
Rafael J. Wysockibbb44d92008-05-20 00:49:04 +0200541static int pci_legacy_resume(struct device *dev)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700542{
543 struct pci_dev * pci_dev = to_pci_dev(dev);
544 struct pci_driver * drv = pci_dev->driver;
545
Rafael J. Wysockiad8cfa12009-01-07 13:09:37 +0100546 pci_fixup_device(pci_fixup_resume, pci_dev);
547
Rafael J. Wysockiaa8c6c92009-01-16 21:54:43 +0100548 return drv && drv->resume ?
549 drv->resume(pci_dev) : pci_pm_reenable_device(pci_dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700550}
551
Rafael J. Wysocki571ff752009-01-07 13:05:05 +0100552/* Auxiliary functions used by the new power management framework */
553
Rafael J. Wysocki5294e252009-02-04 02:09:07 +0100554static void pci_pm_default_resume(struct pci_dev *pci_dev)
Rafael J. Wysocki571ff752009-01-07 13:05:05 +0100555{
Rafael J. Wysocki734104292009-01-07 13:07:15 +0100556 pci_fixup_device(pci_fixup_resume, pci_dev);
557
Rafael J. Wysocki5294e252009-02-04 02:09:07 +0100558 if (!pci_is_bridge(pci_dev))
559 pci_enable_wake(pci_dev, PCI_D0, false);
Rafael J. Wysocki571ff752009-01-07 13:05:05 +0100560}
561
Rafael J. Wysocki5294e252009-02-04 02:09:07 +0100562static void pci_pm_default_suspend(struct pci_dev *pci_dev)
Rafael J. Wysocki734104292009-01-07 13:07:15 +0100563{
Rafael J. Wysocki5294e252009-02-04 02:09:07 +0100564 /* Disable non-bridge devices without PM support */
Rafael J. Wysockicbbc2f62009-02-04 02:01:15 +0100565 if (!pci_is_bridge(pci_dev))
566 pci_disable_enabled_device(pci_dev);
Rafael J. Wysocki734104292009-01-07 13:07:15 +0100567}
568
Rafael J. Wysocki07e836e2009-01-07 13:06:10 +0100569static bool pci_has_legacy_pm_support(struct pci_dev *pci_dev)
570{
571 struct pci_driver *drv = pci_dev->driver;
Rafael J. Wysockibb808942009-01-07 14:15:17 +0100572 bool ret = drv && (drv->suspend || drv->suspend_late || drv->resume
Rafael J. Wysocki07e836e2009-01-07 13:06:10 +0100573 || drv->resume_early);
Rafael J. Wysockibb808942009-01-07 14:15:17 +0100574
575 /*
576 * Legacy PM support is used by default, so warn if the new framework is
577 * supported as well. Drivers are supposed to support either the
578 * former, or the latter, but not both at the same time.
579 */
David Fries82440a82011-11-20 15:29:46 -0600580 WARN(ret && drv->driver.pm, "driver %s device %04x:%04x\n",
581 drv->name, pci_dev->vendor, pci_dev->device);
Rafael J. Wysockibb808942009-01-07 14:15:17 +0100582
583 return ret;
Rafael J. Wysocki07e836e2009-01-07 13:06:10 +0100584}
585
Rafael J. Wysocki571ff752009-01-07 13:05:05 +0100586/* New power management framework */
587
Rafael J. Wysockibbb44d92008-05-20 00:49:04 +0200588static int pci_pm_prepare(struct device *dev)
589{
590 struct device_driver *drv = dev->driver;
591 int error = 0;
592
Rafael J. Wysocki6cbf8212010-02-17 23:44:58 +0100593 /*
594 * PCI devices suspended at run time need to be resumed at this
595 * point, because in general it is necessary to reconfigure them for
596 * system suspend. Namely, if the device is supposed to wake up the
597 * system from the sleep state, we may need to reconfigure it for this
598 * purpose. In turn, if the device is not supposed to wake up the
599 * system from the sleep state, we'll have to prevent it from signaling
600 * wake-up.
601 */
Rafael J. Wysockieea3fc032011-07-06 10:51:40 +0200602 pm_runtime_resume(dev);
Rafael J. Wysocki6cbf8212010-02-17 23:44:58 +0100603
Rafael J. Wysockibbb44d92008-05-20 00:49:04 +0200604 if (drv && drv->pm && drv->pm->prepare)
605 error = drv->pm->prepare(dev);
606
607 return error;
608}
609
610static void pci_pm_complete(struct device *dev)
611{
612 struct device_driver *drv = dev->driver;
613
614 if (drv && drv->pm && drv->pm->complete)
615 drv->pm->complete(dev);
616}
617
Rafael J. Wysocki6cbf8212010-02-17 23:44:58 +0100618#else /* !CONFIG_PM_SLEEP */
619
620#define pci_pm_prepare NULL
621#define pci_pm_complete NULL
622
623#endif /* !CONFIG_PM_SLEEP */
624
Rafael J. Wysockibbb44d92008-05-20 00:49:04 +0200625#ifdef CONFIG_SUSPEND
626
627static int pci_pm_suspend(struct device *dev)
628{
629 struct pci_dev *pci_dev = to_pci_dev(dev);
Dmitry Torokhov8150f322009-07-24 22:11:32 -0700630 const struct dev_pm_ops *pm = dev->driver ? dev->driver->pm : NULL;
Rafael J. Wysockibbb44d92008-05-20 00:49:04 +0200631
Rafael J. Wysockiad8cfa12009-01-07 13:09:37 +0100632 if (pci_has_legacy_pm_support(pci_dev))
633 return pci_legacy_suspend(dev, PMSG_SUSPEND);
Rafael J. Wysockibb808942009-01-07 14:15:17 +0100634
Rafael J. Wysocki5294e252009-02-04 02:09:07 +0100635 if (!pm) {
636 pci_pm_default_suspend(pci_dev);
637 goto Fixup;
Rafael J. Wysockibbb44d92008-05-20 00:49:04 +0200638 }
Rafael J. Wysockifa58d302009-01-07 13:03:42 +0100639
Rafael J. Wysocki5294e252009-02-04 02:09:07 +0100640 if (pm->suspend) {
641 pci_power_t prev = pci_dev->current_state;
642 int error;
643
644 error = pm->suspend(dev);
645 suspend_report_result(pm->suspend, error);
646 if (error)
647 return error;
648
Rafael J. Wysocki46939f82009-03-16 22:40:26 +0100649 if (!pci_dev->state_saved && pci_dev->current_state != PCI_D0
Rafael J. Wysocki5294e252009-02-04 02:09:07 +0100650 && pci_dev->current_state != PCI_UNKNOWN) {
651 WARN_ONCE(pci_dev->current_state != prev,
652 "PCI PM: State of device not saved by %pF\n",
653 pm->suspend);
Rafael J. Wysocki5294e252009-02-04 02:09:07 +0100654 }
655 }
656
Rafael J. Wysocki5294e252009-02-04 02:09:07 +0100657 Fixup:
658 pci_fixup_device(pci_fixup_suspend, pci_dev);
659
660 return 0;
Rafael J. Wysockibbb44d92008-05-20 00:49:04 +0200661}
662
663static int pci_pm_suspend_noirq(struct device *dev)
Greg KHc8958172005-04-08 14:53:31 +0900664{
Rafael J. Wysocki355a72d2008-12-08 00:34:57 +0100665 struct pci_dev *pci_dev = to_pci_dev(dev);
Dmitry Torokhov8150f322009-07-24 22:11:32 -0700666 const struct dev_pm_ops *pm = dev->driver ? dev->driver->pm : NULL;
Greg KHc8958172005-04-08 14:53:31 +0900667
Rafael J. Wysockibb808942009-01-07 14:15:17 +0100668 if (pci_has_legacy_pm_support(pci_dev))
669 return pci_legacy_suspend_late(dev, PMSG_SUSPEND);
670
Rafael J. Wysocki931ff682009-03-16 22:40:50 +0100671 if (!pm) {
672 pci_save_state(pci_dev);
Rafael J. Wysocki46939f82009-03-16 22:40:26 +0100673 return 0;
Rafael J. Wysocki931ff682009-03-16 22:40:50 +0100674 }
Rafael J. Wysocki46939f82009-03-16 22:40:26 +0100675
676 if (pm->suspend_noirq) {
677 pci_power_t prev = pci_dev->current_state;
678 int error;
679
680 error = pm->suspend_noirq(dev);
681 suspend_report_result(pm->suspend_noirq, error);
682 if (error)
683 return error;
684
685 if (!pci_dev->state_saved && pci_dev->current_state != PCI_D0
686 && pci_dev->current_state != PCI_UNKNOWN) {
687 WARN_ONCE(pci_dev->current_state != prev,
688 "PCI PM: State of device not saved by %pF\n",
689 pm->suspend_noirq);
690 return 0;
691 }
Rafael J. Wysockibbb44d92008-05-20 00:49:04 +0200692 }
693
Rafael J. Wysocki46939f82009-03-16 22:40:26 +0100694 if (!pci_dev->state_saved) {
695 pci_save_state(pci_dev);
696 if (!pci_is_bridge(pci_dev))
697 pci_prepare_to_sleep(pci_dev);
698 }
Rafael J. Wysockid67e37d2009-01-07 13:11:28 +0100699
Rafael J. Wysocki46939f82009-03-16 22:40:26 +0100700 pci_pm_set_unknown_state(pci_dev);
701
Alan Sterndbf0e4c2012-07-09 11:09:21 -0400702 /*
703 * Some BIOSes from ASUS have a bug: If a USB EHCI host controller's
704 * PCI COMMAND register isn't 0, the BIOS assumes that the controller
705 * hasn't been quiesced and tries to turn it off. If the controller
706 * is already in D3, this can hang or cause memory corruption.
707 *
708 * Since the value of the COMMAND register doesn't matter once the
709 * device has been suspended, we can safely set it to 0 here.
710 */
711 if (pci_dev->class == PCI_CLASS_SERIAL_USB_EHCI)
712 pci_write_config_word(pci_dev, PCI_COMMAND, 0);
713
Rafael J. Wysocki46939f82009-03-16 22:40:26 +0100714 return 0;
Greg KHc8958172005-04-08 14:53:31 +0900715}
Linus Torvalds1da177e2005-04-16 15:20:36 -0700716
Rafael J. Wysockibbb44d92008-05-20 00:49:04 +0200717static int pci_pm_resume_noirq(struct device *dev)
718{
Rafael J. Wysocki355a72d2008-12-08 00:34:57 +0100719 struct pci_dev *pci_dev = to_pci_dev(dev);
Rafael J. Wysockiadf09492008-10-06 22:46:05 +0200720 struct device_driver *drv = dev->driver;
Rafael J. Wysockibbb44d92008-05-20 00:49:04 +0200721 int error = 0;
722
Rafael J. Wysocki6cbf8212010-02-17 23:44:58 +0100723 pci_pm_default_resume_early(pci_dev);
Rafael J. Wysockiaa8c6c92009-01-16 21:54:43 +0100724
Rafael J. Wysockiad8cfa12009-01-07 13:09:37 +0100725 if (pci_has_legacy_pm_support(pci_dev))
Rafael J. Wysockibb808942009-01-07 14:15:17 +0100726 return pci_legacy_resume_early(dev);
Rafael J. Wysockibb808942009-01-07 14:15:17 +0100727
Rafael J. Wysockid67e37d2009-01-07 13:11:28 +0100728 if (drv && drv->pm && drv->pm->resume_noirq)
729 error = drv->pm->resume_noirq(dev);
Rafael J. Wysockibbb44d92008-05-20 00:49:04 +0200730
731 return error;
732}
733
Rafael J. Wysockif6dc1e52009-01-07 13:12:22 +0100734static int pci_pm_resume(struct device *dev)
735{
736 struct pci_dev *pci_dev = to_pci_dev(dev);
Dmitry Torokhov8150f322009-07-24 22:11:32 -0700737 const struct dev_pm_ops *pm = dev->driver ? dev->driver->pm : NULL;
Rafael J. Wysockif6dc1e52009-01-07 13:12:22 +0100738 int error = 0;
739
Rafael J. Wysocki418e4da2009-01-26 21:43:08 +0100740 /*
741 * This is necessary for the suspend error path in which resume is
742 * called without restoring the standard config registers of the device.
743 */
744 if (pci_dev->state_saved)
745 pci_restore_standard_config(pci_dev);
746
Rafael J. Wysockif6dc1e52009-01-07 13:12:22 +0100747 if (pci_has_legacy_pm_support(pci_dev))
748 return pci_legacy_resume(dev);
749
Rafael J. Wysocki5294e252009-02-04 02:09:07 +0100750 pci_pm_default_resume(pci_dev);
Rafael J. Wysockif6dc1e52009-01-07 13:12:22 +0100751
Rafael J. Wysocki5294e252009-02-04 02:09:07 +0100752 if (pm) {
753 if (pm->resume)
754 error = pm->resume(dev);
755 } else {
756 pci_pm_reenable_device(pci_dev);
757 }
Rafael J. Wysockif6dc1e52009-01-07 13:12:22 +0100758
Rafael J. Wysocki999cce42009-09-09 23:51:27 +0200759 return error;
Rafael J. Wysockif6dc1e52009-01-07 13:12:22 +0100760}
761
Rafael J. Wysockibbb44d92008-05-20 00:49:04 +0200762#else /* !CONFIG_SUSPEND */
763
764#define pci_pm_suspend NULL
765#define pci_pm_suspend_noirq NULL
766#define pci_pm_resume NULL
767#define pci_pm_resume_noirq NULL
768
769#endif /* !CONFIG_SUSPEND */
770
Rafael J. Wysocki1f112ce2011-04-11 22:54:42 +0200771#ifdef CONFIG_HIBERNATE_CALLBACKS
Rafael J. Wysockibbb44d92008-05-20 00:49:04 +0200772
773static int pci_pm_freeze(struct device *dev)
774{
775 struct pci_dev *pci_dev = to_pci_dev(dev);
Dmitry Torokhov8150f322009-07-24 22:11:32 -0700776 const struct dev_pm_ops *pm = dev->driver ? dev->driver->pm : NULL;
Rafael J. Wysockibbb44d92008-05-20 00:49:04 +0200777
Rafael J. Wysockiad8cfa12009-01-07 13:09:37 +0100778 if (pci_has_legacy_pm_support(pci_dev))
779 return pci_legacy_suspend(dev, PMSG_FREEZE);
Rafael J. Wysockibb808942009-01-07 14:15:17 +0100780
Rafael J. Wysocki5294e252009-02-04 02:09:07 +0100781 if (!pm) {
782 pci_pm_default_suspend(pci_dev);
783 return 0;
Rafael J. Wysockibbb44d92008-05-20 00:49:04 +0200784 }
785
Rafael J. Wysocki5294e252009-02-04 02:09:07 +0100786 if (pm->freeze) {
787 int error;
788
789 error = pm->freeze(dev);
790 suspend_report_result(pm->freeze, error);
791 if (error)
792 return error;
793 }
794
Rafael J. Wysocki5294e252009-02-04 02:09:07 +0100795 return 0;
Rafael J. Wysockibbb44d92008-05-20 00:49:04 +0200796}
797
798static int pci_pm_freeze_noirq(struct device *dev)
799{
Rafael J. Wysocki355a72d2008-12-08 00:34:57 +0100800 struct pci_dev *pci_dev = to_pci_dev(dev);
Rafael J. Wysockiadf09492008-10-06 22:46:05 +0200801 struct device_driver *drv = dev->driver;
Rafael J. Wysockibbb44d92008-05-20 00:49:04 +0200802
Rafael J. Wysockibb808942009-01-07 14:15:17 +0100803 if (pci_has_legacy_pm_support(pci_dev))
804 return pci_legacy_suspend_late(dev, PMSG_FREEZE);
805
Rafael J. Wysockid67e37d2009-01-07 13:11:28 +0100806 if (drv && drv->pm && drv->pm->freeze_noirq) {
Rafael J. Wysocki46939f82009-03-16 22:40:26 +0100807 int error;
808
Rafael J. Wysockid67e37d2009-01-07 13:11:28 +0100809 error = drv->pm->freeze_noirq(dev);
810 suspend_report_result(drv->pm->freeze_noirq, error);
Rafael J. Wysocki46939f82009-03-16 22:40:26 +0100811 if (error)
812 return error;
Rafael J. Wysockibbb44d92008-05-20 00:49:04 +0200813 }
814
Rafael J. Wysocki46939f82009-03-16 22:40:26 +0100815 if (!pci_dev->state_saved)
816 pci_save_state(pci_dev);
Rafael J. Wysockid67e37d2009-01-07 13:11:28 +0100817
Rafael J. Wysocki46939f82009-03-16 22:40:26 +0100818 pci_pm_set_unknown_state(pci_dev);
819
820 return 0;
Rafael J. Wysockibbb44d92008-05-20 00:49:04 +0200821}
822
Rafael J. Wysockibbb44d92008-05-20 00:49:04 +0200823static int pci_pm_thaw_noirq(struct device *dev)
824{
Rafael J. Wysocki355a72d2008-12-08 00:34:57 +0100825 struct pci_dev *pci_dev = to_pci_dev(dev);
Rafael J. Wysockiadf09492008-10-06 22:46:05 +0200826 struct device_driver *drv = dev->driver;
Rafael J. Wysockibbb44d92008-05-20 00:49:04 +0200827 int error = 0;
828
Rafael J. Wysockiad8cfa12009-01-07 13:09:37 +0100829 if (pci_has_legacy_pm_support(pci_dev))
Rafael J. Wysockibb808942009-01-07 14:15:17 +0100830 return pci_legacy_resume_early(dev);
Rafael J. Wysockibb808942009-01-07 14:15:17 +0100831
Rafael J. Wysockid67e37d2009-01-07 13:11:28 +0100832 pci_update_current_state(pci_dev, PCI_D0);
833
834 if (drv && drv->pm && drv->pm->thaw_noirq)
835 error = drv->pm->thaw_noirq(dev);
Rafael J. Wysockibbb44d92008-05-20 00:49:04 +0200836
837 return error;
838}
839
Rafael J. Wysockif6dc1e52009-01-07 13:12:22 +0100840static int pci_pm_thaw(struct device *dev)
841{
842 struct pci_dev *pci_dev = to_pci_dev(dev);
Dmitry Torokhov8150f322009-07-24 22:11:32 -0700843 const struct dev_pm_ops *pm = dev->driver ? dev->driver->pm : NULL;
Rafael J. Wysockif6dc1e52009-01-07 13:12:22 +0100844 int error = 0;
845
846 if (pci_has_legacy_pm_support(pci_dev))
847 return pci_legacy_resume(dev);
848
Rafael J. Wysocki5294e252009-02-04 02:09:07 +0100849 if (pm) {
850 if (pm->thaw)
851 error = pm->thaw(dev);
852 } else {
853 pci_pm_reenable_device(pci_dev);
854 }
Rafael J. Wysockif6dc1e52009-01-07 13:12:22 +0100855
Rafael J. Wysocki4b77b0a2009-09-09 23:49:59 +0200856 pci_dev->state_saved = false;
857
Rafael J. Wysockif6dc1e52009-01-07 13:12:22 +0100858 return error;
859}
860
Rafael J. Wysockibbb44d92008-05-20 00:49:04 +0200861static int pci_pm_poweroff(struct device *dev)
862{
Rafael J. Wysocki355a72d2008-12-08 00:34:57 +0100863 struct pci_dev *pci_dev = to_pci_dev(dev);
Dmitry Torokhov8150f322009-07-24 22:11:32 -0700864 const struct dev_pm_ops *pm = dev->driver ? dev->driver->pm : NULL;
Rafael J. Wysockibbb44d92008-05-20 00:49:04 +0200865
Rafael J. Wysockiad8cfa12009-01-07 13:09:37 +0100866 if (pci_has_legacy_pm_support(pci_dev))
867 return pci_legacy_suspend(dev, PMSG_HIBERNATE);
Rafael J. Wysockibb808942009-01-07 14:15:17 +0100868
Rafael J. Wysocki5294e252009-02-04 02:09:07 +0100869 if (!pm) {
870 pci_pm_default_suspend(pci_dev);
871 goto Fixup;
872 }
873
Rafael J. Wysocki5294e252009-02-04 02:09:07 +0100874 if (pm->poweroff) {
Rafael J. Wysocki46939f82009-03-16 22:40:26 +0100875 int error;
876
Rafael J. Wysockiddb7c9d2009-02-04 01:56:14 +0100877 error = pm->poweroff(dev);
878 suspend_report_result(pm->poweroff, error);
Rafael J. Wysocki46939f82009-03-16 22:40:26 +0100879 if (error)
880 return error;
881 }
882
883 Fixup:
884 pci_fixup_device(pci_fixup_suspend, pci_dev);
885
886 return 0;
887}
888
889static int pci_pm_poweroff_noirq(struct device *dev)
890{
891 struct pci_dev *pci_dev = to_pci_dev(dev);
892 struct device_driver *drv = dev->driver;
893
894 if (pci_has_legacy_pm_support(to_pci_dev(dev)))
895 return pci_legacy_suspend_late(dev, PMSG_HIBERNATE);
896
897 if (!drv || !drv->pm)
898 return 0;
899
900 if (drv->pm->poweroff_noirq) {
901 int error;
902
903 error = drv->pm->poweroff_noirq(dev);
904 suspend_report_result(drv->pm->poweroff_noirq, error);
905 if (error)
906 return error;
Rafael J. Wysockibbb44d92008-05-20 00:49:04 +0200907 }
908
Rafael J. Wysocki5294e252009-02-04 02:09:07 +0100909 if (!pci_dev->state_saved && !pci_is_bridge(pci_dev))
910 pci_prepare_to_sleep(pci_dev);
911
Rafael J. Wysocki0b68c8e2012-08-12 23:26:07 +0200912 /*
913 * The reason for doing this here is the same as for the analogous code
914 * in pci_pm_suspend_noirq().
915 */
916 if (pci_dev->class == PCI_CLASS_SERIAL_USB_EHCI)
917 pci_write_config_word(pci_dev, PCI_COMMAND, 0);
918
Rafael J. Wysocki46939f82009-03-16 22:40:26 +0100919 return 0;
Rafael J. Wysockibbb44d92008-05-20 00:49:04 +0200920}
921
Rafael J. Wysockibbb44d92008-05-20 00:49:04 +0200922static int pci_pm_restore_noirq(struct device *dev)
923{
924 struct pci_dev *pci_dev = to_pci_dev(dev);
Rafael J. Wysockiadf09492008-10-06 22:46:05 +0200925 struct device_driver *drv = dev->driver;
Rafael J. Wysockibbb44d92008-05-20 00:49:04 +0200926 int error = 0;
927
Rafael J. Wysocki6cbf8212010-02-17 23:44:58 +0100928 pci_pm_default_resume_early(pci_dev);
Rafael J. Wysockiaa8c6c92009-01-16 21:54:43 +0100929
Rafael J. Wysockiad8cfa12009-01-07 13:09:37 +0100930 if (pci_has_legacy_pm_support(pci_dev))
Rafael J. Wysockibb808942009-01-07 14:15:17 +0100931 return pci_legacy_resume_early(dev);
Rafael J. Wysockibb808942009-01-07 14:15:17 +0100932
Rafael J. Wysockid67e37d2009-01-07 13:11:28 +0100933 if (drv && drv->pm && drv->pm->restore_noirq)
934 error = drv->pm->restore_noirq(dev);
Rafael J. Wysockibbb44d92008-05-20 00:49:04 +0200935
936 return error;
937}
938
Rafael J. Wysockif6dc1e52009-01-07 13:12:22 +0100939static int pci_pm_restore(struct device *dev)
940{
941 struct pci_dev *pci_dev = to_pci_dev(dev);
Dmitry Torokhov8150f322009-07-24 22:11:32 -0700942 const struct dev_pm_ops *pm = dev->driver ? dev->driver->pm : NULL;
Rafael J. Wysockif6dc1e52009-01-07 13:12:22 +0100943 int error = 0;
944
Rafael J. Wysocki418e4da2009-01-26 21:43:08 +0100945 /*
946 * This is necessary for the hibernation error path in which restore is
947 * called without restoring the standard config registers of the device.
948 */
949 if (pci_dev->state_saved)
950 pci_restore_standard_config(pci_dev);
951
Rafael J. Wysockif6dc1e52009-01-07 13:12:22 +0100952 if (pci_has_legacy_pm_support(pci_dev))
953 return pci_legacy_resume(dev);
954
Rafael J. Wysocki5294e252009-02-04 02:09:07 +0100955 pci_pm_default_resume(pci_dev);
Rafael J. Wysockif6dc1e52009-01-07 13:12:22 +0100956
Rafael J. Wysocki5294e252009-02-04 02:09:07 +0100957 if (pm) {
958 if (pm->restore)
959 error = pm->restore(dev);
960 } else {
961 pci_pm_reenable_device(pci_dev);
962 }
Rafael J. Wysockif6dc1e52009-01-07 13:12:22 +0100963
964 return error;
965}
966
Rafael J. Wysocki1f112ce2011-04-11 22:54:42 +0200967#else /* !CONFIG_HIBERNATE_CALLBACKS */
Rafael J. Wysockibbb44d92008-05-20 00:49:04 +0200968
969#define pci_pm_freeze NULL
970#define pci_pm_freeze_noirq NULL
971#define pci_pm_thaw NULL
972#define pci_pm_thaw_noirq NULL
973#define pci_pm_poweroff NULL
974#define pci_pm_poweroff_noirq NULL
975#define pci_pm_restore NULL
976#define pci_pm_restore_noirq NULL
977
Rafael J. Wysocki1f112ce2011-04-11 22:54:42 +0200978#endif /* !CONFIG_HIBERNATE_CALLBACKS */
Rafael J. Wysockibbb44d92008-05-20 00:49:04 +0200979
Rafael J. Wysocki6cbf8212010-02-17 23:44:58 +0100980#ifdef CONFIG_PM_RUNTIME
981
982static int pci_pm_runtime_suspend(struct device *dev)
983{
984 struct pci_dev *pci_dev = to_pci_dev(dev);
985 const struct dev_pm_ops *pm = dev->driver ? dev->driver->pm : NULL;
986 pci_power_t prev = pci_dev->current_state;
987 int error;
988
989 if (!pm || !pm->runtime_suspend)
990 return -ENOSYS;
991
Huang Ying448bd852012-06-23 10:23:51 +0800992 pci_dev->no_d3cold = false;
Rafael J. Wysocki6cbf8212010-02-17 23:44:58 +0100993 error = pm->runtime_suspend(dev);
994 suspend_report_result(pm->runtime_suspend, error);
995 if (error)
996 return error;
Huang Ying448bd852012-06-23 10:23:51 +0800997 if (!pci_dev->d3cold_allowed)
998 pci_dev->no_d3cold = true;
Rafael J. Wysocki6cbf8212010-02-17 23:44:58 +0100999
1000 pci_fixup_device(pci_fixup_suspend, pci_dev);
1001
1002 if (!pci_dev->state_saved && pci_dev->current_state != PCI_D0
1003 && pci_dev->current_state != PCI_UNKNOWN) {
1004 WARN_ONCE(pci_dev->current_state != prev,
1005 "PCI PM: State of device not saved by %pF\n",
1006 pm->runtime_suspend);
1007 return 0;
1008 }
1009
1010 if (!pci_dev->state_saved)
1011 pci_save_state(pci_dev);
1012
1013 pci_finish_runtime_suspend(pci_dev);
1014
1015 return 0;
1016}
1017
1018static int pci_pm_runtime_resume(struct device *dev)
1019{
Huang Ying448bd852012-06-23 10:23:51 +08001020 int rc;
Rafael J. Wysocki6cbf8212010-02-17 23:44:58 +01001021 struct pci_dev *pci_dev = to_pci_dev(dev);
1022 const struct dev_pm_ops *pm = dev->driver ? dev->driver->pm : NULL;
1023
1024 if (!pm || !pm->runtime_resume)
1025 return -ENOSYS;
1026
Rafael J. Wysockidb288c92012-07-05 15:20:00 -06001027 pci_restore_standard_config(pci_dev);
1028 pci_fixup_device(pci_fixup_resume_early, pci_dev);
Rafael J. Wysocki6cbf8212010-02-17 23:44:58 +01001029 __pci_enable_wake(pci_dev, PCI_D0, true, false);
1030 pci_fixup_device(pci_fixup_resume, pci_dev);
1031
Huang Ying448bd852012-06-23 10:23:51 +08001032 rc = pm->runtime_resume(dev);
1033
1034 pci_dev->runtime_d3cold = false;
1035
1036 return rc;
Rafael J. Wysocki6cbf8212010-02-17 23:44:58 +01001037}
1038
1039static int pci_pm_runtime_idle(struct device *dev)
1040{
1041 const struct dev_pm_ops *pm = dev->driver ? dev->driver->pm : NULL;
1042
1043 if (!pm)
1044 return -ENOSYS;
1045
1046 if (pm->runtime_idle) {
1047 int ret = pm->runtime_idle(dev);
1048 if (ret)
1049 return ret;
1050 }
1051
1052 pm_runtime_suspend(dev);
1053
1054 return 0;
1055}
1056
1057#else /* !CONFIG_PM_RUNTIME */
1058
1059#define pci_pm_runtime_suspend NULL
1060#define pci_pm_runtime_resume NULL
1061#define pci_pm_runtime_idle NULL
1062
1063#endif /* !CONFIG_PM_RUNTIME */
1064
Rafael J. Wysockiaa338602011-02-11 00:06:54 +01001065#ifdef CONFIG_PM
Rafael J. Wysocki6cbf8212010-02-17 23:44:58 +01001066
Dmitry Torokhov8150f322009-07-24 22:11:32 -07001067const struct dev_pm_ops pci_dev_pm_ops = {
Rafael J. Wysockiadf09492008-10-06 22:46:05 +02001068 .prepare = pci_pm_prepare,
1069 .complete = pci_pm_complete,
1070 .suspend = pci_pm_suspend,
1071 .resume = pci_pm_resume,
1072 .freeze = pci_pm_freeze,
1073 .thaw = pci_pm_thaw,
1074 .poweroff = pci_pm_poweroff,
1075 .restore = pci_pm_restore,
Rafael J. Wysockibbb44d92008-05-20 00:49:04 +02001076 .suspend_noirq = pci_pm_suspend_noirq,
1077 .resume_noirq = pci_pm_resume_noirq,
1078 .freeze_noirq = pci_pm_freeze_noirq,
1079 .thaw_noirq = pci_pm_thaw_noirq,
1080 .poweroff_noirq = pci_pm_poweroff_noirq,
1081 .restore_noirq = pci_pm_restore_noirq,
Rafael J. Wysocki6cbf8212010-02-17 23:44:58 +01001082 .runtime_suspend = pci_pm_runtime_suspend,
1083 .runtime_resume = pci_pm_runtime_resume,
1084 .runtime_idle = pci_pm_runtime_idle,
Rafael J. Wysockibbb44d92008-05-20 00:49:04 +02001085};
1086
Rafael J. Wysockiadf09492008-10-06 22:46:05 +02001087#define PCI_PM_OPS_PTR (&pci_dev_pm_ops)
Rafael J. Wysockibbb44d92008-05-20 00:49:04 +02001088
Rafael J. Wysocki6cbf8212010-02-17 23:44:58 +01001089#else /* !COMFIG_PM_OPS */
Rafael J. Wysockibbb44d92008-05-20 00:49:04 +02001090
1091#define PCI_PM_OPS_PTR NULL
1092
Rafael J. Wysocki6cbf8212010-02-17 23:44:58 +01001093#endif /* !COMFIG_PM_OPS */
Rafael J. Wysockibbb44d92008-05-20 00:49:04 +02001094
Linus Torvalds1da177e2005-04-16 15:20:36 -07001095/**
Laurent riffard863b18f2005-10-27 23:12:54 +02001096 * __pci_register_driver - register a new pci driver
Linus Torvalds1da177e2005-04-16 15:20:36 -07001097 * @drv: the driver structure to register
Laurent riffard863b18f2005-10-27 23:12:54 +02001098 * @owner: owner module of drv
Randy Dunlapf95d8822007-02-10 14:41:56 -08001099 * @mod_name: module name string
Linus Torvalds1da177e2005-04-16 15:20:36 -07001100 *
1101 * Adds the driver structure to the list of registered drivers.
1102 * Returns a negative value on error, otherwise 0.
Steven Coleeaae4b32005-05-03 18:38:30 -06001103 * If no error occurred, the driver remains registered even if
Linus Torvalds1da177e2005-04-16 15:20:36 -07001104 * no device was claimed during registration.
1105 */
Greg Kroah-Hartman725522b2007-01-15 11:50:02 -08001106int __pci_register_driver(struct pci_driver *drv, struct module *owner,
1107 const char *mod_name)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001108{
Linus Torvalds1da177e2005-04-16 15:20:36 -07001109 /* initialize common driver fields */
1110 drv->driver.name = drv->name;
1111 drv->driver.bus = &pci_bus_type;
Laurent riffard863b18f2005-10-27 23:12:54 +02001112 drv->driver.owner = owner;
Greg Kroah-Hartman725522b2007-01-15 11:50:02 -08001113 drv->driver.mod_name = mod_name;
Alan Cox50b00752006-08-16 17:42:18 +01001114
Greg Kroah-Hartman75865852005-06-30 02:18:12 -07001115 spin_lock_init(&drv->dynids.lock);
1116 INIT_LIST_HEAD(&drv->dynids.list);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001117
1118 /* register with core */
Konstantin Khlebnikovbfb09a82012-08-08 14:47:51 +04001119 return driver_register(&drv->driver);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001120}
1121
1122/**
1123 * pci_unregister_driver - unregister a pci driver
1124 * @drv: the driver structure to unregister
1125 *
1126 * Deletes the driver structure from the list of registered PCI drivers,
1127 * gives it a chance to clean up by calling its remove() function for
1128 * each device it was responsible for, and marks those devices as
1129 * driverless.
1130 */
1131
1132void
1133pci_unregister_driver(struct pci_driver *drv)
1134{
1135 driver_unregister(&drv->driver);
1136 pci_free_dynids(drv);
1137}
1138
1139static struct pci_driver pci_compat_driver = {
1140 .name = "compat"
1141};
1142
1143/**
1144 * pci_dev_driver - get the pci_driver of a device
1145 * @dev: the device to query
1146 *
1147 * Returns the appropriate pci_driver structure or %NULL if there is no
1148 * registered driver for the device.
1149 */
1150struct pci_driver *
1151pci_dev_driver(const struct pci_dev *dev)
1152{
1153 if (dev->driver)
1154 return dev->driver;
1155 else {
1156 int i;
1157 for(i=0; i<=PCI_ROM_RESOURCE; i++)
1158 if (dev->resource[i].flags & IORESOURCE_BUSY)
1159 return &pci_compat_driver;
1160 }
1161 return NULL;
1162}
1163
1164/**
1165 * pci_bus_match - Tell if a PCI device structure has a matching PCI device id structure
Linus Torvalds1da177e2005-04-16 15:20:36 -07001166 * @dev: the PCI device structure to match against
Randy Dunlap8f7020d2005-10-23 11:57:38 -07001167 * @drv: the device driver to search for matching PCI device id structures
Linus Torvalds1da177e2005-04-16 15:20:36 -07001168 *
1169 * Used by a driver to check whether a PCI device present in the
Randy Dunlap8f7020d2005-10-23 11:57:38 -07001170 * system is in its list of supported devices. Returns the matching
Linus Torvalds1da177e2005-04-16 15:20:36 -07001171 * pci_device_id structure or %NULL if there is no match.
1172 */
Greg Kroah-Hartman75865852005-06-30 02:18:12 -07001173static int pci_bus_match(struct device *dev, struct device_driver *drv)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001174{
Greg Kroah-Hartman75865852005-06-30 02:18:12 -07001175 struct pci_dev *pci_dev = to_pci_dev(dev);
1176 struct pci_driver *pci_drv = to_pci_driver(drv);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001177 const struct pci_device_id *found_id;
1178
Greg Kroah-Hartman75865852005-06-30 02:18:12 -07001179 found_id = pci_match_device(pci_drv, pci_dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001180 if (found_id)
1181 return 1;
1182
Greg Kroah-Hartman75865852005-06-30 02:18:12 -07001183 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001184}
1185
1186/**
1187 * pci_dev_get - increments the reference count of the pci device structure
1188 * @dev: the device being referenced
1189 *
1190 * Each live reference to a device should be refcounted.
1191 *
1192 * Drivers for PCI devices should normally record such references in
1193 * their probe() methods, when they bind to a device, and release
1194 * them by calling pci_dev_put(), in their disconnect() methods.
1195 *
1196 * A pointer to the device with the incremented reference counter is returned.
1197 */
1198struct pci_dev *pci_dev_get(struct pci_dev *dev)
1199{
1200 if (dev)
1201 get_device(&dev->dev);
1202 return dev;
1203}
1204
1205/**
1206 * pci_dev_put - release a use of the pci device structure
1207 * @dev: device that's been disconnected
1208 *
1209 * Must be called when a user of a device is finished with it. When the last
1210 * user of the device calls this function, the memory of the device is freed.
1211 */
1212void pci_dev_put(struct pci_dev *dev)
1213{
1214 if (dev)
1215 put_device(&dev->dev);
1216}
1217
Bill Pemberton8ccc9aa2012-11-21 15:34:58 -05001218static int pci_uevent(struct device *dev, struct kobj_uevent_env *env)
1219{
1220 struct pci_dev *pdev;
1221
1222 if (!dev)
1223 return -ENODEV;
1224
1225 pdev = to_pci_dev(dev);
1226 if (!pdev)
1227 return -ENODEV;
1228
1229 if (add_uevent_var(env, "PCI_CLASS=%04X", pdev->class))
1230 return -ENOMEM;
1231
1232 if (add_uevent_var(env, "PCI_ID=%04X:%04X", pdev->vendor, pdev->device))
1233 return -ENOMEM;
1234
1235 if (add_uevent_var(env, "PCI_SUBSYS_ID=%04X:%04X", pdev->subsystem_vendor,
1236 pdev->subsystem_device))
1237 return -ENOMEM;
1238
1239 if (add_uevent_var(env, "PCI_SLOT_NAME=%s", pci_name(pdev)))
1240 return -ENOMEM;
1241
1242 if (add_uevent_var(env, "MODALIAS=pci:v%08Xd%08Xsv%08Xsd%08Xbc%02Xsc%02Xi%02x",
1243 pdev->vendor, pdev->device,
1244 pdev->subsystem_vendor, pdev->subsystem_device,
1245 (u8)(pdev->class >> 16), (u8)(pdev->class >> 8),
1246 (u8)(pdev->class)))
1247 return -ENOMEM;
1248 return 0;
1249}
1250
Linus Torvalds1da177e2005-04-16 15:20:36 -07001251struct bus_type pci_bus_type = {
1252 .name = "pci",
1253 .match = pci_bus_match,
Kay Sievers312c0042005-11-16 09:00:00 +01001254 .uevent = pci_uevent,
Russell Kingb15d6862006-01-05 14:30:22 +00001255 .probe = pci_device_probe,
1256 .remove = pci_device_remove,
Linus Torvaldscbd69db2006-06-24 14:50:29 -07001257 .shutdown = pci_device_shutdown,
Linus Torvalds1da177e2005-04-16 15:20:36 -07001258 .dev_attrs = pci_dev_attrs,
Alex Chiang705b1aa2009-03-20 14:56:31 -06001259 .bus_attrs = pci_bus_attrs,
Konstantin Khlebnikovbfb09a82012-08-08 14:47:51 +04001260 .drv_attrs = pci_drv_attrs,
Rafael J. Wysockibbb44d92008-05-20 00:49:04 +02001261 .pm = PCI_PM_OPS_PTR,
Linus Torvalds1da177e2005-04-16 15:20:36 -07001262};
1263
1264static int __init pci_driver_init(void)
1265{
1266 return bus_register(&pci_bus_type);
1267}
1268
1269postcore_initcall(pci_driver_init);
1270
Tejun Heo9dba9102009-09-03 15:26:36 +09001271EXPORT_SYMBOL_GPL(pci_add_dynid);
Greg Kroah-Hartman75865852005-06-30 02:18:12 -07001272EXPORT_SYMBOL(pci_match_id);
Laurent riffard863b18f2005-10-27 23:12:54 +02001273EXPORT_SYMBOL(__pci_register_driver);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001274EXPORT_SYMBOL(pci_unregister_driver);
1275EXPORT_SYMBOL(pci_dev_driver);
1276EXPORT_SYMBOL(pci_bus_type);
1277EXPORT_SYMBOL(pci_dev_get);
1278EXPORT_SYMBOL(pci_dev_put);