• Home
  • Raw
  • Download

Lines Matching +full:space +full:- +full:constraint

1 // SPDX-License-Identifier: GPL-2.0
7 * This module exposes the interface to kernel space for specifying
8 * per-device PM QoS dependencies. It provides infrastructure for registration
16 * Watchers can register a per-device notification callback using the
18 * per-device constraint data struct.
20 * Note about the per-device constraint data struct allocation:
21 * . The per-device constraints data struct ptr is stored into the device
23 * . To minimize the data usage by the per-device constraints, the data struct
46 * __dev_pm_qos_flags - Check PM QoS flags for a given device.
50 * This routine must be called with dev->power.lock held.
54 struct dev_pm_qos *qos = dev->power.qos; in __dev_pm_qos_flags()
58 lockdep_assert_held(&dev->power.lock); in __dev_pm_qos_flags()
63 pqf = &qos->flags; in __dev_pm_qos_flags()
64 if (list_empty(&pqf->list)) in __dev_pm_qos_flags()
67 val = pqf->effective_flags & mask; in __dev_pm_qos_flags()
75 * dev_pm_qos_flags - Check PM QoS flags for a given device (locked).
84 spin_lock_irqsave(&dev->power.lock, irqflags); in dev_pm_qos_flags()
86 spin_unlock_irqrestore(&dev->power.lock, irqflags); in dev_pm_qos_flags()
93 * __dev_pm_qos_resume_latency - Get resume latency constraint for a given device.
94 * @dev: Device to get the PM QoS constraint value for.
96 * This routine must be called with dev->power.lock held.
100 lockdep_assert_held(&dev->power.lock); in __dev_pm_qos_resume_latency()
106 * dev_pm_qos_read_value - Get PM QoS constraint for a given device (locked).
107 * @dev: Device to get the PM QoS constraint value for.
112 struct dev_pm_qos *qos = dev->power.qos; in dev_pm_qos_read_value()
116 spin_lock_irqsave(&dev->power.lock, flags); in dev_pm_qos_read_value()
121 : pm_qos_read_value(&qos->resume_latency); in dev_pm_qos_read_value()
125 : freq_qos_read_value(&qos->freq, FREQ_QOS_MIN); in dev_pm_qos_read_value()
129 : freq_qos_read_value(&qos->freq, FREQ_QOS_MAX); in dev_pm_qos_read_value()
136 spin_unlock_irqrestore(&dev->power.lock, flags); in dev_pm_qos_read_value()
142 * apply_constraint - Add/modify/remove device PM QoS request.
143 * @req: Constraint request to apply
148 * code and if needed call the per-device callbacks.
153 struct dev_pm_qos *qos = req->dev->power.qos; in apply_constraint()
156 switch(req->type) { in apply_constraint()
161 ret = pm_qos_update_target(&qos->resume_latency, in apply_constraint()
162 &req->data.pnode, action, value); in apply_constraint()
165 ret = pm_qos_update_target(&qos->latency_tolerance, in apply_constraint()
166 &req->data.pnode, action, value); in apply_constraint()
168 value = pm_qos_read_value(&qos->latency_tolerance); in apply_constraint()
169 req->dev->power.set_latency_tolerance(req->dev, value); in apply_constraint()
174 ret = freq_qos_apply(&req->data.freq, action, value); in apply_constraint()
177 ret = pm_qos_update_flags(&qos->flags, &req->data.flr, in apply_constraint()
181 ret = -EINVAL; in apply_constraint()
191 * Called at the first call to add_request, for constraint data allocation
202 return -ENOMEM; in dev_pm_qos_constraints_allocate()
207 return -ENOMEM; in dev_pm_qos_constraints_allocate()
210 c = &qos->resume_latency; in dev_pm_qos_constraints_allocate()
211 plist_head_init(&c->list); in dev_pm_qos_constraints_allocate()
212 c->target_value = PM_QOS_RESUME_LATENCY_DEFAULT_VALUE; in dev_pm_qos_constraints_allocate()
213 c->default_value = PM_QOS_RESUME_LATENCY_DEFAULT_VALUE; in dev_pm_qos_constraints_allocate()
214 c->no_constraint_value = PM_QOS_RESUME_LATENCY_NO_CONSTRAINT; in dev_pm_qos_constraints_allocate()
215 c->type = PM_QOS_MIN; in dev_pm_qos_constraints_allocate()
216 c->notifiers = n; in dev_pm_qos_constraints_allocate()
219 c = &qos->latency_tolerance; in dev_pm_qos_constraints_allocate()
220 plist_head_init(&c->list); in dev_pm_qos_constraints_allocate()
221 c->target_value = PM_QOS_LATENCY_TOLERANCE_DEFAULT_VALUE; in dev_pm_qos_constraints_allocate()
222 c->default_value = PM_QOS_LATENCY_TOLERANCE_DEFAULT_VALUE; in dev_pm_qos_constraints_allocate()
223 c->no_constraint_value = PM_QOS_LATENCY_TOLERANCE_NO_CONSTRAINT; in dev_pm_qos_constraints_allocate()
224 c->type = PM_QOS_MIN; in dev_pm_qos_constraints_allocate()
226 freq_constraints_init(&qos->freq); in dev_pm_qos_constraints_allocate()
228 INIT_LIST_HEAD(&qos->flags.list); in dev_pm_qos_constraints_allocate()
230 spin_lock_irq(&dev->power.lock); in dev_pm_qos_constraints_allocate()
231 dev->power.qos = qos; in dev_pm_qos_constraints_allocate()
232 spin_unlock_irq(&dev->power.lock); in dev_pm_qos_constraints_allocate()
257 * exposed to user space, they have to be hidden at this point. in dev_pm_qos_constraints_destroy()
267 qos = dev->power.qos; in dev_pm_qos_constraints_destroy()
272 c = &qos->resume_latency; in dev_pm_qos_constraints_destroy()
273 plist_for_each_entry_safe(req, tmp, &c->list, data.pnode) { in dev_pm_qos_constraints_destroy()
282 c = &qos->latency_tolerance; in dev_pm_qos_constraints_destroy()
283 plist_for_each_entry_safe(req, tmp, &c->list, data.pnode) { in dev_pm_qos_constraints_destroy()
288 c = &qos->freq.min_freq; in dev_pm_qos_constraints_destroy()
289 plist_for_each_entry_safe(req, tmp, &c->list, data.freq.pnode) { in dev_pm_qos_constraints_destroy()
295 c = &qos->freq.max_freq; in dev_pm_qos_constraints_destroy()
296 plist_for_each_entry_safe(req, tmp, &c->list, data.freq.pnode) { in dev_pm_qos_constraints_destroy()
302 f = &qos->flags; in dev_pm_qos_constraints_destroy()
303 list_for_each_entry_safe(req, tmp, &f->list, data.flr.node) { in dev_pm_qos_constraints_destroy()
308 spin_lock_irq(&dev->power.lock); in dev_pm_qos_constraints_destroy()
309 dev->power.qos = ERR_PTR(-ENODEV); in dev_pm_qos_constraints_destroy()
310 spin_unlock_irq(&dev->power.lock); in dev_pm_qos_constraints_destroy()
312 kfree(qos->resume_latency.notifiers); in dev_pm_qos_constraints_destroy()
325 !dev->power.set_latency_tolerance; in dev_pm_qos_invalid_req_type()
335 return -EINVAL; in __dev_pm_qos_add_request()
339 return -EINVAL; in __dev_pm_qos_add_request()
341 if (IS_ERR(dev->power.qos)) in __dev_pm_qos_add_request()
342 ret = -ENODEV; in __dev_pm_qos_add_request()
343 else if (!dev->power.qos) in __dev_pm_qos_add_request()
350 req->dev = dev; in __dev_pm_qos_add_request()
351 req->type = type; in __dev_pm_qos_add_request()
352 if (req->type == DEV_PM_QOS_MIN_FREQUENCY) in __dev_pm_qos_add_request()
353 ret = freq_qos_add_request(&dev->power.qos->freq, in __dev_pm_qos_add_request()
354 &req->data.freq, in __dev_pm_qos_add_request()
356 else if (req->type == DEV_PM_QOS_MAX_FREQUENCY) in __dev_pm_qos_add_request()
357 ret = freq_qos_add_request(&dev->power.qos->freq, in __dev_pm_qos_add_request()
358 &req->data.freq, in __dev_pm_qos_add_request()
367 * dev_pm_qos_add_request - inserts new qos request into the list
368 * @dev: target device for the constraint
379 * Returns 1 if the aggregated constraint value has changed,
380 * 0 if the aggregated constraint value has not changed,
381 * -EINVAL in case of wrong parameters, -ENOMEM if there's not enough memory
382 * to allocate for data structures, -ENODEV if the device has just been removed
401 * __dev_pm_qos_update_request - Modify an existing device PM QoS request.
412 return -EINVAL; in __dev_pm_qos_update_request()
416 return -EINVAL; in __dev_pm_qos_update_request()
418 if (IS_ERR_OR_NULL(req->dev->power.qos)) in __dev_pm_qos_update_request()
419 return -ENODEV; in __dev_pm_qos_update_request()
421 switch(req->type) { in __dev_pm_qos_update_request()
424 curr_value = req->data.pnode.prio; in __dev_pm_qos_update_request()
428 curr_value = req->data.freq.pnode.prio; in __dev_pm_qos_update_request()
431 curr_value = req->data.flr.flags; in __dev_pm_qos_update_request()
434 return -EINVAL; in __dev_pm_qos_update_request()
437 trace_dev_pm_qos_update_request(dev_name(req->dev), req->type, in __dev_pm_qos_update_request()
446 * dev_pm_qos_update_request - modifies an existing qos request
455 * Returns 1 if the aggregated constraint value has changed,
456 * 0 if the aggregated constraint value has not changed,
457 * -EINVAL in case of wrong parameters, -ENODEV if the device has been
479 return -EINVAL; in __dev_pm_qos_remove_request()
483 return -EINVAL; in __dev_pm_qos_remove_request()
485 if (IS_ERR_OR_NULL(req->dev->power.qos)) in __dev_pm_qos_remove_request()
486 return -ENODEV; in __dev_pm_qos_remove_request()
488 trace_dev_pm_qos_remove_request(dev_name(req->dev), req->type, in __dev_pm_qos_remove_request()
496 * dev_pm_qos_remove_request - modifies an existing qos request
502 * Returns 1 if the aggregated constraint value has changed,
503 * 0 if the aggregated constraint value has not changed,
504 * -EINVAL in case of wrong parameters, -ENODEV if the device has been
522 * dev_pm_qos_add_notifier - sets notification entry for changes to target value
523 * of per-device PM QoS constraints
525 * @dev: target device for the constraint
542 if (IS_ERR(dev->power.qos)) in dev_pm_qos_add_notifier()
543 ret = -ENODEV; in dev_pm_qos_add_notifier()
544 else if (!dev->power.qos) in dev_pm_qos_add_notifier()
552 ret = blocking_notifier_chain_register(dev->power.qos->resume_latency.notifiers, in dev_pm_qos_add_notifier()
556 ret = freq_qos_add_notifier(&dev->power.qos->freq, in dev_pm_qos_add_notifier()
560 ret = freq_qos_add_notifier(&dev->power.qos->freq, in dev_pm_qos_add_notifier()
565 ret = -EINVAL; in dev_pm_qos_add_notifier()
575 * dev_pm_qos_remove_notifier - deletes notification for changes to target value
576 * of per-device PM QoS constraints
578 * @dev: target device for the constraint
594 if (IS_ERR_OR_NULL(dev->power.qos)) in dev_pm_qos_remove_notifier()
599 ret = blocking_notifier_chain_unregister(dev->power.qos->resume_latency.notifiers, in dev_pm_qos_remove_notifier()
603 ret = freq_qos_remove_notifier(&dev->power.qos->freq, in dev_pm_qos_remove_notifier()
607 ret = freq_qos_remove_notifier(&dev->power.qos->freq, in dev_pm_qos_remove_notifier()
612 ret = -EINVAL; in dev_pm_qos_remove_notifier()
622 * dev_pm_qos_add_ancestor_request - Add PM QoS request for device's ancestor.
626 * @value: Constraint latency value.
632 struct device *ancestor = dev->parent; in dev_pm_qos_add_ancestor_request()
633 int ret = -ENODEV; in dev_pm_qos_add_ancestor_request()
637 while (ancestor && !ancestor->power.ignore_children) in dev_pm_qos_add_ancestor_request()
638 ancestor = ancestor->parent; in dev_pm_qos_add_ancestor_request()
642 while (ancestor && !ancestor->power.set_latency_tolerance) in dev_pm_qos_add_ancestor_request()
643 ancestor = ancestor->parent; in dev_pm_qos_add_ancestor_request()
653 req->dev = NULL; in dev_pm_qos_add_ancestor_request()
666 req = dev->power.qos->resume_latency_req; in __dev_pm_qos_drop_user_request()
667 dev->power.qos->resume_latency_req = NULL; in __dev_pm_qos_drop_user_request()
670 req = dev->power.qos->latency_tolerance_req; in __dev_pm_qos_drop_user_request()
671 dev->power.qos->latency_tolerance_req = NULL; in __dev_pm_qos_drop_user_request()
674 req = dev->power.qos->flags_req; in __dev_pm_qos_drop_user_request()
675 dev->power.qos->flags_req = NULL; in __dev_pm_qos_drop_user_request()
694 * dev_pm_qos_expose_latency_limit - Expose PM QoS latency limit to user space.
695 * @dev: Device whose PM QoS latency limit is to be exposed to user space.
704 return -EINVAL; in dev_pm_qos_expose_latency_limit()
708 return -ENOMEM; in dev_pm_qos_expose_latency_limit()
720 if (IS_ERR_OR_NULL(dev->power.qos)) in dev_pm_qos_expose_latency_limit()
721 ret = -ENODEV; in dev_pm_qos_expose_latency_limit()
722 else if (dev->power.qos->resume_latency_req) in dev_pm_qos_expose_latency_limit()
723 ret = -EEXIST; in dev_pm_qos_expose_latency_limit()
731 dev->power.qos->resume_latency_req = req; in dev_pm_qos_expose_latency_limit()
747 if (!IS_ERR_OR_NULL(dev->power.qos) && dev->power.qos->resume_latency_req) in __dev_pm_qos_hide_latency_limit()
752 * dev_pm_qos_hide_latency_limit - Hide PM QoS latency limit from user space.
753 * @dev: Device whose PM QoS latency limit is to be hidden from user space.
770 * dev_pm_qos_expose_flags - Expose PM QoS flags of a device to user space.
771 * @dev: Device whose PM QoS flags are to be exposed to user space.
780 return -EINVAL; in dev_pm_qos_expose_flags()
784 return -ENOMEM; in dev_pm_qos_expose_flags()
797 if (IS_ERR_OR_NULL(dev->power.qos)) in dev_pm_qos_expose_flags()
798 ret = -ENODEV; in dev_pm_qos_expose_flags()
799 else if (dev->power.qos->flags_req) in dev_pm_qos_expose_flags()
800 ret = -EEXIST; in dev_pm_qos_expose_flags()
808 dev->power.qos->flags_req = req; in dev_pm_qos_expose_flags()
825 if (!IS_ERR_OR_NULL(dev->power.qos) && dev->power.qos->flags_req) in __dev_pm_qos_hide_flags()
830 * dev_pm_qos_hide_flags - Hide PM QoS flags of a device from user space.
831 * @dev: Device whose PM QoS flags are to be hidden from user space.
850 * dev_pm_qos_update_flags - Update PM QoS flags request owned by user space.
863 if (IS_ERR_OR_NULL(dev->power.qos) || !dev->power.qos->flags_req) { in dev_pm_qos_update_flags()
864 ret = -EINVAL; in dev_pm_qos_update_flags()
874 ret = __dev_pm_qos_update_request(dev->power.qos->flags_req, value); in dev_pm_qos_update_flags()
883 * dev_pm_qos_get_user_latency_tolerance - Get user space latency tolerance.
884 * @dev: Device to obtain the user space latency tolerance for.
891 ret = IS_ERR_OR_NULL(dev->power.qos) in dev_pm_qos_get_user_latency_tolerance()
892 || !dev->power.qos->latency_tolerance_req ? in dev_pm_qos_get_user_latency_tolerance()
894 dev->power.qos->latency_tolerance_req->data.pnode.prio; in dev_pm_qos_get_user_latency_tolerance()
900 * dev_pm_qos_update_user_latency_tolerance - Update user space latency tolerance.
901 * @dev: Device to update the user space latency tolerance for.
902 * @val: New user space latency tolerance for @dev (negative values disable).
910 if (IS_ERR_OR_NULL(dev->power.qos) in dev_pm_qos_update_user_latency_tolerance()
911 || !dev->power.qos->latency_tolerance_req) { in dev_pm_qos_update_user_latency_tolerance()
918 ret = -EINVAL; in dev_pm_qos_update_user_latency_tolerance()
923 ret = -ENOMEM; in dev_pm_qos_update_user_latency_tolerance()
931 dev->power.qos->latency_tolerance_req = req; in dev_pm_qos_update_user_latency_tolerance()
937 ret = __dev_pm_qos_update_request(dev->power.qos->latency_tolerance_req, val); in dev_pm_qos_update_user_latency_tolerance()
948 * dev_pm_qos_expose_latency_tolerance - Expose latency tolerance to userspace
955 if (!dev->power.set_latency_tolerance) in dev_pm_qos_expose_latency_tolerance()
956 return -EINVAL; in dev_pm_qos_expose_latency_tolerance()
967 * dev_pm_qos_hide_latency_tolerance - Hide latency tolerance from userspace
976 /* Remove the request from user space now */ in dev_pm_qos_hide_latency_tolerance()