cik.c 55 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761
  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 "radeon_asic.h"
  31. #include "cikd.h"
  32. #include "atom.h"
  33. extern void evergreen_mc_stop(struct radeon_device *rdev, struct evergreen_mc_save *save);
  34. extern void evergreen_mc_resume(struct radeon_device *rdev, struct evergreen_mc_save *save);
  35. extern void si_vram_gtt_location(struct radeon_device *rdev, struct radeon_mc *mc);
  36. /*
  37. * Core functions
  38. */
  39. /**
  40. * cik_tiling_mode_table_init - init the hw tiling table
  41. *
  42. * @rdev: radeon_device pointer
  43. *
  44. * Starting with SI, the tiling setup is done globally in a
  45. * set of 32 tiling modes. Rather than selecting each set of
  46. * parameters per surface as on older asics, we just select
  47. * which index in the tiling table we want to use, and the
  48. * surface uses those parameters (CIK).
  49. */
  50. static void cik_tiling_mode_table_init(struct radeon_device *rdev)
  51. {
  52. const u32 num_tile_mode_states = 32;
  53. const u32 num_secondary_tile_mode_states = 16;
  54. u32 reg_offset, gb_tile_moden, split_equal_to_row_size;
  55. u32 num_pipe_configs;
  56. u32 num_rbs = rdev->config.cik.max_backends_per_se *
  57. rdev->config.cik.max_shader_engines;
  58. switch (rdev->config.cik.mem_row_size_in_kb) {
  59. case 1:
  60. split_equal_to_row_size = ADDR_SURF_TILE_SPLIT_1KB;
  61. break;
  62. case 2:
  63. default:
  64. split_equal_to_row_size = ADDR_SURF_TILE_SPLIT_2KB;
  65. break;
  66. case 4:
  67. split_equal_to_row_size = ADDR_SURF_TILE_SPLIT_4KB;
  68. break;
  69. }
  70. num_pipe_configs = rdev->config.cik.max_tile_pipes;
  71. if (num_pipe_configs > 8)
  72. num_pipe_configs = 8; /* ??? */
  73. if (num_pipe_configs == 8) {
  74. for (reg_offset = 0; reg_offset < num_tile_mode_states; reg_offset++) {
  75. switch (reg_offset) {
  76. case 0:
  77. gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
  78. MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
  79. PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
  80. TILE_SPLIT(ADDR_SURF_TILE_SPLIT_64B));
  81. break;
  82. case 1:
  83. gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
  84. MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
  85. PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
  86. TILE_SPLIT(ADDR_SURF_TILE_SPLIT_128B));
  87. break;
  88. case 2:
  89. gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
  90. MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
  91. PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
  92. TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B));
  93. break;
  94. case 3:
  95. gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
  96. MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
  97. PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
  98. TILE_SPLIT(ADDR_SURF_TILE_SPLIT_512B));
  99. break;
  100. case 4:
  101. gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
  102. MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
  103. PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
  104. TILE_SPLIT(split_equal_to_row_size));
  105. break;
  106. case 5:
  107. gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
  108. MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING));
  109. break;
  110. case 6:
  111. gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
  112. MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
  113. PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
  114. TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B));
  115. break;
  116. case 7:
  117. gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
  118. MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
  119. PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
  120. TILE_SPLIT(split_equal_to_row_size));
  121. break;
  122. case 8:
  123. gb_tile_moden = (ARRAY_MODE(ARRAY_LINEAR_ALIGNED) |
  124. PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16));
  125. break;
  126. case 9:
  127. gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
  128. MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING));
  129. break;
  130. case 10:
  131. gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
  132. MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING) |
  133. PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
  134. SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
  135. break;
  136. case 11:
  137. gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
  138. MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING) |
  139. PIPE_CONFIG(ADDR_SURF_P8_32x32_8x16) |
  140. SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
  141. break;
  142. case 12:
  143. gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
  144. MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING) |
  145. PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
  146. SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
  147. break;
  148. case 13:
  149. gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
  150. MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING));
  151. break;
  152. case 14:
  153. gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
  154. MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
  155. PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
  156. SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
  157. break;
  158. case 16:
  159. gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
  160. MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
  161. PIPE_CONFIG(ADDR_SURF_P8_32x32_8x16) |
  162. SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
  163. break;
  164. case 17:
  165. gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
  166. MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
  167. PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
  168. SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
  169. break;
  170. case 27:
  171. gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
  172. MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING));
  173. break;
  174. case 28:
  175. gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
  176. MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING) |
  177. PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
  178. SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
  179. break;
  180. case 29:
  181. gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
  182. MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING) |
  183. PIPE_CONFIG(ADDR_SURF_P8_32x32_8x16) |
  184. SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
  185. break;
  186. case 30:
  187. gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
  188. MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING) |
  189. PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
  190. SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
  191. break;
  192. default:
  193. gb_tile_moden = 0;
  194. break;
  195. }
  196. WREG32(GB_TILE_MODE0 + (reg_offset * 4), gb_tile_moden);
  197. }
  198. for (reg_offset = 0; reg_offset < num_secondary_tile_mode_states; reg_offset++) {
  199. switch (reg_offset) {
  200. case 0:
  201. gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
  202. BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
  203. MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
  204. NUM_BANKS(ADDR_SURF_16_BANK));
  205. break;
  206. case 1:
  207. gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
  208. BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) |
  209. MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
  210. NUM_BANKS(ADDR_SURF_16_BANK));
  211. break;
  212. case 2:
  213. gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
  214. BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
  215. MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
  216. NUM_BANKS(ADDR_SURF_16_BANK));
  217. break;
  218. case 3:
  219. gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
  220. BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
  221. MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
  222. NUM_BANKS(ADDR_SURF_16_BANK));
  223. break;
  224. case 4:
  225. gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
  226. BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
  227. MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1) |
  228. NUM_BANKS(ADDR_SURF_8_BANK));
  229. break;
  230. case 5:
  231. gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
  232. BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
  233. MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1) |
  234. NUM_BANKS(ADDR_SURF_4_BANK));
  235. break;
  236. case 6:
  237. gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
  238. BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
  239. MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1) |
  240. NUM_BANKS(ADDR_SURF_2_BANK));
  241. break;
  242. case 8:
  243. gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
  244. BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_8) |
  245. MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
  246. NUM_BANKS(ADDR_SURF_16_BANK));
  247. break;
  248. case 9:
  249. gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
  250. BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
  251. MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
  252. NUM_BANKS(ADDR_SURF_16_BANK));
  253. break;
  254. case 10:
  255. gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
  256. BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) |
  257. MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
  258. NUM_BANKS(ADDR_SURF_16_BANK));
  259. break;
  260. case 11:
  261. gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
  262. BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
  263. MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
  264. NUM_BANKS(ADDR_SURF_16_BANK));
  265. break;
  266. case 12:
  267. gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
  268. BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
  269. MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1) |
  270. NUM_BANKS(ADDR_SURF_8_BANK));
  271. break;
  272. case 13:
  273. gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
  274. BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
  275. MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1) |
  276. NUM_BANKS(ADDR_SURF_4_BANK));
  277. break;
  278. case 14:
  279. gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
  280. BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
  281. MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1) |
  282. NUM_BANKS(ADDR_SURF_2_BANK));
  283. break;
  284. default:
  285. gb_tile_moden = 0;
  286. break;
  287. }
  288. WREG32(GB_MACROTILE_MODE0 + (reg_offset * 4), gb_tile_moden);
  289. }
  290. } else if (num_pipe_configs == 4) {
  291. if (num_rbs == 4) {
  292. for (reg_offset = 0; reg_offset < num_tile_mode_states; reg_offset++) {
  293. switch (reg_offset) {
  294. case 0:
  295. gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
  296. MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
  297. PIPE_CONFIG(ADDR_SURF_P4_16x16) |
  298. TILE_SPLIT(ADDR_SURF_TILE_SPLIT_64B));
  299. break;
  300. case 1:
  301. gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
  302. MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
  303. PIPE_CONFIG(ADDR_SURF_P4_16x16) |
  304. TILE_SPLIT(ADDR_SURF_TILE_SPLIT_128B));
  305. break;
  306. case 2:
  307. gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
  308. MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
  309. PIPE_CONFIG(ADDR_SURF_P4_16x16) |
  310. TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B));
  311. break;
  312. case 3:
  313. gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
  314. MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
  315. PIPE_CONFIG(ADDR_SURF_P4_16x16) |
  316. TILE_SPLIT(ADDR_SURF_TILE_SPLIT_512B));
  317. break;
  318. case 4:
  319. gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
  320. MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
  321. PIPE_CONFIG(ADDR_SURF_P4_16x16) |
  322. TILE_SPLIT(split_equal_to_row_size));
  323. break;
  324. case 5:
  325. gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
  326. MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING));
  327. break;
  328. case 6:
  329. gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
  330. MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
  331. PIPE_CONFIG(ADDR_SURF_P4_16x16) |
  332. TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B));
  333. break;
  334. case 7:
  335. gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
  336. MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
  337. PIPE_CONFIG(ADDR_SURF_P4_16x16) |
  338. TILE_SPLIT(split_equal_to_row_size));
  339. break;
  340. case 8:
  341. gb_tile_moden = (ARRAY_MODE(ARRAY_LINEAR_ALIGNED) |
  342. PIPE_CONFIG(ADDR_SURF_P4_16x16));
  343. break;
  344. case 9:
  345. gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
  346. MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING));
  347. break;
  348. case 10:
  349. gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
  350. MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING) |
  351. PIPE_CONFIG(ADDR_SURF_P4_16x16) |
  352. SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
  353. break;
  354. case 11:
  355. gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
  356. MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING) |
  357. PIPE_CONFIG(ADDR_SURF_P4_8x16) |
  358. SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
  359. break;
  360. case 12:
  361. gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
  362. MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING) |
  363. PIPE_CONFIG(ADDR_SURF_P4_16x16) |
  364. SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
  365. break;
  366. case 13:
  367. gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
  368. MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING));
  369. break;
  370. case 14:
  371. gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
  372. MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
  373. PIPE_CONFIG(ADDR_SURF_P4_16x16) |
  374. SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
  375. break;
  376. case 16:
  377. gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
  378. MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
  379. PIPE_CONFIG(ADDR_SURF_P4_8x16) |
  380. SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
  381. break;
  382. case 17:
  383. gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
  384. MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
  385. PIPE_CONFIG(ADDR_SURF_P4_16x16) |
  386. SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
  387. break;
  388. case 27:
  389. gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
  390. MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING));
  391. break;
  392. case 28:
  393. gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
  394. MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING) |
  395. PIPE_CONFIG(ADDR_SURF_P4_16x16) |
  396. SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
  397. break;
  398. case 29:
  399. gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
  400. MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING) |
  401. PIPE_CONFIG(ADDR_SURF_P4_8x16) |
  402. SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
  403. break;
  404. case 30:
  405. gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
  406. MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING) |
  407. PIPE_CONFIG(ADDR_SURF_P4_16x16) |
  408. SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
  409. break;
  410. default:
  411. gb_tile_moden = 0;
  412. break;
  413. }
  414. WREG32(GB_TILE_MODE0 + (reg_offset * 4), gb_tile_moden);
  415. }
  416. } else if (num_rbs < 4) {
  417. for (reg_offset = 0; reg_offset < num_tile_mode_states; reg_offset++) {
  418. switch (reg_offset) {
  419. case 0:
  420. gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
  421. MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
  422. PIPE_CONFIG(ADDR_SURF_P4_8x16) |
  423. TILE_SPLIT(ADDR_SURF_TILE_SPLIT_64B));
  424. break;
  425. case 1:
  426. gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
  427. MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
  428. PIPE_CONFIG(ADDR_SURF_P4_8x16) |
  429. TILE_SPLIT(ADDR_SURF_TILE_SPLIT_128B));
  430. break;
  431. case 2:
  432. gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
  433. MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
  434. PIPE_CONFIG(ADDR_SURF_P4_8x16) |
  435. TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B));
  436. break;
  437. case 3:
  438. gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
  439. MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
  440. PIPE_CONFIG(ADDR_SURF_P4_8x16) |
  441. TILE_SPLIT(ADDR_SURF_TILE_SPLIT_512B));
  442. break;
  443. case 4:
  444. gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
  445. MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
  446. PIPE_CONFIG(ADDR_SURF_P4_8x16) |
  447. TILE_SPLIT(split_equal_to_row_size));
  448. break;
  449. case 5:
  450. gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
  451. MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING));
  452. break;
  453. case 6:
  454. gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
  455. MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
  456. PIPE_CONFIG(ADDR_SURF_P4_8x16) |
  457. TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B));
  458. break;
  459. case 7:
  460. gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
  461. MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
  462. PIPE_CONFIG(ADDR_SURF_P4_8x16) |
  463. TILE_SPLIT(split_equal_to_row_size));
  464. break;
  465. case 8:
  466. gb_tile_moden = (ARRAY_MODE(ARRAY_LINEAR_ALIGNED) |
  467. PIPE_CONFIG(ADDR_SURF_P4_8x16));
  468. break;
  469. case 9:
  470. gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
  471. MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING));
  472. break;
  473. case 10:
  474. gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
  475. MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING) |
  476. PIPE_CONFIG(ADDR_SURF_P4_8x16) |
  477. SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
  478. break;
  479. case 11:
  480. gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
  481. MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING) |
  482. PIPE_CONFIG(ADDR_SURF_P4_8x16) |
  483. SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
  484. break;
  485. case 12:
  486. gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
  487. MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING) |
  488. PIPE_CONFIG(ADDR_SURF_P4_8x16) |
  489. SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
  490. break;
  491. case 13:
  492. gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
  493. MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING));
  494. break;
  495. case 14:
  496. gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
  497. MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
  498. PIPE_CONFIG(ADDR_SURF_P4_8x16) |
  499. SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
  500. break;
  501. case 16:
  502. gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
  503. MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
  504. PIPE_CONFIG(ADDR_SURF_P4_8x16) |
  505. SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
  506. break;
  507. case 17:
  508. gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
  509. MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
  510. PIPE_CONFIG(ADDR_SURF_P4_8x16) |
  511. SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
  512. break;
  513. case 27:
  514. gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
  515. MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING));
  516. break;
  517. case 28:
  518. gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
  519. MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING) |
  520. PIPE_CONFIG(ADDR_SURF_P4_8x16) |
  521. SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
  522. break;
  523. case 29:
  524. gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
  525. MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING) |
  526. PIPE_CONFIG(ADDR_SURF_P4_8x16) |
  527. SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
  528. break;
  529. case 30:
  530. gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
  531. MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING) |
  532. PIPE_CONFIG(ADDR_SURF_P4_8x16) |
  533. SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
  534. break;
  535. default:
  536. gb_tile_moden = 0;
  537. break;
  538. }
  539. WREG32(GB_TILE_MODE0 + (reg_offset * 4), gb_tile_moden);
  540. }
  541. }
  542. for (reg_offset = 0; reg_offset < num_secondary_tile_mode_states; reg_offset++) {
  543. switch (reg_offset) {
  544. case 0:
  545. gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
  546. BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
  547. MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
  548. NUM_BANKS(ADDR_SURF_16_BANK));
  549. break;
  550. case 1:
  551. gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
  552. BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) |
  553. MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
  554. NUM_BANKS(ADDR_SURF_16_BANK));
  555. break;
  556. case 2:
  557. gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
  558. BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
  559. MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
  560. NUM_BANKS(ADDR_SURF_16_BANK));
  561. break;
  562. case 3:
  563. gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
  564. BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
  565. MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
  566. NUM_BANKS(ADDR_SURF_16_BANK));
  567. break;
  568. case 4:
  569. gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
  570. BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
  571. MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
  572. NUM_BANKS(ADDR_SURF_16_BANK));
  573. break;
  574. case 5:
  575. gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
  576. BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
  577. MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
  578. NUM_BANKS(ADDR_SURF_8_BANK));
  579. break;
  580. case 6:
  581. gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
  582. BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
  583. MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1) |
  584. NUM_BANKS(ADDR_SURF_4_BANK));
  585. break;
  586. case 8:
  587. gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_2) |
  588. BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_8) |
  589. MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
  590. NUM_BANKS(ADDR_SURF_16_BANK));
  591. break;
  592. case 9:
  593. gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_2) |
  594. BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
  595. MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
  596. NUM_BANKS(ADDR_SURF_16_BANK));
  597. break;
  598. case 10:
  599. gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
  600. BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
  601. MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
  602. NUM_BANKS(ADDR_SURF_16_BANK));
  603. break;
  604. case 11:
  605. gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
  606. BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) |
  607. MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
  608. NUM_BANKS(ADDR_SURF_16_BANK));
  609. break;
  610. case 12:
  611. gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
  612. BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
  613. MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
  614. NUM_BANKS(ADDR_SURF_16_BANK));
  615. break;
  616. case 13:
  617. gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
  618. BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
  619. MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
  620. NUM_BANKS(ADDR_SURF_8_BANK));
  621. break;
  622. case 14:
  623. gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
  624. BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
  625. MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1) |
  626. NUM_BANKS(ADDR_SURF_4_BANK));
  627. break;
  628. default:
  629. gb_tile_moden = 0;
  630. break;
  631. }
  632. WREG32(GB_MACROTILE_MODE0 + (reg_offset * 4), gb_tile_moden);
  633. }
  634. } else if (num_pipe_configs == 2) {
  635. for (reg_offset = 0; reg_offset < num_tile_mode_states; reg_offset++) {
  636. switch (reg_offset) {
  637. case 0:
  638. gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
  639. MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
  640. PIPE_CONFIG(ADDR_SURF_P2) |
  641. TILE_SPLIT(ADDR_SURF_TILE_SPLIT_64B));
  642. break;
  643. case 1:
  644. gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
  645. MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
  646. PIPE_CONFIG(ADDR_SURF_P2) |
  647. TILE_SPLIT(ADDR_SURF_TILE_SPLIT_128B));
  648. break;
  649. case 2:
  650. gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
  651. MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
  652. PIPE_CONFIG(ADDR_SURF_P2) |
  653. TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B));
  654. break;
  655. case 3:
  656. gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
  657. MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
  658. PIPE_CONFIG(ADDR_SURF_P2) |
  659. TILE_SPLIT(ADDR_SURF_TILE_SPLIT_512B));
  660. break;
  661. case 4:
  662. gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
  663. MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
  664. PIPE_CONFIG(ADDR_SURF_P2) |
  665. TILE_SPLIT(split_equal_to_row_size));
  666. break;
  667. case 5:
  668. gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
  669. MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING));
  670. break;
  671. case 6:
  672. gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
  673. MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
  674. PIPE_CONFIG(ADDR_SURF_P2) |
  675. TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B));
  676. break;
  677. case 7:
  678. gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
  679. MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
  680. PIPE_CONFIG(ADDR_SURF_P2) |
  681. TILE_SPLIT(split_equal_to_row_size));
  682. break;
  683. case 8:
  684. gb_tile_moden = ARRAY_MODE(ARRAY_LINEAR_ALIGNED);
  685. break;
  686. case 9:
  687. gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
  688. MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING));
  689. break;
  690. case 10:
  691. gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
  692. MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING) |
  693. PIPE_CONFIG(ADDR_SURF_P2) |
  694. SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
  695. break;
  696. case 11:
  697. gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
  698. MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING) |
  699. PIPE_CONFIG(ADDR_SURF_P2) |
  700. SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
  701. break;
  702. case 12:
  703. gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
  704. MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING) |
  705. PIPE_CONFIG(ADDR_SURF_P2) |
  706. SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
  707. break;
  708. case 13:
  709. gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
  710. MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING));
  711. break;
  712. case 14:
  713. gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
  714. MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
  715. PIPE_CONFIG(ADDR_SURF_P2) |
  716. SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
  717. break;
  718. case 16:
  719. gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
  720. MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
  721. PIPE_CONFIG(ADDR_SURF_P2) |
  722. SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
  723. break;
  724. case 17:
  725. gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
  726. MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
  727. PIPE_CONFIG(ADDR_SURF_P2) |
  728. SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
  729. break;
  730. case 27:
  731. gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
  732. MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING));
  733. break;
  734. case 28:
  735. gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
  736. MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING) |
  737. PIPE_CONFIG(ADDR_SURF_P2) |
  738. SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
  739. break;
  740. case 29:
  741. gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
  742. MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING) |
  743. PIPE_CONFIG(ADDR_SURF_P2) |
  744. SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
  745. break;
  746. case 30:
  747. gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
  748. MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING) |
  749. PIPE_CONFIG(ADDR_SURF_P2) |
  750. SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
  751. break;
  752. default:
  753. gb_tile_moden = 0;
  754. break;
  755. }
  756. WREG32(GB_TILE_MODE0 + (reg_offset * 4), gb_tile_moden);
  757. }
  758. for (reg_offset = 0; reg_offset < num_secondary_tile_mode_states; reg_offset++) {
  759. switch (reg_offset) {
  760. case 0:
  761. gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_2) |
  762. BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
  763. MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
  764. NUM_BANKS(ADDR_SURF_16_BANK));
  765. break;
  766. case 1:
  767. gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_2) |
  768. BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) |
  769. MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
  770. NUM_BANKS(ADDR_SURF_16_BANK));
  771. break;
  772. case 2:
  773. gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
  774. BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) |
  775. MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
  776. NUM_BANKS(ADDR_SURF_16_BANK));
  777. break;
  778. case 3:
  779. gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
  780. BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
  781. MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
  782. NUM_BANKS(ADDR_SURF_16_BANK));
  783. break;
  784. case 4:
  785. gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
  786. BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
  787. MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
  788. NUM_BANKS(ADDR_SURF_16_BANK));
  789. break;
  790. case 5:
  791. gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
  792. BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
  793. MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
  794. NUM_BANKS(ADDR_SURF_16_BANK));
  795. break;
  796. case 6:
  797. gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
  798. BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
  799. MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
  800. NUM_BANKS(ADDR_SURF_8_BANK));
  801. break;
  802. case 8:
  803. gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_4) |
  804. BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_8) |
  805. MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
  806. NUM_BANKS(ADDR_SURF_16_BANK));
  807. break;
  808. case 9:
  809. gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_4) |
  810. BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
  811. MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
  812. NUM_BANKS(ADDR_SURF_16_BANK));
  813. break;
  814. case 10:
  815. gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_2) |
  816. BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
  817. MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
  818. NUM_BANKS(ADDR_SURF_16_BANK));
  819. break;
  820. case 11:
  821. gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_2) |
  822. BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) |
  823. MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
  824. NUM_BANKS(ADDR_SURF_16_BANK));
  825. break;
  826. case 12:
  827. gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
  828. BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) |
  829. MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
  830. NUM_BANKS(ADDR_SURF_16_BANK));
  831. break;
  832. case 13:
  833. gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
  834. BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
  835. MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
  836. NUM_BANKS(ADDR_SURF_16_BANK));
  837. break;
  838. case 14:
  839. gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
  840. BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
  841. MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
  842. NUM_BANKS(ADDR_SURF_8_BANK));
  843. break;
  844. default:
  845. gb_tile_moden = 0;
  846. break;
  847. }
  848. WREG32(GB_MACROTILE_MODE0 + (reg_offset * 4), gb_tile_moden);
  849. }
  850. } else
  851. DRM_ERROR("unknown num pipe config: 0x%x\n", num_pipe_configs);
  852. }
  853. /**
  854. * cik_select_se_sh - select which SE, SH to address
  855. *
  856. * @rdev: radeon_device pointer
  857. * @se_num: shader engine to address
  858. * @sh_num: sh block to address
  859. *
  860. * Select which SE, SH combinations to address. Certain
  861. * registers are instanced per SE or SH. 0xffffffff means
  862. * broadcast to all SEs or SHs (CIK).
  863. */
  864. static void cik_select_se_sh(struct radeon_device *rdev,
  865. u32 se_num, u32 sh_num)
  866. {
  867. u32 data = INSTANCE_BROADCAST_WRITES;
  868. if ((se_num == 0xffffffff) && (sh_num == 0xffffffff))
  869. data = SH_BROADCAST_WRITES | SE_BROADCAST_WRITES;
  870. else if (se_num == 0xffffffff)
  871. data |= SE_BROADCAST_WRITES | SH_INDEX(sh_num);
  872. else if (sh_num == 0xffffffff)
  873. data |= SH_BROADCAST_WRITES | SE_INDEX(se_num);
  874. else
  875. data |= SH_INDEX(sh_num) | SE_INDEX(se_num);
  876. WREG32(GRBM_GFX_INDEX, data);
  877. }
  878. /**
  879. * cik_create_bitmask - create a bitmask
  880. *
  881. * @bit_width: length of the mask
  882. *
  883. * create a variable length bit mask (CIK).
  884. * Returns the bitmask.
  885. */
  886. static u32 cik_create_bitmask(u32 bit_width)
  887. {
  888. u32 i, mask = 0;
  889. for (i = 0; i < bit_width; i++) {
  890. mask <<= 1;
  891. mask |= 1;
  892. }
  893. return mask;
  894. }
  895. /**
  896. * cik_select_se_sh - select which SE, SH to address
  897. *
  898. * @rdev: radeon_device pointer
  899. * @max_rb_num: max RBs (render backends) for the asic
  900. * @se_num: number of SEs (shader engines) for the asic
  901. * @sh_per_se: number of SH blocks per SE for the asic
  902. *
  903. * Calculates the bitmask of disabled RBs (CIK).
  904. * Returns the disabled RB bitmask.
  905. */
  906. static u32 cik_get_rb_disabled(struct radeon_device *rdev,
  907. u32 max_rb_num, u32 se_num,
  908. u32 sh_per_se)
  909. {
  910. u32 data, mask;
  911. data = RREG32(CC_RB_BACKEND_DISABLE);
  912. if (data & 1)
  913. data &= BACKEND_DISABLE_MASK;
  914. else
  915. data = 0;
  916. data |= RREG32(GC_USER_RB_BACKEND_DISABLE);
  917. data >>= BACKEND_DISABLE_SHIFT;
  918. mask = cik_create_bitmask(max_rb_num / se_num / sh_per_se);
  919. return data & mask;
  920. }
  921. /**
  922. * cik_setup_rb - setup the RBs on the asic
  923. *
  924. * @rdev: radeon_device pointer
  925. * @se_num: number of SEs (shader engines) for the asic
  926. * @sh_per_se: number of SH blocks per SE for the asic
  927. * @max_rb_num: max RBs (render backends) for the asic
  928. *
  929. * Configures per-SE/SH RB registers (CIK).
  930. */
  931. static void cik_setup_rb(struct radeon_device *rdev,
  932. u32 se_num, u32 sh_per_se,
  933. u32 max_rb_num)
  934. {
  935. int i, j;
  936. u32 data, mask;
  937. u32 disabled_rbs = 0;
  938. u32 enabled_rbs = 0;
  939. for (i = 0; i < se_num; i++) {
  940. for (j = 0; j < sh_per_se; j++) {
  941. cik_select_se_sh(rdev, i, j);
  942. data = cik_get_rb_disabled(rdev, max_rb_num, se_num, sh_per_se);
  943. disabled_rbs |= data << ((i * sh_per_se + j) * CIK_RB_BITMAP_WIDTH_PER_SH);
  944. }
  945. }
  946. cik_select_se_sh(rdev, 0xffffffff, 0xffffffff);
  947. mask = 1;
  948. for (i = 0; i < max_rb_num; i++) {
  949. if (!(disabled_rbs & mask))
  950. enabled_rbs |= mask;
  951. mask <<= 1;
  952. }
  953. for (i = 0; i < se_num; i++) {
  954. cik_select_se_sh(rdev, i, 0xffffffff);
  955. data = 0;
  956. for (j = 0; j < sh_per_se; j++) {
  957. switch (enabled_rbs & 3) {
  958. case 1:
  959. data |= (RASTER_CONFIG_RB_MAP_0 << (i * sh_per_se + j) * 2);
  960. break;
  961. case 2:
  962. data |= (RASTER_CONFIG_RB_MAP_3 << (i * sh_per_se + j) * 2);
  963. break;
  964. case 3:
  965. default:
  966. data |= (RASTER_CONFIG_RB_MAP_2 << (i * sh_per_se + j) * 2);
  967. break;
  968. }
  969. enabled_rbs >>= 2;
  970. }
  971. WREG32(PA_SC_RASTER_CONFIG, data);
  972. }
  973. cik_select_se_sh(rdev, 0xffffffff, 0xffffffff);
  974. }
  975. /**
  976. * cik_gpu_init - setup the 3D engine
  977. *
  978. * @rdev: radeon_device pointer
  979. *
  980. * Configures the 3D engine and tiling configuration
  981. * registers so that the 3D engine is usable.
  982. */
  983. static void cik_gpu_init(struct radeon_device *rdev)
  984. {
  985. u32 gb_addr_config = RREG32(GB_ADDR_CONFIG);
  986. u32 mc_shared_chmap, mc_arb_ramcfg;
  987. u32 hdp_host_path_cntl;
  988. u32 tmp;
  989. int i, j;
  990. switch (rdev->family) {
  991. case CHIP_BONAIRE:
  992. rdev->config.cik.max_shader_engines = 2;
  993. rdev->config.cik.max_tile_pipes = 4;
  994. rdev->config.cik.max_cu_per_sh = 7;
  995. rdev->config.cik.max_sh_per_se = 1;
  996. rdev->config.cik.max_backends_per_se = 2;
  997. rdev->config.cik.max_texture_channel_caches = 4;
  998. rdev->config.cik.max_gprs = 256;
  999. rdev->config.cik.max_gs_threads = 32;
  1000. rdev->config.cik.max_hw_contexts = 8;
  1001. rdev->config.cik.sc_prim_fifo_size_frontend = 0x20;
  1002. rdev->config.cik.sc_prim_fifo_size_backend = 0x100;
  1003. rdev->config.cik.sc_hiz_tile_fifo_size = 0x30;
  1004. rdev->config.cik.sc_earlyz_tile_fifo_size = 0x130;
  1005. gb_addr_config = BONAIRE_GB_ADDR_CONFIG_GOLDEN;
  1006. break;
  1007. case CHIP_KAVERI:
  1008. /* TODO */
  1009. break;
  1010. case CHIP_KABINI:
  1011. default:
  1012. rdev->config.cik.max_shader_engines = 1;
  1013. rdev->config.cik.max_tile_pipes = 2;
  1014. rdev->config.cik.max_cu_per_sh = 2;
  1015. rdev->config.cik.max_sh_per_se = 1;
  1016. rdev->config.cik.max_backends_per_se = 1;
  1017. rdev->config.cik.max_texture_channel_caches = 2;
  1018. rdev->config.cik.max_gprs = 256;
  1019. rdev->config.cik.max_gs_threads = 16;
  1020. rdev->config.cik.max_hw_contexts = 8;
  1021. rdev->config.cik.sc_prim_fifo_size_frontend = 0x20;
  1022. rdev->config.cik.sc_prim_fifo_size_backend = 0x100;
  1023. rdev->config.cik.sc_hiz_tile_fifo_size = 0x30;
  1024. rdev->config.cik.sc_earlyz_tile_fifo_size = 0x130;
  1025. gb_addr_config = BONAIRE_GB_ADDR_CONFIG_GOLDEN;
  1026. break;
  1027. }
  1028. /* Initialize HDP */
  1029. for (i = 0, j = 0; i < 32; i++, j += 0x18) {
  1030. WREG32((0x2c14 + j), 0x00000000);
  1031. WREG32((0x2c18 + j), 0x00000000);
  1032. WREG32((0x2c1c + j), 0x00000000);
  1033. WREG32((0x2c20 + j), 0x00000000);
  1034. WREG32((0x2c24 + j), 0x00000000);
  1035. }
  1036. WREG32(GRBM_CNTL, GRBM_READ_TIMEOUT(0xff));
  1037. WREG32(BIF_FB_EN, FB_READ_EN | FB_WRITE_EN);
  1038. mc_shared_chmap = RREG32(MC_SHARED_CHMAP);
  1039. mc_arb_ramcfg = RREG32(MC_ARB_RAMCFG);
  1040. rdev->config.cik.num_tile_pipes = rdev->config.cik.max_tile_pipes;
  1041. rdev->config.cik.mem_max_burst_length_bytes = 256;
  1042. tmp = (mc_arb_ramcfg & NOOFCOLS_MASK) >> NOOFCOLS_SHIFT;
  1043. rdev->config.cik.mem_row_size_in_kb = (4 * (1 << (8 + tmp))) / 1024;
  1044. if (rdev->config.cik.mem_row_size_in_kb > 4)
  1045. rdev->config.cik.mem_row_size_in_kb = 4;
  1046. /* XXX use MC settings? */
  1047. rdev->config.cik.shader_engine_tile_size = 32;
  1048. rdev->config.cik.num_gpus = 1;
  1049. rdev->config.cik.multi_gpu_tile_size = 64;
  1050. /* fix up row size */
  1051. gb_addr_config &= ~ROW_SIZE_MASK;
  1052. switch (rdev->config.cik.mem_row_size_in_kb) {
  1053. case 1:
  1054. default:
  1055. gb_addr_config |= ROW_SIZE(0);
  1056. break;
  1057. case 2:
  1058. gb_addr_config |= ROW_SIZE(1);
  1059. break;
  1060. case 4:
  1061. gb_addr_config |= ROW_SIZE(2);
  1062. break;
  1063. }
  1064. /* setup tiling info dword. gb_addr_config is not adequate since it does
  1065. * not have bank info, so create a custom tiling dword.
  1066. * bits 3:0 num_pipes
  1067. * bits 7:4 num_banks
  1068. * bits 11:8 group_size
  1069. * bits 15:12 row_size
  1070. */
  1071. rdev->config.cik.tile_config = 0;
  1072. switch (rdev->config.cik.num_tile_pipes) {
  1073. case 1:
  1074. rdev->config.cik.tile_config |= (0 << 0);
  1075. break;
  1076. case 2:
  1077. rdev->config.cik.tile_config |= (1 << 0);
  1078. break;
  1079. case 4:
  1080. rdev->config.cik.tile_config |= (2 << 0);
  1081. break;
  1082. case 8:
  1083. default:
  1084. /* XXX what about 12? */
  1085. rdev->config.cik.tile_config |= (3 << 0);
  1086. break;
  1087. }
  1088. if ((mc_arb_ramcfg & NOOFBANK_MASK) >> NOOFBANK_SHIFT)
  1089. rdev->config.cik.tile_config |= 1 << 4;
  1090. else
  1091. rdev->config.cik.tile_config |= 0 << 4;
  1092. rdev->config.cik.tile_config |=
  1093. ((gb_addr_config & PIPE_INTERLEAVE_SIZE_MASK) >> PIPE_INTERLEAVE_SIZE_SHIFT) << 8;
  1094. rdev->config.cik.tile_config |=
  1095. ((gb_addr_config & ROW_SIZE_MASK) >> ROW_SIZE_SHIFT) << 12;
  1096. WREG32(GB_ADDR_CONFIG, gb_addr_config);
  1097. WREG32(HDP_ADDR_CONFIG, gb_addr_config);
  1098. WREG32(DMIF_ADDR_CALC, gb_addr_config);
  1099. cik_tiling_mode_table_init(rdev);
  1100. cik_setup_rb(rdev, rdev->config.cik.max_shader_engines,
  1101. rdev->config.cik.max_sh_per_se,
  1102. rdev->config.cik.max_backends_per_se);
  1103. /* set HW defaults for 3D engine */
  1104. WREG32(CP_MEQ_THRESHOLDS, MEQ1_START(0x30) | MEQ2_START(0x60));
  1105. WREG32(SX_DEBUG_1, 0x20);
  1106. WREG32(TA_CNTL_AUX, 0x00010000);
  1107. tmp = RREG32(SPI_CONFIG_CNTL);
  1108. tmp |= 0x03000000;
  1109. WREG32(SPI_CONFIG_CNTL, tmp);
  1110. WREG32(SQ_CONFIG, 1);
  1111. WREG32(DB_DEBUG, 0);
  1112. tmp = RREG32(DB_DEBUG2) & ~0xf00fffff;
  1113. tmp |= 0x00000400;
  1114. WREG32(DB_DEBUG2, tmp);
  1115. tmp = RREG32(DB_DEBUG3) & ~0x0002021c;
  1116. tmp |= 0x00020200;
  1117. WREG32(DB_DEBUG3, tmp);
  1118. tmp = RREG32(CB_HW_CONTROL) & ~0x00010000;
  1119. tmp |= 0x00018208;
  1120. WREG32(CB_HW_CONTROL, tmp);
  1121. WREG32(SPI_CONFIG_CNTL_1, VTX_DONE_DELAY(4));
  1122. WREG32(PA_SC_FIFO_SIZE, (SC_FRONTEND_PRIM_FIFO_SIZE(rdev->config.cik.sc_prim_fifo_size_frontend) |
  1123. SC_BACKEND_PRIM_FIFO_SIZE(rdev->config.cik.sc_prim_fifo_size_backend) |
  1124. SC_HIZ_TILE_FIFO_SIZE(rdev->config.cik.sc_hiz_tile_fifo_size) |
  1125. SC_EARLYZ_TILE_FIFO_SIZE(rdev->config.cik.sc_earlyz_tile_fifo_size)));
  1126. WREG32(VGT_NUM_INSTANCES, 1);
  1127. WREG32(CP_PERFMON_CNTL, 0);
  1128. WREG32(SQ_CONFIG, 0);
  1129. WREG32(PA_SC_FORCE_EOV_MAX_CNTS, (FORCE_EOV_MAX_CLK_CNT(4095) |
  1130. FORCE_EOV_MAX_REZ_CNT(255)));
  1131. WREG32(VGT_CACHE_INVALIDATION, CACHE_INVALIDATION(VC_AND_TC) |
  1132. AUTO_INVLD_EN(ES_AND_GS_AUTO));
  1133. WREG32(VGT_GS_VERTEX_REUSE, 16);
  1134. WREG32(PA_SC_LINE_STIPPLE_STATE, 0);
  1135. tmp = RREG32(HDP_MISC_CNTL);
  1136. tmp |= HDP_FLUSH_INVALIDATE_CACHE;
  1137. WREG32(HDP_MISC_CNTL, tmp);
  1138. hdp_host_path_cntl = RREG32(HDP_HOST_PATH_CNTL);
  1139. WREG32(HDP_HOST_PATH_CNTL, hdp_host_path_cntl);
  1140. WREG32(PA_CL_ENHANCE, CLIP_VTX_REORDER_ENA | NUM_CLIP_SEQ(3));
  1141. WREG32(PA_SC_ENHANCE, ENABLE_PA_SC_OUT_OF_ORDER);
  1142. udelay(50);
  1143. }
  1144. /**
  1145. * cik_gpu_is_lockup - check if the 3D engine is locked up
  1146. *
  1147. * @rdev: radeon_device pointer
  1148. * @ring: radeon_ring structure holding ring information
  1149. *
  1150. * Check if the 3D engine is locked up (CIK).
  1151. * Returns true if the engine is locked, false if not.
  1152. */
  1153. bool cik_gpu_is_lockup(struct radeon_device *rdev, struct radeon_ring *ring)
  1154. {
  1155. u32 srbm_status, srbm_status2;
  1156. u32 grbm_status, grbm_status2;
  1157. u32 grbm_status_se0, grbm_status_se1, grbm_status_se2, grbm_status_se3;
  1158. srbm_status = RREG32(SRBM_STATUS);
  1159. srbm_status2 = RREG32(SRBM_STATUS2);
  1160. grbm_status = RREG32(GRBM_STATUS);
  1161. grbm_status2 = RREG32(GRBM_STATUS2);
  1162. grbm_status_se0 = RREG32(GRBM_STATUS_SE0);
  1163. grbm_status_se1 = RREG32(GRBM_STATUS_SE1);
  1164. grbm_status_se2 = RREG32(GRBM_STATUS_SE2);
  1165. grbm_status_se3 = RREG32(GRBM_STATUS_SE3);
  1166. if (!(grbm_status & GUI_ACTIVE)) {
  1167. radeon_ring_lockup_update(ring);
  1168. return false;
  1169. }
  1170. /* force CP activities */
  1171. radeon_ring_force_activity(rdev, ring);
  1172. return radeon_ring_test_lockup(rdev, ring);
  1173. }
  1174. /**
  1175. * cik_gfx_gpu_soft_reset - soft reset the 3D engine and CPG
  1176. *
  1177. * @rdev: radeon_device pointer
  1178. *
  1179. * Soft reset the GFX engine and CPG blocks (CIK).
  1180. * XXX: deal with reseting RLC and CPF
  1181. * Returns 0 for success.
  1182. */
  1183. static int cik_gfx_gpu_soft_reset(struct radeon_device *rdev)
  1184. {
  1185. struct evergreen_mc_save save;
  1186. u32 grbm_reset = 0;
  1187. if (!(RREG32(GRBM_STATUS) & GUI_ACTIVE))
  1188. return 0;
  1189. dev_info(rdev->dev, "GPU GFX softreset \n");
  1190. dev_info(rdev->dev, " GRBM_STATUS=0x%08X\n",
  1191. RREG32(GRBM_STATUS));
  1192. dev_info(rdev->dev, " GRBM_STATUS2=0x%08X\n",
  1193. RREG32(GRBM_STATUS2));
  1194. dev_info(rdev->dev, " GRBM_STATUS_SE0=0x%08X\n",
  1195. RREG32(GRBM_STATUS_SE0));
  1196. dev_info(rdev->dev, " GRBM_STATUS_SE1=0x%08X\n",
  1197. RREG32(GRBM_STATUS_SE1));
  1198. dev_info(rdev->dev, " GRBM_STATUS_SE2=0x%08X\n",
  1199. RREG32(GRBM_STATUS_SE2));
  1200. dev_info(rdev->dev, " GRBM_STATUS_SE3=0x%08X\n",
  1201. RREG32(GRBM_STATUS_SE3));
  1202. dev_info(rdev->dev, " SRBM_STATUS=0x%08X\n",
  1203. RREG32(SRBM_STATUS));
  1204. dev_info(rdev->dev, " SRBM_STATUS2=0x%08X\n",
  1205. RREG32(SRBM_STATUS2));
  1206. evergreen_mc_stop(rdev, &save);
  1207. if (radeon_mc_wait_for_idle(rdev)) {
  1208. dev_warn(rdev->dev, "Wait for MC idle timedout !\n");
  1209. }
  1210. /* Disable CP parsing/prefetching */
  1211. WREG32(CP_ME_CNTL, CP_ME_HALT | CP_PFP_HALT | CP_CE_HALT);
  1212. /* reset all the gfx block and all CPG blocks */
  1213. grbm_reset = SOFT_RESET_CPG | SOFT_RESET_GFX;
  1214. dev_info(rdev->dev, " GRBM_SOFT_RESET=0x%08X\n", grbm_reset);
  1215. WREG32(GRBM_SOFT_RESET, grbm_reset);
  1216. (void)RREG32(GRBM_SOFT_RESET);
  1217. udelay(50);
  1218. WREG32(GRBM_SOFT_RESET, 0);
  1219. (void)RREG32(GRBM_SOFT_RESET);
  1220. /* Wait a little for things to settle down */
  1221. udelay(50);
  1222. dev_info(rdev->dev, " GRBM_STATUS=0x%08X\n",
  1223. RREG32(GRBM_STATUS));
  1224. dev_info(rdev->dev, " GRBM_STATUS2=0x%08X\n",
  1225. RREG32(GRBM_STATUS2));
  1226. dev_info(rdev->dev, " GRBM_STATUS_SE0=0x%08X\n",
  1227. RREG32(GRBM_STATUS_SE0));
  1228. dev_info(rdev->dev, " GRBM_STATUS_SE1=0x%08X\n",
  1229. RREG32(GRBM_STATUS_SE1));
  1230. dev_info(rdev->dev, " GRBM_STATUS_SE2=0x%08X\n",
  1231. RREG32(GRBM_STATUS_SE2));
  1232. dev_info(rdev->dev, " GRBM_STATUS_SE3=0x%08X\n",
  1233. RREG32(GRBM_STATUS_SE3));
  1234. dev_info(rdev->dev, " SRBM_STATUS=0x%08X\n",
  1235. RREG32(SRBM_STATUS));
  1236. dev_info(rdev->dev, " SRBM_STATUS2=0x%08X\n",
  1237. RREG32(SRBM_STATUS2));
  1238. evergreen_mc_resume(rdev, &save);
  1239. return 0;
  1240. }
  1241. /**
  1242. * cik_compute_gpu_soft_reset - soft reset CPC
  1243. *
  1244. * @rdev: radeon_device pointer
  1245. *
  1246. * Soft reset the CPC blocks (CIK).
  1247. * XXX: deal with reseting RLC and CPF
  1248. * Returns 0 for success.
  1249. */
  1250. static int cik_compute_gpu_soft_reset(struct radeon_device *rdev)
  1251. {
  1252. struct evergreen_mc_save save;
  1253. u32 grbm_reset = 0;
  1254. dev_info(rdev->dev, "GPU compute softreset \n");
  1255. dev_info(rdev->dev, " GRBM_STATUS=0x%08X\n",
  1256. RREG32(GRBM_STATUS));
  1257. dev_info(rdev->dev, " GRBM_STATUS2=0x%08X\n",
  1258. RREG32(GRBM_STATUS2));
  1259. dev_info(rdev->dev, " GRBM_STATUS_SE0=0x%08X\n",
  1260. RREG32(GRBM_STATUS_SE0));
  1261. dev_info(rdev->dev, " GRBM_STATUS_SE1=0x%08X\n",
  1262. RREG32(GRBM_STATUS_SE1));
  1263. dev_info(rdev->dev, " GRBM_STATUS_SE2=0x%08X\n",
  1264. RREG32(GRBM_STATUS_SE2));
  1265. dev_info(rdev->dev, " GRBM_STATUS_SE3=0x%08X\n",
  1266. RREG32(GRBM_STATUS_SE3));
  1267. dev_info(rdev->dev, " SRBM_STATUS=0x%08X\n",
  1268. RREG32(SRBM_STATUS));
  1269. dev_info(rdev->dev, " SRBM_STATUS2=0x%08X\n",
  1270. RREG32(SRBM_STATUS2));
  1271. evergreen_mc_stop(rdev, &save);
  1272. if (radeon_mc_wait_for_idle(rdev)) {
  1273. dev_warn(rdev->dev, "Wait for MC idle timedout !\n");
  1274. }
  1275. /* Disable CP parsing/prefetching */
  1276. WREG32(CP_MEC_CNTL, MEC_ME1_HALT | MEC_ME2_HALT);
  1277. /* reset all the CPC blocks */
  1278. grbm_reset = SOFT_RESET_CPG;
  1279. dev_info(rdev->dev, " GRBM_SOFT_RESET=0x%08X\n", grbm_reset);
  1280. WREG32(GRBM_SOFT_RESET, grbm_reset);
  1281. (void)RREG32(GRBM_SOFT_RESET);
  1282. udelay(50);
  1283. WREG32(GRBM_SOFT_RESET, 0);
  1284. (void)RREG32(GRBM_SOFT_RESET);
  1285. /* Wait a little for things to settle down */
  1286. udelay(50);
  1287. dev_info(rdev->dev, " GRBM_STATUS=0x%08X\n",
  1288. RREG32(GRBM_STATUS));
  1289. dev_info(rdev->dev, " GRBM_STATUS2=0x%08X\n",
  1290. RREG32(GRBM_STATUS2));
  1291. dev_info(rdev->dev, " GRBM_STATUS_SE0=0x%08X\n",
  1292. RREG32(GRBM_STATUS_SE0));
  1293. dev_info(rdev->dev, " GRBM_STATUS_SE1=0x%08X\n",
  1294. RREG32(GRBM_STATUS_SE1));
  1295. dev_info(rdev->dev, " GRBM_STATUS_SE2=0x%08X\n",
  1296. RREG32(GRBM_STATUS_SE2));
  1297. dev_info(rdev->dev, " GRBM_STATUS_SE3=0x%08X\n",
  1298. RREG32(GRBM_STATUS_SE3));
  1299. dev_info(rdev->dev, " SRBM_STATUS=0x%08X\n",
  1300. RREG32(SRBM_STATUS));
  1301. dev_info(rdev->dev, " SRBM_STATUS2=0x%08X\n",
  1302. RREG32(SRBM_STATUS2));
  1303. evergreen_mc_resume(rdev, &save);
  1304. return 0;
  1305. }
  1306. /**
  1307. * cik_asic_reset - soft reset compute and gfx
  1308. *
  1309. * @rdev: radeon_device pointer
  1310. *
  1311. * Soft reset the CPC blocks (CIK).
  1312. * XXX: make this more fine grained and only reset
  1313. * what is necessary.
  1314. * Returns 0 for success.
  1315. */
  1316. int cik_asic_reset(struct radeon_device *rdev)
  1317. {
  1318. int r;
  1319. r = cik_compute_gpu_soft_reset(rdev);
  1320. if (r)
  1321. dev_info(rdev->dev, "Compute reset failed!\n");
  1322. return cik_gfx_gpu_soft_reset(rdev);
  1323. }
  1324. /* MC */
  1325. /**
  1326. * cik_mc_program - program the GPU memory controller
  1327. *
  1328. * @rdev: radeon_device pointer
  1329. *
  1330. * Set the location of vram, gart, and AGP in the GPU's
  1331. * physical address space (CIK).
  1332. */
  1333. static void cik_mc_program(struct radeon_device *rdev)
  1334. {
  1335. struct evergreen_mc_save save;
  1336. u32 tmp;
  1337. int i, j;
  1338. /* Initialize HDP */
  1339. for (i = 0, j = 0; i < 32; i++, j += 0x18) {
  1340. WREG32((0x2c14 + j), 0x00000000);
  1341. WREG32((0x2c18 + j), 0x00000000);
  1342. WREG32((0x2c1c + j), 0x00000000);
  1343. WREG32((0x2c20 + j), 0x00000000);
  1344. WREG32((0x2c24 + j), 0x00000000);
  1345. }
  1346. WREG32(HDP_REG_COHERENCY_FLUSH_CNTL, 0);
  1347. evergreen_mc_stop(rdev, &save);
  1348. if (radeon_mc_wait_for_idle(rdev)) {
  1349. dev_warn(rdev->dev, "Wait for MC idle timedout !\n");
  1350. }
  1351. /* Lockout access through VGA aperture*/
  1352. WREG32(VGA_HDP_CONTROL, VGA_MEMORY_DISABLE);
  1353. /* Update configuration */
  1354. WREG32(MC_VM_SYSTEM_APERTURE_LOW_ADDR,
  1355. rdev->mc.vram_start >> 12);
  1356. WREG32(MC_VM_SYSTEM_APERTURE_HIGH_ADDR,
  1357. rdev->mc.vram_end >> 12);
  1358. WREG32(MC_VM_SYSTEM_APERTURE_DEFAULT_ADDR,
  1359. rdev->vram_scratch.gpu_addr >> 12);
  1360. tmp = ((rdev->mc.vram_end >> 24) & 0xFFFF) << 16;
  1361. tmp |= ((rdev->mc.vram_start >> 24) & 0xFFFF);
  1362. WREG32(MC_VM_FB_LOCATION, tmp);
  1363. /* XXX double check these! */
  1364. WREG32(HDP_NONSURFACE_BASE, (rdev->mc.vram_start >> 8));
  1365. WREG32(HDP_NONSURFACE_INFO, (2 << 7) | (1 << 30));
  1366. WREG32(HDP_NONSURFACE_SIZE, 0x3FFFFFFF);
  1367. WREG32(MC_VM_AGP_BASE, 0);
  1368. WREG32(MC_VM_AGP_TOP, 0x0FFFFFFF);
  1369. WREG32(MC_VM_AGP_BOT, 0x0FFFFFFF);
  1370. if (radeon_mc_wait_for_idle(rdev)) {
  1371. dev_warn(rdev->dev, "Wait for MC idle timedout !\n");
  1372. }
  1373. evergreen_mc_resume(rdev, &save);
  1374. /* we need to own VRAM, so turn off the VGA renderer here
  1375. * to stop it overwriting our objects */
  1376. rv515_vga_render_disable(rdev);
  1377. }
  1378. /**
  1379. * cik_mc_init - initialize the memory controller driver params
  1380. *
  1381. * @rdev: radeon_device pointer
  1382. *
  1383. * Look up the amount of vram, vram width, and decide how to place
  1384. * vram and gart within the GPU's physical address space (CIK).
  1385. * Returns 0 for success.
  1386. */
  1387. static int cik_mc_init(struct radeon_device *rdev)
  1388. {
  1389. u32 tmp;
  1390. int chansize, numchan;
  1391. /* Get VRAM informations */
  1392. rdev->mc.vram_is_ddr = true;
  1393. tmp = RREG32(MC_ARB_RAMCFG);
  1394. if (tmp & CHANSIZE_MASK) {
  1395. chansize = 64;
  1396. } else {
  1397. chansize = 32;
  1398. }
  1399. tmp = RREG32(MC_SHARED_CHMAP);
  1400. switch ((tmp & NOOFCHAN_MASK) >> NOOFCHAN_SHIFT) {
  1401. case 0:
  1402. default:
  1403. numchan = 1;
  1404. break;
  1405. case 1:
  1406. numchan = 2;
  1407. break;
  1408. case 2:
  1409. numchan = 4;
  1410. break;
  1411. case 3:
  1412. numchan = 8;
  1413. break;
  1414. case 4:
  1415. numchan = 3;
  1416. break;
  1417. case 5:
  1418. numchan = 6;
  1419. break;
  1420. case 6:
  1421. numchan = 10;
  1422. break;
  1423. case 7:
  1424. numchan = 12;
  1425. break;
  1426. case 8:
  1427. numchan = 16;
  1428. break;
  1429. }
  1430. rdev->mc.vram_width = numchan * chansize;
  1431. /* Could aper size report 0 ? */
  1432. rdev->mc.aper_base = pci_resource_start(rdev->pdev, 0);
  1433. rdev->mc.aper_size = pci_resource_len(rdev->pdev, 0);
  1434. /* size in MB on si */
  1435. rdev->mc.mc_vram_size = RREG32(CONFIG_MEMSIZE) * 1024 * 1024;
  1436. rdev->mc.real_vram_size = RREG32(CONFIG_MEMSIZE) * 1024 * 1024;
  1437. rdev->mc.visible_vram_size = rdev->mc.aper_size;
  1438. si_vram_gtt_location(rdev, &rdev->mc);
  1439. radeon_update_bandwidth_info(rdev);
  1440. return 0;
  1441. }
  1442. /*
  1443. * GART
  1444. * VMID 0 is the physical GPU addresses as used by the kernel.
  1445. * VMIDs 1-15 are used for userspace clients and are handled
  1446. * by the radeon vm/hsa code.
  1447. */
  1448. /**
  1449. * cik_pcie_gart_tlb_flush - gart tlb flush callback
  1450. *
  1451. * @rdev: radeon_device pointer
  1452. *
  1453. * Flush the TLB for the VMID 0 page table (CIK).
  1454. */
  1455. void cik_pcie_gart_tlb_flush(struct radeon_device *rdev)
  1456. {
  1457. /* flush hdp cache */
  1458. WREG32(HDP_MEM_COHERENCY_FLUSH_CNTL, 0);
  1459. /* bits 0-15 are the VM contexts0-15 */
  1460. WREG32(VM_INVALIDATE_REQUEST, 0x1);
  1461. }
  1462. /**
  1463. * cik_pcie_gart_enable - gart enable
  1464. *
  1465. * @rdev: radeon_device pointer
  1466. *
  1467. * This sets up the TLBs, programs the page tables for VMID0,
  1468. * sets up the hw for VMIDs 1-15 which are allocated on
  1469. * demand, and sets up the global locations for the LDS, GDS,
  1470. * and GPUVM for FSA64 clients (CIK).
  1471. * Returns 0 for success, errors for failure.
  1472. */
  1473. static int cik_pcie_gart_enable(struct radeon_device *rdev)
  1474. {
  1475. int r, i;
  1476. if (rdev->gart.robj == NULL) {
  1477. dev_err(rdev->dev, "No VRAM object for PCIE GART.\n");
  1478. return -EINVAL;
  1479. }
  1480. r = radeon_gart_table_vram_pin(rdev);
  1481. if (r)
  1482. return r;
  1483. radeon_gart_restore(rdev);
  1484. /* Setup TLB control */
  1485. WREG32(MC_VM_MX_L1_TLB_CNTL,
  1486. (0xA << 7) |
  1487. ENABLE_L1_TLB |
  1488. SYSTEM_ACCESS_MODE_NOT_IN_SYS |
  1489. ENABLE_ADVANCED_DRIVER_MODEL |
  1490. SYSTEM_APERTURE_UNMAPPED_ACCESS_PASS_THRU);
  1491. /* Setup L2 cache */
  1492. WREG32(VM_L2_CNTL, ENABLE_L2_CACHE |
  1493. ENABLE_L2_FRAGMENT_PROCESSING |
  1494. ENABLE_L2_PTE_CACHE_LRU_UPDATE_BY_WRITE |
  1495. ENABLE_L2_PDE0_CACHE_LRU_UPDATE_BY_WRITE |
  1496. EFFECTIVE_L2_QUEUE_SIZE(7) |
  1497. CONTEXT1_IDENTITY_ACCESS_MODE(1));
  1498. WREG32(VM_L2_CNTL2, INVALIDATE_ALL_L1_TLBS | INVALIDATE_L2_CACHE);
  1499. WREG32(VM_L2_CNTL3, L2_CACHE_BIGK_ASSOCIATIVITY |
  1500. L2_CACHE_BIGK_FRAGMENT_SIZE(6));
  1501. /* setup context0 */
  1502. WREG32(VM_CONTEXT0_PAGE_TABLE_START_ADDR, rdev->mc.gtt_start >> 12);
  1503. WREG32(VM_CONTEXT0_PAGE_TABLE_END_ADDR, rdev->mc.gtt_end >> 12);
  1504. WREG32(VM_CONTEXT0_PAGE_TABLE_BASE_ADDR, rdev->gart.table_addr >> 12);
  1505. WREG32(VM_CONTEXT0_PROTECTION_FAULT_DEFAULT_ADDR,
  1506. (u32)(rdev->dummy_page.addr >> 12));
  1507. WREG32(VM_CONTEXT0_CNTL2, 0);
  1508. WREG32(VM_CONTEXT0_CNTL, (ENABLE_CONTEXT | PAGE_TABLE_DEPTH(0) |
  1509. RANGE_PROTECTION_FAULT_ENABLE_DEFAULT));
  1510. WREG32(0x15D4, 0);
  1511. WREG32(0x15D8, 0);
  1512. WREG32(0x15DC, 0);
  1513. /* empty context1-15 */
  1514. /* FIXME start with 4G, once using 2 level pt switch to full
  1515. * vm size space
  1516. */
  1517. /* set vm size, must be a multiple of 4 */
  1518. WREG32(VM_CONTEXT1_PAGE_TABLE_START_ADDR, 0);
  1519. WREG32(VM_CONTEXT1_PAGE_TABLE_END_ADDR, rdev->vm_manager.max_pfn);
  1520. for (i = 1; i < 16; i++) {
  1521. if (i < 8)
  1522. WREG32(VM_CONTEXT0_PAGE_TABLE_BASE_ADDR + (i << 2),
  1523. rdev->gart.table_addr >> 12);
  1524. else
  1525. WREG32(VM_CONTEXT8_PAGE_TABLE_BASE_ADDR + ((i - 8) << 2),
  1526. rdev->gart.table_addr >> 12);
  1527. }
  1528. /* enable context1-15 */
  1529. WREG32(VM_CONTEXT1_PROTECTION_FAULT_DEFAULT_ADDR,
  1530. (u32)(rdev->dummy_page.addr >> 12));
  1531. WREG32(VM_CONTEXT1_CNTL2, 4);
  1532. WREG32(VM_CONTEXT1_CNTL, ENABLE_CONTEXT | PAGE_TABLE_DEPTH(1) |
  1533. RANGE_PROTECTION_FAULT_ENABLE_INTERRUPT |
  1534. RANGE_PROTECTION_FAULT_ENABLE_DEFAULT |
  1535. DUMMY_PAGE_PROTECTION_FAULT_ENABLE_INTERRUPT |
  1536. DUMMY_PAGE_PROTECTION_FAULT_ENABLE_DEFAULT |
  1537. PDE0_PROTECTION_FAULT_ENABLE_INTERRUPT |
  1538. PDE0_PROTECTION_FAULT_ENABLE_DEFAULT |
  1539. VALID_PROTECTION_FAULT_ENABLE_INTERRUPT |
  1540. VALID_PROTECTION_FAULT_ENABLE_DEFAULT |
  1541. READ_PROTECTION_FAULT_ENABLE_INTERRUPT |
  1542. READ_PROTECTION_FAULT_ENABLE_DEFAULT |
  1543. WRITE_PROTECTION_FAULT_ENABLE_INTERRUPT |
  1544. WRITE_PROTECTION_FAULT_ENABLE_DEFAULT);
  1545. /* TC cache setup ??? */
  1546. WREG32(TC_CFG_L1_LOAD_POLICY0, 0);
  1547. WREG32(TC_CFG_L1_LOAD_POLICY1, 0);
  1548. WREG32(TC_CFG_L1_STORE_POLICY, 0);
  1549. WREG32(TC_CFG_L2_LOAD_POLICY0, 0);
  1550. WREG32(TC_CFG_L2_LOAD_POLICY1, 0);
  1551. WREG32(TC_CFG_L2_STORE_POLICY0, 0);
  1552. WREG32(TC_CFG_L2_STORE_POLICY1, 0);
  1553. WREG32(TC_CFG_L2_ATOMIC_POLICY, 0);
  1554. WREG32(TC_CFG_L1_VOLATILE, 0);
  1555. WREG32(TC_CFG_L2_VOLATILE, 0);
  1556. if (rdev->family == CHIP_KAVERI) {
  1557. u32 tmp = RREG32(CHUB_CONTROL);
  1558. tmp &= ~BYPASS_VM;
  1559. WREG32(CHUB_CONTROL, tmp);
  1560. }
  1561. /* XXX SH_MEM regs */
  1562. /* where to put LDS, scratch, GPUVM in FSA64 space */
  1563. for (i = 0; i < 16; i++) {
  1564. WREG32(SRBM_GFX_CNTL, VMID(i));
  1565. WREG32(SH_MEM_CONFIG, 0);
  1566. WREG32(SH_MEM_APE1_BASE, 1);
  1567. WREG32(SH_MEM_APE1_LIMIT, 0);
  1568. WREG32(SH_MEM_BASES, 0);
  1569. }
  1570. WREG32(SRBM_GFX_CNTL, 0);
  1571. cik_pcie_gart_tlb_flush(rdev);
  1572. DRM_INFO("PCIE GART of %uM enabled (table at 0x%016llX).\n",
  1573. (unsigned)(rdev->mc.gtt_size >> 20),
  1574. (unsigned long long)rdev->gart.table_addr);
  1575. rdev->gart.ready = true;
  1576. return 0;
  1577. }
  1578. /**
  1579. * cik_pcie_gart_disable - gart disable
  1580. *
  1581. * @rdev: radeon_device pointer
  1582. *
  1583. * This disables all VM page table (CIK).
  1584. */
  1585. static void cik_pcie_gart_disable(struct radeon_device *rdev)
  1586. {
  1587. /* Disable all tables */
  1588. WREG32(VM_CONTEXT0_CNTL, 0);
  1589. WREG32(VM_CONTEXT1_CNTL, 0);
  1590. /* Setup TLB control */
  1591. WREG32(MC_VM_MX_L1_TLB_CNTL, SYSTEM_ACCESS_MODE_NOT_IN_SYS |
  1592. SYSTEM_APERTURE_UNMAPPED_ACCESS_PASS_THRU);
  1593. /* Setup L2 cache */
  1594. WREG32(VM_L2_CNTL,
  1595. ENABLE_L2_FRAGMENT_PROCESSING |
  1596. ENABLE_L2_PTE_CACHE_LRU_UPDATE_BY_WRITE |
  1597. ENABLE_L2_PDE0_CACHE_LRU_UPDATE_BY_WRITE |
  1598. EFFECTIVE_L2_QUEUE_SIZE(7) |
  1599. CONTEXT1_IDENTITY_ACCESS_MODE(1));
  1600. WREG32(VM_L2_CNTL2, 0);
  1601. WREG32(VM_L2_CNTL3, L2_CACHE_BIGK_ASSOCIATIVITY |
  1602. L2_CACHE_BIGK_FRAGMENT_SIZE(6));
  1603. radeon_gart_table_vram_unpin(rdev);
  1604. }
  1605. /**
  1606. * cik_pcie_gart_fini - vm fini callback
  1607. *
  1608. * @rdev: radeon_device pointer
  1609. *
  1610. * Tears down the driver GART/VM setup (CIK).
  1611. */
  1612. static void cik_pcie_gart_fini(struct radeon_device *rdev)
  1613. {
  1614. cik_pcie_gart_disable(rdev);
  1615. radeon_gart_table_vram_free(rdev);
  1616. radeon_gart_fini(rdev);
  1617. }
  1618. /* vm parser */
  1619. /**
  1620. * cik_ib_parse - vm ib_parse callback
  1621. *
  1622. * @rdev: radeon_device pointer
  1623. * @ib: indirect buffer pointer
  1624. *
  1625. * CIK uses hw IB checking so this is a nop (CIK).
  1626. */
  1627. int cik_ib_parse(struct radeon_device *rdev, struct radeon_ib *ib)
  1628. {
  1629. return 0;
  1630. }
  1631. /*
  1632. * vm
  1633. * VMID 0 is the physical GPU addresses as used by the kernel.
  1634. * VMIDs 1-15 are used for userspace clients and are handled
  1635. * by the radeon vm/hsa code.
  1636. */
  1637. /**
  1638. * cik_vm_init - cik vm init callback
  1639. *
  1640. * @rdev: radeon_device pointer
  1641. *
  1642. * Inits cik specific vm parameters (number of VMs, base of vram for
  1643. * VMIDs 1-15) (CIK).
  1644. * Returns 0 for success.
  1645. */
  1646. int cik_vm_init(struct radeon_device *rdev)
  1647. {
  1648. /* number of VMs */
  1649. rdev->vm_manager.nvm = 16;
  1650. /* base offset of vram pages */
  1651. if (rdev->flags & RADEON_IS_IGP) {
  1652. u64 tmp = RREG32(MC_VM_FB_OFFSET);
  1653. tmp <<= 22;
  1654. rdev->vm_manager.vram_base_offset = tmp;
  1655. } else
  1656. rdev->vm_manager.vram_base_offset = 0;
  1657. return 0;
  1658. }
  1659. /**
  1660. * cik_vm_fini - cik vm fini callback
  1661. *
  1662. * @rdev: radeon_device pointer
  1663. *
  1664. * Tear down any asic specific VM setup (CIK).
  1665. */
  1666. void cik_vm_fini(struct radeon_device *rdev)
  1667. {
  1668. }