mali_kbase_hw.c 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260
  1. /*
  2. *
  3. * (C) COPYRIGHT 2012-2016 ARM Limited. All rights reserved.
  4. *
  5. * This program is free software and is provided to you under the terms of the
  6. * GNU General Public License version 2 as published by the Free Software
  7. * Foundation, and any use by you of this program is subject to the terms
  8. * of such GNU licence.
  9. *
  10. * A copy of the licence is included with the program, and can also be obtained
  11. * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
  12. * Boston, MA 02110-1301, USA.
  13. *
  14. */
  15. /*
  16. * Run-time work-arounds helpers
  17. */
  18. #include <mali_base_hwconfig_features.h>
  19. #include <mali_base_hwconfig_issues.h>
  20. #include <mali_midg_regmap.h>
  21. #include "mali_kbase.h"
  22. #include "mali_kbase_hw.h"
  23. void kbase_hw_set_features_mask(struct kbase_device *kbdev)
  24. {
  25. const enum base_hw_feature *features;
  26. u32 gpu_id;
  27. u32 product_id;
  28. gpu_id = kbdev->gpu_props.props.raw_props.gpu_id;
  29. product_id = gpu_id & GPU_ID_VERSION_PRODUCT_ID;
  30. product_id >>= GPU_ID_VERSION_PRODUCT_ID_SHIFT;
  31. if (GPU_ID_IS_NEW_FORMAT(product_id)) {
  32. switch (gpu_id & GPU_ID2_PRODUCT_MODEL) {
  33. case GPU_ID2_PRODUCT_TMIX:
  34. features = base_hw_features_tMIx;
  35. break;
  36. default:
  37. features = base_hw_features_generic;
  38. break;
  39. }
  40. } else {
  41. switch (product_id) {
  42. case GPU_ID_PI_TFRX:
  43. /* FALLTHROUGH */
  44. case GPU_ID_PI_T86X:
  45. features = base_hw_features_tFxx;
  46. break;
  47. case GPU_ID_PI_T83X:
  48. features = base_hw_features_t83x;
  49. break;
  50. case GPU_ID_PI_T82X:
  51. features = base_hw_features_t82x;
  52. break;
  53. case GPU_ID_PI_T76X:
  54. features = base_hw_features_t76x;
  55. break;
  56. case GPU_ID_PI_T72X:
  57. features = base_hw_features_t72x;
  58. break;
  59. case GPU_ID_PI_T62X:
  60. features = base_hw_features_t62x;
  61. break;
  62. case GPU_ID_PI_T60X:
  63. features = base_hw_features_t60x;
  64. break;
  65. default:
  66. features = base_hw_features_generic;
  67. break;
  68. }
  69. }
  70. for (; *features != BASE_HW_FEATURE_END; features++)
  71. set_bit(*features, &kbdev->hw_features_mask[0]);
  72. }
  73. int kbase_hw_set_issues_mask(struct kbase_device *kbdev)
  74. {
  75. const enum base_hw_issue *issues;
  76. u32 gpu_id;
  77. u32 product_id;
  78. u32 impl_tech;
  79. gpu_id = kbdev->gpu_props.props.raw_props.gpu_id;
  80. product_id = gpu_id & GPU_ID_VERSION_PRODUCT_ID;
  81. product_id >>= GPU_ID_VERSION_PRODUCT_ID_SHIFT;
  82. impl_tech = kbdev->gpu_props.props.thread_props.impl_tech;
  83. if (impl_tech != IMPLEMENTATION_MODEL) {
  84. if (GPU_ID_IS_NEW_FORMAT(product_id)) {
  85. switch (gpu_id) {
  86. case GPU_ID2_MAKE(6, 0, 10, 0, 0, 0, 1):
  87. issues = base_hw_issues_tMIx_r0p0_05dev0;
  88. break;
  89. case GPU_ID2_MAKE(6, 0, 10, 0, 0, 0, 2):
  90. issues = base_hw_issues_tMIx_r0p0;
  91. break;
  92. default:
  93. if ((gpu_id & GPU_ID2_PRODUCT_MODEL) ==
  94. GPU_ID2_PRODUCT_TMIX) {
  95. issues = base_hw_issues_tMIx_r0p0;
  96. } else {
  97. dev_err(kbdev->dev,
  98. "Unknown GPU ID %x", gpu_id);
  99. return -EINVAL;
  100. }
  101. }
  102. } else {
  103. switch (gpu_id) {
  104. case GPU_ID_MAKE(GPU_ID_PI_T60X, 0, 0, GPU_ID_S_15DEV0):
  105. issues = base_hw_issues_t60x_r0p0_15dev0;
  106. break;
  107. case GPU_ID_MAKE(GPU_ID_PI_T60X, 0, 0, GPU_ID_S_EAC):
  108. issues = base_hw_issues_t60x_r0p0_eac;
  109. break;
  110. case GPU_ID_MAKE(GPU_ID_PI_T60X, 0, 1, 0):
  111. issues = base_hw_issues_t60x_r0p1;
  112. break;
  113. case GPU_ID_MAKE(GPU_ID_PI_T62X, 0, 1, 0):
  114. issues = base_hw_issues_t62x_r0p1;
  115. break;
  116. case GPU_ID_MAKE(GPU_ID_PI_T62X, 1, 0, 0):
  117. case GPU_ID_MAKE(GPU_ID_PI_T62X, 1, 0, 1):
  118. issues = base_hw_issues_t62x_r1p0;
  119. break;
  120. case GPU_ID_MAKE(GPU_ID_PI_T62X, 1, 1, 0):
  121. issues = base_hw_issues_t62x_r1p1;
  122. break;
  123. case GPU_ID_MAKE(GPU_ID_PI_T76X, 0, 0, 1):
  124. issues = base_hw_issues_t76x_r0p0;
  125. break;
  126. case GPU_ID_MAKE(GPU_ID_PI_T76X, 0, 1, 1):
  127. issues = base_hw_issues_t76x_r0p1;
  128. break;
  129. case GPU_ID_MAKE(GPU_ID_PI_T76X, 0, 1, 9):
  130. issues = base_hw_issues_t76x_r0p1_50rel0;
  131. break;
  132. case GPU_ID_MAKE(GPU_ID_PI_T76X, 0, 2, 1):
  133. issues = base_hw_issues_t76x_r0p2;
  134. break;
  135. case GPU_ID_MAKE(GPU_ID_PI_T76X, 0, 3, 1):
  136. issues = base_hw_issues_t76x_r0p3;
  137. break;
  138. case GPU_ID_MAKE(GPU_ID_PI_T76X, 1, 0, 0):
  139. issues = base_hw_issues_t76x_r1p0;
  140. break;
  141. case GPU_ID_MAKE(GPU_ID_PI_T72X, 0, 0, 0):
  142. case GPU_ID_MAKE(GPU_ID_PI_T72X, 0, 0, 1):
  143. case GPU_ID_MAKE(GPU_ID_PI_T72X, 0, 0, 2):
  144. issues = base_hw_issues_t72x_r0p0;
  145. break;
  146. case GPU_ID_MAKE(GPU_ID_PI_T72X, 1, 0, 0):
  147. issues = base_hw_issues_t72x_r1p0;
  148. break;
  149. case GPU_ID_MAKE(GPU_ID_PI_T72X, 1, 1, 0):
  150. issues = base_hw_issues_t72x_r1p1;
  151. break;
  152. case GPU_ID_MAKE(GPU_ID_PI_TFRX, 0, 1, 2):
  153. issues = base_hw_issues_tFRx_r0p1;
  154. break;
  155. case GPU_ID_MAKE(GPU_ID_PI_TFRX, 0, 2, 0):
  156. issues = base_hw_issues_tFRx_r0p2;
  157. break;
  158. case GPU_ID_MAKE(GPU_ID_PI_TFRX, 1, 0, 0):
  159. case GPU_ID_MAKE(GPU_ID_PI_TFRX, 1, 0, 8):
  160. issues = base_hw_issues_tFRx_r1p0;
  161. break;
  162. case GPU_ID_MAKE(GPU_ID_PI_TFRX, 2, 0, 0):
  163. issues = base_hw_issues_tFRx_r2p0;
  164. break;
  165. case GPU_ID_MAKE(GPU_ID_PI_T86X, 0, 2, 0):
  166. issues = base_hw_issues_t86x_r0p2;
  167. break;
  168. case GPU_ID_MAKE(GPU_ID_PI_T86X, 1, 0, 0):
  169. case GPU_ID_MAKE(GPU_ID_PI_T86X, 1, 0, 8):
  170. issues = base_hw_issues_t86x_r1p0;
  171. break;
  172. case GPU_ID_MAKE(GPU_ID_PI_T86X, 2, 0, 0):
  173. issues = base_hw_issues_t86x_r2p0;
  174. break;
  175. case GPU_ID_MAKE(GPU_ID_PI_T83X, 0, 1, 0):
  176. issues = base_hw_issues_t83x_r0p1;
  177. break;
  178. case GPU_ID_MAKE(GPU_ID_PI_T83X, 1, 0, 0):
  179. case GPU_ID_MAKE(GPU_ID_PI_T83X, 1, 0, 8):
  180. issues = base_hw_issues_t83x_r1p0;
  181. break;
  182. case GPU_ID_MAKE(GPU_ID_PI_T82X, 0, 0, 0):
  183. issues = base_hw_issues_t82x_r0p0;
  184. break;
  185. case GPU_ID_MAKE(GPU_ID_PI_T82X, 0, 1, 0):
  186. issues = base_hw_issues_t82x_r0p1;
  187. break;
  188. case GPU_ID_MAKE(GPU_ID_PI_T82X, 1, 0, 0):
  189. case GPU_ID_MAKE(GPU_ID_PI_T82X, 1, 0, 8):
  190. issues = base_hw_issues_t82x_r1p0;
  191. break;
  192. default:
  193. dev_err(kbdev->dev,
  194. "Unknown GPU ID %x", gpu_id);
  195. return -EINVAL;
  196. }
  197. }
  198. } else {
  199. /* Software model */
  200. if (GPU_ID_IS_NEW_FORMAT(product_id)) {
  201. switch (gpu_id & GPU_ID2_PRODUCT_MODEL) {
  202. case GPU_ID2_PRODUCT_TMIX:
  203. issues = base_hw_issues_model_tMIx;
  204. break;
  205. default:
  206. dev_err(kbdev->dev,
  207. "Unknown GPU ID %x", gpu_id);
  208. return -EINVAL;
  209. }
  210. } else {
  211. switch (product_id) {
  212. case GPU_ID_PI_T60X:
  213. issues = base_hw_issues_model_t60x;
  214. break;
  215. case GPU_ID_PI_T62X:
  216. issues = base_hw_issues_model_t62x;
  217. break;
  218. case GPU_ID_PI_T72X:
  219. issues = base_hw_issues_model_t72x;
  220. break;
  221. case GPU_ID_PI_T76X:
  222. issues = base_hw_issues_model_t76x;
  223. break;
  224. case GPU_ID_PI_TFRX:
  225. issues = base_hw_issues_model_tFRx;
  226. break;
  227. case GPU_ID_PI_T86X:
  228. issues = base_hw_issues_model_t86x;
  229. break;
  230. case GPU_ID_PI_T83X:
  231. issues = base_hw_issues_model_t83x;
  232. break;
  233. case GPU_ID_PI_T82X:
  234. issues = base_hw_issues_model_t82x;
  235. break;
  236. default:
  237. dev_err(kbdev->dev, "Unknown GPU ID %x",
  238. gpu_id);
  239. return -EINVAL;
  240. }
  241. }
  242. }
  243. dev_info(kbdev->dev, "GPU identified as 0x%04x r%dp%d status %d", (gpu_id & GPU_ID_VERSION_PRODUCT_ID) >> GPU_ID_VERSION_PRODUCT_ID_SHIFT, (gpu_id & GPU_ID_VERSION_MAJOR) >> GPU_ID_VERSION_MAJOR_SHIFT, (gpu_id & GPU_ID_VERSION_MINOR) >> GPU_ID_VERSION_MINOR_SHIFT, (gpu_id & GPU_ID_VERSION_STATUS) >> GPU_ID_VERSION_STATUS_SHIFT);
  244. for (; *issues != BASE_HW_ISSUE_END; issues++)
  245. set_bit(*issues, &kbdev->hw_issues_mask[0]);
  246. return 0;
  247. }