rmnet_shs_freq.c 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. /* Copyright (c) 2020-2021 The Linux Foundation. All rights reserved.
  2. * Copyright (c) 2023 Qualcomm Innovation Center, Inc. All rights reserved.
  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 version 2 and
  6. * only version 2 as published by the Free Software Foundation.
  7. *
  8. * This program is distributed in the hope that it will be useful,
  9. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  10. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  11. * GNU General Public License for more details.
  12. *
  13. */
  14. #include <linux/module.h>
  15. #include "rmnet_shs.h"
  16. #include "rmnet_shs_freq.h"
  17. #include "rmnet_shs_modules.h"
  18. #include <linux/cpufreq.h>
  19. #include <linux/cpu.h>
  20. #include <linux/pm_qos.h>
  21. #define DATARMNET81fe789d21 INT_MAX
  22. #define MIN_FREQ (0xd2d+202-0xdf7)
  23. #define DATARMNET59b491fbc9 DATARMNET81fe789d21
  24. #define DATARMNET03d51cb126 (0xd1f+216-0xdf5)
  25. struct cpu_freq{unsigned int DATARMNET103c8d34fe;unsigned int
  26. DATARMNET1159aa2cb6;};unsigned int DATARMNET666c9ff35e __read_mostly=
  27. (0xd26+209-0xdf6);module_param(DATARMNET666c9ff35e,uint,(0xdb7+6665-0x261c));
  28. MODULE_PARM_DESC(DATARMNET666c9ff35e,
  29. "\x45\x6e\x61\x62\x6c\x65\x2f\x64\x69\x73\x61\x62\x6c\x65\x20\x66\x72\x65\x71\x20\x62\x6f\x6f\x73\x74\x20\x66\x65\x61\x74\x75\x72\x65"
  30. );struct workqueue_struct*DATARMNETde8f350999;struct DATARMNET4e6b0cd2b8{struct
  31. cpu_freq __percpu*DATARMNET9dd9bc4abb;};static struct DATARMNET4e6b0cd2b8
  32. DATARMNETc4b1be7898;static struct work_struct DATARMNETbfcbb4b8ac;static
  33. DEFINE_PER_CPU(struct freq_qos_request,DATARMNET17d6a9530a);struct
  34. DATARMNET257fd3bf84{struct cpu_freq __percpu*DATARMNETde47bee4ac;};static struct
  35. DATARMNET257fd3bf84 DATARMNET7cf8d49bd5;static struct work_struct
  36. DATARMNET3dc8e3c69f;static DEFINE_PER_CPU(struct freq_qos_request,
  37. DATARMNET68a4af61b9);static void DATARMNETb90d2272b4(struct work_struct*
  38. DATARMNET33110a3ff5){struct cpu_freq*DATARMNETe24d518157;unsigned int i;int ret;
  39. struct freq_qos_request*DATARMNETddcafd8b91;cpus_read_lock();for_each_online_cpu
  40. (i){DATARMNETe24d518157=per_cpu_ptr(DATARMNETc4b1be7898.DATARMNET9dd9bc4abb,i);
  41. DATARMNETddcafd8b91=&per_cpu(DATARMNET17d6a9530a,i);ret=freq_qos_update_request(
  42. DATARMNETddcafd8b91,DATARMNETe24d518157->DATARMNET103c8d34fe);}cpus_read_unlock(
  43. );}static void DATARMNET5a406b068f(struct work_struct*DATARMNET33110a3ff5){
  44. struct cpu_freq*DATARMNETe24d518157;unsigned int i;int ret;struct
  45. freq_qos_request*DATARMNETddcafd8b91;cpus_read_lock();for_each_online_cpu(i){
  46. DATARMNETe24d518157=per_cpu_ptr(DATARMNET7cf8d49bd5.DATARMNETde47bee4ac,i);
  47. DATARMNETddcafd8b91=&per_cpu(DATARMNET68a4af61b9,i);ret=freq_qos_update_request(
  48. DATARMNETddcafd8b91,DATARMNETe24d518157->DATARMNET103c8d34fe);
  49. DATARMNETda96251102(DATARMNETb77d87790d,DATARMNET5994bb1411,DATARMNETe24d518157
  50. ->DATARMNET103c8d34fe,DATARMNETe24d518157->DATARMNET1159aa2cb6,
  51. (0x16e8+787-0xc0c),(0x16e8+787-0xc0c),NULL,NULL);}cpus_read_unlock();}void
  52. DATARMNET82d7f4ffa2(void){struct cpu_freq*DATARMNETe24d518157;int i;
  53. for_each_possible_cpu(i){DATARMNETe24d518157=per_cpu_ptr(DATARMNETc4b1be7898.
  54. DATARMNET9dd9bc4abb,i);DATARMNETe24d518157->DATARMNET103c8d34fe=MIN_FREQ;
  55. DATARMNETe24d518157->DATARMNET1159aa2cb6=DATARMNET81fe789d21;}
  56. for_each_possible_cpu(i){DATARMNETe24d518157=per_cpu_ptr(DATARMNET7cf8d49bd5.
  57. DATARMNETde47bee4ac,i);DATARMNETe24d518157->DATARMNET103c8d34fe=MIN_FREQ;
  58. DATARMNETe24d518157->DATARMNET1159aa2cb6=DATARMNET81fe789d21;}}void
  59. DATARMNET5e4aeef593(int cpu){struct cpu_freq*DATARMNETe24d518157;int i=cpu;if(
  60. cpu<(0xd2d+202-0xdf7)||cpu>=DATARMNETc6782fed88)return;if(((0xd26+209-0xdf6)<<i)
  61. &DATARMNET9273f84bf1)return;DATARMNETe24d518157=per_cpu_ptr(DATARMNETc4b1be7898.
  62. DATARMNET9dd9bc4abb,i);DATARMNETe24d518157->DATARMNET103c8d34fe=
  63. DATARMNET59b491fbc9;DATARMNETe24d518157->DATARMNET1159aa2cb6=DATARMNET81fe789d21
  64. ;trace_rmnet_freq_boost(i,DATARMNET59b491fbc9);}void DATARMNETfb7007f025(void){
  65. struct cpu_freq*DATARMNETe24d518157;int i;for_each_possible_cpu(i){if((
  66. (0xd26+209-0xdf6)<<i)&DATARMNETbc3c416b77)continue;DATARMNETe24d518157=
  67. per_cpu_ptr(DATARMNETc4b1be7898.DATARMNET9dd9bc4abb,i);DATARMNETe24d518157->
  68. DATARMNET103c8d34fe=DATARMNET59b491fbc9;DATARMNETe24d518157->DATARMNET1159aa2cb6
  69. =DATARMNET81fe789d21;trace_rmnet_freq_boost(i,DATARMNET59b491fbc9);}if(
  70. work_pending(&DATARMNETbfcbb4b8ac))return;if(DATARMNETde8f350999){queue_work_on(
  71. DATARMNET03d51cb126,DATARMNETde8f350999,&DATARMNETbfcbb4b8ac);}}void
  72. DATARMNET202a68d7d0(void){struct cpu_freq*DATARMNETe24d518157;int i;
  73. for_each_possible_cpu(i){if(((0xd26+209-0xdf6)<<i)&DATARMNETbc3c416b77)continue;
  74. DATARMNETe24d518157=per_cpu_ptr(DATARMNET7cf8d49bd5.DATARMNETde47bee4ac,i);
  75. DATARMNETe24d518157->DATARMNET103c8d34fe=DATARMNET59b491fbc9;DATARMNETe24d518157
  76. ->DATARMNET1159aa2cb6=DATARMNET81fe789d21;trace_rmnet_freq_boost(i,
  77. DATARMNET59b491fbc9);}if(work_pending(&DATARMNET3dc8e3c69f))return;if(
  78. DATARMNETde8f350999){queue_work_on(DATARMNET03d51cb126,DATARMNETde8f350999,&
  79. DATARMNET3dc8e3c69f);}}void DATARMNET371703c28d(void){struct cpu_freq*
  80. DATARMNETe24d518157;int i;for_each_possible_cpu(i){DATARMNETe24d518157=
  81. per_cpu_ptr(DATARMNETc4b1be7898.DATARMNET9dd9bc4abb,i);DATARMNETe24d518157->
  82. DATARMNET103c8d34fe=MIN_FREQ;DATARMNETe24d518157->DATARMNET1159aa2cb6=
  83. DATARMNET81fe789d21;trace_rmnet_freq_reset(i,MIN_FREQ);}if(work_pending(&
  84. DATARMNETbfcbb4b8ac))return;if(DATARMNETde8f350999)queue_work_on(
  85. DATARMNET03d51cb126,DATARMNETde8f350999,&DATARMNETbfcbb4b8ac);}void
  86. DATARMNETf20806b279(void){struct cpu_freq*DATARMNETe24d518157;int i;
  87. for_each_possible_cpu(i){DATARMNETe24d518157=per_cpu_ptr(DATARMNET7cf8d49bd5.
  88. DATARMNETde47bee4ac,i);DATARMNETe24d518157->DATARMNET103c8d34fe=MIN_FREQ;
  89. DATARMNETe24d518157->DATARMNET1159aa2cb6=DATARMNET81fe789d21;
  90. trace_rmnet_freq_reset(i,MIN_FREQ);}if(work_pending(&DATARMNET3dc8e3c69f))return
  91. ;if(DATARMNETde8f350999)queue_work_on(DATARMNET03d51cb126,DATARMNETde8f350999,&
  92. DATARMNET3dc8e3c69f);}static void DATARMNET009d37d173(void){struct
  93. freq_qos_request*DATARMNETddcafd8b91;int i;for_each_possible_cpu(i){
  94. DATARMNETddcafd8b91=&per_cpu(DATARMNET17d6a9530a,i);if(DATARMNETddcafd8b91&&
  95. freq_qos_request_active(DATARMNETddcafd8b91)){freq_qos_remove_request(
  96. DATARMNETddcafd8b91);}DATARMNETddcafd8b91=&per_cpu(DATARMNET68a4af61b9,i);if(
  97. DATARMNETddcafd8b91&&freq_qos_request_active(DATARMNETddcafd8b91)){
  98. freq_qos_remove_request(DATARMNETddcafd8b91);}}}int DATARMNETe6e8431304(void){
  99. struct cpu_freq*DATARMNETe24d518157;int i;int ret=(0xd2d+202-0xdf7);struct
  100. freq_qos_request*DATARMNETddcafd8b91;struct cpufreq_policy*policy;
  101. DATARMNETc4b1be7898.DATARMNET9dd9bc4abb=alloc_percpu(struct cpu_freq);if(!
  102. DATARMNETc4b1be7898.DATARMNET9dd9bc4abb)return-ENOMEM;DATARMNET7cf8d49bd5.
  103. DATARMNETde47bee4ac=alloc_percpu(struct cpu_freq);if(!DATARMNET7cf8d49bd5.
  104. DATARMNETde47bee4ac){free_percpu(DATARMNETc4b1be7898.DATARMNET9dd9bc4abb);return
  105. -ENOMEM;}if(!DATARMNETde8f350999)DATARMNETde8f350999=alloc_workqueue(
  106. "\x73\x68\x73\x5f\x62\x6f\x6f\x73\x74\x5f\x77\x71",WQ_HIGHPRI,(0xd2d+202-0xdf7))
  107. ;if(!DATARMNETde8f350999){ret=-ENOMEM;goto err;}for_each_possible_cpu(i){
  108. DATARMNETe24d518157=per_cpu_ptr(DATARMNETc4b1be7898.DATARMNET9dd9bc4abb,i);
  109. DATARMNETddcafd8b91=&per_cpu(DATARMNET17d6a9530a,i);policy=cpufreq_cpu_get(i);if
  110. (!policy){pr_err(
  111. "\x25\x73\x3a\x20\x63\x70\x75\x66\x72\x65\x71\x20\x70\x6f\x6c\x69\x63\x79\x20\x6e\x6f\x74\x20\x66\x6f\x75\x6e\x64\x20\x66\x6f\x72\x20\x63\x70\x75\x25\x64" "\n"
  112. ,__func__,i);return-ESRCH;}ret=freq_qos_add_request(&policy->constraints,
  113. DATARMNETddcafd8b91,FREQ_QOS_MIN,MIN_FREQ);if(ret<(0xd2d+202-0xdf7)){pr_err(
  114. "\x25\x73\x3a\x20\x46\x61\x69\x6c\x65\x64\x20\x74\x6f\x20\x61\x64\x64\x20\x66\x72\x65\x71\x20\x63\x6f\x6e\x73\x74\x72\x61\x69\x6e\x74\x20\x28\x25\x64\x29" "\n"
  115. ,__func__,ret);return ret;}DATARMNETddcafd8b91=&per_cpu(DATARMNET68a4af61b9,i);
  116. policy=cpufreq_cpu_get(i);if(!policy){pr_err(
  117. "\x25\x73\x3a\x20\x63\x70\x75\x66\x72\x65\x71\x20\x70\x6f\x6c\x69\x63\x79\x20\x6e\x6f\x74\x20\x66\x6f\x75\x6e\x64\x20\x66\x6f\x72\x20\x70\x62\x20\x63\x70\x75\x25\x64" "\n"
  118. ,__func__,i);return-ESRCH;}ret=freq_qos_add_request(&policy->constraints,
  119. DATARMNETddcafd8b91,FREQ_QOS_MIN,MIN_FREQ);if(ret<(0xd2d+202-0xdf7)){pr_err(
  120. "\x25\x73\x3a\x20\x46\x61\x69\x6c\x65\x64\x20\x74\x6f\x20\x61\x64\x64\x20\x70\x62\x20\x66\x72\x65\x71\x20\x63\x6f\x6e\x73\x74\x72\x61\x69\x6e\x74\x20\x28\x25\x64\x29" "\n"
  121. ,__func__,ret);return ret;}}INIT_WORK(&DATARMNETbfcbb4b8ac,DATARMNETb90d2272b4);
  122. INIT_WORK(&DATARMNET3dc8e3c69f,DATARMNET5a406b068f);DATARMNET82d7f4ffa2();return
  123. (0xd2d+202-0xdf7);err:DATARMNET82d7f4ffa2();free_percpu(DATARMNETc4b1be7898.
  124. DATARMNET9dd9bc4abb);free_percpu(DATARMNET7cf8d49bd5.DATARMNETde47bee4ac);if(
  125. DATARMNETde8f350999){destroy_workqueue(DATARMNETde8f350999);DATARMNETde8f350999=
  126. NULL;}return ret;}int DATARMNETdf74db7e38(void){DATARMNET009d37d173();if(
  127. DATARMNETde8f350999){destroy_workqueue(DATARMNETde8f350999);DATARMNETde8f350999=
  128. NULL;}free_percpu(DATARMNETc4b1be7898.DATARMNET9dd9bc4abb);free_percpu(
  129. DATARMNET7cf8d49bd5.DATARMNETde47bee4ac);return(0xd2d+202-0xdf7);}