cpufreq/cpufreq_intellidemand: intellidemand cpufreq governor (version 4.0)

Intellidemand is inspired by ondemand governor. Its main features are:

 - auto cpu hotplugging based on runnable thread average calculations
 - detection of browsing mode (long screen on activities with moderate run
   queue depth =< 45 )
 - limit max frequencies when in browsing mode to conserve battery for long
   duration tasks

Browsing State Determination:
 1- Browsing state is enabled as power-on default. Browsing state is disabled
    when run queue depth is > 45 (very high instantaneous spikes)

Browsing State Limit Max Freq Logic (sliding window algorithm):
 1- While Screen is ON > 3 min, and average load of the CPU is < 35%, then
    CPU Max frequencies will remain power-on default
 2- While Screen is On, if average CPU load > 35%, both CPUs max frequencies
    will be limited to a lower user configurable max value
 3- While Screen is On, After both CPUs' Max is limited to lowered max, when
    the average CPU load has dropped down to less than < 25%, then both CPUs
    Max freq will be restored to back to power-on default

Runnable Thread Auto-hotplug (fast hotplug / slow unplug algorithm):
 1- When average number of running thread is < threshold, 2nd cpu will be
    unplugged.
 2- When > threshold, 2nd cpu will be hotplugged.
 3- The logic applies a fast hotplug and slow unplug algorithm so 2nd core
    will stay enabled longer to help deal with performance spikes

changes from Ver 2.0 -> Ver 3.0:
  - remove GPU Busy dependency for browsing state detection (this will make
    the governor more portable to other platforms without specific GPU
    architecture knowledge)

dependencies:
  -- Qualcomm's run queue average logic (SOC independent logic)
  -- TI's runnable thread average logic (SOC independent logic)

forward ported to Linux 3.4 for use on Mako

Change-Id: Ia5d80d16c4d6eb75708f5d79464e6f3c6f3520bb
Signed-off-by: Paul Reioux <reioux@gmail.com>
intellidemand: Add boost pulse capability

Boost pulse increases UI performance by increasing CPU freq and
reduce sampling time.

forward ported for Linux 3.4 for use on Mako
Signed-off-by: faux123 <reioux@gmail.com>

Change-Id: Ie0345670e3bb9ad24e87513c4a747a9c56b68290
intellidemand: add bug fixes

 - Fix crash input event handler on governor switch
 - Fix panic when setting sampling rate

Change-Id: I9840411b70a13c812f47966c3e807f5c24b4b211
Signed-off-by: faux123 <reioux@gmail.com>
intellidemand: add a run queue persistence to determine browsing state

persistence will allow for better browsing state detection rather than just
purely based on run queue depth alone

Change-Id: I7977007b9e6f4bc35a21e585becd67b034769c8f
Signed-off-by: faux123 <reioux@gmail.com>
intellidemand: add minimum cpu performance lock

a minimum cpu frequency performance lock is add to ensure smooth
operations when only 1 core is active

Change-Id: Ia82a09e1fe603435708cb508c865bcc3c252ff96
Signed-off-by: faux123 <reioux@gmail.com>
Intellidemand: update for quadcore operations. bump version to 4.0

Change-Id: I7d023b1558b6d75cba08fea4508d21e37256193d
Signed-off-by: faux123 <reioux@gmail.com>
intellidemand: code derps clean up!

Change-Id: Ife7c3aa59ff9d67025bb178b08f7cd1ee5dda232
Signed-off-by: faux123 <reioux@gmail.com>
Intellidemand: put cores 1~3 to sleep while screen is off

Change-Id: Ie18f38249b86a14ebd000c6ce4d2434e28ac7aa9
Signed-off-by: faux123 <reioux@gmail.com>
intellidemand: increase boost duration to 2.5 seconds from 1.5

Change-Id: Ie80394fd86016ac20268a1c5b949dd2648d6fd62
Signed-off-by: faux123 <reioux@gmail.com>
intellidemand: add eco mode (dual core operations) bump version to 4.1

Change-Id: I5f82232eb2ac097249e499aaca6899d1e74405ae
Signed-off-by: faux123 <reioux@gmail.com>
intellidemand: tweak for not using min performance lock

Change-Id: Ia02e671e77a57ef5b29eda5154823ce6c51ccd55
Signed-off-by: faux123 <reioux@gmail.com>
Intellidemand: adjust the nr_run hysteresis for better UI response

Change-Id: Ie8b20cab65f0f0d54288b9ba59d0d41444b09269
Signed-off-by: faux123 <reioux@gmail.com>
cpufreq: Avoid using smp_processor_id() in preemptible context

Even though this work item runs on only one cpu at a time (due to
queue_work_on()) it is possible for the work item to be preempted
and so use of smp_processor_id() is illegal.

BUG: using smp_processor_id() in preemptible [00000000]
code: kworker/3:1/4162 caller is dbs_refresh_callback+0xc/0x188
[<c00151b0>] (unwind_backtrace+0x0/0x120) from [<c0279058>]
(debug_smp_processor_id+0xbc/0xf0)
[<c0279058>] (debug_smp_processor_id+0xbc/0xf0) from [<c0454b54>]
(dbs_refresh_callback+0xc/0x188)
[<c0454b54>] (dbs_refresh_callback+0xc/0x188) from [<c0087290>]
(process_one_work+0x354/0x648)
[<c0087290>] (process_one_work+0x354/0x648) from [<c0089754>]
(worker_thread+0x1a8/0x2a8)
[<c0089754>] (worker_thread+0x1a8/0x2a8) from [<c008e480>]
(kthread+0x90/0xa0)
[<c008e480>] (kthread+0x90/0xa0) from [<c000f438>]
(kernel_thread_exit+0x0/0x8)

The intent of the code is to determine which CPU this work item
is running on, which we can easily do by passing that information
in a wrapper struct around the work struct. Do this so we avoid
this problem.

Change-Id: I05ca0ff2b3cbaa239930463ea0760e3e9d75145f
Signed-off-by: faux123 <reioux@gmail.com>
intellidemand: Add support to consider other cpu load when scaling frequencies

Currently only current cpu load is considered when frequency scaling.
As a side effect of this when scheduler migrates a thread to a slower
core, the execution time increases unexpectedly.

The new algorithm not only considers current cpu load for frequency
scaling, but also takes into account load of other online cpus. The
treshold for this can be controlled using up_threshold_any_cpu_load.
When the up_threshold_any_cpu_load is crossed in any cpu then the
current cpu is set to sync_freq.

Also, when more than one cpu is online a two step ramp-up mechanism
is used. When the up_threshold_multi_core is crossed the cpu is ramped
up to optimal_freq which is less than policy->max and set to a power
friendly value.

Change-Id: I64bed1b142cde1f239e73aa1f78981c78aaf59ce
Signed-off-by: Narayanan Gopalakrishnan <nargop@codeaurora.org>

intellidemand: Fix kernel warning in cpufreq_governor_dbs

GOV_STOP event destroys the timer_mutex and is not initialized back
upon GOV_START event.
The Kernel complains at mutex_lock(during GOV_LIMITS event) after
mutex_destroy.

[<c0014918>] (unwind_backtrace+0x0/0x11c)
[<c007c004>] (warn_slowpath_common+0x4c/0x64)
[<c007c034>] (warn_slowpath_null+0x18/0x1c)
[<c079eef8>] (__mutex_lock_slowpath+0x130/0x3c4)
[<c079f1ac>] (mutex_lock+0x20/0x3c) from [<c0540900>]
[<c0540900>] (cpufreq_governor_dbs+0x3c8/0x468)
[<c053d500>] (__cpufreq_governor+0x90/0xe0)
[<c053d774>] (__cpufreq_set_policy+0x224/0x258)
[<c053da58>] (cpufreq_add_dev_interface+0x2b0/0x308)
[<c053e784>] (cpufreq_add_dev+0x500/0x56c)
[<c079247c>] (cpufreq_cpu_callback+0x88/0x9c)
[<c07a2ca8>] (notifier_call_chain+0x38/0x68)
[<c007ded0>] (__cpu_notify+0x28/0x40)
[<c0790024>] (_cpu_up+0xe4/0x118)
[<c0790024>] (cpu_up+0x64/0x80)
[<c0765840>] (store_online+0x48/0x78)
[<c038d0c8>] (dev_attr_store+0x18/0x24)
[<c017be40>] (sysfs_write_file+0x108/0x13c)
[<c012cdfc>] (vfs_write+0xb0/0x128)
[<c012d034>](sys_write+0x38/0x64)

Adapted for Intellidemand from CAF reference

Change-Id: Ie2a796b17209243de731ccf2ab04b7f9e7048df8
Signed-off-by: Anji Jonnala <anjir@codeaurora.org>
Signed-off-by: faux123 <reioux@gmail.com>
intellidemand: give intellidemand's cpu_dbs_info its own name

Change-Id: I93a00f57c63bedec2a077043ac2f665dc28a9e7a
Signed-off-by: Paul Reioux <reioux@gmail.com>
intellidemand: add default values for dbs sync and optimal tuneables

Change-Id: I760df8591f06cdaba073d85ac006e25d79954b86
Signed-off-by: faux123 <reioux@gmail.com>
intellidemand: remove cpu cores autoplug capability (replaced by intelli_plug)

Change-Id: Idb969bb217518ad69e1f133944d8a8c0f2d1e728
Signed-off-by: faux123 <reioux@gmail.com>
intellidemand: remove eco mode option (replaced by intelli_plug)

Change-Id: I8c6fa5f4494de553e8e7484515e1959b2c468c59
Signed-off-by: faux123 <reioux@gmail.com>
intellidemand: remove unused min performance lock defines

Change-Id: I3802b2f680ee9d7578af6631f84e7d36bc879334
Signed-off-by: faux123 <reioux@gmail.com>
intellidemand: Don't update the policy->cur upon cpufreq driver failure

Change-Id: I5d0d07f4ec4abbb1fe8b0470fd5fcb4d84564390
Signed-off-by: faux123 <reioux@gmail.com>