Orange Pi5 kernel

Deprecated Linux kernel 5.10.110 for OrangePi 5/5B/5+ boards

3 Commits   0 Branches   0 Tags
^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.