cik.c 39 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192
  1. /*
  2. * Copyright 2012 Advanced Micro Devices, Inc.
  3. *
  4. * Permission is hereby granted, free of charge, to any person obtaining a
  5. * copy of this software and associated documentation files (the "Software"),
  6. * to deal in the Software without restriction, including without limitation
  7. * the rights to use, copy, modify, merge, publish, distribute, sublicense,
  8. * and/or sell copies of the Software, and to permit persons to whom the
  9. * Software is furnished to do so, subject to the following conditions:
  10. *
  11. * The above copyright notice and this permission notice shall be included in
  12. * all copies or substantial portions of the Software.
  13. *
  14. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  15. * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  16. * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
  17. * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
  18. * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
  19. * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
  20. * OTHER DEALINGS IN THE SOFTWARE.
  21. *
  22. * Authors: Alex Deucher
  23. */
  24. #include <linux/firmware.h>
  25. #include <linux/platform_device.h>
  26. #include <linux/slab.h>
  27. #include <linux/module.h>
  28. #include "drmP.h"
  29. #include "radeon.h"
  30. #include "cikd.h"
  31. #include "atom.h"
  32. /*
  33. * Core functions
  34. */
  35. /**
  36. * cik_tiling_mode_table_init - init the hw tiling table
  37. *
  38. * @rdev: radeon_device pointer
  39. *
  40. * Starting with SI, the tiling setup is done globally in a
  41. * set of 32 tiling modes. Rather than selecting each set of
  42. * parameters per surface as on older asics, we just select
  43. * which index in the tiling table we want to use, and the
  44. * surface uses those parameters (CIK).
  45. */
  46. static void cik_tiling_mode_table_init(struct radeon_device *rdev)
  47. {
  48. const u32 num_tile_mode_states = 32;
  49. const u32 num_secondary_tile_mode_states = 16;
  50. u32 reg_offset, gb_tile_moden, split_equal_to_row_size;
  51. u32 num_pipe_configs;
  52. u32 num_rbs = rdev->config.cik.max_backends_per_se *
  53. rdev->config.cik.max_shader_engines;
  54. switch (rdev->config.cik.mem_row_size_in_kb) {
  55. case 1:
  56. split_equal_to_row_size = ADDR_SURF_TILE_SPLIT_1KB;
  57. break;
  58. case 2:
  59. default:
  60. split_equal_to_row_size = ADDR_SURF_TILE_SPLIT_2KB;
  61. break;
  62. case 4:
  63. split_equal_to_row_size = ADDR_SURF_TILE_SPLIT_4KB;
  64. break;
  65. }
  66. num_pipe_configs = rdev->config.cik.max_tile_pipes;
  67. if (num_pipe_configs > 8)
  68. num_pipe_configs = 8; /* ??? */
  69. if (num_pipe_configs == 8) {
  70. for (reg_offset = 0; reg_offset < num_tile_mode_states; reg_offset++) {
  71. switch (reg_offset) {
  72. case 0:
  73. gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
  74. MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
  75. PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
  76. TILE_SPLIT(ADDR_SURF_TILE_SPLIT_64B));
  77. break;
  78. case 1:
  79. gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
  80. MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
  81. PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
  82. TILE_SPLIT(ADDR_SURF_TILE_SPLIT_128B));
  83. break;
  84. case 2:
  85. gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
  86. MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
  87. PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
  88. TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B));
  89. break;
  90. case 3:
  91. gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
  92. MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
  93. PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
  94. TILE_SPLIT(ADDR_SURF_TILE_SPLIT_512B));
  95. break;
  96. case 4:
  97. gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
  98. MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
  99. PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
  100. TILE_SPLIT(split_equal_to_row_size));
  101. break;
  102. case 5:
  103. gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
  104. MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING));
  105. break;
  106. case 6:
  107. gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
  108. MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
  109. PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
  110. TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B));
  111. break;
  112. case 7:
  113. gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
  114. MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
  115. PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
  116. TILE_SPLIT(split_equal_to_row_size));
  117. break;
  118. case 8:
  119. gb_tile_moden = (ARRAY_MODE(ARRAY_LINEAR_ALIGNED) |
  120. PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16));
  121. break;
  122. case 9:
  123. gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
  124. MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING));
  125. break;
  126. case 10:
  127. gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
  128. MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING) |
  129. PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
  130. SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
  131. break;
  132. case 11:
  133. gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
  134. MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING) |
  135. PIPE_CONFIG(ADDR_SURF_P8_32x32_8x16) |
  136. SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
  137. break;
  138. case 12:
  139. gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
  140. MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING) |
  141. PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
  142. SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
  143. break;
  144. case 13:
  145. gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
  146. MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING));
  147. break;
  148. case 14:
  149. gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
  150. MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
  151. PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
  152. SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
  153. break;
  154. case 16:
  155. gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
  156. MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
  157. PIPE_CONFIG(ADDR_SURF_P8_32x32_8x16) |
  158. SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
  159. break;
  160. case 17:
  161. gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
  162. MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
  163. PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
  164. SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
  165. break;
  166. case 27:
  167. gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
  168. MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING));
  169. break;
  170. case 28:
  171. gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
  172. MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING) |
  173. PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
  174. SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
  175. break;
  176. case 29:
  177. gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
  178. MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING) |
  179. PIPE_CONFIG(ADDR_SURF_P8_32x32_8x16) |
  180. SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
  181. break;
  182. case 30:
  183. gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
  184. MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING) |
  185. PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
  186. SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
  187. break;
  188. default:
  189. gb_tile_moden = 0;
  190. break;
  191. }
  192. WREG32(GB_TILE_MODE0 + (reg_offset * 4), gb_tile_moden);
  193. }
  194. for (reg_offset = 0; reg_offset < num_secondary_tile_mode_states; reg_offset++) {
  195. switch (reg_offset) {
  196. case 0:
  197. gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
  198. BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
  199. MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
  200. NUM_BANKS(ADDR_SURF_16_BANK));
  201. break;
  202. case 1:
  203. gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
  204. BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) |
  205. MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
  206. NUM_BANKS(ADDR_SURF_16_BANK));
  207. break;
  208. case 2:
  209. gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
  210. BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
  211. MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
  212. NUM_BANKS(ADDR_SURF_16_BANK));
  213. break;
  214. case 3:
  215. gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
  216. BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
  217. MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
  218. NUM_BANKS(ADDR_SURF_16_BANK));
  219. break;
  220. case 4:
  221. gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
  222. BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
  223. MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1) |
  224. NUM_BANKS(ADDR_SURF_8_BANK));
  225. break;
  226. case 5:
  227. gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
  228. BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
  229. MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1) |
  230. NUM_BANKS(ADDR_SURF_4_BANK));
  231. break;
  232. case 6:
  233. gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
  234. BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
  235. MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1) |
  236. NUM_BANKS(ADDR_SURF_2_BANK));
  237. break;
  238. case 8:
  239. gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
  240. BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_8) |
  241. MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
  242. NUM_BANKS(ADDR_SURF_16_BANK));
  243. break;
  244. case 9:
  245. gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
  246. BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
  247. MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
  248. NUM_BANKS(ADDR_SURF_16_BANK));
  249. break;
  250. case 10:
  251. gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
  252. BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) |
  253. MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
  254. NUM_BANKS(ADDR_SURF_16_BANK));
  255. break;
  256. case 11:
  257. gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
  258. BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
  259. MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
  260. NUM_BANKS(ADDR_SURF_16_BANK));
  261. break;
  262. case 12:
  263. gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
  264. BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
  265. MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1) |
  266. NUM_BANKS(ADDR_SURF_8_BANK));
  267. break;
  268. case 13:
  269. gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
  270. BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
  271. MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1) |
  272. NUM_BANKS(ADDR_SURF_4_BANK));
  273. break;
  274. case 14:
  275. gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
  276. BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
  277. MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1) |
  278. NUM_BANKS(ADDR_SURF_2_BANK));
  279. break;
  280. default:
  281. gb_tile_moden = 0;
  282. break;
  283. }
  284. WREG32(GB_MACROTILE_MODE0 + (reg_offset * 4), gb_tile_moden);
  285. }
  286. } else if (num_pipe_configs == 4) {
  287. if (num_rbs == 4) {
  288. for (reg_offset = 0; reg_offset < num_tile_mode_states; reg_offset++) {
  289. switch (reg_offset) {
  290. case 0:
  291. gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
  292. MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
  293. PIPE_CONFIG(ADDR_SURF_P4_16x16) |
  294. TILE_SPLIT(ADDR_SURF_TILE_SPLIT_64B));
  295. break;
  296. case 1:
  297. gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
  298. MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
  299. PIPE_CONFIG(ADDR_SURF_P4_16x16) |
  300. TILE_SPLIT(ADDR_SURF_TILE_SPLIT_128B));
  301. break;
  302. case 2:
  303. gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
  304. MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
  305. PIPE_CONFIG(ADDR_SURF_P4_16x16) |
  306. TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B));
  307. break;
  308. case 3:
  309. gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
  310. MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
  311. PIPE_CONFIG(ADDR_SURF_P4_16x16) |
  312. TILE_SPLIT(ADDR_SURF_TILE_SPLIT_512B));
  313. break;
  314. case 4:
  315. gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
  316. MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
  317. PIPE_CONFIG(ADDR_SURF_P4_16x16) |
  318. TILE_SPLIT(split_equal_to_row_size));
  319. break;
  320. case 5:
  321. gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
  322. MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING));
  323. break;
  324. case 6:
  325. gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
  326. MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
  327. PIPE_CONFIG(ADDR_SURF_P4_16x16) |
  328. TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B));
  329. break;
  330. case 7:
  331. gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
  332. MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
  333. PIPE_CONFIG(ADDR_SURF_P4_16x16) |
  334. TILE_SPLIT(split_equal_to_row_size));
  335. break;
  336. case 8:
  337. gb_tile_moden = (ARRAY_MODE(ARRAY_LINEAR_ALIGNED) |
  338. PIPE_CONFIG(ADDR_SURF_P4_16x16));
  339. break;
  340. case 9:
  341. gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
  342. MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING));
  343. break;
  344. case 10:
  345. gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
  346. MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING) |
  347. PIPE_CONFIG(ADDR_SURF_P4_16x16) |
  348. SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
  349. break;
  350. case 11:
  351. gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
  352. MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING) |
  353. PIPE_CONFIG(ADDR_SURF_P4_8x16) |
  354. SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
  355. break;
  356. case 12:
  357. gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
  358. MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING) |
  359. PIPE_CONFIG(ADDR_SURF_P4_16x16) |
  360. SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
  361. break;
  362. case 13:
  363. gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
  364. MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING));
  365. break;
  366. case 14:
  367. gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
  368. MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
  369. PIPE_CONFIG(ADDR_SURF_P4_16x16) |
  370. SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
  371. break;
  372. case 16:
  373. gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
  374. MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
  375. PIPE_CONFIG(ADDR_SURF_P4_8x16) |
  376. SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
  377. break;
  378. case 17:
  379. gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
  380. MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
  381. PIPE_CONFIG(ADDR_SURF_P4_16x16) |
  382. SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
  383. break;
  384. case 27:
  385. gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
  386. MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING));
  387. break;
  388. case 28:
  389. gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
  390. MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING) |
  391. PIPE_CONFIG(ADDR_SURF_P4_16x16) |
  392. SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
  393. break;
  394. case 29:
  395. gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
  396. MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING) |
  397. PIPE_CONFIG(ADDR_SURF_P4_8x16) |
  398. SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
  399. break;
  400. case 30:
  401. gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
  402. MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING) |
  403. PIPE_CONFIG(ADDR_SURF_P4_16x16) |
  404. SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
  405. break;
  406. default:
  407. gb_tile_moden = 0;
  408. break;
  409. }
  410. WREG32(GB_TILE_MODE0 + (reg_offset * 4), gb_tile_moden);
  411. }
  412. } else if (num_rbs < 4) {
  413. for (reg_offset = 0; reg_offset < num_tile_mode_states; reg_offset++) {
  414. switch (reg_offset) {
  415. case 0:
  416. gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
  417. MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
  418. PIPE_CONFIG(ADDR_SURF_P4_8x16) |
  419. TILE_SPLIT(ADDR_SURF_TILE_SPLIT_64B));
  420. break;
  421. case 1:
  422. gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
  423. MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
  424. PIPE_CONFIG(ADDR_SURF_P4_8x16) |
  425. TILE_SPLIT(ADDR_SURF_TILE_SPLIT_128B));
  426. break;
  427. case 2:
  428. gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
  429. MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
  430. PIPE_CONFIG(ADDR_SURF_P4_8x16) |
  431. TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B));
  432. break;
  433. case 3:
  434. gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
  435. MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
  436. PIPE_CONFIG(ADDR_SURF_P4_8x16) |
  437. TILE_SPLIT(ADDR_SURF_TILE_SPLIT_512B));
  438. break;
  439. case 4:
  440. gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
  441. MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
  442. PIPE_CONFIG(ADDR_SURF_P4_8x16) |
  443. TILE_SPLIT(split_equal_to_row_size));
  444. break;
  445. case 5:
  446. gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
  447. MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING));
  448. break;
  449. case 6:
  450. gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
  451. MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
  452. PIPE_CONFIG(ADDR_SURF_P4_8x16) |
  453. TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B));
  454. break;
  455. case 7:
  456. gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
  457. MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
  458. PIPE_CONFIG(ADDR_SURF_P4_8x16) |
  459. TILE_SPLIT(split_equal_to_row_size));
  460. break;
  461. case 8:
  462. gb_tile_moden = (ARRAY_MODE(ARRAY_LINEAR_ALIGNED) |
  463. PIPE_CONFIG(ADDR_SURF_P4_8x16));
  464. break;
  465. case 9:
  466. gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
  467. MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING));
  468. break;
  469. case 10:
  470. gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
  471. MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING) |
  472. PIPE_CONFIG(ADDR_SURF_P4_8x16) |
  473. SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
  474. break;
  475. case 11:
  476. gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
  477. MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING) |
  478. PIPE_CONFIG(ADDR_SURF_P4_8x16) |
  479. SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
  480. break;
  481. case 12:
  482. gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
  483. MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING) |
  484. PIPE_CONFIG(ADDR_SURF_P4_8x16) |
  485. SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
  486. break;
  487. case 13:
  488. gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
  489. MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING));
  490. break;
  491. case 14:
  492. gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
  493. MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
  494. PIPE_CONFIG(ADDR_SURF_P4_8x16) |
  495. SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
  496. break;
  497. case 16:
  498. gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
  499. MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
  500. PIPE_CONFIG(ADDR_SURF_P4_8x16) |
  501. SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
  502. break;
  503. case 17:
  504. gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
  505. MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
  506. PIPE_CONFIG(ADDR_SURF_P4_8x16) |
  507. SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
  508. break;
  509. case 27:
  510. gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
  511. MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING));
  512. break;
  513. case 28:
  514. gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
  515. MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING) |
  516. PIPE_CONFIG(ADDR_SURF_P4_8x16) |
  517. SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
  518. break;
  519. case 29:
  520. gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
  521. MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING) |
  522. PIPE_CONFIG(ADDR_SURF_P4_8x16) |
  523. SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
  524. break;
  525. case 30:
  526. gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
  527. MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING) |
  528. PIPE_CONFIG(ADDR_SURF_P4_8x16) |
  529. SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
  530. break;
  531. default:
  532. gb_tile_moden = 0;
  533. break;
  534. }
  535. WREG32(GB_TILE_MODE0 + (reg_offset * 4), gb_tile_moden);
  536. }
  537. }
  538. for (reg_offset = 0; reg_offset < num_secondary_tile_mode_states; reg_offset++) {
  539. switch (reg_offset) {
  540. case 0:
  541. gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
  542. BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
  543. MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
  544. NUM_BANKS(ADDR_SURF_16_BANK));
  545. break;
  546. case 1:
  547. gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
  548. BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) |
  549. MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
  550. NUM_BANKS(ADDR_SURF_16_BANK));
  551. break;
  552. case 2:
  553. gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
  554. BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
  555. MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
  556. NUM_BANKS(ADDR_SURF_16_BANK));
  557. break;
  558. case 3:
  559. gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
  560. BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
  561. MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
  562. NUM_BANKS(ADDR_SURF_16_BANK));
  563. break;
  564. case 4:
  565. gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
  566. BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
  567. MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
  568. NUM_BANKS(ADDR_SURF_16_BANK));
  569. break;
  570. case 5:
  571. gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
  572. BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
  573. MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
  574. NUM_BANKS(ADDR_SURF_8_BANK));
  575. break;
  576. case 6:
  577. gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
  578. BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
  579. MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1) |
  580. NUM_BANKS(ADDR_SURF_4_BANK));
  581. break;
  582. case 8:
  583. gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_2) |
  584. BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_8) |
  585. MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
  586. NUM_BANKS(ADDR_SURF_16_BANK));
  587. break;
  588. case 9:
  589. gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_2) |
  590. BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
  591. MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
  592. NUM_BANKS(ADDR_SURF_16_BANK));
  593. break;
  594. case 10:
  595. gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
  596. BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
  597. MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
  598. NUM_BANKS(ADDR_SURF_16_BANK));
  599. break;
  600. case 11:
  601. gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
  602. BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) |
  603. MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
  604. NUM_BANKS(ADDR_SURF_16_BANK));
  605. break;
  606. case 12:
  607. gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
  608. BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
  609. MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
  610. NUM_BANKS(ADDR_SURF_16_BANK));
  611. break;
  612. case 13:
  613. gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
  614. BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
  615. MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
  616. NUM_BANKS(ADDR_SURF_8_BANK));
  617. break;
  618. case 14:
  619. gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
  620. BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
  621. MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1) |
  622. NUM_BANKS(ADDR_SURF_4_BANK));
  623. break;
  624. default:
  625. gb_tile_moden = 0;
  626. break;
  627. }
  628. WREG32(GB_MACROTILE_MODE0 + (reg_offset * 4), gb_tile_moden);
  629. }
  630. } else if (num_pipe_configs == 2) {
  631. for (reg_offset = 0; reg_offset < num_tile_mode_states; reg_offset++) {
  632. switch (reg_offset) {
  633. case 0:
  634. gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
  635. MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
  636. PIPE_CONFIG(ADDR_SURF_P2) |
  637. TILE_SPLIT(ADDR_SURF_TILE_SPLIT_64B));
  638. break;
  639. case 1:
  640. gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
  641. MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
  642. PIPE_CONFIG(ADDR_SURF_P2) |
  643. TILE_SPLIT(ADDR_SURF_TILE_SPLIT_128B));
  644. break;
  645. case 2:
  646. gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
  647. MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
  648. PIPE_CONFIG(ADDR_SURF_P2) |
  649. TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B));
  650. break;
  651. case 3:
  652. gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
  653. MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
  654. PIPE_CONFIG(ADDR_SURF_P2) |
  655. TILE_SPLIT(ADDR_SURF_TILE_SPLIT_512B));
  656. break;
  657. case 4:
  658. gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
  659. MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
  660. PIPE_CONFIG(ADDR_SURF_P2) |
  661. TILE_SPLIT(split_equal_to_row_size));
  662. break;
  663. case 5:
  664. gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
  665. MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING));
  666. break;
  667. case 6:
  668. gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
  669. MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
  670. PIPE_CONFIG(ADDR_SURF_P2) |
  671. TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B));
  672. break;
  673. case 7:
  674. gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
  675. MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
  676. PIPE_CONFIG(ADDR_SURF_P2) |
  677. TILE_SPLIT(split_equal_to_row_size));
  678. break;
  679. case 8:
  680. gb_tile_moden = ARRAY_MODE(ARRAY_LINEAR_ALIGNED);
  681. break;
  682. case 9:
  683. gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
  684. MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING));
  685. break;
  686. case 10:
  687. gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
  688. MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING) |
  689. PIPE_CONFIG(ADDR_SURF_P2) |
  690. SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
  691. break;
  692. case 11:
  693. gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
  694. MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING) |
  695. PIPE_CONFIG(ADDR_SURF_P2) |
  696. SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
  697. break;
  698. case 12:
  699. gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
  700. MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING) |
  701. PIPE_CONFIG(ADDR_SURF_P2) |
  702. SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
  703. break;
  704. case 13:
  705. gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
  706. MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING));
  707. break;
  708. case 14:
  709. gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
  710. MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
  711. PIPE_CONFIG(ADDR_SURF_P2) |
  712. SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
  713. break;
  714. case 16:
  715. gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
  716. MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
  717. PIPE_CONFIG(ADDR_SURF_P2) |
  718. SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
  719. break;
  720. case 17:
  721. gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
  722. MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
  723. PIPE_CONFIG(ADDR_SURF_P2) |
  724. SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
  725. break;
  726. case 27:
  727. gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
  728. MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING));
  729. break;
  730. case 28:
  731. gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
  732. MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING) |
  733. PIPE_CONFIG(ADDR_SURF_P2) |
  734. SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
  735. break;
  736. case 29:
  737. gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
  738. MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING) |
  739. PIPE_CONFIG(ADDR_SURF_P2) |
  740. SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
  741. break;
  742. case 30:
  743. gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
  744. MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING) |
  745. PIPE_CONFIG(ADDR_SURF_P2) |
  746. SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
  747. break;
  748. default:
  749. gb_tile_moden = 0;
  750. break;
  751. }
  752. WREG32(GB_TILE_MODE0 + (reg_offset * 4), gb_tile_moden);
  753. }
  754. for (reg_offset = 0; reg_offset < num_secondary_tile_mode_states; reg_offset++) {
  755. switch (reg_offset) {
  756. case 0:
  757. gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_2) |
  758. BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
  759. MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
  760. NUM_BANKS(ADDR_SURF_16_BANK));
  761. break;
  762. case 1:
  763. gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_2) |
  764. BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) |
  765. MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
  766. NUM_BANKS(ADDR_SURF_16_BANK));
  767. break;
  768. case 2:
  769. gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
  770. BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) |
  771. MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
  772. NUM_BANKS(ADDR_SURF_16_BANK));
  773. break;
  774. case 3:
  775. gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
  776. BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
  777. MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
  778. NUM_BANKS(ADDR_SURF_16_BANK));
  779. break;
  780. case 4:
  781. gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
  782. BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
  783. MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
  784. NUM_BANKS(ADDR_SURF_16_BANK));
  785. break;
  786. case 5:
  787. gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
  788. BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
  789. MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
  790. NUM_BANKS(ADDR_SURF_16_BANK));
  791. break;
  792. case 6:
  793. gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
  794. BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
  795. MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
  796. NUM_BANKS(ADDR_SURF_8_BANK));
  797. break;
  798. case 8:
  799. gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_4) |
  800. BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_8) |
  801. MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
  802. NUM_BANKS(ADDR_SURF_16_BANK));
  803. break;
  804. case 9:
  805. gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_4) |
  806. BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
  807. MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
  808. NUM_BANKS(ADDR_SURF_16_BANK));
  809. break;
  810. case 10:
  811. gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_2) |
  812. BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
  813. MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
  814. NUM_BANKS(ADDR_SURF_16_BANK));
  815. break;
  816. case 11:
  817. gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_2) |
  818. BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) |
  819. MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
  820. NUM_BANKS(ADDR_SURF_16_BANK));
  821. break;
  822. case 12:
  823. gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
  824. BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) |
  825. MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
  826. NUM_BANKS(ADDR_SURF_16_BANK));
  827. break;
  828. case 13:
  829. gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
  830. BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
  831. MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
  832. NUM_BANKS(ADDR_SURF_16_BANK));
  833. break;
  834. case 14:
  835. gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
  836. BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
  837. MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
  838. NUM_BANKS(ADDR_SURF_8_BANK));
  839. break;
  840. default:
  841. gb_tile_moden = 0;
  842. break;
  843. }
  844. WREG32(GB_MACROTILE_MODE0 + (reg_offset * 4), gb_tile_moden);
  845. }
  846. } else
  847. DRM_ERROR("unknown num pipe config: 0x%x\n", num_pipe_configs);
  848. }
  849. /**
  850. * cik_select_se_sh - select which SE, SH to address
  851. *
  852. * @rdev: radeon_device pointer
  853. * @se_num: shader engine to address
  854. * @sh_num: sh block to address
  855. *
  856. * Select which SE, SH combinations to address. Certain
  857. * registers are instanced per SE or SH. 0xffffffff means
  858. * broadcast to all SEs or SHs (CIK).
  859. */
  860. static void cik_select_se_sh(struct radeon_device *rdev,
  861. u32 se_num, u32 sh_num)
  862. {
  863. u32 data = INSTANCE_BROADCAST_WRITES;
  864. if ((se_num == 0xffffffff) && (sh_num == 0xffffffff))
  865. data = SH_BROADCAST_WRITES | SE_BROADCAST_WRITES;
  866. else if (se_num == 0xffffffff)
  867. data |= SE_BROADCAST_WRITES | SH_INDEX(sh_num);
  868. else if (sh_num == 0xffffffff)
  869. data |= SH_BROADCAST_WRITES | SE_INDEX(se_num);
  870. else
  871. data |= SH_INDEX(sh_num) | SE_INDEX(se_num);
  872. WREG32(GRBM_GFX_INDEX, data);
  873. }
  874. /**
  875. * cik_create_bitmask - create a bitmask
  876. *
  877. * @bit_width: length of the mask
  878. *
  879. * create a variable length bit mask (CIK).
  880. * Returns the bitmask.
  881. */
  882. static u32 cik_create_bitmask(u32 bit_width)
  883. {
  884. u32 i, mask = 0;
  885. for (i = 0; i < bit_width; i++) {
  886. mask <<= 1;
  887. mask |= 1;
  888. }
  889. return mask;
  890. }
  891. /**
  892. * cik_select_se_sh - select which SE, SH to address
  893. *
  894. * @rdev: radeon_device pointer
  895. * @max_rb_num: max RBs (render backends) for the asic
  896. * @se_num: number of SEs (shader engines) for the asic
  897. * @sh_per_se: number of SH blocks per SE for the asic
  898. *
  899. * Calculates the bitmask of disabled RBs (CIK).
  900. * Returns the disabled RB bitmask.
  901. */
  902. static u32 cik_get_rb_disabled(struct radeon_device *rdev,
  903. u32 max_rb_num, u32 se_num,
  904. u32 sh_per_se)
  905. {
  906. u32 data, mask;
  907. data = RREG32(CC_RB_BACKEND_DISABLE);
  908. if (data & 1)
  909. data &= BACKEND_DISABLE_MASK;
  910. else
  911. data = 0;
  912. data |= RREG32(GC_USER_RB_BACKEND_DISABLE);
  913. data >>= BACKEND_DISABLE_SHIFT;
  914. mask = cik_create_bitmask(max_rb_num / se_num / sh_per_se);
  915. return data & mask;
  916. }
  917. /**
  918. * cik_setup_rb - setup the RBs on the asic
  919. *
  920. * @rdev: radeon_device pointer
  921. * @se_num: number of SEs (shader engines) for the asic
  922. * @sh_per_se: number of SH blocks per SE for the asic
  923. * @max_rb_num: max RBs (render backends) for the asic
  924. *
  925. * Configures per-SE/SH RB registers (CIK).
  926. */
  927. static void cik_setup_rb(struct radeon_device *rdev,
  928. u32 se_num, u32 sh_per_se,
  929. u32 max_rb_num)
  930. {
  931. int i, j;
  932. u32 data, mask;
  933. u32 disabled_rbs = 0;
  934. u32 enabled_rbs = 0;
  935. for (i = 0; i < se_num; i++) {
  936. for (j = 0; j < sh_per_se; j++) {
  937. cik_select_se_sh(rdev, i, j);
  938. data = cik_get_rb_disabled(rdev, max_rb_num, se_num, sh_per_se);
  939. disabled_rbs |= data << ((i * sh_per_se + j) * CIK_RB_BITMAP_WIDTH_PER_SH);
  940. }
  941. }
  942. cik_select_se_sh(rdev, 0xffffffff, 0xffffffff);
  943. mask = 1;
  944. for (i = 0; i < max_rb_num; i++) {
  945. if (!(disabled_rbs & mask))
  946. enabled_rbs |= mask;
  947. mask <<= 1;
  948. }
  949. for (i = 0; i < se_num; i++) {
  950. cik_select_se_sh(rdev, i, 0xffffffff);
  951. data = 0;
  952. for (j = 0; j < sh_per_se; j++) {
  953. switch (enabled_rbs & 3) {
  954. case 1:
  955. data |= (RASTER_CONFIG_RB_MAP_0 << (i * sh_per_se + j) * 2);
  956. break;
  957. case 2:
  958. data |= (RASTER_CONFIG_RB_MAP_3 << (i * sh_per_se + j) * 2);
  959. break;
  960. case 3:
  961. default:
  962. data |= (RASTER_CONFIG_RB_MAP_2 << (i * sh_per_se + j) * 2);
  963. break;
  964. }
  965. enabled_rbs >>= 2;
  966. }
  967. WREG32(PA_SC_RASTER_CONFIG, data);
  968. }
  969. cik_select_se_sh(rdev, 0xffffffff, 0xffffffff);
  970. }
  971. /**
  972. * cik_gpu_init - setup the 3D engine
  973. *
  974. * @rdev: radeon_device pointer
  975. *
  976. * Configures the 3D engine and tiling configuration
  977. * registers so that the 3D engine is usable.
  978. */
  979. static void cik_gpu_init(struct radeon_device *rdev)
  980. {
  981. u32 gb_addr_config = RREG32(GB_ADDR_CONFIG);
  982. u32 mc_shared_chmap, mc_arb_ramcfg;
  983. u32 hdp_host_path_cntl;
  984. u32 tmp;
  985. int i, j;
  986. switch (rdev->family) {
  987. case CHIP_BONAIRE:
  988. rdev->config.cik.max_shader_engines = 2;
  989. rdev->config.cik.max_tile_pipes = 4;
  990. rdev->config.cik.max_cu_per_sh = 7;
  991. rdev->config.cik.max_sh_per_se = 1;
  992. rdev->config.cik.max_backends_per_se = 2;
  993. rdev->config.cik.max_texture_channel_caches = 4;
  994. rdev->config.cik.max_gprs = 256;
  995. rdev->config.cik.max_gs_threads = 32;
  996. rdev->config.cik.max_hw_contexts = 8;
  997. rdev->config.cik.sc_prim_fifo_size_frontend = 0x20;
  998. rdev->config.cik.sc_prim_fifo_size_backend = 0x100;
  999. rdev->config.cik.sc_hiz_tile_fifo_size = 0x30;
  1000. rdev->config.cik.sc_earlyz_tile_fifo_size = 0x130;
  1001. gb_addr_config = BONAIRE_GB_ADDR_CONFIG_GOLDEN;
  1002. break;
  1003. case CHIP_KAVERI:
  1004. /* TODO */
  1005. break;
  1006. case CHIP_KABINI:
  1007. default:
  1008. rdev->config.cik.max_shader_engines = 1;
  1009. rdev->config.cik.max_tile_pipes = 2;
  1010. rdev->config.cik.max_cu_per_sh = 2;
  1011. rdev->config.cik.max_sh_per_se = 1;
  1012. rdev->config.cik.max_backends_per_se = 1;
  1013. rdev->config.cik.max_texture_channel_caches = 2;
  1014. rdev->config.cik.max_gprs = 256;
  1015. rdev->config.cik.max_gs_threads = 16;
  1016. rdev->config.cik.max_hw_contexts = 8;
  1017. rdev->config.cik.sc_prim_fifo_size_frontend = 0x20;
  1018. rdev->config.cik.sc_prim_fifo_size_backend = 0x100;
  1019. rdev->config.cik.sc_hiz_tile_fifo_size = 0x30;
  1020. rdev->config.cik.sc_earlyz_tile_fifo_size = 0x130;
  1021. gb_addr_config = BONAIRE_GB_ADDR_CONFIG_GOLDEN;
  1022. break;
  1023. }
  1024. /* Initialize HDP */
  1025. for (i = 0, j = 0; i < 32; i++, j += 0x18) {
  1026. WREG32((0x2c14 + j), 0x00000000);
  1027. WREG32((0x2c18 + j), 0x00000000);
  1028. WREG32((0x2c1c + j), 0x00000000);
  1029. WREG32((0x2c20 + j), 0x00000000);
  1030. WREG32((0x2c24 + j), 0x00000000);
  1031. }
  1032. WREG32(GRBM_CNTL, GRBM_READ_TIMEOUT(0xff));
  1033. WREG32(BIF_FB_EN, FB_READ_EN | FB_WRITE_EN);
  1034. mc_shared_chmap = RREG32(MC_SHARED_CHMAP);
  1035. mc_arb_ramcfg = RREG32(MC_ARB_RAMCFG);
  1036. rdev->config.cik.num_tile_pipes = rdev->config.cik.max_tile_pipes;
  1037. rdev->config.cik.mem_max_burst_length_bytes = 256;
  1038. tmp = (mc_arb_ramcfg & NOOFCOLS_MASK) >> NOOFCOLS_SHIFT;
  1039. rdev->config.cik.mem_row_size_in_kb = (4 * (1 << (8 + tmp))) / 1024;
  1040. if (rdev->config.cik.mem_row_size_in_kb > 4)
  1041. rdev->config.cik.mem_row_size_in_kb = 4;
  1042. /* XXX use MC settings? */
  1043. rdev->config.cik.shader_engine_tile_size = 32;
  1044. rdev->config.cik.num_gpus = 1;
  1045. rdev->config.cik.multi_gpu_tile_size = 64;
  1046. /* fix up row size */
  1047. gb_addr_config &= ~ROW_SIZE_MASK;
  1048. switch (rdev->config.cik.mem_row_size_in_kb) {
  1049. case 1:
  1050. default:
  1051. gb_addr_config |= ROW_SIZE(0);
  1052. break;
  1053. case 2:
  1054. gb_addr_config |= ROW_SIZE(1);
  1055. break;
  1056. case 4:
  1057. gb_addr_config |= ROW_SIZE(2);
  1058. break;
  1059. }
  1060. /* setup tiling info dword. gb_addr_config is not adequate since it does
  1061. * not have bank info, so create a custom tiling dword.
  1062. * bits 3:0 num_pipes
  1063. * bits 7:4 num_banks
  1064. * bits 11:8 group_size
  1065. * bits 15:12 row_size
  1066. */
  1067. rdev->config.cik.tile_config = 0;
  1068. switch (rdev->config.cik.num_tile_pipes) {
  1069. case 1:
  1070. rdev->config.cik.tile_config |= (0 << 0);
  1071. break;
  1072. case 2:
  1073. rdev->config.cik.tile_config |= (1 << 0);
  1074. break;
  1075. case 4:
  1076. rdev->config.cik.tile_config |= (2 << 0);
  1077. break;
  1078. case 8:
  1079. default:
  1080. /* XXX what about 12? */
  1081. rdev->config.cik.tile_config |= (3 << 0);
  1082. break;
  1083. }
  1084. if ((mc_arb_ramcfg & NOOFBANK_MASK) >> NOOFBANK_SHIFT)
  1085. rdev->config.cik.tile_config |= 1 << 4;
  1086. else
  1087. rdev->config.cik.tile_config |= 0 << 4;
  1088. rdev->config.cik.tile_config |=
  1089. ((gb_addr_config & PIPE_INTERLEAVE_SIZE_MASK) >> PIPE_INTERLEAVE_SIZE_SHIFT) << 8;
  1090. rdev->config.cik.tile_config |=
  1091. ((gb_addr_config & ROW_SIZE_MASK) >> ROW_SIZE_SHIFT) << 12;
  1092. WREG32(GB_ADDR_CONFIG, gb_addr_config);
  1093. WREG32(HDP_ADDR_CONFIG, gb_addr_config);
  1094. WREG32(DMIF_ADDR_CALC, gb_addr_config);
  1095. cik_tiling_mode_table_init(rdev);
  1096. cik_setup_rb(rdev, rdev->config.cik.max_shader_engines,
  1097. rdev->config.cik.max_sh_per_se,
  1098. rdev->config.cik.max_backends_per_se);
  1099. /* set HW defaults for 3D engine */
  1100. WREG32(CP_MEQ_THRESHOLDS, MEQ1_START(0x30) | MEQ2_START(0x60));
  1101. WREG32(SX_DEBUG_1, 0x20);
  1102. WREG32(TA_CNTL_AUX, 0x00010000);
  1103. tmp = RREG32(SPI_CONFIG_CNTL);
  1104. tmp |= 0x03000000;
  1105. WREG32(SPI_CONFIG_CNTL, tmp);
  1106. WREG32(SQ_CONFIG, 1);
  1107. WREG32(DB_DEBUG, 0);
  1108. tmp = RREG32(DB_DEBUG2) & ~0xf00fffff;
  1109. tmp |= 0x00000400;
  1110. WREG32(DB_DEBUG2, tmp);
  1111. tmp = RREG32(DB_DEBUG3) & ~0x0002021c;
  1112. tmp |= 0x00020200;
  1113. WREG32(DB_DEBUG3, tmp);
  1114. tmp = RREG32(CB_HW_CONTROL) & ~0x00010000;
  1115. tmp |= 0x00018208;
  1116. WREG32(CB_HW_CONTROL, tmp);
  1117. WREG32(SPI_CONFIG_CNTL_1, VTX_DONE_DELAY(4));
  1118. WREG32(PA_SC_FIFO_SIZE, (SC_FRONTEND_PRIM_FIFO_SIZE(rdev->config.cik.sc_prim_fifo_size_frontend) |
  1119. SC_BACKEND_PRIM_FIFO_SIZE(rdev->config.cik.sc_prim_fifo_size_backend) |
  1120. SC_HIZ_TILE_FIFO_SIZE(rdev->config.cik.sc_hiz_tile_fifo_size) |
  1121. SC_EARLYZ_TILE_FIFO_SIZE(rdev->config.cik.sc_earlyz_tile_fifo_size)));
  1122. WREG32(VGT_NUM_INSTANCES, 1);
  1123. WREG32(CP_PERFMON_CNTL, 0);
  1124. WREG32(SQ_CONFIG, 0);
  1125. WREG32(PA_SC_FORCE_EOV_MAX_CNTS, (FORCE_EOV_MAX_CLK_CNT(4095) |
  1126. FORCE_EOV_MAX_REZ_CNT(255)));
  1127. WREG32(VGT_CACHE_INVALIDATION, CACHE_INVALIDATION(VC_AND_TC) |
  1128. AUTO_INVLD_EN(ES_AND_GS_AUTO));
  1129. WREG32(VGT_GS_VERTEX_REUSE, 16);
  1130. WREG32(PA_SC_LINE_STIPPLE_STATE, 0);
  1131. tmp = RREG32(HDP_MISC_CNTL);
  1132. tmp |= HDP_FLUSH_INVALIDATE_CACHE;
  1133. WREG32(HDP_MISC_CNTL, tmp);
  1134. hdp_host_path_cntl = RREG32(HDP_HOST_PATH_CNTL);
  1135. WREG32(HDP_HOST_PATH_CNTL, hdp_host_path_cntl);
  1136. WREG32(PA_CL_ENHANCE, CLIP_VTX_REORDER_ENA | NUM_CLIP_SEQ(3));
  1137. WREG32(PA_SC_ENHANCE, ENABLE_PA_SC_OUT_OF_ORDER);
  1138. udelay(50);
  1139. }