memlat.c 56 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * Copyright (c) 2020-2021, The Linux Foundation. All rights reserved.
  4. * Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved.
  5. */
  6. #define pr_fmt(fmt) "qcom-memlat: " fmt
  7. #include <linux/kernel.h>
  8. #include <linux/module.h>
  9. #include <linux/init.h>
  10. #include <linux/io.h>
  11. #include <linux/delay.h>
  12. #include <linux/err.h>
  13. #include <linux/errno.h>
  14. #include <linux/interrupt.h>
  15. #include <linux/of_address.h>
  16. #include <linux/platform_device.h>
  17. #include <linux/of.h>
  18. #include <linux/of_irq.h>
  19. #include <linux/slab.h>
  20. #include <linux/irq.h>
  21. #include <linux/cpu_pm.h>
  22. #include <linux/cpu.h>
  23. #include <linux/of_fdt.h>
  24. #include <linux/of_device.h>
  25. #include <linux/mutex.h>
  26. #include <linux/cpu.h>
  27. #include <linux/spinlock.h>
  28. #include <trace/hooks/sched.h>
  29. #include <soc/qcom/dcvs.h>
  30. #include <soc/qcom/pmu_lib.h>
  31. #include <linux/scmi_protocol.h>
  32. #include <linux/sched/clock.h>
  33. #include <linux/qcom_scmi_vendor.h>
  34. #include "trace-dcvs.h"
  35. #define MAX_MEMLAT_GRPS NUM_DCVS_HW_TYPES
  36. #define FP_NAME "memlat_fp"
  37. #define MEMLAT_ALGO_STR 0x4D454D4C4154 /* "MEMLAT" */
  38. #define SCMI_VENDOR_MSG_START (3)
  39. #define SCMI_VENDOR_MSG_MODULE_START (16)
  40. #define INVALID_IDX 0xFF
  41. #define MAX_NAME_LEN 20
  42. #define MAX_MAP_ENTRIES 12
  43. enum scmi_memlat_protocol_cmd {
  44. MEMLAT_SET_LOG_LEVEL = SCMI_VENDOR_MSG_START,
  45. MEMLAT_FLUSH_LOGBUF,
  46. MEMLAT_SET_MEM_GROUP = SCMI_VENDOR_MSG_MODULE_START,
  47. MEMLAT_SET_MONITOR,
  48. MEMLAT_SET_COMMON_EV_MAP,
  49. MEMLAT_SET_GRP_EV_MAP,
  50. MEMLAT_ADAPTIVE_LOW_FREQ,
  51. MEMLAT_ADAPTIVE_HIGH_FREQ,
  52. MEMLAT_GET_ADAPTIVE_CUR_FREQ,
  53. MEMLAT_IPM_CEIL,
  54. MEMLAT_FE_STALL_FLOOR,
  55. MEMLAT_BE_STALL_FLOOR,
  56. MEMLAT_WB_PCT,
  57. MEMLAT_IPM_FILTER,
  58. MEMLAT_FREQ_SCALE_PCT,
  59. MEMLAT_FREQ_SCALE_CEIL_MHZ,
  60. MEMLAT_FREQ_SCALE_FLOOR_MHZ,
  61. MEMLAT_SAMPLE_MS,
  62. MEMLAT_MON_FREQ_MAP,
  63. MEMLAT_SET_MIN_FREQ,
  64. MEMLAT_SET_MAX_FREQ,
  65. MEMLAT_GET_CUR_FREQ,
  66. MEMLAT_START_TIMER,
  67. MEMLAT_STOP_TIMER,
  68. MEMLAT_GET_TIMESTAMP,
  69. MEMLAT_MAX_MSG
  70. };
  71. struct map_table {
  72. uint16_t v1;
  73. uint16_t v2;
  74. };
  75. struct map_param_msg {
  76. uint32_t hw_type;
  77. uint32_t mon_idx;
  78. uint32_t nr_rows;
  79. struct map_table tbl[MAX_MAP_ENTRIES];
  80. } __packed;
  81. struct node_msg {
  82. uint32_t cpumask;
  83. uint32_t hw_type;
  84. uint32_t mon_type;
  85. uint32_t mon_idx;
  86. char mon_name[MAX_NAME_LEN];
  87. };
  88. struct scalar_param_msg {
  89. uint32_t hw_type;
  90. uint32_t mon_idx;
  91. uint32_t val;
  92. };
  93. enum common_ev_idx {
  94. INST_IDX,
  95. CYC_IDX,
  96. FE_STALL_IDX,
  97. BE_STALL_IDX,
  98. NUM_COMMON_EVS
  99. };
  100. enum grp_ev_idx {
  101. MISS_IDX,
  102. WB_IDX,
  103. ACC_IDX,
  104. NUM_GRP_EVS
  105. };
  106. struct ev_map_msg {
  107. uint32_t num_evs;
  108. uint32_t hw_type;
  109. uint8_t cid[NUM_COMMON_EVS];
  110. };
  111. enum mon_type {
  112. SAMPLING_MON = BIT(0),
  113. THREADLAT_MON = BIT(1),
  114. CPUCP_MON = BIT(2),
  115. NUM_MON_TYPES
  116. };
  117. #define SAMPLING_VOTER (num_possible_cpus())
  118. #define NUM_FP_VOTERS (SAMPLING_VOTER + 1)
  119. enum memlat_type {
  120. MEMLAT_DEV,
  121. MEMLAT_GRP,
  122. MEMLAT_MON,
  123. NUM_MEMLAT_TYPES
  124. };
  125. struct memlat_spec {
  126. enum memlat_type type;
  127. };
  128. struct cpu_ctrs {
  129. u64 common_ctrs[NUM_COMMON_EVS];
  130. u64 grp_ctrs[MAX_MEMLAT_GRPS][NUM_GRP_EVS];
  131. };
  132. struct cpu_stats {
  133. struct cpu_ctrs prev;
  134. struct cpu_ctrs curr;
  135. struct cpu_ctrs delta;
  136. struct qcom_pmu_data raw_ctrs;
  137. bool idle_sample;
  138. ktime_t sample_ts;
  139. ktime_t last_sample_ts;
  140. spinlock_t ctrs_lock;
  141. u32 freq_mhz;
  142. u32 fe_stall_pct;
  143. u32 be_stall_pct;
  144. u32 ipm[MAX_MEMLAT_GRPS];
  145. u32 wb_pct[MAX_MEMLAT_GRPS];
  146. };
  147. struct cpufreq_memfreq_map {
  148. unsigned int cpufreq_mhz;
  149. unsigned int memfreq_khz;
  150. };
  151. /* cur_freq is maintained by sampling algorithm only */
  152. struct memlat_mon {
  153. struct device *dev;
  154. struct memlat_group *memlat_grp;
  155. enum mon_type type;
  156. u32 cpus_mpidr;
  157. cpumask_t cpus;
  158. struct cpufreq_memfreq_map *freq_map;
  159. u32 freq_map_len;
  160. u32 ipm_ceil;
  161. u32 fe_stall_floor;
  162. u32 be_stall_floor;
  163. u32 freq_scale_pct;
  164. u32 freq_scale_ceil_mhz;
  165. u32 freq_scale_floor_mhz;
  166. u32 wb_pct_thres;
  167. u32 wb_filter_ipm;
  168. u32 min_freq;
  169. u32 max_freq;
  170. u32 mon_min_freq;
  171. u32 mon_max_freq;
  172. u32 cur_freq;
  173. struct kobject kobj;
  174. bool is_compute;
  175. u32 index;
  176. };
  177. struct memlat_group {
  178. struct device *dev;
  179. struct kobject *dcvs_kobj;
  180. enum dcvs_hw_type hw_type;
  181. enum dcvs_path_type sampling_path_type;
  182. enum dcvs_path_type threadlat_path_type;
  183. bool cpucp_enabled;
  184. u32 sampling_cur_freq;
  185. u32 adaptive_cur_freq;
  186. u32 adaptive_high_freq;
  187. u32 adaptive_low_freq;
  188. bool fp_voting_enabled;
  189. u32 fp_freq;
  190. u32 *fp_votes;
  191. u32 grp_ev_ids[NUM_GRP_EVS];
  192. struct memlat_mon *mons;
  193. u32 num_mons;
  194. u32 num_inited_mons;
  195. struct mutex mons_lock;
  196. struct kobject kobj;
  197. };
  198. struct memlat_dev_data {
  199. struct device *dev;
  200. struct kobject kobj;
  201. u32 common_ev_ids[NUM_COMMON_EVS];
  202. struct work_struct work;
  203. struct workqueue_struct *memlat_wq;
  204. u32 sample_ms;
  205. struct hrtimer timer;
  206. ktime_t last_update_ts;
  207. ktime_t last_jiffy_ts;
  208. struct memlat_group *groups[MAX_MEMLAT_GRPS];
  209. int num_grps;
  210. int num_inited_grps;
  211. spinlock_t fp_agg_lock;
  212. spinlock_t fp_commit_lock;
  213. bool fp_enabled;
  214. bool sampling_enabled;
  215. bool inited;
  216. /* CPUCP related struct fields */
  217. const struct qcom_scmi_vendor_ops *ops;
  218. struct scmi_protocol_handle *ph;
  219. u32 cpucp_sample_ms;
  220. u32 cpucp_log_level;
  221. };
  222. static struct memlat_dev_data *memlat_data;
  223. static DEFINE_PER_CPU(struct cpu_stats *, sampling_stats);
  224. static DEFINE_MUTEX(memlat_lock);
  225. struct qcom_memlat_attr {
  226. struct attribute attr;
  227. ssize_t (*show)(struct kobject *kobj, struct attribute *attr,
  228. char *buf);
  229. ssize_t (*store)(struct kobject *kobj, struct attribute *attr,
  230. const char *buf, size_t count);
  231. };
  232. #define to_memlat_attr(_attr) \
  233. container_of(_attr, struct qcom_memlat_attr, attr)
  234. #define to_memlat_mon(k) container_of(k, struct memlat_mon, kobj)
  235. #define to_memlat_grp(k) container_of(k, struct memlat_group, kobj)
  236. #define MEMLAT_ATTR_RW(_name) \
  237. static struct qcom_memlat_attr _name = \
  238. __ATTR(_name, 0644, show_##_name, store_##_name) \
  239. #define MEMLAT_ATTR_RO(_name) \
  240. static struct qcom_memlat_attr _name = \
  241. __ATTR(_name, 0444, show_##_name, NULL) \
  242. #define show_attr(name) \
  243. static ssize_t show_##name(struct kobject *kobj, \
  244. struct attribute *attr, char *buf) \
  245. { \
  246. struct memlat_mon *mon = to_memlat_mon(kobj); \
  247. return scnprintf(buf, PAGE_SIZE, "%u\n", mon->name); \
  248. } \
  249. #define store_attr(name, _min, _max, param_id) \
  250. static ssize_t store_##name(struct kobject *kobj, \
  251. struct attribute *attr, const char *buf, \
  252. size_t count) \
  253. { \
  254. int ret; \
  255. unsigned int val; \
  256. struct scalar_param_msg msg; \
  257. struct memlat_mon *mon = to_memlat_mon(kobj); \
  258. struct memlat_group *grp = mon->memlat_grp; \
  259. const struct qcom_scmi_vendor_ops *ops = memlat_data->ops; \
  260. ret = kstrtouint(buf, 10, &val); \
  261. if (ret < 0) \
  262. return ret; \
  263. val = max(val, _min); \
  264. val = min(val, _max); \
  265. mon->name = val; \
  266. if ((mon->type & CPUCP_MON) && ops) { \
  267. msg.hw_type = grp->hw_type; \
  268. msg.mon_idx = mon->index; \
  269. msg.val = val; \
  270. ret = ops->set_param(memlat_data->ph, &msg, MEMLAT_ALGO_STR, \
  271. param_id, sizeof(msg)); \
  272. if (ret < 0) { \
  273. pr_err("failed to set mon tunable :%d\n", ret); \
  274. return ret; \
  275. } \
  276. } \
  277. return count; \
  278. } \
  279. #define show_grp_attr(name) \
  280. static ssize_t show_##name(struct kobject *kobj, \
  281. struct attribute *attr, char *buf) \
  282. { \
  283. struct memlat_group *grp = to_memlat_grp(kobj); \
  284. return scnprintf(buf, PAGE_SIZE, "%u\n", grp->name); \
  285. } \
  286. #define store_grp_attr(name, _min, _max, param_id) \
  287. static ssize_t store_##name(struct kobject *kobj, \
  288. struct attribute *attr, const char *buf, \
  289. size_t count) \
  290. { \
  291. int ret; \
  292. unsigned int val; \
  293. struct scalar_param_msg msg; \
  294. struct memlat_group *grp = to_memlat_grp(kobj); \
  295. const struct qcom_scmi_vendor_ops *ops = memlat_data->ops; \
  296. ret = kstrtouint(buf, 10, &val); \
  297. if (ret < 0) \
  298. return ret; \
  299. val = max(val, _min); \
  300. val = min(val, _max); \
  301. grp->name = val; \
  302. if (grp->cpucp_enabled && ops) { \
  303. msg.hw_type = grp->hw_type; \
  304. msg.mon_idx = 0; \
  305. msg.val = val; \
  306. ret = ops->set_param(memlat_data->ph, &msg, MEMLAT_ALGO_STR, \
  307. param_id, sizeof(msg)); \
  308. if (ret < 0) { \
  309. pr_err("failed to set grp tunable :%d\n", ret); \
  310. return ret; \
  311. } \
  312. } \
  313. return count; \
  314. }
  315. static ssize_t store_min_freq(struct kobject *kobj,
  316. struct attribute *attr, const char *buf,
  317. size_t count)
  318. {
  319. int ret;
  320. unsigned int freq;
  321. struct memlat_mon *mon = to_memlat_mon(kobj);
  322. struct memlat_group *grp = mon->memlat_grp;
  323. struct scalar_param_msg msg;
  324. const struct qcom_scmi_vendor_ops *ops = memlat_data->ops;
  325. ret = kstrtouint(buf, 10, &freq);
  326. if (ret < 0)
  327. return ret;
  328. freq = max(freq, mon->mon_min_freq);
  329. freq = min(freq, mon->max_freq);
  330. mon->min_freq = freq;
  331. if ((mon->type & CPUCP_MON) && ops) {
  332. msg.hw_type = grp->hw_type;
  333. msg.mon_idx = mon->index;
  334. msg.val = mon->min_freq;
  335. ret = ops->set_param(memlat_data->ph,
  336. &msg, MEMLAT_ALGO_STR, MEMLAT_SET_MIN_FREQ, sizeof(msg));
  337. if (ret < 0) {
  338. pr_err("failed to set min_freq :%d\n", ret);
  339. return ret;
  340. }
  341. }
  342. return count;
  343. }
  344. static ssize_t store_max_freq(struct kobject *kobj,
  345. struct attribute *attr, const char *buf,
  346. size_t count)
  347. {
  348. int ret;
  349. unsigned int freq;
  350. struct memlat_mon *mon = to_memlat_mon(kobj);
  351. struct memlat_group *grp = mon->memlat_grp;
  352. struct scalar_param_msg msg;
  353. const struct qcom_scmi_vendor_ops *ops = memlat_data->ops;
  354. ret = kstrtouint(buf, 10, &freq);
  355. if (ret < 0)
  356. return ret;
  357. freq = max(freq, mon->min_freq);
  358. freq = min(freq, mon->mon_max_freq);
  359. mon->max_freq = freq;
  360. if ((mon->type & CPUCP_MON) && ops) {
  361. msg.hw_type = grp->hw_type;
  362. msg.mon_idx = mon->index;
  363. msg.val = mon->max_freq;
  364. ret = ops->set_param(memlat_data->ph,
  365. &msg, MEMLAT_ALGO_STR, MEMLAT_SET_MAX_FREQ, sizeof(msg));
  366. if (ret < 0) {
  367. pr_err("failed to set max_freq :%d\n", ret);
  368. return ret;
  369. }
  370. }
  371. return count;
  372. }
  373. static ssize_t show_freq_map(struct kobject *kobj,
  374. struct attribute *attr, char *buf)
  375. {
  376. struct memlat_mon *mon = to_memlat_mon(kobj);
  377. struct cpufreq_memfreq_map *map = mon->freq_map;
  378. unsigned int cnt = 0;
  379. cnt += scnprintf(buf, PAGE_SIZE, "CPU freq (MHz)\tMem freq (kHz)\n");
  380. while (map->cpufreq_mhz && cnt < PAGE_SIZE) {
  381. cnt += scnprintf(buf + cnt, PAGE_SIZE - cnt, "%14u\t%14u\n",
  382. map->cpufreq_mhz, map->memfreq_khz);
  383. map++;
  384. }
  385. if (cnt < PAGE_SIZE)
  386. cnt += scnprintf(buf + cnt, PAGE_SIZE - cnt, "\n");
  387. return cnt;
  388. }
  389. static int update_cpucp_sample_ms(unsigned int val)
  390. {
  391. const struct qcom_scmi_vendor_ops *ops = memlat_data->ops;
  392. struct memlat_group *grp;
  393. int i, ret;
  394. if (!ops)
  395. return -ENODEV;
  396. for (i = 0; i < MAX_MEMLAT_GRPS; i++) {
  397. grp = memlat_data->groups[i];
  398. if (grp && grp->cpucp_enabled)
  399. break;
  400. }
  401. if (i == MAX_MEMLAT_GRPS)
  402. return 0;
  403. ret = ops->set_param(memlat_data->ph, &val,
  404. MEMLAT_ALGO_STR, MEMLAT_SAMPLE_MS, sizeof(val));
  405. if (ret < 0) {
  406. pr_err("Failed to set cpucp sample ms :%d\n", ret);
  407. return ret;
  408. }
  409. memlat_data->cpucp_sample_ms = val;
  410. return ret;
  411. }
  412. #define MIN_SAMPLE_MS 4U
  413. #define MAX_SAMPLE_MS 1000U
  414. static ssize_t store_sample_ms(struct kobject *kobj,
  415. struct attribute *attr, const char *buf,
  416. size_t count)
  417. {
  418. int ret;
  419. unsigned int val;
  420. ret = kstrtouint(buf, 10, &val);
  421. if (ret < 0)
  422. return ret;
  423. val = max(val, MIN_SAMPLE_MS);
  424. val = min(val, MAX_SAMPLE_MS);
  425. memlat_data->sample_ms = val;
  426. if (memlat_data->ops) {
  427. ret = update_cpucp_sample_ms(val);
  428. if (ret < 0)
  429. pr_err("Warning: CPUCP sample_ms not set: %d\n", ret);
  430. }
  431. return count;
  432. }
  433. static ssize_t show_sample_ms(struct kobject *kobj,
  434. struct attribute *attr, char *buf)
  435. {
  436. return scnprintf(buf, PAGE_SIZE, "%u\n", memlat_data->sample_ms);
  437. }
  438. static ssize_t store_cpucp_sample_ms(struct kobject *kobj,
  439. struct attribute *attr, const char *buf,
  440. size_t count)
  441. {
  442. int ret;
  443. unsigned int val;
  444. ret = kstrtouint(buf, 10, &val);
  445. if (ret < 0)
  446. return ret;
  447. val = max(val, MIN_SAMPLE_MS);
  448. val = min(val, MAX_SAMPLE_MS);
  449. ret = update_cpucp_sample_ms(val);
  450. if (ret < 0)
  451. return ret;
  452. return count;
  453. }
  454. static ssize_t show_cpucp_sample_ms(struct kobject *kobj,
  455. struct attribute *attr, char *buf)
  456. {
  457. return scnprintf(buf, PAGE_SIZE, "%lu\n", memlat_data->cpucp_sample_ms);
  458. }
  459. static ssize_t store_cpucp_log_level(struct kobject *kobj,
  460. struct attribute *attr, const char *buf,
  461. size_t count)
  462. {
  463. int ret, i;
  464. unsigned int val;
  465. const struct qcom_scmi_vendor_ops *ops = memlat_data->ops;
  466. struct memlat_group *grp;
  467. if (!ops)
  468. return -ENODEV;
  469. for (i = 0; i < MAX_MEMLAT_GRPS; i++) {
  470. grp = memlat_data->groups[i];
  471. if (grp && grp->cpucp_enabled)
  472. break;
  473. }
  474. if (i == MAX_MEMLAT_GRPS)
  475. return count;
  476. ret = kstrtouint(buf, 10, &val);
  477. if (ret < 0)
  478. return ret;
  479. ret = ops->set_param(memlat_data->ph, &val,
  480. MEMLAT_ALGO_STR, MEMLAT_SET_LOG_LEVEL, sizeof(val));
  481. if (ret < 0) {
  482. pr_err("failed to configure log_level, ret = %d\n", ret);
  483. return ret;
  484. }
  485. memlat_data->cpucp_log_level = val;
  486. return count;
  487. }
  488. static ssize_t show_cpucp_log_level(struct kobject *kobj,
  489. struct attribute *attr, char *buf)
  490. {
  491. return scnprintf(buf, PAGE_SIZE, "%lu\n", memlat_data->cpucp_log_level);
  492. }
  493. static ssize_t store_flush_cpucp_log(struct kobject *kobj,
  494. struct attribute *attr, const char *buf,
  495. size_t count)
  496. {
  497. int ret;
  498. const struct qcom_scmi_vendor_ops *ops = memlat_data->ops;
  499. if (!ops)
  500. return -ENODEV;
  501. ret = ops->set_param(memlat_data->ph, 0,
  502. MEMLAT_ALGO_STR, MEMLAT_FLUSH_LOGBUF, 0);
  503. if (ret < 0) {
  504. pr_err("failed to flush cpucp log, ret = %d\n", ret);
  505. return ret;
  506. }
  507. return count;
  508. }
  509. static ssize_t show_flush_cpucp_log(struct kobject *kobj,
  510. struct attribute *attr, char *buf)
  511. {
  512. return scnprintf(buf, PAGE_SIZE, "Echo here to flush cpucp logs\n");
  513. }
  514. static ssize_t show_hlos_cpucp_offset(struct kobject *kobj,
  515. struct attribute *attr, char *buf)
  516. {
  517. int ret;
  518. const struct qcom_scmi_vendor_ops *ops = memlat_data->ops;
  519. uint64_t cpucp_ts, hlos_ts;
  520. if (!ops)
  521. return -ENODEV;
  522. ret = ops->get_param(memlat_data->ph, &cpucp_ts,
  523. MEMLAT_ALGO_STR, MEMLAT_GET_TIMESTAMP, 0, sizeof(cpucp_ts));
  524. if (ret < 0) {
  525. pr_err("failed to get cpucp timestamp\n");
  526. return ret;
  527. }
  528. hlos_ts = sched_clock()/1000;
  529. return scnprintf(buf, PAGE_SIZE, "%ld\n", le64_to_cpu(cpucp_ts) - hlos_ts);
  530. }
  531. static ssize_t show_cur_freq(struct kobject *kobj,
  532. struct attribute *attr, char *buf)
  533. {
  534. struct scalar_param_msg msg;
  535. const struct qcom_scmi_vendor_ops *ops = memlat_data->ops;
  536. struct memlat_mon *mon = to_memlat_mon(kobj);
  537. struct memlat_group *grp = mon->memlat_grp;
  538. uint32_t cur_freq;
  539. int ret;
  540. if (!grp->cpucp_enabled)
  541. return scnprintf(buf, PAGE_SIZE, "%lu\n", mon->cur_freq);
  542. if (!ops)
  543. return -ENODEV;
  544. msg.hw_type = grp->hw_type;
  545. msg.mon_idx = mon->index;
  546. ret = ops->get_param(memlat_data->ph, &msg,
  547. MEMLAT_ALGO_STR, MEMLAT_GET_CUR_FREQ, sizeof(msg), sizeof(cur_freq));
  548. if (ret < 0) {
  549. pr_err("failed to get mon current frequency\n");
  550. return ret;
  551. }
  552. memcpy(&cur_freq, (void *)&msg, sizeof(cur_freq));
  553. return scnprintf(buf, PAGE_SIZE, "%lu\n", le32_to_cpu(cur_freq));
  554. }
  555. static ssize_t show_adaptive_cur_freq(struct kobject *kobj,
  556. struct attribute *attr, char *buf)
  557. {
  558. struct scalar_param_msg msg;
  559. const struct qcom_scmi_vendor_ops *ops = memlat_data->ops;
  560. uint32_t adaptive_cur_freq;
  561. struct memlat_group *grp = to_memlat_grp(kobj);
  562. int ret;
  563. if (!grp->cpucp_enabled)
  564. return scnprintf(buf, PAGE_SIZE, "%lu\n", grp->adaptive_cur_freq);
  565. if (!ops)
  566. return -ENODEV;
  567. msg.hw_type = grp->hw_type;
  568. msg.mon_idx = 0;
  569. ret = ops->get_param(memlat_data->ph, &msg, MEMLAT_ALGO_STR,
  570. MEMLAT_GET_ADAPTIVE_CUR_FREQ, sizeof(msg), sizeof(adaptive_cur_freq));
  571. if (ret < 0) {
  572. pr_err("failed to get grp adaptive current frequency\n");
  573. return ret;
  574. }
  575. memcpy(&adaptive_cur_freq, &msg, sizeof(adaptive_cur_freq));
  576. return scnprintf(buf, PAGE_SIZE, "%lu\n", le32_to_cpu(adaptive_cur_freq));
  577. }
  578. show_grp_attr(sampling_cur_freq);
  579. show_grp_attr(adaptive_high_freq);
  580. store_grp_attr(adaptive_high_freq, 0U, 8000000U, MEMLAT_ADAPTIVE_HIGH_FREQ);
  581. show_grp_attr(adaptive_low_freq);
  582. store_grp_attr(adaptive_low_freq, 0U, 8000000U, MEMLAT_ADAPTIVE_LOW_FREQ);
  583. show_attr(min_freq);
  584. show_attr(max_freq);
  585. show_attr(ipm_ceil);
  586. store_attr(ipm_ceil, 1U, 50000U, MEMLAT_IPM_CEIL);
  587. show_attr(fe_stall_floor);
  588. store_attr(fe_stall_floor, 0U, 100U, MEMLAT_FE_STALL_FLOOR);
  589. show_attr(be_stall_floor);
  590. store_attr(be_stall_floor, 0U, 100U, MEMLAT_BE_STALL_FLOOR);
  591. show_attr(freq_scale_pct);
  592. store_attr(freq_scale_pct, 0U, 1000U, MEMLAT_FREQ_SCALE_PCT);
  593. show_attr(wb_pct_thres);
  594. store_attr(wb_pct_thres, 0U, 100U, MEMLAT_WB_PCT);
  595. show_attr(wb_filter_ipm);
  596. store_attr(wb_filter_ipm, 0U, 50000U, MEMLAT_IPM_FILTER);
  597. show_attr(freq_scale_ceil_mhz);
  598. store_attr(freq_scale_ceil_mhz, 0U, 5000U, MEMLAT_FREQ_SCALE_CEIL_MHZ);
  599. show_attr(freq_scale_floor_mhz);
  600. store_attr(freq_scale_floor_mhz, 0U, 5000U, MEMLAT_FREQ_SCALE_FLOOR_MHZ);
  601. MEMLAT_ATTR_RW(sample_ms);
  602. MEMLAT_ATTR_RW(cpucp_sample_ms);
  603. MEMLAT_ATTR_RW(cpucp_log_level);
  604. MEMLAT_ATTR_RW(flush_cpucp_log);
  605. MEMLAT_ATTR_RO(hlos_cpucp_offset);
  606. MEMLAT_ATTR_RO(sampling_cur_freq);
  607. MEMLAT_ATTR_RO(adaptive_cur_freq);
  608. MEMLAT_ATTR_RW(adaptive_low_freq);
  609. MEMLAT_ATTR_RW(adaptive_high_freq);
  610. MEMLAT_ATTR_RW(min_freq);
  611. MEMLAT_ATTR_RW(max_freq);
  612. MEMLAT_ATTR_RO(freq_map);
  613. MEMLAT_ATTR_RO(cur_freq);
  614. MEMLAT_ATTR_RW(ipm_ceil);
  615. MEMLAT_ATTR_RW(fe_stall_floor);
  616. MEMLAT_ATTR_RW(be_stall_floor);
  617. MEMLAT_ATTR_RW(freq_scale_pct);
  618. MEMLAT_ATTR_RW(wb_pct_thres);
  619. MEMLAT_ATTR_RW(wb_filter_ipm);
  620. MEMLAT_ATTR_RW(freq_scale_ceil_mhz);
  621. MEMLAT_ATTR_RW(freq_scale_floor_mhz);
  622. static struct attribute *memlat_settings_attrs[] = {
  623. &sample_ms.attr,
  624. &cpucp_sample_ms.attr,
  625. &cpucp_log_level.attr,
  626. &flush_cpucp_log.attr,
  627. &hlos_cpucp_offset.attr,
  628. NULL,
  629. };
  630. ATTRIBUTE_GROUPS(memlat_settings);
  631. static struct attribute *memlat_grp_attrs[] = {
  632. &sampling_cur_freq.attr,
  633. &adaptive_cur_freq.attr,
  634. &adaptive_high_freq.attr,
  635. &adaptive_low_freq.attr,
  636. NULL,
  637. };
  638. ATTRIBUTE_GROUPS(memlat_grp);
  639. static struct attribute *memlat_mon_attrs[] = {
  640. &min_freq.attr,
  641. &max_freq.attr,
  642. &freq_map.attr,
  643. &cur_freq.attr,
  644. &ipm_ceil.attr,
  645. &fe_stall_floor.attr,
  646. &be_stall_floor.attr,
  647. &freq_scale_pct.attr,
  648. &wb_pct_thres.attr,
  649. &wb_filter_ipm.attr,
  650. &freq_scale_ceil_mhz.attr,
  651. &freq_scale_floor_mhz.attr,
  652. NULL,
  653. };
  654. ATTRIBUTE_GROUPS(memlat_mon);
  655. static struct attribute *compute_mon_attrs[] = {
  656. &min_freq.attr,
  657. &max_freq.attr,
  658. &freq_map.attr,
  659. &cur_freq.attr,
  660. NULL,
  661. };
  662. ATTRIBUTE_GROUPS(compute_mon);
  663. static ssize_t attr_show(struct kobject *kobj, struct attribute *attr,
  664. char *buf)
  665. {
  666. struct qcom_memlat_attr *memlat_attr = to_memlat_attr(attr);
  667. ssize_t ret = -EIO;
  668. if (memlat_attr->show)
  669. ret = memlat_attr->show(kobj, attr, buf);
  670. return ret;
  671. }
  672. static ssize_t attr_store(struct kobject *kobj, struct attribute *attr,
  673. const char *buf, size_t count)
  674. {
  675. struct qcom_memlat_attr *memlat_attr = to_memlat_attr(attr);
  676. ssize_t ret = -EIO;
  677. if (memlat_attr->store)
  678. ret = memlat_attr->store(kobj, attr, buf, count);
  679. return ret;
  680. }
  681. static const struct sysfs_ops memlat_sysfs_ops = {
  682. .show = attr_show,
  683. .store = attr_store,
  684. };
  685. static struct kobj_type memlat_settings_ktype = {
  686. .sysfs_ops = &memlat_sysfs_ops,
  687. .default_groups = memlat_settings_groups,
  688. };
  689. static struct kobj_type memlat_mon_ktype = {
  690. .sysfs_ops = &memlat_sysfs_ops,
  691. .default_groups = memlat_mon_groups,
  692. };
  693. static struct kobj_type compute_mon_ktype = {
  694. .sysfs_ops = &memlat_sysfs_ops,
  695. .default_groups = compute_mon_groups,
  696. };
  697. static struct kobj_type memlat_grp_ktype = {
  698. .sysfs_ops = &memlat_sysfs_ops,
  699. .default_groups = memlat_grp_groups,
  700. };
  701. static u32 cpufreq_to_memfreq(struct memlat_mon *mon, u32 cpu_mhz)
  702. {
  703. struct cpufreq_memfreq_map *map = mon->freq_map;
  704. u32 mem_khz = 0;
  705. if (!map)
  706. goto out;
  707. while (map->cpufreq_mhz && map->cpufreq_mhz < cpu_mhz)
  708. map++;
  709. if (!map->cpufreq_mhz)
  710. map--;
  711. mem_khz = map->memfreq_khz;
  712. out:
  713. return mem_khz;
  714. }
  715. static void calculate_sampling_stats(void)
  716. {
  717. int i, grp, cpu, level = 0;
  718. unsigned long flags;
  719. struct cpu_stats *stats;
  720. struct cpu_ctrs *delta;
  721. struct memlat_group *memlat_grp;
  722. ktime_t now = ktime_get();
  723. s64 delta_us, update_us;
  724. update_us = ktime_us_delta(now, memlat_data->last_update_ts);
  725. memlat_data->last_update_ts = now;
  726. local_irq_save(flags);
  727. for_each_possible_cpu(cpu) {
  728. stats = per_cpu(sampling_stats, cpu);
  729. if (level == 0)
  730. spin_lock(&stats->ctrs_lock);
  731. else
  732. spin_lock_nested(&stats->ctrs_lock, level);
  733. level++;
  734. }
  735. for_each_possible_cpu(cpu) {
  736. stats = per_cpu(sampling_stats, cpu);
  737. delta = &stats->delta;
  738. /* use update_us and now to synchronize idle cpus */
  739. if (stats->idle_sample) {
  740. delta_us = update_us;
  741. stats->last_sample_ts = now;
  742. } else {
  743. delta_us = ktime_us_delta(stats->sample_ts,
  744. stats->last_sample_ts);
  745. stats->last_sample_ts = stats->sample_ts;
  746. }
  747. for (i = 0; i < NUM_COMMON_EVS; i++) {
  748. if (!memlat_data->common_ev_ids[i])
  749. continue;
  750. delta->common_ctrs[i] = stats->curr.common_ctrs[i] -
  751. stats->prev.common_ctrs[i];
  752. }
  753. for (grp = 0; grp < MAX_MEMLAT_GRPS; grp++) {
  754. memlat_grp = memlat_data->groups[grp];
  755. if (!memlat_grp)
  756. continue;
  757. for (i = 0; i < NUM_GRP_EVS; i++) {
  758. if (!memlat_grp->grp_ev_ids[i])
  759. continue;
  760. delta->grp_ctrs[grp][i] =
  761. stats->curr.grp_ctrs[grp][i] -
  762. stats->prev.grp_ctrs[grp][i];
  763. }
  764. }
  765. stats->freq_mhz = delta->common_ctrs[CYC_IDX] / delta_us;
  766. if (!memlat_data->common_ev_ids[FE_STALL_IDX])
  767. stats->fe_stall_pct = 100;
  768. else
  769. stats->fe_stall_pct = mult_frac(100,
  770. delta->common_ctrs[FE_STALL_IDX],
  771. delta->common_ctrs[CYC_IDX]);
  772. if (!memlat_data->common_ev_ids[BE_STALL_IDX])
  773. stats->be_stall_pct = 100;
  774. else
  775. stats->be_stall_pct = mult_frac(100,
  776. delta->common_ctrs[BE_STALL_IDX],
  777. delta->common_ctrs[CYC_IDX]);
  778. for (grp = 0; grp < MAX_MEMLAT_GRPS; grp++) {
  779. memlat_grp = memlat_data->groups[grp];
  780. if (!memlat_grp) {
  781. stats->ipm[grp] = 0;
  782. stats->wb_pct[grp] = 0;
  783. continue;
  784. }
  785. stats->ipm[grp] = delta->common_ctrs[INST_IDX];
  786. if (delta->grp_ctrs[grp][MISS_IDX])
  787. stats->ipm[grp] /=
  788. delta->grp_ctrs[grp][MISS_IDX];
  789. if (!memlat_grp->grp_ev_ids[WB_IDX]
  790. || !memlat_grp->grp_ev_ids[ACC_IDX])
  791. stats->wb_pct[grp] = 0;
  792. else
  793. stats->wb_pct[grp] = mult_frac(100,
  794. delta->grp_ctrs[grp][WB_IDX],
  795. delta->grp_ctrs[grp][ACC_IDX]);
  796. /* one meas event per memlat_group with group name */
  797. trace_memlat_dev_meas(dev_name(memlat_grp->dev), cpu,
  798. delta->common_ctrs[INST_IDX],
  799. delta->grp_ctrs[grp][MISS_IDX],
  800. stats->freq_mhz, stats->be_stall_pct,
  801. stats->wb_pct[grp], stats->ipm[grp],
  802. stats->fe_stall_pct);
  803. }
  804. memcpy(&stats->prev, &stats->curr, sizeof(stats->curr));
  805. }
  806. for_each_possible_cpu(cpu) {
  807. stats = per_cpu(sampling_stats, cpu);
  808. spin_unlock(&stats->ctrs_lock);
  809. }
  810. local_irq_restore(flags);
  811. }
  812. static inline void set_higher_freq(int *max_cpu, int cpu, u32 *max_cpufreq,
  813. u32 cpufreq)
  814. {
  815. if (cpufreq > *max_cpufreq) {
  816. *max_cpu = cpu;
  817. *max_cpufreq = cpufreq;
  818. }
  819. }
  820. static inline void apply_adaptive_freq(struct memlat_group *memlat_grp,
  821. u32 *max_freq)
  822. {
  823. u32 prev_freq = memlat_grp->adaptive_cur_freq;
  824. if (*max_freq < memlat_grp->adaptive_low_freq) {
  825. *max_freq = memlat_grp->adaptive_low_freq;
  826. memlat_grp->adaptive_cur_freq = memlat_grp->adaptive_low_freq;
  827. } else if (*max_freq < memlat_grp->adaptive_high_freq) {
  828. *max_freq = memlat_grp->adaptive_high_freq;
  829. memlat_grp->adaptive_cur_freq = memlat_grp->adaptive_high_freq;
  830. } else
  831. memlat_grp->adaptive_cur_freq = memlat_grp->adaptive_high_freq;
  832. if (prev_freq != memlat_grp->adaptive_cur_freq)
  833. trace_memlat_dev_update(dev_name(memlat_grp->dev),
  834. 0, 0, 0, 0, memlat_grp->adaptive_cur_freq);
  835. }
  836. static void calculate_mon_sampling_freq(struct memlat_mon *mon)
  837. {
  838. struct cpu_stats *stats;
  839. int cpu, max_cpu = cpumask_first(&mon->cpus);
  840. u32 max_memfreq, max_cpufreq = 0;
  841. u32 max_cpufreq_scaled = 0, ipm_diff;
  842. u32 hw = mon->memlat_grp->hw_type;
  843. if (hw >= NUM_DCVS_HW_TYPES)
  844. return;
  845. for_each_cpu(cpu, &mon->cpus) {
  846. stats = per_cpu(sampling_stats, cpu);
  847. if (mon->is_compute || (stats->wb_pct[hw] >= mon->wb_pct_thres
  848. && stats->ipm[hw] <= mon->wb_filter_ipm))
  849. set_higher_freq(&max_cpu, cpu, &max_cpufreq,
  850. stats->freq_mhz);
  851. else if (stats->ipm[hw] <= mon->ipm_ceil) {
  852. ipm_diff = mon->ipm_ceil - stats->ipm[hw];
  853. max_cpufreq_scaled = stats->freq_mhz;
  854. if (mon->freq_scale_pct &&
  855. (stats->freq_mhz > mon->freq_scale_floor_mhz &&
  856. stats->freq_mhz < mon->freq_scale_ceil_mhz) &&
  857. (stats->fe_stall_pct >= mon->fe_stall_floor ||
  858. stats->be_stall_pct >= mon->be_stall_floor)) {
  859. max_cpufreq_scaled += (stats->freq_mhz * ipm_diff *
  860. mon->freq_scale_pct) / (mon->ipm_ceil * 100);
  861. max_cpufreq_scaled = min(mon->freq_scale_ceil_mhz,
  862. max_cpufreq_scaled);
  863. }
  864. set_higher_freq(&max_cpu, cpu, &max_cpufreq,
  865. max_cpufreq_scaled);
  866. }
  867. }
  868. max_memfreq = cpufreq_to_memfreq(mon, max_cpufreq);
  869. max_memfreq = max(max_memfreq, mon->min_freq);
  870. max_memfreq = min(max_memfreq, mon->max_freq);
  871. if (max_cpufreq || mon->cur_freq != mon->min_freq) {
  872. stats = per_cpu(sampling_stats, max_cpu);
  873. trace_memlat_dev_update(dev_name(mon->dev), max_cpu,
  874. stats->delta.common_ctrs[INST_IDX],
  875. stats->delta.grp_ctrs[hw][MISS_IDX],
  876. max_cpufreq, max_memfreq);
  877. }
  878. mon->cur_freq = max_memfreq;
  879. }
  880. /*
  881. * updates fast path votes for "cpu" (i.e. fp_votes index)
  882. * fp_freqs array length MAX_MEMLAT_GRPS (i.e. one freq per grp)
  883. */
  884. static void update_memlat_fp_vote(int cpu, u32 *fp_freqs)
  885. {
  886. struct dcvs_freq voted_freqs[MAX_MEMLAT_GRPS];
  887. u32 max_freqs[MAX_MEMLAT_GRPS] = { 0 };
  888. int grp, i, ret;
  889. unsigned long flags;
  890. struct memlat_group *memlat_grp;
  891. u32 commit_mask = 0;
  892. if (!memlat_data->fp_enabled || cpu > NUM_FP_VOTERS)
  893. return;
  894. local_irq_save(flags);
  895. spin_lock(&memlat_data->fp_agg_lock);
  896. for (grp = 0; grp < MAX_MEMLAT_GRPS; grp++) {
  897. memlat_grp = memlat_data->groups[grp];
  898. if (!memlat_grp || !memlat_grp->fp_voting_enabled)
  899. continue;
  900. memlat_grp->fp_votes[cpu] = fp_freqs[grp];
  901. /* aggregate across all "cpus" */
  902. for (i = 0; i < NUM_FP_VOTERS; i++)
  903. max_freqs[grp] = max(memlat_grp->fp_votes[i],
  904. max_freqs[grp]);
  905. if (max_freqs[grp] != memlat_grp->fp_freq)
  906. commit_mask |= BIT(grp);
  907. }
  908. if (!commit_mask) {
  909. spin_unlock(&memlat_data->fp_agg_lock);
  910. local_irq_restore(flags);
  911. return;
  912. }
  913. spin_lock_nested(&memlat_data->fp_commit_lock, SINGLE_DEPTH_NESTING);
  914. for (grp = 0; grp < MAX_MEMLAT_GRPS; grp++) {
  915. if (!(commit_mask & BIT(grp)))
  916. continue;
  917. memlat_grp = memlat_data->groups[grp];
  918. memlat_grp->fp_freq = max_freqs[grp];
  919. }
  920. spin_unlock(&memlat_data->fp_agg_lock);
  921. for (grp = 0; grp < MAX_MEMLAT_GRPS; grp++) {
  922. if (!(commit_mask & BIT(grp)))
  923. continue;
  924. voted_freqs[grp].ib = max_freqs[grp];
  925. voted_freqs[grp].hw_type = grp;
  926. }
  927. ret = qcom_dcvs_update_votes(FP_NAME, voted_freqs, commit_mask,
  928. DCVS_FAST_PATH);
  929. if (ret < 0)
  930. pr_err("error updating qcom dcvs fp: %d\n", ret);
  931. spin_unlock(&memlat_data->fp_commit_lock);
  932. local_irq_restore(flags);
  933. }
  934. /* sampling path update work */
  935. static void memlat_update_work(struct work_struct *work)
  936. {
  937. int i, grp, ret;
  938. struct memlat_group *memlat_grp;
  939. struct memlat_mon *mon;
  940. struct dcvs_freq new_freq;
  941. u32 max_freqs[MAX_MEMLAT_GRPS] = { 0 };
  942. /* aggregate mons to calculate max freq per memlat_group */
  943. for (grp = 0; grp < MAX_MEMLAT_GRPS; grp++) {
  944. memlat_grp = memlat_data->groups[grp];
  945. if (!memlat_grp)
  946. continue;
  947. for (i = 0; i < memlat_grp->num_inited_mons; i++) {
  948. mon = &memlat_grp->mons[i];
  949. if (!mon || !(mon->type & SAMPLING_MON))
  950. continue;
  951. calculate_mon_sampling_freq(mon);
  952. max_freqs[grp] = max(mon->cur_freq, max_freqs[grp]);
  953. }
  954. if (memlat_grp->adaptive_high_freq ||
  955. memlat_grp->adaptive_low_freq ||
  956. memlat_grp->adaptive_cur_freq)
  957. apply_adaptive_freq(memlat_grp, &max_freqs[grp]);
  958. }
  959. update_memlat_fp_vote(SAMPLING_VOTER, max_freqs);
  960. for (grp = 0; grp < MAX_MEMLAT_GRPS; grp++) {
  961. memlat_grp = memlat_data->groups[grp];
  962. if (!memlat_grp || memlat_grp->sampling_cur_freq == max_freqs[grp] ||
  963. memlat_grp->sampling_path_type == NUM_DCVS_PATHS)
  964. continue;
  965. memlat_grp->sampling_cur_freq = max_freqs[grp];
  966. if (memlat_grp->fp_voting_enabled)
  967. continue;
  968. new_freq.ib = max_freqs[grp];
  969. new_freq.ab = 0;
  970. new_freq.hw_type = grp;
  971. ret = qcom_dcvs_update_votes(dev_name(memlat_grp->dev),
  972. &new_freq, 1, memlat_grp->sampling_path_type);
  973. if (ret < 0)
  974. dev_err(memlat_grp->dev, "qcom dcvs err: %d\n", ret);
  975. }
  976. }
  977. static enum hrtimer_restart memlat_hrtimer_handler(struct hrtimer *timer)
  978. {
  979. calculate_sampling_stats();
  980. queue_work(memlat_data->memlat_wq, &memlat_data->work);
  981. return HRTIMER_NORESTART;
  982. }
  983. static const u64 HALF_TICK_NS = (NSEC_PER_SEC / HZ) >> 1;
  984. #define MEMLAT_UPDATE_DELAY (100 * NSEC_PER_USEC)
  985. static void memlat_jiffies_update_cb(void *unused, void *extra)
  986. {
  987. ktime_t now = ktime_get();
  988. s64 delta_ns = now - memlat_data->last_jiffy_ts + HALF_TICK_NS;
  989. if (unlikely(!memlat_data->inited))
  990. return;
  991. if (delta_ns > ms_to_ktime(memlat_data->sample_ms)) {
  992. hrtimer_start(&memlat_data->timer, MEMLAT_UPDATE_DELAY,
  993. HRTIMER_MODE_REL_PINNED);
  994. memlat_data->last_jiffy_ts = now;
  995. }
  996. }
  997. /*
  998. * Note: must hold stats->ctrs_lock and populate stats->raw_ctrs
  999. * before calling this API.
  1000. */
  1001. static void process_raw_ctrs(struct cpu_stats *stats)
  1002. {
  1003. int i, grp, idx;
  1004. struct cpu_ctrs *curr_ctrs = &stats->curr;
  1005. struct qcom_pmu_data *raw_ctrs = &stats->raw_ctrs;
  1006. struct memlat_group *memlat_grp;
  1007. u32 event_id;
  1008. u64 ev_data;
  1009. for (i = 0; i < raw_ctrs->num_evs; i++) {
  1010. event_id = raw_ctrs->event_ids[i];
  1011. ev_data = raw_ctrs->ev_data[i];
  1012. if (!event_id)
  1013. break;
  1014. for (idx = 0; idx < NUM_COMMON_EVS; idx++) {
  1015. if (event_id != memlat_data->common_ev_ids[idx])
  1016. continue;
  1017. curr_ctrs->common_ctrs[idx] = ev_data;
  1018. break;
  1019. }
  1020. if (idx < NUM_COMMON_EVS)
  1021. continue;
  1022. for (grp = 0; grp < MAX_MEMLAT_GRPS; grp++) {
  1023. memlat_grp = memlat_data->groups[grp];
  1024. if (!memlat_grp)
  1025. continue;
  1026. for (idx = 0; idx < NUM_GRP_EVS; idx++) {
  1027. if (event_id != memlat_grp->grp_ev_ids[idx])
  1028. continue;
  1029. curr_ctrs->grp_ctrs[grp][idx] = ev_data;
  1030. break;
  1031. }
  1032. }
  1033. }
  1034. }
  1035. static void memlat_pmu_idle_cb(struct qcom_pmu_data *data, int cpu, int state)
  1036. {
  1037. struct cpu_stats *stats = per_cpu(sampling_stats, cpu);
  1038. unsigned long flags;
  1039. if (unlikely(!memlat_data->inited))
  1040. return;
  1041. spin_lock_irqsave(&stats->ctrs_lock, flags);
  1042. memcpy(&stats->raw_ctrs, data, sizeof(*data));
  1043. process_raw_ctrs(stats);
  1044. stats->idle_sample = true;
  1045. spin_unlock_irqrestore(&stats->ctrs_lock, flags);
  1046. }
  1047. static struct qcom_pmu_notif_node memlat_idle_notif = {
  1048. .idle_cb = memlat_pmu_idle_cb,
  1049. };
  1050. static void memlat_sched_tick_cb(void *unused, struct rq *rq)
  1051. {
  1052. int ret, cpu = smp_processor_id();
  1053. struct cpu_stats *stats = per_cpu(sampling_stats, cpu);
  1054. ktime_t now = ktime_get();
  1055. s64 delta_ns;
  1056. unsigned long flags;
  1057. if (unlikely(!memlat_data->inited))
  1058. return;
  1059. spin_lock_irqsave(&stats->ctrs_lock, flags);
  1060. delta_ns = now - stats->last_sample_ts + HALF_TICK_NS;
  1061. if (delta_ns < ms_to_ktime(memlat_data->sample_ms))
  1062. goto out;
  1063. stats->sample_ts = now;
  1064. stats->idle_sample = false;
  1065. stats->raw_ctrs.num_evs = 0;
  1066. ret = qcom_pmu_read_all_local(&stats->raw_ctrs);
  1067. if (ret < 0 || stats->raw_ctrs.num_evs == 0) {
  1068. pr_err("error reading pmu counters on cpu%d: %d\n", cpu, ret);
  1069. goto out;
  1070. }
  1071. process_raw_ctrs(stats);
  1072. out:
  1073. spin_unlock_irqrestore(&stats->ctrs_lock, flags);
  1074. }
  1075. static void get_mpidr_cpu(void *cpu)
  1076. {
  1077. u64 mpidr = read_cpuid_mpidr() & MPIDR_HWID_BITMASK;
  1078. *((uint32_t *)cpu) = MPIDR_AFFINITY_LEVEL(mpidr, 1);
  1079. }
  1080. static int get_mask_and_mpidr_from_pdev(struct platform_device *pdev,
  1081. cpumask_t *mask, u32 *cpus_mpidr)
  1082. {
  1083. struct device *dev = &pdev->dev;
  1084. struct device_node *dev_phandle;
  1085. struct device *cpu_dev;
  1086. int cpu, i = 0;
  1087. uint32_t physical_cpu;
  1088. int ret = -ENODEV;
  1089. dev_phandle = of_parse_phandle(dev->of_node, "qcom,cpulist", i++);
  1090. while (dev_phandle) {
  1091. for_each_possible_cpu(cpu) {
  1092. cpu_dev = get_cpu_device(cpu);
  1093. if (cpu_dev && cpu_dev->of_node == dev_phandle) {
  1094. cpumask_set_cpu(cpu, mask);
  1095. smp_call_function_single(cpu, get_mpidr_cpu,
  1096. &physical_cpu, true);
  1097. *cpus_mpidr |= BIT(physical_cpu);
  1098. ret = 0;
  1099. break;
  1100. }
  1101. }
  1102. dev_phandle = of_parse_phandle(dev->of_node, "qcom,cpulist", i++);
  1103. }
  1104. return ret;
  1105. }
  1106. #define COREDEV_TBL_PROP "qcom,cpufreq-memfreq-tbl"
  1107. #define NUM_COLS 2
  1108. static struct cpufreq_memfreq_map *init_cpufreq_memfreq_map(struct device *dev,
  1109. struct device_node *of_node,
  1110. u32 *cnt)
  1111. {
  1112. int len, nf, i, j;
  1113. u32 data;
  1114. struct cpufreq_memfreq_map *tbl;
  1115. int ret;
  1116. if (!of_find_property(of_node, COREDEV_TBL_PROP, &len))
  1117. return NULL;
  1118. len /= sizeof(data);
  1119. if (len % NUM_COLS || len == 0)
  1120. return NULL;
  1121. nf = len / NUM_COLS;
  1122. tbl = devm_kzalloc(dev, (nf + 1) * sizeof(struct cpufreq_memfreq_map),
  1123. GFP_KERNEL);
  1124. if (!tbl)
  1125. return NULL;
  1126. for (i = 0, j = 0; i < nf; i++, j += 2) {
  1127. ret = of_property_read_u32_index(of_node, COREDEV_TBL_PROP,
  1128. j, &data);
  1129. if (ret < 0)
  1130. return NULL;
  1131. tbl[i].cpufreq_mhz = data / 1000;
  1132. ret = of_property_read_u32_index(of_node, COREDEV_TBL_PROP,
  1133. j + 1, &data);
  1134. if (ret < 0)
  1135. return NULL;
  1136. tbl[i].memfreq_khz = data;
  1137. pr_debug("Entry%d CPU:%u, Mem:%u\n", i, tbl[i].cpufreq_mhz,
  1138. tbl[i].memfreq_khz);
  1139. }
  1140. *cnt = nf;
  1141. tbl[i].cpufreq_mhz = 0;
  1142. return tbl;
  1143. }
  1144. static bool memlat_grps_and_mons_inited(void)
  1145. {
  1146. struct memlat_group *memlat_grp;
  1147. int grp;
  1148. if (memlat_data->num_inited_grps < memlat_data->num_grps)
  1149. return false;
  1150. for (grp = 0; grp < MAX_MEMLAT_GRPS; grp++) {
  1151. memlat_grp = memlat_data->groups[grp];
  1152. if (!memlat_grp)
  1153. continue;
  1154. if (memlat_grp->num_inited_mons < memlat_grp->num_mons)
  1155. return false;
  1156. }
  1157. return true;
  1158. }
  1159. static int memlat_sampling_init(void)
  1160. {
  1161. int cpu;
  1162. struct device *dev = memlat_data->dev;
  1163. struct cpu_stats *stats;
  1164. for_each_possible_cpu(cpu) {
  1165. stats = devm_kzalloc(dev, sizeof(*stats), GFP_KERNEL);
  1166. if (!stats)
  1167. return -ENOMEM;
  1168. per_cpu(sampling_stats, cpu) = stats;
  1169. spin_lock_init(&stats->ctrs_lock);
  1170. }
  1171. memlat_data->memlat_wq = create_freezable_workqueue("memlat_wq");
  1172. if (!memlat_data->memlat_wq) {
  1173. dev_err(dev, "Couldn't create memlat workqueue.\n");
  1174. return -ENOMEM;
  1175. }
  1176. INIT_WORK(&memlat_data->work, &memlat_update_work);
  1177. hrtimer_init(&memlat_data->timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
  1178. memlat_data->timer.function = memlat_hrtimer_handler;
  1179. register_trace_android_vh_scheduler_tick(memlat_sched_tick_cb, NULL);
  1180. register_trace_android_vh_jiffies_update(memlat_jiffies_update_cb, NULL);
  1181. qcom_pmu_idle_register(&memlat_idle_notif);
  1182. return 0;
  1183. }
  1184. static inline bool should_enable_memlat_fp(void)
  1185. {
  1186. int grp;
  1187. struct memlat_group *memlat_grp;
  1188. /* wait until all groups have inited before enabling */
  1189. if (memlat_data->num_inited_grps < memlat_data->num_grps)
  1190. return false;
  1191. for (grp = 0; grp < MAX_MEMLAT_GRPS; grp++) {
  1192. memlat_grp = memlat_data->groups[grp];
  1193. if (memlat_grp && memlat_grp->fp_voting_enabled)
  1194. return true;
  1195. }
  1196. return false;
  1197. }
  1198. #if IS_ENABLED(CONFIG_QTI_SCMI_VENDOR_PROTOCOL)
  1199. static int configure_cpucp_common_events(void)
  1200. {
  1201. struct ev_map_msg msg;
  1202. const struct qcom_scmi_vendor_ops *ops = memlat_data->ops;
  1203. int ret = 0, i, j = 0;
  1204. u8 ev_map[NUM_COMMON_EVS];
  1205. memset(ev_map, 0xFF, NUM_COMMON_EVS);
  1206. for (i = 0; i < NUM_COMMON_EVS; i++, j++) {
  1207. if (!memlat_data->common_ev_ids[i])
  1208. continue;
  1209. ret = qcom_get_cpucp_id(memlat_data->common_ev_ids[i], 0);
  1210. if (ret >= 0 && ret < MAX_CPUCP_EVT)
  1211. ev_map[j] = ret;
  1212. }
  1213. msg.num_evs = NUM_COMMON_EVS;
  1214. msg.hw_type = INVALID_IDX;
  1215. for (i = 0; i < NUM_COMMON_EVS; i++)
  1216. msg.cid[i] = ev_map[i];
  1217. ret = ops->set_param(memlat_data->ph, &msg,
  1218. MEMLAT_ALGO_STR, MEMLAT_SET_COMMON_EV_MAP, sizeof(msg));
  1219. return ret;
  1220. }
  1221. static int configure_cpucp_grp(struct memlat_group *grp)
  1222. {
  1223. struct node_msg msg;
  1224. struct ev_map_msg ev_msg;
  1225. struct scalar_param_msg scaler_msg;
  1226. const struct qcom_scmi_vendor_ops *ops = memlat_data->ops;
  1227. int ret = 0, i, j = 0;
  1228. struct device_node *of_node = grp->dev->of_node;
  1229. u8 ev_map[NUM_GRP_EVS];
  1230. msg.cpumask = *cpumask_bits(cpu_possible_mask);
  1231. msg.hw_type = grp->hw_type;
  1232. msg.mon_type = 0;
  1233. msg.mon_idx = 0;
  1234. ret = ops->set_param(memlat_data->ph, &msg,
  1235. MEMLAT_ALGO_STR, MEMLAT_SET_MEM_GROUP, sizeof(msg));
  1236. if (ret < 0) {
  1237. pr_err("Failed to configure mem grp %s\n", of_node->name);
  1238. return ret;
  1239. }
  1240. memset(ev_map, 0xFF, NUM_GRP_EVS);
  1241. for (i = 0; i < NUM_GRP_EVS; i++, j++) {
  1242. if (!grp->grp_ev_ids[i])
  1243. continue;
  1244. ret = qcom_get_cpucp_id(grp->grp_ev_ids[i], 0);
  1245. if (ret >= 0 && ret < MAX_CPUCP_EVT)
  1246. ev_map[j] = ret;
  1247. }
  1248. ev_msg.num_evs = NUM_GRP_EVS;
  1249. ev_msg.hw_type = grp->hw_type;
  1250. for (i = 0; i < NUM_GRP_EVS; i++)
  1251. ev_msg.cid[i] = ev_map[i];
  1252. ret = ops->set_param(memlat_data->ph, &ev_msg,
  1253. MEMLAT_ALGO_STR, MEMLAT_SET_GRP_EV_MAP, sizeof(ev_msg));
  1254. if (ret < 0) {
  1255. pr_err("Failed to configure event map for mem grp %s\n",
  1256. of_node->name);
  1257. return ret;
  1258. }
  1259. scaler_msg.hw_type = grp->hw_type;
  1260. scaler_msg.mon_idx = 0;
  1261. scaler_msg.val = grp->adaptive_low_freq;
  1262. ret = ops->set_param(memlat_data->ph, &scaler_msg,
  1263. MEMLAT_ALGO_STR, MEMLAT_ADAPTIVE_LOW_FREQ, sizeof(scaler_msg));
  1264. if (ret < 0) {
  1265. pr_err("Failed to configure grp adaptive low freq for mem grp %s\n",
  1266. of_node->name);
  1267. return ret;
  1268. }
  1269. scaler_msg.hw_type = grp->hw_type;
  1270. scaler_msg.mon_idx = 0;
  1271. scaler_msg.val = grp->adaptive_high_freq;
  1272. ret = ops->set_param(memlat_data->ph, &scaler_msg,
  1273. MEMLAT_ALGO_STR, MEMLAT_ADAPTIVE_HIGH_FREQ, sizeof(scaler_msg));
  1274. if (ret < 0)
  1275. pr_err("Failed to configure grp adaptive high freq for mem grp %s\n",
  1276. of_node->name);
  1277. return ret;
  1278. }
  1279. static int configure_cpucp_mon(struct memlat_mon *mon)
  1280. {
  1281. struct memlat_group *grp = mon->memlat_grp;
  1282. struct node_msg msg;
  1283. struct scalar_param_msg scalar_msg;
  1284. struct map_param_msg map_msg;
  1285. const struct qcom_scmi_vendor_ops *ops = memlat_data->ops;
  1286. int i;
  1287. struct device_node *of_node = mon->dev->of_node;
  1288. int ret;
  1289. const char c = ':';
  1290. msg.cpumask = mon->cpus_mpidr;
  1291. msg.hw_type = grp->hw_type;
  1292. msg.mon_type = mon->is_compute;
  1293. msg.mon_idx = mon->index;
  1294. if ((strrchr(dev_name(mon->dev), c) + 1))
  1295. scnprintf(msg.mon_name, MAX_NAME_LEN, "%s", (strrchr(dev_name(mon->dev), c) + 1));
  1296. ret = ops->set_param(memlat_data->ph, &msg,
  1297. MEMLAT_ALGO_STR, MEMLAT_SET_MONITOR, sizeof(msg));
  1298. if (ret < 0) {
  1299. pr_err("failed to configure monitor %s\n", of_node->name);
  1300. return ret;
  1301. }
  1302. scalar_msg.hw_type = grp->hw_type;
  1303. scalar_msg.mon_idx = mon->index;
  1304. scalar_msg.val = mon->ipm_ceil;
  1305. ret = ops->set_param(memlat_data->ph, &scalar_msg,
  1306. MEMLAT_ALGO_STR, MEMLAT_IPM_CEIL, sizeof(scalar_msg));
  1307. if (ret < 0) {
  1308. pr_err("failed to set ipm ceil for %s\n", of_node->name);
  1309. return ret;
  1310. }
  1311. scalar_msg.hw_type = grp->hw_type;
  1312. scalar_msg.mon_idx = mon->index;
  1313. scalar_msg.val = mon->fe_stall_floor;
  1314. ret = ops->set_param(memlat_data->ph, &scalar_msg,
  1315. MEMLAT_ALGO_STR, MEMLAT_FE_STALL_FLOOR, sizeof(scalar_msg));
  1316. if (ret < 0) {
  1317. pr_err("failed to set fe stall floor for %s\n", of_node->name);
  1318. return ret;
  1319. }
  1320. scalar_msg.hw_type = grp->hw_type;
  1321. scalar_msg.mon_idx = mon->index;
  1322. scalar_msg.val = mon->be_stall_floor;
  1323. ret = ops->set_param(memlat_data->ph, &scalar_msg,
  1324. MEMLAT_ALGO_STR, MEMLAT_BE_STALL_FLOOR, sizeof(scalar_msg));
  1325. if (ret < 0) {
  1326. pr_err("failed to set be stall floor for %s\n", of_node->name);
  1327. return ret;
  1328. }
  1329. scalar_msg.hw_type = grp->hw_type;
  1330. scalar_msg.mon_idx = mon->index;
  1331. scalar_msg.val = mon->wb_pct_thres;
  1332. ret = ops->set_param(memlat_data->ph, &scalar_msg,
  1333. MEMLAT_ALGO_STR, MEMLAT_WB_PCT, sizeof(scalar_msg));
  1334. if (ret < 0) {
  1335. pr_err("failed to set wb pct for %s\n", of_node->name);
  1336. return ret;
  1337. }
  1338. scalar_msg.hw_type = grp->hw_type;
  1339. scalar_msg.mon_idx = mon->index;
  1340. scalar_msg.val = mon->wb_filter_ipm;
  1341. ret = ops->set_param(memlat_data->ph, &scalar_msg,
  1342. MEMLAT_ALGO_STR, MEMLAT_IPM_FILTER, sizeof(scalar_msg));
  1343. if (ret < 0) {
  1344. pr_err("failed to set wb filter ipm for %s\n", of_node->name);
  1345. return ret;
  1346. }
  1347. scalar_msg.hw_type = grp->hw_type;
  1348. scalar_msg.mon_idx = mon->index;
  1349. scalar_msg.val = mon->freq_scale_pct;
  1350. ret = ops->set_param(memlat_data->ph, &scalar_msg,
  1351. MEMLAT_ALGO_STR, MEMLAT_FREQ_SCALE_PCT, sizeof(scalar_msg));
  1352. if (ret < 0) {
  1353. pr_err("failed to set freq_scale_pct for %s\n", of_node->name);
  1354. return ret;
  1355. }
  1356. scalar_msg.hw_type = grp->hw_type;
  1357. scalar_msg.mon_idx = mon->index;
  1358. scalar_msg.val = mon->freq_scale_ceil_mhz;
  1359. ret = ops->set_param(memlat_data->ph, &scalar_msg,
  1360. MEMLAT_ALGO_STR, MEMLAT_FREQ_SCALE_CEIL_MHZ, sizeof(scalar_msg));
  1361. if (ret < 0) {
  1362. pr_err("failed to failed to set freq_scale_ceil on %s\n", of_node->name);
  1363. return ret;
  1364. }
  1365. scalar_msg.hw_type = grp->hw_type;
  1366. scalar_msg.mon_idx = mon->index;
  1367. scalar_msg.val = mon->freq_scale_floor_mhz;
  1368. ret = ops->set_param(memlat_data->ph, &scalar_msg,
  1369. MEMLAT_ALGO_STR, MEMLAT_FREQ_SCALE_FLOOR_MHZ, sizeof(scalar_msg));
  1370. if (ret < 0) {
  1371. pr_err("failed to failed to set freq_scale_floor on %s\n", of_node->name);
  1372. return ret;
  1373. }
  1374. map_msg.hw_type = grp->hw_type;
  1375. map_msg.mon_idx = mon->index;
  1376. map_msg.nr_rows = mon->freq_map_len;
  1377. for (i = 0; i < mon->freq_map_len; i++) {
  1378. map_msg.tbl[i].v1 = mon->freq_map[i].cpufreq_mhz;
  1379. if (mon->freq_map[i].memfreq_khz > 1000)
  1380. map_msg.tbl[i].v2 = mon->freq_map[i].memfreq_khz / 1000;
  1381. else
  1382. /* in case of DDRQOS, we do not want to divide by 1000 */
  1383. map_msg.tbl[i].v2 = mon->freq_map[i].memfreq_khz;
  1384. }
  1385. ret = ops->set_param(memlat_data->ph, &map_msg,
  1386. MEMLAT_ALGO_STR, MEMLAT_MON_FREQ_MAP, sizeof(map_msg));
  1387. if (ret < 0) {
  1388. pr_err("failed to configure freq_map for %s\n", of_node->name);
  1389. return ret;
  1390. }
  1391. scalar_msg.hw_type = grp->hw_type;
  1392. scalar_msg.mon_idx = mon->index;
  1393. scalar_msg.val = mon->min_freq;
  1394. ret = ops->set_param(memlat_data->ph, &scalar_msg,
  1395. MEMLAT_ALGO_STR, MEMLAT_SET_MIN_FREQ, sizeof(scalar_msg));
  1396. if (ret < 0) {
  1397. pr_err("failed to set min_freq for %s\n", of_node->name);
  1398. return ret;
  1399. }
  1400. scalar_msg.hw_type = grp->hw_type;
  1401. scalar_msg.mon_idx = mon->index;
  1402. scalar_msg.val = mon->max_freq;
  1403. ret = ops->set_param(memlat_data->ph, &scalar_msg,
  1404. MEMLAT_ALGO_STR, MEMLAT_SET_MAX_FREQ, sizeof(scalar_msg));
  1405. if (ret < 0)
  1406. pr_err("failed to set max_freq for %s\n", of_node->name);
  1407. return ret;
  1408. }
  1409. static int cpucp_memlat_init(struct scmi_device *sdev)
  1410. {
  1411. int ret = 0, i, j;
  1412. struct scmi_protocol_handle *ph;
  1413. const struct qcom_scmi_vendor_ops *ops;
  1414. struct memlat_group *grp;
  1415. bool start_cpucp_timer = false;
  1416. if (!sdev || !sdev->handle)
  1417. return -EINVAL;
  1418. ops = sdev->handle->devm_protocol_get(sdev, QCOM_SCMI_VENDOR_PROTOCOL, &ph);
  1419. if (IS_ERR(ops)) {
  1420. ret = PTR_ERR(ops);
  1421. ops = NULL;
  1422. return ret;
  1423. }
  1424. mutex_lock(&memlat_lock);
  1425. memlat_data->ph = ph;
  1426. memlat_data->ops = ops;
  1427. /* Configure common events */
  1428. ret = configure_cpucp_common_events();
  1429. if (ret < 0) {
  1430. pr_err("Failed to configure common events: %d\n", ret);
  1431. goto memlat_unlock;
  1432. }
  1433. /* Configure group/mon parameters */
  1434. for (i = 0; i < MAX_MEMLAT_GRPS; i++) {
  1435. grp = memlat_data->groups[i];
  1436. if (!grp || !grp->cpucp_enabled)
  1437. continue;
  1438. ret = configure_cpucp_grp(grp);
  1439. if (ret < 0) {
  1440. pr_err("Failed to configure mem group: %d\n", ret);
  1441. goto memlat_unlock;
  1442. }
  1443. for (j = 0; j < grp->num_inited_mons; j++) {
  1444. if (!grp->cpucp_enabled)
  1445. continue;
  1446. /* Configure per monitor parameters */
  1447. ret = configure_cpucp_mon(&grp->mons[j]);
  1448. if (ret < 0) {
  1449. pr_err("failed to configure mon: %d\n", ret);
  1450. goto memlat_unlock;
  1451. }
  1452. start_cpucp_timer = true;
  1453. }
  1454. }
  1455. ret = ops->set_param(memlat_data->ph, &memlat_data->cpucp_sample_ms,
  1456. MEMLAT_ALGO_STR, MEMLAT_SAMPLE_MS, sizeof(memlat_data->cpucp_sample_ms));
  1457. if (ret < 0) {
  1458. pr_err("failed to set cpucp sample_ms ret = %d\n", ret);
  1459. goto memlat_unlock;
  1460. }
  1461. /* Start sampling and voting timer */
  1462. if (start_cpucp_timer) {
  1463. ret = ops->start_activity(memlat_data->ph, NULL,
  1464. MEMLAT_ALGO_STR, MEMLAT_START_TIMER, 0);
  1465. if (ret < 0)
  1466. pr_err("Error in starting the mem group timer %d\n", ret);
  1467. }
  1468. memlat_unlock:
  1469. if (ret < 0)
  1470. memlat_data->ops = NULL;
  1471. mutex_unlock(&memlat_lock);
  1472. return ret;
  1473. }
  1474. #endif
  1475. #define INST_EV 0x08
  1476. #define CYC_EV 0x11
  1477. static int memlat_dev_probe(struct platform_device *pdev)
  1478. {
  1479. struct device *dev = &pdev->dev;
  1480. struct kobject *dcvs_kobj;
  1481. struct memlat_dev_data *dev_data;
  1482. int i, cpu, ret;
  1483. u32 event_id;
  1484. #if IS_ENABLED(CONFIG_QTI_SCMI_VENDOR_PROTOCOL)
  1485. struct scmi_device *scmi_dev;
  1486. scmi_dev = get_qcom_scmi_device();
  1487. if (IS_ERR(scmi_dev)) {
  1488. ret = PTR_ERR(scmi_dev);
  1489. if (ret == -EPROBE_DEFER)
  1490. return ret;
  1491. dev_err(dev, "Error getting scmi_dev ret = %d\n", ret);
  1492. }
  1493. #endif
  1494. dev_data = devm_kzalloc(dev, sizeof(*dev_data), GFP_KERNEL);
  1495. if (!dev_data)
  1496. return -ENOMEM;
  1497. dev_data->dev = dev;
  1498. dev_data->sample_ms = 8;
  1499. dev_data->cpucp_sample_ms = 8;
  1500. dev_data->num_grps = of_get_available_child_count(dev->of_node);
  1501. if (!dev_data->num_grps) {
  1502. dev_err(dev, "No memlat grps provided!\n");
  1503. return -ENODEV;
  1504. }
  1505. ret = of_property_read_u32(dev->of_node, "qcom,inst-ev", &event_id);
  1506. if (ret < 0) {
  1507. dev_dbg(dev, "Inst event not specified. Using def:0x%x\n",
  1508. INST_EV);
  1509. event_id = INST_EV;
  1510. }
  1511. dev_data->common_ev_ids[INST_IDX] = event_id;
  1512. ret = of_property_read_u32(dev->of_node, "qcom,cyc-ev", &event_id);
  1513. if (ret < 0) {
  1514. dev_dbg(dev, "Cyc event not specified. Using def:0x%x\n",
  1515. CYC_EV);
  1516. event_id = CYC_EV;
  1517. }
  1518. dev_data->common_ev_ids[CYC_IDX] = event_id;
  1519. ret = of_property_read_u32(dev->of_node, "qcom,fe-stall-ev", &event_id);
  1520. if (ret < 0)
  1521. dev_dbg(dev, "FE Stall event not specified. Skipping.\n");
  1522. else
  1523. dev_data->common_ev_ids[FE_STALL_IDX] = event_id;
  1524. ret = of_property_read_u32(dev->of_node, "qcom,be-stall-ev", &event_id);
  1525. if (ret < 0)
  1526. dev_dbg(dev, "BE Stall event not specified. Skipping.\n");
  1527. else
  1528. dev_data->common_ev_ids[BE_STALL_IDX] = event_id;
  1529. for_each_possible_cpu(cpu) {
  1530. for (i = 0; i < NUM_COMMON_EVS; i++) {
  1531. event_id = dev_data->common_ev_ids[i];
  1532. if (!event_id)
  1533. continue;
  1534. ret = qcom_pmu_event_supported(event_id, cpu);
  1535. if (!ret)
  1536. continue;
  1537. if (ret != -EPROBE_DEFER)
  1538. dev_err(dev, "ev=%lu not found on cpu%d: %d\n",
  1539. event_id, cpu, ret);
  1540. return ret;
  1541. }
  1542. }
  1543. dcvs_kobj = qcom_dcvs_kobject_get(NUM_DCVS_HW_TYPES);
  1544. if (IS_ERR(dcvs_kobj)) {
  1545. ret = PTR_ERR(dcvs_kobj);
  1546. dev_err(dev, "error getting kobj from qcom_dcvs: %d\n", ret);
  1547. return ret;
  1548. }
  1549. ret = kobject_init_and_add(&dev_data->kobj, &memlat_settings_ktype,
  1550. dcvs_kobj, "memlat_settings");
  1551. if (ret < 0) {
  1552. dev_err(dev, "failed to init memlat settings kobj: %d\n", ret);
  1553. kobject_put(&dev_data->kobj);
  1554. return ret;
  1555. }
  1556. memlat_data = dev_data;
  1557. return 0;
  1558. }
  1559. static int memlat_grp_probe(struct platform_device *pdev)
  1560. {
  1561. struct device *dev = &pdev->dev;
  1562. struct memlat_group *memlat_grp;
  1563. int i, cpu, ret;
  1564. u32 event_id, num_mons;
  1565. u32 hw_type = NUM_DCVS_PATHS, path_type = NUM_DCVS_PATHS;
  1566. struct device_node *of_node;
  1567. of_node = of_parse_phandle(dev->of_node, "qcom,target-dev", 0);
  1568. if (!of_node) {
  1569. dev_err(dev, "Unable to find target-dev for grp\n");
  1570. return -EINVAL;
  1571. }
  1572. ret = of_property_read_u32(of_node, "qcom,dcvs-hw-type", &hw_type);
  1573. if (ret < 0 || hw_type >= NUM_DCVS_HW_TYPES) {
  1574. dev_err(dev, "invalid dcvs hw_type=%d, ret=%d\n", hw_type, ret);
  1575. return -EINVAL;
  1576. }
  1577. memlat_grp = devm_kzalloc(dev, sizeof(*memlat_grp), GFP_KERNEL);
  1578. if (!memlat_grp)
  1579. return -ENOMEM;
  1580. memlat_grp->hw_type = hw_type;
  1581. memlat_grp->dev = dev;
  1582. memlat_grp->dcvs_kobj = qcom_dcvs_kobject_get(hw_type);
  1583. if (IS_ERR(memlat_grp->dcvs_kobj)) {
  1584. ret = PTR_ERR(memlat_grp->dcvs_kobj);
  1585. dev_err(dev, "error getting kobj from qcom_dcvs: %d\n", ret);
  1586. return ret;
  1587. }
  1588. of_node = of_parse_phandle(dev->of_node, "qcom,sampling-path", 0);
  1589. if (of_node) {
  1590. ret = of_property_read_u32(of_node, "qcom,dcvs-path-type",
  1591. &path_type);
  1592. if (ret < 0 || path_type >= NUM_DCVS_PATHS) {
  1593. dev_err(dev, "invalid dcvs path: %d, ret=%d\n",
  1594. path_type, ret);
  1595. return -EINVAL;
  1596. }
  1597. if (path_type == DCVS_FAST_PATH)
  1598. ret = qcom_dcvs_register_voter(FP_NAME, hw_type,
  1599. path_type);
  1600. else
  1601. ret = qcom_dcvs_register_voter(dev_name(dev), hw_type,
  1602. path_type);
  1603. if (ret < 0) {
  1604. dev_err(dev, "qcom dcvs registration error: %d\n", ret);
  1605. return ret;
  1606. }
  1607. memlat_grp->sampling_path_type = path_type;
  1608. } else
  1609. memlat_grp->sampling_path_type = NUM_DCVS_PATHS;
  1610. of_node = of_parse_phandle(dev->of_node, "qcom,threadlat-path", 0);
  1611. if (of_node) {
  1612. ret = of_property_read_u32(of_node, "qcom,dcvs-path-type",
  1613. &path_type);
  1614. if (ret < 0 || path_type >= NUM_DCVS_PATHS) {
  1615. dev_err(dev, "invalid dcvs path: %d, ret=%d\n",
  1616. path_type, ret);
  1617. return -EINVAL;
  1618. }
  1619. memlat_grp->threadlat_path_type = path_type;
  1620. } else
  1621. memlat_grp->threadlat_path_type = NUM_DCVS_PATHS;
  1622. if (path_type >= NUM_DCVS_PATHS) {
  1623. dev_err(dev, "error: no dcvs voting paths\n");
  1624. return -ENODEV;
  1625. }
  1626. if (memlat_grp->sampling_path_type == DCVS_FAST_PATH ||
  1627. memlat_grp->threadlat_path_type == DCVS_FAST_PATH) {
  1628. memlat_grp->fp_voting_enabled = true;
  1629. memlat_grp->fp_votes = devm_kzalloc(dev, NUM_FP_VOTERS *
  1630. sizeof(*memlat_grp->fp_votes),
  1631. GFP_KERNEL);
  1632. }
  1633. num_mons = of_get_available_child_count(dev->of_node);
  1634. if (!num_mons) {
  1635. dev_err(dev, "No mons provided!\n");
  1636. return -ENODEV;
  1637. }
  1638. memlat_grp->mons =
  1639. devm_kzalloc(dev, num_mons * sizeof(*memlat_grp->mons),
  1640. GFP_KERNEL);
  1641. if (!memlat_grp->mons)
  1642. return -ENOMEM;
  1643. memlat_grp->num_mons = num_mons;
  1644. memlat_grp->num_inited_mons = 0;
  1645. mutex_init(&memlat_grp->mons_lock);
  1646. ret = of_property_read_u32(dev->of_node, "qcom,miss-ev", &event_id);
  1647. if (ret < 0) {
  1648. dev_err(dev, "Cache miss event missing for grp: %d\n", ret);
  1649. return -EINVAL;
  1650. }
  1651. memlat_grp->grp_ev_ids[MISS_IDX] = event_id;
  1652. ret = of_property_read_u32(dev->of_node, "qcom,access-ev",
  1653. &event_id);
  1654. if (ret < 0)
  1655. dev_dbg(dev, "Access event not specified. Skipping.\n");
  1656. else
  1657. memlat_grp->grp_ev_ids[ACC_IDX] = event_id;
  1658. ret = of_property_read_u32(dev->of_node, "qcom,wb-ev", &event_id);
  1659. if (ret < 0)
  1660. dev_dbg(dev, "WB event not specified. Skipping.\n");
  1661. else
  1662. memlat_grp->grp_ev_ids[WB_IDX] = event_id;
  1663. for_each_possible_cpu(cpu) {
  1664. for (i = 0; i < NUM_GRP_EVS; i++) {
  1665. event_id = memlat_grp->grp_ev_ids[i];
  1666. if (!event_id)
  1667. continue;
  1668. ret = qcom_pmu_event_supported(event_id, cpu);
  1669. if (!ret)
  1670. continue;
  1671. if (ret != -EPROBE_DEFER)
  1672. dev_err(dev, "ev=%lu not found on cpu%d: %d\n",
  1673. event_id, cpu, ret);
  1674. return ret;
  1675. }
  1676. }
  1677. ret = kobject_init_and_add(&memlat_grp->kobj, &memlat_grp_ktype,
  1678. memlat_grp->dcvs_kobj, "memlat");
  1679. mutex_lock(&memlat_lock);
  1680. memlat_data->num_inited_grps++;
  1681. memlat_data->groups[hw_type] = memlat_grp;
  1682. if (!memlat_data->fp_enabled && should_enable_memlat_fp()) {
  1683. spin_lock_init(&memlat_data->fp_agg_lock);
  1684. spin_lock_init(&memlat_data->fp_commit_lock);
  1685. memlat_data->fp_enabled = true;
  1686. }
  1687. mutex_unlock(&memlat_lock);
  1688. dev_set_drvdata(dev, memlat_grp);
  1689. return 0;
  1690. }
  1691. static int memlat_mon_probe(struct platform_device *pdev)
  1692. {
  1693. struct device *dev = &pdev->dev;
  1694. int ret = 0;
  1695. struct memlat_group *memlat_grp;
  1696. struct memlat_mon *mon;
  1697. struct device_node *of_node = dev->of_node;
  1698. u32 num_cpus;
  1699. #if IS_ENABLED(CONFIG_QTI_SCMI_VENDOR_PROTOCOL)
  1700. int cpucp_ret = 0;
  1701. struct scmi_device *scmi_dev;
  1702. #endif
  1703. memlat_grp = dev_get_drvdata(dev->parent);
  1704. if (!memlat_grp) {
  1705. dev_err(dev, "Mon probe called without memlat_grp inited.\n");
  1706. return -ENODEV;
  1707. }
  1708. mutex_lock(&memlat_grp->mons_lock);
  1709. mon = &memlat_grp->mons[memlat_grp->num_inited_mons];
  1710. mon->memlat_grp = memlat_grp;
  1711. mon->dev = dev;
  1712. if (get_mask_and_mpidr_from_pdev(pdev, &mon->cpus, &mon->cpus_mpidr)) {
  1713. dev_err(dev, "Mon missing cpulist\n");
  1714. ret = -ENODEV;
  1715. memlat_grp->num_mons--;
  1716. goto unlock_out_init;
  1717. }
  1718. num_cpus = cpumask_weight(&mon->cpus);
  1719. if (of_property_read_bool(dev->of_node, "qcom,sampling-enabled")) {
  1720. mutex_lock(&memlat_lock);
  1721. if (!memlat_data->sampling_enabled) {
  1722. ret = memlat_sampling_init();
  1723. memlat_data->sampling_enabled = true;
  1724. }
  1725. mutex_unlock(&memlat_lock);
  1726. mon->type |= SAMPLING_MON;
  1727. }
  1728. if (of_property_read_bool(dev->of_node, "qcom,threadlat-enabled"))
  1729. mon->type |= THREADLAT_MON;
  1730. if (of_property_read_bool(dev->of_node, "qcom,cpucp-enabled")) {
  1731. mon->type |= CPUCP_MON;
  1732. memlat_grp->cpucp_enabled = true;
  1733. }
  1734. if (!mon->type) {
  1735. dev_err(dev, "No types configured for mon!\n");
  1736. ret = -ENODEV;
  1737. goto unlock_out;
  1738. }
  1739. if (of_property_read_bool(dev->of_node, "qcom,compute-mon"))
  1740. mon->is_compute = true;
  1741. mon->ipm_ceil = 400;
  1742. mon->fe_stall_floor = 0;
  1743. mon->be_stall_floor = 0;
  1744. mon->freq_scale_pct = 0;
  1745. mon->wb_pct_thres = 100;
  1746. mon->wb_filter_ipm = 25000;
  1747. mon->freq_scale_ceil_mhz = 5000;
  1748. mon->freq_scale_floor_mhz = 5000;
  1749. if (of_parse_phandle(of_node, COREDEV_TBL_PROP, 0))
  1750. of_node = of_parse_phandle(of_node, COREDEV_TBL_PROP, 0);
  1751. if (of_get_child_count(of_node))
  1752. of_node = qcom_dcvs_get_ddr_child_node(of_node);
  1753. mon->freq_map = init_cpufreq_memfreq_map(dev, of_node,
  1754. &mon->freq_map_len);
  1755. if (!mon->freq_map) {
  1756. dev_err(dev, "error importing cpufreq-memfreq table!\n");
  1757. ret = -EINVAL;
  1758. goto unlock_out;
  1759. }
  1760. mon->mon_min_freq = mon->min_freq = cpufreq_to_memfreq(mon, 0);
  1761. mon->mon_max_freq = mon->max_freq = cpufreq_to_memfreq(mon, U32_MAX);
  1762. mon->cur_freq = mon->min_freq;
  1763. if (mon->is_compute)
  1764. ret = kobject_init_and_add(&mon->kobj, &compute_mon_ktype,
  1765. memlat_grp->dcvs_kobj, dev_name(dev));
  1766. else
  1767. ret = kobject_init_and_add(&mon->kobj, &memlat_mon_ktype,
  1768. memlat_grp->dcvs_kobj, dev_name(dev));
  1769. if (ret < 0) {
  1770. dev_err(dev, "failed to init memlat mon kobj: %d\n", ret);
  1771. kobject_put(&mon->kobj);
  1772. goto unlock_out;
  1773. }
  1774. mon->index = memlat_grp->num_inited_mons++;
  1775. unlock_out_init:
  1776. if (memlat_grps_and_mons_inited()) {
  1777. memlat_data->inited = true;
  1778. #if IS_ENABLED(CONFIG_QTI_SCMI_VENDOR_PROTOCOL)
  1779. scmi_dev = get_qcom_scmi_device();
  1780. if (IS_ERR(scmi_dev)) {
  1781. cpucp_ret = PTR_ERR(scmi_dev);
  1782. dev_err(dev, "get_qcom_scmi_device ret: %d\n", cpucp_ret);
  1783. } else {
  1784. cpucp_ret = cpucp_memlat_init(scmi_dev);
  1785. if (cpucp_ret < 0)
  1786. dev_err(dev, "Err during cpucp_memlat_init: %d\n", cpucp_ret);
  1787. }
  1788. #endif
  1789. }
  1790. unlock_out:
  1791. mutex_unlock(&memlat_grp->mons_lock);
  1792. return ret;
  1793. }
  1794. static int qcom_memlat_probe(struct platform_device *pdev)
  1795. {
  1796. struct device *dev = &pdev->dev;
  1797. int ret = 0;
  1798. const struct memlat_spec *spec = of_device_get_match_data(dev);
  1799. enum memlat_type type = NUM_MEMLAT_TYPES;
  1800. if (spec)
  1801. type = spec->type;
  1802. switch (type) {
  1803. case MEMLAT_DEV:
  1804. if (memlat_data) {
  1805. dev_err(dev, "only one memlat device allowed\n");
  1806. ret = -ENODEV;
  1807. }
  1808. ret = memlat_dev_probe(pdev);
  1809. if (!ret && of_get_available_child_count(dev->of_node))
  1810. of_platform_populate(dev->of_node, NULL, NULL, dev);
  1811. break;
  1812. case MEMLAT_GRP:
  1813. ret = memlat_grp_probe(pdev);
  1814. if (!ret && of_get_available_child_count(dev->of_node))
  1815. of_platform_populate(dev->of_node, NULL, NULL, dev);
  1816. break;
  1817. case MEMLAT_MON:
  1818. ret = memlat_mon_probe(pdev);
  1819. break;
  1820. default:
  1821. /*
  1822. * This should never happen.
  1823. */
  1824. dev_err(dev, "Invalid memlat mon type specified: %u\n", type);
  1825. return -EINVAL;
  1826. }
  1827. if (ret < 0) {
  1828. dev_err(dev, "Failure to probe memlat device: %d\n", ret);
  1829. return ret;
  1830. }
  1831. return 0;
  1832. }
  1833. static const struct memlat_spec spec[] = {
  1834. [0] = { MEMLAT_DEV },
  1835. [1] = { MEMLAT_GRP },
  1836. [2] = { MEMLAT_MON },
  1837. };
  1838. static const struct of_device_id memlat_match_table[] = {
  1839. { .compatible = "qcom,memlat", .data = &spec[0] },
  1840. { .compatible = "qcom,memlat-grp", .data = &spec[1] },
  1841. { .compatible = "qcom,memlat-mon", .data = &spec[2] },
  1842. {}
  1843. };
  1844. static struct platform_driver qcom_memlat_driver = {
  1845. .probe = qcom_memlat_probe,
  1846. .driver = {
  1847. .name = "qcom-memlat",
  1848. .of_match_table = memlat_match_table,
  1849. .suppress_bind_attrs = true,
  1850. },
  1851. };
  1852. module_platform_driver(qcom_memlat_driver);
  1853. #if IS_ENABLED(CONFIG_QTI_SCMI_VENDOR_PROTOCOL)
  1854. MODULE_SOFTDEP("pre: qcom_scmi_client");
  1855. #endif
  1856. MODULE_DESCRIPTION("QCOM MEMLAT Driver");
  1857. MODULE_LICENSE("GPL");