Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge branch 'pm-qos' into acpi-dev-pm

Material in the 'acpi-dev-pm' branch depends on 'pm-qos' commits.

+541 -87
+31
Documentation/ABI/testing/sysfs-devices-power
··· 204 204 205 205 This attribute has no effect on system-wide suspend/resume and 206 206 hibernation. 207 + 208 + What: /sys/devices/.../power/pm_qos_no_power_off 209 + Date: September 2012 210 + Contact: Rafael J. Wysocki <rjw@sisk.pl> 211 + Description: 212 + The /sys/devices/.../power/pm_qos_no_power_off attribute 213 + is used for manipulating the PM QoS "no power off" flag. If 214 + set, this flag indicates to the kernel that power should not 215 + be removed entirely from the device. 216 + 217 + Not all drivers support this attribute. If it isn't supported, 218 + it is not present. 219 + 220 + This attribute has no effect on system-wide suspend/resume and 221 + hibernation. 222 + 223 + What: /sys/devices/.../power/pm_qos_remote_wakeup 224 + Date: September 2012 225 + Contact: Rafael J. Wysocki <rjw@sisk.pl> 226 + Description: 227 + The /sys/devices/.../power/pm_qos_remote_wakeup attribute 228 + is used for manipulating the PM QoS "remote wakeup required" 229 + flag. If set, this flag indicates to the kernel that the 230 + device is a source of user events that have to be signaled from 231 + its low-power states. 232 + 233 + Not all drivers support this attribute. If it isn't supported, 234 + it is not present. 235 + 236 + This attribute has no effect on system-wide suspend/resume and 237 + hibernation.
+1 -1
Documentation/power/pm_qos_interface.txt
··· 99 99 100 100 From kernel mode the use of this interface is the following: 101 101 102 - int dev_pm_qos_add_request(device, handle, value): 102 + int dev_pm_qos_add_request(device, handle, type, value): 103 103 Will insert an element into the list for that identified device with the 104 104 target value. Upon change to this list the new target is recomputed and any 105 105 registered notifiers are called only if the target value is now different.
+17 -4
drivers/acpi/sleep.c
··· 19 19 #include <linux/acpi.h> 20 20 #include <linux/module.h> 21 21 #include <linux/pm_runtime.h> 22 + #include <linux/pm_qos.h> 22 23 23 24 #include <asm/io.h> 24 25 ··· 712 711 struct acpi_device *adev; 713 712 char acpi_method[] = "_SxD"; 714 713 unsigned long long d_min, d_max; 714 + bool wakeup = false; 715 715 716 716 if (d_max_in < ACPI_STATE_D0 || d_max_in > ACPI_STATE_D3) 717 717 return -EINVAL; 718 718 if (!handle || ACPI_FAILURE(acpi_bus_get_device(handle, &adev))) { 719 719 printk(KERN_DEBUG "ACPI handle has no context!\n"); 720 720 return -ENODEV; 721 + } 722 + if (d_max_in > ACPI_STATE_D3_HOT) { 723 + enum pm_qos_flags_status stat; 724 + 725 + stat = dev_pm_qos_flags(dev, PM_QOS_FLAG_NO_POWER_OFF); 726 + if (stat == PM_QOS_FLAGS_ALL) 727 + d_max_in = ACPI_STATE_D3_HOT; 721 728 } 722 729 723 730 acpi_method[2] = '0' + acpi_target_sleep_state; ··· 746 737 * NOTE: We rely on acpi_evaluate_integer() not clobbering the integer 747 738 * provided -- that's our fault recovery, we ignore retval. 748 739 */ 749 - if (acpi_target_sleep_state > ACPI_STATE_S0) 740 + if (acpi_target_sleep_state > ACPI_STATE_S0) { 750 741 acpi_evaluate_integer(handle, acpi_method, NULL, &d_min); 742 + wakeup = device_may_wakeup(dev) && adev->wakeup.flags.valid 743 + && adev->wakeup.sleep_state >= acpi_target_sleep_state; 744 + } else if (dev_pm_qos_flags(dev, PM_QOS_FLAG_REMOTE_WAKEUP) != 745 + PM_QOS_FLAGS_NONE) { 746 + wakeup = adev->wakeup.flags.valid; 747 + } 751 748 752 749 /* 753 750 * If _PRW says we can wake up the system from the target sleep state, ··· 762 747 * (ACPI 3.x), it should return the maximum (lowest power) D-state that 763 748 * can wake the system. _S0W may be valid, too. 764 749 */ 765 - if (acpi_target_sleep_state == ACPI_STATE_S0 || 766 - (device_may_wakeup(dev) && adev->wakeup.flags.valid && 767 - adev->wakeup.sleep_state >= acpi_target_sleep_state)) { 750 + if (wakeup) { 768 751 acpi_status status; 769 752 770 753 acpi_method[3] = 'W';
+10 -1
drivers/base/power/domain.c
··· 470 470 return -EBUSY; 471 471 472 472 not_suspended = 0; 473 - list_for_each_entry(pdd, &genpd->dev_list, list_node) 473 + list_for_each_entry(pdd, &genpd->dev_list, list_node) { 474 + enum pm_qos_flags_status stat; 475 + 476 + stat = dev_pm_qos_flags(pdd->dev, 477 + PM_QOS_FLAG_NO_POWER_OFF 478 + | PM_QOS_FLAG_REMOTE_WAKEUP); 479 + if (stat > PM_QOS_FLAGS_NONE) 480 + return -EBUSY; 481 + 474 482 if (pdd->dev->driver && (!pm_runtime_suspended(pdd->dev) 475 483 || pdd->dev->power.irq_safe)) 476 484 not_suspended++; 485 + } 477 486 478 487 if (not_suspended > genpd->in_progress) 479 488 return -EBUSY;
+4 -2
drivers/base/power/power.h
··· 93 93 extern void rpm_sysfs_remove(struct device *dev); 94 94 extern int wakeup_sysfs_add(struct device *dev); 95 95 extern void wakeup_sysfs_remove(struct device *dev); 96 - extern int pm_qos_sysfs_add(struct device *dev); 97 - extern void pm_qos_sysfs_remove(struct device *dev); 96 + extern int pm_qos_sysfs_add_latency(struct device *dev); 97 + extern void pm_qos_sysfs_remove_latency(struct device *dev); 98 + extern int pm_qos_sysfs_add_flags(struct device *dev); 99 + extern void pm_qos_sysfs_remove_flags(struct device *dev); 98 100 99 101 #else /* CONFIG_PM */ 100 102
+246 -62
drivers/base/power/qos.c
··· 40 40 #include <linux/device.h> 41 41 #include <linux/mutex.h> 42 42 #include <linux/export.h> 43 + #include <linux/pm_runtime.h> 43 44 44 45 #include "power.h" 45 46 46 47 static DEFINE_MUTEX(dev_pm_qos_mtx); 47 48 48 49 static BLOCKING_NOTIFIER_HEAD(dev_pm_notifiers); 50 + 51 + /** 52 + * __dev_pm_qos_flags - Check PM QoS flags for a given device. 53 + * @dev: Device to check the PM QoS flags for. 54 + * @mask: Flags to check against. 55 + * 56 + * This routine must be called with dev->power.lock held. 57 + */ 58 + enum pm_qos_flags_status __dev_pm_qos_flags(struct device *dev, s32 mask) 59 + { 60 + struct dev_pm_qos *qos = dev->power.qos; 61 + struct pm_qos_flags *pqf; 62 + s32 val; 63 + 64 + if (!qos) 65 + return PM_QOS_FLAGS_UNDEFINED; 66 + 67 + pqf = &qos->flags; 68 + if (list_empty(&pqf->list)) 69 + return PM_QOS_FLAGS_UNDEFINED; 70 + 71 + val = pqf->effective_flags & mask; 72 + if (val) 73 + return (val == mask) ? PM_QOS_FLAGS_ALL : PM_QOS_FLAGS_SOME; 74 + 75 + return PM_QOS_FLAGS_NONE; 76 + } 77 + 78 + /** 79 + * dev_pm_qos_flags - Check PM QoS flags for a given device (locked). 80 + * @dev: Device to check the PM QoS flags for. 81 + * @mask: Flags to check against. 82 + */ 83 + enum pm_qos_flags_status dev_pm_qos_flags(struct device *dev, s32 mask) 84 + { 85 + unsigned long irqflags; 86 + enum pm_qos_flags_status ret; 87 + 88 + spin_lock_irqsave(&dev->power.lock, irqflags); 89 + ret = __dev_pm_qos_flags(dev, mask); 90 + spin_unlock_irqrestore(&dev->power.lock, irqflags); 91 + 92 + return ret; 93 + } 49 94 50 95 /** 51 96 * __dev_pm_qos_read_value - Get PM QoS constraint for a given device. ··· 100 55 */ 101 56 s32 __dev_pm_qos_read_value(struct device *dev) 102 57 { 103 - struct pm_qos_constraints *c = dev->power.constraints; 104 - 105 - return c ? pm_qos_read_value(c) : 0; 58 + return dev->power.qos ? pm_qos_read_value(&dev->power.qos->latency) : 0; 106 59 } 107 60 108 61 /** ··· 119 76 return ret; 120 77 } 121 78 122 - /* 123 - * apply_constraint 124 - * @req: constraint request to apply 125 - * @action: action to perform add/update/remove, of type enum pm_qos_req_action 126 - * @value: defines the qos request 79 + /** 80 + * apply_constraint - Add/modify/remove device PM QoS request. 81 + * @req: Constraint request to apply 82 + * @action: Action to perform (add/update/remove). 83 + * @value: Value to assign to the QoS request. 127 84 * 128 85 * Internal function to update the constraints list using the PM QoS core 129 86 * code and if needed call the per-device and the global notification 130 87 * callbacks 131 88 */ 132 89 static int apply_constraint(struct dev_pm_qos_request *req, 133 - enum pm_qos_req_action action, int value) 90 + enum pm_qos_req_action action, s32 value) 134 91 { 135 - int ret, curr_value; 92 + struct dev_pm_qos *qos = req->dev->power.qos; 93 + int ret; 136 94 137 - ret = pm_qos_update_target(req->dev->power.constraints, 138 - &req->node, action, value); 139 - 140 - if (ret) { 141 - /* Call the global callbacks if needed */ 142 - curr_value = pm_qos_read_value(req->dev->power.constraints); 143 - blocking_notifier_call_chain(&dev_pm_notifiers, 144 - (unsigned long)curr_value, 145 - req); 95 + switch(req->type) { 96 + case DEV_PM_QOS_LATENCY: 97 + ret = pm_qos_update_target(&qos->latency, &req->data.pnode, 98 + action, value); 99 + if (ret) { 100 + value = pm_qos_read_value(&qos->latency); 101 + blocking_notifier_call_chain(&dev_pm_notifiers, 102 + (unsigned long)value, 103 + req); 104 + } 105 + break; 106 + case DEV_PM_QOS_FLAGS: 107 + ret = pm_qos_update_flags(&qos->flags, &req->data.flr, 108 + action, value); 109 + break; 110 + default: 111 + ret = -EINVAL; 146 112 } 147 113 148 114 return ret; ··· 166 114 */ 167 115 static int dev_pm_qos_constraints_allocate(struct device *dev) 168 116 { 117 + struct dev_pm_qos *qos; 169 118 struct pm_qos_constraints *c; 170 119 struct blocking_notifier_head *n; 171 120 172 - c = kzalloc(sizeof(*c), GFP_KERNEL); 173 - if (!c) 121 + qos = kzalloc(sizeof(*qos), GFP_KERNEL); 122 + if (!qos) 174 123 return -ENOMEM; 175 124 176 125 n = kzalloc(sizeof(*n), GFP_KERNEL); 177 126 if (!n) { 178 - kfree(c); 127 + kfree(qos); 179 128 return -ENOMEM; 180 129 } 181 130 BLOCKING_INIT_NOTIFIER_HEAD(n); 182 131 132 + c = &qos->latency; 183 133 plist_head_init(&c->list); 184 134 c->target_value = PM_QOS_DEV_LAT_DEFAULT_VALUE; 185 135 c->default_value = PM_QOS_DEV_LAT_DEFAULT_VALUE; 186 136 c->type = PM_QOS_MIN; 187 137 c->notifiers = n; 188 138 139 + INIT_LIST_HEAD(&qos->flags.list); 140 + 189 141 spin_lock_irq(&dev->power.lock); 190 - dev->power.constraints = c; 142 + dev->power.qos = qos; 191 143 spin_unlock_irq(&dev->power.lock); 192 144 193 145 return 0; ··· 207 151 void dev_pm_qos_constraints_init(struct device *dev) 208 152 { 209 153 mutex_lock(&dev_pm_qos_mtx); 210 - dev->power.constraints = NULL; 154 + dev->power.qos = NULL; 211 155 dev->power.power_state = PMSG_ON; 212 156 mutex_unlock(&dev_pm_qos_mtx); 213 157 } ··· 220 164 */ 221 165 void dev_pm_qos_constraints_destroy(struct device *dev) 222 166 { 167 + struct dev_pm_qos *qos; 223 168 struct dev_pm_qos_request *req, *tmp; 224 169 struct pm_qos_constraints *c; 225 170 ··· 233 176 mutex_lock(&dev_pm_qos_mtx); 234 177 235 178 dev->power.power_state = PMSG_INVALID; 236 - c = dev->power.constraints; 237 - if (!c) 179 + qos = dev->power.qos; 180 + if (!qos) 238 181 goto out; 239 182 183 + c = &qos->latency; 240 184 /* Flush the constraints list for the device */ 241 - plist_for_each_entry_safe(req, tmp, &c->list, node) { 185 + plist_for_each_entry_safe(req, tmp, &c->list, data.pnode) { 242 186 /* 243 187 * Update constraints list and call the notification 244 188 * callbacks if needed ··· 249 191 } 250 192 251 193 spin_lock_irq(&dev->power.lock); 252 - dev->power.constraints = NULL; 194 + dev->power.qos = NULL; 253 195 spin_unlock_irq(&dev->power.lock); 254 196 255 197 kfree(c->notifiers); 256 - kfree(c); 198 + kfree(qos); 257 199 258 200 out: 259 201 mutex_unlock(&dev_pm_qos_mtx); ··· 263 205 * dev_pm_qos_add_request - inserts new qos request into the list 264 206 * @dev: target device for the constraint 265 207 * @req: pointer to a preallocated handle 208 + * @type: type of the request 266 209 * @value: defines the qos request 267 210 * 268 211 * This function inserts a new entry in the device constraints list of ··· 277 218 * -EINVAL in case of wrong parameters, -ENOMEM if there's not enough memory 278 219 * to allocate for data structures, -ENODEV if the device has just been removed 279 220 * from the system. 221 + * 222 + * Callers should ensure that the target device is not RPM_SUSPENDED before 223 + * using this function for requests of type DEV_PM_QOS_FLAGS. 280 224 */ 281 225 int dev_pm_qos_add_request(struct device *dev, struct dev_pm_qos_request *req, 282 - s32 value) 226 + enum dev_pm_qos_req_type type, s32 value) 283 227 { 284 228 int ret = 0; 285 229 ··· 297 235 298 236 mutex_lock(&dev_pm_qos_mtx); 299 237 300 - if (!dev->power.constraints) { 238 + if (!dev->power.qos) { 301 239 if (dev->power.power_state.event == PM_EVENT_INVALID) { 302 240 /* The device has been removed from the system. */ 303 241 req->dev = NULL; ··· 313 251 } 314 252 } 315 253 316 - if (!ret) 254 + if (!ret) { 255 + req->type = type; 317 256 ret = apply_constraint(req, PM_QOS_ADD_REQ, value); 257 + } 318 258 319 259 out: 320 260 mutex_unlock(&dev_pm_qos_mtx); ··· 324 260 return ret; 325 261 } 326 262 EXPORT_SYMBOL_GPL(dev_pm_qos_add_request); 263 + 264 + /** 265 + * __dev_pm_qos_update_request - Modify an existing device PM QoS request. 266 + * @req : PM QoS request to modify. 267 + * @new_value: New value to request. 268 + */ 269 + static int __dev_pm_qos_update_request(struct dev_pm_qos_request *req, 270 + s32 new_value) 271 + { 272 + s32 curr_value; 273 + int ret = 0; 274 + 275 + if (!req->dev->power.qos) 276 + return -ENODEV; 277 + 278 + switch(req->type) { 279 + case DEV_PM_QOS_LATENCY: 280 + curr_value = req->data.pnode.prio; 281 + break; 282 + case DEV_PM_QOS_FLAGS: 283 + curr_value = req->data.flr.flags; 284 + break; 285 + default: 286 + return -EINVAL; 287 + } 288 + 289 + if (curr_value != new_value) 290 + ret = apply_constraint(req, PM_QOS_UPDATE_REQ, new_value); 291 + 292 + return ret; 293 + } 327 294 328 295 /** 329 296 * dev_pm_qos_update_request - modifies an existing qos request ··· 370 275 * 0 if the aggregated constraint value has not changed, 371 276 * -EINVAL in case of wrong parameters, -ENODEV if the device has been 372 277 * removed from the system 278 + * 279 + * Callers should ensure that the target device is not RPM_SUSPENDED before 280 + * using this function for requests of type DEV_PM_QOS_FLAGS. 373 281 */ 374 - int dev_pm_qos_update_request(struct dev_pm_qos_request *req, 375 - s32 new_value) 282 + int dev_pm_qos_update_request(struct dev_pm_qos_request *req, s32 new_value) 376 283 { 377 - int ret = 0; 284 + int ret; 378 285 379 286 if (!req) /*guard against callers passing in null */ 380 287 return -EINVAL; ··· 386 289 return -EINVAL; 387 290 388 291 mutex_lock(&dev_pm_qos_mtx); 389 - 390 - if (req->dev->power.constraints) { 391 - if (new_value != req->node.prio) 392 - ret = apply_constraint(req, PM_QOS_UPDATE_REQ, 393 - new_value); 394 - } else { 395 - /* Return if the device has been removed */ 396 - ret = -ENODEV; 397 - } 398 - 292 + ret = __dev_pm_qos_update_request(req, new_value); 399 293 mutex_unlock(&dev_pm_qos_mtx); 294 + 400 295 return ret; 401 296 } 402 297 EXPORT_SYMBOL_GPL(dev_pm_qos_update_request); ··· 404 315 * 0 if the aggregated constraint value has not changed, 405 316 * -EINVAL in case of wrong parameters, -ENODEV if the device has been 406 317 * removed from the system 318 + * 319 + * Callers should ensure that the target device is not RPM_SUSPENDED before 320 + * using this function for requests of type DEV_PM_QOS_FLAGS. 407 321 */ 408 322 int dev_pm_qos_remove_request(struct dev_pm_qos_request *req) 409 323 { ··· 421 329 422 330 mutex_lock(&dev_pm_qos_mtx); 423 331 424 - if (req->dev->power.constraints) { 332 + if (req->dev->power.qos) { 425 333 ret = apply_constraint(req, PM_QOS_REMOVE_REQ, 426 334 PM_QOS_DEFAULT_VALUE); 427 335 memset(req, 0, sizeof(*req)); ··· 454 362 455 363 mutex_lock(&dev_pm_qos_mtx); 456 364 457 - if (!dev->power.constraints) 365 + if (!dev->power.qos) 458 366 ret = dev->power.power_state.event != PM_EVENT_INVALID ? 459 367 dev_pm_qos_constraints_allocate(dev) : -ENODEV; 460 368 461 369 if (!ret) 462 370 ret = blocking_notifier_chain_register( 463 - dev->power.constraints->notifiers, notifier); 371 + dev->power.qos->latency.notifiers, notifier); 464 372 465 373 mutex_unlock(&dev_pm_qos_mtx); 466 374 return ret; ··· 485 393 mutex_lock(&dev_pm_qos_mtx); 486 394 487 395 /* Silently return if the constraints object is not present. */ 488 - if (dev->power.constraints) 396 + if (dev->power.qos) 489 397 retval = blocking_notifier_chain_unregister( 490 - dev->power.constraints->notifiers, 398 + dev->power.qos->latency.notifiers, 491 399 notifier); 492 400 493 401 mutex_unlock(&dev_pm_qos_mtx); ··· 541 449 ancestor = ancestor->parent; 542 450 543 451 if (ancestor) 544 - error = dev_pm_qos_add_request(ancestor, req, value); 452 + error = dev_pm_qos_add_request(ancestor, req, 453 + DEV_PM_QOS_LATENCY, value); 545 454 546 455 if (error) 547 456 req->dev = NULL; ··· 552 459 EXPORT_SYMBOL_GPL(dev_pm_qos_add_ancestor_request); 553 460 554 461 #ifdef CONFIG_PM_RUNTIME 555 - static void __dev_pm_qos_drop_user_request(struct device *dev) 462 + static void __dev_pm_qos_drop_user_request(struct device *dev, 463 + enum dev_pm_qos_req_type type) 556 464 { 557 - dev_pm_qos_remove_request(dev->power.pq_req); 558 - dev->power.pq_req = NULL; 465 + switch(type) { 466 + case DEV_PM_QOS_LATENCY: 467 + dev_pm_qos_remove_request(dev->power.qos->latency_req); 468 + dev->power.qos->latency_req = NULL; 469 + break; 470 + case DEV_PM_QOS_FLAGS: 471 + dev_pm_qos_remove_request(dev->power.qos->flags_req); 472 + dev->power.qos->flags_req = NULL; 473 + break; 474 + } 559 475 } 560 476 561 477 /** ··· 580 478 if (!device_is_registered(dev) || value < 0) 581 479 return -EINVAL; 582 480 583 - if (dev->power.pq_req) 481 + if (dev->power.qos && dev->power.qos->latency_req) 584 482 return -EEXIST; 585 483 586 484 req = kzalloc(sizeof(*req), GFP_KERNEL); 587 485 if (!req) 588 486 return -ENOMEM; 589 487 590 - ret = dev_pm_qos_add_request(dev, req, value); 488 + ret = dev_pm_qos_add_request(dev, req, DEV_PM_QOS_LATENCY, value); 591 489 if (ret < 0) 592 490 return ret; 593 491 594 - dev->power.pq_req = req; 595 - ret = pm_qos_sysfs_add(dev); 492 + dev->power.qos->latency_req = req; 493 + ret = pm_qos_sysfs_add_latency(dev); 596 494 if (ret) 597 - __dev_pm_qos_drop_user_request(dev); 495 + __dev_pm_qos_drop_user_request(dev, DEV_PM_QOS_LATENCY); 598 496 599 497 return ret; 600 498 } ··· 606 504 */ 607 505 void dev_pm_qos_hide_latency_limit(struct device *dev) 608 506 { 609 - if (dev->power.pq_req) { 610 - pm_qos_sysfs_remove(dev); 611 - __dev_pm_qos_drop_user_request(dev); 507 + if (dev->power.qos && dev->power.qos->latency_req) { 508 + pm_qos_sysfs_remove_latency(dev); 509 + __dev_pm_qos_drop_user_request(dev, DEV_PM_QOS_LATENCY); 612 510 } 613 511 } 614 512 EXPORT_SYMBOL_GPL(dev_pm_qos_hide_latency_limit); 513 + 514 + /** 515 + * dev_pm_qos_expose_flags - Expose PM QoS flags of a device to user space. 516 + * @dev: Device whose PM QoS flags are to be exposed to user space. 517 + * @val: Initial values of the flags. 518 + */ 519 + int dev_pm_qos_expose_flags(struct device *dev, s32 val) 520 + { 521 + struct dev_pm_qos_request *req; 522 + int ret; 523 + 524 + if (!device_is_registered(dev)) 525 + return -EINVAL; 526 + 527 + if (dev->power.qos && dev->power.qos->flags_req) 528 + return -EEXIST; 529 + 530 + req = kzalloc(sizeof(*req), GFP_KERNEL); 531 + if (!req) 532 + return -ENOMEM; 533 + 534 + pm_runtime_get_sync(dev); 535 + ret = dev_pm_qos_add_request(dev, req, DEV_PM_QOS_FLAGS, val); 536 + if (ret < 0) 537 + goto fail; 538 + 539 + dev->power.qos->flags_req = req; 540 + ret = pm_qos_sysfs_add_flags(dev); 541 + if (ret) 542 + __dev_pm_qos_drop_user_request(dev, DEV_PM_QOS_FLAGS); 543 + 544 + fail: 545 + pm_runtime_put(dev); 546 + return ret; 547 + } 548 + EXPORT_SYMBOL_GPL(dev_pm_qos_expose_flags); 549 + 550 + /** 551 + * dev_pm_qos_hide_flags - Hide PM QoS flags of a device from user space. 552 + * @dev: Device whose PM QoS flags are to be hidden from user space. 553 + */ 554 + void dev_pm_qos_hide_flags(struct device *dev) 555 + { 556 + if (dev->power.qos && dev->power.qos->flags_req) { 557 + pm_qos_sysfs_remove_flags(dev); 558 + pm_runtime_get_sync(dev); 559 + __dev_pm_qos_drop_user_request(dev, DEV_PM_QOS_FLAGS); 560 + pm_runtime_put(dev); 561 + } 562 + } 563 + EXPORT_SYMBOL_GPL(dev_pm_qos_hide_flags); 564 + 565 + /** 566 + * dev_pm_qos_update_flags - Update PM QoS flags request owned by user space. 567 + * @dev: Device to update the PM QoS flags request for. 568 + * @mask: Flags to set/clear. 569 + * @set: Whether to set or clear the flags (true means set). 570 + */ 571 + int dev_pm_qos_update_flags(struct device *dev, s32 mask, bool set) 572 + { 573 + s32 value; 574 + int ret; 575 + 576 + if (!dev->power.qos || !dev->power.qos->flags_req) 577 + return -EINVAL; 578 + 579 + pm_runtime_get_sync(dev); 580 + mutex_lock(&dev_pm_qos_mtx); 581 + 582 + value = dev_pm_qos_requested_flags(dev); 583 + if (set) 584 + value |= mask; 585 + else 586 + value &= ~mask; 587 + 588 + ret = __dev_pm_qos_update_request(dev->power.qos->flags_req, value); 589 + 590 + mutex_unlock(&dev_pm_qos_mtx); 591 + pm_runtime_put(dev); 592 + 593 + return ret; 594 + } 615 595 #endif /* CONFIG_PM_RUNTIME */
+85 -9
drivers/base/power/sysfs.c
··· 221 221 static ssize_t pm_qos_latency_show(struct device *dev, 222 222 struct device_attribute *attr, char *buf) 223 223 { 224 - return sprintf(buf, "%d\n", dev->power.pq_req->node.prio); 224 + return sprintf(buf, "%d\n", dev_pm_qos_requested_latency(dev)); 225 225 } 226 226 227 227 static ssize_t pm_qos_latency_store(struct device *dev, ··· 237 237 if (value < 0) 238 238 return -EINVAL; 239 239 240 - ret = dev_pm_qos_update_request(dev->power.pq_req, value); 240 + ret = dev_pm_qos_update_request(dev->power.qos->latency_req, value); 241 241 return ret < 0 ? ret : n; 242 242 } 243 243 244 244 static DEVICE_ATTR(pm_qos_resume_latency_us, 0644, 245 245 pm_qos_latency_show, pm_qos_latency_store); 246 + 247 + static ssize_t pm_qos_no_power_off_show(struct device *dev, 248 + struct device_attribute *attr, 249 + char *buf) 250 + { 251 + return sprintf(buf, "%d\n", !!(dev_pm_qos_requested_flags(dev) 252 + & PM_QOS_FLAG_NO_POWER_OFF)); 253 + } 254 + 255 + static ssize_t pm_qos_no_power_off_store(struct device *dev, 256 + struct device_attribute *attr, 257 + const char *buf, size_t n) 258 + { 259 + int ret; 260 + 261 + if (kstrtoint(buf, 0, &ret)) 262 + return -EINVAL; 263 + 264 + if (ret != 0 && ret != 1) 265 + return -EINVAL; 266 + 267 + ret = dev_pm_qos_update_flags(dev, PM_QOS_FLAG_NO_POWER_OFF, ret); 268 + return ret < 0 ? ret : n; 269 + } 270 + 271 + static DEVICE_ATTR(pm_qos_no_power_off, 0644, 272 + pm_qos_no_power_off_show, pm_qos_no_power_off_store); 273 + 274 + static ssize_t pm_qos_remote_wakeup_show(struct device *dev, 275 + struct device_attribute *attr, 276 + char *buf) 277 + { 278 + return sprintf(buf, "%d\n", !!(dev_pm_qos_requested_flags(dev) 279 + & PM_QOS_FLAG_REMOTE_WAKEUP)); 280 + } 281 + 282 + static ssize_t pm_qos_remote_wakeup_store(struct device *dev, 283 + struct device_attribute *attr, 284 + const char *buf, size_t n) 285 + { 286 + int ret; 287 + 288 + if (kstrtoint(buf, 0, &ret)) 289 + return -EINVAL; 290 + 291 + if (ret != 0 && ret != 1) 292 + return -EINVAL; 293 + 294 + ret = dev_pm_qos_update_flags(dev, PM_QOS_FLAG_REMOTE_WAKEUP, ret); 295 + return ret < 0 ? ret : n; 296 + } 297 + 298 + static DEVICE_ATTR(pm_qos_remote_wakeup, 0644, 299 + pm_qos_remote_wakeup_show, pm_qos_remote_wakeup_store); 246 300 #endif /* CONFIG_PM_RUNTIME */ 247 301 248 302 #ifdef CONFIG_PM_SLEEP ··· 618 564 .attrs = runtime_attrs, 619 565 }; 620 566 621 - static struct attribute *pm_qos_attrs[] = { 567 + static struct attribute *pm_qos_latency_attrs[] = { 622 568 #ifdef CONFIG_PM_RUNTIME 623 569 &dev_attr_pm_qos_resume_latency_us.attr, 624 570 #endif /* CONFIG_PM_RUNTIME */ 625 571 NULL, 626 572 }; 627 - static struct attribute_group pm_qos_attr_group = { 573 + static struct attribute_group pm_qos_latency_attr_group = { 628 574 .name = power_group_name, 629 - .attrs = pm_qos_attrs, 575 + .attrs = pm_qos_latency_attrs, 576 + }; 577 + 578 + static struct attribute *pm_qos_flags_attrs[] = { 579 + #ifdef CONFIG_PM_RUNTIME 580 + &dev_attr_pm_qos_no_power_off.attr, 581 + &dev_attr_pm_qos_remote_wakeup.attr, 582 + #endif /* CONFIG_PM_RUNTIME */ 583 + NULL, 584 + }; 585 + static struct attribute_group pm_qos_flags_attr_group = { 586 + .name = power_group_name, 587 + .attrs = pm_qos_flags_attrs, 630 588 }; 631 589 632 590 int dpm_sysfs_add(struct device *dev) ··· 681 615 sysfs_unmerge_group(&dev->kobj, &pm_wakeup_attr_group); 682 616 } 683 617 684 - int pm_qos_sysfs_add(struct device *dev) 618 + int pm_qos_sysfs_add_latency(struct device *dev) 685 619 { 686 - return sysfs_merge_group(&dev->kobj, &pm_qos_attr_group); 620 + return sysfs_merge_group(&dev->kobj, &pm_qos_latency_attr_group); 687 621 } 688 622 689 - void pm_qos_sysfs_remove(struct device *dev) 623 + void pm_qos_sysfs_remove_latency(struct device *dev) 690 624 { 691 - sysfs_unmerge_group(&dev->kobj, &pm_qos_attr_group); 625 + sysfs_unmerge_group(&dev->kobj, &pm_qos_latency_attr_group); 626 + } 627 + 628 + int pm_qos_sysfs_add_flags(struct device *dev) 629 + { 630 + return sysfs_merge_group(&dev->kobj, &pm_qos_flags_attr_group); 631 + } 632 + 633 + void pm_qos_sysfs_remove_flags(struct device *dev) 634 + { 635 + sysfs_unmerge_group(&dev->kobj, &pm_qos_flags_attr_group); 692 636 } 693 637 694 638 void rpm_sysfs_remove(struct device *dev)
+3 -1
drivers/mtd/nand/sh_flctl.c
··· 727 727 728 728 if (!flctl->qos_request) { 729 729 ret = dev_pm_qos_add_request(&flctl->pdev->dev, 730 - &flctl->pm_qos, 100); 730 + &flctl->pm_qos, 731 + DEV_PM_QOS_LATENCY, 732 + 100); 731 733 if (ret < 0) 732 734 dev_err(&flctl->pdev->dev, 733 735 "PM QoS request failed: %d\n", ret);
+7 -1
drivers/pci/pci-acpi.c
··· 17 17 18 18 #include <linux/pci-acpi.h> 19 19 #include <linux/pm_runtime.h> 20 + #include <linux/pm_qos.h> 20 21 #include "pci.h" 21 22 22 23 static DEFINE_MUTEX(pci_acpi_pm_notify_mtx); ··· 258 257 return -ENODEV; 259 258 260 259 switch (state) { 260 + case PCI_D3cold: 261 + if (dev_pm_qos_flags(&dev->dev, PM_QOS_FLAG_NO_POWER_OFF) == 262 + PM_QOS_FLAGS_ALL) { 263 + error = -EBUSY; 264 + break; 265 + } 261 266 case PCI_D0: 262 267 case PCI_D1: 263 268 case PCI_D2: 264 269 case PCI_D3hot: 265 - case PCI_D3cold: 266 270 error = acpi_bus_set_power(handle, state_conv[state]); 267 271 } 268 272
+1 -2
include/linux/pm.h
··· 546 546 unsigned long active_jiffies; 547 547 unsigned long suspended_jiffies; 548 548 unsigned long accounting_timestamp; 549 - struct dev_pm_qos_request *pq_req; 550 549 #endif 551 550 struct pm_subsys_data *subsys_data; /* Owned by the subsystem. */ 552 - struct pm_qos_constraints *constraints; 551 + struct dev_pm_qos *qos; 553 552 }; 554 553 555 554 extern void update_pm_runtime_accounting(struct device *dev);
+73 -4
include/linux/pm_qos.h
··· 20 20 PM_QOS_NUM_CLASSES, 21 21 }; 22 22 23 + enum pm_qos_flags_status { 24 + PM_QOS_FLAGS_UNDEFINED = -1, 25 + PM_QOS_FLAGS_NONE, 26 + PM_QOS_FLAGS_SOME, 27 + PM_QOS_FLAGS_ALL, 28 + }; 29 + 23 30 #define PM_QOS_DEFAULT_VALUE -1 24 31 25 32 #define PM_QOS_CPU_DMA_LAT_DEFAULT_VALUE (2000 * USEC_PER_SEC) ··· 34 27 #define PM_QOS_NETWORK_THROUGHPUT_DEFAULT_VALUE 0 35 28 #define PM_QOS_DEV_LAT_DEFAULT_VALUE 0 36 29 30 + #define PM_QOS_FLAG_NO_POWER_OFF (1 << 0) 31 + #define PM_QOS_FLAG_REMOTE_WAKEUP (1 << 1) 32 + 37 33 struct pm_qos_request { 38 34 struct plist_node node; 39 35 int pm_qos_class; 40 36 struct delayed_work work; /* for pm_qos_update_request_timeout */ 41 37 }; 42 38 39 + struct pm_qos_flags_request { 40 + struct list_head node; 41 + s32 flags; /* Do not change to 64 bit */ 42 + }; 43 + 44 + enum dev_pm_qos_req_type { 45 + DEV_PM_QOS_LATENCY = 1, 46 + DEV_PM_QOS_FLAGS, 47 + }; 48 + 43 49 struct dev_pm_qos_request { 44 - struct plist_node node; 50 + enum dev_pm_qos_req_type type; 51 + union { 52 + struct plist_node pnode; 53 + struct pm_qos_flags_request flr; 54 + } data; 45 55 struct device *dev; 46 56 }; 47 57 ··· 69 45 }; 70 46 71 47 /* 72 - * Note: The lockless read path depends on the CPU accessing 73 - * target_value atomically. Atomic access is only guaranteed on all CPU 48 + * Note: The lockless read path depends on the CPU accessing target_value 49 + * or effective_flags atomically. Atomic access is only guaranteed on all CPU 74 50 * types linux supports for 32 bit quantites 75 51 */ 76 52 struct pm_qos_constraints { ··· 79 55 s32 default_value; 80 56 enum pm_qos_type type; 81 57 struct blocking_notifier_head *notifiers; 58 + }; 59 + 60 + struct pm_qos_flags { 61 + struct list_head list; 62 + s32 effective_flags; /* Do not change to 64 bit */ 63 + }; 64 + 65 + struct dev_pm_qos { 66 + struct pm_qos_constraints latency; 67 + struct pm_qos_flags flags; 68 + struct dev_pm_qos_request *latency_req; 69 + struct dev_pm_qos_request *flags_req; 82 70 }; 83 71 84 72 /* Action requested to pm_qos_update_target */ ··· 107 71 108 72 int pm_qos_update_target(struct pm_qos_constraints *c, struct plist_node *node, 109 73 enum pm_qos_req_action action, int value); 74 + bool pm_qos_update_flags(struct pm_qos_flags *pqf, 75 + struct pm_qos_flags_request *req, 76 + enum pm_qos_req_action action, s32 val); 110 77 void pm_qos_add_request(struct pm_qos_request *req, int pm_qos_class, 111 78 s32 value); 112 79 void pm_qos_update_request(struct pm_qos_request *req, ··· 125 86 s32 pm_qos_read_value(struct pm_qos_constraints *c); 126 87 127 88 #ifdef CONFIG_PM 89 + enum pm_qos_flags_status __dev_pm_qos_flags(struct device *dev, s32 mask); 90 + enum pm_qos_flags_status dev_pm_qos_flags(struct device *dev, s32 mask); 128 91 s32 __dev_pm_qos_read_value(struct device *dev); 129 92 s32 dev_pm_qos_read_value(struct device *dev); 130 93 int dev_pm_qos_add_request(struct device *dev, struct dev_pm_qos_request *req, 131 - s32 value); 94 + enum dev_pm_qos_req_type type, s32 value); 132 95 int dev_pm_qos_update_request(struct dev_pm_qos_request *req, s32 new_value); 133 96 int dev_pm_qos_remove_request(struct dev_pm_qos_request *req); 134 97 int dev_pm_qos_add_notifier(struct device *dev, ··· 144 103 int dev_pm_qos_add_ancestor_request(struct device *dev, 145 104 struct dev_pm_qos_request *req, s32 value); 146 105 #else 106 + static inline enum pm_qos_flags_status __dev_pm_qos_flags(struct device *dev, 107 + s32 mask) 108 + { return PM_QOS_FLAGS_UNDEFINED; } 109 + static inline enum pm_qos_flags_status dev_pm_qos_flags(struct device *dev, 110 + s32 mask) 111 + { return PM_QOS_FLAGS_UNDEFINED; } 147 112 static inline s32 __dev_pm_qos_read_value(struct device *dev) 148 113 { return 0; } 149 114 static inline s32 dev_pm_qos_read_value(struct device *dev) 150 115 { return 0; } 151 116 static inline int dev_pm_qos_add_request(struct device *dev, 152 117 struct dev_pm_qos_request *req, 118 + enum dev_pm_qos_req_type type, 153 119 s32 value) 154 120 { return 0; } 155 121 static inline int dev_pm_qos_update_request(struct dev_pm_qos_request *req, ··· 192 144 #ifdef CONFIG_PM_RUNTIME 193 145 int dev_pm_qos_expose_latency_limit(struct device *dev, s32 value); 194 146 void dev_pm_qos_hide_latency_limit(struct device *dev); 147 + int dev_pm_qos_expose_flags(struct device *dev, s32 value); 148 + void dev_pm_qos_hide_flags(struct device *dev); 149 + int dev_pm_qos_update_flags(struct device *dev, s32 mask, bool set); 150 + 151 + static inline s32 dev_pm_qos_requested_latency(struct device *dev) 152 + { 153 + return dev->power.qos->latency_req->data.pnode.prio; 154 + } 155 + 156 + static inline s32 dev_pm_qos_requested_flags(struct device *dev) 157 + { 158 + return dev->power.qos->flags_req->data.flr.flags; 159 + } 195 160 #else 196 161 static inline int dev_pm_qos_expose_latency_limit(struct device *dev, s32 value) 197 162 { return 0; } 198 163 static inline void dev_pm_qos_hide_latency_limit(struct device *dev) {} 164 + static inline int dev_pm_qos_expose_flags(struct device *dev, s32 value) 165 + { return 0; } 166 + static inline void dev_pm_qos_hide_flags(struct device *dev) {} 167 + static inline int dev_pm_qos_update_flags(struct device *dev, s32 m, bool set) 168 + { return 0; } 169 + 170 + static inline s32 dev_pm_qos_requested_latency(struct device *dev) { return 0; } 171 + static inline s32 dev_pm_qos_requested_flags(struct device *dev) { return 0; } 199 172 #endif 200 173 201 174 #endif
+63
kernel/power/qos.c
··· 213 213 } 214 214 215 215 /** 216 + * pm_qos_flags_remove_req - Remove device PM QoS flags request. 217 + * @pqf: Device PM QoS flags set to remove the request from. 218 + * @req: Request to remove from the set. 219 + */ 220 + static void pm_qos_flags_remove_req(struct pm_qos_flags *pqf, 221 + struct pm_qos_flags_request *req) 222 + { 223 + s32 val = 0; 224 + 225 + list_del(&req->node); 226 + list_for_each_entry(req, &pqf->list, node) 227 + val |= req->flags; 228 + 229 + pqf->effective_flags = val; 230 + } 231 + 232 + /** 233 + * pm_qos_update_flags - Update a set of PM QoS flags. 234 + * @pqf: Set of flags to update. 235 + * @req: Request to add to the set, to modify, or to remove from the set. 236 + * @action: Action to take on the set. 237 + * @val: Value of the request to add or modify. 238 + * 239 + * Update the given set of PM QoS flags and call notifiers if the aggregate 240 + * value has changed. Returns 1 if the aggregate constraint value has changed, 241 + * 0 otherwise. 242 + */ 243 + bool pm_qos_update_flags(struct pm_qos_flags *pqf, 244 + struct pm_qos_flags_request *req, 245 + enum pm_qos_req_action action, s32 val) 246 + { 247 + unsigned long irqflags; 248 + s32 prev_value, curr_value; 249 + 250 + spin_lock_irqsave(&pm_qos_lock, irqflags); 251 + 252 + prev_value = list_empty(&pqf->list) ? 0 : pqf->effective_flags; 253 + 254 + switch (action) { 255 + case PM_QOS_REMOVE_REQ: 256 + pm_qos_flags_remove_req(pqf, req); 257 + break; 258 + case PM_QOS_UPDATE_REQ: 259 + pm_qos_flags_remove_req(pqf, req); 260 + case PM_QOS_ADD_REQ: 261 + req->flags = val; 262 + INIT_LIST_HEAD(&req->node); 263 + list_add_tail(&req->node, &pqf->list); 264 + pqf->effective_flags |= val; 265 + break; 266 + default: 267 + /* no action */ 268 + ; 269 + } 270 + 271 + curr_value = list_empty(&pqf->list) ? 0 : pqf->effective_flags; 272 + 273 + spin_unlock_irqrestore(&pm_qos_lock, irqflags); 274 + 275 + return prev_value != curr_value; 276 + } 277 + 278 + /** 216 279 * pm_qos_request - returns current system wide qos expectation 217 280 * @pm_qos_class: identification of which qos value is requested 218 281 *