adreno_a3xx_perfcounter.c 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * Copyright (c) 2020, The Linux Foundation. All rights reserved.
  4. */
  5. #include "adreno.h"
  6. #include "adreno_a3xx.h"
  7. #include "adreno_perfcounter.h"
  8. #include "kgsl_device.h"
  9. /* Bit flag for RBMM_PERFCTR_CTL */
  10. #define RBBM_PERFCTR_CTL_ENABLE 0x00000001
  11. #define VBIF2_PERF_CNT_SEL_MASK 0x7F
  12. /* offset of clear register from select register */
  13. #define VBIF2_PERF_CLR_REG_SEL_OFF 8
  14. /* offset of enable register from select register */
  15. #define VBIF2_PERF_EN_REG_SEL_OFF 16
  16. /* offset of clear register from the enable register */
  17. #define VBIF2_PERF_PWR_CLR_REG_EN_OFF 8
  18. static void a3xx_counter_load(struct adreno_device *adreno_dev,
  19. struct adreno_perfcount_register *reg)
  20. {
  21. struct kgsl_device *device = KGSL_DEVICE(adreno_dev);
  22. int index = reg->load_bit / 32;
  23. u32 enable = BIT(reg->load_bit & 31);
  24. kgsl_regwrite(device, A3XX_RBBM_PERFCTR_LOAD_VALUE_LO,
  25. lower_32_bits(reg->value));
  26. kgsl_regwrite(device, A3XX_RBBM_PERFCTR_LOAD_VALUE_HI,
  27. upper_32_bits(reg->value));
  28. if (index == 0)
  29. kgsl_regwrite(device, A3XX_RBBM_PERFCTR_LOAD_CMD0, enable);
  30. else
  31. kgsl_regwrite(device, A3XX_RBBM_PERFCTR_LOAD_CMD1, enable);
  32. }
  33. static int a3xx_counter_enable(struct adreno_device *adreno_dev,
  34. const struct adreno_perfcount_group *group,
  35. unsigned int counter, unsigned int countable)
  36. {
  37. struct kgsl_device *device = KGSL_DEVICE(adreno_dev);
  38. struct adreno_perfcount_register *reg = &group->regs[counter];
  39. kgsl_regwrite(device, reg->select, countable);
  40. reg->value = 0;
  41. return 0;
  42. }
  43. static u64 a3xx_counter_read(struct adreno_device *adreno_dev,
  44. const struct adreno_perfcount_group *group,
  45. unsigned int counter)
  46. {
  47. struct kgsl_device *device = KGSL_DEVICE(adreno_dev);
  48. struct adreno_perfcount_register *reg = &group->regs[counter];
  49. u32 val, hi, lo;
  50. kgsl_regread(device, A3XX_RBBM_PERFCTR_CTL, &val);
  51. kgsl_regwrite(device, A3XX_RBBM_PERFCTR_CTL,
  52. val & ~RBBM_PERFCTR_CTL_ENABLE);
  53. kgsl_regread(device, reg->offset, &lo);
  54. kgsl_regread(device, reg->offset_hi, &hi);
  55. kgsl_regwrite(device, A3XX_RBBM_PERFCTR_CTL, val);
  56. return (((u64) hi) << 32) | lo;
  57. }
  58. static int a3xx_counter_pwr_enable(struct adreno_device *adreno_dev,
  59. const struct adreno_perfcount_group *group,
  60. unsigned int counter, unsigned int countable)
  61. {
  62. return 0;
  63. }
  64. static u64 a3xx_counter_pwr_read(struct adreno_device *adreno_dev,
  65. const struct adreno_perfcount_group *group,
  66. unsigned int counter)
  67. {
  68. struct kgsl_device *device = KGSL_DEVICE(adreno_dev);
  69. struct adreno_perfcount_register *reg = &group->regs[counter];
  70. u32 val, hi, lo;
  71. kgsl_regread(device, A3XX_RBBM_RBBM_CTL, &val);
  72. /* Freeze the counter so we can read it */
  73. if (!counter)
  74. kgsl_regwrite(device, A3XX_RBBM_RBBM_CTL, val & ~0x10000);
  75. else
  76. kgsl_regwrite(device, A3XX_RBBM_RBBM_CTL, val & ~0x20000);
  77. kgsl_regread(device, reg->offset, &lo);
  78. kgsl_regread(device, reg->offset_hi, &hi);
  79. kgsl_regwrite(device, A3XX_RBBM_RBBM_CTL, val);
  80. return ((((u64) hi) << 32) | lo) + reg->value;
  81. }
  82. static int a3xx_counter_vbif_enable(struct adreno_device *adreno_dev,
  83. const struct adreno_perfcount_group *group,
  84. unsigned int counter, unsigned int countable)
  85. {
  86. struct kgsl_device *device = KGSL_DEVICE(adreno_dev);
  87. struct adreno_perfcount_register *reg = &group->regs[counter];
  88. if (countable > VBIF2_PERF_CNT_SEL_MASK)
  89. return -EINVAL;
  90. /*
  91. * Write 1, followed by 0 to CLR register for
  92. * clearing the counter
  93. */
  94. kgsl_regwrite(device,
  95. reg->select - VBIF2_PERF_CLR_REG_SEL_OFF, 1);
  96. kgsl_regwrite(device,
  97. reg->select - VBIF2_PERF_CLR_REG_SEL_OFF, 0);
  98. kgsl_regwrite(device,
  99. reg->select, countable & VBIF2_PERF_CNT_SEL_MASK);
  100. /* enable reg is 8 DWORDS before select reg */
  101. kgsl_regwrite(device,
  102. reg->select - VBIF2_PERF_EN_REG_SEL_OFF, 1);
  103. kgsl_regwrite(device, reg->select, countable);
  104. reg->value = 0;
  105. return 0;
  106. }
  107. static u64 a3xx_counter_vbif_read(struct adreno_device *adreno_dev,
  108. const struct adreno_perfcount_group *group,
  109. unsigned int counter)
  110. {
  111. struct kgsl_device *device = KGSL_DEVICE(adreno_dev);
  112. struct adreno_perfcount_register *reg = &group->regs[counter];
  113. u32 hi, lo;
  114. /* freeze counter */
  115. kgsl_regwrite(device, reg->select - VBIF2_PERF_EN_REG_SEL_OFF, 0);
  116. kgsl_regread(device, reg->offset, &lo);
  117. kgsl_regread(device, reg->offset_hi, &hi);
  118. /* un-freeze counter */
  119. kgsl_regwrite(device, reg->select - VBIF2_PERF_EN_REG_SEL_OFF, 1);
  120. return ((((u64) hi) << 32) | lo) + reg->value;
  121. }
  122. static int a3xx_counter_vbif_pwr_enable(struct adreno_device *adreno_dev,
  123. const struct adreno_perfcount_group *group,
  124. unsigned int counter, unsigned int countable)
  125. {
  126. struct kgsl_device *device = KGSL_DEVICE(adreno_dev);
  127. struct adreno_perfcount_register *reg = &group->regs[counter];
  128. /*
  129. * Write 1, followed by 0 to CLR register for
  130. * clearing the counter
  131. */
  132. kgsl_regwrite(device, reg->select +
  133. VBIF2_PERF_PWR_CLR_REG_EN_OFF, 1);
  134. kgsl_regwrite(device, reg->select +
  135. VBIF2_PERF_PWR_CLR_REG_EN_OFF, 0);
  136. kgsl_regwrite(device, reg->select, 1);
  137. reg->value = 0;
  138. return 0;
  139. }
  140. static u64 a3xx_counter_vbif_pwr_read(struct adreno_device *adreno_dev,
  141. const struct adreno_perfcount_group *group,
  142. unsigned int counter)
  143. {
  144. struct kgsl_device *device = KGSL_DEVICE(adreno_dev);
  145. struct adreno_perfcount_register *reg = &group->regs[counter];
  146. u32 hi, lo;
  147. /* freeze counter */
  148. kgsl_regwrite(device, reg->select, 0);
  149. kgsl_regread(device, reg->offset, &lo);
  150. kgsl_regread(device, reg->offset_hi, &hi);
  151. /* un-freeze counter */
  152. kgsl_regwrite(device, reg->select, 1);
  153. return ((((u64) hi) << 32) | lo) + reg->value;
  154. }
  155. /*
  156. * Define the available perfcounter groups - these get used by
  157. * adreno_perfcounter_get and adreno_perfcounter_put
  158. */
  159. static struct adreno_perfcount_register a3xx_perfcounters_cp[] = {
  160. { KGSL_PERFCOUNTER_NOT_USED, 0, 0, A3XX_RBBM_PERFCTR_CP_0_LO,
  161. A3XX_RBBM_PERFCTR_CP_0_HI, 0, A3XX_CP_PERFCOUNTER_SELECT },
  162. };
  163. static struct adreno_perfcount_register a3xx_perfcounters_rbbm[] = {
  164. { KGSL_PERFCOUNTER_NOT_USED, 0, 0, A3XX_RBBM_PERFCTR_RBBM_0_LO,
  165. A3XX_RBBM_PERFCTR_RBBM_0_HI, 1, A3XX_RBBM_PERFCOUNTER0_SELECT },
  166. { KGSL_PERFCOUNTER_NOT_USED, 0, 0, A3XX_RBBM_PERFCTR_RBBM_1_LO,
  167. A3XX_RBBM_PERFCTR_RBBM_1_HI, 2, A3XX_RBBM_PERFCOUNTER1_SELECT },
  168. };
  169. static struct adreno_perfcount_register a3xx_perfcounters_pc[] = {
  170. { KGSL_PERFCOUNTER_NOT_USED, 0, 0, A3XX_RBBM_PERFCTR_PC_0_LO,
  171. A3XX_RBBM_PERFCTR_PC_0_HI, 3, A3XX_PC_PERFCOUNTER0_SELECT },
  172. { KGSL_PERFCOUNTER_NOT_USED, 0, 0, A3XX_RBBM_PERFCTR_PC_1_LO,
  173. A3XX_RBBM_PERFCTR_PC_1_HI, 4, A3XX_PC_PERFCOUNTER1_SELECT },
  174. { KGSL_PERFCOUNTER_NOT_USED, 0, 0, A3XX_RBBM_PERFCTR_PC_2_LO,
  175. A3XX_RBBM_PERFCTR_PC_2_HI, 5, A3XX_PC_PERFCOUNTER2_SELECT },
  176. { KGSL_PERFCOUNTER_NOT_USED, 0, 0, A3XX_RBBM_PERFCTR_PC_3_LO,
  177. A3XX_RBBM_PERFCTR_PC_3_HI, 6, A3XX_PC_PERFCOUNTER3_SELECT },
  178. };
  179. static struct adreno_perfcount_register a3xx_perfcounters_vfd[] = {
  180. { KGSL_PERFCOUNTER_NOT_USED, 0, 0, A3XX_RBBM_PERFCTR_VFD_0_LO,
  181. A3XX_RBBM_PERFCTR_VFD_0_HI, 7, A3XX_VFD_PERFCOUNTER0_SELECT },
  182. { KGSL_PERFCOUNTER_NOT_USED, 0, 0, A3XX_RBBM_PERFCTR_VFD_1_LO,
  183. A3XX_RBBM_PERFCTR_VFD_1_HI, 8, A3XX_VFD_PERFCOUNTER1_SELECT },
  184. };
  185. static struct adreno_perfcount_register a3xx_perfcounters_hlsq[] = {
  186. { KGSL_PERFCOUNTER_NOT_USED, 0, 0, A3XX_RBBM_PERFCTR_HLSQ_0_LO,
  187. A3XX_RBBM_PERFCTR_HLSQ_0_HI, 9,
  188. A3XX_HLSQ_PERFCOUNTER0_SELECT },
  189. { KGSL_PERFCOUNTER_NOT_USED, 0, 0, A3XX_RBBM_PERFCTR_HLSQ_1_LO,
  190. A3XX_RBBM_PERFCTR_HLSQ_1_HI, 10,
  191. A3XX_HLSQ_PERFCOUNTER1_SELECT },
  192. { KGSL_PERFCOUNTER_NOT_USED, 0, 0, A3XX_RBBM_PERFCTR_HLSQ_2_LO,
  193. A3XX_RBBM_PERFCTR_HLSQ_2_HI, 11,
  194. A3XX_HLSQ_PERFCOUNTER2_SELECT },
  195. { KGSL_PERFCOUNTER_NOT_USED, 0, 0, A3XX_RBBM_PERFCTR_HLSQ_3_LO,
  196. A3XX_RBBM_PERFCTR_HLSQ_3_HI, 12,
  197. A3XX_HLSQ_PERFCOUNTER3_SELECT },
  198. { KGSL_PERFCOUNTER_NOT_USED, 0, 0, A3XX_RBBM_PERFCTR_HLSQ_4_LO,
  199. A3XX_RBBM_PERFCTR_HLSQ_4_HI, 13,
  200. A3XX_HLSQ_PERFCOUNTER4_SELECT },
  201. { KGSL_PERFCOUNTER_NOT_USED, 0, 0, A3XX_RBBM_PERFCTR_HLSQ_5_LO,
  202. A3XX_RBBM_PERFCTR_HLSQ_5_HI, 14,
  203. A3XX_HLSQ_PERFCOUNTER5_SELECT },
  204. };
  205. static struct adreno_perfcount_register a3xx_perfcounters_vpc[] = {
  206. { KGSL_PERFCOUNTER_NOT_USED, 0, 0, A3XX_RBBM_PERFCTR_VPC_0_LO,
  207. A3XX_RBBM_PERFCTR_VPC_0_HI, 15, A3XX_VPC_PERFCOUNTER0_SELECT },
  208. { KGSL_PERFCOUNTER_NOT_USED, 0, 0, A3XX_RBBM_PERFCTR_VPC_1_LO,
  209. A3XX_RBBM_PERFCTR_VPC_1_HI, 16, A3XX_VPC_PERFCOUNTER1_SELECT },
  210. };
  211. static struct adreno_perfcount_register a3xx_perfcounters_tse[] = {
  212. { KGSL_PERFCOUNTER_NOT_USED, 0, 0, A3XX_RBBM_PERFCTR_TSE_0_LO,
  213. A3XX_RBBM_PERFCTR_TSE_0_HI, 17, A3XX_GRAS_PERFCOUNTER0_SELECT },
  214. { KGSL_PERFCOUNTER_NOT_USED, 0, 0, A3XX_RBBM_PERFCTR_TSE_1_LO,
  215. A3XX_RBBM_PERFCTR_TSE_1_HI, 18, A3XX_GRAS_PERFCOUNTER1_SELECT },
  216. };
  217. static struct adreno_perfcount_register a3xx_perfcounters_ras[] = {
  218. { KGSL_PERFCOUNTER_NOT_USED, 0, 0, A3XX_RBBM_PERFCTR_RAS_0_LO,
  219. A3XX_RBBM_PERFCTR_RAS_0_HI, 19, A3XX_GRAS_PERFCOUNTER2_SELECT },
  220. { KGSL_PERFCOUNTER_NOT_USED, 0, 0, A3XX_RBBM_PERFCTR_RAS_1_LO,
  221. A3XX_RBBM_PERFCTR_RAS_1_HI, 20, A3XX_GRAS_PERFCOUNTER3_SELECT },
  222. };
  223. static struct adreno_perfcount_register a3xx_perfcounters_uche[] = {
  224. { KGSL_PERFCOUNTER_NOT_USED, 0, 0, A3XX_RBBM_PERFCTR_UCHE_0_LO,
  225. A3XX_RBBM_PERFCTR_UCHE_0_HI, 21,
  226. A3XX_UCHE_PERFCOUNTER0_SELECT },
  227. { KGSL_PERFCOUNTER_NOT_USED, 0, 0, A3XX_RBBM_PERFCTR_UCHE_1_LO,
  228. A3XX_RBBM_PERFCTR_UCHE_1_HI, 22,
  229. A3XX_UCHE_PERFCOUNTER1_SELECT },
  230. { KGSL_PERFCOUNTER_NOT_USED, 0, 0, A3XX_RBBM_PERFCTR_UCHE_2_LO,
  231. A3XX_RBBM_PERFCTR_UCHE_2_HI, 23,
  232. A3XX_UCHE_PERFCOUNTER2_SELECT },
  233. { KGSL_PERFCOUNTER_NOT_USED, 0, 0, A3XX_RBBM_PERFCTR_UCHE_3_LO,
  234. A3XX_RBBM_PERFCTR_UCHE_3_HI, 24,
  235. A3XX_UCHE_PERFCOUNTER3_SELECT },
  236. { KGSL_PERFCOUNTER_NOT_USED, 0, 0, A3XX_RBBM_PERFCTR_UCHE_4_LO,
  237. A3XX_RBBM_PERFCTR_UCHE_4_HI, 25,
  238. A3XX_UCHE_PERFCOUNTER4_SELECT },
  239. { KGSL_PERFCOUNTER_NOT_USED, 0, 0, A3XX_RBBM_PERFCTR_UCHE_5_LO,
  240. A3XX_RBBM_PERFCTR_UCHE_5_HI, 26,
  241. A3XX_UCHE_PERFCOUNTER5_SELECT },
  242. };
  243. static struct adreno_perfcount_register a3xx_perfcounters_tp[] = {
  244. { KGSL_PERFCOUNTER_NOT_USED, 0, 0, A3XX_RBBM_PERFCTR_TP_0_LO,
  245. A3XX_RBBM_PERFCTR_TP_0_HI, 27, A3XX_TP_PERFCOUNTER0_SELECT },
  246. { KGSL_PERFCOUNTER_NOT_USED, 0, 0, A3XX_RBBM_PERFCTR_TP_1_LO,
  247. A3XX_RBBM_PERFCTR_TP_1_HI, 28, A3XX_TP_PERFCOUNTER1_SELECT },
  248. { KGSL_PERFCOUNTER_NOT_USED, 0, 0, A3XX_RBBM_PERFCTR_TP_2_LO,
  249. A3XX_RBBM_PERFCTR_TP_2_HI, 29, A3XX_TP_PERFCOUNTER2_SELECT },
  250. { KGSL_PERFCOUNTER_NOT_USED, 0, 0, A3XX_RBBM_PERFCTR_TP_3_LO,
  251. A3XX_RBBM_PERFCTR_TP_3_HI, 30, A3XX_TP_PERFCOUNTER3_SELECT },
  252. { KGSL_PERFCOUNTER_NOT_USED, 0, 0, A3XX_RBBM_PERFCTR_TP_4_LO,
  253. A3XX_RBBM_PERFCTR_TP_4_HI, 31, A3XX_TP_PERFCOUNTER4_SELECT },
  254. { KGSL_PERFCOUNTER_NOT_USED, 0, 0, A3XX_RBBM_PERFCTR_TP_5_LO,
  255. A3XX_RBBM_PERFCTR_TP_5_HI, 32, A3XX_TP_PERFCOUNTER5_SELECT },
  256. };
  257. static struct adreno_perfcount_register a3xx_perfcounters_sp[] = {
  258. { KGSL_PERFCOUNTER_NOT_USED, 0, 0, A3XX_RBBM_PERFCTR_SP_0_LO,
  259. A3XX_RBBM_PERFCTR_SP_0_HI, 33, A3XX_SP_PERFCOUNTER0_SELECT },
  260. { KGSL_PERFCOUNTER_NOT_USED, 0, 0, A3XX_RBBM_PERFCTR_SP_1_LO,
  261. A3XX_RBBM_PERFCTR_SP_1_HI, 34, A3XX_SP_PERFCOUNTER1_SELECT },
  262. { KGSL_PERFCOUNTER_NOT_USED, 0, 0, A3XX_RBBM_PERFCTR_SP_2_LO,
  263. A3XX_RBBM_PERFCTR_SP_2_HI, 35, A3XX_SP_PERFCOUNTER2_SELECT },
  264. { KGSL_PERFCOUNTER_NOT_USED, 0, 0, A3XX_RBBM_PERFCTR_SP_3_LO,
  265. A3XX_RBBM_PERFCTR_SP_3_HI, 36, A3XX_SP_PERFCOUNTER3_SELECT },
  266. { KGSL_PERFCOUNTER_NOT_USED, 0, 0, A3XX_RBBM_PERFCTR_SP_4_LO,
  267. A3XX_RBBM_PERFCTR_SP_4_HI, 37, A3XX_SP_PERFCOUNTER4_SELECT },
  268. { KGSL_PERFCOUNTER_NOT_USED, 0, 0, A3XX_RBBM_PERFCTR_SP_5_LO,
  269. A3XX_RBBM_PERFCTR_SP_5_HI, 38, A3XX_SP_PERFCOUNTER5_SELECT },
  270. { KGSL_PERFCOUNTER_NOT_USED, 0, 0, A3XX_RBBM_PERFCTR_SP_6_LO,
  271. A3XX_RBBM_PERFCTR_SP_6_HI, 39, A3XX_SP_PERFCOUNTER6_SELECT },
  272. { KGSL_PERFCOUNTER_NOT_USED, 0, 0, A3XX_RBBM_PERFCTR_SP_7_LO,
  273. A3XX_RBBM_PERFCTR_SP_7_HI, 40, A3XX_SP_PERFCOUNTER7_SELECT },
  274. };
  275. static struct adreno_perfcount_register a3xx_perfcounters_rb[] = {
  276. { KGSL_PERFCOUNTER_NOT_USED, 0, 0, A3XX_RBBM_PERFCTR_RB_0_LO,
  277. A3XX_RBBM_PERFCTR_RB_0_HI, 41, A3XX_RB_PERFCOUNTER0_SELECT },
  278. { KGSL_PERFCOUNTER_NOT_USED, 0, 0, A3XX_RBBM_PERFCTR_RB_1_LO,
  279. A3XX_RBBM_PERFCTR_RB_1_HI, 42, A3XX_RB_PERFCOUNTER1_SELECT },
  280. };
  281. static struct adreno_perfcount_register a3xx_perfcounters_pwr[] = {
  282. { KGSL_PERFCOUNTER_NOT_USED, 0, 0, A3XX_RBBM_PERFCTR_PWR_0_LO,
  283. A3XX_RBBM_PERFCTR_PWR_0_HI, -1, 0 },
  284. /*
  285. * A3XX_RBBM_PERFCTR_PWR_1_LO is used for frequency scaling and removed
  286. * from the pool of available counters
  287. */
  288. };
  289. static struct adreno_perfcount_register a3xx_perfcounters_vbif2[] = {
  290. { KGSL_PERFCOUNTER_NOT_USED, 0, 0, A3XX_VBIF2_PERF_CNT_LOW0,
  291. A3XX_VBIF2_PERF_CNT_HIGH0, -1, A3XX_VBIF2_PERF_CNT_SEL0 },
  292. { KGSL_PERFCOUNTER_NOT_USED, 0, 0, A3XX_VBIF2_PERF_CNT_LOW1,
  293. A3XX_VBIF2_PERF_CNT_HIGH1, -1, A3XX_VBIF2_PERF_CNT_SEL1 },
  294. { KGSL_PERFCOUNTER_NOT_USED, 0, 0, A3XX_VBIF2_PERF_CNT_LOW2,
  295. A3XX_VBIF2_PERF_CNT_HIGH2, -1, A3XX_VBIF2_PERF_CNT_SEL2 },
  296. { KGSL_PERFCOUNTER_NOT_USED, 0, 0, A3XX_VBIF2_PERF_CNT_LOW3,
  297. A3XX_VBIF2_PERF_CNT_HIGH3, -1, A3XX_VBIF2_PERF_CNT_SEL3 },
  298. };
  299. /*
  300. * Placing EN register in select field since vbif perf counters
  301. * don't have select register to program
  302. */
  303. static struct adreno_perfcount_register a3xx_perfcounters_vbif2_pwr[] = {
  304. { KGSL_PERFCOUNTER_NOT_USED, 0,
  305. 0, A3XX_VBIF2_PERF_PWR_CNT_LOW0,
  306. A3XX_VBIF2_PERF_PWR_CNT_HIGH0, -1,
  307. A3XX_VBIF2_PERF_PWR_CNT_EN0 },
  308. { KGSL_PERFCOUNTER_NOT_USED, 0,
  309. 0, A3XX_VBIF2_PERF_PWR_CNT_LOW1,
  310. A3XX_VBIF2_PERF_PWR_CNT_HIGH1, -1,
  311. A3XX_VBIF2_PERF_PWR_CNT_EN1 },
  312. { KGSL_PERFCOUNTER_NOT_USED, 0,
  313. 0, A3XX_VBIF2_PERF_PWR_CNT_LOW2,
  314. A3XX_VBIF2_PERF_PWR_CNT_HIGH2, -1,
  315. A3XX_VBIF2_PERF_PWR_CNT_EN2 },
  316. };
  317. #define A3XX_PERFCOUNTER_GROUP(offset, name, enable, read, load) \
  318. ADRENO_PERFCOUNTER_GROUP(a3xx, offset, name, enable, read, load)
  319. #define A3XX_PERFCOUNTER_GROUP_FLAGS(offset, name, flags, enable, read, load) \
  320. ADRENO_PERFCOUNTER_GROUP_FLAGS(a3xx, offset, name, flags, enable, read, load)
  321. #define A3XX_REGULAR_PERFCOUNTER_GROUP(offset, name) \
  322. A3XX_PERFCOUNTER_GROUP(offset, name, a3xx_counter_enable,\
  323. a3xx_counter_read, a3xx_counter_load)
  324. static const struct adreno_perfcount_group
  325. a3xx_perfcounter_groups[KGSL_PERFCOUNTER_GROUP_MAX] = {
  326. A3XX_REGULAR_PERFCOUNTER_GROUP(CP, cp),
  327. A3XX_REGULAR_PERFCOUNTER_GROUP(RBBM, rbbm),
  328. A3XX_REGULAR_PERFCOUNTER_GROUP(PC, pc),
  329. A3XX_REGULAR_PERFCOUNTER_GROUP(VFD, vfd),
  330. A3XX_REGULAR_PERFCOUNTER_GROUP(HLSQ, hlsq),
  331. A3XX_REGULAR_PERFCOUNTER_GROUP(VPC, vpc),
  332. A3XX_REGULAR_PERFCOUNTER_GROUP(TSE, tse),
  333. A3XX_REGULAR_PERFCOUNTER_GROUP(RAS, ras),
  334. A3XX_REGULAR_PERFCOUNTER_GROUP(UCHE, uche),
  335. A3XX_REGULAR_PERFCOUNTER_GROUP(TP, tp),
  336. A3XX_REGULAR_PERFCOUNTER_GROUP(SP, sp),
  337. A3XX_REGULAR_PERFCOUNTER_GROUP(RB, rb),
  338. A3XX_PERFCOUNTER_GROUP_FLAGS(PWR, pwr,
  339. ADRENO_PERFCOUNTER_GROUP_FIXED,
  340. a3xx_counter_pwr_enable, a3xx_counter_pwr_read, NULL),
  341. A3XX_PERFCOUNTER_GROUP(VBIF, vbif2,
  342. a3xx_counter_vbif_enable, a3xx_counter_vbif_read, NULL),
  343. A3XX_PERFCOUNTER_GROUP_FLAGS(VBIF_PWR, vbif2_pwr,
  344. ADRENO_PERFCOUNTER_GROUP_FIXED,
  345. a3xx_counter_vbif_pwr_enable, a3xx_counter_vbif_pwr_read,
  346. NULL),
  347. };
  348. const struct adreno_perfcounters adreno_a3xx_perfcounters = {
  349. a3xx_perfcounter_groups,
  350. ARRAY_SIZE(a3xx_perfcounter_groups),
  351. };