1 /* 2 * Devices PM QoS constraints management 3 * 4 * Copyright (C) 2011 Texas Instruments, Inc. 5 * 6 * This program is free software; you can redistribute it and/or modify 7 * it under the terms of the GNU General Public License version 2 as 8 * published by the Free Software Foundation. 9 * 10 * 11 * This module exposes the interface to kernel space for specifying 12 * per-device PM QoS dependencies. It provides infrastructure for registration 13 * of: 14 * 15 * Dependents on a QoS value : register requests 16 * Watchers of QoS value : get notified when target QoS value changes 17 * 18 * This QoS design is best effort based. Dependents register their QoS needs. 19 * Watchers register to keep track of the current QoS needs of the system. 20 * Watchers can register different types of notification callbacks: 21 * . a per-device notification callback using the dev_pm_qos_*_notifier API. 22 * The notification chain data is stored in the per-device constraint 23 * data struct. 24 * . a system-wide notification callback using the dev_pm_qos_*_global_notifier 25 * API. The notification chain data is stored in a static variable. 26 * 27 * Note about the per-device constraint data struct allocation: 28 * . The per-device constraints data struct ptr is tored into the device 29 * dev_pm_info. 30 * . To minimize the data usage by the per-device constraints, the data struct 31 * is only allocated at the first call to dev_pm_qos_add_request. 32 * . The data is later free'd when the device is removed from the system. 33 * . A global mutex protects the constraints users from the data being 34 * allocated and free'd. 35 */ 36 37 #include <linux/pm_qos.h> 38 #include <linux/spinlock.h> 39 #include <linux/slab.h> 40 #include <linux/device.h> 41 #include <linux/mutex.h> 42 #include <linux/export.h> 43 #include <linux/pm_runtime.h> 44 45 #include "power.h" 46 47 static DEFINE_MUTEX(dev_pm_qos_mtx); 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 } 94 95 /** 96 * __dev_pm_qos_read_value - Get PM QoS constraint for a given device. 97 * @dev: Device to get the PM QoS constraint value for. 98 * 99 * This routine must be called with dev->power.lock held. 100 */ 101 s32 __dev_pm_qos_read_value(struct device *dev) 102 { 103 return dev->power.qos ? pm_qos_read_value(&dev->power.qos->latency) : 0; 104 } 105 106 /** 107 * dev_pm_qos_read_value - Get PM QoS constraint for a given device (locked). 108 * @dev: Device to get the PM QoS constraint value for. 109 */ 110 s32 dev_pm_qos_read_value(struct device *dev) 111 { 112 unsigned long flags; 113 s32 ret; 114 115 spin_lock_irqsave(&dev->power.lock, flags); 116 ret = __dev_pm_qos_read_value(dev); 117 spin_unlock_irqrestore(&dev->power.lock, flags); 118 119 return ret; 120 } 121 122 /** 123 * apply_constraint - Add/modify/remove device PM QoS request. 124 * @req: Constraint request to apply 125 * @action: Action to perform (add/update/remove). 126 * @value: Value to assign to the QoS request. 127 * 128 * Internal function to update the constraints list using the PM QoS core 129 * code and if needed call the per-device and the global notification 130 * callbacks 131 */ 132 static int apply_constraint(struct dev_pm_qos_request *req, 133 enum pm_qos_req_action action, s32 value) 134 { 135 struct dev_pm_qos *qos = req->dev->power.qos; 136 int ret; 137 138 switch(req->type) { 139 case DEV_PM_QOS_LATENCY: 140 ret = pm_qos_update_target(&qos->latency, &req->data.pnode, 141 action, value); 142 if (ret) { 143 value = pm_qos_read_value(&qos->latency); 144 blocking_notifier_call_chain(&dev_pm_notifiers, 145 (unsigned long)value, 146 req); 147 } 148 break; 149 case DEV_PM_QOS_FLAGS: 150 ret = pm_qos_update_flags(&qos->flags, &req->data.flr, 151 action, value); 152 break; 153 default: 154 ret = -EINVAL; 155 } 156 157 return ret; 158 } 159 160 /* 161 * dev_pm_qos_constraints_allocate 162 * @dev: device to allocate data for 163 * 164 * Called at the first call to add_request, for constraint data allocation 165 * Must be called with the dev_pm_qos_mtx mutex held 166 */ 167 static int dev_pm_qos_constraints_allocate(struct device *dev) 168 { 169 struct dev_pm_qos *qos; 170 struct pm_qos_constraints *c; 171 struct blocking_notifier_head *n; 172 173 qos = kzalloc(sizeof(*qos), GFP_KERNEL); 174 if (!qos) 175 return -ENOMEM; 176 177 n = kzalloc(sizeof(*n), GFP_KERNEL); 178 if (!n) { 179 kfree(qos); 180 return -ENOMEM; 181 } 182 BLOCKING_INIT_NOTIFIER_HEAD(n); 183 184 c = &qos->latency; 185 plist_head_init(&c->list); 186 c->target_value = PM_QOS_DEV_LAT_DEFAULT_VALUE; 187 c->default_value = PM_QOS_DEV_LAT_DEFAULT_VALUE; 188 c->type = PM_QOS_MIN; 189 c->notifiers = n; 190 191 INIT_LIST_HEAD(&qos->flags.list); 192 193 spin_lock_irq(&dev->power.lock); 194 dev->power.qos = qos; 195 spin_unlock_irq(&dev->power.lock); 196 197 return 0; 198 } 199 200 /** 201 * dev_pm_qos_constraints_init - Initalize device's PM QoS constraints pointer. 202 * @dev: target device 203 * 204 * Called from the device PM subsystem during device insertion under 205 * device_pm_lock(). 206 */ 207 void dev_pm_qos_constraints_init(struct device *dev) 208 { 209 mutex_lock(&dev_pm_qos_mtx); 210 dev->power.qos = NULL; 211 dev->power.power_state = PMSG_ON; 212 mutex_unlock(&dev_pm_qos_mtx); 213 } 214 215 /** 216 * dev_pm_qos_constraints_destroy 217 * @dev: target device 218 * 219 * Called from the device PM subsystem on device removal under device_pm_lock(). 220 */ 221 void dev_pm_qos_constraints_destroy(struct device *dev) 222 { 223 struct dev_pm_qos *qos; 224 struct dev_pm_qos_request *req, *tmp; 225 struct pm_qos_constraints *c; 226 struct pm_qos_flags *f; 227 228 /* 229 * If the device's PM QoS resume latency limit or PM QoS flags have been 230 * exposed to user space, they have to be hidden at this point. 231 */ 232 dev_pm_qos_hide_latency_limit(dev); 233 dev_pm_qos_hide_flags(dev); 234 235 mutex_lock(&dev_pm_qos_mtx); 236 237 dev->power.power_state = PMSG_INVALID; 238 qos = dev->power.qos; 239 if (!qos) 240 goto out; 241 242 /* Flush the constraints lists for the device. */ 243 c = &qos->latency; 244 plist_for_each_entry_safe(req, tmp, &c->list, data.pnode) { 245 /* 246 * Update constraints list and call the notification 247 * callbacks if needed 248 */ 249 apply_constraint(req, PM_QOS_REMOVE_REQ, PM_QOS_DEFAULT_VALUE); 250 memset(req, 0, sizeof(*req)); 251 } 252 f = &qos->flags; 253 list_for_each_entry_safe(req, tmp, &f->list, data.flr.node) { 254 apply_constraint(req, PM_QOS_REMOVE_REQ, PM_QOS_DEFAULT_VALUE); 255 memset(req, 0, sizeof(*req)); 256 } 257 258 spin_lock_irq(&dev->power.lock); 259 dev->power.qos = NULL; 260 spin_unlock_irq(&dev->power.lock); 261 262 kfree(c->notifiers); 263 kfree(qos); 264 265 out: 266 mutex_unlock(&dev_pm_qos_mtx); 267 } 268 269 /** 270 * dev_pm_qos_add_request - inserts new qos request into the list 271 * @dev: target device for the constraint 272 * @req: pointer to a preallocated handle 273 * @type: type of the request 274 * @value: defines the qos request 275 * 276 * This function inserts a new entry in the device constraints list of 277 * requested qos performance characteristics. It recomputes the aggregate 278 * QoS expectations of parameters and initializes the dev_pm_qos_request 279 * handle. Caller needs to save this handle for later use in updates and 280 * removal. 281 * 282 * Returns 1 if the aggregated constraint value has changed, 283 * 0 if the aggregated constraint value has not changed, 284 * -EINVAL in case of wrong parameters, -ENOMEM if there's not enough memory 285 * to allocate for data structures, -ENODEV if the device has just been removed 286 * from the system. 287 * 288 * Callers should ensure that the target device is not RPM_SUSPENDED before 289 * using this function for requests of type DEV_PM_QOS_FLAGS. 290 */ 291 int dev_pm_qos_add_request(struct device *dev, struct dev_pm_qos_request *req, 292 enum dev_pm_qos_req_type type, s32 value) 293 { 294 int ret = 0; 295 296 if (!dev || !req) /*guard against callers passing in null */ 297 return -EINVAL; 298 299 if (WARN(dev_pm_qos_request_active(req), 300 "%s() called for already added request\n", __func__)) 301 return -EINVAL; 302 303 req->dev = dev; 304 305 mutex_lock(&dev_pm_qos_mtx); 306 307 if (!dev->power.qos) { 308 if (dev->power.power_state.event == PM_EVENT_INVALID) { 309 /* The device has been removed from the system. */ 310 req->dev = NULL; 311 ret = -ENODEV; 312 goto out; 313 } else { 314 /* 315 * Allocate the constraints data on the first call to 316 * add_request, i.e. only if the data is not already 317 * allocated and if the device has not been removed. 318 */ 319 ret = dev_pm_qos_constraints_allocate(dev); 320 } 321 } 322 323 if (!ret) { 324 req->type = type; 325 ret = apply_constraint(req, PM_QOS_ADD_REQ, value); 326 } 327 328 out: 329 mutex_unlock(&dev_pm_qos_mtx); 330 331 return ret; 332 } 333 EXPORT_SYMBOL_GPL(dev_pm_qos_add_request); 334 335 /** 336 * __dev_pm_qos_update_request - Modify an existing device PM QoS request. 337 * @req : PM QoS request to modify. 338 * @new_value: New value to request. 339 */ 340 static int __dev_pm_qos_update_request(struct dev_pm_qos_request *req, 341 s32 new_value) 342 { 343 s32 curr_value; 344 int ret = 0; 345 346 if (!req->dev->power.qos) 347 return -ENODEV; 348 349 switch(req->type) { 350 case DEV_PM_QOS_LATENCY: 351 curr_value = req->data.pnode.prio; 352 break; 353 case DEV_PM_QOS_FLAGS: 354 curr_value = req->data.flr.flags; 355 break; 356 default: 357 return -EINVAL; 358 } 359 360 if (curr_value != new_value) 361 ret = apply_constraint(req, PM_QOS_UPDATE_REQ, new_value); 362 363 return ret; 364 } 365 366 /** 367 * dev_pm_qos_update_request - modifies an existing qos request 368 * @req : handle to list element holding a dev_pm_qos request to use 369 * @new_value: defines the qos request 370 * 371 * Updates an existing dev PM qos request along with updating the 372 * target value. 373 * 374 * Attempts are made to make this code callable on hot code paths. 375 * 376 * Returns 1 if the aggregated constraint value has changed, 377 * 0 if the aggregated constraint value has not changed, 378 * -EINVAL in case of wrong parameters, -ENODEV if the device has been 379 * removed from the system 380 * 381 * Callers should ensure that the target device is not RPM_SUSPENDED before 382 * using this function for requests of type DEV_PM_QOS_FLAGS. 383 */ 384 int dev_pm_qos_update_request(struct dev_pm_qos_request *req, s32 new_value) 385 { 386 int ret; 387 388 if (!req) /*guard against callers passing in null */ 389 return -EINVAL; 390 391 if (WARN(!dev_pm_qos_request_active(req), 392 "%s() called for unknown object\n", __func__)) 393 return -EINVAL; 394 395 mutex_lock(&dev_pm_qos_mtx); 396 ret = __dev_pm_qos_update_request(req, new_value); 397 mutex_unlock(&dev_pm_qos_mtx); 398 399 return ret; 400 } 401 EXPORT_SYMBOL_GPL(dev_pm_qos_update_request); 402 403 /** 404 * dev_pm_qos_remove_request - modifies an existing qos request 405 * @req: handle to request list element 406 * 407 * Will remove pm qos request from the list of constraints and 408 * recompute the current target value. Call this on slow code paths. 409 * 410 * Returns 1 if the aggregated constraint value has changed, 411 * 0 if the aggregated constraint value has not changed, 412 * -EINVAL in case of wrong parameters, -ENODEV if the device has been 413 * removed from the system 414 * 415 * Callers should ensure that the target device is not RPM_SUSPENDED before 416 * using this function for requests of type DEV_PM_QOS_FLAGS. 417 */ 418 int dev_pm_qos_remove_request(struct dev_pm_qos_request *req) 419 { 420 int ret = 0; 421 422 if (!req) /*guard against callers passing in null */ 423 return -EINVAL; 424 425 if (WARN(!dev_pm_qos_request_active(req), 426 "%s() called for unknown object\n", __func__)) 427 return -EINVAL; 428 429 mutex_lock(&dev_pm_qos_mtx); 430 431 if (req->dev->power.qos) { 432 ret = apply_constraint(req, PM_QOS_REMOVE_REQ, 433 PM_QOS_DEFAULT_VALUE); 434 memset(req, 0, sizeof(*req)); 435 } else { 436 /* Return if the device has been removed */ 437 ret = -ENODEV; 438 } 439 440 mutex_unlock(&dev_pm_qos_mtx); 441 return ret; 442 } 443 EXPORT_SYMBOL_GPL(dev_pm_qos_remove_request); 444 445 /** 446 * dev_pm_qos_add_notifier - sets notification entry for changes to target value 447 * of per-device PM QoS constraints 448 * 449 * @dev: target device for the constraint 450 * @notifier: notifier block managed by caller. 451 * 452 * Will register the notifier into a notification chain that gets called 453 * upon changes to the target value for the device. 454 * 455 * If the device's constraints object doesn't exist when this routine is called, 456 * it will be created (or error code will be returned if that fails). 457 */ 458 int dev_pm_qos_add_notifier(struct device *dev, struct notifier_block *notifier) 459 { 460 int ret = 0; 461 462 mutex_lock(&dev_pm_qos_mtx); 463 464 if (!dev->power.qos) 465 ret = dev->power.power_state.event != PM_EVENT_INVALID ? 466 dev_pm_qos_constraints_allocate(dev) : -ENODEV; 467 468 if (!ret) 469 ret = blocking_notifier_chain_register( 470 dev->power.qos->latency.notifiers, notifier); 471 472 mutex_unlock(&dev_pm_qos_mtx); 473 return ret; 474 } 475 EXPORT_SYMBOL_GPL(dev_pm_qos_add_notifier); 476 477 /** 478 * dev_pm_qos_remove_notifier - deletes notification for changes to target value 479 * of per-device PM QoS constraints 480 * 481 * @dev: target device for the constraint 482 * @notifier: notifier block to be removed. 483 * 484 * Will remove the notifier from the notification chain that gets called 485 * upon changes to the target value. 486 */ 487 int dev_pm_qos_remove_notifier(struct device *dev, 488 struct notifier_block *notifier) 489 { 490 int retval = 0; 491 492 mutex_lock(&dev_pm_qos_mtx); 493 494 /* Silently return if the constraints object is not present. */ 495 if (dev->power.qos) 496 retval = blocking_notifier_chain_unregister( 497 dev->power.qos->latency.notifiers, 498 notifier); 499 500 mutex_unlock(&dev_pm_qos_mtx); 501 return retval; 502 } 503 EXPORT_SYMBOL_GPL(dev_pm_qos_remove_notifier); 504 505 /** 506 * dev_pm_qos_add_global_notifier - sets notification entry for changes to 507 * target value of the PM QoS constraints for any device 508 * 509 * @notifier: notifier block managed by caller. 510 * 511 * Will register the notifier into a notification chain that gets called 512 * upon changes to the target value for any device. 513 */ 514 int dev_pm_qos_add_global_notifier(struct notifier_block *notifier) 515 { 516 return blocking_notifier_chain_register(&dev_pm_notifiers, notifier); 517 } 518 EXPORT_SYMBOL_GPL(dev_pm_qos_add_global_notifier); 519 520 /** 521 * dev_pm_qos_remove_global_notifier - deletes notification for changes to 522 * target value of PM QoS constraints for any device 523 * 524 * @notifier: notifier block to be removed. 525 * 526 * Will remove the notifier from the notification chain that gets called 527 * upon changes to the target value for any device. 528 */ 529 int dev_pm_qos_remove_global_notifier(struct notifier_block *notifier) 530 { 531 return blocking_notifier_chain_unregister(&dev_pm_notifiers, notifier); 532 } 533 EXPORT_SYMBOL_GPL(dev_pm_qos_remove_global_notifier); 534 535 /** 536 * dev_pm_qos_add_ancestor_request - Add PM QoS request for device's ancestor. 537 * @dev: Device whose ancestor to add the request for. 538 * @req: Pointer to the preallocated handle. 539 * @value: Constraint latency value. 540 */ 541 int dev_pm_qos_add_ancestor_request(struct device *dev, 542 struct dev_pm_qos_request *req, s32 value) 543 { 544 struct device *ancestor = dev->parent; 545 int ret = -ENODEV; 546 547 while (ancestor && !ancestor->power.ignore_children) 548 ancestor = ancestor->parent; 549 550 if (ancestor) 551 ret = dev_pm_qos_add_request(ancestor, req, 552 DEV_PM_QOS_LATENCY, value); 553 554 if (ret < 0) 555 req->dev = NULL; 556 557 return ret; 558 } 559 EXPORT_SYMBOL_GPL(dev_pm_qos_add_ancestor_request); 560 561 #ifdef CONFIG_PM_RUNTIME 562 static void __dev_pm_qos_drop_user_request(struct device *dev, 563 enum dev_pm_qos_req_type type) 564 { 565 switch(type) { 566 case DEV_PM_QOS_LATENCY: 567 dev_pm_qos_remove_request(dev->power.qos->latency_req); 568 dev->power.qos->latency_req = NULL; 569 break; 570 case DEV_PM_QOS_FLAGS: 571 dev_pm_qos_remove_request(dev->power.qos->flags_req); 572 dev->power.qos->flags_req = NULL; 573 break; 574 } 575 } 576 577 /** 578 * dev_pm_qos_expose_latency_limit - Expose PM QoS latency limit to user space. 579 * @dev: Device whose PM QoS latency limit is to be exposed to user space. 580 * @value: Initial value of the latency limit. 581 */ 582 int dev_pm_qos_expose_latency_limit(struct device *dev, s32 value) 583 { 584 struct dev_pm_qos_request *req; 585 int ret; 586 587 if (!device_is_registered(dev) || value < 0) 588 return -EINVAL; 589 590 if (dev->power.qos && dev->power.qos->latency_req) 591 return -EEXIST; 592 593 req = kzalloc(sizeof(*req), GFP_KERNEL); 594 if (!req) 595 return -ENOMEM; 596 597 ret = dev_pm_qos_add_request(dev, req, DEV_PM_QOS_LATENCY, value); 598 if (ret < 0) 599 return ret; 600 601 dev->power.qos->latency_req = req; 602 ret = pm_qos_sysfs_add_latency(dev); 603 if (ret) 604 __dev_pm_qos_drop_user_request(dev, DEV_PM_QOS_LATENCY); 605 606 return ret; 607 } 608 EXPORT_SYMBOL_GPL(dev_pm_qos_expose_latency_limit); 609 610 /** 611 * dev_pm_qos_hide_latency_limit - Hide PM QoS latency limit from user space. 612 * @dev: Device whose PM QoS latency limit is to be hidden from user space. 613 */ 614 void dev_pm_qos_hide_latency_limit(struct device *dev) 615 { 616 if (dev->power.qos && dev->power.qos->latency_req) { 617 pm_qos_sysfs_remove_latency(dev); 618 __dev_pm_qos_drop_user_request(dev, DEV_PM_QOS_LATENCY); 619 } 620 } 621 EXPORT_SYMBOL_GPL(dev_pm_qos_hide_latency_limit); 622 623 /** 624 * dev_pm_qos_expose_flags - Expose PM QoS flags of a device to user space. 625 * @dev: Device whose PM QoS flags are to be exposed to user space. 626 * @val: Initial values of the flags. 627 */ 628 int dev_pm_qos_expose_flags(struct device *dev, s32 val) 629 { 630 struct dev_pm_qos_request *req; 631 int ret; 632 633 if (!device_is_registered(dev)) 634 return -EINVAL; 635 636 if (dev->power.qos && dev->power.qos->flags_req) 637 return -EEXIST; 638 639 req = kzalloc(sizeof(*req), GFP_KERNEL); 640 if (!req) 641 return -ENOMEM; 642 643 pm_runtime_get_sync(dev); 644 ret = dev_pm_qos_add_request(dev, req, DEV_PM_QOS_FLAGS, val); 645 if (ret < 0) 646 goto fail; 647 648 dev->power.qos->flags_req = req; 649 ret = pm_qos_sysfs_add_flags(dev); 650 if (ret) 651 __dev_pm_qos_drop_user_request(dev, DEV_PM_QOS_FLAGS); 652 653 fail: 654 pm_runtime_put(dev); 655 return ret; 656 } 657 EXPORT_SYMBOL_GPL(dev_pm_qos_expose_flags); 658 659 /** 660 * dev_pm_qos_hide_flags - Hide PM QoS flags of a device from user space. 661 * @dev: Device whose PM QoS flags are to be hidden from user space. 662 */ 663 void dev_pm_qos_hide_flags(struct device *dev) 664 { 665 if (dev->power.qos && dev->power.qos->flags_req) { 666 pm_qos_sysfs_remove_flags(dev); 667 pm_runtime_get_sync(dev); 668 __dev_pm_qos_drop_user_request(dev, DEV_PM_QOS_FLAGS); 669 pm_runtime_put(dev); 670 } 671 } 672 EXPORT_SYMBOL_GPL(dev_pm_qos_hide_flags); 673 674 /** 675 * dev_pm_qos_update_flags - Update PM QoS flags request owned by user space. 676 * @dev: Device to update the PM QoS flags request for. 677 * @mask: Flags to set/clear. 678 * @set: Whether to set or clear the flags (true means set). 679 */ 680 int dev_pm_qos_update_flags(struct device *dev, s32 mask, bool set) 681 { 682 s32 value; 683 int ret; 684 685 if (!dev->power.qos || !dev->power.qos->flags_req) 686 return -EINVAL; 687 688 pm_runtime_get_sync(dev); 689 mutex_lock(&dev_pm_qos_mtx); 690 691 value = dev_pm_qos_requested_flags(dev); 692 if (set) 693 value |= mask; 694 else 695 value &= ~mask; 696 697 ret = __dev_pm_qos_update_request(dev->power.qos->flags_req, value); 698 699 mutex_unlock(&dev_pm_qos_mtx); 700 pm_runtime_put(dev); 701 702 return ret; 703 } 704 #endif /* CONFIG_PM_RUNTIME */ 705