mt_hotplug_strategy_internal.h 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257
  1. /*
  2. * Copyright (c) 2015 MediaTek Inc.
  3. *
  4. * This program is free software; you can redistribute it and/or modify
  5. * it under the terms of the GNU General Public License as published by
  6. * the Free Software Foundation; either version 2 of the License, or
  7. * (at your option) any later version.
  8. *
  9. * This program is distributed in the hope that it will be useful,
  10. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  12. * GNU General Public License for more details.
  13. */
  14. #ifndef __MT_HOTPLUG_STRATEGY_INTERNAL_H__
  15. #define __MT_HOTPLUG_STRATEGY_INTERNAL_H__
  16. #include <linux/kernel.h>
  17. #include <linux/io.h>
  18. #include <linux/platform_device.h>
  19. #include <linux/kthread.h>
  20. #include <linux/timer.h>
  21. #include <linux/sched/rt.h>
  22. /* CONFIG - compile time */
  23. #define HPS_TASK_PRIORITY (MAX_RT_PRIO - 3)
  24. #define HPS_TIMER_INTERVAL_MS 100
  25. #define HPS_PERIODICAL_BY_WAIT_QUEUE (1)
  26. #define HPS_PERIODICAL_BY_TIMER (2)
  27. #define HPS_PERIODICAL_BY_HR_TIMER (3)
  28. #define MAX_CPU_UP_TIMES 10
  29. #define MAX_CPU_DOWN_TIMES 100
  30. #define MAX_TLP_TIMES 10
  31. /* cpu capability of big / little = 1.7, aka 170, 170 - 100 = 70 */
  32. #define CPU_DMIPS_BIG_LITTLE_DIFF 70
  33. /* CONFIG - runtime (execute time interval : 100 ms */
  34. #define DEF_CPU_UP_THRESHOLD 95
  35. #define DEF_CPU_UP_TIMES 2
  36. #define DEF_CPU_DOWN_THRESHOLD 85
  37. #define DEF_CPU_DOWN_TIMES 8
  38. #define DEF_TLP_TIMES 1
  39. #define EN_CPU_INPUT_BOOST 1
  40. #define DEF_CPU_INPUT_BOOST_CPU_NUM 2
  41. #define EN_CPU_RUSH_BOOST 1
  42. #define DEF_CPU_RUSH_BOOST_THRESHOLD 98
  43. #define DEF_CPU_RUSH_BOOST_TIMES 1
  44. #define EN_HPS_LOG 1
  45. #define EN_ISR_LOG 0
  46. /*
  47. * EARLY SYSPEND CONFIG - runtime
  48. * Execute time interval : 400 ms
  49. */
  50. #define DEF_ES_CPU_UP_THRESHOLD 95
  51. #define DEF_ES_CPU_UP_TIMES 1
  52. #define DEF_ES_CPU_DOWN_THRESHOLD 85
  53. #define DEF_ES_CPU_DOWN_TIMES 2
  54. /*
  55. * LOG
  56. */
  57. #define hps_emerg(fmt, args...) pr_emerg("[HPS] " fmt, ##args)
  58. #define hps_alert(fmt, args...) pr_alert("[HPS] " fmt, ##args)
  59. #define hps_crit(fmt, args...) pr_crit("[HPS] " fmt, ##args)
  60. #define hps_error(fmt, args...) pr_err("[HPS] " fmt, ##args)
  61. #define hps_warn(fmt, args...) pr_warn("[HPS] " fmt, ##args)
  62. #define hps_notice(fmt, args...) pr_notice("[HPS] " fmt, ##args)
  63. #define hps_info(fmt, args...) pr_info("[HPS] " fmt, ##args)
  64. #define hps_debug(fmt, args...) pr_devel("[HPS] " fmt, ##args)
  65. #define hps_read(addr) __raw_readl(IOMEM(addr))
  66. #define hps_write(addr, val) mt_reg_sync_writel(val, addr)
  67. enum hps_init_state_e {
  68. INIT_STATE_NOT_READY = 0,
  69. INIT_STATE_DONE
  70. };
  71. enum hps_ctxt_state_e {
  72. STATE_LATE_RESUME = 0,
  73. STATE_EARLY_SUSPEND,
  74. STATE_SUSPEND,
  75. STATE_COUNT
  76. };
  77. enum hps_ctxt_action_e {
  78. ACTION_NONE = 0,
  79. ACTION_BASE_LITTLE, /* bit 1, 0x0002 */
  80. ACTION_BASE_BIG, /* bit 2, 0x0004 */
  81. ACTION_LIMIT_LITTLE, /* bit 3, 0x0008 */
  82. ACTION_LIMIT_BIG, /* bit 4, 0x0010 */
  83. ACTION_RUSH_BOOST_LITTLE, /* bit 5, 0x0020 */
  84. ACTION_RUSH_BOOST_BIG, /* bit 6, 0x0040 */
  85. ACTION_UP_LITTLE, /* bit 7, 0x0080 */
  86. ACTION_UP_BIG, /* bit 8, 0x0100 */
  87. ACTION_DOWN_LITTLE, /* bit 9, 0x0200 */
  88. ACTION_DOWN_BIG, /* bit 10, 0x0400 */
  89. ACTION_BIG_TO_LITTLE, /* bit 11, 0x0800 */
  90. ACTION_INPUT, /* bit 12, 0x1000 */
  91. ACTION_COUNT
  92. };
  93. struct hps_ctxt_struct {
  94. /* state */
  95. unsigned int init_state;
  96. unsigned int state;
  97. /* enabled */
  98. unsigned int enabled;
  99. /* disable hotplug strategy in suspend flow */
  100. unsigned int suspend_enabled; /* default: 1 */
  101. unsigned int cur_dump_enabled;
  102. unsigned int stats_dump_enabled;
  103. /* core */
  104. /* Synchronizes accesses */
  105. struct mutex lock;
  106. struct task_struct *tsk_struct_ptr;
  107. wait_queue_head_t wait_queue;
  108. struct timer_list tmr_list;
  109. unsigned int periodical_by;
  110. struct hrtimer hr_timer;
  111. struct platform_driver pdrv;
  112. /* backup */
  113. unsigned int enabled_backup;
  114. unsigned int rush_boost_enabled_backup;
  115. /* cpu arch */
  116. unsigned int is_hmp;
  117. struct cpumask little_cpumask;
  118. struct cpumask big_cpumask;
  119. unsigned int little_cpu_id_min;
  120. unsigned int little_cpu_id_max;
  121. unsigned int big_cpu_id_min;
  122. unsigned int big_cpu_id_max;
  123. /* algo config */
  124. unsigned int up_threshold;
  125. unsigned int up_times;
  126. unsigned int down_threshold;
  127. unsigned int down_times;
  128. unsigned int input_boost_enabled;
  129. unsigned int input_boost_cpu_num;
  130. unsigned int rush_boost_enabled;
  131. unsigned int rush_boost_threshold;
  132. unsigned int rush_boost_times;
  133. unsigned int tlp_times;
  134. /* algo bound */
  135. unsigned int little_num_base_perf_serv;
  136. unsigned int little_num_base_wifi;
  137. unsigned int little_num_limit_thermal;
  138. unsigned int little_num_limit_low_battery;
  139. unsigned int little_num_limit_ultra_power_saving;
  140. unsigned int little_num_limit_power_serv;
  141. unsigned int big_num_base_perf_serv;
  142. unsigned int big_num_base_wifi;
  143. unsigned int big_num_limit_thermal;
  144. unsigned int big_num_limit_low_battery;
  145. unsigned int big_num_limit_ultra_power_saving;
  146. unsigned int big_num_limit_power_serv;
  147. /* algo statistics */
  148. unsigned int cur_loads;
  149. unsigned int cur_tlp;
  150. unsigned int cur_iowait;
  151. unsigned int cur_nr_heavy_task;
  152. unsigned int up_loads_sum;
  153. unsigned int up_loads_count;
  154. unsigned int up_loads_history[MAX_CPU_UP_TIMES];
  155. unsigned int up_loads_history_index;
  156. unsigned int down_loads_sum;
  157. unsigned int down_loads_count;
  158. unsigned int down_loads_history[MAX_CPU_DOWN_TIMES];
  159. unsigned int down_loads_history_index;
  160. unsigned int rush_count;
  161. unsigned int tlp_sum;
  162. unsigned int tlp_count;
  163. unsigned int tlp_history[MAX_TLP_TIMES];
  164. unsigned int tlp_history_index;
  165. unsigned int tlp_avg;
  166. /* algo action */
  167. unsigned long action;
  168. atomic_t is_ondemand;
  169. /* misc */
  170. unsigned int test0;
  171. unsigned int test1;
  172. };
  173. struct hps_cpu_ctxt_struct {
  174. unsigned int load;
  175. };
  176. extern struct hps_ctxt_struct hps_ctxt;
  177. DECLARE_PER_CPU(struct hps_cpu_ctxt_struct, hps_percpu_ctxt);
  178. /* mt_hotplug_strategy_main.c */
  179. extern void hps_ctxt_reset_stas_nolock(void);
  180. extern void hps_ctxt_reset_stas(void);
  181. extern void hps_ctxt_print_basic(int toUart);
  182. extern void hps_ctxt_print_algo_config(int toUart);
  183. extern void hps_ctxt_print_algo_bound(int toUart);
  184. extern void hps_ctxt_print_algo_stats_cur(int toUart);
  185. extern void hps_ctxt_print_algo_stats_up(int toUart);
  186. extern void hps_ctxt_print_algo_stats_down(int toUart);
  187. extern void hps_ctxt_print_algo_stats_tlp(int toUart);
  188. extern int hps_restart_timer(void);
  189. extern int hps_del_timer(void);
  190. extern int hps_core_deinit(void);
  191. /* mt_hotplug_strategy_core.c */
  192. extern int hps_core_init(void);
  193. extern int hps_core_deinit(void);
  194. extern int hps_task_start(void);
  195. extern void hps_task_stop(void);
  196. extern void hps_task_wakeup_nolock(void);
  197. extern void hps_task_wakeup(void);
  198. /* mt_hotplug_strategy_algo.c */
  199. extern void hps_algo_hmp(void);
  200. extern void hps_algo_smp(void);
  201. /* mt_hotplug_strategy_procfs.c */
  202. extern int hps_procfs_init(void);
  203. /* mt_hotplug_strategy_cpu.c */
  204. #define num_possible_little_cpus() \
  205. cpumask_weight(&hps_ctxt.little_cpumask)
  206. #define num_possible_big_cpus() \
  207. cpumask_weight(&hps_ctxt.big_cpumask)
  208. extern int hps_cpu_init(void);
  209. extern int hps_cpu_deinit(void);
  210. extern unsigned int num_online_little_cpus(void);
  211. extern unsigned int num_online_big_cpus(void);
  212. extern int hps_cpu_is_cpu_big(int cpu);
  213. extern int hps_cpu_is_cpu_little(int cpu);
  214. extern unsigned int hps_cpu_get_percpu_load(int cpu);
  215. extern unsigned int hps_cpu_get_nr_heavy_task(void);
  216. extern void hps_cpu_get_tlp(unsigned int *avg, unsigned int *iowait_avg);
  217. extern struct cpumask cpu_domain_big_mask;
  218. extern struct cpumask cpu_domain_little_mask;
  219. extern void sched_get_nr_running_avg(int *avg, int *iowait_avg);
  220. extern unsigned int sched_get_percpu_load(int cpu, bool reset, bool use_maxfreq);
  221. extern unsigned int sched_get_nr_heavy_task(void);
  222. #endif