cik.c 79 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700
  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. #include "cik_blit_shaders.h"
  34. /* GFX */
  35. #define CIK_PFP_UCODE_SIZE 2144
  36. #define CIK_ME_UCODE_SIZE 2144
  37. #define CIK_CE_UCODE_SIZE 2144
  38. /* compute */
  39. #define CIK_MEC_UCODE_SIZE 4192
  40. /* interrupts */
  41. #define BONAIRE_RLC_UCODE_SIZE 2048
  42. #define KB_RLC_UCODE_SIZE 2560
  43. #define KV_RLC_UCODE_SIZE 2560
  44. /* gddr controller */
  45. #define CIK_MC_UCODE_SIZE 7866
  46. MODULE_FIRMWARE("radeon/BONAIRE_pfp.bin");
  47. MODULE_FIRMWARE("radeon/BONAIRE_me.bin");
  48. MODULE_FIRMWARE("radeon/BONAIRE_ce.bin");
  49. MODULE_FIRMWARE("radeon/BONAIRE_mec.bin");
  50. MODULE_FIRMWARE("radeon/BONAIRE_mc.bin");
  51. MODULE_FIRMWARE("radeon/BONAIRE_rlc.bin");
  52. MODULE_FIRMWARE("radeon/KAVERI_pfp.bin");
  53. MODULE_FIRMWARE("radeon/KAVERI_me.bin");
  54. MODULE_FIRMWARE("radeon/KAVERI_ce.bin");
  55. MODULE_FIRMWARE("radeon/KAVERI_mec.bin");
  56. MODULE_FIRMWARE("radeon/KAVERI_rlc.bin");
  57. MODULE_FIRMWARE("radeon/KABINI_pfp.bin");
  58. MODULE_FIRMWARE("radeon/KABINI_me.bin");
  59. MODULE_FIRMWARE("radeon/KABINI_ce.bin");
  60. MODULE_FIRMWARE("radeon/KABINI_mec.bin");
  61. MODULE_FIRMWARE("radeon/KABINI_rlc.bin");
  62. extern void evergreen_mc_stop(struct radeon_device *rdev, struct evergreen_mc_save *save);
  63. extern void evergreen_mc_resume(struct radeon_device *rdev, struct evergreen_mc_save *save);
  64. extern void si_vram_gtt_location(struct radeon_device *rdev, struct radeon_mc *mc);
  65. #define BONAIRE_IO_MC_REGS_SIZE 36
  66. static const u32 bonaire_io_mc_regs[BONAIRE_IO_MC_REGS_SIZE][2] =
  67. {
  68. {0x00000070, 0x04400000},
  69. {0x00000071, 0x80c01803},
  70. {0x00000072, 0x00004004},
  71. {0x00000073, 0x00000100},
  72. {0x00000074, 0x00ff0000},
  73. {0x00000075, 0x34000000},
  74. {0x00000076, 0x08000014},
  75. {0x00000077, 0x00cc08ec},
  76. {0x00000078, 0x00000400},
  77. {0x00000079, 0x00000000},
  78. {0x0000007a, 0x04090000},
  79. {0x0000007c, 0x00000000},
  80. {0x0000007e, 0x4408a8e8},
  81. {0x0000007f, 0x00000304},
  82. {0x00000080, 0x00000000},
  83. {0x00000082, 0x00000001},
  84. {0x00000083, 0x00000002},
  85. {0x00000084, 0xf3e4f400},
  86. {0x00000085, 0x052024e3},
  87. {0x00000087, 0x00000000},
  88. {0x00000088, 0x01000000},
  89. {0x0000008a, 0x1c0a0000},
  90. {0x0000008b, 0xff010000},
  91. {0x0000008d, 0xffffefff},
  92. {0x0000008e, 0xfff3efff},
  93. {0x0000008f, 0xfff3efbf},
  94. {0x00000092, 0xf7ffffff},
  95. {0x00000093, 0xffffff7f},
  96. {0x00000095, 0x00101101},
  97. {0x00000096, 0x00000fff},
  98. {0x00000097, 0x00116fff},
  99. {0x00000098, 0x60010000},
  100. {0x00000099, 0x10010000},
  101. {0x0000009a, 0x00006000},
  102. {0x0000009b, 0x00001000},
  103. {0x0000009f, 0x00b48000}
  104. };
  105. /* ucode loading */
  106. /**
  107. * ci_mc_load_microcode - load MC ucode into the hw
  108. *
  109. * @rdev: radeon_device pointer
  110. *
  111. * Load the GDDR MC ucode into the hw (CIK).
  112. * Returns 0 on success, error on failure.
  113. */
  114. static int ci_mc_load_microcode(struct radeon_device *rdev)
  115. {
  116. const __be32 *fw_data;
  117. u32 running, blackout = 0;
  118. u32 *io_mc_regs;
  119. int i, ucode_size, regs_size;
  120. if (!rdev->mc_fw)
  121. return -EINVAL;
  122. switch (rdev->family) {
  123. case CHIP_BONAIRE:
  124. default:
  125. io_mc_regs = (u32 *)&bonaire_io_mc_regs;
  126. ucode_size = CIK_MC_UCODE_SIZE;
  127. regs_size = BONAIRE_IO_MC_REGS_SIZE;
  128. break;
  129. }
  130. running = RREG32(MC_SEQ_SUP_CNTL) & RUN_MASK;
  131. if (running == 0) {
  132. if (running) {
  133. blackout = RREG32(MC_SHARED_BLACKOUT_CNTL);
  134. WREG32(MC_SHARED_BLACKOUT_CNTL, blackout | 1);
  135. }
  136. /* reset the engine and set to writable */
  137. WREG32(MC_SEQ_SUP_CNTL, 0x00000008);
  138. WREG32(MC_SEQ_SUP_CNTL, 0x00000010);
  139. /* load mc io regs */
  140. for (i = 0; i < regs_size; i++) {
  141. WREG32(MC_SEQ_IO_DEBUG_INDEX, io_mc_regs[(i << 1)]);
  142. WREG32(MC_SEQ_IO_DEBUG_DATA, io_mc_regs[(i << 1) + 1]);
  143. }
  144. /* load the MC ucode */
  145. fw_data = (const __be32 *)rdev->mc_fw->data;
  146. for (i = 0; i < ucode_size; i++)
  147. WREG32(MC_SEQ_SUP_PGM, be32_to_cpup(fw_data++));
  148. /* put the engine back into the active state */
  149. WREG32(MC_SEQ_SUP_CNTL, 0x00000008);
  150. WREG32(MC_SEQ_SUP_CNTL, 0x00000004);
  151. WREG32(MC_SEQ_SUP_CNTL, 0x00000001);
  152. /* wait for training to complete */
  153. for (i = 0; i < rdev->usec_timeout; i++) {
  154. if (RREG32(MC_SEQ_TRAIN_WAKEUP_CNTL) & TRAIN_DONE_D0)
  155. break;
  156. udelay(1);
  157. }
  158. for (i = 0; i < rdev->usec_timeout; i++) {
  159. if (RREG32(MC_SEQ_TRAIN_WAKEUP_CNTL) & TRAIN_DONE_D1)
  160. break;
  161. udelay(1);
  162. }
  163. if (running)
  164. WREG32(MC_SHARED_BLACKOUT_CNTL, blackout);
  165. }
  166. return 0;
  167. }
  168. /**
  169. * cik_init_microcode - load ucode images from disk
  170. *
  171. * @rdev: radeon_device pointer
  172. *
  173. * Use the firmware interface to load the ucode images into
  174. * the driver (not loaded into hw).
  175. * Returns 0 on success, error on failure.
  176. */
  177. static int cik_init_microcode(struct radeon_device *rdev)
  178. {
  179. struct platform_device *pdev;
  180. const char *chip_name;
  181. size_t pfp_req_size, me_req_size, ce_req_size,
  182. mec_req_size, rlc_req_size, mc_req_size;
  183. char fw_name[30];
  184. int err;
  185. DRM_DEBUG("\n");
  186. pdev = platform_device_register_simple("radeon_cp", 0, NULL, 0);
  187. err = IS_ERR(pdev);
  188. if (err) {
  189. printk(KERN_ERR "radeon_cp: Failed to register firmware\n");
  190. return -EINVAL;
  191. }
  192. switch (rdev->family) {
  193. case CHIP_BONAIRE:
  194. chip_name = "BONAIRE";
  195. pfp_req_size = CIK_PFP_UCODE_SIZE * 4;
  196. me_req_size = CIK_ME_UCODE_SIZE * 4;
  197. ce_req_size = CIK_CE_UCODE_SIZE * 4;
  198. mec_req_size = CIK_MEC_UCODE_SIZE * 4;
  199. rlc_req_size = BONAIRE_RLC_UCODE_SIZE * 4;
  200. mc_req_size = CIK_MC_UCODE_SIZE * 4;
  201. break;
  202. case CHIP_KAVERI:
  203. chip_name = "KAVERI";
  204. pfp_req_size = CIK_PFP_UCODE_SIZE * 4;
  205. me_req_size = CIK_ME_UCODE_SIZE * 4;
  206. ce_req_size = CIK_CE_UCODE_SIZE * 4;
  207. mec_req_size = CIK_MEC_UCODE_SIZE * 4;
  208. rlc_req_size = KV_RLC_UCODE_SIZE * 4;
  209. break;
  210. case CHIP_KABINI:
  211. chip_name = "KABINI";
  212. pfp_req_size = CIK_PFP_UCODE_SIZE * 4;
  213. me_req_size = CIK_ME_UCODE_SIZE * 4;
  214. ce_req_size = CIK_CE_UCODE_SIZE * 4;
  215. mec_req_size = CIK_MEC_UCODE_SIZE * 4;
  216. rlc_req_size = KB_RLC_UCODE_SIZE * 4;
  217. break;
  218. default: BUG();
  219. }
  220. DRM_INFO("Loading %s Microcode\n", chip_name);
  221. snprintf(fw_name, sizeof(fw_name), "radeon/%s_pfp.bin", chip_name);
  222. err = request_firmware(&rdev->pfp_fw, fw_name, &pdev->dev);
  223. if (err)
  224. goto out;
  225. if (rdev->pfp_fw->size != pfp_req_size) {
  226. printk(KERN_ERR
  227. "cik_cp: Bogus length %zu in firmware \"%s\"\n",
  228. rdev->pfp_fw->size, fw_name);
  229. err = -EINVAL;
  230. goto out;
  231. }
  232. snprintf(fw_name, sizeof(fw_name), "radeon/%s_me.bin", chip_name);
  233. err = request_firmware(&rdev->me_fw, fw_name, &pdev->dev);
  234. if (err)
  235. goto out;
  236. if (rdev->me_fw->size != me_req_size) {
  237. printk(KERN_ERR
  238. "cik_cp: Bogus length %zu in firmware \"%s\"\n",
  239. rdev->me_fw->size, fw_name);
  240. err = -EINVAL;
  241. }
  242. snprintf(fw_name, sizeof(fw_name), "radeon/%s_ce.bin", chip_name);
  243. err = request_firmware(&rdev->ce_fw, fw_name, &pdev->dev);
  244. if (err)
  245. goto out;
  246. if (rdev->ce_fw->size != ce_req_size) {
  247. printk(KERN_ERR
  248. "cik_cp: Bogus length %zu in firmware \"%s\"\n",
  249. rdev->ce_fw->size, fw_name);
  250. err = -EINVAL;
  251. }
  252. snprintf(fw_name, sizeof(fw_name), "radeon/%s_mec.bin", chip_name);
  253. err = request_firmware(&rdev->mec_fw, fw_name, &pdev->dev);
  254. if (err)
  255. goto out;
  256. if (rdev->mec_fw->size != mec_req_size) {
  257. printk(KERN_ERR
  258. "cik_cp: Bogus length %zu in firmware \"%s\"\n",
  259. rdev->mec_fw->size, fw_name);
  260. err = -EINVAL;
  261. }
  262. snprintf(fw_name, sizeof(fw_name), "radeon/%s_rlc.bin", chip_name);
  263. err = request_firmware(&rdev->rlc_fw, fw_name, &pdev->dev);
  264. if (err)
  265. goto out;
  266. if (rdev->rlc_fw->size != rlc_req_size) {
  267. printk(KERN_ERR
  268. "cik_rlc: Bogus length %zu in firmware \"%s\"\n",
  269. rdev->rlc_fw->size, fw_name);
  270. err = -EINVAL;
  271. }
  272. /* No MC ucode on APUs */
  273. if (!(rdev->flags & RADEON_IS_IGP)) {
  274. snprintf(fw_name, sizeof(fw_name), "radeon/%s_mc.bin", chip_name);
  275. err = request_firmware(&rdev->mc_fw, fw_name, &pdev->dev);
  276. if (err)
  277. goto out;
  278. if (rdev->mc_fw->size != mc_req_size) {
  279. printk(KERN_ERR
  280. "cik_mc: Bogus length %zu in firmware \"%s\"\n",
  281. rdev->mc_fw->size, fw_name);
  282. err = -EINVAL;
  283. }
  284. }
  285. out:
  286. platform_device_unregister(pdev);
  287. if (err) {
  288. if (err != -EINVAL)
  289. printk(KERN_ERR
  290. "cik_cp: Failed to load firmware \"%s\"\n",
  291. fw_name);
  292. release_firmware(rdev->pfp_fw);
  293. rdev->pfp_fw = NULL;
  294. release_firmware(rdev->me_fw);
  295. rdev->me_fw = NULL;
  296. release_firmware(rdev->ce_fw);
  297. rdev->ce_fw = NULL;
  298. release_firmware(rdev->rlc_fw);
  299. rdev->rlc_fw = NULL;
  300. release_firmware(rdev->mc_fw);
  301. rdev->mc_fw = NULL;
  302. }
  303. return err;
  304. }
  305. /*
  306. * Core functions
  307. */
  308. /**
  309. * cik_tiling_mode_table_init - init the hw tiling table
  310. *
  311. * @rdev: radeon_device pointer
  312. *
  313. * Starting with SI, the tiling setup is done globally in a
  314. * set of 32 tiling modes. Rather than selecting each set of
  315. * parameters per surface as on older asics, we just select
  316. * which index in the tiling table we want to use, and the
  317. * surface uses those parameters (CIK).
  318. */
  319. static void cik_tiling_mode_table_init(struct radeon_device *rdev)
  320. {
  321. const u32 num_tile_mode_states = 32;
  322. const u32 num_secondary_tile_mode_states = 16;
  323. u32 reg_offset, gb_tile_moden, split_equal_to_row_size;
  324. u32 num_pipe_configs;
  325. u32 num_rbs = rdev->config.cik.max_backends_per_se *
  326. rdev->config.cik.max_shader_engines;
  327. switch (rdev->config.cik.mem_row_size_in_kb) {
  328. case 1:
  329. split_equal_to_row_size = ADDR_SURF_TILE_SPLIT_1KB;
  330. break;
  331. case 2:
  332. default:
  333. split_equal_to_row_size = ADDR_SURF_TILE_SPLIT_2KB;
  334. break;
  335. case 4:
  336. split_equal_to_row_size = ADDR_SURF_TILE_SPLIT_4KB;
  337. break;
  338. }
  339. num_pipe_configs = rdev->config.cik.max_tile_pipes;
  340. if (num_pipe_configs > 8)
  341. num_pipe_configs = 8; /* ??? */
  342. if (num_pipe_configs == 8) {
  343. for (reg_offset = 0; reg_offset < num_tile_mode_states; reg_offset++) {
  344. switch (reg_offset) {
  345. case 0:
  346. gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
  347. MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
  348. PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
  349. TILE_SPLIT(ADDR_SURF_TILE_SPLIT_64B));
  350. break;
  351. case 1:
  352. gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
  353. MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
  354. PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
  355. TILE_SPLIT(ADDR_SURF_TILE_SPLIT_128B));
  356. break;
  357. case 2:
  358. gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
  359. MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
  360. PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
  361. TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B));
  362. break;
  363. case 3:
  364. gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
  365. MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
  366. PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
  367. TILE_SPLIT(ADDR_SURF_TILE_SPLIT_512B));
  368. break;
  369. case 4:
  370. gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
  371. MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
  372. PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
  373. TILE_SPLIT(split_equal_to_row_size));
  374. break;
  375. case 5:
  376. gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
  377. MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING));
  378. break;
  379. case 6:
  380. gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
  381. MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
  382. PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
  383. TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B));
  384. break;
  385. case 7:
  386. gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
  387. MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
  388. PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
  389. TILE_SPLIT(split_equal_to_row_size));
  390. break;
  391. case 8:
  392. gb_tile_moden = (ARRAY_MODE(ARRAY_LINEAR_ALIGNED) |
  393. PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16));
  394. break;
  395. case 9:
  396. gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
  397. MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING));
  398. break;
  399. case 10:
  400. gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
  401. MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING) |
  402. PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
  403. SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
  404. break;
  405. case 11:
  406. gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
  407. MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING) |
  408. PIPE_CONFIG(ADDR_SURF_P8_32x32_8x16) |
  409. SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
  410. break;
  411. case 12:
  412. gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
  413. MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING) |
  414. PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
  415. SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
  416. break;
  417. case 13:
  418. gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
  419. MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING));
  420. break;
  421. case 14:
  422. gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
  423. MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
  424. PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
  425. SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
  426. break;
  427. case 16:
  428. gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
  429. MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
  430. PIPE_CONFIG(ADDR_SURF_P8_32x32_8x16) |
  431. SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
  432. break;
  433. case 17:
  434. gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
  435. MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
  436. PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
  437. SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
  438. break;
  439. case 27:
  440. gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
  441. MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING));
  442. break;
  443. case 28:
  444. gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
  445. MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING) |
  446. PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
  447. SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
  448. break;
  449. case 29:
  450. gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
  451. MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING) |
  452. PIPE_CONFIG(ADDR_SURF_P8_32x32_8x16) |
  453. SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
  454. break;
  455. case 30:
  456. gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
  457. MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING) |
  458. PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
  459. SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
  460. break;
  461. default:
  462. gb_tile_moden = 0;
  463. break;
  464. }
  465. WREG32(GB_TILE_MODE0 + (reg_offset * 4), gb_tile_moden);
  466. }
  467. for (reg_offset = 0; reg_offset < num_secondary_tile_mode_states; reg_offset++) {
  468. switch (reg_offset) {
  469. case 0:
  470. gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
  471. BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
  472. MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
  473. NUM_BANKS(ADDR_SURF_16_BANK));
  474. break;
  475. case 1:
  476. gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
  477. BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) |
  478. MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
  479. NUM_BANKS(ADDR_SURF_16_BANK));
  480. break;
  481. case 2:
  482. gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
  483. BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
  484. MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
  485. NUM_BANKS(ADDR_SURF_16_BANK));
  486. break;
  487. case 3:
  488. gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
  489. BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
  490. MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
  491. NUM_BANKS(ADDR_SURF_16_BANK));
  492. break;
  493. case 4:
  494. gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
  495. BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
  496. MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1) |
  497. NUM_BANKS(ADDR_SURF_8_BANK));
  498. break;
  499. case 5:
  500. gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
  501. BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
  502. MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1) |
  503. NUM_BANKS(ADDR_SURF_4_BANK));
  504. break;
  505. case 6:
  506. gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
  507. BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
  508. MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1) |
  509. NUM_BANKS(ADDR_SURF_2_BANK));
  510. break;
  511. case 8:
  512. gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
  513. BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_8) |
  514. MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
  515. NUM_BANKS(ADDR_SURF_16_BANK));
  516. break;
  517. case 9:
  518. gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
  519. BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
  520. MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
  521. NUM_BANKS(ADDR_SURF_16_BANK));
  522. break;
  523. case 10:
  524. gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
  525. BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) |
  526. MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
  527. NUM_BANKS(ADDR_SURF_16_BANK));
  528. break;
  529. case 11:
  530. gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
  531. BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
  532. MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
  533. NUM_BANKS(ADDR_SURF_16_BANK));
  534. break;
  535. case 12:
  536. gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
  537. BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
  538. MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1) |
  539. NUM_BANKS(ADDR_SURF_8_BANK));
  540. break;
  541. case 13:
  542. gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
  543. BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
  544. MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1) |
  545. NUM_BANKS(ADDR_SURF_4_BANK));
  546. break;
  547. case 14:
  548. gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
  549. BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
  550. MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1) |
  551. NUM_BANKS(ADDR_SURF_2_BANK));
  552. break;
  553. default:
  554. gb_tile_moden = 0;
  555. break;
  556. }
  557. WREG32(GB_MACROTILE_MODE0 + (reg_offset * 4), gb_tile_moden);
  558. }
  559. } else if (num_pipe_configs == 4) {
  560. if (num_rbs == 4) {
  561. for (reg_offset = 0; reg_offset < num_tile_mode_states; reg_offset++) {
  562. switch (reg_offset) {
  563. case 0:
  564. gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
  565. MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
  566. PIPE_CONFIG(ADDR_SURF_P4_16x16) |
  567. TILE_SPLIT(ADDR_SURF_TILE_SPLIT_64B));
  568. break;
  569. case 1:
  570. gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
  571. MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
  572. PIPE_CONFIG(ADDR_SURF_P4_16x16) |
  573. TILE_SPLIT(ADDR_SURF_TILE_SPLIT_128B));
  574. break;
  575. case 2:
  576. gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
  577. MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
  578. PIPE_CONFIG(ADDR_SURF_P4_16x16) |
  579. TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B));
  580. break;
  581. case 3:
  582. gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
  583. MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
  584. PIPE_CONFIG(ADDR_SURF_P4_16x16) |
  585. TILE_SPLIT(ADDR_SURF_TILE_SPLIT_512B));
  586. break;
  587. case 4:
  588. gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
  589. MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
  590. PIPE_CONFIG(ADDR_SURF_P4_16x16) |
  591. TILE_SPLIT(split_equal_to_row_size));
  592. break;
  593. case 5:
  594. gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
  595. MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING));
  596. break;
  597. case 6:
  598. gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
  599. MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
  600. PIPE_CONFIG(ADDR_SURF_P4_16x16) |
  601. TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B));
  602. break;
  603. case 7:
  604. gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
  605. MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
  606. PIPE_CONFIG(ADDR_SURF_P4_16x16) |
  607. TILE_SPLIT(split_equal_to_row_size));
  608. break;
  609. case 8:
  610. gb_tile_moden = (ARRAY_MODE(ARRAY_LINEAR_ALIGNED) |
  611. PIPE_CONFIG(ADDR_SURF_P4_16x16));
  612. break;
  613. case 9:
  614. gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
  615. MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING));
  616. break;
  617. case 10:
  618. gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
  619. MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING) |
  620. PIPE_CONFIG(ADDR_SURF_P4_16x16) |
  621. SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
  622. break;
  623. case 11:
  624. gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
  625. MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING) |
  626. PIPE_CONFIG(ADDR_SURF_P4_8x16) |
  627. SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
  628. break;
  629. case 12:
  630. gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
  631. MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING) |
  632. PIPE_CONFIG(ADDR_SURF_P4_16x16) |
  633. SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
  634. break;
  635. case 13:
  636. gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
  637. MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING));
  638. break;
  639. case 14:
  640. gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
  641. MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
  642. PIPE_CONFIG(ADDR_SURF_P4_16x16) |
  643. SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
  644. break;
  645. case 16:
  646. gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
  647. MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
  648. PIPE_CONFIG(ADDR_SURF_P4_8x16) |
  649. SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
  650. break;
  651. case 17:
  652. gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
  653. MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
  654. PIPE_CONFIG(ADDR_SURF_P4_16x16) |
  655. SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
  656. break;
  657. case 27:
  658. gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
  659. MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING));
  660. break;
  661. case 28:
  662. gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
  663. MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING) |
  664. PIPE_CONFIG(ADDR_SURF_P4_16x16) |
  665. SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
  666. break;
  667. case 29:
  668. gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
  669. MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING) |
  670. PIPE_CONFIG(ADDR_SURF_P4_8x16) |
  671. SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
  672. break;
  673. case 30:
  674. gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
  675. MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING) |
  676. PIPE_CONFIG(ADDR_SURF_P4_16x16) |
  677. SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
  678. break;
  679. default:
  680. gb_tile_moden = 0;
  681. break;
  682. }
  683. WREG32(GB_TILE_MODE0 + (reg_offset * 4), gb_tile_moden);
  684. }
  685. } else if (num_rbs < 4) {
  686. for (reg_offset = 0; reg_offset < num_tile_mode_states; reg_offset++) {
  687. switch (reg_offset) {
  688. case 0:
  689. gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
  690. MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
  691. PIPE_CONFIG(ADDR_SURF_P4_8x16) |
  692. TILE_SPLIT(ADDR_SURF_TILE_SPLIT_64B));
  693. break;
  694. case 1:
  695. gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
  696. MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
  697. PIPE_CONFIG(ADDR_SURF_P4_8x16) |
  698. TILE_SPLIT(ADDR_SURF_TILE_SPLIT_128B));
  699. break;
  700. case 2:
  701. gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
  702. MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
  703. PIPE_CONFIG(ADDR_SURF_P4_8x16) |
  704. TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B));
  705. break;
  706. case 3:
  707. gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
  708. MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
  709. PIPE_CONFIG(ADDR_SURF_P4_8x16) |
  710. TILE_SPLIT(ADDR_SURF_TILE_SPLIT_512B));
  711. break;
  712. case 4:
  713. gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
  714. MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
  715. PIPE_CONFIG(ADDR_SURF_P4_8x16) |
  716. TILE_SPLIT(split_equal_to_row_size));
  717. break;
  718. case 5:
  719. gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
  720. MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING));
  721. break;
  722. case 6:
  723. gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
  724. MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
  725. PIPE_CONFIG(ADDR_SURF_P4_8x16) |
  726. TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B));
  727. break;
  728. case 7:
  729. gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
  730. MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
  731. PIPE_CONFIG(ADDR_SURF_P4_8x16) |
  732. TILE_SPLIT(split_equal_to_row_size));
  733. break;
  734. case 8:
  735. gb_tile_moden = (ARRAY_MODE(ARRAY_LINEAR_ALIGNED) |
  736. PIPE_CONFIG(ADDR_SURF_P4_8x16));
  737. break;
  738. case 9:
  739. gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
  740. MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING));
  741. break;
  742. case 10:
  743. gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
  744. MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING) |
  745. PIPE_CONFIG(ADDR_SURF_P4_8x16) |
  746. SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
  747. break;
  748. case 11:
  749. gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
  750. MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING) |
  751. PIPE_CONFIG(ADDR_SURF_P4_8x16) |
  752. SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
  753. break;
  754. case 12:
  755. gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
  756. MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING) |
  757. PIPE_CONFIG(ADDR_SURF_P4_8x16) |
  758. SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
  759. break;
  760. case 13:
  761. gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
  762. MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING));
  763. break;
  764. case 14:
  765. gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
  766. MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
  767. PIPE_CONFIG(ADDR_SURF_P4_8x16) |
  768. SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
  769. break;
  770. case 16:
  771. gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
  772. MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
  773. PIPE_CONFIG(ADDR_SURF_P4_8x16) |
  774. SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
  775. break;
  776. case 17:
  777. gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
  778. MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
  779. PIPE_CONFIG(ADDR_SURF_P4_8x16) |
  780. SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
  781. break;
  782. case 27:
  783. gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
  784. MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING));
  785. break;
  786. case 28:
  787. gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
  788. MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING) |
  789. PIPE_CONFIG(ADDR_SURF_P4_8x16) |
  790. SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
  791. break;
  792. case 29:
  793. gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
  794. MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING) |
  795. PIPE_CONFIG(ADDR_SURF_P4_8x16) |
  796. SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
  797. break;
  798. case 30:
  799. gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
  800. MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING) |
  801. PIPE_CONFIG(ADDR_SURF_P4_8x16) |
  802. SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
  803. break;
  804. default:
  805. gb_tile_moden = 0;
  806. break;
  807. }
  808. WREG32(GB_TILE_MODE0 + (reg_offset * 4), gb_tile_moden);
  809. }
  810. }
  811. for (reg_offset = 0; reg_offset < num_secondary_tile_mode_states; reg_offset++) {
  812. switch (reg_offset) {
  813. case 0:
  814. gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
  815. BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
  816. MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
  817. NUM_BANKS(ADDR_SURF_16_BANK));
  818. break;
  819. case 1:
  820. gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
  821. BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) |
  822. MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
  823. NUM_BANKS(ADDR_SURF_16_BANK));
  824. break;
  825. case 2:
  826. gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
  827. BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
  828. MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
  829. NUM_BANKS(ADDR_SURF_16_BANK));
  830. break;
  831. case 3:
  832. gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
  833. BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
  834. MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
  835. NUM_BANKS(ADDR_SURF_16_BANK));
  836. break;
  837. case 4:
  838. gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
  839. BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
  840. MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
  841. NUM_BANKS(ADDR_SURF_16_BANK));
  842. break;
  843. case 5:
  844. gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
  845. BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
  846. MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
  847. NUM_BANKS(ADDR_SURF_8_BANK));
  848. break;
  849. case 6:
  850. gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
  851. BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
  852. MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1) |
  853. NUM_BANKS(ADDR_SURF_4_BANK));
  854. break;
  855. case 8:
  856. gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_2) |
  857. BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_8) |
  858. MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
  859. NUM_BANKS(ADDR_SURF_16_BANK));
  860. break;
  861. case 9:
  862. gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_2) |
  863. BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
  864. MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
  865. NUM_BANKS(ADDR_SURF_16_BANK));
  866. break;
  867. case 10:
  868. gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
  869. BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
  870. MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
  871. NUM_BANKS(ADDR_SURF_16_BANK));
  872. break;
  873. case 11:
  874. gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
  875. BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) |
  876. MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
  877. NUM_BANKS(ADDR_SURF_16_BANK));
  878. break;
  879. case 12:
  880. gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
  881. BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
  882. MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
  883. NUM_BANKS(ADDR_SURF_16_BANK));
  884. break;
  885. case 13:
  886. gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
  887. BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
  888. MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
  889. NUM_BANKS(ADDR_SURF_8_BANK));
  890. break;
  891. case 14:
  892. gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
  893. BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
  894. MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1) |
  895. NUM_BANKS(ADDR_SURF_4_BANK));
  896. break;
  897. default:
  898. gb_tile_moden = 0;
  899. break;
  900. }
  901. WREG32(GB_MACROTILE_MODE0 + (reg_offset * 4), gb_tile_moden);
  902. }
  903. } else if (num_pipe_configs == 2) {
  904. for (reg_offset = 0; reg_offset < num_tile_mode_states; reg_offset++) {
  905. switch (reg_offset) {
  906. case 0:
  907. gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
  908. MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
  909. PIPE_CONFIG(ADDR_SURF_P2) |
  910. TILE_SPLIT(ADDR_SURF_TILE_SPLIT_64B));
  911. break;
  912. case 1:
  913. gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
  914. MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
  915. PIPE_CONFIG(ADDR_SURF_P2) |
  916. TILE_SPLIT(ADDR_SURF_TILE_SPLIT_128B));
  917. break;
  918. case 2:
  919. gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
  920. MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
  921. PIPE_CONFIG(ADDR_SURF_P2) |
  922. TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B));
  923. break;
  924. case 3:
  925. gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
  926. MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
  927. PIPE_CONFIG(ADDR_SURF_P2) |
  928. TILE_SPLIT(ADDR_SURF_TILE_SPLIT_512B));
  929. break;
  930. case 4:
  931. gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
  932. MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
  933. PIPE_CONFIG(ADDR_SURF_P2) |
  934. TILE_SPLIT(split_equal_to_row_size));
  935. break;
  936. case 5:
  937. gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
  938. MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING));
  939. break;
  940. case 6:
  941. gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
  942. MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
  943. PIPE_CONFIG(ADDR_SURF_P2) |
  944. TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B));
  945. break;
  946. case 7:
  947. gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
  948. MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
  949. PIPE_CONFIG(ADDR_SURF_P2) |
  950. TILE_SPLIT(split_equal_to_row_size));
  951. break;
  952. case 8:
  953. gb_tile_moden = ARRAY_MODE(ARRAY_LINEAR_ALIGNED);
  954. break;
  955. case 9:
  956. gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
  957. MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING));
  958. break;
  959. case 10:
  960. gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
  961. MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING) |
  962. PIPE_CONFIG(ADDR_SURF_P2) |
  963. SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
  964. break;
  965. case 11:
  966. gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
  967. MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING) |
  968. PIPE_CONFIG(ADDR_SURF_P2) |
  969. SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
  970. break;
  971. case 12:
  972. gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
  973. MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING) |
  974. PIPE_CONFIG(ADDR_SURF_P2) |
  975. SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
  976. break;
  977. case 13:
  978. gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
  979. MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING));
  980. break;
  981. case 14:
  982. gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
  983. MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
  984. PIPE_CONFIG(ADDR_SURF_P2) |
  985. SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
  986. break;
  987. case 16:
  988. gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
  989. MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
  990. PIPE_CONFIG(ADDR_SURF_P2) |
  991. SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
  992. break;
  993. case 17:
  994. gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
  995. MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
  996. PIPE_CONFIG(ADDR_SURF_P2) |
  997. SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
  998. break;
  999. case 27:
  1000. gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
  1001. MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING));
  1002. break;
  1003. case 28:
  1004. gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
  1005. MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING) |
  1006. PIPE_CONFIG(ADDR_SURF_P2) |
  1007. SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
  1008. break;
  1009. case 29:
  1010. gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
  1011. MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING) |
  1012. PIPE_CONFIG(ADDR_SURF_P2) |
  1013. SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
  1014. break;
  1015. case 30:
  1016. gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
  1017. MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING) |
  1018. PIPE_CONFIG(ADDR_SURF_P2) |
  1019. SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
  1020. break;
  1021. default:
  1022. gb_tile_moden = 0;
  1023. break;
  1024. }
  1025. WREG32(GB_TILE_MODE0 + (reg_offset * 4), gb_tile_moden);
  1026. }
  1027. for (reg_offset = 0; reg_offset < num_secondary_tile_mode_states; reg_offset++) {
  1028. switch (reg_offset) {
  1029. case 0:
  1030. gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_2) |
  1031. BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
  1032. MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
  1033. NUM_BANKS(ADDR_SURF_16_BANK));
  1034. break;
  1035. case 1:
  1036. gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_2) |
  1037. BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) |
  1038. MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
  1039. NUM_BANKS(ADDR_SURF_16_BANK));
  1040. break;
  1041. case 2:
  1042. gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
  1043. BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) |
  1044. MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
  1045. NUM_BANKS(ADDR_SURF_16_BANK));
  1046. break;
  1047. case 3:
  1048. gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
  1049. BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
  1050. MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
  1051. NUM_BANKS(ADDR_SURF_16_BANK));
  1052. break;
  1053. case 4:
  1054. gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
  1055. BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
  1056. MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
  1057. NUM_BANKS(ADDR_SURF_16_BANK));
  1058. break;
  1059. case 5:
  1060. gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
  1061. BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
  1062. MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
  1063. NUM_BANKS(ADDR_SURF_16_BANK));
  1064. break;
  1065. case 6:
  1066. gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
  1067. BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
  1068. MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
  1069. NUM_BANKS(ADDR_SURF_8_BANK));
  1070. break;
  1071. case 8:
  1072. gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_4) |
  1073. BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_8) |
  1074. MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
  1075. NUM_BANKS(ADDR_SURF_16_BANK));
  1076. break;
  1077. case 9:
  1078. gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_4) |
  1079. BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
  1080. MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
  1081. NUM_BANKS(ADDR_SURF_16_BANK));
  1082. break;
  1083. case 10:
  1084. gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_2) |
  1085. BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
  1086. MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
  1087. NUM_BANKS(ADDR_SURF_16_BANK));
  1088. break;
  1089. case 11:
  1090. gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_2) |
  1091. BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) |
  1092. MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
  1093. NUM_BANKS(ADDR_SURF_16_BANK));
  1094. break;
  1095. case 12:
  1096. gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
  1097. BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) |
  1098. MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
  1099. NUM_BANKS(ADDR_SURF_16_BANK));
  1100. break;
  1101. case 13:
  1102. gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
  1103. BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
  1104. MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
  1105. NUM_BANKS(ADDR_SURF_16_BANK));
  1106. break;
  1107. case 14:
  1108. gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
  1109. BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
  1110. MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
  1111. NUM_BANKS(ADDR_SURF_8_BANK));
  1112. break;
  1113. default:
  1114. gb_tile_moden = 0;
  1115. break;
  1116. }
  1117. WREG32(GB_MACROTILE_MODE0 + (reg_offset * 4), gb_tile_moden);
  1118. }
  1119. } else
  1120. DRM_ERROR("unknown num pipe config: 0x%x\n", num_pipe_configs);
  1121. }
  1122. /**
  1123. * cik_select_se_sh - select which SE, SH to address
  1124. *
  1125. * @rdev: radeon_device pointer
  1126. * @se_num: shader engine to address
  1127. * @sh_num: sh block to address
  1128. *
  1129. * Select which SE, SH combinations to address. Certain
  1130. * registers are instanced per SE or SH. 0xffffffff means
  1131. * broadcast to all SEs or SHs (CIK).
  1132. */
  1133. static void cik_select_se_sh(struct radeon_device *rdev,
  1134. u32 se_num, u32 sh_num)
  1135. {
  1136. u32 data = INSTANCE_BROADCAST_WRITES;
  1137. if ((se_num == 0xffffffff) && (sh_num == 0xffffffff))
  1138. data = SH_BROADCAST_WRITES | SE_BROADCAST_WRITES;
  1139. else if (se_num == 0xffffffff)
  1140. data |= SE_BROADCAST_WRITES | SH_INDEX(sh_num);
  1141. else if (sh_num == 0xffffffff)
  1142. data |= SH_BROADCAST_WRITES | SE_INDEX(se_num);
  1143. else
  1144. data |= SH_INDEX(sh_num) | SE_INDEX(se_num);
  1145. WREG32(GRBM_GFX_INDEX, data);
  1146. }
  1147. /**
  1148. * cik_create_bitmask - create a bitmask
  1149. *
  1150. * @bit_width: length of the mask
  1151. *
  1152. * create a variable length bit mask (CIK).
  1153. * Returns the bitmask.
  1154. */
  1155. static u32 cik_create_bitmask(u32 bit_width)
  1156. {
  1157. u32 i, mask = 0;
  1158. for (i = 0; i < bit_width; i++) {
  1159. mask <<= 1;
  1160. mask |= 1;
  1161. }
  1162. return mask;
  1163. }
  1164. /**
  1165. * cik_select_se_sh - select which SE, SH to address
  1166. *
  1167. * @rdev: radeon_device pointer
  1168. * @max_rb_num: max RBs (render backends) for the asic
  1169. * @se_num: number of SEs (shader engines) for the asic
  1170. * @sh_per_se: number of SH blocks per SE for the asic
  1171. *
  1172. * Calculates the bitmask of disabled RBs (CIK).
  1173. * Returns the disabled RB bitmask.
  1174. */
  1175. static u32 cik_get_rb_disabled(struct radeon_device *rdev,
  1176. u32 max_rb_num, u32 se_num,
  1177. u32 sh_per_se)
  1178. {
  1179. u32 data, mask;
  1180. data = RREG32(CC_RB_BACKEND_DISABLE);
  1181. if (data & 1)
  1182. data &= BACKEND_DISABLE_MASK;
  1183. else
  1184. data = 0;
  1185. data |= RREG32(GC_USER_RB_BACKEND_DISABLE);
  1186. data >>= BACKEND_DISABLE_SHIFT;
  1187. mask = cik_create_bitmask(max_rb_num / se_num / sh_per_se);
  1188. return data & mask;
  1189. }
  1190. /**
  1191. * cik_setup_rb - setup the RBs on the asic
  1192. *
  1193. * @rdev: radeon_device pointer
  1194. * @se_num: number of SEs (shader engines) for the asic
  1195. * @sh_per_se: number of SH blocks per SE for the asic
  1196. * @max_rb_num: max RBs (render backends) for the asic
  1197. *
  1198. * Configures per-SE/SH RB registers (CIK).
  1199. */
  1200. static void cik_setup_rb(struct radeon_device *rdev,
  1201. u32 se_num, u32 sh_per_se,
  1202. u32 max_rb_num)
  1203. {
  1204. int i, j;
  1205. u32 data, mask;
  1206. u32 disabled_rbs = 0;
  1207. u32 enabled_rbs = 0;
  1208. for (i = 0; i < se_num; i++) {
  1209. for (j = 0; j < sh_per_se; j++) {
  1210. cik_select_se_sh(rdev, i, j);
  1211. data = cik_get_rb_disabled(rdev, max_rb_num, se_num, sh_per_se);
  1212. disabled_rbs |= data << ((i * sh_per_se + j) * CIK_RB_BITMAP_WIDTH_PER_SH);
  1213. }
  1214. }
  1215. cik_select_se_sh(rdev, 0xffffffff, 0xffffffff);
  1216. mask = 1;
  1217. for (i = 0; i < max_rb_num; i++) {
  1218. if (!(disabled_rbs & mask))
  1219. enabled_rbs |= mask;
  1220. mask <<= 1;
  1221. }
  1222. for (i = 0; i < se_num; i++) {
  1223. cik_select_se_sh(rdev, i, 0xffffffff);
  1224. data = 0;
  1225. for (j = 0; j < sh_per_se; j++) {
  1226. switch (enabled_rbs & 3) {
  1227. case 1:
  1228. data |= (RASTER_CONFIG_RB_MAP_0 << (i * sh_per_se + j) * 2);
  1229. break;
  1230. case 2:
  1231. data |= (RASTER_CONFIG_RB_MAP_3 << (i * sh_per_se + j) * 2);
  1232. break;
  1233. case 3:
  1234. default:
  1235. data |= (RASTER_CONFIG_RB_MAP_2 << (i * sh_per_se + j) * 2);
  1236. break;
  1237. }
  1238. enabled_rbs >>= 2;
  1239. }
  1240. WREG32(PA_SC_RASTER_CONFIG, data);
  1241. }
  1242. cik_select_se_sh(rdev, 0xffffffff, 0xffffffff);
  1243. }
  1244. /**
  1245. * cik_gpu_init - setup the 3D engine
  1246. *
  1247. * @rdev: radeon_device pointer
  1248. *
  1249. * Configures the 3D engine and tiling configuration
  1250. * registers so that the 3D engine is usable.
  1251. */
  1252. static void cik_gpu_init(struct radeon_device *rdev)
  1253. {
  1254. u32 gb_addr_config = RREG32(GB_ADDR_CONFIG);
  1255. u32 mc_shared_chmap, mc_arb_ramcfg;
  1256. u32 hdp_host_path_cntl;
  1257. u32 tmp;
  1258. int i, j;
  1259. switch (rdev->family) {
  1260. case CHIP_BONAIRE:
  1261. rdev->config.cik.max_shader_engines = 2;
  1262. rdev->config.cik.max_tile_pipes = 4;
  1263. rdev->config.cik.max_cu_per_sh = 7;
  1264. rdev->config.cik.max_sh_per_se = 1;
  1265. rdev->config.cik.max_backends_per_se = 2;
  1266. rdev->config.cik.max_texture_channel_caches = 4;
  1267. rdev->config.cik.max_gprs = 256;
  1268. rdev->config.cik.max_gs_threads = 32;
  1269. rdev->config.cik.max_hw_contexts = 8;
  1270. rdev->config.cik.sc_prim_fifo_size_frontend = 0x20;
  1271. rdev->config.cik.sc_prim_fifo_size_backend = 0x100;
  1272. rdev->config.cik.sc_hiz_tile_fifo_size = 0x30;
  1273. rdev->config.cik.sc_earlyz_tile_fifo_size = 0x130;
  1274. gb_addr_config = BONAIRE_GB_ADDR_CONFIG_GOLDEN;
  1275. break;
  1276. case CHIP_KAVERI:
  1277. /* TODO */
  1278. break;
  1279. case CHIP_KABINI:
  1280. default:
  1281. rdev->config.cik.max_shader_engines = 1;
  1282. rdev->config.cik.max_tile_pipes = 2;
  1283. rdev->config.cik.max_cu_per_sh = 2;
  1284. rdev->config.cik.max_sh_per_se = 1;
  1285. rdev->config.cik.max_backends_per_se = 1;
  1286. rdev->config.cik.max_texture_channel_caches = 2;
  1287. rdev->config.cik.max_gprs = 256;
  1288. rdev->config.cik.max_gs_threads = 16;
  1289. rdev->config.cik.max_hw_contexts = 8;
  1290. rdev->config.cik.sc_prim_fifo_size_frontend = 0x20;
  1291. rdev->config.cik.sc_prim_fifo_size_backend = 0x100;
  1292. rdev->config.cik.sc_hiz_tile_fifo_size = 0x30;
  1293. rdev->config.cik.sc_earlyz_tile_fifo_size = 0x130;
  1294. gb_addr_config = BONAIRE_GB_ADDR_CONFIG_GOLDEN;
  1295. break;
  1296. }
  1297. /* Initialize HDP */
  1298. for (i = 0, j = 0; i < 32; i++, j += 0x18) {
  1299. WREG32((0x2c14 + j), 0x00000000);
  1300. WREG32((0x2c18 + j), 0x00000000);
  1301. WREG32((0x2c1c + j), 0x00000000);
  1302. WREG32((0x2c20 + j), 0x00000000);
  1303. WREG32((0x2c24 + j), 0x00000000);
  1304. }
  1305. WREG32(GRBM_CNTL, GRBM_READ_TIMEOUT(0xff));
  1306. WREG32(BIF_FB_EN, FB_READ_EN | FB_WRITE_EN);
  1307. mc_shared_chmap = RREG32(MC_SHARED_CHMAP);
  1308. mc_arb_ramcfg = RREG32(MC_ARB_RAMCFG);
  1309. rdev->config.cik.num_tile_pipes = rdev->config.cik.max_tile_pipes;
  1310. rdev->config.cik.mem_max_burst_length_bytes = 256;
  1311. tmp = (mc_arb_ramcfg & NOOFCOLS_MASK) >> NOOFCOLS_SHIFT;
  1312. rdev->config.cik.mem_row_size_in_kb = (4 * (1 << (8 + tmp))) / 1024;
  1313. if (rdev->config.cik.mem_row_size_in_kb > 4)
  1314. rdev->config.cik.mem_row_size_in_kb = 4;
  1315. /* XXX use MC settings? */
  1316. rdev->config.cik.shader_engine_tile_size = 32;
  1317. rdev->config.cik.num_gpus = 1;
  1318. rdev->config.cik.multi_gpu_tile_size = 64;
  1319. /* fix up row size */
  1320. gb_addr_config &= ~ROW_SIZE_MASK;
  1321. switch (rdev->config.cik.mem_row_size_in_kb) {
  1322. case 1:
  1323. default:
  1324. gb_addr_config |= ROW_SIZE(0);
  1325. break;
  1326. case 2:
  1327. gb_addr_config |= ROW_SIZE(1);
  1328. break;
  1329. case 4:
  1330. gb_addr_config |= ROW_SIZE(2);
  1331. break;
  1332. }
  1333. /* setup tiling info dword. gb_addr_config is not adequate since it does
  1334. * not have bank info, so create a custom tiling dword.
  1335. * bits 3:0 num_pipes
  1336. * bits 7:4 num_banks
  1337. * bits 11:8 group_size
  1338. * bits 15:12 row_size
  1339. */
  1340. rdev->config.cik.tile_config = 0;
  1341. switch (rdev->config.cik.num_tile_pipes) {
  1342. case 1:
  1343. rdev->config.cik.tile_config |= (0 << 0);
  1344. break;
  1345. case 2:
  1346. rdev->config.cik.tile_config |= (1 << 0);
  1347. break;
  1348. case 4:
  1349. rdev->config.cik.tile_config |= (2 << 0);
  1350. break;
  1351. case 8:
  1352. default:
  1353. /* XXX what about 12? */
  1354. rdev->config.cik.tile_config |= (3 << 0);
  1355. break;
  1356. }
  1357. if ((mc_arb_ramcfg & NOOFBANK_MASK) >> NOOFBANK_SHIFT)
  1358. rdev->config.cik.tile_config |= 1 << 4;
  1359. else
  1360. rdev->config.cik.tile_config |= 0 << 4;
  1361. rdev->config.cik.tile_config |=
  1362. ((gb_addr_config & PIPE_INTERLEAVE_SIZE_MASK) >> PIPE_INTERLEAVE_SIZE_SHIFT) << 8;
  1363. rdev->config.cik.tile_config |=
  1364. ((gb_addr_config & ROW_SIZE_MASK) >> ROW_SIZE_SHIFT) << 12;
  1365. WREG32(GB_ADDR_CONFIG, gb_addr_config);
  1366. WREG32(HDP_ADDR_CONFIG, gb_addr_config);
  1367. WREG32(DMIF_ADDR_CALC, gb_addr_config);
  1368. cik_tiling_mode_table_init(rdev);
  1369. cik_setup_rb(rdev, rdev->config.cik.max_shader_engines,
  1370. rdev->config.cik.max_sh_per_se,
  1371. rdev->config.cik.max_backends_per_se);
  1372. /* set HW defaults for 3D engine */
  1373. WREG32(CP_MEQ_THRESHOLDS, MEQ1_START(0x30) | MEQ2_START(0x60));
  1374. WREG32(SX_DEBUG_1, 0x20);
  1375. WREG32(TA_CNTL_AUX, 0x00010000);
  1376. tmp = RREG32(SPI_CONFIG_CNTL);
  1377. tmp |= 0x03000000;
  1378. WREG32(SPI_CONFIG_CNTL, tmp);
  1379. WREG32(SQ_CONFIG, 1);
  1380. WREG32(DB_DEBUG, 0);
  1381. tmp = RREG32(DB_DEBUG2) & ~0xf00fffff;
  1382. tmp |= 0x00000400;
  1383. WREG32(DB_DEBUG2, tmp);
  1384. tmp = RREG32(DB_DEBUG3) & ~0x0002021c;
  1385. tmp |= 0x00020200;
  1386. WREG32(DB_DEBUG3, tmp);
  1387. tmp = RREG32(CB_HW_CONTROL) & ~0x00010000;
  1388. tmp |= 0x00018208;
  1389. WREG32(CB_HW_CONTROL, tmp);
  1390. WREG32(SPI_CONFIG_CNTL_1, VTX_DONE_DELAY(4));
  1391. WREG32(PA_SC_FIFO_SIZE, (SC_FRONTEND_PRIM_FIFO_SIZE(rdev->config.cik.sc_prim_fifo_size_frontend) |
  1392. SC_BACKEND_PRIM_FIFO_SIZE(rdev->config.cik.sc_prim_fifo_size_backend) |
  1393. SC_HIZ_TILE_FIFO_SIZE(rdev->config.cik.sc_hiz_tile_fifo_size) |
  1394. SC_EARLYZ_TILE_FIFO_SIZE(rdev->config.cik.sc_earlyz_tile_fifo_size)));
  1395. WREG32(VGT_NUM_INSTANCES, 1);
  1396. WREG32(CP_PERFMON_CNTL, 0);
  1397. WREG32(SQ_CONFIG, 0);
  1398. WREG32(PA_SC_FORCE_EOV_MAX_CNTS, (FORCE_EOV_MAX_CLK_CNT(4095) |
  1399. FORCE_EOV_MAX_REZ_CNT(255)));
  1400. WREG32(VGT_CACHE_INVALIDATION, CACHE_INVALIDATION(VC_AND_TC) |
  1401. AUTO_INVLD_EN(ES_AND_GS_AUTO));
  1402. WREG32(VGT_GS_VERTEX_REUSE, 16);
  1403. WREG32(PA_SC_LINE_STIPPLE_STATE, 0);
  1404. tmp = RREG32(HDP_MISC_CNTL);
  1405. tmp |= HDP_FLUSH_INVALIDATE_CACHE;
  1406. WREG32(HDP_MISC_CNTL, tmp);
  1407. hdp_host_path_cntl = RREG32(HDP_HOST_PATH_CNTL);
  1408. WREG32(HDP_HOST_PATH_CNTL, hdp_host_path_cntl);
  1409. WREG32(PA_CL_ENHANCE, CLIP_VTX_REORDER_ENA | NUM_CLIP_SEQ(3));
  1410. WREG32(PA_SC_ENHANCE, ENABLE_PA_SC_OUT_OF_ORDER);
  1411. udelay(50);
  1412. }
  1413. /*
  1414. * GPU scratch registers helpers function.
  1415. */
  1416. /**
  1417. * cik_scratch_init - setup driver info for CP scratch regs
  1418. *
  1419. * @rdev: radeon_device pointer
  1420. *
  1421. * Set up the number and offset of the CP scratch registers.
  1422. * NOTE: use of CP scratch registers is a legacy inferface and
  1423. * is not used by default on newer asics (r6xx+). On newer asics,
  1424. * memory buffers are used for fences rather than scratch regs.
  1425. */
  1426. static void cik_scratch_init(struct radeon_device *rdev)
  1427. {
  1428. int i;
  1429. rdev->scratch.num_reg = 7;
  1430. rdev->scratch.reg_base = SCRATCH_REG0;
  1431. for (i = 0; i < rdev->scratch.num_reg; i++) {
  1432. rdev->scratch.free[i] = true;
  1433. rdev->scratch.reg[i] = rdev->scratch.reg_base + (i * 4);
  1434. }
  1435. }
  1436. /**
  1437. * cik_ring_test - basic gfx ring test
  1438. *
  1439. * @rdev: radeon_device pointer
  1440. * @ring: radeon_ring structure holding ring information
  1441. *
  1442. * Allocate a scratch register and write to it using the gfx ring (CIK).
  1443. * Provides a basic gfx ring test to verify that the ring is working.
  1444. * Used by cik_cp_gfx_resume();
  1445. * Returns 0 on success, error on failure.
  1446. */
  1447. int cik_ring_test(struct radeon_device *rdev, struct radeon_ring *ring)
  1448. {
  1449. uint32_t scratch;
  1450. uint32_t tmp = 0;
  1451. unsigned i;
  1452. int r;
  1453. r = radeon_scratch_get(rdev, &scratch);
  1454. if (r) {
  1455. DRM_ERROR("radeon: cp failed to get scratch reg (%d).\n", r);
  1456. return r;
  1457. }
  1458. WREG32(scratch, 0xCAFEDEAD);
  1459. r = radeon_ring_lock(rdev, ring, 3);
  1460. if (r) {
  1461. DRM_ERROR("radeon: cp failed to lock ring %d (%d).\n", ring->idx, r);
  1462. radeon_scratch_free(rdev, scratch);
  1463. return r;
  1464. }
  1465. radeon_ring_write(ring, PACKET3(PACKET3_SET_UCONFIG_REG, 1));
  1466. radeon_ring_write(ring, ((scratch - PACKET3_SET_UCONFIG_REG_START) >> 2));
  1467. radeon_ring_write(ring, 0xDEADBEEF);
  1468. radeon_ring_unlock_commit(rdev, ring);
  1469. for (i = 0; i < rdev->usec_timeout; i++) {
  1470. tmp = RREG32(scratch);
  1471. if (tmp == 0xDEADBEEF)
  1472. break;
  1473. DRM_UDELAY(1);
  1474. }
  1475. if (i < rdev->usec_timeout) {
  1476. DRM_INFO("ring test on %d succeeded in %d usecs\n", ring->idx, i);
  1477. } else {
  1478. DRM_ERROR("radeon: ring %d test failed (scratch(0x%04X)=0x%08X)\n",
  1479. ring->idx, scratch, tmp);
  1480. r = -EINVAL;
  1481. }
  1482. radeon_scratch_free(rdev, scratch);
  1483. return r;
  1484. }
  1485. /**
  1486. * cik_fence_ring_emit - emit a fence on the gfx ring
  1487. *
  1488. * @rdev: radeon_device pointer
  1489. * @fence: radeon fence object
  1490. *
  1491. * Emits a fence sequnce number on the gfx ring and flushes
  1492. * GPU caches.
  1493. */
  1494. void cik_fence_ring_emit(struct radeon_device *rdev,
  1495. struct radeon_fence *fence)
  1496. {
  1497. struct radeon_ring *ring = &rdev->ring[fence->ring];
  1498. u64 addr = rdev->fence_drv[fence->ring].gpu_addr;
  1499. /* EVENT_WRITE_EOP - flush caches, send int */
  1500. radeon_ring_write(ring, PACKET3(PACKET3_EVENT_WRITE_EOP, 4));
  1501. radeon_ring_write(ring, (EOP_TCL1_ACTION_EN |
  1502. EOP_TC_ACTION_EN |
  1503. EVENT_TYPE(CACHE_FLUSH_AND_INV_TS_EVENT) |
  1504. EVENT_INDEX(5)));
  1505. radeon_ring_write(ring, addr & 0xfffffffc);
  1506. radeon_ring_write(ring, (upper_32_bits(addr) & 0xffff) | DATA_SEL(1) | INT_SEL(2));
  1507. radeon_ring_write(ring, fence->seq);
  1508. radeon_ring_write(ring, 0);
  1509. /* HDP flush */
  1510. /* We should be using the new WAIT_REG_MEM special op packet here
  1511. * but it causes the CP to hang
  1512. */
  1513. radeon_ring_write(ring, PACKET3(PACKET3_WRITE_DATA, 3));
  1514. radeon_ring_write(ring, (WRITE_DATA_ENGINE_SEL(0) |
  1515. WRITE_DATA_DST_SEL(0)));
  1516. radeon_ring_write(ring, HDP_MEM_COHERENCY_FLUSH_CNTL >> 2);
  1517. radeon_ring_write(ring, 0);
  1518. radeon_ring_write(ring, 0);
  1519. }
  1520. void cik_semaphore_ring_emit(struct radeon_device *rdev,
  1521. struct radeon_ring *ring,
  1522. struct radeon_semaphore *semaphore,
  1523. bool emit_wait)
  1524. {
  1525. uint64_t addr = semaphore->gpu_addr;
  1526. unsigned sel = emit_wait ? PACKET3_SEM_SEL_WAIT : PACKET3_SEM_SEL_SIGNAL;
  1527. radeon_ring_write(ring, PACKET3(PACKET3_MEM_SEMAPHORE, 1));
  1528. radeon_ring_write(ring, addr & 0xffffffff);
  1529. radeon_ring_write(ring, (upper_32_bits(addr) & 0xffff) | sel);
  1530. }
  1531. /*
  1532. * IB stuff
  1533. */
  1534. /**
  1535. * cik_ring_ib_execute - emit an IB (Indirect Buffer) on the gfx ring
  1536. *
  1537. * @rdev: radeon_device pointer
  1538. * @ib: radeon indirect buffer object
  1539. *
  1540. * Emits an DE (drawing engine) or CE (constant engine) IB
  1541. * on the gfx ring. IBs are usually generated by userspace
  1542. * acceleration drivers and submitted to the kernel for
  1543. * sheduling on the ring. This function schedules the IB
  1544. * on the gfx ring for execution by the GPU.
  1545. */
  1546. void cik_ring_ib_execute(struct radeon_device *rdev, struct radeon_ib *ib)
  1547. {
  1548. struct radeon_ring *ring = &rdev->ring[ib->ring];
  1549. u32 header, control = INDIRECT_BUFFER_VALID;
  1550. if (ib->is_const_ib) {
  1551. /* set switch buffer packet before const IB */
  1552. radeon_ring_write(ring, PACKET3(PACKET3_SWITCH_BUFFER, 0));
  1553. radeon_ring_write(ring, 0);
  1554. header = PACKET3(PACKET3_INDIRECT_BUFFER_CONST, 2);
  1555. } else {
  1556. u32 next_rptr;
  1557. if (ring->rptr_save_reg) {
  1558. next_rptr = ring->wptr + 3 + 4;
  1559. radeon_ring_write(ring, PACKET3(PACKET3_SET_UCONFIG_REG, 1));
  1560. radeon_ring_write(ring, ((ring->rptr_save_reg -
  1561. PACKET3_SET_UCONFIG_REG_START) >> 2));
  1562. radeon_ring_write(ring, next_rptr);
  1563. } else if (rdev->wb.enabled) {
  1564. next_rptr = ring->wptr + 5 + 4;
  1565. radeon_ring_write(ring, PACKET3(PACKET3_WRITE_DATA, 3));
  1566. radeon_ring_write(ring, WRITE_DATA_DST_SEL(1));
  1567. radeon_ring_write(ring, ring->next_rptr_gpu_addr & 0xfffffffc);
  1568. radeon_ring_write(ring, upper_32_bits(ring->next_rptr_gpu_addr) & 0xffffffff);
  1569. radeon_ring_write(ring, next_rptr);
  1570. }
  1571. header = PACKET3(PACKET3_INDIRECT_BUFFER, 2);
  1572. }
  1573. control |= ib->length_dw |
  1574. (ib->vm ? (ib->vm->id << 24) : 0);
  1575. radeon_ring_write(ring, header);
  1576. radeon_ring_write(ring,
  1577. #ifdef __BIG_ENDIAN
  1578. (2 << 0) |
  1579. #endif
  1580. (ib->gpu_addr & 0xFFFFFFFC));
  1581. radeon_ring_write(ring, upper_32_bits(ib->gpu_addr) & 0xFFFF);
  1582. radeon_ring_write(ring, control);
  1583. }
  1584. /**
  1585. * cik_ib_test - basic gfx ring IB test
  1586. *
  1587. * @rdev: radeon_device pointer
  1588. * @ring: radeon_ring structure holding ring information
  1589. *
  1590. * Allocate an IB and execute it on the gfx ring (CIK).
  1591. * Provides a basic gfx ring test to verify that IBs are working.
  1592. * Returns 0 on success, error on failure.
  1593. */
  1594. int cik_ib_test(struct radeon_device *rdev, struct radeon_ring *ring)
  1595. {
  1596. struct radeon_ib ib;
  1597. uint32_t scratch;
  1598. uint32_t tmp = 0;
  1599. unsigned i;
  1600. int r;
  1601. r = radeon_scratch_get(rdev, &scratch);
  1602. if (r) {
  1603. DRM_ERROR("radeon: failed to get scratch reg (%d).\n", r);
  1604. return r;
  1605. }
  1606. WREG32(scratch, 0xCAFEDEAD);
  1607. r = radeon_ib_get(rdev, ring->idx, &ib, NULL, 256);
  1608. if (r) {
  1609. DRM_ERROR("radeon: failed to get ib (%d).\n", r);
  1610. return r;
  1611. }
  1612. ib.ptr[0] = PACKET3(PACKET3_SET_UCONFIG_REG, 1);
  1613. ib.ptr[1] = ((scratch - PACKET3_SET_UCONFIG_REG_START) >> 2);
  1614. ib.ptr[2] = 0xDEADBEEF;
  1615. ib.length_dw = 3;
  1616. r = radeon_ib_schedule(rdev, &ib, NULL);
  1617. if (r) {
  1618. radeon_scratch_free(rdev, scratch);
  1619. radeon_ib_free(rdev, &ib);
  1620. DRM_ERROR("radeon: failed to schedule ib (%d).\n", r);
  1621. return r;
  1622. }
  1623. r = radeon_fence_wait(ib.fence, false);
  1624. if (r) {
  1625. DRM_ERROR("radeon: fence wait failed (%d).\n", r);
  1626. return r;
  1627. }
  1628. for (i = 0; i < rdev->usec_timeout; i++) {
  1629. tmp = RREG32(scratch);
  1630. if (tmp == 0xDEADBEEF)
  1631. break;
  1632. DRM_UDELAY(1);
  1633. }
  1634. if (i < rdev->usec_timeout) {
  1635. DRM_INFO("ib test on ring %d succeeded in %u usecs\n", ib.fence->ring, i);
  1636. } else {
  1637. DRM_ERROR("radeon: ib test failed (scratch(0x%04X)=0x%08X)\n",
  1638. scratch, tmp);
  1639. r = -EINVAL;
  1640. }
  1641. radeon_scratch_free(rdev, scratch);
  1642. radeon_ib_free(rdev, &ib);
  1643. return r;
  1644. }
  1645. /*
  1646. * CP.
  1647. * On CIK, gfx and compute now have independant command processors.
  1648. *
  1649. * GFX
  1650. * Gfx consists of a single ring and can process both gfx jobs and
  1651. * compute jobs. The gfx CP consists of three microengines (ME):
  1652. * PFP - Pre-Fetch Parser
  1653. * ME - Micro Engine
  1654. * CE - Constant Engine
  1655. * The PFP and ME make up what is considered the Drawing Engine (DE).
  1656. * The CE is an asynchronous engine used for updating buffer desciptors
  1657. * used by the DE so that they can be loaded into cache in parallel
  1658. * while the DE is processing state update packets.
  1659. *
  1660. * Compute
  1661. * The compute CP consists of two microengines (ME):
  1662. * MEC1 - Compute MicroEngine 1
  1663. * MEC2 - Compute MicroEngine 2
  1664. * Each MEC supports 4 compute pipes and each pipe supports 8 queues.
  1665. * The queues are exposed to userspace and are programmed directly
  1666. * by the compute runtime.
  1667. */
  1668. /**
  1669. * cik_cp_gfx_enable - enable/disable the gfx CP MEs
  1670. *
  1671. * @rdev: radeon_device pointer
  1672. * @enable: enable or disable the MEs
  1673. *
  1674. * Halts or unhalts the gfx MEs.
  1675. */
  1676. static void cik_cp_gfx_enable(struct radeon_device *rdev, bool enable)
  1677. {
  1678. if (enable)
  1679. WREG32(CP_ME_CNTL, 0);
  1680. else {
  1681. WREG32(CP_ME_CNTL, (CP_ME_HALT | CP_PFP_HALT | CP_CE_HALT));
  1682. rdev->ring[RADEON_RING_TYPE_GFX_INDEX].ready = false;
  1683. }
  1684. udelay(50);
  1685. }
  1686. /**
  1687. * cik_cp_gfx_load_microcode - load the gfx CP ME ucode
  1688. *
  1689. * @rdev: radeon_device pointer
  1690. *
  1691. * Loads the gfx PFP, ME, and CE ucode.
  1692. * Returns 0 for success, -EINVAL if the ucode is not available.
  1693. */
  1694. static int cik_cp_gfx_load_microcode(struct radeon_device *rdev)
  1695. {
  1696. const __be32 *fw_data;
  1697. int i;
  1698. if (!rdev->me_fw || !rdev->pfp_fw || !rdev->ce_fw)
  1699. return -EINVAL;
  1700. cik_cp_gfx_enable(rdev, false);
  1701. /* PFP */
  1702. fw_data = (const __be32 *)rdev->pfp_fw->data;
  1703. WREG32(CP_PFP_UCODE_ADDR, 0);
  1704. for (i = 0; i < CIK_PFP_UCODE_SIZE; i++)
  1705. WREG32(CP_PFP_UCODE_DATA, be32_to_cpup(fw_data++));
  1706. WREG32(CP_PFP_UCODE_ADDR, 0);
  1707. /* CE */
  1708. fw_data = (const __be32 *)rdev->ce_fw->data;
  1709. WREG32(CP_CE_UCODE_ADDR, 0);
  1710. for (i = 0; i < CIK_CE_UCODE_SIZE; i++)
  1711. WREG32(CP_CE_UCODE_DATA, be32_to_cpup(fw_data++));
  1712. WREG32(CP_CE_UCODE_ADDR, 0);
  1713. /* ME */
  1714. fw_data = (const __be32 *)rdev->me_fw->data;
  1715. WREG32(CP_ME_RAM_WADDR, 0);
  1716. for (i = 0; i < CIK_ME_UCODE_SIZE; i++)
  1717. WREG32(CP_ME_RAM_DATA, be32_to_cpup(fw_data++));
  1718. WREG32(CP_ME_RAM_WADDR, 0);
  1719. WREG32(CP_PFP_UCODE_ADDR, 0);
  1720. WREG32(CP_CE_UCODE_ADDR, 0);
  1721. WREG32(CP_ME_RAM_WADDR, 0);
  1722. WREG32(CP_ME_RAM_RADDR, 0);
  1723. return 0;
  1724. }
  1725. /**
  1726. * cik_cp_gfx_start - start the gfx ring
  1727. *
  1728. * @rdev: radeon_device pointer
  1729. *
  1730. * Enables the ring and loads the clear state context and other
  1731. * packets required to init the ring.
  1732. * Returns 0 for success, error for failure.
  1733. */
  1734. static int cik_cp_gfx_start(struct radeon_device *rdev)
  1735. {
  1736. struct radeon_ring *ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX];
  1737. int r, i;
  1738. /* init the CP */
  1739. WREG32(CP_MAX_CONTEXT, rdev->config.cik.max_hw_contexts - 1);
  1740. WREG32(CP_ENDIAN_SWAP, 0);
  1741. WREG32(CP_DEVICE_ID, 1);
  1742. cik_cp_gfx_enable(rdev, true);
  1743. r = radeon_ring_lock(rdev, ring, cik_default_size + 17);
  1744. if (r) {
  1745. DRM_ERROR("radeon: cp failed to lock ring (%d).\n", r);
  1746. return r;
  1747. }
  1748. /* init the CE partitions. CE only used for gfx on CIK */
  1749. radeon_ring_write(ring, PACKET3(PACKET3_SET_BASE, 2));
  1750. radeon_ring_write(ring, PACKET3_BASE_INDEX(CE_PARTITION_BASE));
  1751. radeon_ring_write(ring, 0xc000);
  1752. radeon_ring_write(ring, 0xc000);
  1753. /* setup clear context state */
  1754. radeon_ring_write(ring, PACKET3(PACKET3_PREAMBLE_CNTL, 0));
  1755. radeon_ring_write(ring, PACKET3_PREAMBLE_BEGIN_CLEAR_STATE);
  1756. radeon_ring_write(ring, PACKET3(PACKET3_CONTEXT_CONTROL, 1));
  1757. radeon_ring_write(ring, 0x80000000);
  1758. radeon_ring_write(ring, 0x80000000);
  1759. for (i = 0; i < cik_default_size; i++)
  1760. radeon_ring_write(ring, cik_default_state[i]);
  1761. radeon_ring_write(ring, PACKET3(PACKET3_PREAMBLE_CNTL, 0));
  1762. radeon_ring_write(ring, PACKET3_PREAMBLE_END_CLEAR_STATE);
  1763. /* set clear context state */
  1764. radeon_ring_write(ring, PACKET3(PACKET3_CLEAR_STATE, 0));
  1765. radeon_ring_write(ring, 0);
  1766. radeon_ring_write(ring, PACKET3(PACKET3_SET_CONTEXT_REG, 2));
  1767. radeon_ring_write(ring, 0x00000316);
  1768. radeon_ring_write(ring, 0x0000000e); /* VGT_VERTEX_REUSE_BLOCK_CNTL */
  1769. radeon_ring_write(ring, 0x00000010); /* VGT_OUT_DEALLOC_CNTL */
  1770. radeon_ring_unlock_commit(rdev, ring);
  1771. return 0;
  1772. }
  1773. /**
  1774. * cik_cp_gfx_fini - stop the gfx ring
  1775. *
  1776. * @rdev: radeon_device pointer
  1777. *
  1778. * Stop the gfx ring and tear down the driver ring
  1779. * info.
  1780. */
  1781. static void cik_cp_gfx_fini(struct radeon_device *rdev)
  1782. {
  1783. cik_cp_gfx_enable(rdev, false);
  1784. radeon_ring_fini(rdev, &rdev->ring[RADEON_RING_TYPE_GFX_INDEX]);
  1785. }
  1786. /**
  1787. * cik_cp_gfx_resume - setup the gfx ring buffer registers
  1788. *
  1789. * @rdev: radeon_device pointer
  1790. *
  1791. * Program the location and size of the gfx ring buffer
  1792. * and test it to make sure it's working.
  1793. * Returns 0 for success, error for failure.
  1794. */
  1795. static int cik_cp_gfx_resume(struct radeon_device *rdev)
  1796. {
  1797. struct radeon_ring *ring;
  1798. u32 tmp;
  1799. u32 rb_bufsz;
  1800. u64 rb_addr;
  1801. int r;
  1802. WREG32(CP_SEM_WAIT_TIMER, 0x0);
  1803. WREG32(CP_SEM_INCOMPLETE_TIMER_CNTL, 0x0);
  1804. /* Set the write pointer delay */
  1805. WREG32(CP_RB_WPTR_DELAY, 0);
  1806. /* set the RB to use vmid 0 */
  1807. WREG32(CP_RB_VMID, 0);
  1808. WREG32(SCRATCH_ADDR, ((rdev->wb.gpu_addr + RADEON_WB_SCRATCH_OFFSET) >> 8) & 0xFFFFFFFF);
  1809. /* ring 0 - compute and gfx */
  1810. /* Set ring buffer size */
  1811. ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX];
  1812. rb_bufsz = drm_order(ring->ring_size / 8);
  1813. tmp = (drm_order(RADEON_GPU_PAGE_SIZE/8) << 8) | rb_bufsz;
  1814. #ifdef __BIG_ENDIAN
  1815. tmp |= BUF_SWAP_32BIT;
  1816. #endif
  1817. WREG32(CP_RB0_CNTL, tmp);
  1818. /* Initialize the ring buffer's read and write pointers */
  1819. WREG32(CP_RB0_CNTL, tmp | RB_RPTR_WR_ENA);
  1820. ring->wptr = 0;
  1821. WREG32(CP_RB0_WPTR, ring->wptr);
  1822. /* set the wb address wether it's enabled or not */
  1823. WREG32(CP_RB0_RPTR_ADDR, (rdev->wb.gpu_addr + RADEON_WB_CP_RPTR_OFFSET) & 0xFFFFFFFC);
  1824. WREG32(CP_RB0_RPTR_ADDR_HI, upper_32_bits(rdev->wb.gpu_addr + RADEON_WB_CP_RPTR_OFFSET) & 0xFF);
  1825. /* scratch register shadowing is no longer supported */
  1826. WREG32(SCRATCH_UMSK, 0);
  1827. if (!rdev->wb.enabled)
  1828. tmp |= RB_NO_UPDATE;
  1829. mdelay(1);
  1830. WREG32(CP_RB0_CNTL, tmp);
  1831. rb_addr = ring->gpu_addr >> 8;
  1832. WREG32(CP_RB0_BASE, rb_addr);
  1833. WREG32(CP_RB0_BASE_HI, upper_32_bits(rb_addr));
  1834. ring->rptr = RREG32(CP_RB0_RPTR);
  1835. /* start the ring */
  1836. cik_cp_gfx_start(rdev);
  1837. rdev->ring[RADEON_RING_TYPE_GFX_INDEX].ready = true;
  1838. r = radeon_ring_test(rdev, RADEON_RING_TYPE_GFX_INDEX, &rdev->ring[RADEON_RING_TYPE_GFX_INDEX]);
  1839. if (r) {
  1840. rdev->ring[RADEON_RING_TYPE_GFX_INDEX].ready = false;
  1841. return r;
  1842. }
  1843. return 0;
  1844. }
  1845. /**
  1846. * cik_cp_compute_enable - enable/disable the compute CP MEs
  1847. *
  1848. * @rdev: radeon_device pointer
  1849. * @enable: enable or disable the MEs
  1850. *
  1851. * Halts or unhalts the compute MEs.
  1852. */
  1853. static void cik_cp_compute_enable(struct radeon_device *rdev, bool enable)
  1854. {
  1855. if (enable)
  1856. WREG32(CP_MEC_CNTL, 0);
  1857. else
  1858. WREG32(CP_MEC_CNTL, (MEC_ME1_HALT | MEC_ME2_HALT));
  1859. udelay(50);
  1860. }
  1861. /**
  1862. * cik_cp_compute_load_microcode - load the compute CP ME ucode
  1863. *
  1864. * @rdev: radeon_device pointer
  1865. *
  1866. * Loads the compute MEC1&2 ucode.
  1867. * Returns 0 for success, -EINVAL if the ucode is not available.
  1868. */
  1869. static int cik_cp_compute_load_microcode(struct radeon_device *rdev)
  1870. {
  1871. const __be32 *fw_data;
  1872. int i;
  1873. if (!rdev->mec_fw)
  1874. return -EINVAL;
  1875. cik_cp_compute_enable(rdev, false);
  1876. /* MEC1 */
  1877. fw_data = (const __be32 *)rdev->mec_fw->data;
  1878. WREG32(CP_MEC_ME1_UCODE_ADDR, 0);
  1879. for (i = 0; i < CIK_MEC_UCODE_SIZE; i++)
  1880. WREG32(CP_MEC_ME1_UCODE_DATA, be32_to_cpup(fw_data++));
  1881. WREG32(CP_MEC_ME1_UCODE_ADDR, 0);
  1882. if (rdev->family == CHIP_KAVERI) {
  1883. /* MEC2 */
  1884. fw_data = (const __be32 *)rdev->mec_fw->data;
  1885. WREG32(CP_MEC_ME2_UCODE_ADDR, 0);
  1886. for (i = 0; i < CIK_MEC_UCODE_SIZE; i++)
  1887. WREG32(CP_MEC_ME2_UCODE_DATA, be32_to_cpup(fw_data++));
  1888. WREG32(CP_MEC_ME2_UCODE_ADDR, 0);
  1889. }
  1890. return 0;
  1891. }
  1892. /**
  1893. * cik_cp_compute_start - start the compute queues
  1894. *
  1895. * @rdev: radeon_device pointer
  1896. *
  1897. * Enable the compute queues.
  1898. * Returns 0 for success, error for failure.
  1899. */
  1900. static int cik_cp_compute_start(struct radeon_device *rdev)
  1901. {
  1902. //todo
  1903. return 0;
  1904. }
  1905. /**
  1906. * cik_cp_compute_fini - stop the compute queues
  1907. *
  1908. * @rdev: radeon_device pointer
  1909. *
  1910. * Stop the compute queues and tear down the driver queue
  1911. * info.
  1912. */
  1913. static void cik_cp_compute_fini(struct radeon_device *rdev)
  1914. {
  1915. cik_cp_compute_enable(rdev, false);
  1916. //todo
  1917. }
  1918. /**
  1919. * cik_cp_compute_resume - setup the compute queue registers
  1920. *
  1921. * @rdev: radeon_device pointer
  1922. *
  1923. * Program the compute queues and test them to make sure they
  1924. * are working.
  1925. * Returns 0 for success, error for failure.
  1926. */
  1927. static int cik_cp_compute_resume(struct radeon_device *rdev)
  1928. {
  1929. int r;
  1930. //todo
  1931. r = cik_cp_compute_start(rdev);
  1932. if (r)
  1933. return r;
  1934. return 0;
  1935. }
  1936. /* XXX temporary wrappers to handle both compute and gfx */
  1937. /* XXX */
  1938. static void cik_cp_enable(struct radeon_device *rdev, bool enable)
  1939. {
  1940. cik_cp_gfx_enable(rdev, enable);
  1941. cik_cp_compute_enable(rdev, enable);
  1942. }
  1943. /* XXX */
  1944. static int cik_cp_load_microcode(struct radeon_device *rdev)
  1945. {
  1946. int r;
  1947. r = cik_cp_gfx_load_microcode(rdev);
  1948. if (r)
  1949. return r;
  1950. r = cik_cp_compute_load_microcode(rdev);
  1951. if (r)
  1952. return r;
  1953. return 0;
  1954. }
  1955. /* XXX */
  1956. static void cik_cp_fini(struct radeon_device *rdev)
  1957. {
  1958. cik_cp_gfx_fini(rdev);
  1959. cik_cp_compute_fini(rdev);
  1960. }
  1961. /* XXX */
  1962. static int cik_cp_resume(struct radeon_device *rdev)
  1963. {
  1964. int r;
  1965. /* Reset all cp blocks */
  1966. WREG32(GRBM_SOFT_RESET, SOFT_RESET_CP);
  1967. RREG32(GRBM_SOFT_RESET);
  1968. mdelay(15);
  1969. WREG32(GRBM_SOFT_RESET, 0);
  1970. RREG32(GRBM_SOFT_RESET);
  1971. r = cik_cp_load_microcode(rdev);
  1972. if (r)
  1973. return r;
  1974. r = cik_cp_gfx_resume(rdev);
  1975. if (r)
  1976. return r;
  1977. r = cik_cp_compute_resume(rdev);
  1978. if (r)
  1979. return r;
  1980. return 0;
  1981. }
  1982. /**
  1983. * cik_gpu_is_lockup - check if the 3D engine is locked up
  1984. *
  1985. * @rdev: radeon_device pointer
  1986. * @ring: radeon_ring structure holding ring information
  1987. *
  1988. * Check if the 3D engine is locked up (CIK).
  1989. * Returns true if the engine is locked, false if not.
  1990. */
  1991. bool cik_gpu_is_lockup(struct radeon_device *rdev, struct radeon_ring *ring)
  1992. {
  1993. u32 srbm_status, srbm_status2;
  1994. u32 grbm_status, grbm_status2;
  1995. u32 grbm_status_se0, grbm_status_se1, grbm_status_se2, grbm_status_se3;
  1996. srbm_status = RREG32(SRBM_STATUS);
  1997. srbm_status2 = RREG32(SRBM_STATUS2);
  1998. grbm_status = RREG32(GRBM_STATUS);
  1999. grbm_status2 = RREG32(GRBM_STATUS2);
  2000. grbm_status_se0 = RREG32(GRBM_STATUS_SE0);
  2001. grbm_status_se1 = RREG32(GRBM_STATUS_SE1);
  2002. grbm_status_se2 = RREG32(GRBM_STATUS_SE2);
  2003. grbm_status_se3 = RREG32(GRBM_STATUS_SE3);
  2004. if (!(grbm_status & GUI_ACTIVE)) {
  2005. radeon_ring_lockup_update(ring);
  2006. return false;
  2007. }
  2008. /* force CP activities */
  2009. radeon_ring_force_activity(rdev, ring);
  2010. return radeon_ring_test_lockup(rdev, ring);
  2011. }
  2012. /**
  2013. * cik_gfx_gpu_soft_reset - soft reset the 3D engine and CPG
  2014. *
  2015. * @rdev: radeon_device pointer
  2016. *
  2017. * Soft reset the GFX engine and CPG blocks (CIK).
  2018. * XXX: deal with reseting RLC and CPF
  2019. * Returns 0 for success.
  2020. */
  2021. static int cik_gfx_gpu_soft_reset(struct radeon_device *rdev)
  2022. {
  2023. struct evergreen_mc_save save;
  2024. u32 grbm_reset = 0;
  2025. if (!(RREG32(GRBM_STATUS) & GUI_ACTIVE))
  2026. return 0;
  2027. dev_info(rdev->dev, "GPU GFX softreset \n");
  2028. dev_info(rdev->dev, " GRBM_STATUS=0x%08X\n",
  2029. RREG32(GRBM_STATUS));
  2030. dev_info(rdev->dev, " GRBM_STATUS2=0x%08X\n",
  2031. RREG32(GRBM_STATUS2));
  2032. dev_info(rdev->dev, " GRBM_STATUS_SE0=0x%08X\n",
  2033. RREG32(GRBM_STATUS_SE0));
  2034. dev_info(rdev->dev, " GRBM_STATUS_SE1=0x%08X\n",
  2035. RREG32(GRBM_STATUS_SE1));
  2036. dev_info(rdev->dev, " GRBM_STATUS_SE2=0x%08X\n",
  2037. RREG32(GRBM_STATUS_SE2));
  2038. dev_info(rdev->dev, " GRBM_STATUS_SE3=0x%08X\n",
  2039. RREG32(GRBM_STATUS_SE3));
  2040. dev_info(rdev->dev, " SRBM_STATUS=0x%08X\n",
  2041. RREG32(SRBM_STATUS));
  2042. dev_info(rdev->dev, " SRBM_STATUS2=0x%08X\n",
  2043. RREG32(SRBM_STATUS2));
  2044. evergreen_mc_stop(rdev, &save);
  2045. if (radeon_mc_wait_for_idle(rdev)) {
  2046. dev_warn(rdev->dev, "Wait for MC idle timedout !\n");
  2047. }
  2048. /* Disable CP parsing/prefetching */
  2049. WREG32(CP_ME_CNTL, CP_ME_HALT | CP_PFP_HALT | CP_CE_HALT);
  2050. /* reset all the gfx block and all CPG blocks */
  2051. grbm_reset = SOFT_RESET_CPG | SOFT_RESET_GFX;
  2052. dev_info(rdev->dev, " GRBM_SOFT_RESET=0x%08X\n", grbm_reset);
  2053. WREG32(GRBM_SOFT_RESET, grbm_reset);
  2054. (void)RREG32(GRBM_SOFT_RESET);
  2055. udelay(50);
  2056. WREG32(GRBM_SOFT_RESET, 0);
  2057. (void)RREG32(GRBM_SOFT_RESET);
  2058. /* Wait a little for things to settle down */
  2059. udelay(50);
  2060. dev_info(rdev->dev, " GRBM_STATUS=0x%08X\n",
  2061. RREG32(GRBM_STATUS));
  2062. dev_info(rdev->dev, " GRBM_STATUS2=0x%08X\n",
  2063. RREG32(GRBM_STATUS2));
  2064. dev_info(rdev->dev, " GRBM_STATUS_SE0=0x%08X\n",
  2065. RREG32(GRBM_STATUS_SE0));
  2066. dev_info(rdev->dev, " GRBM_STATUS_SE1=0x%08X\n",
  2067. RREG32(GRBM_STATUS_SE1));
  2068. dev_info(rdev->dev, " GRBM_STATUS_SE2=0x%08X\n",
  2069. RREG32(GRBM_STATUS_SE2));
  2070. dev_info(rdev->dev, " GRBM_STATUS_SE3=0x%08X\n",
  2071. RREG32(GRBM_STATUS_SE3));
  2072. dev_info(rdev->dev, " SRBM_STATUS=0x%08X\n",
  2073. RREG32(SRBM_STATUS));
  2074. dev_info(rdev->dev, " SRBM_STATUS2=0x%08X\n",
  2075. RREG32(SRBM_STATUS2));
  2076. evergreen_mc_resume(rdev, &save);
  2077. return 0;
  2078. }
  2079. /**
  2080. * cik_compute_gpu_soft_reset - soft reset CPC
  2081. *
  2082. * @rdev: radeon_device pointer
  2083. *
  2084. * Soft reset the CPC blocks (CIK).
  2085. * XXX: deal with reseting RLC and CPF
  2086. * Returns 0 for success.
  2087. */
  2088. static int cik_compute_gpu_soft_reset(struct radeon_device *rdev)
  2089. {
  2090. struct evergreen_mc_save save;
  2091. u32 grbm_reset = 0;
  2092. dev_info(rdev->dev, "GPU compute softreset \n");
  2093. dev_info(rdev->dev, " GRBM_STATUS=0x%08X\n",
  2094. RREG32(GRBM_STATUS));
  2095. dev_info(rdev->dev, " GRBM_STATUS2=0x%08X\n",
  2096. RREG32(GRBM_STATUS2));
  2097. dev_info(rdev->dev, " GRBM_STATUS_SE0=0x%08X\n",
  2098. RREG32(GRBM_STATUS_SE0));
  2099. dev_info(rdev->dev, " GRBM_STATUS_SE1=0x%08X\n",
  2100. RREG32(GRBM_STATUS_SE1));
  2101. dev_info(rdev->dev, " GRBM_STATUS_SE2=0x%08X\n",
  2102. RREG32(GRBM_STATUS_SE2));
  2103. dev_info(rdev->dev, " GRBM_STATUS_SE3=0x%08X\n",
  2104. RREG32(GRBM_STATUS_SE3));
  2105. dev_info(rdev->dev, " SRBM_STATUS=0x%08X\n",
  2106. RREG32(SRBM_STATUS));
  2107. dev_info(rdev->dev, " SRBM_STATUS2=0x%08X\n",
  2108. RREG32(SRBM_STATUS2));
  2109. evergreen_mc_stop(rdev, &save);
  2110. if (radeon_mc_wait_for_idle(rdev)) {
  2111. dev_warn(rdev->dev, "Wait for MC idle timedout !\n");
  2112. }
  2113. /* Disable CP parsing/prefetching */
  2114. WREG32(CP_MEC_CNTL, MEC_ME1_HALT | MEC_ME2_HALT);
  2115. /* reset all the CPC blocks */
  2116. grbm_reset = SOFT_RESET_CPG;
  2117. dev_info(rdev->dev, " GRBM_SOFT_RESET=0x%08X\n", grbm_reset);
  2118. WREG32(GRBM_SOFT_RESET, grbm_reset);
  2119. (void)RREG32(GRBM_SOFT_RESET);
  2120. udelay(50);
  2121. WREG32(GRBM_SOFT_RESET, 0);
  2122. (void)RREG32(GRBM_SOFT_RESET);
  2123. /* Wait a little for things to settle down */
  2124. udelay(50);
  2125. dev_info(rdev->dev, " GRBM_STATUS=0x%08X\n",
  2126. RREG32(GRBM_STATUS));
  2127. dev_info(rdev->dev, " GRBM_STATUS2=0x%08X\n",
  2128. RREG32(GRBM_STATUS2));
  2129. dev_info(rdev->dev, " GRBM_STATUS_SE0=0x%08X\n",
  2130. RREG32(GRBM_STATUS_SE0));
  2131. dev_info(rdev->dev, " GRBM_STATUS_SE1=0x%08X\n",
  2132. RREG32(GRBM_STATUS_SE1));
  2133. dev_info(rdev->dev, " GRBM_STATUS_SE2=0x%08X\n",
  2134. RREG32(GRBM_STATUS_SE2));
  2135. dev_info(rdev->dev, " GRBM_STATUS_SE3=0x%08X\n",
  2136. RREG32(GRBM_STATUS_SE3));
  2137. dev_info(rdev->dev, " SRBM_STATUS=0x%08X\n",
  2138. RREG32(SRBM_STATUS));
  2139. dev_info(rdev->dev, " SRBM_STATUS2=0x%08X\n",
  2140. RREG32(SRBM_STATUS2));
  2141. evergreen_mc_resume(rdev, &save);
  2142. return 0;
  2143. }
  2144. /**
  2145. * cik_asic_reset - soft reset compute and gfx
  2146. *
  2147. * @rdev: radeon_device pointer
  2148. *
  2149. * Soft reset the CPC blocks (CIK).
  2150. * XXX: make this more fine grained and only reset
  2151. * what is necessary.
  2152. * Returns 0 for success.
  2153. */
  2154. int cik_asic_reset(struct radeon_device *rdev)
  2155. {
  2156. int r;
  2157. r = cik_compute_gpu_soft_reset(rdev);
  2158. if (r)
  2159. dev_info(rdev->dev, "Compute reset failed!\n");
  2160. return cik_gfx_gpu_soft_reset(rdev);
  2161. }
  2162. /* MC */
  2163. /**
  2164. * cik_mc_program - program the GPU memory controller
  2165. *
  2166. * @rdev: radeon_device pointer
  2167. *
  2168. * Set the location of vram, gart, and AGP in the GPU's
  2169. * physical address space (CIK).
  2170. */
  2171. static void cik_mc_program(struct radeon_device *rdev)
  2172. {
  2173. struct evergreen_mc_save save;
  2174. u32 tmp;
  2175. int i, j;
  2176. /* Initialize HDP */
  2177. for (i = 0, j = 0; i < 32; i++, j += 0x18) {
  2178. WREG32((0x2c14 + j), 0x00000000);
  2179. WREG32((0x2c18 + j), 0x00000000);
  2180. WREG32((0x2c1c + j), 0x00000000);
  2181. WREG32((0x2c20 + j), 0x00000000);
  2182. WREG32((0x2c24 + j), 0x00000000);
  2183. }
  2184. WREG32(HDP_REG_COHERENCY_FLUSH_CNTL, 0);
  2185. evergreen_mc_stop(rdev, &save);
  2186. if (radeon_mc_wait_for_idle(rdev)) {
  2187. dev_warn(rdev->dev, "Wait for MC idle timedout !\n");
  2188. }
  2189. /* Lockout access through VGA aperture*/
  2190. WREG32(VGA_HDP_CONTROL, VGA_MEMORY_DISABLE);
  2191. /* Update configuration */
  2192. WREG32(MC_VM_SYSTEM_APERTURE_LOW_ADDR,
  2193. rdev->mc.vram_start >> 12);
  2194. WREG32(MC_VM_SYSTEM_APERTURE_HIGH_ADDR,
  2195. rdev->mc.vram_end >> 12);
  2196. WREG32(MC_VM_SYSTEM_APERTURE_DEFAULT_ADDR,
  2197. rdev->vram_scratch.gpu_addr >> 12);
  2198. tmp = ((rdev->mc.vram_end >> 24) & 0xFFFF) << 16;
  2199. tmp |= ((rdev->mc.vram_start >> 24) & 0xFFFF);
  2200. WREG32(MC_VM_FB_LOCATION, tmp);
  2201. /* XXX double check these! */
  2202. WREG32(HDP_NONSURFACE_BASE, (rdev->mc.vram_start >> 8));
  2203. WREG32(HDP_NONSURFACE_INFO, (2 << 7) | (1 << 30));
  2204. WREG32(HDP_NONSURFACE_SIZE, 0x3FFFFFFF);
  2205. WREG32(MC_VM_AGP_BASE, 0);
  2206. WREG32(MC_VM_AGP_TOP, 0x0FFFFFFF);
  2207. WREG32(MC_VM_AGP_BOT, 0x0FFFFFFF);
  2208. if (radeon_mc_wait_for_idle(rdev)) {
  2209. dev_warn(rdev->dev, "Wait for MC idle timedout !\n");
  2210. }
  2211. evergreen_mc_resume(rdev, &save);
  2212. /* we need to own VRAM, so turn off the VGA renderer here
  2213. * to stop it overwriting our objects */
  2214. rv515_vga_render_disable(rdev);
  2215. }
  2216. /**
  2217. * cik_mc_init - initialize the memory controller driver params
  2218. *
  2219. * @rdev: radeon_device pointer
  2220. *
  2221. * Look up the amount of vram, vram width, and decide how to place
  2222. * vram and gart within the GPU's physical address space (CIK).
  2223. * Returns 0 for success.
  2224. */
  2225. static int cik_mc_init(struct radeon_device *rdev)
  2226. {
  2227. u32 tmp;
  2228. int chansize, numchan;
  2229. /* Get VRAM informations */
  2230. rdev->mc.vram_is_ddr = true;
  2231. tmp = RREG32(MC_ARB_RAMCFG);
  2232. if (tmp & CHANSIZE_MASK) {
  2233. chansize = 64;
  2234. } else {
  2235. chansize = 32;
  2236. }
  2237. tmp = RREG32(MC_SHARED_CHMAP);
  2238. switch ((tmp & NOOFCHAN_MASK) >> NOOFCHAN_SHIFT) {
  2239. case 0:
  2240. default:
  2241. numchan = 1;
  2242. break;
  2243. case 1:
  2244. numchan = 2;
  2245. break;
  2246. case 2:
  2247. numchan = 4;
  2248. break;
  2249. case 3:
  2250. numchan = 8;
  2251. break;
  2252. case 4:
  2253. numchan = 3;
  2254. break;
  2255. case 5:
  2256. numchan = 6;
  2257. break;
  2258. case 6:
  2259. numchan = 10;
  2260. break;
  2261. case 7:
  2262. numchan = 12;
  2263. break;
  2264. case 8:
  2265. numchan = 16;
  2266. break;
  2267. }
  2268. rdev->mc.vram_width = numchan * chansize;
  2269. /* Could aper size report 0 ? */
  2270. rdev->mc.aper_base = pci_resource_start(rdev->pdev, 0);
  2271. rdev->mc.aper_size = pci_resource_len(rdev->pdev, 0);
  2272. /* size in MB on si */
  2273. rdev->mc.mc_vram_size = RREG32(CONFIG_MEMSIZE) * 1024 * 1024;
  2274. rdev->mc.real_vram_size = RREG32(CONFIG_MEMSIZE) * 1024 * 1024;
  2275. rdev->mc.visible_vram_size = rdev->mc.aper_size;
  2276. si_vram_gtt_location(rdev, &rdev->mc);
  2277. radeon_update_bandwidth_info(rdev);
  2278. return 0;
  2279. }
  2280. /*
  2281. * GART
  2282. * VMID 0 is the physical GPU addresses as used by the kernel.
  2283. * VMIDs 1-15 are used for userspace clients and are handled
  2284. * by the radeon vm/hsa code.
  2285. */
  2286. /**
  2287. * cik_pcie_gart_tlb_flush - gart tlb flush callback
  2288. *
  2289. * @rdev: radeon_device pointer
  2290. *
  2291. * Flush the TLB for the VMID 0 page table (CIK).
  2292. */
  2293. void cik_pcie_gart_tlb_flush(struct radeon_device *rdev)
  2294. {
  2295. /* flush hdp cache */
  2296. WREG32(HDP_MEM_COHERENCY_FLUSH_CNTL, 0);
  2297. /* bits 0-15 are the VM contexts0-15 */
  2298. WREG32(VM_INVALIDATE_REQUEST, 0x1);
  2299. }
  2300. /**
  2301. * cik_pcie_gart_enable - gart enable
  2302. *
  2303. * @rdev: radeon_device pointer
  2304. *
  2305. * This sets up the TLBs, programs the page tables for VMID0,
  2306. * sets up the hw for VMIDs 1-15 which are allocated on
  2307. * demand, and sets up the global locations for the LDS, GDS,
  2308. * and GPUVM for FSA64 clients (CIK).
  2309. * Returns 0 for success, errors for failure.
  2310. */
  2311. static int cik_pcie_gart_enable(struct radeon_device *rdev)
  2312. {
  2313. int r, i;
  2314. if (rdev->gart.robj == NULL) {
  2315. dev_err(rdev->dev, "No VRAM object for PCIE GART.\n");
  2316. return -EINVAL;
  2317. }
  2318. r = radeon_gart_table_vram_pin(rdev);
  2319. if (r)
  2320. return r;
  2321. radeon_gart_restore(rdev);
  2322. /* Setup TLB control */
  2323. WREG32(MC_VM_MX_L1_TLB_CNTL,
  2324. (0xA << 7) |
  2325. ENABLE_L1_TLB |
  2326. SYSTEM_ACCESS_MODE_NOT_IN_SYS |
  2327. ENABLE_ADVANCED_DRIVER_MODEL |
  2328. SYSTEM_APERTURE_UNMAPPED_ACCESS_PASS_THRU);
  2329. /* Setup L2 cache */
  2330. WREG32(VM_L2_CNTL, ENABLE_L2_CACHE |
  2331. ENABLE_L2_FRAGMENT_PROCESSING |
  2332. ENABLE_L2_PTE_CACHE_LRU_UPDATE_BY_WRITE |
  2333. ENABLE_L2_PDE0_CACHE_LRU_UPDATE_BY_WRITE |
  2334. EFFECTIVE_L2_QUEUE_SIZE(7) |
  2335. CONTEXT1_IDENTITY_ACCESS_MODE(1));
  2336. WREG32(VM_L2_CNTL2, INVALIDATE_ALL_L1_TLBS | INVALIDATE_L2_CACHE);
  2337. WREG32(VM_L2_CNTL3, L2_CACHE_BIGK_ASSOCIATIVITY |
  2338. L2_CACHE_BIGK_FRAGMENT_SIZE(6));
  2339. /* setup context0 */
  2340. WREG32(VM_CONTEXT0_PAGE_TABLE_START_ADDR, rdev->mc.gtt_start >> 12);
  2341. WREG32(VM_CONTEXT0_PAGE_TABLE_END_ADDR, rdev->mc.gtt_end >> 12);
  2342. WREG32(VM_CONTEXT0_PAGE_TABLE_BASE_ADDR, rdev->gart.table_addr >> 12);
  2343. WREG32(VM_CONTEXT0_PROTECTION_FAULT_DEFAULT_ADDR,
  2344. (u32)(rdev->dummy_page.addr >> 12));
  2345. WREG32(VM_CONTEXT0_CNTL2, 0);
  2346. WREG32(VM_CONTEXT0_CNTL, (ENABLE_CONTEXT | PAGE_TABLE_DEPTH(0) |
  2347. RANGE_PROTECTION_FAULT_ENABLE_DEFAULT));
  2348. WREG32(0x15D4, 0);
  2349. WREG32(0x15D8, 0);
  2350. WREG32(0x15DC, 0);
  2351. /* empty context1-15 */
  2352. /* FIXME start with 4G, once using 2 level pt switch to full
  2353. * vm size space
  2354. */
  2355. /* set vm size, must be a multiple of 4 */
  2356. WREG32(VM_CONTEXT1_PAGE_TABLE_START_ADDR, 0);
  2357. WREG32(VM_CONTEXT1_PAGE_TABLE_END_ADDR, rdev->vm_manager.max_pfn);
  2358. for (i = 1; i < 16; i++) {
  2359. if (i < 8)
  2360. WREG32(VM_CONTEXT0_PAGE_TABLE_BASE_ADDR + (i << 2),
  2361. rdev->gart.table_addr >> 12);
  2362. else
  2363. WREG32(VM_CONTEXT8_PAGE_TABLE_BASE_ADDR + ((i - 8) << 2),
  2364. rdev->gart.table_addr >> 12);
  2365. }
  2366. /* enable context1-15 */
  2367. WREG32(VM_CONTEXT1_PROTECTION_FAULT_DEFAULT_ADDR,
  2368. (u32)(rdev->dummy_page.addr >> 12));
  2369. WREG32(VM_CONTEXT1_CNTL2, 4);
  2370. WREG32(VM_CONTEXT1_CNTL, ENABLE_CONTEXT | PAGE_TABLE_DEPTH(1) |
  2371. RANGE_PROTECTION_FAULT_ENABLE_INTERRUPT |
  2372. RANGE_PROTECTION_FAULT_ENABLE_DEFAULT |
  2373. DUMMY_PAGE_PROTECTION_FAULT_ENABLE_INTERRUPT |
  2374. DUMMY_PAGE_PROTECTION_FAULT_ENABLE_DEFAULT |
  2375. PDE0_PROTECTION_FAULT_ENABLE_INTERRUPT |
  2376. PDE0_PROTECTION_FAULT_ENABLE_DEFAULT |
  2377. VALID_PROTECTION_FAULT_ENABLE_INTERRUPT |
  2378. VALID_PROTECTION_FAULT_ENABLE_DEFAULT |
  2379. READ_PROTECTION_FAULT_ENABLE_INTERRUPT |
  2380. READ_PROTECTION_FAULT_ENABLE_DEFAULT |
  2381. WRITE_PROTECTION_FAULT_ENABLE_INTERRUPT |
  2382. WRITE_PROTECTION_FAULT_ENABLE_DEFAULT);
  2383. /* TC cache setup ??? */
  2384. WREG32(TC_CFG_L1_LOAD_POLICY0, 0);
  2385. WREG32(TC_CFG_L1_LOAD_POLICY1, 0);
  2386. WREG32(TC_CFG_L1_STORE_POLICY, 0);
  2387. WREG32(TC_CFG_L2_LOAD_POLICY0, 0);
  2388. WREG32(TC_CFG_L2_LOAD_POLICY1, 0);
  2389. WREG32(TC_CFG_L2_STORE_POLICY0, 0);
  2390. WREG32(TC_CFG_L2_STORE_POLICY1, 0);
  2391. WREG32(TC_CFG_L2_ATOMIC_POLICY, 0);
  2392. WREG32(TC_CFG_L1_VOLATILE, 0);
  2393. WREG32(TC_CFG_L2_VOLATILE, 0);
  2394. if (rdev->family == CHIP_KAVERI) {
  2395. u32 tmp = RREG32(CHUB_CONTROL);
  2396. tmp &= ~BYPASS_VM;
  2397. WREG32(CHUB_CONTROL, tmp);
  2398. }
  2399. /* XXX SH_MEM regs */
  2400. /* where to put LDS, scratch, GPUVM in FSA64 space */
  2401. for (i = 0; i < 16; i++) {
  2402. WREG32(SRBM_GFX_CNTL, VMID(i));
  2403. WREG32(SH_MEM_CONFIG, 0);
  2404. WREG32(SH_MEM_APE1_BASE, 1);
  2405. WREG32(SH_MEM_APE1_LIMIT, 0);
  2406. WREG32(SH_MEM_BASES, 0);
  2407. }
  2408. WREG32(SRBM_GFX_CNTL, 0);
  2409. cik_pcie_gart_tlb_flush(rdev);
  2410. DRM_INFO("PCIE GART of %uM enabled (table at 0x%016llX).\n",
  2411. (unsigned)(rdev->mc.gtt_size >> 20),
  2412. (unsigned long long)rdev->gart.table_addr);
  2413. rdev->gart.ready = true;
  2414. return 0;
  2415. }
  2416. /**
  2417. * cik_pcie_gart_disable - gart disable
  2418. *
  2419. * @rdev: radeon_device pointer
  2420. *
  2421. * This disables all VM page table (CIK).
  2422. */
  2423. static void cik_pcie_gart_disable(struct radeon_device *rdev)
  2424. {
  2425. /* Disable all tables */
  2426. WREG32(VM_CONTEXT0_CNTL, 0);
  2427. WREG32(VM_CONTEXT1_CNTL, 0);
  2428. /* Setup TLB control */
  2429. WREG32(MC_VM_MX_L1_TLB_CNTL, SYSTEM_ACCESS_MODE_NOT_IN_SYS |
  2430. SYSTEM_APERTURE_UNMAPPED_ACCESS_PASS_THRU);
  2431. /* Setup L2 cache */
  2432. WREG32(VM_L2_CNTL,
  2433. ENABLE_L2_FRAGMENT_PROCESSING |
  2434. ENABLE_L2_PTE_CACHE_LRU_UPDATE_BY_WRITE |
  2435. ENABLE_L2_PDE0_CACHE_LRU_UPDATE_BY_WRITE |
  2436. EFFECTIVE_L2_QUEUE_SIZE(7) |
  2437. CONTEXT1_IDENTITY_ACCESS_MODE(1));
  2438. WREG32(VM_L2_CNTL2, 0);
  2439. WREG32(VM_L2_CNTL3, L2_CACHE_BIGK_ASSOCIATIVITY |
  2440. L2_CACHE_BIGK_FRAGMENT_SIZE(6));
  2441. radeon_gart_table_vram_unpin(rdev);
  2442. }
  2443. /**
  2444. * cik_pcie_gart_fini - vm fini callback
  2445. *
  2446. * @rdev: radeon_device pointer
  2447. *
  2448. * Tears down the driver GART/VM setup (CIK).
  2449. */
  2450. static void cik_pcie_gart_fini(struct radeon_device *rdev)
  2451. {
  2452. cik_pcie_gart_disable(rdev);
  2453. radeon_gart_table_vram_free(rdev);
  2454. radeon_gart_fini(rdev);
  2455. }
  2456. /* vm parser */
  2457. /**
  2458. * cik_ib_parse - vm ib_parse callback
  2459. *
  2460. * @rdev: radeon_device pointer
  2461. * @ib: indirect buffer pointer
  2462. *
  2463. * CIK uses hw IB checking so this is a nop (CIK).
  2464. */
  2465. int cik_ib_parse(struct radeon_device *rdev, struct radeon_ib *ib)
  2466. {
  2467. return 0;
  2468. }
  2469. /*
  2470. * vm
  2471. * VMID 0 is the physical GPU addresses as used by the kernel.
  2472. * VMIDs 1-15 are used for userspace clients and are handled
  2473. * by the radeon vm/hsa code.
  2474. */
  2475. /**
  2476. * cik_vm_init - cik vm init callback
  2477. *
  2478. * @rdev: radeon_device pointer
  2479. *
  2480. * Inits cik specific vm parameters (number of VMs, base of vram for
  2481. * VMIDs 1-15) (CIK).
  2482. * Returns 0 for success.
  2483. */
  2484. int cik_vm_init(struct radeon_device *rdev)
  2485. {
  2486. /* number of VMs */
  2487. rdev->vm_manager.nvm = 16;
  2488. /* base offset of vram pages */
  2489. if (rdev->flags & RADEON_IS_IGP) {
  2490. u64 tmp = RREG32(MC_VM_FB_OFFSET);
  2491. tmp <<= 22;
  2492. rdev->vm_manager.vram_base_offset = tmp;
  2493. } else
  2494. rdev->vm_manager.vram_base_offset = 0;
  2495. return 0;
  2496. }
  2497. /**
  2498. * cik_vm_fini - cik vm fini callback
  2499. *
  2500. * @rdev: radeon_device pointer
  2501. *
  2502. * Tear down any asic specific VM setup (CIK).
  2503. */
  2504. void cik_vm_fini(struct radeon_device *rdev)
  2505. {
  2506. }