^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) ===============================
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) PM Quality Of Service Interface
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) ===============================
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) This interface provides a kernel and user mode interface for registering
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) performance expectations by drivers, subsystems and user space applications on
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) one of the parameters.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) Two different PM QoS frameworks are available:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) * CPU latency QoS.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) * The per-device PM QoS framework provides the API to manage the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) per-device latency constraints and PM QoS flags.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) The latency unit used in the PM QoS framework is the microsecond (usec).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) 1. PM QoS framework
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) ===================
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) A global list of CPU latency QoS requests is maintained along with an aggregated
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) (effective) target value. The aggregated target value is updated with changes
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) to the request list or elements of the list. For CPU latency QoS, the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) aggregated target value is simply the min of the request values held in the list
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) elements.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) Note: the aggregated target value is implemented as an atomic variable so that
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) reading the aggregated value does not require any locking mechanism.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) From kernel space the use of this interface is simple:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) void cpu_latency_qos_add_request(handle, target_value):
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) Will insert an element into the CPU latency QoS list with the target value.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) Upon change to this list the new target is recomputed and any registered
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) notifiers are called only if the target value is now different.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) Clients of PM QoS need to save the returned handle for future use in other
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) PM QoS API functions.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) void cpu_latency_qos_update_request(handle, new_target_value):
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) Will update the list element pointed to by the handle with the new target
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) value and recompute the new aggregated target, calling the notification tree
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) if the target is changed.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) void cpu_latency_qos_remove_request(handle):
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) Will remove the element. After removal it will update the aggregate target
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) and call the notification tree if the target was changed as a result of
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) removing the request.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) int cpu_latency_qos_limit():
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) Returns the aggregated value for the CPU latency QoS.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) int cpu_latency_qos_request_active(handle):
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) Returns if the request is still active, i.e. it has not been removed from the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) CPU latency QoS list.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) int cpu_latency_qos_add_notifier(notifier):
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) Adds a notification callback function to the CPU latency QoS. The callback is
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) called when the aggregated value for the CPU latency QoS is changed.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) int cpu_latency_qos_remove_notifier(notifier):
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) Removes the notification callback function from the CPU latency QoS.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) From user space:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) The infrastructure exposes one device node, /dev/cpu_dma_latency, for the CPU
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) latency QoS.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) Only processes can register a PM QoS request. To provide for automatic
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) cleanup of a process, the interface requires the process to register its
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) parameter requests as follows.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) To register the default PM QoS target for the CPU latency QoS, the process must
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) open /dev/cpu_dma_latency.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) As long as the device node is held open that process has a registered
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) request on the parameter.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) To change the requested target value, the process needs to write an s32 value to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) the open device node. Alternatively, it can write a hex string for the value
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) using the 10 char long format e.g. "0x12345678". This translates to a
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) cpu_latency_qos_update_request() call.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) To remove the user mode request for a target value simply close the device
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) node.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) 2. PM QoS per-device latency and flags framework
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) ================================================
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) For each device, there are three lists of PM QoS requests. Two of them are
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) maintained along with the aggregated targets of resume latency and active
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) state latency tolerance (in microseconds) and the third one is for PM QoS flags.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) Values are updated in response to changes of the request list.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) The target values of resume latency and active state latency tolerance are
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) simply the minimum of the request values held in the parameter list elements.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) The PM QoS flags aggregate value is a gather (bitwise OR) of all list elements'
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) values. One device PM QoS flag is defined currently: PM_QOS_FLAG_NO_POWER_OFF.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) Note: The aggregated target values are implemented in such a way that reading
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) the aggregated value does not require any locking mechanism.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) From kernel mode the use of this interface is the following:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) int dev_pm_qos_add_request(device, handle, type, value):
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) Will insert an element into the list for that identified device with the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) target value. Upon change to this list the new target is recomputed and any
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) registered notifiers are called only if the target value is now different.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) Clients of dev_pm_qos need to save the handle for future use in other
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) dev_pm_qos API functions.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) int dev_pm_qos_update_request(handle, new_value):
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) Will update the list element pointed to by the handle with the new target
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) value and recompute the new aggregated target, calling the notification
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) trees if the target is changed.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) int dev_pm_qos_remove_request(handle):
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) Will remove the element. After removal it will update the aggregate target
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) and call the notification trees if the target was changed as a result of
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) removing the request.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) s32 dev_pm_qos_read_value(device, type):
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) Returns the aggregated value for a given device's constraints list.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) enum pm_qos_flags_status dev_pm_qos_flags(device, mask)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) Check PM QoS flags of the given device against the given mask of flags.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) The meaning of the return values is as follows:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) PM_QOS_FLAGS_ALL:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) All flags from the mask are set
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) PM_QOS_FLAGS_SOME:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) Some flags from the mask are set
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) PM_QOS_FLAGS_NONE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) No flags from the mask are set
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) PM_QOS_FLAGS_UNDEFINED:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) The device's PM QoS structure has not been initialized
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) or the list of requests is empty.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) int dev_pm_qos_add_ancestor_request(dev, handle, type, value)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) Add a PM QoS request for the first direct ancestor of the given device whose
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) power.ignore_children flag is unset (for DEV_PM_QOS_RESUME_LATENCY requests)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) or whose power.set_latency_tolerance callback pointer is not NULL (for
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) DEV_PM_QOS_LATENCY_TOLERANCE requests).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) int dev_pm_qos_expose_latency_limit(device, value)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) Add a request to the device's PM QoS list of resume latency constraints and
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) create a sysfs attribute pm_qos_resume_latency_us under the device's power
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) directory allowing user space to manipulate that request.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) void dev_pm_qos_hide_latency_limit(device)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) Drop the request added by dev_pm_qos_expose_latency_limit() from the device's
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) PM QoS list of resume latency constraints and remove sysfs attribute
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) pm_qos_resume_latency_us from the device's power directory.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) int dev_pm_qos_expose_flags(device, value)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) Add a request to the device's PM QoS list of flags and create sysfs attribute
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) pm_qos_no_power_off under the device's power directory allowing user space to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) change the value of the PM_QOS_FLAG_NO_POWER_OFF flag.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) void dev_pm_qos_hide_flags(device)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) Drop the request added by dev_pm_qos_expose_flags() from the device's PM QoS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) list of flags and remove sysfs attribute pm_qos_no_power_off from the device's
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) power directory.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) Notification mechanisms:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) The per-device PM QoS framework has a per-device notification tree.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) int dev_pm_qos_add_notifier(device, notifier, type):
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) Adds a notification callback function for the device for a particular request
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) type.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) The callback is called when the aggregated value of the device constraints
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) list is changed.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) int dev_pm_qos_remove_notifier(device, notifier, type):
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) Removes the notification callback function for the device.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) Active state latency tolerance
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) This device PM QoS type is used to support systems in which hardware may switch
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) to energy-saving operation modes on the fly. In those systems, if the operation
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) mode chosen by the hardware attempts to save energy in an overly aggressive way,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) it may cause excess latencies to be visible to software, causing it to miss
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) certain protocol requirements or target frame or sample rates etc.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) If there is a latency tolerance control mechanism for a given device available
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) to software, the .set_latency_tolerance callback in that device's dev_pm_info
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) structure should be populated. The routine pointed to by it is should implement
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) whatever is necessary to transfer the effective requirement value to the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) hardware.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) Whenever the effective latency tolerance changes for the device, its
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) .set_latency_tolerance() callback will be executed and the effective value will
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) be passed to it. If that value is negative, which means that the list of
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) latency tolerance requirements for the device is empty, the callback is expected
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) to switch the underlying hardware latency tolerance control mechanism to an
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) autonomous mode if available. If that value is PM_QOS_LATENCY_ANY, in turn, and
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) the hardware supports a special "no requirement" setting, the callback is
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) expected to use it. That allows software to prevent the hardware from
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) automatically updating the device's latency tolerance in response to its power
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) state changes (e.g. during transitions from D3cold to D0), which generally may
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) be done in the autonomous latency tolerance control mode.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) If .set_latency_tolerance() is present for the device, sysfs attribute
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) pm_qos_latency_tolerance_us will be present in the devivce's power directory.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) Then, user space can use that attribute to specify its latency tolerance
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) requirement for the device, if any. Writing "any" to it means "no requirement,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) but do not let the hardware control latency tolerance" and writing "auto" to it
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) allows the hardware to be switched to the autonomous mode if there are no other
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) requirements from the kernel side in the device's list.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) Kernel code can use the functions described above along with the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) DEV_PM_QOS_LATENCY_TOLERANCE device PM QoS type to add, remove and update
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) latency tolerance requirements for devices.