adreno_a5xx_perfcounter.c 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * Copyright (c) 2020-2021, The Linux Foundation. All rights reserved.
  4. */
  5. #include "adreno.h"
  6. #include "adreno_a5xx.h"
  7. #include "adreno_perfcounter.h"
  8. #include "adreno_pm4types.h"
  9. #include "kgsl_device.h"
  10. #define VBIF2_PERF_CNT_SEL_MASK 0x7F
  11. /* offset of clear register from select register */
  12. #define VBIF2_PERF_CLR_REG_SEL_OFF 8
  13. /* offset of enable register from select register */
  14. #define VBIF2_PERF_EN_REG_SEL_OFF 16
  15. /* offset of clear register from the enable register */
  16. #define VBIF2_PERF_PWR_CLR_REG_EN_OFF 8
  17. static void a5xx_counter_load(struct adreno_device *adreno_dev,
  18. struct adreno_perfcount_register *reg)
  19. {
  20. struct kgsl_device *device = KGSL_DEVICE(adreno_dev);
  21. int index = reg->load_bit / 32;
  22. u32 enable = BIT(reg->load_bit & 31);
  23. kgsl_regwrite(device, A5XX_RBBM_PERFCTR_LOAD_VALUE_LO,
  24. lower_32_bits(reg->value));
  25. kgsl_regwrite(device, A5XX_RBBM_PERFCTR_LOAD_VALUE_HI,
  26. upper_32_bits(reg->value));
  27. kgsl_regwrite(device, A5XX_RBBM_PERFCTR_LOAD_CMD0 + index, enable);
  28. }
  29. static u64 a5xx_counter_read_norestore(struct adreno_device *adreno_dev,
  30. const struct adreno_perfcount_group *group,
  31. unsigned int counter)
  32. {
  33. struct kgsl_device *device = KGSL_DEVICE(adreno_dev);
  34. struct adreno_perfcount_register *reg = &group->regs[counter];
  35. u32 hi, lo;
  36. kgsl_regread(device, reg->offset, &lo);
  37. kgsl_regread(device, reg->offset_hi, &hi);
  38. return ((((u64) hi) << 32) | lo) + reg->value;
  39. }
  40. static int a5xx_counter_enable(struct adreno_device *adreno_dev,
  41. const struct adreno_perfcount_group *group,
  42. unsigned int counter, unsigned int countable)
  43. {
  44. struct kgsl_device *device = KGSL_DEVICE(adreno_dev);
  45. struct adreno_perfcount_register *reg = &group->regs[counter];
  46. kgsl_regwrite(device, reg->select, countable);
  47. reg->value = 0;
  48. return 0;
  49. }
  50. static int a5xx_counter_inline_enable(struct adreno_device *adreno_dev,
  51. const struct adreno_perfcount_group *group,
  52. unsigned int counter, unsigned int countable)
  53. {
  54. struct kgsl_device *device = KGSL_DEVICE(adreno_dev);
  55. struct adreno_perfcount_register *reg = &group->regs[counter];
  56. struct adreno_ringbuffer *rb = &adreno_dev->ringbuffers[0];
  57. u32 cmds[3];
  58. int ret;
  59. if (!(device->state == KGSL_STATE_ACTIVE))
  60. return a5xx_counter_enable(adreno_dev, group, counter,
  61. countable);
  62. cmds[0] = cp_type7_packet(CP_WAIT_FOR_IDLE, 0);
  63. cmds[1] = cp_type4_packet(reg->select, 1);
  64. cmds[2] = countable;
  65. /* submit to highest priority RB always */
  66. ret = a5xx_ringbuffer_addcmds(adreno_dev, rb, NULL,
  67. F_NOTPROTECTED, cmds, 3, 0, NULL);
  68. if (ret)
  69. return ret;
  70. /*
  71. * schedule dispatcher to make sure rb[0] is run, because
  72. * if the current RB is not rb[0] and gpu is idle then
  73. * rb[0] will not get scheduled to run
  74. */
  75. if (adreno_dev->cur_rb != rb)
  76. adreno_dispatcher_schedule(device);
  77. /* wait for the above commands submitted to complete */
  78. ret = adreno_ringbuffer_waittimestamp(rb, rb->timestamp,
  79. ADRENO_IDLE_TIMEOUT);
  80. if (ret) {
  81. /*
  82. * If we were woken up because of cancelling rb events
  83. * either due to soft reset or adreno_stop, ignore the
  84. * error and return 0 here. The perfcounter is already
  85. * set up in software and it will be programmed in
  86. * hardware when we wake up or come up after soft reset,
  87. * by adreno_perfcounter_restore.
  88. */
  89. if (ret == -EAGAIN)
  90. ret = 0;
  91. else
  92. dev_err(device->dev,
  93. "Perfcounter %s/%u/%u start via commands failed %d\n",
  94. group->name, counter, countable, ret);
  95. }
  96. if (!ret)
  97. reg->value = 0;
  98. return ret;
  99. }
  100. static int a5xx_counter_rbbm_enable(struct adreno_device *adreno_dev,
  101. const struct adreno_perfcount_group *group,
  102. unsigned int counter, unsigned int countable)
  103. {
  104. if (adreno_is_a540(adreno_dev) && countable == A5XX_RBBM_ALWAYS_COUNT)
  105. return -EINVAL;
  106. return a5xx_counter_inline_enable(adreno_dev, group, counter,
  107. countable);
  108. }
  109. static u64 a5xx_counter_read(struct adreno_device *adreno_dev,
  110. const struct adreno_perfcount_group *group,
  111. unsigned int counter)
  112. {
  113. struct kgsl_device *device = KGSL_DEVICE(adreno_dev);
  114. struct adreno_perfcount_register *reg = &group->regs[counter];
  115. u32 hi, lo;
  116. kgsl_regread(device, reg->offset, &lo);
  117. kgsl_regread(device, reg->offset_hi, &hi);
  118. return (((u64) hi) << 32) | lo;
  119. }
  120. static int a5xx_counter_vbif_enable(struct adreno_device *adreno_dev,
  121. const struct adreno_perfcount_group *group,
  122. unsigned int counter, unsigned int countable)
  123. {
  124. struct kgsl_device *device = KGSL_DEVICE(adreno_dev);
  125. struct adreno_perfcount_register *reg = &group->regs[counter];
  126. if (countable > VBIF2_PERF_CNT_SEL_MASK)
  127. return -EINVAL;
  128. /*
  129. * Write 1, followed by 0 to CLR register for
  130. * clearing the counter
  131. */
  132. kgsl_regwrite(device,
  133. reg->select - VBIF2_PERF_CLR_REG_SEL_OFF, 1);
  134. kgsl_regwrite(device,
  135. reg->select - VBIF2_PERF_CLR_REG_SEL_OFF, 0);
  136. kgsl_regwrite(device,
  137. reg->select, countable & VBIF2_PERF_CNT_SEL_MASK);
  138. /* enable reg is 8 DWORDS before select reg */
  139. kgsl_regwrite(device,
  140. reg->select - VBIF2_PERF_EN_REG_SEL_OFF, 1);
  141. kgsl_regwrite(device, reg->select, countable);
  142. reg->value = 0;
  143. return 0;
  144. }
  145. static int a5xx_counter_vbif_pwr_enable(struct adreno_device *adreno_dev,
  146. const struct adreno_perfcount_group *group,
  147. unsigned int counter, unsigned int countable)
  148. {
  149. struct kgsl_device *device = KGSL_DEVICE(adreno_dev);
  150. struct adreno_perfcount_register *reg = &group->regs[counter];
  151. /*
  152. * Write 1, followed by 0 to CLR register for
  153. * clearing the counter
  154. */
  155. kgsl_regwrite(device, reg->select +
  156. VBIF2_PERF_PWR_CLR_REG_EN_OFF, 1);
  157. kgsl_regwrite(device, reg->select +
  158. VBIF2_PERF_PWR_CLR_REG_EN_OFF, 0);
  159. kgsl_regwrite(device, reg->select, 1);
  160. reg->value = 0;
  161. return 0;
  162. }
  163. static int a5xx_counter_alwayson_enable(struct adreno_device *adreno_dev,
  164. const struct adreno_perfcount_group *group,
  165. unsigned int counter, unsigned int countable)
  166. {
  167. return 0;
  168. }
  169. static u64 a5xx_counter_alwayson_read(struct adreno_device *adreno_dev,
  170. const struct adreno_perfcount_group *group,
  171. unsigned int counter)
  172. {
  173. struct adreno_perfcount_register *reg = &group->regs[counter];
  174. return a5xx_read_alwayson(adreno_dev) + reg->value;
  175. }
  176. static int a5xx_counter_pwr_enable(struct adreno_device *adreno_dev,
  177. const struct adreno_perfcount_group *group,
  178. unsigned int counter, unsigned int countable)
  179. {
  180. struct kgsl_device *device = KGSL_DEVICE(adreno_dev);
  181. struct adreno_perfcount_register *reg = &group->regs[counter];
  182. kgsl_regwrite(device, reg->select, countable);
  183. kgsl_regwrite(device, A5XX_GPMU_POWER_COUNTER_ENABLE, 1);
  184. reg->value = 0;
  185. return 0;
  186. }
  187. static int a5xx_counter_pwr_gpmu_enable(struct adreno_device *adreno_dev,
  188. const struct adreno_perfcount_group *group,
  189. unsigned int counter, unsigned int countable)
  190. {
  191. struct kgsl_device *device = KGSL_DEVICE(adreno_dev);
  192. struct adreno_perfcount_register *reg = &group->regs[counter];
  193. unsigned int shift = (counter << 3) % (sizeof(unsigned int) * 8);
  194. if (adreno_is_a530(adreno_dev)) {
  195. if (countable > 43)
  196. return -EINVAL;
  197. } else if (adreno_is_a540(adreno_dev)) {
  198. if (countable > 47)
  199. return -EINVAL;
  200. }
  201. kgsl_regrmw(device, reg->select, 0xff << shift, countable << shift);
  202. kgsl_regwrite(device, A5XX_GPMU_POWER_COUNTER_ENABLE, 1);
  203. reg->value = 0;
  204. return 0;
  205. }
  206. static int a5xx_counter_pwr_alwayson_enable(struct adreno_device *adreno_dev,
  207. const struct adreno_perfcount_group *group,
  208. unsigned int counter, unsigned int countable)
  209. {
  210. struct kgsl_device *device = KGSL_DEVICE(adreno_dev);
  211. struct adreno_perfcount_register *reg = &group->regs[counter];
  212. kgsl_regwrite(device, A5XX_GPMU_ALWAYS_ON_COUNTER_RESET, 1);
  213. reg->value = 0;
  214. return 0;
  215. }
  216. static struct adreno_perfcount_register a5xx_perfcounters_cp[] = {
  217. { KGSL_PERFCOUNTER_NOT_USED, 0, 0, A5XX_RBBM_PERFCTR_CP_0_LO,
  218. A5XX_RBBM_PERFCTR_CP_0_HI, 0, A5XX_CP_PERFCTR_CP_SEL_0 },
  219. { KGSL_PERFCOUNTER_NOT_USED, 0, 0, A5XX_RBBM_PERFCTR_CP_1_LO,
  220. A5XX_RBBM_PERFCTR_CP_1_HI, 1, A5XX_CP_PERFCTR_CP_SEL_1 },
  221. { KGSL_PERFCOUNTER_NOT_USED, 0, 0, A5XX_RBBM_PERFCTR_CP_2_LO,
  222. A5XX_RBBM_PERFCTR_CP_2_HI, 2, A5XX_CP_PERFCTR_CP_SEL_2 },
  223. { KGSL_PERFCOUNTER_NOT_USED, 0, 0, A5XX_RBBM_PERFCTR_CP_3_LO,
  224. A5XX_RBBM_PERFCTR_CP_3_HI, 3, A5XX_CP_PERFCTR_CP_SEL_3 },
  225. { KGSL_PERFCOUNTER_NOT_USED, 0, 0, A5XX_RBBM_PERFCTR_CP_4_LO,
  226. A5XX_RBBM_PERFCTR_CP_4_HI, 4, A5XX_CP_PERFCTR_CP_SEL_4 },
  227. { KGSL_PERFCOUNTER_NOT_USED, 0, 0, A5XX_RBBM_PERFCTR_CP_5_LO,
  228. A5XX_RBBM_PERFCTR_CP_5_HI, 5, A5XX_CP_PERFCTR_CP_SEL_5 },
  229. { KGSL_PERFCOUNTER_NOT_USED, 0, 0, A5XX_RBBM_PERFCTR_CP_6_LO,
  230. A5XX_RBBM_PERFCTR_CP_6_HI, 6, A5XX_CP_PERFCTR_CP_SEL_6 },
  231. { KGSL_PERFCOUNTER_NOT_USED, 0, 0, A5XX_RBBM_PERFCTR_CP_7_LO,
  232. A5XX_RBBM_PERFCTR_CP_7_HI, 7, A5XX_CP_PERFCTR_CP_SEL_7 },
  233. };
  234. static struct adreno_perfcount_register a5xx_perfcounters_rbbm[] = {
  235. /*
  236. * A5XX_RBBM_PERFCTR_RBBM_0 is used for frequency scaling and omitted
  237. * from the poool of available counters
  238. */
  239. { KGSL_PERFCOUNTER_NOT_USED, 0, 0, A5XX_RBBM_PERFCTR_RBBM_1_LO,
  240. A5XX_RBBM_PERFCTR_RBBM_1_HI, 9, A5XX_RBBM_PERFCTR_RBBM_SEL_1 },
  241. { KGSL_PERFCOUNTER_NOT_USED, 0, 0, A5XX_RBBM_PERFCTR_RBBM_2_LO,
  242. A5XX_RBBM_PERFCTR_RBBM_2_HI, 10, A5XX_RBBM_PERFCTR_RBBM_SEL_2 },
  243. { KGSL_PERFCOUNTER_NOT_USED, 0, 0, A5XX_RBBM_PERFCTR_RBBM_3_LO,
  244. A5XX_RBBM_PERFCTR_RBBM_3_HI, 11, A5XX_RBBM_PERFCTR_RBBM_SEL_3 },
  245. };
  246. static struct adreno_perfcount_register a5xx_perfcounters_pc[] = {
  247. { KGSL_PERFCOUNTER_NOT_USED, 0, 0, A5XX_RBBM_PERFCTR_PC_0_LO,
  248. A5XX_RBBM_PERFCTR_PC_0_HI, 12, A5XX_PC_PERFCTR_PC_SEL_0 },
  249. { KGSL_PERFCOUNTER_NOT_USED, 0, 0, A5XX_RBBM_PERFCTR_PC_1_LO,
  250. A5XX_RBBM_PERFCTR_PC_1_HI, 13, A5XX_PC_PERFCTR_PC_SEL_1 },
  251. { KGSL_PERFCOUNTER_NOT_USED, 0, 0, A5XX_RBBM_PERFCTR_PC_2_LO,
  252. A5XX_RBBM_PERFCTR_PC_2_HI, 14, A5XX_PC_PERFCTR_PC_SEL_2 },
  253. { KGSL_PERFCOUNTER_NOT_USED, 0, 0, A5XX_RBBM_PERFCTR_PC_3_LO,
  254. A5XX_RBBM_PERFCTR_PC_3_HI, 15, A5XX_PC_PERFCTR_PC_SEL_3 },
  255. { KGSL_PERFCOUNTER_NOT_USED, 0, 0, A5XX_RBBM_PERFCTR_PC_4_LO,
  256. A5XX_RBBM_PERFCTR_PC_4_HI, 16, A5XX_PC_PERFCTR_PC_SEL_4 },
  257. { KGSL_PERFCOUNTER_NOT_USED, 0, 0, A5XX_RBBM_PERFCTR_PC_5_LO,
  258. A5XX_RBBM_PERFCTR_PC_5_HI, 17, A5XX_PC_PERFCTR_PC_SEL_5 },
  259. { KGSL_PERFCOUNTER_NOT_USED, 0, 0, A5XX_RBBM_PERFCTR_PC_6_LO,
  260. A5XX_RBBM_PERFCTR_PC_6_HI, 18, A5XX_PC_PERFCTR_PC_SEL_6 },
  261. { KGSL_PERFCOUNTER_NOT_USED, 0, 0, A5XX_RBBM_PERFCTR_PC_7_LO,
  262. A5XX_RBBM_PERFCTR_PC_7_HI, 19, A5XX_PC_PERFCTR_PC_SEL_7 },
  263. };
  264. static struct adreno_perfcount_register a5xx_perfcounters_vfd[] = {
  265. { KGSL_PERFCOUNTER_NOT_USED, 0, 0, A5XX_RBBM_PERFCTR_VFD_0_LO,
  266. A5XX_RBBM_PERFCTR_VFD_0_HI, 20, A5XX_VFD_PERFCTR_VFD_SEL_0 },
  267. { KGSL_PERFCOUNTER_NOT_USED, 0, 0, A5XX_RBBM_PERFCTR_VFD_1_LO,
  268. A5XX_RBBM_PERFCTR_VFD_1_HI, 21, A5XX_VFD_PERFCTR_VFD_SEL_1 },
  269. { KGSL_PERFCOUNTER_NOT_USED, 0, 0, A5XX_RBBM_PERFCTR_VFD_2_LO,
  270. A5XX_RBBM_PERFCTR_VFD_2_HI, 22, A5XX_VFD_PERFCTR_VFD_SEL_2 },
  271. { KGSL_PERFCOUNTER_NOT_USED, 0, 0, A5XX_RBBM_PERFCTR_VFD_3_LO,
  272. A5XX_RBBM_PERFCTR_VFD_3_HI, 23, A5XX_VFD_PERFCTR_VFD_SEL_3 },
  273. { KGSL_PERFCOUNTER_NOT_USED, 0, 0, A5XX_RBBM_PERFCTR_VFD_4_LO,
  274. A5XX_RBBM_PERFCTR_VFD_4_HI, 24, A5XX_VFD_PERFCTR_VFD_SEL_4 },
  275. { KGSL_PERFCOUNTER_NOT_USED, 0, 0, A5XX_RBBM_PERFCTR_VFD_5_LO,
  276. A5XX_RBBM_PERFCTR_VFD_5_HI, 25, A5XX_VFD_PERFCTR_VFD_SEL_5 },
  277. { KGSL_PERFCOUNTER_NOT_USED, 0, 0, A5XX_RBBM_PERFCTR_VFD_6_LO,
  278. A5XX_RBBM_PERFCTR_VFD_6_HI, 26, A5XX_VFD_PERFCTR_VFD_SEL_6 },
  279. { KGSL_PERFCOUNTER_NOT_USED, 0, 0, A5XX_RBBM_PERFCTR_VFD_7_LO,
  280. A5XX_RBBM_PERFCTR_VFD_7_HI, 27, A5XX_VFD_PERFCTR_VFD_SEL_7 },
  281. };
  282. static struct adreno_perfcount_register a5xx_perfcounters_hlsq[] = {
  283. { KGSL_PERFCOUNTER_NOT_USED, 0, 0, A5XX_RBBM_PERFCTR_HLSQ_0_LO,
  284. A5XX_RBBM_PERFCTR_HLSQ_0_HI, 28, A5XX_HLSQ_PERFCTR_HLSQ_SEL_0 },
  285. { KGSL_PERFCOUNTER_NOT_USED, 0, 0, A5XX_RBBM_PERFCTR_HLSQ_1_LO,
  286. A5XX_RBBM_PERFCTR_HLSQ_1_HI, 29, A5XX_HLSQ_PERFCTR_HLSQ_SEL_1 },
  287. { KGSL_PERFCOUNTER_NOT_USED, 0, 0, A5XX_RBBM_PERFCTR_HLSQ_2_LO,
  288. A5XX_RBBM_PERFCTR_HLSQ_2_HI, 30, A5XX_HLSQ_PERFCTR_HLSQ_SEL_2 },
  289. { KGSL_PERFCOUNTER_NOT_USED, 0, 0, A5XX_RBBM_PERFCTR_HLSQ_3_LO,
  290. A5XX_RBBM_PERFCTR_HLSQ_3_HI, 31, A5XX_HLSQ_PERFCTR_HLSQ_SEL_3 },
  291. { KGSL_PERFCOUNTER_NOT_USED, 0, 0, A5XX_RBBM_PERFCTR_HLSQ_4_LO,
  292. A5XX_RBBM_PERFCTR_HLSQ_4_HI, 32, A5XX_HLSQ_PERFCTR_HLSQ_SEL_4 },
  293. { KGSL_PERFCOUNTER_NOT_USED, 0, 0, A5XX_RBBM_PERFCTR_HLSQ_5_LO,
  294. A5XX_RBBM_PERFCTR_HLSQ_5_HI, 33, A5XX_HLSQ_PERFCTR_HLSQ_SEL_5 },
  295. { KGSL_PERFCOUNTER_NOT_USED, 0, 0, A5XX_RBBM_PERFCTR_HLSQ_6_LO,
  296. A5XX_RBBM_PERFCTR_HLSQ_6_HI, 34, A5XX_HLSQ_PERFCTR_HLSQ_SEL_6 },
  297. { KGSL_PERFCOUNTER_NOT_USED, 0, 0, A5XX_RBBM_PERFCTR_HLSQ_7_LO,
  298. A5XX_RBBM_PERFCTR_HLSQ_7_HI, 35, A5XX_HLSQ_PERFCTR_HLSQ_SEL_7 },
  299. };
  300. static struct adreno_perfcount_register a5xx_perfcounters_vpc[] = {
  301. { KGSL_PERFCOUNTER_NOT_USED, 0, 0, A5XX_RBBM_PERFCTR_VPC_0_LO,
  302. A5XX_RBBM_PERFCTR_VPC_0_HI, 36, A5XX_VPC_PERFCTR_VPC_SEL_0 },
  303. { KGSL_PERFCOUNTER_NOT_USED, 0, 0, A5XX_RBBM_PERFCTR_VPC_1_LO,
  304. A5XX_RBBM_PERFCTR_VPC_1_HI, 37, A5XX_VPC_PERFCTR_VPC_SEL_1 },
  305. { KGSL_PERFCOUNTER_NOT_USED, 0, 0, A5XX_RBBM_PERFCTR_VPC_2_LO,
  306. A5XX_RBBM_PERFCTR_VPC_2_HI, 38, A5XX_VPC_PERFCTR_VPC_SEL_2 },
  307. { KGSL_PERFCOUNTER_NOT_USED, 0, 0, A5XX_RBBM_PERFCTR_VPC_3_LO,
  308. A5XX_RBBM_PERFCTR_VPC_3_HI, 39, A5XX_VPC_PERFCTR_VPC_SEL_3 },
  309. };
  310. static struct adreno_perfcount_register a5xx_perfcounters_ccu[] = {
  311. { KGSL_PERFCOUNTER_NOT_USED, 0, 0, A5XX_RBBM_PERFCTR_CCU_0_LO,
  312. A5XX_RBBM_PERFCTR_CCU_0_HI, 40, A5XX_RB_PERFCTR_CCU_SEL_0 },
  313. { KGSL_PERFCOUNTER_NOT_USED, 0, 0, A5XX_RBBM_PERFCTR_CCU_1_LO,
  314. A5XX_RBBM_PERFCTR_CCU_1_HI, 41, A5XX_RB_PERFCTR_CCU_SEL_1 },
  315. { KGSL_PERFCOUNTER_NOT_USED, 0, 0, A5XX_RBBM_PERFCTR_CCU_2_LO,
  316. A5XX_RBBM_PERFCTR_CCU_2_HI, 42, A5XX_RB_PERFCTR_CCU_SEL_2 },
  317. { KGSL_PERFCOUNTER_NOT_USED, 0, 0, A5XX_RBBM_PERFCTR_CCU_3_LO,
  318. A5XX_RBBM_PERFCTR_CCU_3_HI, 43, A5XX_RB_PERFCTR_CCU_SEL_3 },
  319. };
  320. static struct adreno_perfcount_register a5xx_perfcounters_tse[] = {
  321. { KGSL_PERFCOUNTER_NOT_USED, 0, 0, A5XX_RBBM_PERFCTR_TSE_0_LO,
  322. A5XX_RBBM_PERFCTR_TSE_0_HI, 44, A5XX_GRAS_PERFCTR_TSE_SEL_0 },
  323. { KGSL_PERFCOUNTER_NOT_USED, 0, 0, A5XX_RBBM_PERFCTR_TSE_1_LO,
  324. A5XX_RBBM_PERFCTR_TSE_1_HI, 45, A5XX_GRAS_PERFCTR_TSE_SEL_1 },
  325. { KGSL_PERFCOUNTER_NOT_USED, 0, 0, A5XX_RBBM_PERFCTR_TSE_2_LO,
  326. A5XX_RBBM_PERFCTR_TSE_2_HI, 46, A5XX_GRAS_PERFCTR_TSE_SEL_2 },
  327. { KGSL_PERFCOUNTER_NOT_USED, 0, 0, A5XX_RBBM_PERFCTR_TSE_3_LO,
  328. A5XX_RBBM_PERFCTR_TSE_3_HI, 47, A5XX_GRAS_PERFCTR_TSE_SEL_3 },
  329. };
  330. static struct adreno_perfcount_register a5xx_perfcounters_ras[] = {
  331. { KGSL_PERFCOUNTER_NOT_USED, 0, 0, A5XX_RBBM_PERFCTR_RAS_0_LO,
  332. A5XX_RBBM_PERFCTR_RAS_0_HI, 48, A5XX_GRAS_PERFCTR_RAS_SEL_0 },
  333. { KGSL_PERFCOUNTER_NOT_USED, 0, 0, A5XX_RBBM_PERFCTR_RAS_1_LO,
  334. A5XX_RBBM_PERFCTR_RAS_1_HI, 49, A5XX_GRAS_PERFCTR_RAS_SEL_1 },
  335. { KGSL_PERFCOUNTER_NOT_USED, 0, 0, A5XX_RBBM_PERFCTR_RAS_2_LO,
  336. A5XX_RBBM_PERFCTR_RAS_2_HI, 50, A5XX_GRAS_PERFCTR_RAS_SEL_2 },
  337. { KGSL_PERFCOUNTER_NOT_USED, 0, 0, A5XX_RBBM_PERFCTR_RAS_3_LO,
  338. A5XX_RBBM_PERFCTR_RAS_3_HI, 51, A5XX_GRAS_PERFCTR_RAS_SEL_3 },
  339. };
  340. static struct adreno_perfcount_register a5xx_perfcounters_uche[] = {
  341. { KGSL_PERFCOUNTER_NOT_USED, 0, 0, A5XX_RBBM_PERFCTR_UCHE_0_LO,
  342. A5XX_RBBM_PERFCTR_UCHE_0_HI, 52, A5XX_UCHE_PERFCTR_UCHE_SEL_0 },
  343. { KGSL_PERFCOUNTER_NOT_USED, 0, 0, A5XX_RBBM_PERFCTR_UCHE_1_LO,
  344. A5XX_RBBM_PERFCTR_UCHE_1_HI, 53, A5XX_UCHE_PERFCTR_UCHE_SEL_1 },
  345. { KGSL_PERFCOUNTER_NOT_USED, 0, 0, A5XX_RBBM_PERFCTR_UCHE_2_LO,
  346. A5XX_RBBM_PERFCTR_UCHE_2_HI, 54, A5XX_UCHE_PERFCTR_UCHE_SEL_2 },
  347. { KGSL_PERFCOUNTER_NOT_USED, 0, 0, A5XX_RBBM_PERFCTR_UCHE_3_LO,
  348. A5XX_RBBM_PERFCTR_UCHE_3_HI, 55, A5XX_UCHE_PERFCTR_UCHE_SEL_3 },
  349. { KGSL_PERFCOUNTER_NOT_USED, 0, 0, A5XX_RBBM_PERFCTR_UCHE_4_LO,
  350. A5XX_RBBM_PERFCTR_UCHE_4_HI, 56, A5XX_UCHE_PERFCTR_UCHE_SEL_4 },
  351. { KGSL_PERFCOUNTER_NOT_USED, 0, 0, A5XX_RBBM_PERFCTR_UCHE_5_LO,
  352. A5XX_RBBM_PERFCTR_UCHE_5_HI, 57, A5XX_UCHE_PERFCTR_UCHE_SEL_5 },
  353. { KGSL_PERFCOUNTER_NOT_USED, 0, 0, A5XX_RBBM_PERFCTR_UCHE_6_LO,
  354. A5XX_RBBM_PERFCTR_UCHE_6_HI, 58, A5XX_UCHE_PERFCTR_UCHE_SEL_6 },
  355. { KGSL_PERFCOUNTER_NOT_USED, 0, 0, A5XX_RBBM_PERFCTR_UCHE_7_LO,
  356. A5XX_RBBM_PERFCTR_UCHE_7_HI, 59, A5XX_UCHE_PERFCTR_UCHE_SEL_7 },
  357. };
  358. static struct adreno_perfcount_register a5xx_perfcounters_tp[] = {
  359. { KGSL_PERFCOUNTER_NOT_USED, 0, 0, A5XX_RBBM_PERFCTR_TP_0_LO,
  360. A5XX_RBBM_PERFCTR_TP_0_HI, 60, A5XX_TPL1_PERFCTR_TP_SEL_0 },
  361. { KGSL_PERFCOUNTER_NOT_USED, 0, 0, A5XX_RBBM_PERFCTR_TP_1_LO,
  362. A5XX_RBBM_PERFCTR_TP_1_HI, 61, A5XX_TPL1_PERFCTR_TP_SEL_1 },
  363. { KGSL_PERFCOUNTER_NOT_USED, 0, 0, A5XX_RBBM_PERFCTR_TP_2_LO,
  364. A5XX_RBBM_PERFCTR_TP_2_HI, 62, A5XX_TPL1_PERFCTR_TP_SEL_2 },
  365. { KGSL_PERFCOUNTER_NOT_USED, 0, 0, A5XX_RBBM_PERFCTR_TP_3_LO,
  366. A5XX_RBBM_PERFCTR_TP_3_HI, 63, A5XX_TPL1_PERFCTR_TP_SEL_3 },
  367. { KGSL_PERFCOUNTER_NOT_USED, 0, 0, A5XX_RBBM_PERFCTR_TP_4_LO,
  368. A5XX_RBBM_PERFCTR_TP_4_HI, 64, A5XX_TPL1_PERFCTR_TP_SEL_4 },
  369. { KGSL_PERFCOUNTER_NOT_USED, 0, 0, A5XX_RBBM_PERFCTR_TP_5_LO,
  370. A5XX_RBBM_PERFCTR_TP_5_HI, 65, A5XX_TPL1_PERFCTR_TP_SEL_5 },
  371. { KGSL_PERFCOUNTER_NOT_USED, 0, 0, A5XX_RBBM_PERFCTR_TP_6_LO,
  372. A5XX_RBBM_PERFCTR_TP_6_HI, 66, A5XX_TPL1_PERFCTR_TP_SEL_6 },
  373. { KGSL_PERFCOUNTER_NOT_USED, 0, 0, A5XX_RBBM_PERFCTR_TP_7_LO,
  374. A5XX_RBBM_PERFCTR_TP_7_HI, 67, A5XX_TPL1_PERFCTR_TP_SEL_7 },
  375. };
  376. static struct adreno_perfcount_register a5xx_perfcounters_sp[] = {
  377. { KGSL_PERFCOUNTER_NOT_USED, 0, 0, A5XX_RBBM_PERFCTR_SP_0_LO,
  378. A5XX_RBBM_PERFCTR_SP_0_HI, 68, A5XX_SP_PERFCTR_SP_SEL_0 },
  379. { KGSL_PERFCOUNTER_NOT_USED, 0, 0, A5XX_RBBM_PERFCTR_SP_1_LO,
  380. A5XX_RBBM_PERFCTR_SP_1_HI, 69, A5XX_SP_PERFCTR_SP_SEL_1 },
  381. { KGSL_PERFCOUNTER_NOT_USED, 0, 0, A5XX_RBBM_PERFCTR_SP_2_LO,
  382. A5XX_RBBM_PERFCTR_SP_2_HI, 70, A5XX_SP_PERFCTR_SP_SEL_2 },
  383. { KGSL_PERFCOUNTER_NOT_USED, 0, 0, A5XX_RBBM_PERFCTR_SP_3_LO,
  384. A5XX_RBBM_PERFCTR_SP_3_HI, 71, A5XX_SP_PERFCTR_SP_SEL_3 },
  385. { KGSL_PERFCOUNTER_NOT_USED, 0, 0, A5XX_RBBM_PERFCTR_SP_4_LO,
  386. A5XX_RBBM_PERFCTR_SP_4_HI, 72, A5XX_SP_PERFCTR_SP_SEL_4 },
  387. { KGSL_PERFCOUNTER_NOT_USED, 0, 0, A5XX_RBBM_PERFCTR_SP_5_LO,
  388. A5XX_RBBM_PERFCTR_SP_5_HI, 73, A5XX_SP_PERFCTR_SP_SEL_5 },
  389. { KGSL_PERFCOUNTER_NOT_USED, 0, 0, A5XX_RBBM_PERFCTR_SP_6_LO,
  390. A5XX_RBBM_PERFCTR_SP_6_HI, 74, A5XX_SP_PERFCTR_SP_SEL_6 },
  391. { KGSL_PERFCOUNTER_NOT_USED, 0, 0, A5XX_RBBM_PERFCTR_SP_7_LO,
  392. A5XX_RBBM_PERFCTR_SP_7_HI, 75, A5XX_SP_PERFCTR_SP_SEL_7 },
  393. { KGSL_PERFCOUNTER_NOT_USED, 0, 0, A5XX_RBBM_PERFCTR_SP_8_LO,
  394. A5XX_RBBM_PERFCTR_SP_8_HI, 76, A5XX_SP_PERFCTR_SP_SEL_8 },
  395. { KGSL_PERFCOUNTER_NOT_USED, 0, 0, A5XX_RBBM_PERFCTR_SP_9_LO,
  396. A5XX_RBBM_PERFCTR_SP_9_HI, 77, A5XX_SP_PERFCTR_SP_SEL_9 },
  397. { KGSL_PERFCOUNTER_NOT_USED, 0, 0, A5XX_RBBM_PERFCTR_SP_10_LO,
  398. A5XX_RBBM_PERFCTR_SP_10_HI, 78, A5XX_SP_PERFCTR_SP_SEL_10 },
  399. { KGSL_PERFCOUNTER_NOT_USED, 0, 0, A5XX_RBBM_PERFCTR_SP_11_LO,
  400. A5XX_RBBM_PERFCTR_SP_11_HI, 79, A5XX_SP_PERFCTR_SP_SEL_11 },
  401. };
  402. static struct adreno_perfcount_register a5xx_perfcounters_rb[] = {
  403. { KGSL_PERFCOUNTER_NOT_USED, 0, 0, A5XX_RBBM_PERFCTR_RB_0_LO,
  404. A5XX_RBBM_PERFCTR_RB_0_HI, 80, A5XX_RB_PERFCTR_RB_SEL_0 },
  405. { KGSL_PERFCOUNTER_NOT_USED, 0, 0, A5XX_RBBM_PERFCTR_RB_1_LO,
  406. A5XX_RBBM_PERFCTR_RB_1_HI, 81, A5XX_RB_PERFCTR_RB_SEL_1 },
  407. { KGSL_PERFCOUNTER_NOT_USED, 0, 0, A5XX_RBBM_PERFCTR_RB_2_LO,
  408. A5XX_RBBM_PERFCTR_RB_2_HI, 82, A5XX_RB_PERFCTR_RB_SEL_2 },
  409. { KGSL_PERFCOUNTER_NOT_USED, 0, 0, A5XX_RBBM_PERFCTR_RB_3_LO,
  410. A5XX_RBBM_PERFCTR_RB_3_HI, 83, A5XX_RB_PERFCTR_RB_SEL_3 },
  411. { KGSL_PERFCOUNTER_NOT_USED, 0, 0, A5XX_RBBM_PERFCTR_RB_4_LO,
  412. A5XX_RBBM_PERFCTR_RB_4_HI, 84, A5XX_RB_PERFCTR_RB_SEL_4 },
  413. { KGSL_PERFCOUNTER_NOT_USED, 0, 0, A5XX_RBBM_PERFCTR_RB_5_LO,
  414. A5XX_RBBM_PERFCTR_RB_5_HI, 85, A5XX_RB_PERFCTR_RB_SEL_5 },
  415. { KGSL_PERFCOUNTER_NOT_USED, 0, 0, A5XX_RBBM_PERFCTR_RB_6_LO,
  416. A5XX_RBBM_PERFCTR_RB_6_HI, 86, A5XX_RB_PERFCTR_RB_SEL_6 },
  417. { KGSL_PERFCOUNTER_NOT_USED, 0, 0, A5XX_RBBM_PERFCTR_RB_7_LO,
  418. A5XX_RBBM_PERFCTR_RB_7_HI, 87, A5XX_RB_PERFCTR_RB_SEL_7 },
  419. };
  420. static struct adreno_perfcount_register a5xx_perfcounters_vsc[] = {
  421. { KGSL_PERFCOUNTER_NOT_USED, 0, 0, A5XX_RBBM_PERFCTR_VSC_0_LO,
  422. A5XX_RBBM_PERFCTR_VSC_0_HI, 88, A5XX_VSC_PERFCTR_VSC_SEL_0 },
  423. { KGSL_PERFCOUNTER_NOT_USED, 0, 0, A5XX_RBBM_PERFCTR_VSC_1_LO,
  424. A5XX_RBBM_PERFCTR_VSC_1_HI, 89, A5XX_VSC_PERFCTR_VSC_SEL_1 },
  425. };
  426. static struct adreno_perfcount_register a5xx_perfcounters_lrz[] = {
  427. { KGSL_PERFCOUNTER_NOT_USED, 0, 0, A5XX_RBBM_PERFCTR_LRZ_0_LO,
  428. A5XX_RBBM_PERFCTR_LRZ_0_HI, 90, A5XX_GRAS_PERFCTR_LRZ_SEL_0 },
  429. { KGSL_PERFCOUNTER_NOT_USED, 0, 0, A5XX_RBBM_PERFCTR_LRZ_1_LO,
  430. A5XX_RBBM_PERFCTR_LRZ_1_HI, 91, A5XX_GRAS_PERFCTR_LRZ_SEL_1 },
  431. { KGSL_PERFCOUNTER_NOT_USED, 0, 0, A5XX_RBBM_PERFCTR_LRZ_2_LO,
  432. A5XX_RBBM_PERFCTR_LRZ_2_HI, 92, A5XX_GRAS_PERFCTR_LRZ_SEL_2 },
  433. { KGSL_PERFCOUNTER_NOT_USED, 0, 0, A5XX_RBBM_PERFCTR_LRZ_3_LO,
  434. A5XX_RBBM_PERFCTR_LRZ_3_HI, 93, A5XX_GRAS_PERFCTR_LRZ_SEL_3 },
  435. };
  436. static struct adreno_perfcount_register a5xx_perfcounters_cmp[] = {
  437. { KGSL_PERFCOUNTER_NOT_USED, 0, 0, A5XX_RBBM_PERFCTR_CMP_0_LO,
  438. A5XX_RBBM_PERFCTR_CMP_0_HI, 94, A5XX_RB_PERFCTR_CMP_SEL_0 },
  439. { KGSL_PERFCOUNTER_NOT_USED, 0, 0, A5XX_RBBM_PERFCTR_CMP_1_LO,
  440. A5XX_RBBM_PERFCTR_CMP_1_HI, 95, A5XX_RB_PERFCTR_CMP_SEL_1 },
  441. { KGSL_PERFCOUNTER_NOT_USED, 0, 0, A5XX_RBBM_PERFCTR_CMP_2_LO,
  442. A5XX_RBBM_PERFCTR_CMP_2_HI, 96, A5XX_RB_PERFCTR_CMP_SEL_2 },
  443. { KGSL_PERFCOUNTER_NOT_USED, 0, 0, A5XX_RBBM_PERFCTR_CMP_3_LO,
  444. A5XX_RBBM_PERFCTR_CMP_3_HI, 97, A5XX_RB_PERFCTR_CMP_SEL_3 },
  445. };
  446. static struct adreno_perfcount_register a5xx_perfcounters_vbif[] = {
  447. { KGSL_PERFCOUNTER_NOT_USED, 0, 0, A5XX_VBIF_PERF_CNT_LOW0,
  448. A5XX_VBIF_PERF_CNT_HIGH0, -1, A5XX_VBIF_PERF_CNT_SEL0 },
  449. { KGSL_PERFCOUNTER_NOT_USED, 0, 0, A5XX_VBIF_PERF_CNT_LOW1,
  450. A5XX_VBIF_PERF_CNT_HIGH1, -1, A5XX_VBIF_PERF_CNT_SEL1 },
  451. { KGSL_PERFCOUNTER_NOT_USED, 0, 0, A5XX_VBIF_PERF_CNT_LOW2,
  452. A5XX_VBIF_PERF_CNT_HIGH2, -1, A5XX_VBIF_PERF_CNT_SEL2 },
  453. { KGSL_PERFCOUNTER_NOT_USED, 0, 0, A5XX_VBIF_PERF_CNT_LOW3,
  454. A5XX_VBIF_PERF_CNT_HIGH3, -1, A5XX_VBIF_PERF_CNT_SEL3 },
  455. };
  456. static struct adreno_perfcount_register a5xx_perfcounters_vbif_pwr[] = {
  457. { KGSL_PERFCOUNTER_NOT_USED, 0, 0, A5XX_VBIF_PERF_PWR_CNT_LOW0,
  458. A5XX_VBIF_PERF_PWR_CNT_HIGH0, -1, A5XX_VBIF_PERF_PWR_CNT_EN0 },
  459. { KGSL_PERFCOUNTER_NOT_USED, 0, 0, A5XX_VBIF_PERF_PWR_CNT_LOW1,
  460. A5XX_VBIF_PERF_PWR_CNT_HIGH1, -1, A5XX_VBIF_PERF_PWR_CNT_EN1 },
  461. { KGSL_PERFCOUNTER_NOT_USED, 0, 0, A5XX_VBIF_PERF_PWR_CNT_LOW2,
  462. A5XX_VBIF_PERF_PWR_CNT_HIGH2, -1, A5XX_VBIF_PERF_PWR_CNT_EN2 },
  463. };
  464. static struct adreno_perfcount_register a5xx_perfcounters_alwayson[] = {
  465. { KGSL_PERFCOUNTER_NOT_USED, 0, 0, A5XX_RBBM_ALWAYSON_COUNTER_LO,
  466. A5XX_RBBM_ALWAYSON_COUNTER_HI, -1 },
  467. };
  468. static struct adreno_perfcount_register a5xx_pwrcounters_sp[] = {
  469. { KGSL_PERFCOUNTER_NOT_USED, 0, 0, A5XX_SP_POWER_COUNTER_0_LO,
  470. A5XX_SP_POWER_COUNTER_0_HI, -1, A5XX_SP_POWERCTR_SP_SEL_0 },
  471. { KGSL_PERFCOUNTER_NOT_USED, 0, 0, A5XX_SP_POWER_COUNTER_1_LO,
  472. A5XX_SP_POWER_COUNTER_1_HI, -1, A5XX_SP_POWERCTR_SP_SEL_1 },
  473. { KGSL_PERFCOUNTER_NOT_USED, 0, 0, A5XX_SP_POWER_COUNTER_2_LO,
  474. A5XX_SP_POWER_COUNTER_2_HI, -1, A5XX_SP_POWERCTR_SP_SEL_2 },
  475. { KGSL_PERFCOUNTER_NOT_USED, 0, 0, A5XX_SP_POWER_COUNTER_3_LO,
  476. A5XX_SP_POWER_COUNTER_3_HI, -1, A5XX_SP_POWERCTR_SP_SEL_3 },
  477. };
  478. static struct adreno_perfcount_register a5xx_pwrcounters_tp[] = {
  479. { KGSL_PERFCOUNTER_NOT_USED, 0, 0, A5XX_TP_POWER_COUNTER_0_LO,
  480. A5XX_TP_POWER_COUNTER_0_HI, -1, A5XX_TPL1_POWERCTR_TP_SEL_0 },
  481. { KGSL_PERFCOUNTER_NOT_USED, 0, 0, A5XX_TP_POWER_COUNTER_1_LO,
  482. A5XX_TP_POWER_COUNTER_1_HI, -1, A5XX_TPL1_POWERCTR_TP_SEL_1 },
  483. { KGSL_PERFCOUNTER_NOT_USED, 0, 0, A5XX_TP_POWER_COUNTER_2_LO,
  484. A5XX_TP_POWER_COUNTER_2_HI, -1, A5XX_TPL1_POWERCTR_TP_SEL_2 },
  485. { KGSL_PERFCOUNTER_NOT_USED, 0, 0, A5XX_TP_POWER_COUNTER_3_LO,
  486. A5XX_TP_POWER_COUNTER_3_HI, -1, A5XX_TPL1_POWERCTR_TP_SEL_3 },
  487. };
  488. static struct adreno_perfcount_register a5xx_pwrcounters_rb[] = {
  489. { KGSL_PERFCOUNTER_NOT_USED, 0, 0, A5XX_RB_POWER_COUNTER_0_LO,
  490. A5XX_RB_POWER_COUNTER_0_HI, -1, A5XX_RB_POWERCTR_RB_SEL_0 },
  491. { KGSL_PERFCOUNTER_NOT_USED, 0, 0, A5XX_RB_POWER_COUNTER_1_LO,
  492. A5XX_RB_POWER_COUNTER_1_HI, -1, A5XX_RB_POWERCTR_RB_SEL_1 },
  493. { KGSL_PERFCOUNTER_NOT_USED, 0, 0, A5XX_RB_POWER_COUNTER_2_LO,
  494. A5XX_RB_POWER_COUNTER_2_HI, -1, A5XX_RB_POWERCTR_RB_SEL_2 },
  495. { KGSL_PERFCOUNTER_NOT_USED, 0, 0, A5XX_RB_POWER_COUNTER_3_LO,
  496. A5XX_RB_POWER_COUNTER_3_HI, -1, A5XX_RB_POWERCTR_RB_SEL_3 },
  497. };
  498. static struct adreno_perfcount_register a5xx_pwrcounters_ccu[] = {
  499. { KGSL_PERFCOUNTER_NOT_USED, 0, 0, A5XX_CCU_POWER_COUNTER_0_LO,
  500. A5XX_CCU_POWER_COUNTER_0_HI, -1, A5XX_RB_POWERCTR_CCU_SEL_0 },
  501. { KGSL_PERFCOUNTER_NOT_USED, 0, 0, A5XX_CCU_POWER_COUNTER_1_LO,
  502. A5XX_CCU_POWER_COUNTER_1_HI, -1, A5XX_RB_POWERCTR_CCU_SEL_1 },
  503. };
  504. static struct adreno_perfcount_register a5xx_pwrcounters_uche[] = {
  505. { KGSL_PERFCOUNTER_NOT_USED, 0, 0, A5XX_UCHE_POWER_COUNTER_0_LO,
  506. A5XX_UCHE_POWER_COUNTER_0_HI, -1,
  507. A5XX_UCHE_POWERCTR_UCHE_SEL_0 },
  508. { KGSL_PERFCOUNTER_NOT_USED, 0, 0, A5XX_UCHE_POWER_COUNTER_1_LO,
  509. A5XX_UCHE_POWER_COUNTER_1_HI, -1,
  510. A5XX_UCHE_POWERCTR_UCHE_SEL_1 },
  511. { KGSL_PERFCOUNTER_NOT_USED, 0, 0, A5XX_UCHE_POWER_COUNTER_2_LO,
  512. A5XX_UCHE_POWER_COUNTER_2_HI, -1,
  513. A5XX_UCHE_POWERCTR_UCHE_SEL_2 },
  514. { KGSL_PERFCOUNTER_NOT_USED, 0, 0, A5XX_UCHE_POWER_COUNTER_3_LO,
  515. A5XX_UCHE_POWER_COUNTER_3_HI, -1,
  516. A5XX_UCHE_POWERCTR_UCHE_SEL_3 },
  517. };
  518. static struct adreno_perfcount_register a5xx_pwrcounters_cp[] = {
  519. { KGSL_PERFCOUNTER_NOT_USED, 0, 0, A5XX_CP_POWER_COUNTER_0_LO,
  520. A5XX_CP_POWER_COUNTER_0_HI, -1, A5XX_CP_POWERCTR_CP_SEL_0 },
  521. { KGSL_PERFCOUNTER_NOT_USED, 0, 0, A5XX_CP_POWER_COUNTER_1_LO,
  522. A5XX_CP_POWER_COUNTER_1_HI, -1, A5XX_CP_POWERCTR_CP_SEL_1 },
  523. { KGSL_PERFCOUNTER_NOT_USED, 0, 0, A5XX_CP_POWER_COUNTER_2_LO,
  524. A5XX_CP_POWER_COUNTER_2_HI, -1, A5XX_CP_POWERCTR_CP_SEL_2 },
  525. { KGSL_PERFCOUNTER_NOT_USED, 0, 0, A5XX_CP_POWER_COUNTER_3_LO,
  526. A5XX_CP_POWER_COUNTER_3_HI, -1, A5XX_CP_POWERCTR_CP_SEL_3 },
  527. };
  528. static struct adreno_perfcount_register a5xx_pwrcounters_gpmu[] = {
  529. { KGSL_PERFCOUNTER_NOT_USED, 0, 0, A5XX_GPMU_POWER_COUNTER_0_LO,
  530. A5XX_GPMU_POWER_COUNTER_0_HI, -1,
  531. A5XX_GPMU_POWER_COUNTER_SELECT_0 },
  532. { KGSL_PERFCOUNTER_NOT_USED, 0, 0, A5XX_GPMU_POWER_COUNTER_1_LO,
  533. A5XX_GPMU_POWER_COUNTER_1_HI, -1,
  534. A5XX_GPMU_POWER_COUNTER_SELECT_0 },
  535. { KGSL_PERFCOUNTER_NOT_USED, 0, 0, A5XX_GPMU_POWER_COUNTER_2_LO,
  536. A5XX_GPMU_POWER_COUNTER_2_HI, -1,
  537. A5XX_GPMU_POWER_COUNTER_SELECT_0 },
  538. { KGSL_PERFCOUNTER_NOT_USED, 0, 0, A5XX_GPMU_POWER_COUNTER_3_LO,
  539. A5XX_GPMU_POWER_COUNTER_3_HI, -1,
  540. A5XX_GPMU_POWER_COUNTER_SELECT_0 },
  541. { KGSL_PERFCOUNTER_NOT_USED, 0, 0, A5XX_GPMU_POWER_COUNTER_4_LO,
  542. A5XX_GPMU_POWER_COUNTER_4_HI, -1,
  543. A5XX_GPMU_POWER_COUNTER_SELECT_1 },
  544. { KGSL_PERFCOUNTER_NOT_USED, 0, 0, A5XX_GPMU_POWER_COUNTER_5_LO,
  545. A5XX_GPMU_POWER_COUNTER_5_HI, -1,
  546. A5XX_GPMU_POWER_COUNTER_SELECT_1 },
  547. };
  548. static struct adreno_perfcount_register a5xx_pwrcounters_alwayson[] = {
  549. { KGSL_PERFCOUNTER_NOT_USED, 0, 0, A5XX_GPMU_ALWAYS_ON_COUNTER_LO,
  550. A5XX_GPMU_ALWAYS_ON_COUNTER_HI, -1 },
  551. };
  552. #define A5XX_PERFCOUNTER_GROUP(offset, name, enable, read, load) \
  553. ADRENO_PERFCOUNTER_GROUP(a5xx, offset, name, enable, read, load)
  554. #define A5XX_PERFCOUNTER_GROUP_FLAGS(offset, name, flags, enable, read, load) \
  555. ADRENO_PERFCOUNTER_GROUP_FLAGS(a5xx, offset, name, flags, enable, \
  556. read, load)
  557. #define A5XX_POWER_COUNTER_GROUP(offset, name, enable, read) \
  558. [KGSL_PERFCOUNTER_GROUP_##offset##_PWR] = { a5xx_pwrcounters_##name, \
  559. ARRAY_SIZE(a5xx_pwrcounters_##name), __stringify(name##_pwr), 0, \
  560. enable, read, NULL }
  561. #define A5XX_REGULAR_PERFCOUNTER_GROUP(offset, name) \
  562. A5XX_PERFCOUNTER_GROUP(offset, name, a5xx_counter_inline_enable, \
  563. a5xx_counter_read, a5xx_counter_load)
  564. static struct adreno_perfcount_group a5xx_perfcounter_groups
  565. [KGSL_PERFCOUNTER_GROUP_MAX] = {
  566. A5XX_REGULAR_PERFCOUNTER_GROUP(CP, cp),
  567. A5XX_PERFCOUNTER_GROUP(RBBM, rbbm,
  568. a5xx_counter_rbbm_enable, a5xx_counter_read, a5xx_counter_load),
  569. A5XX_REGULAR_PERFCOUNTER_GROUP(PC, pc),
  570. A5XX_REGULAR_PERFCOUNTER_GROUP(VFD, vfd),
  571. A5XX_REGULAR_PERFCOUNTER_GROUP(HLSQ, hlsq),
  572. A5XX_REGULAR_PERFCOUNTER_GROUP(VPC, vpc),
  573. A5XX_REGULAR_PERFCOUNTER_GROUP(CCU, ccu),
  574. A5XX_REGULAR_PERFCOUNTER_GROUP(CMP, cmp),
  575. A5XX_REGULAR_PERFCOUNTER_GROUP(TSE, tse),
  576. A5XX_REGULAR_PERFCOUNTER_GROUP(RAS, ras),
  577. A5XX_REGULAR_PERFCOUNTER_GROUP(LRZ, lrz),
  578. A5XX_REGULAR_PERFCOUNTER_GROUP(UCHE, uche),
  579. A5XX_REGULAR_PERFCOUNTER_GROUP(TP, tp),
  580. A5XX_REGULAR_PERFCOUNTER_GROUP(SP, sp),
  581. A5XX_REGULAR_PERFCOUNTER_GROUP(RB, rb),
  582. A5XX_REGULAR_PERFCOUNTER_GROUP(VSC, vsc),
  583. A5XX_PERFCOUNTER_GROUP(VBIF, vbif,
  584. a5xx_counter_vbif_enable, a5xx_counter_read_norestore, NULL),
  585. A5XX_PERFCOUNTER_GROUP_FLAGS(VBIF_PWR, vbif_pwr,
  586. ADRENO_PERFCOUNTER_GROUP_FIXED,
  587. a5xx_counter_vbif_pwr_enable,
  588. a5xx_counter_read_norestore, NULL),
  589. A5XX_PERFCOUNTER_GROUP_FLAGS(ALWAYSON, alwayson,
  590. ADRENO_PERFCOUNTER_GROUP_FIXED,
  591. a5xx_counter_alwayson_enable, a5xx_counter_alwayson_read, NULL),
  592. A5XX_POWER_COUNTER_GROUP(SP, sp,
  593. a5xx_counter_pwr_enable, a5xx_counter_read_norestore),
  594. A5XX_POWER_COUNTER_GROUP(TP, tp,
  595. a5xx_counter_pwr_enable, a5xx_counter_read_norestore),
  596. A5XX_POWER_COUNTER_GROUP(RB, rb,
  597. a5xx_counter_pwr_enable, a5xx_counter_read_norestore),
  598. A5XX_POWER_COUNTER_GROUP(CCU, ccu,
  599. a5xx_counter_pwr_enable, a5xx_counter_read_norestore),
  600. A5XX_POWER_COUNTER_GROUP(UCHE, uche,
  601. a5xx_counter_pwr_enable, a5xx_counter_read_norestore),
  602. A5XX_POWER_COUNTER_GROUP(CP, cp,
  603. a5xx_counter_pwr_enable, a5xx_counter_read_norestore),
  604. A5XX_POWER_COUNTER_GROUP(GPMU, gpmu,
  605. a5xx_counter_pwr_gpmu_enable, a5xx_counter_read_norestore),
  606. A5XX_POWER_COUNTER_GROUP(ALWAYSON, alwayson,
  607. a5xx_counter_pwr_alwayson_enable, a5xx_counter_read_norestore),
  608. };
  609. const struct adreno_perfcounters adreno_a5xx_perfcounters = {
  610. a5xx_perfcounter_groups,
  611. ARRAY_SIZE(a5xx_perfcounter_groups),
  612. };