per-axi.c 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760
  1. /* Copyright (c) 2010, The Linux Foundation. All rights reserved.
  2. *
  3. * This program is free software; you can redistribute it and/or modify
  4. * it under the terms of the GNU General Public License version 2 and
  5. * only version 2 as published by the Free Software Foundation.
  6. *
  7. * This program is distributed in the hope that it will be useful,
  8. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  9. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  10. * GNU General Public License for more details.
  11. */
  12. /*
  13. per-axi
  14. DESCRIPTION
  15. Functions related to AXI bus performance counter manipulations.
  16. */
  17. #include <linux/io.h>
  18. #include <linux/err.h>
  19. #include <linux/init.h>
  20. #include <linux/platform_device.h>
  21. #include <linux/proc_fs.h>
  22. #include "asm/uaccess.h"
  23. #include "per-axi.h"
  24. #include "perf.h"
  25. /*
  26. Definitions for AXI register addresses, macros to set and get register values
  27. */
  28. #define AXI_BASE_SIZE 0x00004000
  29. #define AXI_REG_BASE (AXI_BASE + 0x00000000)
  30. #define AXI_REG_BASE_PHYS 0xa8200000
  31. #define __inpdw(port) ioread32(port)
  32. #define in_dword_masked(addr, mask) (__inpdw(addr) & (mask))
  33. #define __outpdw(port, val) (iowrite32((uint32_t) (val), port))
  34. #define out_dword(addr, val) __outpdw(addr, val)
  35. #define HWIO_AXI_MONITOR_CYCLE_COUNT_UPPER_REG_ADDR \
  36. (AXI_REG_BASE + 0x00003434)
  37. #define HWIO_AXI_MONITOR_CYCLE_COUNT_UPPER_REG_RMSK 0xffff
  38. #define HWIO_AXI_MONITOR_CYCLE_COUNT_UPPER_REG_IN \
  39. in_dword_masked(HWIO_AXI_MONITOR_CYCLE_COUNT_UPPER_REG_ADDR, \
  40. HWIO_AXI_MONITOR_CYCLE_COUNT_UPPER_REG_RMSK)
  41. #define HWIO_AXI_MONITOR_CYCLE_COUNT_LOWER_REG_ADDR (AXI_REG_BASE + 0x00003438)
  42. #define HWIO_AXI_MONITOR_CYCLE_COUNT_LOWER_REG_RMSK 0xffff
  43. #define HWIO_AXI_MONITOR_CYCLE_COUNT_LOWER_REG_IN \
  44. in_dword_masked(HWIO_AXI_MONITOR_CYCLE_COUNT_LOWER_REG_ADDR, \
  45. HWIO_AXI_MONITOR_CYCLE_COUNT_LOWER_REG_RMSK)
  46. #define HWIO_AXI_MONITOR_SELECTION_REG0_ADDR (AXI_REG_BASE + 0x00003428)
  47. #define HWIO_AXI_MONITOR_SELECTION_REG1_ADDR (AXI_REG_BASE + 0x0000342c)
  48. #define HWIO_AXI_MONITOR_TENURE_SELECTION_REG_ADDR (AXI_REG_BASE + 0x00003430)
  49. #define HWIO_AXI_MONITOR_SELECTION_REG0_ETC_BMSK 0x4000
  50. #define HWIO_AXI_MONITOR_SELECTION_REG0_ECC_BMSK 0x2000
  51. #define HWIO_AXI_MONITOR_SELECTION_REG0_EEC1_BMSK 0x800
  52. #define HWIO_AXI_MONITOR_SELECTION_REG0_EEC0_BMSK 0x200
  53. #define HWIO_AXI_MONITOR_CYCLE_COUNT_UPPER_REG_OUT(v) \
  54. out_dword(HWIO_AXI_MONITOR_CYCLE_COUNT_UPPER_REG_ADDR, v)
  55. #define HWIO_AXI_MONITOR_CYCLE_COUNT_LOWER_REG_OUT(v) \
  56. out_dword(HWIO_AXI_MONITOR_CYCLE_COUNT_LOWER_REG_ADDR, v)
  57. #define HWIO_AXI_MONITOR_SELECTION_REG0_OUT(v) \
  58. out_dword(HWIO_AXI_MONITOR_SELECTION_REG0_ADDR, v)
  59. #define HWIO_AXI_MONITOR_SELECTION_REG1_OUT(v) \
  60. out_dword(HWIO_AXI_MONITOR_SELECTION_REG1_ADDR, v)
  61. #define HWIO_AXI_MONITOR_TENURE_SELECTION_REG_OUT(v) \
  62. out_dword(HWIO_AXI_MONITOR_TENURE_SELECTION_REG_ADDR, v)
  63. #define HWIO_AXI_MONITOR_SELECTION_REG0_RMSK 0xffff
  64. #define HWIO_AXI_MONITOR_SELECTION_REG0_IN \
  65. in_dword_masked(HWIO_AXI_MONITOR_SELECTION_REG0_ADDR, \
  66. HWIO_AXI_MONITOR_SELECTION_REG0_RMSK)
  67. #define HWIO_AXI_CONFIGURATION_REG_ADDR (AXI_REG_BASE + 0x00000008)
  68. #define HWIO_AXI_CONFIGURATION_REG_OUT(v) \
  69. out_dword(HWIO_AXI_CONFIGURATION_REG_ADDR, v)
  70. #define HWIO_AXI_CONFIGURATION_REG_PPDM_BMSK 0x0
  71. #define HWIO_AXI_CONFIGURATION_REG_DISABLE 0x2
  72. #define AXI_EVTSEL_ENABLE_MASK 0x6a00
  73. #define AXI_EVTSEL_DISABLE_MASK 0x95ff
  74. #define AXI_EVTSEL_RESET_MASK 0xfe40
  75. #define HWIO_AXI_MONITOR_EVENT_LOWER_REG0_ADDR (AXI_REG_BASE + 0x00003450)
  76. #define HWIO_AXI_MONITOR_EVENT_LOWER_REG0_RMSK 0xffff
  77. #define HWIO_AXI_MONITOR_EVENT_LOWER_REG0_SHFT 0
  78. #define HWIO_AXI_MONITOR_EVENT_LOWER_REG0_IN \
  79. in_dword_masked(HWIO_AXI_MONITOR_EVENT_LOWER_REG0_ADDR, \
  80. HWIO_AXI_MONITOR_EVENT_LOWER_REG0_RMSK)
  81. #define HWIO_AXI_MONITOR_EVENT_UPPER_REG0_ADDR (AXI_REG_BASE + 0x00003454)
  82. #define HWIO_AXI_MONITOR_EVENT_UPPER_REG0_RMSK 0xffff
  83. #define HWIO_AXI_MONITOR_EVENT_UPPER_REG0_SHFT 0
  84. #define HWIO_AXI_MONITOR_EVENT_UPPER_REG0_IN \
  85. in_dword_masked(HWIO_AXI_MONITOR_EVENT_UPPER_REG0_ADDR, \
  86. HWIO_AXI_MONITOR_EVENT_UPPER_REG0_RMSK)
  87. #define HWIO_AXI_MONITOR_EVENT_LOWER_REG1_ADDR (AXI_REG_BASE + 0x00003458)
  88. #define HWIO_AXI_MONITOR_EVENT_LOWER_REG1_RMSK 0xffff
  89. #define HWIO_AXI_MONITOR_EVENT_LOWER_REG1_SHFT 0
  90. #define HWIO_AXI_MONITOR_EVENT_LOWER_REG1_IN \
  91. in_dword_masked(HWIO_AXI_MONITOR_EVENT_LOWER_REG1_ADDR, \
  92. HWIO_AXI_MONITOR_EVENT_LOWER_REG1_RMSK)
  93. #define HWIO_AXI_MONITOR_EVENT_UPPER_REG1_ADDR (AXI_REG_BASE + 0x0000345c)
  94. #define HWIO_AXI_MONITOR_EVENT_UPPER_REG1_RMSK 0xffff
  95. #define HWIO_AXI_MONITOR_EVENT_UPPER_REG1_SHFT 0
  96. #define HWIO_AXI_MONITOR_EVENT_UPPER_REG1_IN \
  97. in_dword_masked(HWIO_AXI_MONITOR_EVENT_UPPER_REG1_ADDR, \
  98. HWIO_AXI_MONITOR_EVENT_UPPER_REG1_RMSK)
  99. #define HWIO_AXI_MONITOR_TENURE_LOWER_REG_ADDR (AXI_REG_BASE + 0x00003448)
  100. #define HWIO_AXI_MONITOR_TENURE_LOWER_REG_RMSK 0xffff
  101. #define HWIO_AXI_MONITOR_TENURE_LOWER_REG_SHFT 0
  102. #define HWIO_AXI_MONITOR_TENURE_LOWER_REG_IN \
  103. in_dword_masked(HWIO_AXI_MONITOR_TENURE_LOWER_REG_ADDR, \
  104. HWIO_AXI_MONITOR_TENURE_LOWER_REG_RMSK)
  105. #define HWIO_AXI_MONITOR_TENURE_UPPER_REG_ADDR (AXI_REG_BASE + 0x00003444)
  106. #define HWIO_AXI_MONITOR_TENURE_UPPER_REG_RMSK 0xffff
  107. #define HWIO_AXI_MONITOR_TENURE_UPPER_REG_SHFT 0
  108. #define HWIO_AXI_MONITOR_TENURE_UPPER_REG_IN \
  109. in_dword_masked(HWIO_AXI_MONITOR_TENURE_UPPER_REG_ADDR, \
  110. HWIO_AXI_MONITOR_TENURE_UPPER_REG_RMSK)
  111. #define HWIO_AXI_MONITOR_MIN_REG_ADDR (AXI_REG_BASE + 0x0000343c)
  112. #define HWIO_AXI_MONITOR_MIN_REG_RMSK 0xffff
  113. #define HWIO_AXI_MONITOR_MIN_REG_SHFT 0
  114. #define HWIO_AXI_MONITOR_MIN_REG_IN \
  115. in_dword_masked(HWIO_AXI_MONITOR_MIN_REG_ADDR, \
  116. HWIO_AXI_MONITOR_MIN_REG_RMSK)
  117. #define HWIO_AXI_MONITOR_MAX_REG_ADDR (AXI_REG_BASE + 0x00003440)
  118. #define HWIO_AXI_MONITOR_MAX_REG_RMSK 0xffff
  119. #define HWIO_AXI_MONITOR_MAX_REG_SHFT 0
  120. #define HWIO_AXI_MONITOR_MAX_REG_IN \
  121. in_dword_masked(HWIO_AXI_MONITOR_MAX_REG_ADDR, \
  122. HWIO_AXI_MONITOR_MAX_REG_RMSK)
  123. #define HWIO_AXI_MONITOR_LAST_TENURE_REG_ADDR (AXI_REG_BASE + 0x0000344c)
  124. #define HWIO_AXI_MONITOR_LAST_TENURE_REG_RMSK 0xffff
  125. #define HWIO_AXI_MONITOR_LAST_TENURE_REG_SHFT 0
  126. #define HWIO_AXI_MONITOR_LAST_TENURE_REG_IN \
  127. in_dword_masked(HWIO_AXI_MONITOR_LAST_TENURE_REG_ADDR, \
  128. HWIO_AXI_MONITOR_LAST_TENURE_REG_RMSK)
  129. #define HWIO_AXI_MONITOR_TENURE_UPPER_REG_OUT(v) \
  130. out_dword(HWIO_AXI_MONITOR_TENURE_UPPER_REG_ADDR, v)
  131. #define HWIO_AXI_MONITOR_TENURE_LOWER_REG_OUT(v) \
  132. out_dword(HWIO_AXI_MONITOR_TENURE_LOWER_REG_ADDR, v)
  133. #define HWIO_AXI_RESET_ALL 0x9400
  134. #define HWIO_AXI_ENABLE_ALL_NOCYCLES 0x4a00
  135. #define HWIO_AXI_DISABLE_ALL 0xb500
  136. uint32_t AXI_BASE;
  137. unsigned int is_first = 1;
  138. struct perf_mon_axi_data pm_axi_info;
  139. struct perf_mon_axi_cnts axi_cnts;
  140. /*
  141. FUNCTION get_axi_sel_reg0
  142. DESCRIPTION
  143. Retrieve the value of AXI_SEL_REG0
  144. DEPENDENCIES
  145. RETURN VALUE
  146. AXI_SEL_REG0
  147. SIDE EFFECTS
  148. */
  149. unsigned long get_axi_sel_reg0(void)
  150. {
  151. return pm_axi_info.sel_reg0;
  152. }
  153. /*
  154. FUNCTION get_axi_sel_reg1
  155. DESCRIPTION
  156. Retrieve the value of AXI_SEL_REG1
  157. DEPENDENCIES
  158. RETURN VALUE
  159. AXI_SEL_REG1
  160. SIDE EFFECTS
  161. */
  162. unsigned long get_axi_sel_reg1(void)
  163. {
  164. return pm_axi_info.sel_reg1;
  165. }
  166. /*
  167. FUNCTION get_axi_ten_sel_reg
  168. DESCRIPTION
  169. Retrieve the value of AXI_TEN_REG
  170. DEPENDENCIES
  171. RETURN VALUE
  172. AXI_TEN_REG
  173. SIDE EFFECTS
  174. */
  175. unsigned long get_axi_ten_sel_reg(void)
  176. {
  177. return pm_axi_info.ten_sel_reg;
  178. }
  179. /*
  180. FUNCTION get_axi_valid
  181. DESCRIPTION
  182. Retrieve the value of AXI valid bit
  183. DEPENDENCIES
  184. RETURN VALUE
  185. AXI Valid bit
  186. SIDE EFFECTS
  187. */
  188. unsigned long get_axi_valid(void)
  189. {
  190. return pm_axi_info.valid;
  191. }
  192. /*
  193. FUNCTION get_axi_enable
  194. DESCRIPTION
  195. Retrieve the value of AXI enable bit
  196. DEPENDENCIES
  197. RETURN VALUE
  198. AXI enable bit
  199. SIDE EFFECTS
  200. */
  201. unsigned long get_axi_enable(void)
  202. {
  203. return pm_axi_info.enable;
  204. }
  205. /*
  206. FUNCTION get_axi_clear
  207. DESCRIPTION
  208. Retrieve the value of AXI clear bit
  209. DEPENDENCIES
  210. RETURN VALUE
  211. AXI clear bit
  212. SIDE EFFECTS
  213. */
  214. unsigned long get_axi_clear(void)
  215. {
  216. return pm_axi_info.clear;
  217. }
  218. /*
  219. FUNCTION pm_axi_cnts_write
  220. DESCRIPTION
  221. Write handler for the /proc axi results directory.
  222. DEPENDENCIES
  223. RETURN VALUE
  224. Number of characters to output.
  225. SIDE EFFECTS
  226. */
  227. int pm_axi_cnts_write(struct file *file, const char *buff,
  228. unsigned long cnt, void *data)
  229. {
  230. char *newbuf;
  231. struct PerfMonAxiCnts *p =
  232. (struct PerfMonAxiCnts *)data;
  233. if (p == 0)
  234. return cnt;
  235. /*
  236. * Alloc the user data in kernel space. and then copy user to kernel
  237. */
  238. newbuf = kmalloc(cnt + 1, GFP_KERNEL);
  239. if (0 == newbuf)
  240. return cnt;
  241. if (copy_from_user(newbuf, buff, cnt) != 0) {
  242. printk(KERN_INFO "%s copy_from_user failed\n", __func__);
  243. return cnt;
  244. }
  245. return cnt;
  246. }
  247. /*
  248. FUNCTION pm_axi_update_cnts
  249. DESCRIPTION
  250. Read the current AXI counter values. Check for overflows and
  251. adjust the values stored accordingly.
  252. DEPENDENCIES
  253. RETURN VALUE
  254. SIDE EFFECTS
  255. */
  256. void pm_axi_update_cnts(void)
  257. {
  258. if (is_first) {
  259. pm_axi_start();
  260. } else {
  261. if (pm_axi_info.valid == 1) {
  262. pm_axi_info.valid = 0;
  263. pm_axi_update();
  264. } else {
  265. pm_axi_enable();
  266. }
  267. }
  268. is_first = 0;
  269. axi_cnts.cycles += pm_get_axi_cycle_count();
  270. axi_cnts.cnt0 += pm_get_axi_evt0_count();
  271. axi_cnts.cnt1 += pm_get_axi_evt1_count();
  272. axi_cnts.tenure_total += pm_get_axi_ten_total_count();
  273. axi_cnts.tenure_min = pm_get_axi_ten_min_count();
  274. axi_cnts.tenure_max = pm_get_axi_ten_max_count();
  275. axi_cnts.tenure_last = pm_get_axi_ten_last_count();
  276. pm_axi_start();
  277. }
  278. /*
  279. FUNCTION pm_axi_clear_cnts
  280. DESCRIPTION
  281. Clear the locally stored AXI counter values.
  282. Also clear the AXI counter registers.
  283. DEPENDENCIES
  284. RETURN VALUE
  285. SIDE EFFECTS
  286. */
  287. void pm_axi_clear_cnts(void)
  288. {
  289. axi_cnts.cycles = 0;
  290. axi_cnts.cnt0 = 0;
  291. axi_cnts.cnt1 = 0;
  292. axi_cnts.tenure_total = 0;
  293. axi_cnts.tenure_min = 0;
  294. axi_cnts.tenure_max = 0;
  295. axi_cnts.tenure_last = 0;
  296. pm_axi_start();
  297. }
  298. /*
  299. FUNCTION pm_axi_read_decimal
  300. DESCRIPTION
  301. Read handler for the /proc axi results directory in decimal format.
  302. DEPENDENCIES
  303. RETURN VALUE
  304. Number of characters to output.
  305. SIDE EFFECTS
  306. */
  307. int pm_axi_read_decimal(char *page, char **start, off_t off, int count,
  308. int *eof, void *data)
  309. {
  310. struct perf_mon_axi_cnts *p = (struct perf_mon_axi_cnts *)data;
  311. return sprintf(page, "cnt0:%llu cnt1:%llu tenure:%llu ten_max:%llu \
  312. ten_min:%llu ten_last:%llu cycles:%llu\n",
  313. p->cnt0,
  314. p->cnt1,
  315. p->tenure_total,
  316. p->tenure_max,
  317. p->tenure_min,
  318. p->tenure_last,
  319. p->cycles);
  320. }
  321. /*
  322. FUNCTION pm_axi_read_hex
  323. DESCRIPTION
  324. Read handler for the /proc axi results directory in hex format.
  325. DEPENDENCIES
  326. RETURN VALUE
  327. Number of characters to output.
  328. SIDE EFFECTS
  329. */
  330. int pm_axi_read_hex(char *page, char **start, off_t off, int count,
  331. int *eof, void *data)
  332. {
  333. struct perf_mon_axi_cnts *p = (struct perf_mon_axi_cnts *)data;
  334. return sprintf(page, "cnt0:%llx cnt1:%llx tenure:%llx ten_max:%llx \
  335. ten_min:%llx ten_last:%llx cycles:%llx\n",
  336. p->cnt0,
  337. p->cnt1,
  338. p->tenure_total,
  339. p->tenure_max,
  340. p->tenure_min,
  341. p->tenure_last,
  342. p->cycles);
  343. }
  344. /*
  345. FUNCTION pm_axi_set_proc_entry
  346. DESCRIPTION
  347. Create a generic entry for the /proc axi settings directory.
  348. DEPENDENCIES
  349. RETURN VALUE
  350. SIDE EFFECTS
  351. */
  352. void pm_axi_set_proc_entry(char *name, unsigned long *var,
  353. struct proc_dir_entry *d, int hex)
  354. {
  355. struct proc_dir_entry *pe;
  356. pe = create_proc_entry(name, 0777, d);
  357. if (0 == pe)
  358. return;
  359. if (hex) {
  360. pe->read_proc = per_process_read;
  361. pe->write_proc = per_process_write_hex;
  362. } else {
  363. pe->read_proc = per_process_read_decimal;
  364. pe->write_proc = per_process_write_dec;
  365. }
  366. pe->data = (void *)var;
  367. }
  368. /*
  369. FUNCTION pm_axi_get_cnt_proc_entry
  370. DESCRIPTION
  371. Create a generic entry for the /proc axi results directory.
  372. DEPENDENCIES
  373. RETURN VALUE
  374. SIDE EFFECTS
  375. */
  376. void pm_axi_get_cnt_proc_entry(char *name, struct perf_mon_axi_cnts *var,
  377. struct proc_dir_entry *d, int hex)
  378. {
  379. struct proc_dir_entry *pe;
  380. pe = create_proc_entry(name, 0777, d);
  381. if (0 == pe)
  382. return;
  383. if (hex) {
  384. pe->read_proc = pm_axi_read_hex;
  385. pe->write_proc = pm_axi_cnts_write;
  386. } else {
  387. pe->read_proc = pm_axi_read_decimal;
  388. pe->write_proc = pm_axi_cnts_write;
  389. }
  390. pe->data = (void *)var;
  391. }
  392. /*
  393. FUNCTION pm_axi_clear_tenure
  394. DESCRIPTION
  395. Clear AXI tenure cntr manually. Temporary solution till hardware bug
  396. is fixed
  397. DEPENDENCIES
  398. RETURN VALUE
  399. SIDE EFFECTS
  400. */
  401. void pm_axi_clear_tenure(void)
  402. {
  403. HWIO_AXI_MONITOR_TENURE_UPPER_REG_OUT(0x0);
  404. HWIO_AXI_MONITOR_TENURE_LOWER_REG_OUT(0x0);
  405. }
  406. /*
  407. FUNCTION pm_axi_init
  408. DESCRIPTION
  409. Map AXI region to virtual memory.
  410. DEPENDENCIES
  411. RETURN VALUE
  412. SIDE EFFECTS
  413. */
  414. void pm_axi_init()
  415. {
  416. /*Map the AXI regs*/
  417. #ifdef CONFIG_ARCH_QSD8X50
  418. {
  419. /*Map the AXI regs*/
  420. AXI_BASE = (uint32_t)ioremap(AXI_REG_BASE_PHYS, AXI_BASE_SIZE);
  421. if (!AXI_BASE)
  422. printk(KERN_ERR "Mem map failed\n");
  423. }
  424. #else
  425. {
  426. AXI_BASE = (uint32_t)kmalloc(AXI_BASE_SIZE, GFP_KERNEL);
  427. }
  428. #endif
  429. }
  430. /*
  431. FUNCTION pm_axi_start
  432. DESCRIPTION
  433. Set event0, event1 and tenure registers based on the /proc entries.
  434. Set cycle cntr to fffffffe to start counters.
  435. DEPENDENCIES
  436. RETURN VALUE
  437. SIDE EFFECTS
  438. */
  439. void
  440. pm_axi_start()
  441. {
  442. unsigned long sel_reg0, sel_reg1, ten_sel_reg;
  443. sel_reg0 = get_axi_sel_reg0();
  444. sel_reg1 = get_axi_sel_reg1();
  445. ten_sel_reg = get_axi_ten_sel_reg();
  446. HWIO_AXI_CONFIGURATION_REG_OUT(HWIO_AXI_CONFIGURATION_REG_PPDM_BMSK);
  447. /*Set AXI Cycle Counter to enable AXI Monitors*/
  448. HWIO_AXI_MONITOR_CYCLE_COUNT_UPPER_REG_OUT(0xffff);
  449. HWIO_AXI_MONITOR_CYCLE_COUNT_LOWER_REG_OUT(0xfffe);
  450. /*Set master/slave*/
  451. HWIO_AXI_MONITOR_SELECTION_REG1_OUT(sel_reg1);
  452. HWIO_AXI_MONITOR_SELECTION_REG0_OUT(HWIO_AXI_RESET_ALL);
  453. HWIO_AXI_MONITOR_SELECTION_REG0_OUT(HWIO_AXI_ENABLE_ALL_NOCYCLES);
  454. HWIO_AXI_MONITOR_SELECTION_REG0_OUT(HWIO_AXI_MONITOR_SELECTION_REG0_IN
  455. | sel_reg0);
  456. HWIO_AXI_MONITOR_SELECTION_REG0_OUT(HWIO_AXI_MONITOR_SELECTION_REG0_IN
  457. | HWIO_AXI_MONITOR_SELECTION_REG0_ECC_BMSK);
  458. HWIO_AXI_CONFIGURATION_REG_OUT(HWIO_AXI_CONFIGURATION_REG_PPDM_BMSK);
  459. }
  460. /*
  461. FUNCTION pm_axi_update
  462. DESCRIPTION
  463. Set event0, event1 and tenure registers based on the /proc entries.
  464. DEPENDENCIES
  465. RETURN VALUE
  466. SIDE EFFECTS
  467. */
  468. void
  469. pm_axi_update()
  470. {
  471. HWIO_AXI_CONFIGURATION_REG_OUT(HWIO_AXI_CONFIGURATION_REG_PPDM_BMSK);
  472. HWIO_AXI_MONITOR_SELECTION_REG0_OUT(HWIO_AXI_MONITOR_SELECTION_REG0_IN
  473. | HWIO_AXI_RESET_ALL);
  474. HWIO_AXI_MONITOR_SELECTION_REG0_OUT(HWIO_AXI_MONITOR_SELECTION_REG0_IN
  475. & HWIO_AXI_DISABLE_ALL);
  476. pm_axi_start();
  477. }
  478. /*
  479. FUNCTION pm_axi_disable
  480. DESCRIPTION
  481. Disable all cntrs.
  482. DEPENDENCIES
  483. RETURN VALUE
  484. SIDE EFFECTS
  485. */
  486. void
  487. pm_axi_disable(void)
  488. {
  489. unsigned long sel_reg0;
  490. /*Disable cntrs*/
  491. sel_reg0 = get_axi_sel_reg0();
  492. HWIO_AXI_MONITOR_SELECTION_REG0_OUT(sel_reg0 & AXI_EVTSEL_DISABLE_MASK);
  493. /*Disable clk*/
  494. HWIO_AXI_CONFIGURATION_REG_OUT(HWIO_AXI_CONFIGURATION_REG_DISABLE);
  495. }
  496. /*
  497. FUNCTION pm_axi_enable
  498. DESCRIPTION
  499. Enable all cntrs.
  500. DEPENDENCIES
  501. RETURN VALUE
  502. SIDE EFFECTS
  503. */
  504. void
  505. pm_axi_enable(void)
  506. {
  507. unsigned long sel_reg0;
  508. /*Enable cntrs*/
  509. sel_reg0 = get_axi_sel_reg0();
  510. HWIO_AXI_MONITOR_SELECTION_REG0_OUT(sel_reg0 | 0x6a00);
  511. /*Enable clk*/
  512. HWIO_AXI_CONFIGURATION_REG_OUT(HWIO_AXI_CONFIGURATION_REG_PPDM_BMSK);
  513. }
  514. /*
  515. FUNCTION pm_axi_disable_cnts
  516. DESCRIPTION
  517. Read cycle cntr value
  518. DEPENDENCIES
  519. RETURN VALUE
  520. SIDE EFFECTS
  521. */
  522. unsigned long
  523. pm_get_axi_cycle_count(void)
  524. {
  525. if (HWIO_AXI_MONITOR_CYCLE_COUNT_UPPER_REG_IN == 0x0 &&
  526. HWIO_AXI_MONITOR_CYCLE_COUNT_LOWER_REG_IN == 0x0) {
  527. /*Set AXI Cycle Counter to enable AXI Monitors*/
  528. HWIO_AXI_MONITOR_CYCLE_COUNT_UPPER_REG_OUT(0xffff);
  529. HWIO_AXI_MONITOR_CYCLE_COUNT_LOWER_REG_OUT(0xfffe);
  530. }
  531. return 0xfffffffe - ((HWIO_AXI_MONITOR_CYCLE_COUNT_UPPER_REG_IN << 16)
  532. + HWIO_AXI_MONITOR_CYCLE_COUNT_LOWER_REG_IN);
  533. }
  534. /*
  535. FUNCTION pm_get_axi_evt0_count
  536. DESCRIPTION
  537. Read Event0 cntr value
  538. DEPENDENCIES
  539. RETURN VALUE
  540. SIDE EFFECTS
  541. */
  542. unsigned long
  543. pm_get_axi_evt0_count(void)
  544. {
  545. return (HWIO_AXI_MONITOR_EVENT_UPPER_REG0_IN << 16)
  546. + HWIO_AXI_MONITOR_EVENT_LOWER_REG0_IN;
  547. }
  548. /*
  549. FUNCTION pm_get_axi_evt1_count
  550. DESCRIPTION
  551. Read Event1 cntr value
  552. DEPENDENCIES
  553. RETURN VALUE
  554. SIDE EFFECTS
  555. */
  556. unsigned long
  557. pm_get_axi_evt1_count(void)
  558. {
  559. return (HWIO_AXI_MONITOR_EVENT_UPPER_REG1_IN << 16)
  560. + HWIO_AXI_MONITOR_EVENT_LOWER_REG1_IN;
  561. }
  562. /*
  563. FUNCTION pm_get_axi_ten_min_count
  564. DESCRIPTION
  565. Read min tenure cntr value
  566. DEPENDENCIES
  567. RETURN VALUE
  568. SIDE EFFECTS
  569. */
  570. unsigned long
  571. pm_get_axi_ten_min_count(void)
  572. {
  573. return HWIO_AXI_MONITOR_MIN_REG_IN;
  574. }
  575. /*
  576. FUNCTION pm_get_axi_ten_max_count
  577. DESCRIPTION
  578. Read max tenure cntr value
  579. DEPENDENCIES
  580. RETURN VALUE
  581. SIDE EFFECTS
  582. */
  583. unsigned long
  584. pm_get_axi_ten_max_count(void)
  585. {
  586. return HWIO_AXI_MONITOR_MAX_REG_IN;
  587. }
  588. /*
  589. FUNCTION pm_get_axi_ten_total_count
  590. DESCRIPTION
  591. Read total tenure cntr value
  592. DEPENDENCIES
  593. RETURN VALUE
  594. SIDE EFFECTS
  595. */
  596. unsigned long
  597. pm_get_axi_ten_total_count(void)
  598. {
  599. return (HWIO_AXI_MONITOR_TENURE_UPPER_REG_IN << 16)
  600. + HWIO_AXI_MONITOR_TENURE_LOWER_REG_IN;
  601. }
  602. /*
  603. FUNCTION pm_get_axi_ten_last_count
  604. DESCRIPTION
  605. Read last tenure cntr value
  606. DEPENDENCIES
  607. RETURN VALUE
  608. SIDE EFFECTS
  609. */
  610. unsigned long
  611. pm_get_axi_ten_last_count(void)
  612. {
  613. return HWIO_AXI_MONITOR_LAST_TENURE_REG_IN;
  614. }