123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149 |
- PM Quality Of Service Interface.
- This interface provides a kernel and user mode interface for registering
- performance expectations by drivers, subsystems and user space applications on
- one of the parameters.
- Two different PM QoS frameworks are available:
- 1. PM QoS classes for cpu_dma_latency, network_latency, network_throughput.
- 2. the per-device PM QoS framework provides the API to manage the per-device latency
- constraints.
- Each parameters have defined units:
- * latency: usec
- * timeout: usec
- * throughput: kbs (kilo bit / sec)
- 1. PM QoS framework
- The infrastructure exposes multiple misc device nodes one per implemented
- parameter. The set of parameters implement is defined by pm_qos_power_init()
- and pm_qos.h. This is done because having the available parameters
- being runtime configurable or changeable from a driver was seen as too easy to
- abuse.
- For each parameter a list of performance requests is maintained along with
- an aggregated target value. The aggregated target value is updated with
- changes to the request list or elements of the list. Typically the
- aggregated target value is simply the max or min of the request values held
- in the parameter list elements.
- Note: the aggregated target value is implemented as an atomic variable so that
- reading the aggregated value does not require any locking mechanism.
- From kernel mode the use of this interface is simple:
- void pm_qos_add_request(handle, param_class, target_value):
- Will insert an element into the list for that identified PM QoS class with the
- target value. Upon change to this list the new target is recomputed and any
- registered notifiers are called only if the target value is now different.
- Clients of pm_qos need to save the returned handle for future use in other
- pm_qos API functions.
- void pm_qos_update_request(handle, new_target_value):
- Will update the list element pointed to by the handle with the new target value
- and recompute the new aggregated target, calling the notification tree if the
- target is changed.
- void pm_qos_remove_request(handle):
- Will remove the element. After removal it will update the aggregate target and
- call the notification tree if the target was changed as a result of removing
- the request.
- int pm_qos_request(param_class):
- Returns the aggregated value for a given PM QoS class.
- int pm_qos_request_active(handle):
- Returns if the request is still active, i.e. it has not been removed from a
- PM QoS class constraints list.
- int pm_qos_add_notifier(param_class, notifier):
- Adds a notification callback function to the PM QoS class. The callback is
- called when the aggregated value for the PM QoS class is changed.
- int pm_qos_remove_notifier(int param_class, notifier):
- Removes the notification callback function for the PM QoS class.
- From user mode:
- Only processes can register a pm_qos request. To provide for automatic
- cleanup of a process, the interface requires the process to register its
- parameter requests in the following way:
- To register the default pm_qos target for the specific parameter, the process
- must open one of /dev/[cpu_dma_latency, network_latency, network_throughput]
- As long as the device node is held open that process has a registered
- request on the parameter.
- To change the requested target value the process needs to write an s32 value to
- the open device node. Alternatively the user mode program could write a hex
- string for the value using 10 char long format e.g. "0x12345678". This
- translates to a pm_qos_update_request call.
- To remove the user mode request for a target value simply close the device
- node.
- 2. PM QoS per-device latency framework
- For each device a list of performance requests is maintained along with
- an aggregated target value. The aggregated target value is updated with
- changes to the request list or elements of the list. Typically the
- aggregated target value is simply the max or min of the request values held
- in the parameter list elements.
- Note: the aggregated target value is implemented as an atomic variable so that
- reading the aggregated value does not require any locking mechanism.
- From kernel mode the use of this interface is the following:
- int dev_pm_qos_add_request(device, handle, type, value):
- Will insert an element into the list for that identified device with the
- target value. Upon change to this list the new target is recomputed and any
- registered notifiers are called only if the target value is now different.
- Clients of dev_pm_qos need to save the handle for future use in other
- dev_pm_qos API functions.
- int dev_pm_qos_update_request(handle, new_value):
- Will update the list element pointed to by the handle with the new target value
- and recompute the new aggregated target, calling the notification trees if the
- target is changed.
- int dev_pm_qos_remove_request(handle):
- Will remove the element. After removal it will update the aggregate target and
- call the notification trees if the target was changed as a result of removing
- the request.
- s32 dev_pm_qos_read_value(device):
- Returns the aggregated value for a given device's constraints list.
- Notification mechanisms:
- The per-device PM QoS framework has 2 different and distinct notification trees:
- a per-device notification tree and a global notification tree.
- int dev_pm_qos_add_notifier(device, notifier):
- Adds a notification callback function for the device.
- The callback is called when the aggregated value of the device constraints list
- is changed.
- int dev_pm_qos_remove_notifier(device, notifier):
- Removes the notification callback function for the device.
- int dev_pm_qos_add_global_notifier(notifier):
- Adds a notification callback function in the global notification tree of the
- framework.
- The callback is called when the aggregated value for any device is changed.
- int dev_pm_qos_remove_global_notifier(notifier):
- Removes the notification callback function from the global notification tree
- of the framework.
- From user mode:
- No API for user space access to the per-device latency constraints is provided
- yet - still under discussion.
|