blob: d6fd6b6d9d4b575c26eb0041e503ddb10ddb9d64 [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. Wysockieea3fc02011-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
92/*
93 * Dynamic device ID manipulation via sysfs is disabled for !CONFIG_HOTPLUG
94 */
95#ifdef CONFIG_HOTPLUG
96/**
97 * store_new_id - sysfs frontend to pci_add_dynid()
Randy Dunlap8f7020d2005-10-23 11:57:38 -070098 * @driver: target device driver
99 * @buf: buffer for scanning device ID data
100 * @count: input size
Linus Torvalds1da177e2005-04-16 15:20:36 -0700101 *
Tejun Heo9dba9102009-09-03 15:26:36 +0900102 * Allow PCI IDs to be added to an existing driver via sysfs.
Linus Torvalds1da177e2005-04-16 15:20:36 -0700103 */
Randy Dunlapf8eb1002005-10-28 20:36:51 -0700104static ssize_t
Linus Torvalds1da177e2005-04-16 15:20:36 -0700105store_new_id(struct device_driver *driver, const char *buf, size_t count)
106{
Linus Torvalds1da177e2005-04-16 15:20:36 -0700107 struct pci_driver *pdrv = to_pci_driver(driver);
Jean Delvareb41d6cf2008-08-17 21:06:59 +0200108 const struct pci_device_id *ids = pdrv->id_table;
Jean Delvare6ba18632007-04-07 17:21:28 +0200109 __u32 vendor, device, subvendor=PCI_ANY_ID,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700110 subdevice=PCI_ANY_ID, class=0, class_mask=0;
111 unsigned long driver_data=0;
112 int fields=0;
Tejun Heo9dba9102009-09-03 15:26:36 +0900113 int retval;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700114
Jean Delvareb41d6cf2008-08-17 21:06:59 +0200115 fields = sscanf(buf, "%x %x %x %x %x %x %lx",
Linus Torvalds1da177e2005-04-16 15:20:36 -0700116 &vendor, &device, &subvendor, &subdevice,
117 &class, &class_mask, &driver_data);
Jean Delvare6ba18632007-04-07 17:21:28 +0200118 if (fields < 2)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700119 return -EINVAL;
120
Jean Delvareb41d6cf2008-08-17 21:06:59 +0200121 /* Only accept driver_data values that match an existing id_table
122 entry */
Chris Wright2debb4d2008-11-25 19:36:10 -0800123 if (ids) {
124 retval = -EINVAL;
125 while (ids->vendor || ids->subvendor || ids->class_mask) {
126 if (driver_data == ids->driver_data) {
127 retval = 0;
128 break;
129 }
130 ids++;
Jean Delvareb41d6cf2008-08-17 21:06:59 +0200131 }
Chris Wright2debb4d2008-11-25 19:36:10 -0800132 if (retval) /* No match */
133 return retval;
Jean Delvareb41d6cf2008-08-17 21:06:59 +0200134 }
Jean Delvareb41d6cf2008-08-17 21:06:59 +0200135
Tejun Heo9dba9102009-09-03 15:26:36 +0900136 retval = pci_add_dynid(pdrv, vendor, device, subvendor, subdevice,
137 class, class_mask, driver_data);
Greg Kroah-Hartmanb19441a2006-08-28 11:43:25 -0700138 if (retval)
139 return retval;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700140 return count;
141}
Linus Torvalds1da177e2005-04-16 15:20:36 -0700142static DRIVER_ATTR(new_id, S_IWUSR, NULL, store_new_id);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700143
Chris Wright09943752009-02-23 21:52:23 -0800144/**
145 * store_remove_id - remove a PCI device ID from this driver
146 * @driver: target device driver
147 * @buf: buffer for scanning device ID data
148 * @count: input size
149 *
150 * Removes a dynamic pci device ID to this driver.
151 */
152static ssize_t
153store_remove_id(struct device_driver *driver, const char *buf, size_t count)
154{
155 struct pci_dynid *dynid, *n;
156 struct pci_driver *pdrv = to_pci_driver(driver);
157 __u32 vendor, device, subvendor = PCI_ANY_ID,
158 subdevice = PCI_ANY_ID, class = 0, class_mask = 0;
159 int fields = 0;
160 int retval = -ENODEV;
161
162 fields = sscanf(buf, "%x %x %x %x %x %x",
163 &vendor, &device, &subvendor, &subdevice,
164 &class, &class_mask);
165 if (fields < 2)
166 return -EINVAL;
167
168 spin_lock(&pdrv->dynids.lock);
169 list_for_each_entry_safe(dynid, n, &pdrv->dynids.list, node) {
170 struct pci_device_id *id = &dynid->id;
171 if ((id->vendor == vendor) &&
172 (id->device == device) &&
173 (subvendor == PCI_ANY_ID || id->subvendor == subvendor) &&
174 (subdevice == PCI_ANY_ID || id->subdevice == subdevice) &&
175 !((id->class ^ class) & class_mask)) {
176 list_del(&dynid->node);
177 kfree(dynid);
178 retval = 0;
179 break;
180 }
181 }
182 spin_unlock(&pdrv->dynids.lock);
183
184 if (retval)
185 return retval;
186 return count;
187}
188static DRIVER_ATTR(remove_id, S_IWUSR, NULL, store_remove_id);
189
Linus Torvalds1da177e2005-04-16 15:20:36 -0700190static int
Alan Sterned283e92012-01-24 14:35:13 -0500191pci_create_newid_files(struct pci_driver *drv)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700192{
193 int error = 0;
Alan Sterned283e92012-01-24 14:35:13 -0500194
195 if (drv->probe != NULL) {
Greg Kroah-Hartman03d43b12007-11-28 12:23:18 -0800196 error = driver_create_file(&drv->driver, &driver_attr_new_id);
Alan Sterned283e92012-01-24 14:35:13 -0500197 if (error == 0) {
198 error = driver_create_file(&drv->driver,
199 &driver_attr_remove_id);
200 if (error)
201 driver_remove_file(&drv->driver,
202 &driver_attr_new_id);
203 }
204 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700205 return error;
206}
207
Alan Sterned283e92012-01-24 14:35:13 -0500208static void pci_remove_newid_files(struct pci_driver *drv)
Chris Wright09943752009-02-23 21:52:23 -0800209{
210 driver_remove_file(&drv->driver, &driver_attr_remove_id);
Alan Sterned283e92012-01-24 14:35:13 -0500211 driver_remove_file(&drv->driver, &driver_attr_new_id);
Chris Wright09943752009-02-23 21:52:23 -0800212}
Linus Torvalds1da177e2005-04-16 15:20:36 -0700213#else /* !CONFIG_HOTPLUG */
Alan Sterned283e92012-01-24 14:35:13 -0500214static inline int pci_create_newid_files(struct pci_driver *drv)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700215{
216 return 0;
217}
Alan Sterned283e92012-01-24 14:35:13 -0500218static inline void pci_remove_newid_files(struct pci_driver *drv) {}
Linus Torvalds1da177e2005-04-16 15:20:36 -0700219#endif
220
221/**
Greg Kroah-Hartman75865852005-06-30 02:18:12 -0700222 * pci_match_id - See if a pci device matches a given pci_id table
Linus Torvalds1da177e2005-04-16 15:20:36 -0700223 * @ids: array of PCI device id structures to search in
Greg Kroah-Hartman75865852005-06-30 02:18:12 -0700224 * @dev: the PCI device structure to match against.
225 *
Linus Torvalds1da177e2005-04-16 15:20:36 -0700226 * Used by a driver to check whether a PCI device present in the
Greg Kroah-Hartman75865852005-06-30 02:18:12 -0700227 * system is in its list of supported devices. Returns the matching
Linus Torvalds1da177e2005-04-16 15:20:36 -0700228 * pci_device_id structure or %NULL if there is no match.
Greg Kroah-Hartman75865852005-06-30 02:18:12 -0700229 *
Randy Dunlap8b607562007-05-09 07:19:14 +0200230 * Deprecated, don't use this as it will not catch any dynamic ids
Greg Kroah-Hartman75865852005-06-30 02:18:12 -0700231 * that a driver might want to check for.
Linus Torvalds1da177e2005-04-16 15:20:36 -0700232 */
Greg Kroah-Hartman75865852005-06-30 02:18:12 -0700233const struct pci_device_id *pci_match_id(const struct pci_device_id *ids,
234 struct pci_dev *dev)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700235{
Greg Kroah-Hartman75865852005-06-30 02:18:12 -0700236 if (ids) {
237 while (ids->vendor || ids->subvendor || ids->class_mask) {
238 if (pci_match_one_device(ids, dev))
239 return ids;
240 ids++;
241 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700242 }
243 return NULL;
244}
245
246/**
Randy Dunlapae9608a2007-01-09 21:41:01 -0800247 * pci_match_device - Tell if a PCI device structure has a matching PCI device id structure
Greg Kroah-Hartman75865852005-06-30 02:18:12 -0700248 * @drv: the PCI driver to match against
Henrik Kretzschmar39ba4872006-08-15 10:57:16 +0200249 * @dev: the PCI device structure to match against
Greg Kroah-Hartman75865852005-06-30 02:18:12 -0700250 *
251 * Used by a driver to check whether a PCI device present in the
252 * system is in its list of supported devices. Returns the matching
253 * pci_device_id structure or %NULL if there is no match.
Linus Torvalds1da177e2005-04-16 15:20:36 -0700254 */
Adrian Bunkd73460d2007-10-24 18:27:18 +0200255static const struct pci_device_id *pci_match_device(struct pci_driver *drv,
256 struct pci_dev *dev)
Greg Kroah-Hartman75865852005-06-30 02:18:12 -0700257{
Greg Kroah-Hartman75865852005-06-30 02:18:12 -0700258 struct pci_dynid *dynid;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700259
Russell King7461b602006-11-29 21:18:04 +0000260 /* Look at the dynamic ids first, before the static ones */
Greg Kroah-Hartman75865852005-06-30 02:18:12 -0700261 spin_lock(&drv->dynids.lock);
262 list_for_each_entry(dynid, &drv->dynids.list, node) {
263 if (pci_match_one_device(&dynid->id, dev)) {
264 spin_unlock(&drv->dynids.lock);
265 return &dynid->id;
266 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700267 }
Greg Kroah-Hartman75865852005-06-30 02:18:12 -0700268 spin_unlock(&drv->dynids.lock);
Russell King7461b602006-11-29 21:18:04 +0000269
270 return pci_match_id(drv->id_table, dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700271}
272
Rusty Russell873392c2008-12-31 23:54:56 +1030273struct drv_dev_and_id {
274 struct pci_driver *drv;
275 struct pci_dev *dev;
276 const struct pci_device_id *id;
277};
278
279static long local_pci_probe(void *_ddi)
280{
281 struct drv_dev_and_id *ddi = _ddi;
Alan Sternf3ec4f82010-06-08 15:23:51 -0400282 struct device *dev = &ddi->dev->dev;
Huang Yingea8c88f2012-08-08 09:07:39 +0800283 struct device *parent = dev->parent;
Alan Sternf3ec4f82010-06-08 15:23:51 -0400284 int rc;
Rusty Russell873392c2008-12-31 23:54:56 +1030285
Huang Yingea8c88f2012-08-08 09:07:39 +0800286 /* The parent bridge must be in active state when probing */
287 if (parent)
288 pm_runtime_get_sync(parent);
Alan Sternf3ec4f82010-06-08 15:23:51 -0400289 /* Unbound PCI devices are always set to disabled and suspended.
290 * During probe, the device is set to enabled and active and the
291 * usage count is incremented. If the driver supports runtime PM,
292 * it should call pm_runtime_put_noidle() in its probe routine and
293 * pm_runtime_get_noresume() in its remove routine.
294 */
295 pm_runtime_get_noresume(dev);
296 pm_runtime_set_active(dev);
297 pm_runtime_enable(dev);
298
299 rc = ddi->drv->probe(ddi->dev, ddi->id);
300 if (rc) {
301 pm_runtime_disable(dev);
302 pm_runtime_set_suspended(dev);
303 pm_runtime_put_noidle(dev);
304 }
Huang Yingea8c88f2012-08-08 09:07:39 +0800305 if (parent)
306 pm_runtime_put(parent);
Alan Sternf3ec4f82010-06-08 15:23:51 -0400307 return rc;
Rusty Russell873392c2008-12-31 23:54:56 +1030308}
309
Andi Kleend42c6992005-07-06 19:56:03 +0200310static int pci_call_probe(struct pci_driver *drv, struct pci_dev *dev,
311 const struct pci_device_id *id)
312{
Rusty Russell873392c2008-12-31 23:54:56 +1030313 int error, node;
314 struct drv_dev_and_id ddi = { drv, dev, id };
Mike Travisf70316d2008-04-04 18:11:06 -0700315
Rusty Russell873392c2008-12-31 23:54:56 +1030316 /* Execute driver initialization on node where the device's
317 bus is attached to. This way the driver likely allocates
318 its local memory on the right node without any need to
319 change it. */
320 node = dev_to_node(&dev->dev);
Mike Travisf70316d2008-04-04 18:11:06 -0700321 if (node >= 0) {
Rusty Russell873392c2008-12-31 23:54:56 +1030322 int cpu;
Rusty Russell873392c2008-12-31 23:54:56 +1030323
324 get_online_cpus();
Rusty Russella70f7302009-03-13 14:49:46 +1030325 cpu = cpumask_any_and(cpumask_of_node(node), cpu_online_mask);
Rusty Russell873392c2008-12-31 23:54:56 +1030326 if (cpu < nr_cpu_ids)
327 error = work_on_cpu(cpu, local_pci_probe, &ddi);
328 else
329 error = local_pci_probe(&ddi);
330 put_online_cpus();
331 } else
332 error = local_pci_probe(&ddi);
Andi Kleend42c6992005-07-06 19:56:03 +0200333 return error;
334}
335
Linus Torvalds1da177e2005-04-16 15:20:36 -0700336/**
Randy Dunlap23ea3792010-11-18 15:02:31 -0800337 * __pci_device_probe - check if a driver wants to claim a specific PCI device
Randy Dunlap8f7020d2005-10-23 11:57:38 -0700338 * @drv: driver to call to check if it wants the PCI device
339 * @pci_dev: PCI device being probed
Linus Torvalds1da177e2005-04-16 15:20:36 -0700340 *
Randy Dunlap8f7020d2005-10-23 11:57:38 -0700341 * returns 0 on success, else error.
Linus Torvalds1da177e2005-04-16 15:20:36 -0700342 * side-effect: pci_dev->driver is set to drv when drv claims pci_dev.
343 */
344static int
345__pci_device_probe(struct pci_driver *drv, struct pci_dev *pci_dev)
Greg Kroah-Hartman75865852005-06-30 02:18:12 -0700346{
347 const struct pci_device_id *id;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700348 int error = 0;
349
350 if (!pci_dev->driver && drv->probe) {
Greg Kroah-Hartman75865852005-06-30 02:18:12 -0700351 error = -ENODEV;
352
353 id = pci_match_device(drv, pci_dev);
354 if (id)
Andi Kleend42c6992005-07-06 19:56:03 +0200355 error = pci_call_probe(drv, pci_dev, id);
Greg Kroah-Hartman75865852005-06-30 02:18:12 -0700356 if (error >= 0) {
357 pci_dev->driver = drv;
358 error = 0;
359 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700360 }
361 return error;
362}
363
364static int pci_device_probe(struct device * dev)
365{
366 int error = 0;
367 struct pci_driver *drv;
368 struct pci_dev *pci_dev;
369
370 drv = to_pci_driver(dev->driver);
371 pci_dev = to_pci_dev(dev);
372 pci_dev_get(pci_dev);
373 error = __pci_device_probe(drv, pci_dev);
374 if (error)
375 pci_dev_put(pci_dev);
376
377 return error;
378}
379
380static int pci_device_remove(struct device * dev)
381{
382 struct pci_dev * pci_dev = to_pci_dev(dev);
383 struct pci_driver * drv = pci_dev->driver;
384
385 if (drv) {
Alan Sternf3ec4f82010-06-08 15:23:51 -0400386 if (drv->remove) {
387 pm_runtime_get_sync(dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700388 drv->remove(pci_dev);
Alan Sternf3ec4f82010-06-08 15:23:51 -0400389 pm_runtime_put_noidle(dev);
390 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700391 pci_dev->driver = NULL;
392 }
393
Alan Sternf3ec4f82010-06-08 15:23:51 -0400394 /* Undo the runtime PM settings in local_pci_probe() */
395 pm_runtime_disable(dev);
396 pm_runtime_set_suspended(dev);
397 pm_runtime_put_noidle(dev);
398
Linus Torvalds1da177e2005-04-16 15:20:36 -0700399 /*
Shaohua Li2449e062006-10-20 14:45:32 -0700400 * If the device is still on, set the power state as "unknown",
401 * since it might change by the next time we load the driver.
402 */
403 if (pci_dev->current_state == PCI_D0)
404 pci_dev->current_state = PCI_UNKNOWN;
405
406 /*
Linus Torvalds1da177e2005-04-16 15:20:36 -0700407 * We would love to complain here if pci_dev->is_enabled is set, that
408 * the driver should have called pci_disable_device(), but the
409 * unfortunate fact is there are too many odd BIOS and bridge setups
410 * that don't like drivers doing that all of the time.
411 * Oh well, we can dream of sane hardware when we sleep, no matter how
412 * horrible the crap we have to deal with is when we are awake...
413 */
414
415 pci_dev_put(pci_dev);
416 return 0;
417}
418
Rafael J. Wysockibbb44d92008-05-20 00:49:04 +0200419static void pci_device_shutdown(struct device *dev)
420{
421 struct pci_dev *pci_dev = to_pci_dev(dev);
422 struct pci_driver *drv = pci_dev->driver;
423
424 if (drv && drv->shutdown)
425 drv->shutdown(pci_dev);
426 pci_msi_shutdown(pci_dev);
427 pci_msix_shutdown(pci_dev);
Rafael J. Wysocki5b415f12012-02-07 00:50:35 +0100428
429 /*
Khalid Azizb566a222012-04-27 13:00:33 -0600430 * Turn off Bus Master bit on the device to tell it to not
431 * continue to do DMA
432 */
433 pci_disable_device(pci_dev);
434
435 /*
Rafael J. Wysocki5b415f12012-02-07 00:50:35 +0100436 * Devices may be enabled to wake up by runtime PM, but they need not
437 * be supposed to wake up the system from its "power off" state (e.g.
438 * ACPI S5). Therefore disable wakeup for all devices that aren't
439 * supposed to wake up the system at this point. The state argument
440 * will be ignored by pci_enable_wake().
441 */
442 if (!device_may_wakeup(dev))
443 pci_enable_wake(pci_dev, PCI_UNKNOWN, false);
Rafael J. Wysockibbb44d92008-05-20 00:49:04 +0200444}
445
Rafael J. Wysockiaa338602011-02-11 00:06:54 +0100446#ifdef CONFIG_PM
Rafael J. Wysocki6cbf8212010-02-17 23:44:58 +0100447
448/* Auxiliary functions used for system resume and run-time resume. */
449
450/**
451 * pci_restore_standard_config - restore standard config registers of PCI device
452 * @pci_dev: PCI device to handle
453 */
454static int pci_restore_standard_config(struct pci_dev *pci_dev)
455{
456 pci_update_current_state(pci_dev, PCI_UNKNOWN);
457
458 if (pci_dev->current_state != PCI_D0) {
459 int error = pci_set_power_state(pci_dev, PCI_D0);
460 if (error)
461 return error;
462 }
463
Jon Mason1d3c16a2010-11-30 17:43:26 -0600464 pci_restore_state(pci_dev);
465 return 0;
Rafael J. Wysocki6cbf8212010-02-17 23:44:58 +0100466}
467
Rafael J. Wysocki6cbf8212010-02-17 23:44:58 +0100468#endif
469
Rafael J. Wysockibbb44d92008-05-20 00:49:04 +0200470#ifdef CONFIG_PM_SLEEP
471
Rafael J. Wysockidb288c92012-07-05 15:20:00 -0600472static void pci_pm_default_resume_early(struct pci_dev *pci_dev)
473{
474 pci_power_up(pci_dev);
475 pci_restore_state(pci_dev);
476 pci_fixup_device(pci_fixup_resume_early, pci_dev);
477}
478
Rafael J. Wysockibbb44d92008-05-20 00:49:04 +0200479/*
480 * Default "suspend" method for devices that have no driver provided suspend,
Rafael J. Wysockifa58d302009-01-07 13:03:42 +0100481 * or not even a driver at all (second part).
482 */
Rafael J. Wysockibb808942009-01-07 14:15:17 +0100483static void pci_pm_set_unknown_state(struct pci_dev *pci_dev)
Rafael J. Wysockibbb44d92008-05-20 00:49:04 +0200484{
Rafael J. Wysockibbb44d92008-05-20 00:49:04 +0200485 /*
486 * mark its power state as "unknown", since we don't know if
487 * e.g. the BIOS will change its device state when we suspend.
488 */
489 if (pci_dev->current_state == PCI_D0)
490 pci_dev->current_state = PCI_UNKNOWN;
491}
492
493/*
494 * Default "resume" method for devices that have no driver provided resume,
Rafael J. Wysocki355a72d2008-12-08 00:34:57 +0100495 * or not even a driver at all (second part).
496 */
Rafael J. Wysockibb808942009-01-07 14:15:17 +0100497static int pci_pm_reenable_device(struct pci_dev *pci_dev)
Rafael J. Wysocki355a72d2008-12-08 00:34:57 +0100498{
499 int retval;
500
Rafael J. Wysockibbb44d92008-05-20 00:49:04 +0200501 /* if the device was enabled before suspend, reenable */
502 retval = pci_reenable_device(pci_dev);
503 /*
504 * if the device was busmaster before the suspend, make it busmaster
505 * again
506 */
507 if (pci_dev->is_busmaster)
508 pci_set_master(pci_dev);
509
510 return retval;
511}
512
513static int pci_legacy_suspend(struct device *dev, pm_message_t state)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700514{
515 struct pci_dev * pci_dev = to_pci_dev(dev);
516 struct pci_driver * drv = pci_dev->driver;
Rafael J. Wysocki46939f82009-03-16 22:40:26 +0100517
Andrew Morton02669492006-03-23 01:38:34 -0800518 if (drv && drv->suspend) {
Rafael J. Wysocki99dadce2009-02-04 01:59:09 +0100519 pci_power_t prev = pci_dev->current_state;
Rafael J. Wysocki46939f82009-03-16 22:40:26 +0100520 int error;
Rafael J. Wysockiaa8c6c92009-01-16 21:54:43 +0100521
Frans Pop57ef8022009-03-16 22:39:56 +0100522 error = drv->suspend(pci_dev, state);
523 suspend_report_result(drv->suspend, error);
524 if (error)
525 return error;
Rafael J. Wysockiaa8c6c92009-01-16 21:54:43 +0100526
Rafael J. Wysocki46939f82009-03-16 22:40:26 +0100527 if (!pci_dev->state_saved && pci_dev->current_state != PCI_D0
Rafael J. Wysocki99dadce2009-02-04 01:59:09 +0100528 && pci_dev->current_state != PCI_UNKNOWN) {
529 WARN_ONCE(pci_dev->current_state != prev,
530 "PCI PM: Device state not saved by %pF\n",
531 drv->suspend);
Rafael J. Wysocki99dadce2009-02-04 01:59:09 +0100532 }
Andrew Morton02669492006-03-23 01:38:34 -0800533 }
Rafael J. Wysockiad8cfa12009-01-07 13:09:37 +0100534
535 pci_fixup_device(pci_fixup_suspend, pci_dev);
536
Rafael J. Wysocki46939f82009-03-16 22:40:26 +0100537 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700538}
539
Rafael J. Wysockibbb44d92008-05-20 00:49:04 +0200540static int pci_legacy_suspend_late(struct device *dev, pm_message_t state)
Linus Torvaldscbd69db2006-06-24 14:50:29 -0700541{
542 struct pci_dev * pci_dev = to_pci_dev(dev);
543 struct pci_driver * drv = pci_dev->driver;
Linus Torvaldscbd69db2006-06-24 14:50:29 -0700544
545 if (drv && drv->suspend_late) {
Rafael J. Wysocki46939f82009-03-16 22:40:26 +0100546 pci_power_t prev = pci_dev->current_state;
547 int error;
548
Frans Pop57ef8022009-03-16 22:39:56 +0100549 error = drv->suspend_late(pci_dev, state);
550 suspend_report_result(drv->suspend_late, error);
Rafael J. Wysocki46939f82009-03-16 22:40:26 +0100551 if (error)
552 return error;
553
554 if (!pci_dev->state_saved && pci_dev->current_state != PCI_D0
555 && pci_dev->current_state != PCI_UNKNOWN) {
556 WARN_ONCE(pci_dev->current_state != prev,
557 "PCI PM: Device state not saved by %pF\n",
558 drv->suspend_late);
559 return 0;
560 }
Linus Torvaldscbd69db2006-06-24 14:50:29 -0700561 }
Rafael J. Wysocki46939f82009-03-16 22:40:26 +0100562
563 if (!pci_dev->state_saved)
564 pci_save_state(pci_dev);
565
566 pci_pm_set_unknown_state(pci_dev);
567
568 return 0;
Linus Torvaldscbd69db2006-06-24 14:50:29 -0700569}
Linus Torvalds1da177e2005-04-16 15:20:36 -0700570
Rafael J. Wysockif6dc1e52009-01-07 13:12:22 +0100571static int pci_legacy_resume_early(struct device *dev)
572{
Rafael J. Wysockif6dc1e52009-01-07 13:12:22 +0100573 struct pci_dev * pci_dev = to_pci_dev(dev);
574 struct pci_driver * drv = pci_dev->driver;
575
Rafael J. Wysockiaa8c6c92009-01-16 21:54:43 +0100576 return drv && drv->resume_early ?
577 drv->resume_early(pci_dev) : 0;
Rafael J. Wysockif6dc1e52009-01-07 13:12:22 +0100578}
579
Rafael J. Wysockibbb44d92008-05-20 00:49:04 +0200580static int pci_legacy_resume(struct device *dev)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700581{
582 struct pci_dev * pci_dev = to_pci_dev(dev);
583 struct pci_driver * drv = pci_dev->driver;
584
Rafael J. Wysockiad8cfa12009-01-07 13:09:37 +0100585 pci_fixup_device(pci_fixup_resume, pci_dev);
586
Rafael J. Wysockiaa8c6c92009-01-16 21:54:43 +0100587 return drv && drv->resume ?
588 drv->resume(pci_dev) : pci_pm_reenable_device(pci_dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700589}
590
Rafael J. Wysocki571ff752009-01-07 13:05:05 +0100591/* Auxiliary functions used by the new power management framework */
592
Rafael J. Wysocki5294e252009-02-04 02:09:07 +0100593static void pci_pm_default_resume(struct pci_dev *pci_dev)
Rafael J. Wysocki571ff752009-01-07 13:05:05 +0100594{
Rafael J. Wysocki734104292009-01-07 13:07:15 +0100595 pci_fixup_device(pci_fixup_resume, pci_dev);
596
Rafael J. Wysocki5294e252009-02-04 02:09:07 +0100597 if (!pci_is_bridge(pci_dev))
598 pci_enable_wake(pci_dev, PCI_D0, false);
Rafael J. Wysocki571ff752009-01-07 13:05:05 +0100599}
600
Rafael J. Wysocki5294e252009-02-04 02:09:07 +0100601static void pci_pm_default_suspend(struct pci_dev *pci_dev)
Rafael J. Wysocki734104292009-01-07 13:07:15 +0100602{
Rafael J. Wysocki5294e252009-02-04 02:09:07 +0100603 /* Disable non-bridge devices without PM support */
Rafael J. Wysockicbbc2f62009-02-04 02:01:15 +0100604 if (!pci_is_bridge(pci_dev))
605 pci_disable_enabled_device(pci_dev);
Rafael J. Wysocki734104292009-01-07 13:07:15 +0100606}
607
Rafael J. Wysocki07e836e2009-01-07 13:06:10 +0100608static bool pci_has_legacy_pm_support(struct pci_dev *pci_dev)
609{
610 struct pci_driver *drv = pci_dev->driver;
Rafael J. Wysockibb808942009-01-07 14:15:17 +0100611 bool ret = drv && (drv->suspend || drv->suspend_late || drv->resume
Rafael J. Wysocki07e836e2009-01-07 13:06:10 +0100612 || drv->resume_early);
Rafael J. Wysockibb808942009-01-07 14:15:17 +0100613
614 /*
615 * Legacy PM support is used by default, so warn if the new framework is
616 * supported as well. Drivers are supposed to support either the
617 * former, or the latter, but not both at the same time.
618 */
David Fries82440a82011-11-20 15:29:46 -0600619 WARN(ret && drv->driver.pm, "driver %s device %04x:%04x\n",
620 drv->name, pci_dev->vendor, pci_dev->device);
Rafael J. Wysockibb808942009-01-07 14:15:17 +0100621
622 return ret;
Rafael J. Wysocki07e836e2009-01-07 13:06:10 +0100623}
624
Rafael J. Wysocki571ff752009-01-07 13:05:05 +0100625/* New power management framework */
626
Rafael J. Wysockibbb44d92008-05-20 00:49:04 +0200627static int pci_pm_prepare(struct device *dev)
628{
629 struct device_driver *drv = dev->driver;
630 int error = 0;
631
Rafael J. Wysocki6cbf8212010-02-17 23:44:58 +0100632 /*
Rafael J. Wysockieea3fc02011-07-06 10:51:40 +0200633 * If a PCI device configured to wake up the system from sleep states
634 * has been suspended at run time and there's a resume request pending
635 * for it, this is equivalent to the device signaling wakeup, so the
636 * system suspend operation should be aborted.
637 */
638 pm_runtime_get_noresume(dev);
639 if (pm_runtime_barrier(dev) && device_may_wakeup(dev))
640 pm_wakeup_event(dev, 0);
641
642 if (pm_wakeup_pending()) {
643 pm_runtime_put_sync(dev);
644 return -EBUSY;
645 }
646
647 /*
Rafael J. Wysocki6cbf8212010-02-17 23:44:58 +0100648 * PCI devices suspended at run time need to be resumed at this
649 * point, because in general it is necessary to reconfigure them for
650 * system suspend. Namely, if the device is supposed to wake up the
651 * system from the sleep state, we may need to reconfigure it for this
652 * purpose. In turn, if the device is not supposed to wake up the
653 * system from the sleep state, we'll have to prevent it from signaling
654 * wake-up.
655 */
Rafael J. Wysockieea3fc02011-07-06 10:51:40 +0200656 pm_runtime_resume(dev);
Rafael J. Wysocki6cbf8212010-02-17 23:44:58 +0100657
Rafael J. Wysockibbb44d92008-05-20 00:49:04 +0200658 if (drv && drv->pm && drv->pm->prepare)
659 error = drv->pm->prepare(dev);
660
661 return error;
662}
663
664static void pci_pm_complete(struct device *dev)
665{
666 struct device_driver *drv = dev->driver;
667
668 if (drv && drv->pm && drv->pm->complete)
669 drv->pm->complete(dev);
Rafael J. Wysockia5f76d52011-06-21 23:47:15 +0200670
671 pm_runtime_put_sync(dev);
Rafael J. Wysockibbb44d92008-05-20 00:49:04 +0200672}
673
Rafael J. Wysocki6cbf8212010-02-17 23:44:58 +0100674#else /* !CONFIG_PM_SLEEP */
675
676#define pci_pm_prepare NULL
677#define pci_pm_complete NULL
678
679#endif /* !CONFIG_PM_SLEEP */
680
Rafael J. Wysockibbb44d92008-05-20 00:49:04 +0200681#ifdef CONFIG_SUSPEND
682
683static int pci_pm_suspend(struct device *dev)
684{
685 struct pci_dev *pci_dev = to_pci_dev(dev);
Dmitry Torokhov8150f322009-07-24 22:11:32 -0700686 const struct dev_pm_ops *pm = dev->driver ? dev->driver->pm : NULL;
Rafael J. Wysockibbb44d92008-05-20 00:49:04 +0200687
Rafael J. Wysockiad8cfa12009-01-07 13:09:37 +0100688 if (pci_has_legacy_pm_support(pci_dev))
689 return pci_legacy_suspend(dev, PMSG_SUSPEND);
Rafael J. Wysockibb808942009-01-07 14:15:17 +0100690
Rafael J. Wysocki5294e252009-02-04 02:09:07 +0100691 if (!pm) {
692 pci_pm_default_suspend(pci_dev);
693 goto Fixup;
Rafael J. Wysockibbb44d92008-05-20 00:49:04 +0200694 }
Rafael J. Wysockifa58d302009-01-07 13:03:42 +0100695
Rafael J. Wysocki5294e252009-02-04 02:09:07 +0100696 if (pm->suspend) {
697 pci_power_t prev = pci_dev->current_state;
698 int error;
699
700 error = pm->suspend(dev);
701 suspend_report_result(pm->suspend, error);
702 if (error)
703 return error;
704
Rafael J. Wysocki46939f82009-03-16 22:40:26 +0100705 if (!pci_dev->state_saved && pci_dev->current_state != PCI_D0
Rafael J. Wysocki5294e252009-02-04 02:09:07 +0100706 && pci_dev->current_state != PCI_UNKNOWN) {
707 WARN_ONCE(pci_dev->current_state != prev,
708 "PCI PM: State of device not saved by %pF\n",
709 pm->suspend);
Rafael J. Wysocki5294e252009-02-04 02:09:07 +0100710 }
711 }
712
Rafael J. Wysocki5294e252009-02-04 02:09:07 +0100713 Fixup:
714 pci_fixup_device(pci_fixup_suspend, pci_dev);
715
716 return 0;
Rafael J. Wysockibbb44d92008-05-20 00:49:04 +0200717}
718
719static int pci_pm_suspend_noirq(struct device *dev)
Greg KHc8958172005-04-08 14:53:31 +0900720{
Rafael J. Wysocki355a72d2008-12-08 00:34:57 +0100721 struct pci_dev *pci_dev = to_pci_dev(dev);
Dmitry Torokhov8150f322009-07-24 22:11:32 -0700722 const struct dev_pm_ops *pm = dev->driver ? dev->driver->pm : NULL;
Greg KHc8958172005-04-08 14:53:31 +0900723
Rafael J. Wysockibb808942009-01-07 14:15:17 +0100724 if (pci_has_legacy_pm_support(pci_dev))
725 return pci_legacy_suspend_late(dev, PMSG_SUSPEND);
726
Rafael J. Wysocki931ff682009-03-16 22:40:50 +0100727 if (!pm) {
728 pci_save_state(pci_dev);
Rafael J. Wysocki46939f82009-03-16 22:40:26 +0100729 return 0;
Rafael J. Wysocki931ff682009-03-16 22:40:50 +0100730 }
Rafael J. Wysocki46939f82009-03-16 22:40:26 +0100731
732 if (pm->suspend_noirq) {
733 pci_power_t prev = pci_dev->current_state;
734 int error;
735
736 error = pm->suspend_noirq(dev);
737 suspend_report_result(pm->suspend_noirq, error);
738 if (error)
739 return error;
740
741 if (!pci_dev->state_saved && pci_dev->current_state != PCI_D0
742 && pci_dev->current_state != PCI_UNKNOWN) {
743 WARN_ONCE(pci_dev->current_state != prev,
744 "PCI PM: State of device not saved by %pF\n",
745 pm->suspend_noirq);
746 return 0;
747 }
Rafael J. Wysockibbb44d92008-05-20 00:49:04 +0200748 }
749
Rafael J. Wysocki46939f82009-03-16 22:40:26 +0100750 if (!pci_dev->state_saved) {
751 pci_save_state(pci_dev);
752 if (!pci_is_bridge(pci_dev))
753 pci_prepare_to_sleep(pci_dev);
754 }
Rafael J. Wysockid67e37d2009-01-07 13:11:28 +0100755
Rafael J. Wysocki46939f82009-03-16 22:40:26 +0100756 pci_pm_set_unknown_state(pci_dev);
757
Alan Sterndbf0e4c2012-07-09 11:09:21 -0400758 /*
759 * Some BIOSes from ASUS have a bug: If a USB EHCI host controller's
760 * PCI COMMAND register isn't 0, the BIOS assumes that the controller
761 * hasn't been quiesced and tries to turn it off. If the controller
762 * is already in D3, this can hang or cause memory corruption.
763 *
764 * Since the value of the COMMAND register doesn't matter once the
765 * device has been suspended, we can safely set it to 0 here.
766 */
767 if (pci_dev->class == PCI_CLASS_SERIAL_USB_EHCI)
768 pci_write_config_word(pci_dev, PCI_COMMAND, 0);
769
Rafael J. Wysocki46939f82009-03-16 22:40:26 +0100770 return 0;
Greg KHc8958172005-04-08 14:53:31 +0900771}
Linus Torvalds1da177e2005-04-16 15:20:36 -0700772
Rafael J. Wysockibbb44d92008-05-20 00:49:04 +0200773static int pci_pm_resume_noirq(struct device *dev)
774{
Rafael J. Wysocki355a72d2008-12-08 00:34:57 +0100775 struct pci_dev *pci_dev = to_pci_dev(dev);
Rafael J. Wysockiadf09492008-10-06 22:46:05 +0200776 struct device_driver *drv = dev->driver;
Rafael J. Wysockibbb44d92008-05-20 00:49:04 +0200777 int error = 0;
778
Rafael J. Wysocki6cbf8212010-02-17 23:44:58 +0100779 pci_pm_default_resume_early(pci_dev);
Rafael J. Wysockiaa8c6c92009-01-16 21:54:43 +0100780
Rafael J. Wysockiad8cfa12009-01-07 13:09:37 +0100781 if (pci_has_legacy_pm_support(pci_dev))
Rafael J. Wysockibb808942009-01-07 14:15:17 +0100782 return pci_legacy_resume_early(dev);
Rafael J. Wysockibb808942009-01-07 14:15:17 +0100783
Rafael J. Wysockid67e37d2009-01-07 13:11:28 +0100784 if (drv && drv->pm && drv->pm->resume_noirq)
785 error = drv->pm->resume_noirq(dev);
Rafael J. Wysockibbb44d92008-05-20 00:49:04 +0200786
787 return error;
788}
789
Rafael J. Wysockif6dc1e52009-01-07 13:12:22 +0100790static int pci_pm_resume(struct device *dev)
791{
792 struct pci_dev *pci_dev = to_pci_dev(dev);
Dmitry Torokhov8150f322009-07-24 22:11:32 -0700793 const struct dev_pm_ops *pm = dev->driver ? dev->driver->pm : NULL;
Rafael J. Wysockif6dc1e52009-01-07 13:12:22 +0100794 int error = 0;
795
Rafael J. Wysocki418e4da2009-01-26 21:43:08 +0100796 /*
797 * This is necessary for the suspend error path in which resume is
798 * called without restoring the standard config registers of the device.
799 */
800 if (pci_dev->state_saved)
801 pci_restore_standard_config(pci_dev);
802
Rafael J. Wysockif6dc1e52009-01-07 13:12:22 +0100803 if (pci_has_legacy_pm_support(pci_dev))
804 return pci_legacy_resume(dev);
805
Rafael J. Wysocki5294e252009-02-04 02:09:07 +0100806 pci_pm_default_resume(pci_dev);
Rafael J. Wysockif6dc1e52009-01-07 13:12:22 +0100807
Rafael J. Wysocki5294e252009-02-04 02:09:07 +0100808 if (pm) {
809 if (pm->resume)
810 error = pm->resume(dev);
811 } else {
812 pci_pm_reenable_device(pci_dev);
813 }
Rafael J. Wysockif6dc1e52009-01-07 13:12:22 +0100814
Rafael J. Wysocki999cce42009-09-09 23:51:27 +0200815 return error;
Rafael J. Wysockif6dc1e52009-01-07 13:12:22 +0100816}
817
Rafael J. Wysockibbb44d92008-05-20 00:49:04 +0200818#else /* !CONFIG_SUSPEND */
819
820#define pci_pm_suspend NULL
821#define pci_pm_suspend_noirq NULL
822#define pci_pm_resume NULL
823#define pci_pm_resume_noirq NULL
824
825#endif /* !CONFIG_SUSPEND */
826
Rafael J. Wysocki1f112ce2011-04-11 22:54:42 +0200827#ifdef CONFIG_HIBERNATE_CALLBACKS
Rafael J. Wysockibbb44d92008-05-20 00:49:04 +0200828
829static int pci_pm_freeze(struct device *dev)
830{
831 struct pci_dev *pci_dev = to_pci_dev(dev);
Dmitry Torokhov8150f322009-07-24 22:11:32 -0700832 const struct dev_pm_ops *pm = dev->driver ? dev->driver->pm : NULL;
Rafael J. Wysockibbb44d92008-05-20 00:49:04 +0200833
Rafael J. Wysockiad8cfa12009-01-07 13:09:37 +0100834 if (pci_has_legacy_pm_support(pci_dev))
835 return pci_legacy_suspend(dev, PMSG_FREEZE);
Rafael J. Wysockibb808942009-01-07 14:15:17 +0100836
Rafael J. Wysocki5294e252009-02-04 02:09:07 +0100837 if (!pm) {
838 pci_pm_default_suspend(pci_dev);
839 return 0;
Rafael J. Wysockibbb44d92008-05-20 00:49:04 +0200840 }
841
Rafael J. Wysocki5294e252009-02-04 02:09:07 +0100842 if (pm->freeze) {
843 int error;
844
845 error = pm->freeze(dev);
846 suspend_report_result(pm->freeze, error);
847 if (error)
848 return error;
849 }
850
Rafael J. Wysocki5294e252009-02-04 02:09:07 +0100851 return 0;
Rafael J. Wysockibbb44d92008-05-20 00:49:04 +0200852}
853
854static int pci_pm_freeze_noirq(struct device *dev)
855{
Rafael J. Wysocki355a72d2008-12-08 00:34:57 +0100856 struct pci_dev *pci_dev = to_pci_dev(dev);
Rafael J. Wysockiadf09492008-10-06 22:46:05 +0200857 struct device_driver *drv = dev->driver;
Rafael J. Wysockibbb44d92008-05-20 00:49:04 +0200858
Rafael J. Wysockibb808942009-01-07 14:15:17 +0100859 if (pci_has_legacy_pm_support(pci_dev))
860 return pci_legacy_suspend_late(dev, PMSG_FREEZE);
861
Rafael J. Wysockid67e37d2009-01-07 13:11:28 +0100862 if (drv && drv->pm && drv->pm->freeze_noirq) {
Rafael J. Wysocki46939f82009-03-16 22:40:26 +0100863 int error;
864
Rafael J. Wysockid67e37d2009-01-07 13:11:28 +0100865 error = drv->pm->freeze_noirq(dev);
866 suspend_report_result(drv->pm->freeze_noirq, error);
Rafael J. Wysocki46939f82009-03-16 22:40:26 +0100867 if (error)
868 return error;
Rafael J. Wysockibbb44d92008-05-20 00:49:04 +0200869 }
870
Rafael J. Wysocki46939f82009-03-16 22:40:26 +0100871 if (!pci_dev->state_saved)
872 pci_save_state(pci_dev);
Rafael J. Wysockid67e37d2009-01-07 13:11:28 +0100873
Rafael J. Wysocki46939f82009-03-16 22:40:26 +0100874 pci_pm_set_unknown_state(pci_dev);
875
876 return 0;
Rafael J. Wysockibbb44d92008-05-20 00:49:04 +0200877}
878
Rafael J. Wysockibbb44d92008-05-20 00:49:04 +0200879static int pci_pm_thaw_noirq(struct device *dev)
880{
Rafael J. Wysocki355a72d2008-12-08 00:34:57 +0100881 struct pci_dev *pci_dev = to_pci_dev(dev);
Rafael J. Wysockiadf09492008-10-06 22:46:05 +0200882 struct device_driver *drv = dev->driver;
Rafael J. Wysockibbb44d92008-05-20 00:49:04 +0200883 int error = 0;
884
Rafael J. Wysockiad8cfa12009-01-07 13:09:37 +0100885 if (pci_has_legacy_pm_support(pci_dev))
Rafael J. Wysockibb808942009-01-07 14:15:17 +0100886 return pci_legacy_resume_early(dev);
Rafael J. Wysockibb808942009-01-07 14:15:17 +0100887
Rafael J. Wysockid67e37d2009-01-07 13:11:28 +0100888 pci_update_current_state(pci_dev, PCI_D0);
889
890 if (drv && drv->pm && drv->pm->thaw_noirq)
891 error = drv->pm->thaw_noirq(dev);
Rafael J. Wysockibbb44d92008-05-20 00:49:04 +0200892
893 return error;
894}
895
Rafael J. Wysockif6dc1e52009-01-07 13:12:22 +0100896static int pci_pm_thaw(struct device *dev)
897{
898 struct pci_dev *pci_dev = to_pci_dev(dev);
Dmitry Torokhov8150f322009-07-24 22:11:32 -0700899 const struct dev_pm_ops *pm = dev->driver ? dev->driver->pm : NULL;
Rafael J. Wysockif6dc1e52009-01-07 13:12:22 +0100900 int error = 0;
901
902 if (pci_has_legacy_pm_support(pci_dev))
903 return pci_legacy_resume(dev);
904
Rafael J. Wysocki5294e252009-02-04 02:09:07 +0100905 if (pm) {
906 if (pm->thaw)
907 error = pm->thaw(dev);
908 } else {
909 pci_pm_reenable_device(pci_dev);
910 }
Rafael J. Wysockif6dc1e52009-01-07 13:12:22 +0100911
Rafael J. Wysocki4b77b0a2009-09-09 23:49:59 +0200912 pci_dev->state_saved = false;
913
Rafael J. Wysockif6dc1e52009-01-07 13:12:22 +0100914 return error;
915}
916
Rafael J. Wysockibbb44d92008-05-20 00:49:04 +0200917static int pci_pm_poweroff(struct device *dev)
918{
Rafael J. Wysocki355a72d2008-12-08 00:34:57 +0100919 struct pci_dev *pci_dev = to_pci_dev(dev);
Dmitry Torokhov8150f322009-07-24 22:11:32 -0700920 const struct dev_pm_ops *pm = dev->driver ? dev->driver->pm : NULL;
Rafael J. Wysockibbb44d92008-05-20 00:49:04 +0200921
Rafael J. Wysockiad8cfa12009-01-07 13:09:37 +0100922 if (pci_has_legacy_pm_support(pci_dev))
923 return pci_legacy_suspend(dev, PMSG_HIBERNATE);
Rafael J. Wysockibb808942009-01-07 14:15:17 +0100924
Rafael J. Wysocki5294e252009-02-04 02:09:07 +0100925 if (!pm) {
926 pci_pm_default_suspend(pci_dev);
927 goto Fixup;
928 }
929
Rafael J. Wysocki5294e252009-02-04 02:09:07 +0100930 if (pm->poweroff) {
Rafael J. Wysocki46939f82009-03-16 22:40:26 +0100931 int error;
932
Rafael J. Wysockiddb7c9d2009-02-04 01:56:14 +0100933 error = pm->poweroff(dev);
934 suspend_report_result(pm->poweroff, error);
Rafael J. Wysocki46939f82009-03-16 22:40:26 +0100935 if (error)
936 return error;
937 }
938
939 Fixup:
940 pci_fixup_device(pci_fixup_suspend, pci_dev);
941
942 return 0;
943}
944
945static int pci_pm_poweroff_noirq(struct device *dev)
946{
947 struct pci_dev *pci_dev = to_pci_dev(dev);
948 struct device_driver *drv = dev->driver;
949
950 if (pci_has_legacy_pm_support(to_pci_dev(dev)))
951 return pci_legacy_suspend_late(dev, PMSG_HIBERNATE);
952
953 if (!drv || !drv->pm)
954 return 0;
955
956 if (drv->pm->poweroff_noirq) {
957 int error;
958
959 error = drv->pm->poweroff_noirq(dev);
960 suspend_report_result(drv->pm->poweroff_noirq, error);
961 if (error)
962 return error;
Rafael J. Wysockibbb44d92008-05-20 00:49:04 +0200963 }
964
Rafael J. Wysocki5294e252009-02-04 02:09:07 +0100965 if (!pci_dev->state_saved && !pci_is_bridge(pci_dev))
966 pci_prepare_to_sleep(pci_dev);
967
Rafael J. Wysocki0b68c8e2012-08-12 23:26:07 +0200968 /*
969 * The reason for doing this here is the same as for the analogous code
970 * in pci_pm_suspend_noirq().
971 */
972 if (pci_dev->class == PCI_CLASS_SERIAL_USB_EHCI)
973 pci_write_config_word(pci_dev, PCI_COMMAND, 0);
974
Rafael J. Wysocki46939f82009-03-16 22:40:26 +0100975 return 0;
Rafael J. Wysockibbb44d92008-05-20 00:49:04 +0200976}
977
Rafael J. Wysockibbb44d92008-05-20 00:49:04 +0200978static int pci_pm_restore_noirq(struct device *dev)
979{
980 struct pci_dev *pci_dev = to_pci_dev(dev);
Rafael J. Wysockiadf09492008-10-06 22:46:05 +0200981 struct device_driver *drv = dev->driver;
Rafael J. Wysockibbb44d92008-05-20 00:49:04 +0200982 int error = 0;
983
Rafael J. Wysocki6cbf8212010-02-17 23:44:58 +0100984 pci_pm_default_resume_early(pci_dev);
Rafael J. Wysockiaa8c6c92009-01-16 21:54:43 +0100985
Rafael J. Wysockiad8cfa12009-01-07 13:09:37 +0100986 if (pci_has_legacy_pm_support(pci_dev))
Rafael J. Wysockibb808942009-01-07 14:15:17 +0100987 return pci_legacy_resume_early(dev);
Rafael J. Wysockibb808942009-01-07 14:15:17 +0100988
Rafael J. Wysockid67e37d2009-01-07 13:11:28 +0100989 if (drv && drv->pm && drv->pm->restore_noirq)
990 error = drv->pm->restore_noirq(dev);
Rafael J. Wysockibbb44d92008-05-20 00:49:04 +0200991
992 return error;
993}
994
Rafael J. Wysockif6dc1e52009-01-07 13:12:22 +0100995static int pci_pm_restore(struct device *dev)
996{
997 struct pci_dev *pci_dev = to_pci_dev(dev);
Dmitry Torokhov8150f322009-07-24 22:11:32 -0700998 const struct dev_pm_ops *pm = dev->driver ? dev->driver->pm : NULL;
Rafael J. Wysockif6dc1e52009-01-07 13:12:22 +0100999 int error = 0;
1000
Rafael J. Wysocki418e4da2009-01-26 21:43:08 +01001001 /*
1002 * This is necessary for the hibernation error path in which restore is
1003 * called without restoring the standard config registers of the device.
1004 */
1005 if (pci_dev->state_saved)
1006 pci_restore_standard_config(pci_dev);
1007
Rafael J. Wysockif6dc1e52009-01-07 13:12:22 +01001008 if (pci_has_legacy_pm_support(pci_dev))
1009 return pci_legacy_resume(dev);
1010
Rafael J. Wysocki5294e252009-02-04 02:09:07 +01001011 pci_pm_default_resume(pci_dev);
Rafael J. Wysockif6dc1e52009-01-07 13:12:22 +01001012
Rafael J. Wysocki5294e252009-02-04 02:09:07 +01001013 if (pm) {
1014 if (pm->restore)
1015 error = pm->restore(dev);
1016 } else {
1017 pci_pm_reenable_device(pci_dev);
1018 }
Rafael J. Wysockif6dc1e52009-01-07 13:12:22 +01001019
1020 return error;
1021}
1022
Rafael J. Wysocki1f112ce2011-04-11 22:54:42 +02001023#else /* !CONFIG_HIBERNATE_CALLBACKS */
Rafael J. Wysockibbb44d92008-05-20 00:49:04 +02001024
1025#define pci_pm_freeze NULL
1026#define pci_pm_freeze_noirq NULL
1027#define pci_pm_thaw NULL
1028#define pci_pm_thaw_noirq NULL
1029#define pci_pm_poweroff NULL
1030#define pci_pm_poweroff_noirq NULL
1031#define pci_pm_restore NULL
1032#define pci_pm_restore_noirq NULL
1033
Rafael J. Wysocki1f112ce2011-04-11 22:54:42 +02001034#endif /* !CONFIG_HIBERNATE_CALLBACKS */
Rafael J. Wysockibbb44d92008-05-20 00:49:04 +02001035
Rafael J. Wysocki6cbf8212010-02-17 23:44:58 +01001036#ifdef CONFIG_PM_RUNTIME
1037
1038static int pci_pm_runtime_suspend(struct device *dev)
1039{
1040 struct pci_dev *pci_dev = to_pci_dev(dev);
1041 const struct dev_pm_ops *pm = dev->driver ? dev->driver->pm : NULL;
1042 pci_power_t prev = pci_dev->current_state;
1043 int error;
1044
1045 if (!pm || !pm->runtime_suspend)
1046 return -ENOSYS;
1047
Huang Ying448bd852012-06-23 10:23:51 +08001048 pci_dev->no_d3cold = false;
Rafael J. Wysocki6cbf8212010-02-17 23:44:58 +01001049 error = pm->runtime_suspend(dev);
1050 suspend_report_result(pm->runtime_suspend, error);
1051 if (error)
1052 return error;
Huang Ying448bd852012-06-23 10:23:51 +08001053 if (!pci_dev->d3cold_allowed)
1054 pci_dev->no_d3cold = true;
Rafael J. Wysocki6cbf8212010-02-17 23:44:58 +01001055
1056 pci_fixup_device(pci_fixup_suspend, pci_dev);
1057
1058 if (!pci_dev->state_saved && pci_dev->current_state != PCI_D0
1059 && pci_dev->current_state != PCI_UNKNOWN) {
1060 WARN_ONCE(pci_dev->current_state != prev,
1061 "PCI PM: State of device not saved by %pF\n",
1062 pm->runtime_suspend);
1063 return 0;
1064 }
1065
1066 if (!pci_dev->state_saved)
1067 pci_save_state(pci_dev);
1068
1069 pci_finish_runtime_suspend(pci_dev);
1070
1071 return 0;
1072}
1073
1074static int pci_pm_runtime_resume(struct device *dev)
1075{
Huang Ying448bd852012-06-23 10:23:51 +08001076 int rc;
Rafael J. Wysocki6cbf8212010-02-17 23:44:58 +01001077 struct pci_dev *pci_dev = to_pci_dev(dev);
1078 const struct dev_pm_ops *pm = dev->driver ? dev->driver->pm : NULL;
1079
1080 if (!pm || !pm->runtime_resume)
1081 return -ENOSYS;
1082
Rafael J. Wysockidb288c92012-07-05 15:20:00 -06001083 pci_restore_standard_config(pci_dev);
1084 pci_fixup_device(pci_fixup_resume_early, pci_dev);
Rafael J. Wysocki6cbf8212010-02-17 23:44:58 +01001085 __pci_enable_wake(pci_dev, PCI_D0, true, false);
1086 pci_fixup_device(pci_fixup_resume, pci_dev);
1087
Huang Ying448bd852012-06-23 10:23:51 +08001088 rc = pm->runtime_resume(dev);
1089
1090 pci_dev->runtime_d3cold = false;
1091
1092 return rc;
Rafael J. Wysocki6cbf8212010-02-17 23:44:58 +01001093}
1094
1095static int pci_pm_runtime_idle(struct device *dev)
1096{
1097 const struct dev_pm_ops *pm = dev->driver ? dev->driver->pm : NULL;
1098
1099 if (!pm)
1100 return -ENOSYS;
1101
1102 if (pm->runtime_idle) {
1103 int ret = pm->runtime_idle(dev);
1104 if (ret)
1105 return ret;
1106 }
1107
1108 pm_runtime_suspend(dev);
1109
1110 return 0;
1111}
1112
1113#else /* !CONFIG_PM_RUNTIME */
1114
1115#define pci_pm_runtime_suspend NULL
1116#define pci_pm_runtime_resume NULL
1117#define pci_pm_runtime_idle NULL
1118
1119#endif /* !CONFIG_PM_RUNTIME */
1120
Rafael J. Wysockiaa338602011-02-11 00:06:54 +01001121#ifdef CONFIG_PM
Rafael J. Wysocki6cbf8212010-02-17 23:44:58 +01001122
Dmitry Torokhov8150f322009-07-24 22:11:32 -07001123const struct dev_pm_ops pci_dev_pm_ops = {
Rafael J. Wysockiadf09492008-10-06 22:46:05 +02001124 .prepare = pci_pm_prepare,
1125 .complete = pci_pm_complete,
1126 .suspend = pci_pm_suspend,
1127 .resume = pci_pm_resume,
1128 .freeze = pci_pm_freeze,
1129 .thaw = pci_pm_thaw,
1130 .poweroff = pci_pm_poweroff,
1131 .restore = pci_pm_restore,
Rafael J. Wysockibbb44d92008-05-20 00:49:04 +02001132 .suspend_noirq = pci_pm_suspend_noirq,
1133 .resume_noirq = pci_pm_resume_noirq,
1134 .freeze_noirq = pci_pm_freeze_noirq,
1135 .thaw_noirq = pci_pm_thaw_noirq,
1136 .poweroff_noirq = pci_pm_poweroff_noirq,
1137 .restore_noirq = pci_pm_restore_noirq,
Rafael J. Wysocki6cbf8212010-02-17 23:44:58 +01001138 .runtime_suspend = pci_pm_runtime_suspend,
1139 .runtime_resume = pci_pm_runtime_resume,
1140 .runtime_idle = pci_pm_runtime_idle,
Rafael J. Wysockibbb44d92008-05-20 00:49:04 +02001141};
1142
Rafael J. Wysockiadf09492008-10-06 22:46:05 +02001143#define PCI_PM_OPS_PTR (&pci_dev_pm_ops)
Rafael J. Wysockibbb44d92008-05-20 00:49:04 +02001144
Rafael J. Wysocki6cbf8212010-02-17 23:44:58 +01001145#else /* !COMFIG_PM_OPS */
Rafael J. Wysockibbb44d92008-05-20 00:49:04 +02001146
1147#define PCI_PM_OPS_PTR NULL
1148
Rafael J. Wysocki6cbf8212010-02-17 23:44:58 +01001149#endif /* !COMFIG_PM_OPS */
Rafael J. Wysockibbb44d92008-05-20 00:49:04 +02001150
Linus Torvalds1da177e2005-04-16 15:20:36 -07001151/**
Laurent riffard863b18f2005-10-27 23:12:54 +02001152 * __pci_register_driver - register a new pci driver
Linus Torvalds1da177e2005-04-16 15:20:36 -07001153 * @drv: the driver structure to register
Laurent riffard863b18f2005-10-27 23:12:54 +02001154 * @owner: owner module of drv
Randy Dunlapf95d8822007-02-10 14:41:56 -08001155 * @mod_name: module name string
Linus Torvalds1da177e2005-04-16 15:20:36 -07001156 *
1157 * Adds the driver structure to the list of registered drivers.
1158 * Returns a negative value on error, otherwise 0.
Steven Coleeaae4b32005-05-03 18:38:30 -06001159 * If no error occurred, the driver remains registered even if
Linus Torvalds1da177e2005-04-16 15:20:36 -07001160 * no device was claimed during registration.
1161 */
Greg Kroah-Hartman725522b2007-01-15 11:50:02 -08001162int __pci_register_driver(struct pci_driver *drv, struct module *owner,
1163 const char *mod_name)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001164{
1165 int error;
1166
1167 /* initialize common driver fields */
1168 drv->driver.name = drv->name;
1169 drv->driver.bus = &pci_bus_type;
Laurent riffard863b18f2005-10-27 23:12:54 +02001170 drv->driver.owner = owner;
Greg Kroah-Hartman725522b2007-01-15 11:50:02 -08001171 drv->driver.mod_name = mod_name;
Alan Cox50b00752006-08-16 17:42:18 +01001172
Greg Kroah-Hartman75865852005-06-30 02:18:12 -07001173 spin_lock_init(&drv->dynids.lock);
1174 INIT_LIST_HEAD(&drv->dynids.list);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001175
1176 /* register with core */
1177 error = driver_register(&drv->driver);
Akinobu Mita50bf14b2006-11-08 19:53:59 -08001178 if (error)
Chris Wright09943752009-02-23 21:52:23 -08001179 goto out;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001180
Alan Sterned283e92012-01-24 14:35:13 -05001181 error = pci_create_newid_files(drv);
Akinobu Mita50bf14b2006-11-08 19:53:59 -08001182 if (error)
Chris Wright09943752009-02-23 21:52:23 -08001183 goto out_newid;
Chris Wright09943752009-02-23 21:52:23 -08001184out:
Linus Torvalds1da177e2005-04-16 15:20:36 -07001185 return error;
Chris Wright09943752009-02-23 21:52:23 -08001186
Chris Wright09943752009-02-23 21:52:23 -08001187out_newid:
1188 driver_unregister(&drv->driver);
1189 goto out;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001190}
1191
1192/**
1193 * pci_unregister_driver - unregister a pci driver
1194 * @drv: the driver structure to unregister
1195 *
1196 * Deletes the driver structure from the list of registered PCI drivers,
1197 * gives it a chance to clean up by calling its remove() function for
1198 * each device it was responsible for, and marks those devices as
1199 * driverless.
1200 */
1201
1202void
1203pci_unregister_driver(struct pci_driver *drv)
1204{
Alan Sterned283e92012-01-24 14:35:13 -05001205 pci_remove_newid_files(drv);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001206 driver_unregister(&drv->driver);
1207 pci_free_dynids(drv);
1208}
1209
1210static struct pci_driver pci_compat_driver = {
1211 .name = "compat"
1212};
1213
1214/**
1215 * pci_dev_driver - get the pci_driver of a device
1216 * @dev: the device to query
1217 *
1218 * Returns the appropriate pci_driver structure or %NULL if there is no
1219 * registered driver for the device.
1220 */
1221struct pci_driver *
1222pci_dev_driver(const struct pci_dev *dev)
1223{
1224 if (dev->driver)
1225 return dev->driver;
1226 else {
1227 int i;
1228 for(i=0; i<=PCI_ROM_RESOURCE; i++)
1229 if (dev->resource[i].flags & IORESOURCE_BUSY)
1230 return &pci_compat_driver;
1231 }
1232 return NULL;
1233}
1234
1235/**
1236 * pci_bus_match - Tell if a PCI device structure has a matching PCI device id structure
Linus Torvalds1da177e2005-04-16 15:20:36 -07001237 * @dev: the PCI device structure to match against
Randy Dunlap8f7020d2005-10-23 11:57:38 -07001238 * @drv: the device driver to search for matching PCI device id structures
Linus Torvalds1da177e2005-04-16 15:20:36 -07001239 *
1240 * Used by a driver to check whether a PCI device present in the
Randy Dunlap8f7020d2005-10-23 11:57:38 -07001241 * system is in its list of supported devices. Returns the matching
Linus Torvalds1da177e2005-04-16 15:20:36 -07001242 * pci_device_id structure or %NULL if there is no match.
1243 */
Greg Kroah-Hartman75865852005-06-30 02:18:12 -07001244static int pci_bus_match(struct device *dev, struct device_driver *drv)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001245{
Greg Kroah-Hartman75865852005-06-30 02:18:12 -07001246 struct pci_dev *pci_dev = to_pci_dev(dev);
1247 struct pci_driver *pci_drv = to_pci_driver(drv);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001248 const struct pci_device_id *found_id;
1249
Greg Kroah-Hartman75865852005-06-30 02:18:12 -07001250 found_id = pci_match_device(pci_drv, pci_dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001251 if (found_id)
1252 return 1;
1253
Greg Kroah-Hartman75865852005-06-30 02:18:12 -07001254 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001255}
1256
1257/**
1258 * pci_dev_get - increments the reference count of the pci device structure
1259 * @dev: the device being referenced
1260 *
1261 * Each live reference to a device should be refcounted.
1262 *
1263 * Drivers for PCI devices should normally record such references in
1264 * their probe() methods, when they bind to a device, and release
1265 * them by calling pci_dev_put(), in their disconnect() methods.
1266 *
1267 * A pointer to the device with the incremented reference counter is returned.
1268 */
1269struct pci_dev *pci_dev_get(struct pci_dev *dev)
1270{
1271 if (dev)
1272 get_device(&dev->dev);
1273 return dev;
1274}
1275
1276/**
1277 * pci_dev_put - release a use of the pci device structure
1278 * @dev: device that's been disconnected
1279 *
1280 * Must be called when a user of a device is finished with it. When the last
1281 * user of the device calls this function, the memory of the device is freed.
1282 */
1283void pci_dev_put(struct pci_dev *dev)
1284{
1285 if (dev)
1286 put_device(&dev->dev);
1287}
1288
1289#ifndef CONFIG_HOTPLUG
Kay Sievers7eff2e72007-08-14 15:15:12 +02001290int pci_uevent(struct device *dev, struct kobj_uevent_env *env)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001291{
1292 return -ENODEV;
1293}
1294#endif
1295
1296struct bus_type pci_bus_type = {
1297 .name = "pci",
1298 .match = pci_bus_match,
Kay Sievers312c0042005-11-16 09:00:00 +01001299 .uevent = pci_uevent,
Russell Kingb15d6862006-01-05 14:30:22 +00001300 .probe = pci_device_probe,
1301 .remove = pci_device_remove,
Linus Torvaldscbd69db2006-06-24 14:50:29 -07001302 .shutdown = pci_device_shutdown,
Linus Torvalds1da177e2005-04-16 15:20:36 -07001303 .dev_attrs = pci_dev_attrs,
Alex Chiang705b1aa2009-03-20 14:56:31 -06001304 .bus_attrs = pci_bus_attrs,
Rafael J. Wysockibbb44d92008-05-20 00:49:04 +02001305 .pm = PCI_PM_OPS_PTR,
Linus Torvalds1da177e2005-04-16 15:20:36 -07001306};
1307
1308static int __init pci_driver_init(void)
1309{
1310 return bus_register(&pci_bus_type);
1311}
1312
1313postcore_initcall(pci_driver_init);
1314
Tejun Heo9dba9102009-09-03 15:26:36 +09001315EXPORT_SYMBOL_GPL(pci_add_dynid);
Greg Kroah-Hartman75865852005-06-30 02:18:12 -07001316EXPORT_SYMBOL(pci_match_id);
Laurent riffard863b18f2005-10-27 23:12:54 +02001317EXPORT_SYMBOL(__pci_register_driver);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001318EXPORT_SYMBOL(pci_unregister_driver);
1319EXPORT_SYMBOL(pci_dev_driver);
1320EXPORT_SYMBOL(pci_bus_type);
1321EXPORT_SYMBOL(pci_dev_get);
1322EXPORT_SYMBOL(pci_dev_put);