mt_gpufreq.c 81 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961
  1. /*
  2. * This program is free software; you can redistribute it and/or modify
  3. * it under the terms of the GNU General Public License as published by
  4. * the Free Software Foundation; either version 2 of the License, or
  5. * (at your option) any later version.
  6. */
  7. #include <linux/kernel.h>
  8. #include <linux/module.h>
  9. #include <linux/sched.h>
  10. #include <linux/init.h>
  11. #include <linux/delay.h>
  12. #include <linux/slab.h>
  13. #include <linux/proc_fs.h>
  14. #include <linux/miscdevice.h>
  15. #include <linux/platform_device.h>
  16. #include <linux/spinlock.h>
  17. #include <linux/kthread.h>
  18. #include <linux/hrtimer.h>
  19. #include <linux/ktime.h>
  20. #include <linux/jiffies.h>
  21. #include <linux/fs.h>
  22. #include <linux/seq_file.h>
  23. #include <linux/input.h>
  24. #include <linux/sched.h>
  25. #include <linux/sched/rt.h>
  26. #include <linux/kthread.h>
  27. #ifdef CONFIG_OF
  28. #include <linux/of.h>
  29. #include <linux/of_address.h>
  30. #endif
  31. #include <asm/uaccess.h>
  32. #include <asm/io.h>
  33. #include "mach/mt_clkmgr.h"
  34. #include "mach/mt_freqhopping.h"
  35. #include "mt_cpufreq.h"
  36. #include "mt_gpufreq.h"
  37. #include "mt-plat/sync_write.h"
  38. #include "mt_static_power.h"
  39. #include "mach/mt_thermal.h"
  40. #include "mt-plat/upmu_common.h"
  41. #include "mach/upmu_sw.h"
  42. #include "mach/upmu_hw.h"
  43. #include "mach/mt_pbm.h"
  44. #include "mt_vcore_dvfs.h"
  45. #include "mt_ptp.h"
  46. #include "mt-plat/mt_devinfo.h"
  47. /**************************************************
  48. * Define register write function
  49. ***************************************************/
  50. #define mt_gpufreq_reg_write(val, addr) mt_reg_sync_writel((val), ((void *)addr))
  51. #define can_do_gpu_dvs() (g_is_vcorefs_on == 1)
  52. /***************************
  53. * Operate Point Definition
  54. ****************************/
  55. #define GPUOP(khz, volt) \
  56. { \
  57. .gpufreq_khz = khz, \
  58. .gpufreq_volt = volt, \
  59. }
  60. /**************************
  61. * GPU DVFS OPP table setting
  62. ***************************/
  63. #ifdef CONFIG_ARCH_MT6753
  64. #define GPU_DVFS_FREQ0 (598000) /* KHz */
  65. #define GPU_DVFS_FREQ1 (448500) /* KHz */
  66. #define GPU_DVFS_FREQ2 (299000) /* KHz */
  67. #define GPUFREQ_LAST_FREQ_LEVEL (GPU_DVFS_FREQ2)
  68. #define GPU_DVFS_VOLT0 (125000) /* mV x 100 */
  69. #define GPU_DVFS_VOLT1 (115000) /* mV x 100 */
  70. #elif defined(CONFIG_ARCH_MT6735M)
  71. #define GPU_DVFS_FREQ0_0 (650000) /* KHz */
  72. #define GPU_DVFS_FREQ0 (549250) /* KHz */
  73. #define GPU_DVFS_FREQ0_P (497250) /* KHz */
  74. #define GPU_DVFS_FREQ1 (448500) /* KHz */
  75. #define GPU_DVFS_FREQ2 (299000) /* KHz */
  76. #define GPUFREQ_LAST_FREQ_LEVEL (GPU_DVFS_FREQ2)
  77. #define GPU_DVFS_VOLT0 (125000) /* mV x 100 */
  78. #define GPU_DVFS_VOLT1 (115000) /* mV x 100 */
  79. #define GPU_DVFS_VOLT2 (105000) /* mV x 100 */
  80. #else
  81. #define GPU_DVFS_FREQ0 (598000) /* KHz */
  82. #define GPU_DVFS_FREQ0_1 (549250) /* KHz */
  83. #define GPU_DVFS_FREQ1 (448500) /* KHz */
  84. #define GPU_DVFS_FREQ2 (279500) /* KHz */
  85. #define GPUFREQ_LAST_FREQ_LEVEL (GPU_DVFS_FREQ2)
  86. #define GPU_DVFS_VOLT0 (115000) /* mV x 100 */
  87. #define GPU_DVFS_VOLT1 (105000) /* mV x 100 */
  88. #endif
  89. /* efuse */
  90. #define GPUFREQ_EFUSE_INDEX (3)
  91. #define GPU_DEFAULT_MAX_FREQ_MHZ (450)
  92. #define GPU_DEFAULT_TYPE (1)
  93. /*
  94. * LOG
  95. */
  96. #define TAG "[Power/gpufreq] "
  97. #define gpufreq_err(fmt, args...) \
  98. pr_err(TAG"[ERROR]"fmt, ##args)
  99. #define gpufreq_warn(fmt, args...) \
  100. pr_warn(TAG"[WARNING]"fmt, ##args)
  101. #define gpufreq_info(fmt, args...) \
  102. pr_warn(TAG""fmt, ##args)
  103. #define gpufreq_dbg(fmt, args...) \
  104. do { \
  105. if (mt_gpufreq_debug) \
  106. gpufreq_info(fmt, ##args); \
  107. } while (0)
  108. #define gpufreq_ver(fmt, args...) \
  109. do { \
  110. if (mt_gpufreq_debug) \
  111. pr_debug(TAG""fmt, ##args); \
  112. } while (0)
  113. static sampler_func g_pFreqSampler;
  114. static sampler_func g_pVoltSampler;
  115. static gpufreq_power_limit_notify g_pGpufreq_power_limit_notify;
  116. #ifdef MT_GPUFREQ_INPUT_BOOST
  117. static gpufreq_input_boost_notify g_pGpufreq_input_boost_notify;
  118. #endif
  119. struct mt_gpufreq_table_info {
  120. unsigned int gpufreq_khz;
  121. unsigned int gpufreq_volt;
  122. };
  123. /**************************
  124. * enable GPU DVFS count
  125. ***************************/
  126. static int g_gpufreq_dvfs_disable_count;
  127. static unsigned int g_cur_gpu_OPPidx = 0xFF;
  128. static unsigned int mt_gpufreqs_num;
  129. static struct mt_gpufreq_table_info *mt_gpufreqs;
  130. static struct mt_gpufreq_table_info *mt_gpufreqs_default;
  131. /***************************
  132. * GPU DVFS OPP Table
  133. ****************************/
  134. #ifdef CONFIG_ARCH_MT6753
  135. /* LV0: 600MHz */
  136. static struct mt_gpufreq_table_info mt_gpufreq_opp_tbl_e1_0[] = {
  137. GPUOP(GPU_DVFS_FREQ0, GPU_DVFS_VOLT0),
  138. GPUOP(GPU_DVFS_FREQ1, GPU_DVFS_VOLT1),
  139. GPUOP(GPU_DVFS_FREQ2, GPU_DVFS_VOLT1),
  140. };
  141. /* LV1: 450MHz */
  142. static struct mt_gpufreq_table_info mt_gpufreq_opp_tbl_e1_1[] = {
  143. GPUOP(GPU_DVFS_FREQ1, GPU_DVFS_VOLT1),
  144. GPUOP(GPU_DVFS_FREQ2, GPU_DVFS_VOLT1),
  145. };
  146. #elif defined(CONFIG_ARCH_MT6735M)
  147. /* LV0: add 550MHz for HD */
  148. static struct mt_gpufreq_table_info mt_gpufreq_opp_tbl_e1_0[] = {
  149. GPUOP(GPU_DVFS_FREQ0, GPU_DVFS_VOLT0),
  150. GPUOP(GPU_DVFS_FREQ1, GPU_DVFS_VOLT1),
  151. GPUOP(GPU_DVFS_FREQ2, GPU_DVFS_VOLT2),
  152. };
  153. /* LV1: 450MHz for HPM */
  154. static struct mt_gpufreq_table_info mt_gpufreq_opp_tbl_e1_1[] = {
  155. GPUOP(GPU_DVFS_FREQ1, GPU_DVFS_VOLT1),
  156. GPUOP(GPU_DVFS_FREQ2, GPU_DVFS_VOLT2),
  157. };
  158. /* LV2: 650MHz */
  159. static struct mt_gpufreq_table_info mt_gpufreq_opp_tbl_e1_2[] = {
  160. GPUOP(GPU_DVFS_FREQ0_0, GPU_DVFS_VOLT1),
  161. GPUOP(GPU_DVFS_FREQ1, GPU_DVFS_VOLT1),
  162. GPUOP(GPU_DVFS_FREQ2, GPU_DVFS_VOLT2),
  163. };
  164. /* LV4: add 500MHz for D2+ */
  165. static struct mt_gpufreq_table_info mt_gpufreq_opp_tbl_e1_4[] = {
  166. GPUOP(GPU_DVFS_FREQ0_P, GPU_DVFS_VOLT1),
  167. GPUOP(GPU_DVFS_FREQ2, GPU_DVFS_VOLT2),
  168. };
  169. #else
  170. /* LV0: 600MHz for HPM */
  171. static struct mt_gpufreq_table_info mt_gpufreq_opp_tbl_e1_0[] = {
  172. GPUOP(GPU_DVFS_FREQ0, GPU_DVFS_VOLT0),
  173. GPUOP(GPU_DVFS_FREQ2, GPU_DVFS_VOLT1),
  174. };
  175. /* LV1: 450MHz for HPM */
  176. static struct mt_gpufreq_table_info mt_gpufreq_opp_tbl_e1_1[] = {
  177. GPUOP(GPU_DVFS_FREQ1, GPU_DVFS_VOLT0),
  178. GPUOP(GPU_DVFS_FREQ2, GPU_DVFS_VOLT1),
  179. };
  180. /* LV2: 600MHz with 3 OPP lv */
  181. static struct mt_gpufreq_table_info mt_gpufreq_opp_tbl_e1_2[] = {
  182. GPUOP(GPU_DVFS_FREQ0, GPU_DVFS_VOLT0),
  183. GPUOP(GPU_DVFS_FREQ1, GPU_DVFS_VOLT0),
  184. GPUOP(GPU_DVFS_FREQ2, GPU_DVFS_VOLT1),
  185. };
  186. /* LV3: 600MHz with 3 OPP lv */
  187. static struct mt_gpufreq_table_info mt_gpufreq_opp_tbl_e1_3[] = {
  188. GPUOP(GPU_DVFS_FREQ0_1, GPU_DVFS_VOLT0),
  189. GPUOP(GPU_DVFS_FREQ1, GPU_DVFS_VOLT0),
  190. GPUOP(GPU_DVFS_FREQ2, GPU_DVFS_VOLT1),
  191. };
  192. #endif
  193. static bool mt_gpufreq_ready;
  194. /* In default settiing, freq_table[0] is max frequency, freq_table[num-1] is min frequency,*/
  195. const unsigned int g_gpufreq_max_id = 0;
  196. #if defined(CONFIG_ARCH_MT6735M) && defined(MT_GPUFREQ_VCOREFS_ENABLED)
  197. static const unsigned int g_gpufreq_max_id_vcorefs_off = 1;
  198. #endif
  199. static int g_last_gpu_dvs_result = 0x7F;
  200. static int g_is_vcorefs_on = 0xFF;
  201. /* If not limited, it should be set to freq_table[0] (MAX frequency) */
  202. static unsigned int g_limited_max_id;
  203. static unsigned int g_limited_min_id;
  204. static bool mt_gpufreq_debug;
  205. static bool mt_gpufreq_pause;
  206. static bool mt_gpufreq_keep_max_frequency_state;
  207. static bool mt_gpufreq_keep_opp_frequency_state;
  208. static unsigned int mt_gpufreq_keep_opp_frequency;
  209. static unsigned int mt_gpufreq_keep_opp_index;
  210. static bool mt_gpufreq_fixed_freq_state;
  211. static unsigned int mt_gpufreq_fixed_frequency;
  212. static unsigned int mt_gpufreq_volt_enable_state;
  213. #ifdef MT_GPUFREQ_INPUT_BOOST
  214. static unsigned int mt_gpufreq_input_boost_state = 1;
  215. #endif
  216. /********************************************
  217. * POWER LIMIT RELATED
  218. ********************************************/
  219. enum {
  220. IDX_THERMAL_LIMITED,
  221. IDX_LOW_BATT_VOLT_LIMITED,
  222. IDX_LOW_BATT_VOLUME_LIMITED,
  223. IDX_OC_LIMITED,
  224. NR_IDX_POWER_LIMITED,
  225. };
  226. #ifdef MT_GPUFREQ_OC_PROTECT
  227. static bool g_limited_oc_ignore_state;
  228. static unsigned int mt_gpufreq_oc_level;
  229. #define MT_GPUFREQ_OC_LIMIT_FREQ_1 GPU_DVFS_FREQ3
  230. static unsigned int mt_gpufreq_oc_limited_index_0; /* unlimit frequency, index = 0. */
  231. static unsigned int mt_gpufreq_oc_limited_index_1;
  232. static unsigned int mt_gpufreq_oc_limited_index; /* Limited frequency index for oc */
  233. #endif
  234. #ifdef MT_GPUFREQ_LOW_BATT_VOLUME_PROTECT
  235. static bool g_limited_low_batt_volume_ignore_state;
  236. static unsigned int mt_gpufreq_low_battery_volume;
  237. #define MT_GPUFREQ_LOW_BATT_VOLUME_LIMIT_FREQ_1 GPU_DVFS_FREQ2
  238. static unsigned int mt_gpufreq_low_bat_volume_limited_index_0; /* unlimit frequency, index = 0. */
  239. static unsigned int mt_gpufreq_low_bat_volume_limited_index_1;
  240. static unsigned int mt_gpufreq_low_batt_volume_limited_index; /* Limited frequency index for low battery volume */
  241. #endif
  242. #ifdef MT_GPUFREQ_LOW_BATT_VOLT_PROTECT
  243. static bool g_limited_low_batt_volt_ignore_state;
  244. static unsigned int mt_gpufreq_low_battery_level;
  245. #define MT_GPUFREQ_LOW_BATT_VOLT_LIMIT_FREQ_1 GPU_DVFS_FREQ2
  246. #define MT_GPUFREQ_LOW_BATT_VOLT_LIMIT_FREQ_2 GPU_DVFS_FREQ2
  247. static unsigned int mt_gpufreq_low_bat_volt_limited_index_0; /* unlimit frequency, index = 0. */
  248. static unsigned int mt_gpufreq_low_bat_volt_limited_index_1;
  249. static unsigned int mt_gpufreq_low_bat_volt_limited_index_2;
  250. static unsigned int mt_gpufreq_low_batt_volt_limited_index; /* Limited frequency index for low battery voltage */
  251. #endif
  252. /* static bool g_limited_power_ignore_state; */
  253. static bool g_limited_thermal_ignore_state;
  254. static unsigned int mt_gpufreq_thermal_limited_gpu_power; /* thermal limit power */
  255. #ifndef DISABLE_PBM_FEATURE
  256. static bool g_limited_pbm_ignore_state;
  257. static unsigned int mt_gpufreq_pbm_limited_gpu_power; /* PBM limit power */
  258. static unsigned int mt_gpufreq_pbm_limited_index; /* Limited frequency index for PBM */
  259. #endif
  260. /* limit frequency index array */
  261. static unsigned int mt_gpufreq_power_limited_index_array[NR_IDX_POWER_LIMITED] = { 0 };
  262. static bool mt_gpufreq_opp_max_frequency_state;
  263. static unsigned int mt_gpufreq_opp_max_frequency;
  264. static unsigned int mt_gpufreq_opp_max_index;
  265. static unsigned int mt_gpufreq_dvfs_table_type;
  266. static unsigned int mt_gpufreq_dvfs_mmpll_spd_bond;
  267. /* static DEFINE_SPINLOCK(mt_gpufreq_lock); */
  268. static DEFINE_MUTEX(mt_gpufreq_lock);
  269. static DEFINE_MUTEX(mt_gpufreq_power_lock);
  270. static struct mt_gpufreq_power_table_info *mt_gpufreqs_power;
  271. static unsigned int mt_gpufreqs_power_num; /* run-time decided */
  272. #ifdef MT_GPUFREQ_AEE_RR_REC
  273. enum gpu_dvfs_state {
  274. GPU_DVFS_IS_DOING_DVFS = 0,
  275. GPU_DVFS_IS_VGPU_ENABLED, /* always on */
  276. };
  277. static void _mt_gpufreq_aee_init(void)
  278. {
  279. aee_rr_rec_gpu_dvfs_vgpu(0xFF); /* no used */
  280. aee_rr_rec_gpu_dvfs_oppidx(0xFF);
  281. aee_rr_rec_gpu_dvfs_status(0xFE);
  282. }
  283. #endif
  284. /**************************************
  285. * Efuse
  286. ***************************************/
  287. static unsigned int _mt_gpufreq_get_dvfs_table_type(void)
  288. {
  289. unsigned int type = 0;
  290. unsigned int gpu_550m_enable = is_have_550();
  291. unsigned int gpu_speed = 0;
  292. #ifdef CONFIG_OF
  293. static const struct of_device_id gpu_ids[] = {
  294. { .compatible = "arm,malit6xx" },
  295. { .compatible = "arm,mali-midgard" },
  296. { /* sentinel */ }
  297. };
  298. struct device_node *node;
  299. node = of_find_matching_node(NULL, gpu_ids);
  300. if (!node) {
  301. gpufreq_err("@%s: find GPU node failed\n", __func__);
  302. gpu_speed = GPU_DEFAULT_MAX_FREQ_MHZ; // default speed
  303. } else {
  304. if (!of_property_read_u32(node, "clock-frequency", &gpu_speed)) {
  305. gpu_speed = gpu_speed / 1000 / 1000; // MHz
  306. } else {
  307. gpufreq_err("@%s: missing clock-frequency property, use default GPU level\n", __func__);
  308. gpu_speed = GPU_DEFAULT_MAX_FREQ_MHZ; // default speed
  309. }
  310. }
  311. gpufreq_info("GPU clock-frequency from DT = %d MHz\n", gpu_speed);
  312. #endif
  313. mt_gpufreq_dvfs_mmpll_spd_bond = (get_devinfo_with_index(GPUFREQ_EFUSE_INDEX) >> 12) & 0x7;
  314. gpufreq_info("@%s: mmpll_spd_bond = 0x%x\n", __func__, mt_gpufreq_dvfs_mmpll_spd_bond);
  315. gpufreq_info("@%s: gpu_550m_enable = %d\n", __func__, gpu_550m_enable);
  316. #ifdef CONFIG_ARCH_MT6753
  317. {
  318. unsigned int efuse_spare2 = (get_devinfo_with_index(5) >> 20) & 0x3;
  319. gpufreq_info("@%s: efuse_spare2 = 0x%x\n", __func__, efuse_spare2);
  320. /* 6753T check, spare2[21:20] should be 0x3 */
  321. if (mt_gpufreq_dvfs_mmpll_spd_bond == 0 && efuse_spare2 == 3)
  322. return 0;
  323. }
  324. #else
  325. {
  326. unsigned int segment_code = (get_devinfo_with_index(47) >> 25) & 0x7F;
  327. gpufreq_info("@%s: segment_code = 0x%x\n", __func__, segment_code);
  328. #if defined(CONFIG_ARCH_MT6735) && defined(CONFIG_MTK_EFUSE_DOWNGRADE)
  329. return 3; /* SW config 37T to 35M+ */
  330. #endif
  331. switch (segment_code) {
  332. case 0x41:
  333. case 0x42:
  334. case 0x43:
  335. return 2; /* 37T: 600M with 3 OPP*/
  336. case 0x49:
  337. return 1; /* 37M: 450M */
  338. case 0x4A:
  339. case 0x4B:
  340. #ifdef CONFIG_ARCH_MT6735M
  341. if (mt_gpufreq_dvfs_mmpll_spd_bond == 5)
  342. return 4;
  343. #endif
  344. return 0; /* 35M+: 550M */
  345. case 0x51:
  346. return 0; /* 37: 600M */
  347. case 0x52:
  348. case 0x53:
  349. #ifdef CONFIG_MTK_EFUSE_DOWNGRADE
  350. return 0; /* SW config to 35M+ */
  351. #else
  352. return 2; /* 35P+ 650M */
  353. #endif
  354. default:
  355. break;
  356. }
  357. }
  358. #endif
  359. #ifdef CONFIG_ARCH_MT6735M
  360. #ifndef MT_GPUFREQ_VCOREFS_ENABLED
  361. return 1; /* no 550MHz if Vcore DVFS not built-in */
  362. #endif
  363. /* for 35P */
  364. if (mt_gpufreq_dvfs_mmpll_spd_bond == 0 && gpu_550m_enable != 0)
  365. return 0;
  366. #endif
  367. /* No efuse, use clock-frequency from device tree to determine GPU table type! */
  368. if (mt_gpufreq_dvfs_mmpll_spd_bond == 0) {
  369. if (gpu_speed > GPU_DEFAULT_MAX_FREQ_MHZ)
  370. type = 0; /* 600M */
  371. else
  372. type = GPU_DEFAULT_TYPE;
  373. return type;
  374. }
  375. switch (mt_gpufreq_dvfs_mmpll_spd_bond) {
  376. case 1:
  377. case 2:
  378. #ifdef CONFIG_ARCH_MT6735M
  379. case 3: /* 600M */
  380. case 4: /* 550M */
  381. if (gpu_550m_enable)
  382. type = 0;
  383. else
  384. type = GPU_DEFAULT_TYPE;
  385. break;
  386. #else
  387. case 3: /* 600M */
  388. type = 0;
  389. break;
  390. case 4: /* 550M */
  391. type = GPU_DEFAULT_TYPE;
  392. break;
  393. #endif
  394. case 5:
  395. case 6:
  396. case 7:
  397. default:
  398. type = GPU_DEFAULT_TYPE;
  399. break;
  400. }
  401. return type;
  402. }
  403. #ifdef MT_GPUFREQ_INPUT_BOOST
  404. static struct task_struct *mt_gpufreq_up_task;
  405. static int _mt_gpufreq_input_boost_task(void *data)
  406. {
  407. while (1) {
  408. gpufreq_dbg("@%s: begin\n", __func__);
  409. if (NULL != g_pGpufreq_input_boost_notify) {
  410. gpufreq_dbg("@%s: g_pGpufreq_input_boost_notify\n", __func__);
  411. g_pGpufreq_input_boost_notify(g_gpufreq_max_id);
  412. }
  413. gpufreq_dbg("@%s: end\n", __func__);
  414. set_current_state(TASK_INTERRUPTIBLE);
  415. schedule();
  416. if (kthread_should_stop())
  417. break;
  418. }
  419. return 0;
  420. }
  421. /**************************************
  422. * Input boost
  423. ***************************************/
  424. static void _mt_gpufreq_input_event(struct input_handle *handle, unsigned int type,
  425. unsigned int code, int value)
  426. {
  427. if (mt_gpufreq_ready == false) {
  428. gpufreq_dbg("@%s: GPU DVFS not ready!\n", __func__);
  429. return;
  430. }
  431. if ((type == EV_KEY) && (code == BTN_TOUCH) && (value == 1)
  432. && (mt_gpufreq_input_boost_state == 1)) {
  433. gpufreq_dbg("@%s: accept.\n", __func__);
  434. wake_up_process(mt_gpufreq_up_task);
  435. }
  436. }
  437. static int _mt_gpufreq_input_connect(struct input_handler *handler,
  438. struct input_dev *dev, const struct input_device_id *id)
  439. {
  440. struct input_handle *handle;
  441. int error;
  442. handle = kzalloc(sizeof(struct input_handle), GFP_KERNEL);
  443. if (!handle)
  444. return -ENOMEM;
  445. handle->dev = dev;
  446. handle->handler = handler;
  447. handle->name = "gpufreq_ib";
  448. error = input_register_handle(handle);
  449. if (error)
  450. goto err2;
  451. error = input_open_device(handle);
  452. if (error)
  453. goto err1;
  454. return 0;
  455. err1:
  456. input_unregister_handle(handle);
  457. err2:
  458. kfree(handle);
  459. return error;
  460. }
  461. static void _mt_gpufreq_input_disconnect(struct input_handle *handle)
  462. {
  463. input_close_device(handle);
  464. input_unregister_handle(handle);
  465. kfree(handle);
  466. }
  467. static const struct input_device_id mt_gpufreq_ids[] = {
  468. {.driver_info = 1},
  469. {},
  470. };
  471. static struct input_handler mt_gpufreq_input_handler = {
  472. .event = _mt_gpufreq_input_event,
  473. .connect = _mt_gpufreq_input_connect,
  474. .disconnect = _mt_gpufreq_input_disconnect,
  475. .name = "gpufreq_ib",
  476. .id_table = mt_gpufreq_ids,
  477. };
  478. #endif
  479. /**************************************
  480. * Random seed generated for test
  481. ***************************************/
  482. #ifdef MT_GPU_DVFS_RANDOM_TEST
  483. static int _mt_gpufreq_idx_get(int num)
  484. {
  485. int random = 0, mult = 0, idx;
  486. random = jiffies & 0xF;
  487. while (1) {
  488. if ((mult * num) >= random) {
  489. idx = (mult * num) - random;
  490. break;
  491. }
  492. mult++;
  493. }
  494. return idx;
  495. }
  496. #endif
  497. /**************************************
  498. * Convert pmic wrap register to voltage
  499. ***************************************/
  500. static unsigned int _mt_gpufreq_pmic_wrap_to_volt(unsigned int pmic_wrap_value)
  501. {
  502. unsigned int volt = 0;
  503. volt = (pmic_wrap_value * 625) + 60000;
  504. gpufreq_dbg("@%s: volt = %d\n", __func__, volt);
  505. /* 1.39375V */
  506. if (volt > 139375) {
  507. gpufreq_err("@%s: volt > 1.39375v!\n", __func__);
  508. return 139375;
  509. }
  510. return volt;
  511. }
  512. /**************************************
  513. * Convert voltage to pmic wrap register
  514. ***************************************/
  515. #if defined(MT_GPUFREQ_AEE_RR_REC) || defined(MT_GPUFREQ_PERFORMANCE_TEST)
  516. static unsigned int _mt_gpufreq_volt_to_pmic_wrap(unsigned int volt)
  517. {
  518. unsigned int reg_val = 0;
  519. reg_val = (volt - 60000) / 625;
  520. gpufreq_dbg("@%s: reg_val = %d\n", __func__, reg_val);
  521. if (reg_val > 0x7F) {
  522. gpufreq_err("@%s: reg_val > 0x7F!\n", __func__);
  523. return 0x7F;
  524. }
  525. return reg_val;
  526. }
  527. #endif
  528. /**************************************
  529. * Power table calculation
  530. ***************************************/
  531. static void _mt_gpufreq_power_calculation(unsigned int idx, unsigned int freq, unsigned int volt,
  532. unsigned int temp)
  533. {
  534. #ifdef CONFIG_ARCH_MT6753
  535. #define GPU_ACT_REF_POWER 1088 /* mW */
  536. #elif defined(CONFIG_ARCH_MT6735M)
  537. #define GPU_ACT_REF_POWER 360 /* mW */
  538. #else
  539. #define GPU_ACT_REF_POWER 720 /* mW */
  540. #endif
  541. #define GPU_ACT_REF_FREQ 450000 /* KHz */
  542. #define GPU_ACT_REF_VOLT 115000 /* mV x 100 */
  543. unsigned int p_total = 0, p_dynamic = 0, p_leakage = 0, ref_freq = 0, ref_volt = 0;
  544. p_dynamic = GPU_ACT_REF_POWER;
  545. ref_freq = GPU_ACT_REF_FREQ;
  546. ref_volt = GPU_ACT_REF_VOLT;
  547. p_dynamic = p_dynamic *
  548. ((freq * 100) / ref_freq) *
  549. ((volt * 100) / ref_volt) * ((volt * 100) / ref_volt) / (100 * 100 * 100);
  550. p_leakage = mt_spower_get_leakage(MT_SPOWER_VCORE, (volt / 100), temp);
  551. p_total = p_dynamic + p_leakage;
  552. gpufreq_ver("%d: p_dynamic = %d, p_leakage = %d, p_total = %d\n",
  553. idx, p_dynamic, p_leakage, p_total);
  554. mt_gpufreqs_power[idx].gpufreq_power = p_total;
  555. }
  556. #ifdef MT_GPUFREQ_DYNAMIC_POWER_TABLE_UPDATE
  557. static void _mt_update_gpufreqs_power_table(void)
  558. {
  559. int i = 0, temp = 0;
  560. unsigned int freq, volt;
  561. if (mt_gpufreq_ready == false) {
  562. gpufreq_dbg("@%s: GPU DVFS not ready\n", __func__);
  563. return;
  564. }
  565. #ifdef CONFIG_THERMAL
  566. temp = get_immediate_gpu_wrap() / 1000;
  567. #else
  568. temp = 40;
  569. #endif
  570. gpufreq_ver("@%s, temp = %d\n", __func__, temp);
  571. mutex_lock(&mt_gpufreq_lock);
  572. if ((temp > 0) && (temp < 125)) {
  573. for (i = 0; i < mt_gpufreqs_power_num; i++) {
  574. freq = mt_gpufreqs_power[i].gpufreq_khz;
  575. volt = mt_gpufreqs_power[i].gpufreq_volt;
  576. _mt_gpufreq_power_calculation(i, freq, volt, temp);
  577. gpufreq_ver("update mt_gpufreqs_power[%d].gpufreq_khz = %d\n", i,
  578. mt_gpufreqs_power[i].gpufreq_khz);
  579. gpufreq_ver("update mt_gpufreqs_power[%d].gpufreq_volt = %d\n", i,
  580. mt_gpufreqs_power[i].gpufreq_volt);
  581. gpufreq_ver("update mt_gpufreqs_power[%d].gpufreq_power = %d\n", i,
  582. mt_gpufreqs_power[i].gpufreq_power);
  583. }
  584. } else
  585. gpufreq_warn("@%s: temp < 0 or temp > 125, NOT update power table!\n", __func__);
  586. mutex_unlock(&mt_gpufreq_lock);
  587. }
  588. #endif
  589. static void _mt_setup_gpufreqs_power_table(int num)
  590. {
  591. int i, j, k, temp = 0;
  592. unsigned int freq, volt;
  593. mt_gpufreqs_power = kzalloc((num) * sizeof(struct mt_gpufreq_power_table_info), GFP_KERNEL);
  594. if (mt_gpufreqs_power == NULL) {
  595. /* gpufreq_err("GPU power table memory allocation fail\n"); */
  596. return;
  597. }
  598. #ifdef CONFIG_THERMAL
  599. temp = get_immediate_gpu_wrap() / 1000;
  600. #else
  601. temp = 40;
  602. #endif
  603. gpufreq_info("@%s: temp = %d\n", __func__, temp);
  604. if ((temp < 0) || (temp > 125)) {
  605. gpufreq_warn("@%s: temp < 0 or temp > 125!\n", __func__);
  606. temp = 65;
  607. }
  608. /* fill-in freq and volt in power table */
  609. for (i = 0, k = 0; i < mt_gpufreqs_num; i++) { /* freq */
  610. for (j = 0; j <= i; j++) { /* volt */
  611. mt_gpufreqs_power[k].gpufreq_khz = mt_gpufreqs[i].gpufreq_khz;
  612. mt_gpufreqs_power[k].gpufreq_volt = mt_gpufreqs[j].gpufreq_volt;
  613. k++;
  614. if (k == num)
  615. break;
  616. }
  617. if (k == num)
  618. break;
  619. }
  620. for (i = 0; i < num; i++) {
  621. freq = mt_gpufreqs_power[i].gpufreq_khz;
  622. volt = mt_gpufreqs_power[i].gpufreq_volt;
  623. _mt_gpufreq_power_calculation(i, freq, volt, temp);
  624. gpufreq_info("mt_gpufreqs_power[%d].gpufreq_khz = %u\n", i, freq);
  625. gpufreq_info("mt_gpufreqs_power[%d].gpufreq_volt = %u\n", i, volt);
  626. gpufreq_info("mt_gpufreqs_power[%d].gpufreq_power = %u\n", i,
  627. mt_gpufreqs_power[i].gpufreq_power);
  628. }
  629. #ifdef CONFIG_THERMAL
  630. mtk_gpufreq_register(mt_gpufreqs_power, num);
  631. #endif
  632. }
  633. /***********************************************
  634. * register frequency table to gpufreq subsystem
  635. ************************************************/
  636. static int _mt_setup_gpufreqs_table(struct mt_gpufreq_table_info *freqs, int num)
  637. {
  638. int i = 0;
  639. mt_gpufreqs = kzalloc((num) * sizeof(*freqs), GFP_KERNEL);
  640. mt_gpufreqs_default = kzalloc((num) * sizeof(*freqs), GFP_KERNEL);
  641. if (mt_gpufreqs == NULL)
  642. return -ENOMEM;
  643. for (i = 0; i < num; i++) {
  644. mt_gpufreqs[i].gpufreq_khz = freqs[i].gpufreq_khz;
  645. /* Apply PTPOD result */
  646. mt_gpufreqs[i].gpufreq_volt =
  647. _mt_gpufreq_pmic_wrap_to_volt(get_vcore_ptp_volt(freqs[i].gpufreq_volt * 10));
  648. mt_gpufreqs_default[i].gpufreq_khz = freqs[i].gpufreq_khz;
  649. mt_gpufreqs_default[i].gpufreq_volt = freqs[i].gpufreq_volt;
  650. gpufreq_info("mt_gpufreqs[%d].gpufreq_khz = %u\n", i, mt_gpufreqs[i].gpufreq_khz);
  651. gpufreq_info("mt_gpufreqs[%d].gpufreq_volt = %u\n", i, mt_gpufreqs[i].gpufreq_volt);
  652. }
  653. mt_gpufreqs_num = num;
  654. g_limited_max_id = 0;
  655. g_limited_min_id = mt_gpufreqs_num - 1;
  656. /* setup power table */
  657. mt_gpufreqs_power_num = (mt_gpufreqs_num) * (mt_gpufreqs_num + 1) / 2;
  658. _mt_setup_gpufreqs_power_table(mt_gpufreqs_power_num);
  659. return 0;
  660. }
  661. /*****************************
  662. * set GPU DVFS status
  663. ******************************/
  664. static int _mt_gpufreq_state_set(int enabled)
  665. {
  666. if (enabled) {
  667. if (!mt_gpufreq_pause) {
  668. gpufreq_dbg("gpufreq already enabled\n");
  669. return 0;
  670. }
  671. /*****************
  672. * enable GPU DVFS
  673. ******************/
  674. g_gpufreq_dvfs_disable_count--;
  675. gpufreq_dbg("enable GPU DVFS: g_gpufreq_dvfs_disable_count = %d\n",
  676. g_gpufreq_dvfs_disable_count);
  677. /***********************************************
  678. * enable DVFS if no any module still disable it
  679. ************************************************/
  680. if (g_gpufreq_dvfs_disable_count <= 0)
  681. mt_gpufreq_pause = false;
  682. else
  683. gpufreq_warn("someone still disable gpufreq, cannot enable it\n");
  684. } else {
  685. /******************
  686. * disable GPU DVFS
  687. *******************/
  688. g_gpufreq_dvfs_disable_count++;
  689. gpufreq_dbg("disable GPU DVFS: g_gpufreq_dvfs_disable_count = %d\n",
  690. g_gpufreq_dvfs_disable_count);
  691. if (mt_gpufreq_pause) {
  692. gpufreq_dbg("gpufreq already disabled\n");
  693. return 0;
  694. }
  695. mt_gpufreq_pause = true;
  696. }
  697. return 0;
  698. }
  699. static unsigned int _mt_gpufreq_dds_calc(unsigned int khz)
  700. {
  701. unsigned int dds = 0;
  702. if ((khz >= 250250) && (khz <= 747500))
  703. dds = ((khz * 4 / 1000) * 8192) / 13;
  704. else {
  705. gpufreq_err("@%s: target khz(%d) out of range!\n", __func__, khz);
  706. BUG();
  707. }
  708. return dds;
  709. }
  710. static void _mt_gpufreq_set_cur_freq(unsigned int freq_new)
  711. {
  712. unsigned int dds = _mt_gpufreq_dds_calc(freq_new);
  713. mt_dfs_mmpll(dds);
  714. gpufreq_dbg("@%s: freq_new = %d, dds = 0x%x\n", __func__, freq_new, dds);
  715. if (NULL != g_pFreqSampler)
  716. g_pFreqSampler(freq_new);
  717. }
  718. static int _mt_gpufreq_set_cur_volt(unsigned int new_oppidx)
  719. {
  720. gpufreq_dbg("@%s: new_oppidx = %d\n", __func__, new_oppidx);
  721. BUG_ON(new_oppidx >= mt_gpufreqs_num);
  722. #ifdef MT_GPUFREQ_VCOREFS_ENABLED
  723. switch (mt_gpufreqs[new_oppidx].gpufreq_khz) {
  724. #ifdef CONFIG_ARCH_MT6735M
  725. case GPU_DVFS_FREQ0_P:
  726. case GPU_DVFS_FREQ0_0:
  727. case GPU_DVFS_FREQ0:
  728. g_last_gpu_dvs_result = vcorefs_request_dvfs_opp(KIR_GPU, OPPI_PERF_ULTRA);
  729. #else
  730. case GPU_DVFS_FREQ0:
  731. #ifdef CONFIG_ARCH_MT6735
  732. case GPU_DVFS_FREQ0_1:
  733. #endif
  734. g_last_gpu_dvs_result = vcorefs_request_dvfs_opp(KIR_GPU, OPPI_PERF);
  735. #endif
  736. break;
  737. case GPU_DVFS_FREQ1:
  738. #ifdef CONFIG_ARCH_MT6753
  739. g_last_gpu_dvs_result = vcorefs_request_dvfs_opp(KIR_GPU, OPPI_LOW_PWR);
  740. #else
  741. g_last_gpu_dvs_result = vcorefs_request_dvfs_opp(KIR_GPU, OPPI_PERF);
  742. #endif
  743. break;
  744. case GPU_DVFS_FREQ2:
  745. g_last_gpu_dvs_result = vcorefs_request_dvfs_opp(KIR_GPU, OPPI_LOW_PWR);
  746. break;
  747. default:
  748. gpufreq_err("@%s: freq not found\n", __func__);
  749. g_last_gpu_dvs_result = 0x7F;
  750. break;
  751. }
  752. #endif
  753. if (g_last_gpu_dvs_result == 0) {
  754. unsigned int volt_new = mt_gpufreq_get_cur_volt();
  755. #ifdef MT_GPUFREQ_AEE_RR_REC
  756. aee_rr_rec_gpu_dvfs_vgpu(_mt_gpufreq_volt_to_pmic_wrap(volt_new));
  757. #endif
  758. if (NULL != g_pVoltSampler)
  759. g_pVoltSampler(volt_new);
  760. } else
  761. gpufreq_warn("@%s: GPU DVS failed, ret = %d\n", __func__, g_last_gpu_dvs_result);
  762. return g_last_gpu_dvs_result;
  763. }
  764. static unsigned int _mt_gpufreq_get_cur_freq(void)
  765. {
  766. unsigned int mmpll = 0;
  767. unsigned int freq = 0;
  768. mmpll = __raw_readl(MMPLL_CON1) & ~0x80000000;
  769. if ((mmpll >= 0x0209A000) && (mmpll <= 0x021CC000)) {
  770. freq = 0x0209A000;
  771. freq = 250250 + (((mmpll - freq) / 0x2000) * 3250);
  772. } else if ((mmpll >= 0x010E6000) && (mmpll <= 0x010F4000)) {
  773. freq = 0x010E6000;
  774. freq = 747500 + (((mmpll - freq) / 0x2000) * 6500);
  775. } else {
  776. gpufreq_err("Invalid mmpll value = 0x%x\n", mmpll);
  777. BUG();
  778. }
  779. gpufreq_dbg("mmpll = 0x%x, freq = %d\n", mmpll, freq);
  780. return freq; /* KHz */
  781. }
  782. static unsigned int _mt_gpufreq_get_cur_volt(void)
  783. {
  784. #ifdef MT_GPUFREQ_VCOREFS_ENABLED
  785. g_is_vcorefs_on = is_vcorefs_can_work();
  786. if (!can_do_gpu_dvs())
  787. return _mt_gpufreq_pmic_wrap_to_volt(pmic_get_register_value(PMIC_VCORE1_VOSEL_ON));
  788. else
  789. return vcorefs_get_curr_voltage() / 10;
  790. #else
  791. return _mt_gpufreq_pmic_wrap_to_volt(pmic_get_register_value(PMIC_VCORE1_VOSEL_ON));
  792. #endif
  793. }
  794. static void _mt_gpufreq_kick_pbm(int enable)
  795. {
  796. #ifndef DISABLE_PBM_FEATURE
  797. int i;
  798. int tmp_idx = -1;
  799. unsigned int found = 0;
  800. unsigned int power;
  801. unsigned int cur_volt = _mt_gpufreq_get_cur_volt();
  802. unsigned int cur_freq = _mt_gpufreq_get_cur_freq();
  803. if (enable) {
  804. for (i = 0; i < mt_gpufreqs_power_num; i++) {
  805. if (mt_gpufreqs_power[i].gpufreq_khz == cur_freq) {
  806. /* record idx since current voltage may not in DVFS table */
  807. tmp_idx = i;
  808. if (mt_gpufreqs_power[i].gpufreq_volt == cur_volt) {
  809. power = mt_gpufreqs_power[i].gpufreq_power;
  810. found = 1;
  811. kicker_pbm_by_gpu(true, power, cur_volt / 100);
  812. gpufreq_dbg("@%s: request GPU power = %d, cur_volt = %d, cur_freq = %d\n",
  813. __func__, power, cur_volt / 100, cur_freq);
  814. return;
  815. }
  816. }
  817. }
  818. if (!found) {
  819. gpufreq_dbg("@%s: tmp_idx = %d\n", __func__, tmp_idx);
  820. if (tmp_idx != -1 && tmp_idx < mt_gpufreqs_power_num) {
  821. /* use freq to found corresponding power budget */
  822. power = mt_gpufreqs_power[tmp_idx].gpufreq_power;
  823. kicker_pbm_by_gpu(true, power, cur_volt / 100);
  824. gpufreq_dbg("@%s: request GPU power = %d, cur_volt = %d, cur_freq = %d\n",
  825. __func__, power, cur_volt / 100, cur_freq);
  826. } else {
  827. gpufreq_warn("@%s: Cannot found request power in power table!\n",
  828. __func__);
  829. gpufreq_warn("cur_freq = %dKHz, cur_volt = %dmV\n", cur_freq,
  830. cur_volt / 100);
  831. }
  832. }
  833. } else {
  834. kicker_pbm_by_gpu(false, 0, cur_volt / 100);
  835. }
  836. #endif
  837. }
  838. /*****************************************
  839. * frequency ramp up and ramp down handler
  840. ******************************************/
  841. /***********************************************************
  842. * [note]
  843. * 1. frequency ramp up need to wait voltage settle
  844. * 2. frequency ramp down do not need to wait voltage settle
  845. ************************************************************/
  846. static int _mt_gpufreq_set(unsigned int freq_old, unsigned int freq_new, unsigned int new_oppidx)
  847. {
  848. int ret = 0;
  849. #ifdef MT_GPUFREQ_VCOREFS_ENABLED
  850. g_is_vcorefs_on = is_vcorefs_can_work();
  851. #endif
  852. if (freq_new > freq_old) {
  853. /* TODO: need to handle fix LPM case?? */
  854. if (can_do_gpu_dvs()) {
  855. ret = _mt_gpufreq_set_cur_volt(new_oppidx);
  856. /* Do DFS only when Vcore was set to HPM successfully */
  857. if (ret)
  858. return ret;
  859. }
  860. _mt_gpufreq_set_cur_freq(freq_new);
  861. } else {
  862. _mt_gpufreq_set_cur_freq(freq_new);
  863. if (can_do_gpu_dvs())
  864. _mt_gpufreq_set_cur_volt(new_oppidx);
  865. }
  866. _mt_gpufreq_kick_pbm(1);
  867. return 0;
  868. }
  869. /* Set frequency and voltage at driver probe function */
  870. static void _mt_gpufreq_set_initial(void)
  871. {
  872. unsigned int cur_volt = 0, cur_freq = 0;
  873. int i = 0;
  874. mutex_lock(&mt_gpufreq_lock);
  875. #ifdef MT_GPUFREQ_AEE_RR_REC
  876. aee_rr_rec_gpu_dvfs_status(aee_rr_curr_gpu_dvfs_status() | (1 << GPU_DVFS_IS_DOING_DVFS));
  877. #endif
  878. cur_volt = _mt_gpufreq_get_cur_volt();
  879. cur_freq = _mt_gpufreq_get_cur_freq();
  880. for (i = 0; i < mt_gpufreqs_num; i++) {
  881. if (cur_volt == mt_gpufreqs[i].gpufreq_volt) {
  882. _mt_gpufreq_set_cur_freq(mt_gpufreqs[i].gpufreq_khz);
  883. g_cur_gpu_OPPidx = i;
  884. gpufreq_dbg("init_idx = %d\n", g_cur_gpu_OPPidx);
  885. _mt_gpufreq_kick_pbm(1);
  886. break;
  887. }
  888. }
  889. /* Not found, set to LPM */
  890. if (i == mt_gpufreqs_num) {
  891. gpufreq_err("Set to LPM since GPU idx not found according to current Vcore = %d mV\n",
  892. cur_volt / 100);
  893. g_cur_gpu_OPPidx = mt_gpufreqs_num - 1;
  894. _mt_gpufreq_set(cur_freq, mt_gpufreqs[mt_gpufreqs_num - 1].gpufreq_khz,
  895. g_cur_gpu_OPPidx);
  896. }
  897. #ifdef MT_GPUFREQ_AEE_RR_REC
  898. aee_rr_rec_gpu_dvfs_oppidx(g_cur_gpu_OPPidx);
  899. aee_rr_rec_gpu_dvfs_status(aee_rr_curr_gpu_dvfs_status() & ~(1 << GPU_DVFS_IS_DOING_DVFS));
  900. #endif
  901. mutex_unlock(&mt_gpufreq_lock);
  902. }
  903. /************************************************
  904. * frequency adjust interface for thermal protect
  905. *************************************************/
  906. /******************************************************
  907. * parameter: target power
  908. *******************************************************/
  909. static int _mt_gpufreq_power_throttle_protect(void)
  910. {
  911. int ret = 0;
  912. int i = 0;
  913. unsigned int limited_index = 0;
  914. /* Check lowest frequency in all limitation */
  915. for (i = 0; i < NR_IDX_POWER_LIMITED; i++) {
  916. if (mt_gpufreq_power_limited_index_array[i] != 0 && limited_index == 0)
  917. limited_index = mt_gpufreq_power_limited_index_array[i];
  918. else if (mt_gpufreq_power_limited_index_array[i] != 0 && limited_index != 0) {
  919. if (mt_gpufreq_power_limited_index_array[i] > limited_index)
  920. limited_index = mt_gpufreq_power_limited_index_array[i];
  921. }
  922. gpufreq_dbg("mt_gpufreq_power_limited_index_array[%d] = %d\n", i,
  923. mt_gpufreq_power_limited_index_array[i]);
  924. }
  925. g_limited_max_id = limited_index;
  926. gpufreq_dbg("Final limit frequency upper bound to id = %d, frequency = %d\n",
  927. g_limited_max_id, mt_gpufreqs[g_limited_max_id].gpufreq_khz);
  928. if (NULL != g_pGpufreq_power_limit_notify)
  929. g_pGpufreq_power_limit_notify(g_limited_max_id);
  930. return ret;
  931. }
  932. #ifdef MT_GPUFREQ_OC_PROTECT
  933. /************************************************
  934. * GPU frequency adjust interface for oc protect
  935. *************************************************/
  936. static void _mt_gpufreq_oc_protect(unsigned int limited_index)
  937. {
  938. mutex_lock(&mt_gpufreq_power_lock);
  939. gpufreq_dbg("@%s: limited_index = %d\n", __func__, limited_index);
  940. mt_gpufreq_power_limited_index_array[IDX_OC_LIMITED] = limited_index;
  941. _mt_gpufreq_power_throttle_protect();
  942. mutex_unlock(&mt_gpufreq_power_lock);
  943. }
  944. void mt_gpufreq_oc_callback(BATTERY_OC_LEVEL oc_level)
  945. {
  946. gpufreq_dbg("@%s: oc_level = %d\n", __func__, oc_level);
  947. if (mt_gpufreq_ready == false) {
  948. gpufreq_dbg("@%s: GPU DVFS not ready!\n", __func__);
  949. return;
  950. }
  951. if (g_limited_oc_ignore_state == true) {
  952. gpufreq_info("@%s: g_limited_oc_ignore_state == true!\n", __func__);
  953. return;
  954. }
  955. mt_gpufreq_oc_level = oc_level;
  956. /* BATTERY_OC_LEVEL_1: >= 7A, BATTERY_OC_LEVEL_0: < 7A */
  957. if (oc_level == BATTERY_OC_LEVEL_1) {
  958. if (mt_gpufreq_oc_limited_index != mt_gpufreq_oc_limited_index_1) {
  959. mt_gpufreq_oc_limited_index = mt_gpufreq_oc_limited_index_1;
  960. _mt_gpufreq_oc_protect(mt_gpufreq_oc_limited_index_1);
  961. }
  962. }
  963. /* unlimit gpu */
  964. else {
  965. if (mt_gpufreq_oc_limited_index != mt_gpufreq_oc_limited_index_0) {
  966. mt_gpufreq_oc_limited_index = mt_gpufreq_oc_limited_index_0;
  967. _mt_gpufreq_oc_protect(mt_gpufreq_oc_limited_index_0);
  968. }
  969. }
  970. }
  971. #endif
  972. #ifdef MT_GPUFREQ_LOW_BATT_VOLUME_PROTECT
  973. /************************************************
  974. * GPU frequency adjust interface for low bat_volume protect
  975. *************************************************/
  976. static void _mt_gpufreq_low_batt_volume_protect(unsigned int limited_index)
  977. {
  978. mutex_lock(&mt_gpufreq_power_lock);
  979. gpufreq_dbg("@%s: limited_index = %d\n", __func__, limited_index);
  980. mt_gpufreq_power_limited_index_array[IDX_LOW_BATT_VOLUME_LIMITED] = limited_index;
  981. _mt_gpufreq_power_throttle_protect();
  982. mutex_unlock(&mt_gpufreq_power_lock);
  983. }
  984. void mt_gpufreq_low_batt_volume_callback(BATTERY_PERCENT_LEVEL low_battery_volume)
  985. {
  986. gpufreq_dbg("@%s: low_battery_volume = %d\n", __func__, low_battery_volume);
  987. if (mt_gpufreq_ready == false) {
  988. gpufreq_dbg("@%s: GPU DVFS not ready!\n", __func__);
  989. return;
  990. }
  991. if (g_limited_low_batt_volume_ignore_state == true) {
  992. gpufreq_info("@%s: g_limited_low_batt_volume_ignore_state == true!\n", __func__);
  993. return;
  994. }
  995. mt_gpufreq_low_battery_volume = low_battery_volume;
  996. /* LOW_BATTERY_VOLUME_1: <= 15%, LOW_BATTERY_VOLUME_0: >15% */
  997. if (low_battery_volume == BATTERY_PERCENT_LEVEL_1) {
  998. if (mt_gpufreq_low_batt_volume_limited_index !=
  999. mt_gpufreq_low_bat_volume_limited_index_1) {
  1000. mt_gpufreq_low_batt_volume_limited_index =
  1001. mt_gpufreq_low_bat_volume_limited_index_1;
  1002. _mt_gpufreq_low_batt_volume_protect(mt_gpufreq_low_bat_volume_limited_index_1);
  1003. }
  1004. }
  1005. /* unlimit gpu */
  1006. else {
  1007. if (mt_gpufreq_low_batt_volume_limited_index !=
  1008. mt_gpufreq_low_bat_volume_limited_index_0) {
  1009. mt_gpufreq_low_batt_volume_limited_index =
  1010. mt_gpufreq_low_bat_volume_limited_index_0;
  1011. _mt_gpufreq_low_batt_volume_protect(mt_gpufreq_low_bat_volume_limited_index_0);
  1012. }
  1013. }
  1014. }
  1015. #endif
  1016. #ifdef MT_GPUFREQ_LOW_BATT_VOLT_PROTECT
  1017. /************************************************
  1018. * GPU frequency adjust interface for low bat_volt protect
  1019. *************************************************/
  1020. static void _mt_gpufreq_low_batt_volt_protect(unsigned int limited_index)
  1021. {
  1022. mutex_lock(&mt_gpufreq_power_lock);
  1023. gpufreq_dbg("@%s: limited_index = %d\n", __func__, limited_index);
  1024. mt_gpufreq_power_limited_index_array[IDX_LOW_BATT_VOLT_LIMITED] = limited_index;
  1025. _mt_gpufreq_power_throttle_protect();
  1026. mutex_unlock(&mt_gpufreq_power_lock);
  1027. }
  1028. /******************************************************
  1029. * parameter: low_battery_level
  1030. *******************************************************/
  1031. void mt_gpufreq_low_batt_volt_callback(LOW_BATTERY_LEVEL low_battery_level)
  1032. {
  1033. gpufreq_dbg("@%s: low_battery_level = %d\n", __func__, low_battery_level);
  1034. if (mt_gpufreq_ready == false) {
  1035. gpufreq_dbg("@%s: GPU DVFS not ready!\n", __func__);
  1036. return;
  1037. }
  1038. if (g_limited_low_batt_volt_ignore_state == true) {
  1039. gpufreq_info("@%s: g_limited_low_batt_volt_ignore_state == true!\n", __func__);
  1040. return;
  1041. }
  1042. mt_gpufreq_low_battery_level = low_battery_level;
  1043. #if 0 /* no need to throttle when LV1 */
  1044. if (low_battery_level == LOW_BATTERY_LEVEL_1) {
  1045. if (mt_gpufreq_low_batt_volt_limited_index !=
  1046. mt_gpufreq_low_bat_volt_limited_index_1) {
  1047. mt_gpufreq_low_batt_volt_limited_index =
  1048. mt_gpufreq_low_bat_volt_limited_index_1;
  1049. _mt_gpufreq_low_batt_volt_protect(mt_gpufreq_low_bat_volt_limited_index_1);
  1050. }
  1051. } else
  1052. #endif
  1053. if (low_battery_level == LOW_BATTERY_LEVEL_2) {
  1054. if (mt_gpufreq_low_batt_volt_limited_index !=
  1055. mt_gpufreq_low_bat_volt_limited_index_2) {
  1056. mt_gpufreq_low_batt_volt_limited_index =
  1057. mt_gpufreq_low_bat_volt_limited_index_2;
  1058. _mt_gpufreq_low_batt_volt_protect(mt_gpufreq_low_bat_volt_limited_index_2);
  1059. }
  1060. }
  1061. /* unlimit gpu */
  1062. else {
  1063. if (mt_gpufreq_low_batt_volt_limited_index !=
  1064. mt_gpufreq_low_bat_volt_limited_index_0) {
  1065. mt_gpufreq_low_batt_volt_limited_index =
  1066. mt_gpufreq_low_bat_volt_limited_index_0;
  1067. _mt_gpufreq_low_batt_volt_protect(mt_gpufreq_low_bat_volt_limited_index_0);
  1068. }
  1069. }
  1070. }
  1071. #endif
  1072. /************************************************
  1073. * frequency adjust interface for thermal protect
  1074. *************************************************/
  1075. /******************************************************
  1076. * parameter: target power
  1077. *******************************************************/
  1078. static unsigned int _mt_gpufreq_get_limited_freq(unsigned int limited_power)
  1079. {
  1080. int i = 0;
  1081. unsigned int limited_freq = 0;
  1082. unsigned int found = 0;
  1083. for (i = 0; i < mt_gpufreqs_power_num; i++) {
  1084. if (mt_gpufreqs_power[i].gpufreq_power <= limited_power) {
  1085. limited_freq = mt_gpufreqs_power[i].gpufreq_khz;
  1086. found = 1;
  1087. break;
  1088. }
  1089. }
  1090. /* not found */
  1091. if (!found)
  1092. limited_freq = mt_gpufreqs_power[mt_gpufreqs_power_num - 1].gpufreq_khz;
  1093. gpufreq_dbg("@%s: limited_freq = %d\n", __func__, limited_freq);
  1094. return limited_freq;
  1095. }
  1096. void mt_gpufreq_thermal_protect(unsigned int limited_power)
  1097. {
  1098. int i = 0;
  1099. unsigned int limited_freq = 0;
  1100. mutex_lock(&mt_gpufreq_power_lock);
  1101. if (mt_gpufreq_ready == false) {
  1102. gpufreq_dbg("@%s: GPU DVFS not ready!\n", __func__);
  1103. mutex_unlock(&mt_gpufreq_power_lock);
  1104. return;
  1105. }
  1106. if (mt_gpufreqs_num == 0) {
  1107. gpufreq_warn("@%s: mt_gpufreqs_num == 0!\n", __func__);
  1108. mutex_unlock(&mt_gpufreq_power_lock);
  1109. return;
  1110. }
  1111. if (g_limited_thermal_ignore_state == true) {
  1112. gpufreq_info("@%s: g_limited_thermal_ignore_state == true!\n", __func__);
  1113. mutex_unlock(&mt_gpufreq_power_lock);
  1114. return;
  1115. }
  1116. mt_gpufreq_thermal_limited_gpu_power = limited_power;
  1117. gpufreq_dbg("@%s: limited_power = %d\n", __func__, limited_power);
  1118. #ifdef MT_GPUFREQ_DYNAMIC_POWER_TABLE_UPDATE
  1119. _mt_update_gpufreqs_power_table();
  1120. #endif
  1121. if (limited_power == 0)
  1122. mt_gpufreq_power_limited_index_array[IDX_THERMAL_LIMITED] = 0;
  1123. else {
  1124. limited_freq = _mt_gpufreq_get_limited_freq(limited_power);
  1125. for (i = 0; i < mt_gpufreqs_num; i++) {
  1126. if (mt_gpufreqs[i].gpufreq_khz <= limited_freq) {
  1127. mt_gpufreq_power_limited_index_array[IDX_THERMAL_LIMITED] = i;
  1128. break;
  1129. }
  1130. }
  1131. }
  1132. gpufreq_dbg("Thermal limit frequency upper bound to id = %d\n",
  1133. mt_gpufreq_power_limited_index_array[IDX_THERMAL_LIMITED]);
  1134. _mt_gpufreq_power_throttle_protect();
  1135. mutex_unlock(&mt_gpufreq_power_lock);
  1136. }
  1137. EXPORT_SYMBOL(mt_gpufreq_thermal_protect);
  1138. /* for thermal to update power budget */
  1139. unsigned int mt_gpufreq_get_max_power(void)
  1140. {
  1141. if (!mt_gpufreqs_power)
  1142. return 0;
  1143. else
  1144. return mt_gpufreqs_power[0].gpufreq_power;
  1145. }
  1146. /* for thermal to update power budget */
  1147. unsigned int mt_gpufreq_get_min_power(void)
  1148. {
  1149. if (!mt_gpufreqs_power)
  1150. return 0;
  1151. else
  1152. return mt_gpufreqs_power[mt_gpufreqs_power_num - 1].gpufreq_power;
  1153. }
  1154. void mt_gpufreq_set_power_limit_by_pbm(unsigned int limited_power)
  1155. {
  1156. #ifndef DISABLE_PBM_FEATURE
  1157. int i = 0;
  1158. unsigned int limited_freq = 0;
  1159. mutex_lock(&mt_gpufreq_power_lock);
  1160. if (mt_gpufreq_ready == false) {
  1161. gpufreq_dbg("@%s: GPU DVFS not ready!\n", __func__);
  1162. mutex_unlock(&mt_gpufreq_power_lock);
  1163. return;
  1164. }
  1165. if (mt_gpufreqs_num == 0) {
  1166. gpufreq_warn("@%s: mt_gpufreqs_num == 0!\n", __func__);
  1167. mutex_unlock(&mt_gpufreq_power_lock);
  1168. return;
  1169. }
  1170. if (g_limited_pbm_ignore_state == true) {
  1171. gpufreq_info("@%s: g_limited_pbm_ignore_state == true!\n", __func__);
  1172. mutex_unlock(&mt_gpufreq_power_lock);
  1173. return;
  1174. }
  1175. if (limited_power == mt_gpufreq_pbm_limited_gpu_power) {
  1176. gpufreq_dbg("@%s: limited_power(%d mW) not changed, skip it!\n",
  1177. __func__, limited_power);
  1178. mutex_unlock(&mt_gpufreq_power_lock);
  1179. return;
  1180. }
  1181. mt_gpufreq_pbm_limited_gpu_power = limited_power;
  1182. gpufreq_dbg("@%s: limited_power = %d\n", __func__, limited_power);
  1183. #ifdef MT_GPUFREQ_DYNAMIC_POWER_TABLE_UPDATE
  1184. _mt_update_gpufreqs_power_table(); /* TODO: need to check overhead? */
  1185. #endif
  1186. if (limited_power == 0)
  1187. mt_gpufreq_pbm_limited_index = 0;
  1188. else {
  1189. limited_freq = _mt_gpufreq_get_limited_freq(limited_power);
  1190. for (i = 0; i < mt_gpufreqs_num; i++) {
  1191. if (mt_gpufreqs[i].gpufreq_khz <= limited_freq) {
  1192. mt_gpufreq_pbm_limited_index = i;
  1193. break;
  1194. }
  1195. }
  1196. }
  1197. gpufreq_dbg("PBM limit frequency upper bound to id = %d\n", mt_gpufreq_pbm_limited_index);
  1198. if (NULL != g_pGpufreq_power_limit_notify)
  1199. g_pGpufreq_power_limit_notify(mt_gpufreq_pbm_limited_index);
  1200. mutex_unlock(&mt_gpufreq_power_lock);
  1201. #endif
  1202. }
  1203. unsigned int mt_gpufreq_get_leakage_mw(void)
  1204. {
  1205. #ifndef DISABLE_PBM_FEATURE
  1206. int temp = 0;
  1207. unsigned int cur_vcore = _mt_gpufreq_get_cur_volt() / 100;
  1208. #ifdef CONFIG_THERMAL
  1209. temp = get_immediate_gpu_wrap() / 1000;
  1210. #else
  1211. temp = 40;
  1212. #endif
  1213. return mt_spower_get_leakage(MT_SPOWER_VCORE, cur_vcore, temp);
  1214. #else
  1215. return 0;
  1216. #endif
  1217. }
  1218. /************************************************
  1219. * return current GPU thermal limit index
  1220. *************************************************/
  1221. unsigned int mt_gpufreq_get_thermal_limit_index(void)
  1222. {
  1223. gpufreq_dbg("current GPU thermal limit index is %d\n", g_limited_max_id);
  1224. return g_limited_max_id;
  1225. }
  1226. EXPORT_SYMBOL(mt_gpufreq_get_thermal_limit_index);
  1227. /************************************************
  1228. * return current GPU thermal limit frequency
  1229. *************************************************/
  1230. unsigned int mt_gpufreq_get_thermal_limit_freq(void)
  1231. {
  1232. gpufreq_dbg("current GPU thermal limit freq is %d MHz\n",
  1233. mt_gpufreqs[g_limited_max_id].gpufreq_khz / 1000);
  1234. return mt_gpufreqs[g_limited_max_id].gpufreq_khz;
  1235. }
  1236. EXPORT_SYMBOL(mt_gpufreq_get_thermal_limit_freq);
  1237. /**********************************
  1238. * gpufreq target callback function
  1239. ***********************************/
  1240. /*************************************************
  1241. * [note]
  1242. * 1. handle frequency change request
  1243. * 2. call mt_gpufreq_set to set target frequency
  1244. **************************************************/
  1245. int mt_gpufreq_target(unsigned int idx)
  1246. {
  1247. /* unsigned long flags; */
  1248. unsigned int target_freq, target_volt, target_OPPidx;
  1249. unsigned int cur_freq;
  1250. int ret = 0;
  1251. #ifdef MT_GPUFREQ_PERFORMANCE_TEST
  1252. return 0;
  1253. #endif
  1254. mutex_lock(&mt_gpufreq_lock);
  1255. if (mt_gpufreq_ready == false) {
  1256. gpufreq_dbg("GPU DVFS not ready!\n");
  1257. mutex_unlock(&mt_gpufreq_lock);
  1258. return -ENOSYS;
  1259. }
  1260. if (mt_gpufreq_volt_enable_state == 0) {
  1261. gpufreq_dbg("mt_gpufreq_volt_enable_state == 0! return\n");
  1262. mutex_unlock(&mt_gpufreq_lock);
  1263. return -ENOSYS;
  1264. }
  1265. #ifdef MT_GPU_DVFS_RANDOM_TEST
  1266. idx = _mt_gpufreq_idx_get(5);
  1267. gpufreq_dbg("@%s: random test index is %d !\n", __func__, idx);
  1268. #endif
  1269. if (idx > (mt_gpufreqs_num - 1)) {
  1270. mutex_unlock(&mt_gpufreq_lock);
  1271. gpufreq_err("@%s: idx out of range! idx = %d\n", __func__, idx);
  1272. return -1;
  1273. }
  1274. /************************************************
  1275. * If /proc command fix the frequency.
  1276. *************************************************/
  1277. if (mt_gpufreq_fixed_freq_state == true) {
  1278. mutex_unlock(&mt_gpufreq_lock);
  1279. gpufreq_info("@%s: GPU freq is fixed by user! fixed_freq = %dKHz\n", __func__,
  1280. mt_gpufreq_fixed_frequency);
  1281. return 0;
  1282. }
  1283. /**********************************
  1284. * look up for the target GPU OPP
  1285. ***********************************/
  1286. target_freq = mt_gpufreqs[idx].gpufreq_khz;
  1287. target_volt = mt_gpufreqs[idx].gpufreq_volt;
  1288. target_OPPidx = idx;
  1289. gpufreq_dbg("@%s: begin, receive freq: %d, OPPidx: %d\n",
  1290. __func__, target_freq, target_OPPidx);
  1291. /**********************************
  1292. * Check if need to keep max frequency
  1293. ***********************************/
  1294. if (mt_gpufreq_keep_max_frequency_state == true) {
  1295. target_freq = mt_gpufreqs[g_gpufreq_max_id].gpufreq_khz;
  1296. target_volt = mt_gpufreqs[g_gpufreq_max_id].gpufreq_volt;
  1297. target_OPPidx = g_gpufreq_max_id;
  1298. gpufreq_dbg("Keep MAX frequency %d !\n", target_freq);
  1299. }
  1300. /************************************************
  1301. * If /proc command keep opp frequency.
  1302. *************************************************/
  1303. if (mt_gpufreq_keep_opp_frequency_state == true) {
  1304. target_freq = mt_gpufreqs[mt_gpufreq_keep_opp_index].gpufreq_khz;
  1305. target_volt = mt_gpufreqs[mt_gpufreq_keep_opp_index].gpufreq_volt;
  1306. target_OPPidx = mt_gpufreq_keep_opp_index;
  1307. gpufreq_dbg("Keep opp! opp frequency %d, opp voltage %d, opp idx %d\n",
  1308. target_freq, target_volt, target_OPPidx);
  1309. }
  1310. /************************************************
  1311. * If /proc command keep opp max frequency.
  1312. *************************************************/
  1313. if (mt_gpufreq_opp_max_frequency_state == true) {
  1314. if (target_freq > mt_gpufreq_opp_max_frequency) {
  1315. target_freq = mt_gpufreqs[mt_gpufreq_opp_max_index].gpufreq_khz;
  1316. target_volt = mt_gpufreqs[mt_gpufreq_opp_max_index].gpufreq_volt;
  1317. target_OPPidx = mt_gpufreq_opp_max_index;
  1318. gpufreq_dbg("opp max freq! opp max frequency %d, opp max voltage %d, opp max idx %d\n",
  1319. target_freq, target_volt, target_OPPidx);
  1320. }
  1321. }
  1322. /************************************************
  1323. * PBM limit
  1324. *************************************************/
  1325. #ifndef DISABLE_PBM_FEATURE
  1326. if (mt_gpufreq_pbm_limited_index != 0) {
  1327. if (target_freq > mt_gpufreqs[mt_gpufreq_pbm_limited_index].gpufreq_khz) {
  1328. /*********************************************
  1329. * target_freq > limited_freq, need to adjust
  1330. **********************************************/
  1331. target_freq = mt_gpufreqs[mt_gpufreq_pbm_limited_index].gpufreq_khz;
  1332. target_volt = mt_gpufreqs[mt_gpufreq_pbm_limited_index].gpufreq_volt;
  1333. target_OPPidx = mt_gpufreq_pbm_limited_index;
  1334. gpufreq_dbg("Limit! Thermal/Power limit gpu frequency %d\n",
  1335. mt_gpufreqs[mt_gpufreq_pbm_limited_index].gpufreq_khz);
  1336. }
  1337. }
  1338. #endif
  1339. /************************************************
  1340. * Thermal/Power limit
  1341. *************************************************/
  1342. if (g_limited_max_id != 0) {
  1343. if (target_freq > mt_gpufreqs[g_limited_max_id].gpufreq_khz) {
  1344. /*********************************************
  1345. * target_freq > limited_freq, need to adjust
  1346. **********************************************/
  1347. target_freq = mt_gpufreqs[g_limited_max_id].gpufreq_khz;
  1348. target_volt = mt_gpufreqs[g_limited_max_id].gpufreq_volt;
  1349. target_OPPidx = g_limited_max_id;
  1350. gpufreq_dbg("Limit! Thermal/Power limit gpu frequency %d\n",
  1351. mt_gpufreqs[g_limited_max_id].gpufreq_khz);
  1352. }
  1353. }
  1354. #if defined(CONFIG_ARCH_MT6735M) && defined(MT_GPUFREQ_VCOREFS_ENABLED)
  1355. /************************************************
  1356. * If 550MHz is exist, mask it when vcorefs is disabled
  1357. *************************************************/
  1358. g_is_vcorefs_on = is_vcorefs_can_work();
  1359. if ((!can_do_gpu_dvs()) && (mt_gpufreq_dvfs_table_type == 0 || mt_gpufreq_dvfs_table_type == 2)) {
  1360. if (target_freq > mt_gpufreqs[g_gpufreq_max_id_vcorefs_off].gpufreq_khz) {
  1361. /*********************************************
  1362. * target_freq > limited_freq, need to adjust
  1363. **********************************************/
  1364. target_freq = mt_gpufreqs[g_gpufreq_max_id_vcorefs_off].gpufreq_khz;
  1365. target_volt = mt_gpufreqs[g_gpufreq_max_id_vcorefs_off].gpufreq_volt;
  1366. target_OPPidx = g_gpufreq_max_id_vcorefs_off;
  1367. gpufreq_dbg("Limit! Limit gpu frequency %d due to Vcore DVFS disabled\n",
  1368. mt_gpufreqs[g_gpufreq_max_id_vcorefs_off].gpufreq_khz);
  1369. }
  1370. }
  1371. #endif
  1372. /************************************************
  1373. * target frequency == current frequency, skip it
  1374. *************************************************/
  1375. cur_freq = _mt_gpufreq_get_cur_freq();
  1376. if (cur_freq == target_freq) {
  1377. mutex_unlock(&mt_gpufreq_lock);
  1378. gpufreq_dbg("GPU frequency from %d KHz to %d KHz (skipped) due to same frequency\n",
  1379. cur_freq, target_freq);
  1380. return 0;
  1381. }
  1382. gpufreq_dbg("GPU current frequency %d KHz, target frequency %d KHz\n",
  1383. cur_freq, target_freq);
  1384. #ifdef MT_GPUFREQ_AEE_RR_REC
  1385. aee_rr_rec_gpu_dvfs_status(aee_rr_curr_gpu_dvfs_status() | (1 << GPU_DVFS_IS_DOING_DVFS));
  1386. #endif
  1387. /******************************
  1388. * set to the target frequency
  1389. *******************************/
  1390. ret = _mt_gpufreq_set(cur_freq, target_freq, target_OPPidx);
  1391. if (!ret)
  1392. g_cur_gpu_OPPidx = target_OPPidx;
  1393. #ifdef MT_GPUFREQ_AEE_RR_REC
  1394. aee_rr_rec_gpu_dvfs_oppidx(g_cur_gpu_OPPidx);
  1395. aee_rr_rec_gpu_dvfs_status(aee_rr_curr_gpu_dvfs_status() & ~(1 << GPU_DVFS_IS_DOING_DVFS));
  1396. #endif
  1397. mutex_unlock(&mt_gpufreq_lock);
  1398. return ret;
  1399. }
  1400. EXPORT_SYMBOL(mt_gpufreq_target);
  1401. /* Set VGPU enable/disable when GPU clock be switched on/off */
  1402. int mt_gpufreq_voltage_enable_set(unsigned int enable)
  1403. {
  1404. int ret = 0;
  1405. gpufreq_dbg("@%s: enable = %x\n", __func__, enable);
  1406. mutex_lock(&mt_gpufreq_lock);
  1407. if (mt_gpufreq_ready == false) {
  1408. gpufreq_dbg("@%s: GPU DVFS not ready!\n", __func__);
  1409. mutex_unlock(&mt_gpufreq_lock);
  1410. return -ENOSYS;
  1411. }
  1412. if (enable == mt_gpufreq_volt_enable_state) {
  1413. mutex_unlock(&mt_gpufreq_lock);
  1414. return 0;
  1415. }
  1416. #ifdef MT_GPUFREQ_VCOREFS_ENABLED
  1417. g_is_vcorefs_on = is_vcorefs_can_work();
  1418. if (!can_do_gpu_dvs())
  1419. goto done;
  1420. if (enable == 0)
  1421. vcorefs_request_dvfs_opp(KIR_GPU, OPPI_UNREQ);
  1422. else {
  1423. unsigned int cur_volt = _mt_gpufreq_get_cur_volt();
  1424. int need_kick_pbm = 0;
  1425. if (cur_volt != mt_gpufreqs[g_cur_gpu_OPPidx].gpufreq_volt)
  1426. need_kick_pbm = 1; /* Vcore changed, need to kick PBM */
  1427. ret = _mt_gpufreq_set_cur_volt(g_cur_gpu_OPPidx);
  1428. if (ret) {
  1429. unsigned int cur_freq = _mt_gpufreq_get_cur_freq();
  1430. gpufreq_err("@%s: Set Vcore to %dmV failed! ret = 0x%x, cur_freq = %d\n",
  1431. __func__,
  1432. mt_gpufreqs[g_cur_gpu_OPPidx].gpufreq_volt / 100,
  1433. ret,
  1434. cur_freq
  1435. );
  1436. /* Raise Vcore failed, set GPU freq to corresponding LV */
  1437. if (cur_volt < mt_gpufreqs[g_cur_gpu_OPPidx].gpufreq_volt) {
  1438. unsigned int i;
  1439. for (i = 0; i < mt_gpufreqs_num; i++) {
  1440. if (cur_volt == mt_gpufreqs[i].gpufreq_volt) {
  1441. _mt_gpufreq_set_cur_freq(mt_gpufreqs[i].gpufreq_khz);
  1442. g_cur_gpu_OPPidx = i;
  1443. }
  1444. }
  1445. if (i == mt_gpufreqs_num) {
  1446. gpufreq_err("@%s: Volt not found, set to lowest freq!\n",
  1447. __func__);
  1448. _mt_gpufreq_set_cur_freq(
  1449. mt_gpufreqs[mt_gpufreqs_num - 1].gpufreq_khz);
  1450. g_cur_gpu_OPPidx = mt_gpufreqs_num - 1;
  1451. }
  1452. }
  1453. }
  1454. if (need_kick_pbm)
  1455. _mt_gpufreq_kick_pbm(1);
  1456. }
  1457. done:
  1458. #endif
  1459. mt_gpufreq_volt_enable_state = enable;
  1460. mutex_unlock(&mt_gpufreq_lock);
  1461. #if 0
  1462. /* Notify PBM only when VGPU switch on/off */
  1463. if (enable == 1 && state_orig == 0)
  1464. _mt_gpufreq_kick_pbm(1);
  1465. else if (enable == 0 && state_orig == 1)
  1466. _mt_gpufreq_kick_pbm(0);
  1467. #endif
  1468. return ret;
  1469. }
  1470. EXPORT_SYMBOL(mt_gpufreq_voltage_enable_set);
  1471. unsigned int mt_gpufreq_get_dvfs_table_num(void)
  1472. {
  1473. return mt_gpufreqs_num;
  1474. }
  1475. EXPORT_SYMBOL(mt_gpufreq_get_dvfs_table_num);
  1476. unsigned int mt_gpufreq_get_freq_by_idx(unsigned int idx)
  1477. {
  1478. if (mt_gpufreq_ready == false) {
  1479. gpufreq_dbg("@%s: GPU DVFS not ready!\n", __func__);
  1480. return -ENOSYS;
  1481. }
  1482. if (idx < mt_gpufreqs_num) {
  1483. gpufreq_dbg("@%s: idx = %d, frequency= %d\n", __func__, idx,
  1484. mt_gpufreqs[idx].gpufreq_khz);
  1485. return mt_gpufreqs[idx].gpufreq_khz;
  1486. }
  1487. gpufreq_dbg("@%s: idx = %d, NOT found! return 0!\n", __func__, idx);
  1488. return 0;
  1489. }
  1490. EXPORT_SYMBOL(mt_gpufreq_get_freq_by_idx);
  1491. /************************************************
  1492. * return current GPU frequency index
  1493. *************************************************/
  1494. unsigned int mt_gpufreq_get_cur_freq_index(void)
  1495. {
  1496. gpufreq_dbg("current GPU frequency OPP index is %d\n", g_cur_gpu_OPPidx);
  1497. return g_cur_gpu_OPPidx;
  1498. }
  1499. EXPORT_SYMBOL(mt_gpufreq_get_cur_freq_index);
  1500. /************************************************
  1501. * return current GPU frequency
  1502. *************************************************/
  1503. unsigned int mt_gpufreq_get_cur_freq(void)
  1504. {
  1505. return _mt_gpufreq_get_cur_freq();
  1506. }
  1507. EXPORT_SYMBOL(mt_gpufreq_get_cur_freq);
  1508. /************************************************
  1509. * return current GPU voltage
  1510. *************************************************/
  1511. unsigned int mt_gpufreq_get_cur_volt(void)
  1512. {
  1513. return _mt_gpufreq_get_cur_volt();
  1514. }
  1515. EXPORT_SYMBOL(mt_gpufreq_get_cur_volt);
  1516. /************************************************
  1517. * register / unregister GPU input boost notifiction CB
  1518. *************************************************/
  1519. void mt_gpufreq_input_boost_notify_registerCB(gpufreq_input_boost_notify pCB)
  1520. {
  1521. #ifdef MT_GPUFREQ_INPUT_BOOST
  1522. g_pGpufreq_input_boost_notify = pCB;
  1523. #endif
  1524. }
  1525. EXPORT_SYMBOL(mt_gpufreq_input_boost_notify_registerCB);
  1526. /************************************************
  1527. * register / unregister GPU power limit notifiction CB
  1528. *************************************************/
  1529. void mt_gpufreq_power_limit_notify_registerCB(gpufreq_power_limit_notify pCB)
  1530. {
  1531. g_pGpufreq_power_limit_notify = pCB;
  1532. }
  1533. EXPORT_SYMBOL(mt_gpufreq_power_limit_notify_registerCB);
  1534. /************************************************
  1535. * register / unregister set GPU freq CB
  1536. *************************************************/
  1537. void mt_gpufreq_setfreq_registerCB(sampler_func pCB)
  1538. {
  1539. g_pFreqSampler = pCB;
  1540. }
  1541. EXPORT_SYMBOL(mt_gpufreq_setfreq_registerCB);
  1542. /************************************************
  1543. * register / unregister set GPU volt CB
  1544. *************************************************/
  1545. void mt_gpufreq_setvolt_registerCB(sampler_func pCB)
  1546. {
  1547. g_pVoltSampler = pCB;
  1548. }
  1549. EXPORT_SYMBOL(mt_gpufreq_setvolt_registerCB);
  1550. static int _mt_gpufreq_pm_restore_early(struct device *dev)
  1551. {
  1552. int i = 0;
  1553. int found = 0;
  1554. unsigned int cur_freq = _mt_gpufreq_get_cur_freq();
  1555. for (i = 0; i < mt_gpufreqs_num; i++) {
  1556. if (cur_freq == mt_gpufreqs[i].gpufreq_khz) {
  1557. g_cur_gpu_OPPidx = i;
  1558. found = 1;
  1559. gpufreq_dbg("match g_cur_gpu_OPPidx: %d\n", g_cur_gpu_OPPidx);
  1560. break;
  1561. }
  1562. }
  1563. if (found == 0) {
  1564. g_cur_gpu_OPPidx = 0;
  1565. gpufreq_err("gpu freq not found, set parameter to max freq\n");
  1566. }
  1567. gpufreq_dbg("GPU freq: %d\n", cur_freq);
  1568. gpufreq_dbg("g_cur_gpu_OPPidx: %d\n", g_cur_gpu_OPPidx);
  1569. return 0;
  1570. }
  1571. static int _mt_gpufreq_pdrv_probe(struct platform_device *pdev)
  1572. {
  1573. #ifdef MT_GPUFREQ_INPUT_BOOST
  1574. int rc;
  1575. struct sched_param param = {.sched_priority = MAX_RT_PRIO - 1 };
  1576. #endif
  1577. #ifdef MT_GPUFREQ_PERFORMANCE_TEST
  1578. /* fix at max freq */
  1579. pmic_set_register_value(PMIC_VCORE1_VOSEL_ON, _mt_gpufreq_volt_to_pmic_wrap(115000));
  1580. udelay(300);
  1581. _mt_gpufreq_set_cur_freq(448500);
  1582. return 0;
  1583. #endif
  1584. /**********************
  1585. * Initial leackage power usage
  1586. ***********************/
  1587. mt_spower_init();
  1588. /**********************
  1589. * Initial SRAM debugging ptr
  1590. ***********************/
  1591. #ifdef MT_GPUFREQ_AEE_RR_REC
  1592. _mt_gpufreq_aee_init();
  1593. #endif
  1594. /**********************
  1595. * setup gpufreq table
  1596. ***********************/
  1597. gpufreq_info("setup gpufreqs table\n");
  1598. mt_gpufreq_dvfs_table_type = _mt_gpufreq_get_dvfs_table_type();
  1599. if (mt_gpufreq_dvfs_table_type == 0) /* 600M for 6735/6753, 550M for 6735M */
  1600. _mt_setup_gpufreqs_table(mt_gpufreq_opp_tbl_e1_0, ARRAY_SIZE(mt_gpufreq_opp_tbl_e1_0));
  1601. else if (mt_gpufreq_dvfs_table_type == 1) /* 450M */
  1602. _mt_setup_gpufreqs_table(mt_gpufreq_opp_tbl_e1_1, ARRAY_SIZE(mt_gpufreq_opp_tbl_e1_1));
  1603. #ifdef CONFIG_ARCH_MT6735M
  1604. else if (mt_gpufreq_dvfs_table_type == 4) /* 500M */
  1605. _mt_setup_gpufreqs_table(mt_gpufreq_opp_tbl_e1_4, ARRAY_SIZE(mt_gpufreq_opp_tbl_e1_4));
  1606. #endif
  1607. #ifndef CONFIG_ARCH_MT6753
  1608. else if (mt_gpufreq_dvfs_table_type == 2) /* for 35+/37+ */
  1609. _mt_setup_gpufreqs_table(mt_gpufreq_opp_tbl_e1_2, ARRAY_SIZE(mt_gpufreq_opp_tbl_e1_2));
  1610. #endif
  1611. #ifdef CONFIG_ARCH_MT6735
  1612. else if (mt_gpufreq_dvfs_table_type == 3) /* for 37+ simulate 35+ */
  1613. _mt_setup_gpufreqs_table(mt_gpufreq_opp_tbl_e1_3, ARRAY_SIZE(mt_gpufreq_opp_tbl_e1_3));
  1614. #endif
  1615. else
  1616. _mt_setup_gpufreqs_table(mt_gpufreq_opp_tbl_e1_1, ARRAY_SIZE(mt_gpufreq_opp_tbl_e1_1));
  1617. #ifdef MT_GPUFREQ_AEE_RR_REC
  1618. aee_rr_rec_gpu_dvfs_status(aee_rr_curr_gpu_dvfs_status() | (1 << GPU_DVFS_IS_VGPU_ENABLED));
  1619. #endif
  1620. mt_gpufreq_volt_enable_state = 1;
  1621. /**********************
  1622. * setup initial frequency
  1623. ***********************/
  1624. _mt_gpufreq_set_initial();
  1625. gpufreq_info("GPU current frequency = %dKHz\n", _mt_gpufreq_get_cur_freq());
  1626. gpufreq_info("Current Vcore = %dmV\n", _mt_gpufreq_get_cur_volt() / 100);
  1627. gpufreq_info("g_cur_gpu_OPPidx = %d\n", g_cur_gpu_OPPidx);
  1628. mt_gpufreq_ready = true;
  1629. #ifdef MT_GPUFREQ_INPUT_BOOST
  1630. mt_gpufreq_up_task =
  1631. kthread_create(_mt_gpufreq_input_boost_task, NULL, "mt_gpufreq_input_boost_task");
  1632. if (IS_ERR(mt_gpufreq_up_task))
  1633. return PTR_ERR(mt_gpufreq_up_task);
  1634. sched_setscheduler_nocheck(mt_gpufreq_up_task, SCHED_FIFO, &param);
  1635. get_task_struct(mt_gpufreq_up_task);
  1636. rc = input_register_handler(&mt_gpufreq_input_handler);
  1637. #endif
  1638. #ifdef MT_GPUFREQ_LOW_BATT_VOLT_PROTECT
  1639. {
  1640. int i;
  1641. for (i = 0; i < mt_gpufreqs_num; i++) {
  1642. if (mt_gpufreqs[i].gpufreq_khz == MT_GPUFREQ_LOW_BATT_VOLT_LIMIT_FREQ_1) {
  1643. mt_gpufreq_low_bat_volt_limited_index_1 = i;
  1644. break;
  1645. }
  1646. }
  1647. for (i = 0; i < mt_gpufreqs_num; i++) {
  1648. if (mt_gpufreqs[i].gpufreq_khz == MT_GPUFREQ_LOW_BATT_VOLT_LIMIT_FREQ_2) {
  1649. mt_gpufreq_low_bat_volt_limited_index_2 = i;
  1650. break;
  1651. }
  1652. }
  1653. register_low_battery_notify(&mt_gpufreq_low_batt_volt_callback,
  1654. LOW_BATTERY_PRIO_GPU);
  1655. }
  1656. #endif
  1657. #ifdef MT_GPUFREQ_LOW_BATT_VOLUME_PROTECT
  1658. {
  1659. int i;
  1660. for (i = 0; i < mt_gpufreqs_num; i++) {
  1661. if (mt_gpufreqs[i].gpufreq_khz == MT_GPUFREQ_LOW_BATT_VOLUME_LIMIT_FREQ_1) {
  1662. mt_gpufreq_low_bat_volume_limited_index_1 = i;
  1663. break;
  1664. }
  1665. }
  1666. register_battery_percent_notify(&mt_gpufreq_low_batt_volume_callback,
  1667. BATTERY_PERCENT_PRIO_GPU);
  1668. }
  1669. #endif
  1670. #ifdef MT_GPUFREQ_OC_PROTECT
  1671. {
  1672. int i;
  1673. for (i = 0; i < mt_gpufreqs_num; i++) {
  1674. if (mt_gpufreqs[i].gpufreq_khz == MT_GPUFREQ_OC_LIMIT_FREQ_1) {
  1675. mt_gpufreq_oc_limited_index_1 = i;
  1676. break;
  1677. }
  1678. }
  1679. register_battery_oc_notify(&mt_gpufreq_oc_callback, BATTERY_OC_PRIO_GPU);
  1680. }
  1681. #endif
  1682. return 0;
  1683. }
  1684. /***************************************
  1685. * this function should never be called
  1686. ****************************************/
  1687. static int _mt_gpufreq_pdrv_remove(struct platform_device *pdev)
  1688. {
  1689. #ifdef MT_GPUFREQ_INPUT_BOOST
  1690. input_unregister_handler(&mt_gpufreq_input_handler);
  1691. kthread_stop(mt_gpufreq_up_task);
  1692. put_task_struct(mt_gpufreq_up_task);
  1693. #endif
  1694. return 0;
  1695. }
  1696. const struct dev_pm_ops mt_gpufreq_pm_ops = {
  1697. .suspend = NULL,
  1698. .resume = NULL,
  1699. .restore_early = _mt_gpufreq_pm_restore_early,
  1700. };
  1701. struct platform_device mt_gpufreq_pdev = {
  1702. .name = "mt-gpufreq",
  1703. .id = -1,
  1704. };
  1705. static struct platform_driver mt_gpufreq_pdrv = {
  1706. .probe = _mt_gpufreq_pdrv_probe,
  1707. .remove = _mt_gpufreq_pdrv_remove,
  1708. .driver = {
  1709. .name = "mt-gpufreq",
  1710. .pm = &mt_gpufreq_pm_ops,
  1711. .owner = THIS_MODULE,
  1712. },
  1713. };
  1714. #ifdef CONFIG_PROC_FS
  1715. /*
  1716. * PROC
  1717. */
  1718. /***************************
  1719. * show current debug status
  1720. ****************************/
  1721. static int mt_gpufreq_debug_proc_show(struct seq_file *m, void *v)
  1722. {
  1723. if (mt_gpufreq_debug)
  1724. seq_puts(m, "gpufreq debug enabled\n");
  1725. else
  1726. seq_puts(m, "gpufreq debug disabled\n");
  1727. return 0;
  1728. }
  1729. /***********************
  1730. * enable debug message
  1731. ************************/
  1732. static ssize_t mt_gpufreq_debug_proc_write(struct file *file, const char __user *buffer,
  1733. size_t count, loff_t *data)
  1734. {
  1735. char desc[32];
  1736. int len = 0;
  1737. int debug = 0;
  1738. len = (count < (sizeof(desc) - 1)) ? count : (sizeof(desc) - 1);
  1739. if (copy_from_user(desc, buffer, len))
  1740. return 0;
  1741. desc[len] = '\0';
  1742. if (!kstrtoint(desc, 10, &debug)) {
  1743. if (debug == 0)
  1744. mt_gpufreq_debug = 0;
  1745. else if (debug == 1)
  1746. mt_gpufreq_debug = 1;
  1747. else
  1748. gpufreq_warn("bad argument!! should be 0 or 1 [0: disable, 1: enable]\n");
  1749. } else
  1750. gpufreq_warn("bad argument!! should be 0 or 1 [0: disable, 1: enable]\n");
  1751. return count;
  1752. }
  1753. #ifdef MT_GPUFREQ_OC_PROTECT
  1754. /****************************
  1755. * show current limited by low batt volume
  1756. *****************************/
  1757. static int mt_gpufreq_limited_oc_ignore_proc_show(struct seq_file *m, void *v)
  1758. {
  1759. seq_printf(m, "g_limited_max_id = %d, g_limited_oc_ignore_state = %d\n", g_limited_max_id,
  1760. g_limited_oc_ignore_state);
  1761. return 0;
  1762. }
  1763. /**********************************
  1764. * limited for low batt volume protect
  1765. ***********************************/
  1766. static ssize_t mt_gpufreq_limited_oc_ignore_proc_write(struct file *file,
  1767. const char __user *buffer, size_t count,
  1768. loff_t *data)
  1769. {
  1770. char desc[32];
  1771. int len = 0;
  1772. unsigned int ignore = 0;
  1773. len = (count < (sizeof(desc) - 1)) ? count : (sizeof(desc) - 1);
  1774. if (copy_from_user(desc, buffer, len))
  1775. return 0;
  1776. desc[len] = '\0';
  1777. if (!kstrtouint(desc, 10, &ignore)) {
  1778. if (ignore == 1)
  1779. g_limited_oc_ignore_state = true;
  1780. else if (ignore == 0)
  1781. g_limited_oc_ignore_state = false;
  1782. else
  1783. gpufreq_warn
  1784. ("bad argument!! should be 0 or 1 [0: not ignore, 1: ignore]\n");
  1785. } else
  1786. gpufreq_warn("bad argument!! should be 0 or 1 [0: not ignore, 1: ignore]\n");
  1787. return count;
  1788. }
  1789. #endif
  1790. #ifdef MT_GPUFREQ_LOW_BATT_VOLUME_PROTECT
  1791. /****************************
  1792. * show current limited by low batt volume
  1793. *****************************/
  1794. static int mt_gpufreq_limited_low_batt_volume_ignore_proc_show(struct seq_file *m, void *v)
  1795. {
  1796. seq_printf(m, "g_limited_max_id = %d, g_limited_low_batt_volume_ignore_state = %d\n",
  1797. g_limited_max_id, g_limited_low_batt_volume_ignore_state);
  1798. return 0;
  1799. }
  1800. /**********************************
  1801. * limited for low batt volume protect
  1802. ***********************************/
  1803. static ssize_t mt_gpufreq_limited_low_batt_volume_ignore_proc_write(struct file *file,
  1804. const char __user *buffer,
  1805. size_t count, loff_t *data)
  1806. {
  1807. char desc[32];
  1808. int len = 0;
  1809. unsigned int ignore = 0;
  1810. len = (count < (sizeof(desc) - 1)) ? count : (sizeof(desc) - 1);
  1811. if (copy_from_user(desc, buffer, len))
  1812. return 0;
  1813. desc[len] = '\0';
  1814. if (!kstrtouint(desc, 10, &ignore)) {
  1815. if (ignore == 1)
  1816. g_limited_low_batt_volume_ignore_state = true;
  1817. else if (ignore == 0)
  1818. g_limited_low_batt_volume_ignore_state = false;
  1819. else
  1820. gpufreq_warn
  1821. ("bad argument!! should be 0 or 1 [0: not ignore, 1: ignore]\n");
  1822. } else
  1823. gpufreq_warn("bad argument!! should be 0 or 1 [0: not ignore, 1: ignore]\n");
  1824. return count;
  1825. }
  1826. #endif
  1827. #ifdef MT_GPUFREQ_LOW_BATT_VOLT_PROTECT
  1828. /****************************
  1829. * show current limited by low batt volt
  1830. *****************************/
  1831. static int mt_gpufreq_limited_low_batt_volt_ignore_proc_show(struct seq_file *m, void *v)
  1832. {
  1833. seq_printf(m, "g_limited_max_id = %d, g_limited_low_batt_volt_ignore_state = %d\n",
  1834. g_limited_max_id, g_limited_low_batt_volt_ignore_state);
  1835. return 0;
  1836. }
  1837. /**********************************
  1838. * limited for low batt volt protect
  1839. ***********************************/
  1840. static ssize_t mt_gpufreq_limited_low_batt_volt_ignore_proc_write(struct file *file,
  1841. const char __user *buffer,
  1842. size_t count, loff_t *data)
  1843. {
  1844. char desc[32];
  1845. int len = 0;
  1846. unsigned int ignore = 0;
  1847. len = (count < (sizeof(desc) - 1)) ? count : (sizeof(desc) - 1);
  1848. if (copy_from_user(desc, buffer, len))
  1849. return 0;
  1850. desc[len] = '\0';
  1851. if (!kstrtouint(desc, 10, &ignore)) {
  1852. if (ignore == 1)
  1853. g_limited_low_batt_volt_ignore_state = true;
  1854. else if (ignore == 0)
  1855. g_limited_low_batt_volt_ignore_state = false;
  1856. else
  1857. gpufreq_warn
  1858. ("bad argument!! should be 0 or 1 [0: not ignore, 1: ignore]\n");
  1859. } else
  1860. gpufreq_warn("bad argument!! should be 0 or 1 [0: not ignore, 1: ignore]\n");
  1861. return count;
  1862. }
  1863. #endif
  1864. /****************************
  1865. * show current limited by thermal
  1866. *****************************/
  1867. static int mt_gpufreq_limited_thermal_ignore_proc_show(struct seq_file *m, void *v)
  1868. {
  1869. seq_printf(m, "g_limited_max_id = %d, g_limited_thermal_ignore_state = %d\n",
  1870. g_limited_max_id, g_limited_thermal_ignore_state);
  1871. return 0;
  1872. }
  1873. /**********************************
  1874. * limited for thermal protect
  1875. ***********************************/
  1876. static ssize_t mt_gpufreq_limited_thermal_ignore_proc_write(struct file *file,
  1877. const char __user *buffer,
  1878. size_t count, loff_t *data)
  1879. {
  1880. char desc[32];
  1881. int len = 0;
  1882. unsigned int ignore = 0;
  1883. len = (count < (sizeof(desc) - 1)) ? count : (sizeof(desc) - 1);
  1884. if (copy_from_user(desc, buffer, len))
  1885. return 0;
  1886. desc[len] = '\0';
  1887. if (!kstrtouint(desc, 10, &ignore)) {
  1888. if (ignore == 1)
  1889. g_limited_thermal_ignore_state = true;
  1890. else if (ignore == 0)
  1891. g_limited_thermal_ignore_state = false;
  1892. else
  1893. gpufreq_warn
  1894. ("bad argument!! should be 0 or 1 [0: not ignore, 1: ignore]\n");
  1895. } else
  1896. gpufreq_warn("bad argument!! should be 0 or 1 [0: not ignore, 1: ignore]\n");
  1897. return count;
  1898. }
  1899. #ifndef DISABLE_PBM_FEATURE
  1900. /****************************
  1901. * show current limited by PBM
  1902. *****************************/
  1903. static int mt_gpufreq_limited_pbm_ignore_proc_show(struct seq_file *m, void *v)
  1904. {
  1905. seq_printf(m, "g_limited_max_id = %d, g_limited_oc_ignore_state = %d\n", g_limited_max_id,
  1906. g_limited_pbm_ignore_state);
  1907. return 0;
  1908. }
  1909. /**********************************
  1910. * limited for low batt volume protect
  1911. ***********************************/
  1912. static ssize_t mt_gpufreq_limited_pbm_ignore_proc_write(struct file *file,
  1913. const char __user *buffer, size_t count,
  1914. loff_t *data)
  1915. {
  1916. char desc[32];
  1917. int len = 0;
  1918. unsigned int ignore = 0;
  1919. len = (count < (sizeof(desc) - 1)) ? count : (sizeof(desc) - 1);
  1920. if (copy_from_user(desc, buffer, len))
  1921. return 0;
  1922. desc[len] = '\0';
  1923. if (!kstrtouint(desc, 10, &ignore)) {
  1924. if (ignore == 1)
  1925. g_limited_pbm_ignore_state = true;
  1926. else if (ignore == 0)
  1927. g_limited_pbm_ignore_state = false;
  1928. else
  1929. gpufreq_warn
  1930. ("bad argument!! should be 0 or 1 [0: not ignore, 1: ignore]\n");
  1931. } else
  1932. gpufreq_warn("bad argument!! should be 0 or 1 [0: not ignore, 1: ignore]\n");
  1933. return count;
  1934. }
  1935. #endif
  1936. /****************************
  1937. * show current limited power
  1938. *****************************/
  1939. static int mt_gpufreq_limited_power_proc_show(struct seq_file *m, void *v)
  1940. {
  1941. seq_printf(m, "g_limited_max_id = %d, limit frequency = %d\n", g_limited_max_id,
  1942. mt_gpufreqs[g_limited_max_id].gpufreq_khz);
  1943. return 0;
  1944. }
  1945. /**********************************
  1946. * limited power for thermal protect
  1947. ***********************************/
  1948. static ssize_t mt_gpufreq_limited_power_proc_write(struct file *file, const char __user *buffer,
  1949. size_t count, loff_t *data)
  1950. {
  1951. char desc[32];
  1952. int len = 0;
  1953. unsigned int power = 0;
  1954. len = (count < (sizeof(desc) - 1)) ? count : (sizeof(desc) - 1);
  1955. if (copy_from_user(desc, buffer, len))
  1956. return 0;
  1957. desc[len] = '\0';
  1958. if (!kstrtouint(desc, 10, &power))
  1959. mt_gpufreq_thermal_protect(power);
  1960. else
  1961. gpufreq_warn("bad argument!! please provide the maximum limited power\n");
  1962. return count;
  1963. }
  1964. /****************************
  1965. * show current limited power by PBM
  1966. *****************************/
  1967. #ifndef DISABLE_PBM_FEATURE
  1968. static int mt_gpufreq_limited_by_pbm_proc_show(struct seq_file *m, void *v)
  1969. {
  1970. seq_printf(m, "pbm_limited_power = %d, limit index = %d\n",
  1971. mt_gpufreq_pbm_limited_gpu_power, mt_gpufreq_pbm_limited_index);
  1972. return 0;
  1973. }
  1974. /**********************************
  1975. * limited power for thermal protect
  1976. ***********************************/
  1977. static ssize_t mt_gpufreq_limited_by_pbm_proc_write(struct file *file, const char __user *buffer,
  1978. size_t count, loff_t *data)
  1979. {
  1980. char desc[32];
  1981. int len = 0;
  1982. unsigned int power = 0;
  1983. len = (count < (sizeof(desc) - 1)) ? count : (sizeof(desc) - 1);
  1984. if (copy_from_user(desc, buffer, len))
  1985. return 0;
  1986. desc[len] = '\0';
  1987. if (!kstrtouint(desc, 10, &power))
  1988. mt_gpufreq_set_power_limit_by_pbm(power);
  1989. else
  1990. gpufreq_warn("bad argument!! please provide the maximum limited power\n");
  1991. return count;
  1992. }
  1993. #endif
  1994. /******************************
  1995. * show current GPU DVFS stauts
  1996. *******************************/
  1997. static int mt_gpufreq_state_proc_show(struct seq_file *m, void *v)
  1998. {
  1999. if (!mt_gpufreq_pause)
  2000. seq_puts(m, "GPU DVFS enabled\n");
  2001. else
  2002. seq_puts(m, "GPU DVFS disabled\n");
  2003. return 0;
  2004. }
  2005. /****************************************
  2006. * set GPU DVFS stauts by sysfs interface
  2007. *****************************************/
  2008. static ssize_t mt_gpufreq_state_proc_write(struct file *file, const char __user *buffer,
  2009. size_t count, loff_t *data)
  2010. {
  2011. char desc[32];
  2012. int len = 0;
  2013. int enabled = 0;
  2014. len = (count < (sizeof(desc) - 1)) ? count : (sizeof(desc) - 1);
  2015. if (copy_from_user(desc, buffer, len))
  2016. return 0;
  2017. desc[len] = '\0';
  2018. if (!kstrtoint(desc, 10, &enabled)) {
  2019. if (enabled == 1) {
  2020. mt_gpufreq_keep_max_frequency_state = false;
  2021. _mt_gpufreq_state_set(1);
  2022. } else if (enabled == 0) {
  2023. /* Keep MAX frequency when GPU DVFS disabled. */
  2024. mt_gpufreq_keep_max_frequency_state = true;
  2025. mt_gpufreq_voltage_enable_set(1);
  2026. mt_gpufreq_target(g_gpufreq_max_id);
  2027. _mt_gpufreq_state_set(0);
  2028. } else
  2029. gpufreq_warn("bad argument!! argument should be \"1\" or \"0\"\n");
  2030. } else
  2031. gpufreq_warn("bad argument!! argument should be \"1\" or \"0\"\n");
  2032. return count;
  2033. }
  2034. /********************
  2035. * show GPU OPP table
  2036. *********************/
  2037. static int mt_gpufreq_opp_dump_proc_show(struct seq_file *m, void *v)
  2038. {
  2039. int i = 0;
  2040. for (i = 0; i < mt_gpufreqs_num; i++) {
  2041. seq_printf(m, "[%d] ", i);
  2042. seq_printf(m, "freq = %d, ", mt_gpufreqs[i].gpufreq_khz);
  2043. seq_printf(m, "volt = %d\n", mt_gpufreqs[i].gpufreq_volt);
  2044. }
  2045. return 0;
  2046. }
  2047. /********************
  2048. * show GPU power table
  2049. *********************/
  2050. static int mt_gpufreq_power_dump_proc_show(struct seq_file *m, void *v)
  2051. {
  2052. int i = 0;
  2053. for (i = 0; i < mt_gpufreqs_power_num; i++) {
  2054. seq_printf(m, "mt_gpufreqs_power[%d].gpufreq_khz = %d\n", i,
  2055. mt_gpufreqs_power[i].gpufreq_khz);
  2056. seq_printf(m, "mt_gpufreqs_power[%d].gpufreq_volt = %d\n", i,
  2057. mt_gpufreqs_power[i].gpufreq_volt);
  2058. seq_printf(m, "mt_gpufreqs_power[%d].gpufreq_power = %d\n", i,
  2059. mt_gpufreqs_power[i].gpufreq_power);
  2060. }
  2061. return 0;
  2062. }
  2063. /***************************
  2064. * show current specific frequency status
  2065. ****************************/
  2066. static int mt_gpufreq_opp_freq_proc_show(struct seq_file *m, void *v)
  2067. {
  2068. if (mt_gpufreq_keep_opp_frequency_state) {
  2069. seq_puts(m, "gpufreq keep opp frequency enabled\n");
  2070. seq_printf(m, "freq = %d\n", mt_gpufreqs[mt_gpufreq_keep_opp_index].gpufreq_khz);
  2071. seq_printf(m, "volt = %d\n", mt_gpufreqs[mt_gpufreq_keep_opp_index].gpufreq_volt);
  2072. } else
  2073. seq_puts(m, "gpufreq keep opp frequency disabled\n");
  2074. return 0;
  2075. }
  2076. /***********************
  2077. * enable specific frequency
  2078. ************************/
  2079. static ssize_t mt_gpufreq_opp_freq_proc_write(struct file *file, const char __user *buffer,
  2080. size_t count, loff_t *data)
  2081. {
  2082. char desc[32];
  2083. int len = 0;
  2084. int i = 0;
  2085. int fixed_freq = 0;
  2086. int found = 0;
  2087. len = (count < (sizeof(desc) - 1)) ? count : (sizeof(desc) - 1);
  2088. if (copy_from_user(desc, buffer, len))
  2089. return 0;
  2090. desc[len] = '\0';
  2091. if (!kstrtoint(desc, 10, &fixed_freq)) {
  2092. if (fixed_freq == 0) {
  2093. mt_gpufreq_keep_opp_frequency_state = false;
  2094. } else {
  2095. #if defined(CONFIG_ARCH_MT6735M) && defined(MT_GPUFREQ_VCOREFS_ENABLED)
  2096. /************************************************
  2097. * If 550MHz is exist, mask it when vcorefs is disabled
  2098. *************************************************/
  2099. g_is_vcorefs_on = is_vcorefs_can_work();
  2100. if ((!can_do_gpu_dvs()) && (mt_gpufreq_dvfs_table_type == 0 || mt_gpufreq_dvfs_table_type == 2)) {
  2101. unsigned int limited_freq =
  2102. mt_gpufreqs[g_gpufreq_max_id_vcorefs_off].gpufreq_khz;
  2103. if (fixed_freq > limited_freq) {
  2104. gpufreq_warn("bad argument!! OPP freq cannot higher than %dKHz since Vcore DVFS is disabled\n",
  2105. limited_freq);
  2106. return count;
  2107. }
  2108. }
  2109. #endif
  2110. for (i = 0; i < mt_gpufreqs_num; i++) {
  2111. if (fixed_freq == mt_gpufreqs[i].gpufreq_khz) {
  2112. mt_gpufreq_keep_opp_index = i;
  2113. found = 1;
  2114. break;
  2115. }
  2116. }
  2117. if (found == 1) {
  2118. mt_gpufreq_keep_opp_frequency_state = true;
  2119. mt_gpufreq_keep_opp_frequency = fixed_freq;
  2120. mt_gpufreq_voltage_enable_set(1);
  2121. mt_gpufreq_target(mt_gpufreq_keep_opp_index);
  2122. }
  2123. }
  2124. } else
  2125. gpufreq_warn("bad argument!! please provide the fixed frequency\n");
  2126. return count;
  2127. }
  2128. /***************************
  2129. * show current specific frequency status
  2130. ****************************/
  2131. static int mt_gpufreq_opp_max_freq_proc_show(struct seq_file *m, void *v)
  2132. {
  2133. if (mt_gpufreq_opp_max_frequency_state) {
  2134. seq_puts(m, "gpufreq opp max frequency enabled\n");
  2135. seq_printf(m, "freq = %d\n", mt_gpufreqs[mt_gpufreq_opp_max_index].gpufreq_khz);
  2136. seq_printf(m, "volt = %d\n", mt_gpufreqs[mt_gpufreq_opp_max_index].gpufreq_volt);
  2137. } else
  2138. seq_puts(m, "gpufreq opp max frequency disabled\n");
  2139. return 0;
  2140. }
  2141. /***********************
  2142. * enable specific frequency
  2143. ************************/
  2144. static ssize_t mt_gpufreq_opp_max_freq_proc_write(struct file *file, const char __user *buffer,
  2145. size_t count, loff_t *data)
  2146. {
  2147. char desc[32];
  2148. int len = 0;
  2149. int i = 0;
  2150. int max_freq = 0;
  2151. int found = 0;
  2152. len = (count < (sizeof(desc) - 1)) ? count : (sizeof(desc) - 1);
  2153. if (copy_from_user(desc, buffer, len))
  2154. return 0;
  2155. desc[len] = '\0';
  2156. if (!kstrtoint(desc, 10, &max_freq)) {
  2157. if (max_freq == 0) {
  2158. mt_gpufreq_opp_max_frequency_state = false;
  2159. } else {
  2160. #if defined(CONFIG_ARCH_MT6735M) && defined(MT_GPUFREQ_VCOREFS_ENABLED)
  2161. /************************************************
  2162. * If 550MHz is exist, mask it when vcorefs is disabled
  2163. *************************************************/
  2164. g_is_vcorefs_on = is_vcorefs_can_work();
  2165. if ((!can_do_gpu_dvs()) && mt_gpufreq_dvfs_table_type == 0) {
  2166. unsigned int limited_freq =
  2167. mt_gpufreqs[g_gpufreq_max_id_vcorefs_off].gpufreq_khz;
  2168. if (max_freq > limited_freq) {
  2169. gpufreq_warn("bad argument!! max_freq cannot higher than %dKHz since Vcore DVFS is disabled\n",
  2170. limited_freq);
  2171. return count;
  2172. }
  2173. }
  2174. #endif
  2175. for (i = 0; i < mt_gpufreqs_num; i++) {
  2176. if (mt_gpufreqs[i].gpufreq_khz <= max_freq) {
  2177. mt_gpufreq_opp_max_index = i;
  2178. found = 1;
  2179. break;
  2180. }
  2181. }
  2182. if (found == 1) {
  2183. mt_gpufreq_opp_max_frequency_state = true;
  2184. mt_gpufreq_opp_max_frequency =
  2185. mt_gpufreqs[mt_gpufreq_opp_max_index].gpufreq_khz;
  2186. mt_gpufreq_voltage_enable_set(1);
  2187. mt_gpufreq_target(mt_gpufreq_opp_max_index);
  2188. }
  2189. }
  2190. } else
  2191. gpufreq_warn("bad argument!! please provide the maximum limited frequency\n");
  2192. return count;
  2193. }
  2194. /********************
  2195. * show variable dump
  2196. *********************/
  2197. static int mt_gpufreq_var_dump_proc_show(struct seq_file *m, void *v)
  2198. {
  2199. int i = 0;
  2200. seq_printf(m, "GPU current frequency = %dKHz\n", _mt_gpufreq_get_cur_freq());
  2201. seq_printf(m, "Current Vcore = %dmV\n", _mt_gpufreq_get_cur_volt() / 100);
  2202. seq_printf(m, "g_cur_gpu_OPPidx = %d\n", g_cur_gpu_OPPidx);
  2203. seq_printf(m, "g_last_gpu_dvs_result = %d (0:success, 127:not enabled, else:error)\n",
  2204. g_last_gpu_dvs_result);
  2205. seq_printf(m, "g_is_vcorefs_on = %d (0:disable, 1:enable, 255:not build-in)\n",
  2206. g_is_vcorefs_on);
  2207. seq_printf(m, "g_limited_max_id = %d\n", g_limited_max_id);
  2208. for (i = 0; i < NR_IDX_POWER_LIMITED; i++)
  2209. seq_printf(m, "mt_gpufreq_power_limited_index_array[%d] = %d\n", i,
  2210. mt_gpufreq_power_limited_index_array[i]);
  2211. seq_printf(m, "mt_gpufreq_volt_enable_state = %d\n", mt_gpufreq_volt_enable_state);
  2212. seq_printf(m, "mt_gpufreq_fixed_freq_state = %d\n", mt_gpufreq_fixed_freq_state);
  2213. seq_printf(m, "mt_gpufreq_dvfs_table_type = %d\n", mt_gpufreq_dvfs_table_type);
  2214. seq_printf(m, "mt_gpufreq_dvfs_mmpll_spd_bond = %d\n", mt_gpufreq_dvfs_mmpll_spd_bond);
  2215. seq_printf(m, "is_have_550MHz = %d\n", is_have_550());
  2216. return 0;
  2217. }
  2218. #if 0
  2219. /***************************
  2220. * show current voltage enable status
  2221. ****************************/
  2222. static int mt_gpufreq_volt_enable_proc_show(struct seq_file *m, void *v)
  2223. {
  2224. if (mt_gpufreq_volt_enable)
  2225. seq_puts(m, "gpufreq voltage enabled\n");
  2226. else
  2227. seq_puts(m, "gpufreq voltage disabled\n");
  2228. return 0;
  2229. }
  2230. /***********************
  2231. * enable specific frequency
  2232. ************************/
  2233. static ssize_t mt_gpufreq_volt_enable_proc_write(struct file *file, const char __user *buffer,
  2234. size_t count, loff_t *data)
  2235. {
  2236. char desc[32];
  2237. int len = 0;
  2238. int enable = 0;
  2239. len = (count < (sizeof(desc) - 1)) ? count : (sizeof(desc) - 1);
  2240. if (copy_from_user(desc, buffer, len))
  2241. return 0;
  2242. desc[len] = '\0';
  2243. if (!kstrtoint(desc, 10, &enable)) {
  2244. if (enable == 0) {
  2245. mt_gpufreq_voltage_enable_set(0);
  2246. mt_gpufreq_volt_enable = false;
  2247. } else if (enable == 1) {
  2248. mt_gpufreq_voltage_enable_set(1);
  2249. mt_gpufreq_volt_enable = true;
  2250. } else
  2251. gpufreq_warn("bad argument!! should be 0 or 1 [0: disable, 1: enable]\n");
  2252. } else
  2253. gpufreq_warn("bad argument!! should be 0 or 1 [0: disable, 1: enable]\n");
  2254. return count;
  2255. }
  2256. #endif
  2257. /***************************
  2258. * show current specific frequency status
  2259. ****************************/
  2260. static int mt_gpufreq_fixed_freq_proc_show(struct seq_file *m, void *v)
  2261. {
  2262. if (mt_gpufreq_fixed_freq_state) {
  2263. seq_puts(m, "gpufreq fixed frequency enabled\n");
  2264. seq_printf(m, "fixed frequency = %d\n", mt_gpufreq_fixed_frequency);
  2265. } else
  2266. seq_puts(m, "gpufreq fixed frequency disabled\n");
  2267. return 0;
  2268. }
  2269. /***********************
  2270. * enable specific frequency
  2271. ************************/
  2272. static ssize_t mt_gpufreq_fixed_freq_proc_write(struct file *file, const char __user *buffer,
  2273. size_t count, loff_t *data)
  2274. {
  2275. char desc[32];
  2276. int len = 0;
  2277. int fixed_freq = 0;
  2278. len = (count < (sizeof(desc) - 1)) ? count : (sizeof(desc) - 1);
  2279. if (copy_from_user(desc, buffer, len))
  2280. return 0;
  2281. desc[len] = '\0';
  2282. if (!kstrtoint(desc, 10, &fixed_freq)) {
  2283. mutex_lock(&mt_gpufreq_lock);
  2284. if (fixed_freq == 0) {
  2285. mt_gpufreq_fixed_freq_state = false;
  2286. mt_gpufreq_fixed_frequency = 0;
  2287. } else {
  2288. _mt_gpufreq_set_cur_freq(fixed_freq);
  2289. mt_gpufreq_fixed_freq_state = true;
  2290. mt_gpufreq_fixed_frequency = fixed_freq;
  2291. g_cur_gpu_OPPidx = 0; /* keep Max Vcore */
  2292. }
  2293. mutex_unlock(&mt_gpufreq_lock);
  2294. } else
  2295. gpufreq_warn("bad argument!! should be [enable fixed_freq(KHz)]\n");
  2296. return count;
  2297. }
  2298. #ifdef MT_GPUFREQ_INPUT_BOOST
  2299. /*****************************
  2300. * show current input boost status
  2301. ******************************/
  2302. static int mt_gpufreq_input_boost_proc_show(struct seq_file *m, void *v)
  2303. {
  2304. if (mt_gpufreq_input_boost_state == 1)
  2305. seq_puts(m, "gpufreq debug enabled\n");
  2306. else
  2307. seq_puts(m, "gpufreq debug disabled\n");
  2308. return 0;
  2309. }
  2310. /***************************
  2311. * enable/disable input boost
  2312. ****************************/
  2313. static ssize_t mt_gpufreq_input_boost_proc_write(struct file *file, const char __user *buffer,
  2314. size_t count, loff_t *data)
  2315. {
  2316. char desc[32];
  2317. int len = 0;
  2318. int debug = 0;
  2319. len = (count < (sizeof(desc) - 1)) ? count : (sizeof(desc) - 1);
  2320. if (copy_from_user(desc, buffer, len))
  2321. return 0;
  2322. desc[len] = '\0';
  2323. if (!kstrtoint(desc, 10, &debug)) {
  2324. if (debug == 0)
  2325. mt_gpufreq_input_boost_state = 0;
  2326. else if (debug == 1)
  2327. mt_gpufreq_input_boost_state = 1;
  2328. else
  2329. gpufreq_warn("bad argument!! should be 0 or 1 [0: disable, 1: enable]\n");
  2330. } else
  2331. gpufreq_warn("bad argument!! should be 0 or 1 [0: disable, 1: enable]\n");
  2332. return count;
  2333. }
  2334. #endif
  2335. #define PROC_FOPS_RW(name) \
  2336. static int mt_ ## name ## _proc_open(struct inode *inode, struct file *file) \
  2337. { \
  2338. return single_open(file, mt_ ## name ## _proc_show, PDE_DATA(inode)); \
  2339. } \
  2340. static const struct file_operations mt_ ## name ## _proc_fops = { \
  2341. .owner = THIS_MODULE, \
  2342. .open = mt_ ## name ## _proc_open, \
  2343. .read = seq_read, \
  2344. .llseek = seq_lseek, \
  2345. .release = single_release, \
  2346. .write = mt_ ## name ## _proc_write, \
  2347. }
  2348. #define PROC_FOPS_RO(name) \
  2349. static int mt_ ## name ## _proc_open(struct inode *inode, struct file *file) \
  2350. { \
  2351. return single_open(file, mt_ ## name ## _proc_show, PDE_DATA(inode)); \
  2352. } \
  2353. static const struct file_operations mt_ ## name ## _proc_fops = { \
  2354. .owner = THIS_MODULE, \
  2355. .open = mt_ ## name ## _proc_open, \
  2356. .read = seq_read, \
  2357. .llseek = seq_lseek, \
  2358. .release = single_release, \
  2359. }
  2360. #define PROC_ENTRY(name) {__stringify(name), &mt_ ## name ## _proc_fops}
  2361. PROC_FOPS_RW(gpufreq_debug);
  2362. PROC_FOPS_RW(gpufreq_limited_power);
  2363. #ifdef MT_GPUFREQ_OC_PROTECT
  2364. PROC_FOPS_RW(gpufreq_limited_oc_ignore);
  2365. #endif
  2366. #ifdef MT_GPUFREQ_LOW_BATT_VOLUME_PROTECT
  2367. PROC_FOPS_RW(gpufreq_limited_low_batt_volume_ignore);
  2368. #endif
  2369. #ifdef MT_GPUFREQ_LOW_BATT_VOLT_PROTECT
  2370. PROC_FOPS_RW(gpufreq_limited_low_batt_volt_ignore);
  2371. #endif
  2372. PROC_FOPS_RW(gpufreq_limited_thermal_ignore);
  2373. #ifndef DISABLE_PBM_FEATURE
  2374. PROC_FOPS_RW(gpufreq_limited_pbm_ignore);
  2375. PROC_FOPS_RW(gpufreq_limited_by_pbm);
  2376. #endif
  2377. PROC_FOPS_RW(gpufreq_state);
  2378. PROC_FOPS_RO(gpufreq_opp_dump);
  2379. PROC_FOPS_RO(gpufreq_power_dump);
  2380. PROC_FOPS_RW(gpufreq_opp_freq);
  2381. PROC_FOPS_RW(gpufreq_opp_max_freq);
  2382. PROC_FOPS_RO(gpufreq_var_dump);
  2383. /* PROC_FOPS_RW(gpufreq_volt_enable); */
  2384. PROC_FOPS_RW(gpufreq_fixed_freq);
  2385. #ifdef MT_GPUFREQ_INPUT_BOOST
  2386. PROC_FOPS_RW(gpufreq_input_boost);
  2387. #endif
  2388. static int mt_gpufreq_create_procfs(void)
  2389. {
  2390. struct proc_dir_entry *dir = NULL;
  2391. int i;
  2392. struct pentry {
  2393. const char *name;
  2394. const struct file_operations *fops;
  2395. };
  2396. const struct pentry entries[] = {
  2397. PROC_ENTRY(gpufreq_debug),
  2398. PROC_ENTRY(gpufreq_limited_power),
  2399. #ifdef MT_GPUFREQ_OC_PROTECT
  2400. PROC_ENTRY(gpufreq_limited_oc_ignore),
  2401. #endif
  2402. #ifdef MT_GPUFREQ_LOW_BATT_VOLUME_PROTECT
  2403. PROC_ENTRY(gpufreq_limited_low_batt_volume_ignore),
  2404. #endif
  2405. #ifdef MT_GPUFREQ_LOW_BATT_VOLT_PROTECT
  2406. PROC_ENTRY(gpufreq_limited_low_batt_volt_ignore),
  2407. #endif
  2408. PROC_ENTRY(gpufreq_limited_thermal_ignore),
  2409. #ifndef DISABLE_PBM_FEATURE
  2410. PROC_ENTRY(gpufreq_limited_pbm_ignore),
  2411. PROC_ENTRY(gpufreq_limited_by_pbm),
  2412. #endif
  2413. PROC_ENTRY(gpufreq_state),
  2414. PROC_ENTRY(gpufreq_opp_dump),
  2415. PROC_ENTRY(gpufreq_power_dump),
  2416. PROC_ENTRY(gpufreq_opp_freq),
  2417. PROC_ENTRY(gpufreq_opp_max_freq),
  2418. PROC_ENTRY(gpufreq_var_dump),
  2419. /* PROC_ENTRY(gpufreq_volt_enable), */
  2420. PROC_ENTRY(gpufreq_fixed_freq),
  2421. #ifdef MT_GPUFREQ_INPUT_BOOST
  2422. PROC_ENTRY(gpufreq_input_boost),
  2423. #endif
  2424. };
  2425. dir = proc_mkdir("gpufreq", NULL);
  2426. if (!dir) {
  2427. gpufreq_err("fail to create /proc/gpufreq @ %s()\n", __func__);
  2428. return -ENOMEM;
  2429. }
  2430. for (i = 0; i < ARRAY_SIZE(entries); i++) {
  2431. if (!proc_create
  2432. (entries[i].name, S_IRUGO | S_IWUSR | S_IWGRP, dir, entries[i].fops))
  2433. gpufreq_err("@%s: create /proc/gpufreq/%s failed\n",
  2434. __func__, entries[i].name);
  2435. }
  2436. return 0;
  2437. }
  2438. #endif /* CONFIG_PROC_FS */
  2439. /**********************************
  2440. * mediatek gpufreq initialization
  2441. ***********************************/
  2442. static int __init _mt_gpufreq_init(void)
  2443. {
  2444. int ret = 0;
  2445. gpufreq_info("@%s\n", __func__);
  2446. #ifdef CONFIG_PROC_FS
  2447. /* init proc */
  2448. if (mt_gpufreq_create_procfs())
  2449. goto out;
  2450. #endif /* CONFIG_PROC_FS */
  2451. /* register platform device/driver */
  2452. ret = platform_device_register(&mt_gpufreq_pdev);
  2453. if (ret) {
  2454. gpufreq_err("fail to register gpufreq device @ %s()\n", __func__);
  2455. goto out;
  2456. }
  2457. ret = platform_driver_register(&mt_gpufreq_pdrv);
  2458. if (ret) {
  2459. gpufreq_err("fail to register gpufreq driver @ %s()\n", __func__);
  2460. platform_device_unregister(&mt_gpufreq_pdev);
  2461. }
  2462. out:
  2463. return ret;
  2464. }
  2465. static void __exit _mt_gpufreq_exit(void)
  2466. {
  2467. platform_driver_unregister(&mt_gpufreq_pdrv);
  2468. platform_device_unregister(&mt_gpufreq_pdev);
  2469. }
  2470. module_init(_mt_gpufreq_init);
  2471. module_exit(_mt_gpufreq_exit);
  2472. MODULE_DESCRIPTION("MediaTek GPU Frequency Scaling driver");
  2473. MODULE_LICENSE("GPL");