r300.c 34 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306
  1. /*
  2. * Copyright 2008 Advanced Micro Devices, Inc.
  3. * Copyright 2008 Red Hat Inc.
  4. * Copyright 2009 Jerome Glisse.
  5. *
  6. * Permission is hereby granted, free of charge, to any person obtaining a
  7. * copy of this software and associated documentation files (the "Software"),
  8. * to deal in the Software without restriction, including without limitation
  9. * the rights to use, copy, modify, merge, publish, distribute, sublicense,
  10. * and/or sell copies of the Software, and to permit persons to whom the
  11. * Software is furnished to do so, subject to the following conditions:
  12. *
  13. * The above copyright notice and this permission notice shall be included in
  14. * all copies or substantial portions of the Software.
  15. *
  16. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  17. * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  18. * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
  19. * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
  20. * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
  21. * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
  22. * OTHER DEALINGS IN THE SOFTWARE.
  23. *
  24. * Authors: Dave Airlie
  25. * Alex Deucher
  26. * Jerome Glisse
  27. */
  28. #include <linux/seq_file.h>
  29. #include "drmP.h"
  30. #include "drm.h"
  31. #include "radeon_reg.h"
  32. #include "radeon.h"
  33. #include "radeon_drm.h"
  34. #include "r100_track.h"
  35. #include "r300d.h"
  36. #include "r300_reg_safe.h"
  37. /* r300,r350,rv350,rv370,rv380 depends on : */
  38. void r100_hdp_reset(struct radeon_device *rdev);
  39. int r100_cp_reset(struct radeon_device *rdev);
  40. int r100_rb2d_reset(struct radeon_device *rdev);
  41. int r100_cp_init(struct radeon_device *rdev, unsigned ring_size);
  42. int r100_pci_gart_enable(struct radeon_device *rdev);
  43. void r100_mc_setup(struct radeon_device *rdev);
  44. void r100_mc_disable_clients(struct radeon_device *rdev);
  45. int r100_gui_wait_for_idle(struct radeon_device *rdev);
  46. int r100_cs_packet_parse(struct radeon_cs_parser *p,
  47. struct radeon_cs_packet *pkt,
  48. unsigned idx);
  49. int r100_cs_packet_parse_vline(struct radeon_cs_parser *p);
  50. int r100_cs_parse_packet0(struct radeon_cs_parser *p,
  51. struct radeon_cs_packet *pkt,
  52. const unsigned *auth, unsigned n,
  53. radeon_packet0_check_t check);
  54. int r100_cs_track_check_pkt3_indx_buffer(struct radeon_cs_parser *p,
  55. struct radeon_cs_packet *pkt,
  56. struct radeon_object *robj);
  57. /* This files gather functions specifics to:
  58. * r300,r350,rv350,rv370,rv380
  59. *
  60. * Some of these functions might be used by newer ASICs.
  61. */
  62. void r300_gpu_init(struct radeon_device *rdev);
  63. int r300_mc_wait_for_idle(struct radeon_device *rdev);
  64. int rv370_debugfs_pcie_gart_info_init(struct radeon_device *rdev);
  65. /*
  66. * rv370,rv380 PCIE GART
  67. */
  68. void rv370_pcie_gart_tlb_flush(struct radeon_device *rdev)
  69. {
  70. uint32_t tmp;
  71. int i;
  72. /* Workaround HW bug do flush 2 times */
  73. for (i = 0; i < 2; i++) {
  74. tmp = RREG32_PCIE(RADEON_PCIE_TX_GART_CNTL);
  75. WREG32_PCIE(RADEON_PCIE_TX_GART_CNTL, tmp | RADEON_PCIE_TX_GART_INVALIDATE_TLB);
  76. (void)RREG32_PCIE(RADEON_PCIE_TX_GART_CNTL);
  77. WREG32_PCIE(RADEON_PCIE_TX_GART_CNTL, tmp);
  78. }
  79. mb();
  80. }
  81. int rv370_pcie_gart_set_page(struct radeon_device *rdev, int i, uint64_t addr)
  82. {
  83. void __iomem *ptr = (void *)rdev->gart.table.vram.ptr;
  84. if (i < 0 || i > rdev->gart.num_gpu_pages) {
  85. return -EINVAL;
  86. }
  87. addr = (lower_32_bits(addr) >> 8) |
  88. ((upper_32_bits(addr) & 0xff) << 24) |
  89. 0xc;
  90. /* on x86 we want this to be CPU endian, on powerpc
  91. * on powerpc without HW swappers, it'll get swapped on way
  92. * into VRAM - so no need for cpu_to_le32 on VRAM tables */
  93. writel(addr, ((void __iomem *)ptr) + (i * 4));
  94. return 0;
  95. }
  96. int rv370_pcie_gart_init(struct radeon_device *rdev)
  97. {
  98. int r;
  99. if (rdev->gart.table.vram.robj) {
  100. WARN(1, "RV370 PCIE GART already initialized.\n");
  101. return 0;
  102. }
  103. /* Initialize common gart structure */
  104. r = radeon_gart_init(rdev);
  105. if (r)
  106. return r;
  107. r = rv370_debugfs_pcie_gart_info_init(rdev);
  108. if (r)
  109. DRM_ERROR("Failed to register debugfs file for PCIE gart !\n");
  110. rdev->gart.table_size = rdev->gart.num_gpu_pages * 4;
  111. rdev->asic->gart_tlb_flush = &rv370_pcie_gart_tlb_flush;
  112. rdev->asic->gart_set_page = &rv370_pcie_gart_set_page;
  113. return radeon_gart_table_vram_alloc(rdev);
  114. }
  115. int rv370_pcie_gart_enable(struct radeon_device *rdev)
  116. {
  117. uint32_t table_addr;
  118. uint32_t tmp;
  119. int r;
  120. if (rdev->gart.table.vram.robj == NULL) {
  121. dev_err(rdev->dev, "No VRAM object for PCIE GART.\n");
  122. return -EINVAL;
  123. }
  124. r = radeon_gart_table_vram_pin(rdev);
  125. if (r)
  126. return r;
  127. /* discard memory request outside of configured range */
  128. tmp = RADEON_PCIE_TX_GART_UNMAPPED_ACCESS_DISCARD;
  129. WREG32_PCIE(RADEON_PCIE_TX_GART_CNTL, tmp);
  130. WREG32_PCIE(RADEON_PCIE_TX_GART_START_LO, rdev->mc.gtt_location);
  131. tmp = rdev->mc.gtt_location + rdev->mc.gtt_size - 4096;
  132. WREG32_PCIE(RADEON_PCIE_TX_GART_END_LO, tmp);
  133. WREG32_PCIE(RADEON_PCIE_TX_GART_START_HI, 0);
  134. WREG32_PCIE(RADEON_PCIE_TX_GART_END_HI, 0);
  135. table_addr = rdev->gart.table_addr;
  136. WREG32_PCIE(RADEON_PCIE_TX_GART_BASE, table_addr);
  137. /* FIXME: setup default page */
  138. WREG32_PCIE(RADEON_PCIE_TX_DISCARD_RD_ADDR_LO, rdev->mc.vram_location);
  139. WREG32_PCIE(RADEON_PCIE_TX_DISCARD_RD_ADDR_HI, 0);
  140. /* Clear error */
  141. WREG32_PCIE(0x18, 0);
  142. tmp = RREG32_PCIE(RADEON_PCIE_TX_GART_CNTL);
  143. tmp |= RADEON_PCIE_TX_GART_EN;
  144. tmp |= RADEON_PCIE_TX_GART_UNMAPPED_ACCESS_DISCARD;
  145. WREG32_PCIE(RADEON_PCIE_TX_GART_CNTL, tmp);
  146. rv370_pcie_gart_tlb_flush(rdev);
  147. DRM_INFO("PCIE GART of %uM enabled (table at 0x%08X).\n",
  148. (unsigned)(rdev->mc.gtt_size >> 20), table_addr);
  149. rdev->gart.ready = true;
  150. return 0;
  151. }
  152. void rv370_pcie_gart_disable(struct radeon_device *rdev)
  153. {
  154. uint32_t tmp;
  155. tmp = RREG32_PCIE(RADEON_PCIE_TX_GART_CNTL);
  156. tmp |= RADEON_PCIE_TX_GART_UNMAPPED_ACCESS_DISCARD;
  157. WREG32_PCIE(RADEON_PCIE_TX_GART_CNTL, tmp & ~RADEON_PCIE_TX_GART_EN);
  158. if (rdev->gart.table.vram.robj) {
  159. radeon_object_kunmap(rdev->gart.table.vram.robj);
  160. radeon_object_unpin(rdev->gart.table.vram.robj);
  161. }
  162. }
  163. void rv370_pcie_gart_fini(struct radeon_device *rdev)
  164. {
  165. rv370_pcie_gart_disable(rdev);
  166. radeon_gart_table_vram_free(rdev);
  167. radeon_gart_fini(rdev);
  168. }
  169. /*
  170. * MC
  171. */
  172. int r300_mc_init(struct radeon_device *rdev)
  173. {
  174. int r;
  175. if (r100_debugfs_rbbm_init(rdev)) {
  176. DRM_ERROR("Failed to register debugfs file for RBBM !\n");
  177. }
  178. r300_gpu_init(rdev);
  179. r100_pci_gart_disable(rdev);
  180. if (rdev->flags & RADEON_IS_PCIE) {
  181. rv370_pcie_gart_disable(rdev);
  182. }
  183. /* Setup GPU memory space */
  184. rdev->mc.vram_location = 0xFFFFFFFFUL;
  185. rdev->mc.gtt_location = 0xFFFFFFFFUL;
  186. if (rdev->flags & RADEON_IS_AGP) {
  187. r = radeon_agp_init(rdev);
  188. if (r) {
  189. printk(KERN_WARNING "[drm] Disabling AGP\n");
  190. rdev->flags &= ~RADEON_IS_AGP;
  191. rdev->mc.gtt_size = radeon_gart_size * 1024 * 1024;
  192. } else {
  193. rdev->mc.gtt_location = rdev->mc.agp_base;
  194. }
  195. }
  196. r = radeon_mc_setup(rdev);
  197. if (r) {
  198. return r;
  199. }
  200. /* Program GPU memory space */
  201. r100_mc_disable_clients(rdev);
  202. if (r300_mc_wait_for_idle(rdev)) {
  203. printk(KERN_WARNING "Failed to wait MC idle while "
  204. "programming pipes. Bad things might happen.\n");
  205. }
  206. r100_mc_setup(rdev);
  207. return 0;
  208. }
  209. void r300_mc_fini(struct radeon_device *rdev)
  210. {
  211. }
  212. /*
  213. * Fence emission
  214. */
  215. void r300_fence_ring_emit(struct radeon_device *rdev,
  216. struct radeon_fence *fence)
  217. {
  218. /* Who ever call radeon_fence_emit should call ring_lock and ask
  219. * for enough space (today caller are ib schedule and buffer move) */
  220. /* Write SC register so SC & US assert idle */
  221. radeon_ring_write(rdev, PACKET0(0x43E0, 0));
  222. radeon_ring_write(rdev, 0);
  223. radeon_ring_write(rdev, PACKET0(0x43E4, 0));
  224. radeon_ring_write(rdev, 0);
  225. /* Flush 3D cache */
  226. radeon_ring_write(rdev, PACKET0(0x4E4C, 0));
  227. radeon_ring_write(rdev, (2 << 0));
  228. radeon_ring_write(rdev, PACKET0(0x4F18, 0));
  229. radeon_ring_write(rdev, (1 << 0));
  230. /* Wait until IDLE & CLEAN */
  231. radeon_ring_write(rdev, PACKET0(0x1720, 0));
  232. radeon_ring_write(rdev, (1 << 17) | (1 << 16) | (1 << 9));
  233. /* Emit fence sequence & fire IRQ */
  234. radeon_ring_write(rdev, PACKET0(rdev->fence_drv.scratch_reg, 0));
  235. radeon_ring_write(rdev, fence->seq);
  236. radeon_ring_write(rdev, PACKET0(RADEON_GEN_INT_STATUS, 0));
  237. radeon_ring_write(rdev, RADEON_SW_INT_FIRE);
  238. }
  239. /*
  240. * Global GPU functions
  241. */
  242. int r300_copy_dma(struct radeon_device *rdev,
  243. uint64_t src_offset,
  244. uint64_t dst_offset,
  245. unsigned num_pages,
  246. struct radeon_fence *fence)
  247. {
  248. uint32_t size;
  249. uint32_t cur_size;
  250. int i, num_loops;
  251. int r = 0;
  252. /* radeon pitch is /64 */
  253. size = num_pages << PAGE_SHIFT;
  254. num_loops = DIV_ROUND_UP(size, 0x1FFFFF);
  255. r = radeon_ring_lock(rdev, num_loops * 4 + 64);
  256. if (r) {
  257. DRM_ERROR("radeon: moving bo (%d).\n", r);
  258. return r;
  259. }
  260. /* Must wait for 2D idle & clean before DMA or hangs might happen */
  261. radeon_ring_write(rdev, PACKET0(RADEON_WAIT_UNTIL, 0 ));
  262. radeon_ring_write(rdev, (1 << 16));
  263. for (i = 0; i < num_loops; i++) {
  264. cur_size = size;
  265. if (cur_size > 0x1FFFFF) {
  266. cur_size = 0x1FFFFF;
  267. }
  268. size -= cur_size;
  269. radeon_ring_write(rdev, PACKET0(0x720, 2));
  270. radeon_ring_write(rdev, src_offset);
  271. radeon_ring_write(rdev, dst_offset);
  272. radeon_ring_write(rdev, cur_size | (1 << 31) | (1 << 30));
  273. src_offset += cur_size;
  274. dst_offset += cur_size;
  275. }
  276. radeon_ring_write(rdev, PACKET0(RADEON_WAIT_UNTIL, 0));
  277. radeon_ring_write(rdev, RADEON_WAIT_DMA_GUI_IDLE);
  278. if (fence) {
  279. r = radeon_fence_emit(rdev, fence);
  280. }
  281. radeon_ring_unlock_commit(rdev);
  282. return r;
  283. }
  284. void r300_ring_start(struct radeon_device *rdev)
  285. {
  286. unsigned gb_tile_config;
  287. int r;
  288. /* Sub pixel 1/12 so we can have 4K rendering according to doc */
  289. gb_tile_config = (R300_ENABLE_TILING | R300_TILE_SIZE_16);
  290. switch(rdev->num_gb_pipes) {
  291. case 2:
  292. gb_tile_config |= R300_PIPE_COUNT_R300;
  293. break;
  294. case 3:
  295. gb_tile_config |= R300_PIPE_COUNT_R420_3P;
  296. break;
  297. case 4:
  298. gb_tile_config |= R300_PIPE_COUNT_R420;
  299. break;
  300. case 1:
  301. default:
  302. gb_tile_config |= R300_PIPE_COUNT_RV350;
  303. break;
  304. }
  305. r = radeon_ring_lock(rdev, 64);
  306. if (r) {
  307. return;
  308. }
  309. radeon_ring_write(rdev, PACKET0(RADEON_ISYNC_CNTL, 0));
  310. radeon_ring_write(rdev,
  311. RADEON_ISYNC_ANY2D_IDLE3D |
  312. RADEON_ISYNC_ANY3D_IDLE2D |
  313. RADEON_ISYNC_WAIT_IDLEGUI |
  314. RADEON_ISYNC_CPSCRATCH_IDLEGUI);
  315. radeon_ring_write(rdev, PACKET0(R300_GB_TILE_CONFIG, 0));
  316. radeon_ring_write(rdev, gb_tile_config);
  317. radeon_ring_write(rdev, PACKET0(RADEON_WAIT_UNTIL, 0));
  318. radeon_ring_write(rdev,
  319. RADEON_WAIT_2D_IDLECLEAN |
  320. RADEON_WAIT_3D_IDLECLEAN);
  321. radeon_ring_write(rdev, PACKET0(0x170C, 0));
  322. radeon_ring_write(rdev, 1 << 31);
  323. radeon_ring_write(rdev, PACKET0(R300_GB_SELECT, 0));
  324. radeon_ring_write(rdev, 0);
  325. radeon_ring_write(rdev, PACKET0(R300_GB_ENABLE, 0));
  326. radeon_ring_write(rdev, 0);
  327. radeon_ring_write(rdev, PACKET0(R300_RB3D_DSTCACHE_CTLSTAT, 0));
  328. radeon_ring_write(rdev, R300_RB3D_DC_FLUSH | R300_RB3D_DC_FREE);
  329. radeon_ring_write(rdev, PACKET0(R300_RB3D_ZCACHE_CTLSTAT, 0));
  330. radeon_ring_write(rdev, R300_ZC_FLUSH | R300_ZC_FREE);
  331. radeon_ring_write(rdev, PACKET0(RADEON_WAIT_UNTIL, 0));
  332. radeon_ring_write(rdev,
  333. RADEON_WAIT_2D_IDLECLEAN |
  334. RADEON_WAIT_3D_IDLECLEAN);
  335. radeon_ring_write(rdev, PACKET0(R300_GB_AA_CONFIG, 0));
  336. radeon_ring_write(rdev, 0);
  337. radeon_ring_write(rdev, PACKET0(R300_RB3D_DSTCACHE_CTLSTAT, 0));
  338. radeon_ring_write(rdev, R300_RB3D_DC_FLUSH | R300_RB3D_DC_FREE);
  339. radeon_ring_write(rdev, PACKET0(R300_RB3D_ZCACHE_CTLSTAT, 0));
  340. radeon_ring_write(rdev, R300_ZC_FLUSH | R300_ZC_FREE);
  341. radeon_ring_write(rdev, PACKET0(R300_GB_MSPOS0, 0));
  342. radeon_ring_write(rdev,
  343. ((6 << R300_MS_X0_SHIFT) |
  344. (6 << R300_MS_Y0_SHIFT) |
  345. (6 << R300_MS_X1_SHIFT) |
  346. (6 << R300_MS_Y1_SHIFT) |
  347. (6 << R300_MS_X2_SHIFT) |
  348. (6 << R300_MS_Y2_SHIFT) |
  349. (6 << R300_MSBD0_Y_SHIFT) |
  350. (6 << R300_MSBD0_X_SHIFT)));
  351. radeon_ring_write(rdev, PACKET0(R300_GB_MSPOS1, 0));
  352. radeon_ring_write(rdev,
  353. ((6 << R300_MS_X3_SHIFT) |
  354. (6 << R300_MS_Y3_SHIFT) |
  355. (6 << R300_MS_X4_SHIFT) |
  356. (6 << R300_MS_Y4_SHIFT) |
  357. (6 << R300_MS_X5_SHIFT) |
  358. (6 << R300_MS_Y5_SHIFT) |
  359. (6 << R300_MSBD1_SHIFT)));
  360. radeon_ring_write(rdev, PACKET0(R300_GA_ENHANCE, 0));
  361. radeon_ring_write(rdev, R300_GA_DEADLOCK_CNTL | R300_GA_FASTSYNC_CNTL);
  362. radeon_ring_write(rdev, PACKET0(R300_GA_POLY_MODE, 0));
  363. radeon_ring_write(rdev,
  364. R300_FRONT_PTYPE_TRIANGE | R300_BACK_PTYPE_TRIANGE);
  365. radeon_ring_write(rdev, PACKET0(R300_GA_ROUND_MODE, 0));
  366. radeon_ring_write(rdev,
  367. R300_GEOMETRY_ROUND_NEAREST |
  368. R300_COLOR_ROUND_NEAREST);
  369. radeon_ring_unlock_commit(rdev);
  370. }
  371. void r300_errata(struct radeon_device *rdev)
  372. {
  373. rdev->pll_errata = 0;
  374. if (rdev->family == CHIP_R300 &&
  375. (RREG32(RADEON_CONFIG_CNTL) & RADEON_CFG_ATI_REV_ID_MASK) == RADEON_CFG_ATI_REV_A11) {
  376. rdev->pll_errata |= CHIP_ERRATA_R300_CG;
  377. }
  378. }
  379. int r300_mc_wait_for_idle(struct radeon_device *rdev)
  380. {
  381. unsigned i;
  382. uint32_t tmp;
  383. for (i = 0; i < rdev->usec_timeout; i++) {
  384. /* read MC_STATUS */
  385. tmp = RREG32(0x0150);
  386. if (tmp & (1 << 4)) {
  387. return 0;
  388. }
  389. DRM_UDELAY(1);
  390. }
  391. return -1;
  392. }
  393. void r300_gpu_init(struct radeon_device *rdev)
  394. {
  395. uint32_t gb_tile_config, tmp;
  396. r100_hdp_reset(rdev);
  397. /* FIXME: rv380 one pipes ? */
  398. if ((rdev->family == CHIP_R300) || (rdev->family == CHIP_R350)) {
  399. /* r300,r350 */
  400. rdev->num_gb_pipes = 2;
  401. } else {
  402. /* rv350,rv370,rv380 */
  403. rdev->num_gb_pipes = 1;
  404. }
  405. rdev->num_z_pipes = 1;
  406. gb_tile_config = (R300_ENABLE_TILING | R300_TILE_SIZE_16);
  407. switch (rdev->num_gb_pipes) {
  408. case 2:
  409. gb_tile_config |= R300_PIPE_COUNT_R300;
  410. break;
  411. case 3:
  412. gb_tile_config |= R300_PIPE_COUNT_R420_3P;
  413. break;
  414. case 4:
  415. gb_tile_config |= R300_PIPE_COUNT_R420;
  416. break;
  417. default:
  418. case 1:
  419. gb_tile_config |= R300_PIPE_COUNT_RV350;
  420. break;
  421. }
  422. WREG32(R300_GB_TILE_CONFIG, gb_tile_config);
  423. if (r100_gui_wait_for_idle(rdev)) {
  424. printk(KERN_WARNING "Failed to wait GUI idle while "
  425. "programming pipes. Bad things might happen.\n");
  426. }
  427. tmp = RREG32(0x170C);
  428. WREG32(0x170C, tmp | (1 << 31));
  429. WREG32(R300_RB2D_DSTCACHE_MODE,
  430. R300_DC_AUTOFLUSH_ENABLE |
  431. R300_DC_DC_DISABLE_IGNORE_PE);
  432. if (r100_gui_wait_for_idle(rdev)) {
  433. printk(KERN_WARNING "Failed to wait GUI idle while "
  434. "programming pipes. Bad things might happen.\n");
  435. }
  436. if (r300_mc_wait_for_idle(rdev)) {
  437. printk(KERN_WARNING "Failed to wait MC idle while "
  438. "programming pipes. Bad things might happen.\n");
  439. }
  440. DRM_INFO("radeon: %d quad pipes, %d Z pipes initialized.\n",
  441. rdev->num_gb_pipes, rdev->num_z_pipes);
  442. }
  443. int r300_ga_reset(struct radeon_device *rdev)
  444. {
  445. uint32_t tmp;
  446. bool reinit_cp;
  447. int i;
  448. reinit_cp = rdev->cp.ready;
  449. rdev->cp.ready = false;
  450. for (i = 0; i < rdev->usec_timeout; i++) {
  451. WREG32(RADEON_CP_CSQ_MODE, 0);
  452. WREG32(RADEON_CP_CSQ_CNTL, 0);
  453. WREG32(RADEON_RBBM_SOFT_RESET, 0x32005);
  454. (void)RREG32(RADEON_RBBM_SOFT_RESET);
  455. udelay(200);
  456. WREG32(RADEON_RBBM_SOFT_RESET, 0);
  457. /* Wait to prevent race in RBBM_STATUS */
  458. mdelay(1);
  459. tmp = RREG32(RADEON_RBBM_STATUS);
  460. if (tmp & ((1 << 20) | (1 << 26))) {
  461. DRM_ERROR("VAP & CP still busy (RBBM_STATUS=0x%08X)", tmp);
  462. /* GA still busy soft reset it */
  463. WREG32(0x429C, 0x200);
  464. WREG32(R300_VAP_PVS_STATE_FLUSH_REG, 0);
  465. WREG32(0x43E0, 0);
  466. WREG32(0x43E4, 0);
  467. WREG32(0x24AC, 0);
  468. }
  469. /* Wait to prevent race in RBBM_STATUS */
  470. mdelay(1);
  471. tmp = RREG32(RADEON_RBBM_STATUS);
  472. if (!(tmp & ((1 << 20) | (1 << 26)))) {
  473. break;
  474. }
  475. }
  476. for (i = 0; i < rdev->usec_timeout; i++) {
  477. tmp = RREG32(RADEON_RBBM_STATUS);
  478. if (!(tmp & ((1 << 20) | (1 << 26)))) {
  479. DRM_INFO("GA reset succeed (RBBM_STATUS=0x%08X)\n",
  480. tmp);
  481. if (reinit_cp) {
  482. return r100_cp_init(rdev, rdev->cp.ring_size);
  483. }
  484. return 0;
  485. }
  486. DRM_UDELAY(1);
  487. }
  488. tmp = RREG32(RADEON_RBBM_STATUS);
  489. DRM_ERROR("Failed to reset GA ! (RBBM_STATUS=0x%08X)\n", tmp);
  490. return -1;
  491. }
  492. int r300_gpu_reset(struct radeon_device *rdev)
  493. {
  494. uint32_t status;
  495. /* reset order likely matter */
  496. status = RREG32(RADEON_RBBM_STATUS);
  497. /* reset HDP */
  498. r100_hdp_reset(rdev);
  499. /* reset rb2d */
  500. if (status & ((1 << 17) | (1 << 18) | (1 << 27))) {
  501. r100_rb2d_reset(rdev);
  502. }
  503. /* reset GA */
  504. if (status & ((1 << 20) | (1 << 26))) {
  505. r300_ga_reset(rdev);
  506. }
  507. /* reset CP */
  508. status = RREG32(RADEON_RBBM_STATUS);
  509. if (status & (1 << 16)) {
  510. r100_cp_reset(rdev);
  511. }
  512. /* Check if GPU is idle */
  513. status = RREG32(RADEON_RBBM_STATUS);
  514. if (status & (1 << 31)) {
  515. DRM_ERROR("Failed to reset GPU (RBBM_STATUS=0x%08X)\n", status);
  516. return -1;
  517. }
  518. DRM_INFO("GPU reset succeed (RBBM_STATUS=0x%08X)\n", status);
  519. return 0;
  520. }
  521. /*
  522. * r300,r350,rv350,rv380 VRAM info
  523. */
  524. void r300_vram_info(struct radeon_device *rdev)
  525. {
  526. uint32_t tmp;
  527. /* DDR for all card after R300 & IGP */
  528. rdev->mc.vram_is_ddr = true;
  529. tmp = RREG32(RADEON_MEM_CNTL);
  530. if (tmp & R300_MEM_NUM_CHANNELS_MASK) {
  531. rdev->mc.vram_width = 128;
  532. } else {
  533. rdev->mc.vram_width = 64;
  534. }
  535. r100_vram_init_sizes(rdev);
  536. }
  537. /*
  538. * PCIE Lanes
  539. */
  540. void rv370_set_pcie_lanes(struct radeon_device *rdev, int lanes)
  541. {
  542. uint32_t link_width_cntl, mask;
  543. if (rdev->flags & RADEON_IS_IGP)
  544. return;
  545. if (!(rdev->flags & RADEON_IS_PCIE))
  546. return;
  547. /* FIXME wait for idle */
  548. switch (lanes) {
  549. case 0:
  550. mask = RADEON_PCIE_LC_LINK_WIDTH_X0;
  551. break;
  552. case 1:
  553. mask = RADEON_PCIE_LC_LINK_WIDTH_X1;
  554. break;
  555. case 2:
  556. mask = RADEON_PCIE_LC_LINK_WIDTH_X2;
  557. break;
  558. case 4:
  559. mask = RADEON_PCIE_LC_LINK_WIDTH_X4;
  560. break;
  561. case 8:
  562. mask = RADEON_PCIE_LC_LINK_WIDTH_X8;
  563. break;
  564. case 12:
  565. mask = RADEON_PCIE_LC_LINK_WIDTH_X12;
  566. break;
  567. case 16:
  568. default:
  569. mask = RADEON_PCIE_LC_LINK_WIDTH_X16;
  570. break;
  571. }
  572. link_width_cntl = RREG32_PCIE(RADEON_PCIE_LC_LINK_WIDTH_CNTL);
  573. if ((link_width_cntl & RADEON_PCIE_LC_LINK_WIDTH_RD_MASK) ==
  574. (mask << RADEON_PCIE_LC_LINK_WIDTH_RD_SHIFT))
  575. return;
  576. link_width_cntl &= ~(RADEON_PCIE_LC_LINK_WIDTH_MASK |
  577. RADEON_PCIE_LC_RECONFIG_NOW |
  578. RADEON_PCIE_LC_RECONFIG_LATER |
  579. RADEON_PCIE_LC_SHORT_RECONFIG_EN);
  580. link_width_cntl |= mask;
  581. WREG32_PCIE(RADEON_PCIE_LC_LINK_WIDTH_CNTL, link_width_cntl);
  582. WREG32_PCIE(RADEON_PCIE_LC_LINK_WIDTH_CNTL, (link_width_cntl |
  583. RADEON_PCIE_LC_RECONFIG_NOW));
  584. /* wait for lane set to complete */
  585. link_width_cntl = RREG32_PCIE(RADEON_PCIE_LC_LINK_WIDTH_CNTL);
  586. while (link_width_cntl == 0xffffffff)
  587. link_width_cntl = RREG32_PCIE(RADEON_PCIE_LC_LINK_WIDTH_CNTL);
  588. }
  589. /*
  590. * Debugfs info
  591. */
  592. #if defined(CONFIG_DEBUG_FS)
  593. static int rv370_debugfs_pcie_gart_info(struct seq_file *m, void *data)
  594. {
  595. struct drm_info_node *node = (struct drm_info_node *) m->private;
  596. struct drm_device *dev = node->minor->dev;
  597. struct radeon_device *rdev = dev->dev_private;
  598. uint32_t tmp;
  599. tmp = RREG32_PCIE(RADEON_PCIE_TX_GART_CNTL);
  600. seq_printf(m, "PCIE_TX_GART_CNTL 0x%08x\n", tmp);
  601. tmp = RREG32_PCIE(RADEON_PCIE_TX_GART_BASE);
  602. seq_printf(m, "PCIE_TX_GART_BASE 0x%08x\n", tmp);
  603. tmp = RREG32_PCIE(RADEON_PCIE_TX_GART_START_LO);
  604. seq_printf(m, "PCIE_TX_GART_START_LO 0x%08x\n", tmp);
  605. tmp = RREG32_PCIE(RADEON_PCIE_TX_GART_START_HI);
  606. seq_printf(m, "PCIE_TX_GART_START_HI 0x%08x\n", tmp);
  607. tmp = RREG32_PCIE(RADEON_PCIE_TX_GART_END_LO);
  608. seq_printf(m, "PCIE_TX_GART_END_LO 0x%08x\n", tmp);
  609. tmp = RREG32_PCIE(RADEON_PCIE_TX_GART_END_HI);
  610. seq_printf(m, "PCIE_TX_GART_END_HI 0x%08x\n", tmp);
  611. tmp = RREG32_PCIE(RADEON_PCIE_TX_GART_ERROR);
  612. seq_printf(m, "PCIE_TX_GART_ERROR 0x%08x\n", tmp);
  613. return 0;
  614. }
  615. static struct drm_info_list rv370_pcie_gart_info_list[] = {
  616. {"rv370_pcie_gart_info", rv370_debugfs_pcie_gart_info, 0, NULL},
  617. };
  618. #endif
  619. int rv370_debugfs_pcie_gart_info_init(struct radeon_device *rdev)
  620. {
  621. #if defined(CONFIG_DEBUG_FS)
  622. return radeon_debugfs_add_files(rdev, rv370_pcie_gart_info_list, 1);
  623. #else
  624. return 0;
  625. #endif
  626. }
  627. /*
  628. * CS functions
  629. */
  630. static int r300_packet0_check(struct radeon_cs_parser *p,
  631. struct radeon_cs_packet *pkt,
  632. unsigned idx, unsigned reg)
  633. {
  634. struct radeon_cs_chunk *ib_chunk;
  635. struct radeon_cs_reloc *reloc;
  636. struct r100_cs_track *track;
  637. volatile uint32_t *ib;
  638. uint32_t tmp, tile_flags = 0;
  639. unsigned i;
  640. int r;
  641. ib = p->ib->ptr;
  642. ib_chunk = &p->chunks[p->chunk_ib_idx];
  643. track = (struct r100_cs_track *)p->track;
  644. switch(reg) {
  645. case AVIVO_D1MODE_VLINE_START_END:
  646. case RADEON_CRTC_GUI_TRIG_VLINE:
  647. r = r100_cs_packet_parse_vline(p);
  648. if (r) {
  649. DRM_ERROR("No reloc for ib[%d]=0x%04X\n",
  650. idx, reg);
  651. r100_cs_dump_packet(p, pkt);
  652. return r;
  653. }
  654. break;
  655. case RADEON_DST_PITCH_OFFSET:
  656. case RADEON_SRC_PITCH_OFFSET:
  657. r = r100_reloc_pitch_offset(p, pkt, idx, reg);
  658. if (r)
  659. return r;
  660. break;
  661. case R300_RB3D_COLOROFFSET0:
  662. case R300_RB3D_COLOROFFSET1:
  663. case R300_RB3D_COLOROFFSET2:
  664. case R300_RB3D_COLOROFFSET3:
  665. i = (reg - R300_RB3D_COLOROFFSET0) >> 2;
  666. r = r100_cs_packet_next_reloc(p, &reloc);
  667. if (r) {
  668. DRM_ERROR("No reloc for ib[%d]=0x%04X\n",
  669. idx, reg);
  670. r100_cs_dump_packet(p, pkt);
  671. return r;
  672. }
  673. track->cb[i].robj = reloc->robj;
  674. track->cb[i].offset = ib_chunk->kdata[idx];
  675. ib[idx] = ib_chunk->kdata[idx] + ((u32)reloc->lobj.gpu_offset);
  676. break;
  677. case R300_ZB_DEPTHOFFSET:
  678. r = r100_cs_packet_next_reloc(p, &reloc);
  679. if (r) {
  680. DRM_ERROR("No reloc for ib[%d]=0x%04X\n",
  681. idx, reg);
  682. r100_cs_dump_packet(p, pkt);
  683. return r;
  684. }
  685. track->zb.robj = reloc->robj;
  686. track->zb.offset = ib_chunk->kdata[idx];
  687. ib[idx] = ib_chunk->kdata[idx] + ((u32)reloc->lobj.gpu_offset);
  688. break;
  689. case R300_TX_OFFSET_0:
  690. case R300_TX_OFFSET_0+4:
  691. case R300_TX_OFFSET_0+8:
  692. case R300_TX_OFFSET_0+12:
  693. case R300_TX_OFFSET_0+16:
  694. case R300_TX_OFFSET_0+20:
  695. case R300_TX_OFFSET_0+24:
  696. case R300_TX_OFFSET_0+28:
  697. case R300_TX_OFFSET_0+32:
  698. case R300_TX_OFFSET_0+36:
  699. case R300_TX_OFFSET_0+40:
  700. case R300_TX_OFFSET_0+44:
  701. case R300_TX_OFFSET_0+48:
  702. case R300_TX_OFFSET_0+52:
  703. case R300_TX_OFFSET_0+56:
  704. case R300_TX_OFFSET_0+60:
  705. i = (reg - R300_TX_OFFSET_0) >> 2;
  706. r = r100_cs_packet_next_reloc(p, &reloc);
  707. if (r) {
  708. DRM_ERROR("No reloc for ib[%d]=0x%04X\n",
  709. idx, reg);
  710. r100_cs_dump_packet(p, pkt);
  711. return r;
  712. }
  713. ib[idx] = ib_chunk->kdata[idx] + ((u32)reloc->lobj.gpu_offset);
  714. track->textures[i].robj = reloc->robj;
  715. break;
  716. /* Tracked registers */
  717. case 0x2084:
  718. /* VAP_VF_CNTL */
  719. track->vap_vf_cntl = ib_chunk->kdata[idx];
  720. break;
  721. case 0x20B4:
  722. /* VAP_VTX_SIZE */
  723. track->vtx_size = ib_chunk->kdata[idx] & 0x7F;
  724. break;
  725. case 0x2134:
  726. /* VAP_VF_MAX_VTX_INDX */
  727. track->max_indx = ib_chunk->kdata[idx] & 0x00FFFFFFUL;
  728. break;
  729. case 0x43E4:
  730. /* SC_SCISSOR1 */
  731. track->maxy = ((ib_chunk->kdata[idx] >> 13) & 0x1FFF) + 1;
  732. if (p->rdev->family < CHIP_RV515) {
  733. track->maxy -= 1440;
  734. }
  735. break;
  736. case 0x4E00:
  737. /* RB3D_CCTL */
  738. track->num_cb = ((ib_chunk->kdata[idx] >> 5) & 0x3) + 1;
  739. break;
  740. case 0x4E38:
  741. case 0x4E3C:
  742. case 0x4E40:
  743. case 0x4E44:
  744. /* RB3D_COLORPITCH0 */
  745. /* RB3D_COLORPITCH1 */
  746. /* RB3D_COLORPITCH2 */
  747. /* RB3D_COLORPITCH3 */
  748. r = r100_cs_packet_next_reloc(p, &reloc);
  749. if (r) {
  750. DRM_ERROR("No reloc for ib[%d]=0x%04X\n",
  751. idx, reg);
  752. r100_cs_dump_packet(p, pkt);
  753. return r;
  754. }
  755. if (reloc->lobj.tiling_flags & RADEON_TILING_MACRO)
  756. tile_flags |= R300_COLOR_TILE_ENABLE;
  757. if (reloc->lobj.tiling_flags & RADEON_TILING_MICRO)
  758. tile_flags |= R300_COLOR_MICROTILE_ENABLE;
  759. tmp = ib_chunk->kdata[idx] & ~(0x7 << 16);
  760. tmp |= tile_flags;
  761. ib[idx] = tmp;
  762. i = (reg - 0x4E38) >> 2;
  763. track->cb[i].pitch = ib_chunk->kdata[idx] & 0x3FFE;
  764. switch (((ib_chunk->kdata[idx] >> 21) & 0xF)) {
  765. case 9:
  766. case 11:
  767. case 12:
  768. track->cb[i].cpp = 1;
  769. break;
  770. case 3:
  771. case 4:
  772. case 13:
  773. case 15:
  774. track->cb[i].cpp = 2;
  775. break;
  776. case 6:
  777. track->cb[i].cpp = 4;
  778. break;
  779. case 10:
  780. track->cb[i].cpp = 8;
  781. break;
  782. case 7:
  783. track->cb[i].cpp = 16;
  784. break;
  785. default:
  786. DRM_ERROR("Invalid color buffer format (%d) !\n",
  787. ((ib_chunk->kdata[idx] >> 21) & 0xF));
  788. return -EINVAL;
  789. }
  790. break;
  791. case 0x4F00:
  792. /* ZB_CNTL */
  793. if (ib_chunk->kdata[idx] & 2) {
  794. track->z_enabled = true;
  795. } else {
  796. track->z_enabled = false;
  797. }
  798. break;
  799. case 0x4F10:
  800. /* ZB_FORMAT */
  801. switch ((ib_chunk->kdata[idx] & 0xF)) {
  802. case 0:
  803. case 1:
  804. track->zb.cpp = 2;
  805. break;
  806. case 2:
  807. track->zb.cpp = 4;
  808. break;
  809. default:
  810. DRM_ERROR("Invalid z buffer format (%d) !\n",
  811. (ib_chunk->kdata[idx] & 0xF));
  812. return -EINVAL;
  813. }
  814. break;
  815. case 0x4F24:
  816. /* ZB_DEPTHPITCH */
  817. r = r100_cs_packet_next_reloc(p, &reloc);
  818. if (r) {
  819. DRM_ERROR("No reloc for ib[%d]=0x%04X\n",
  820. idx, reg);
  821. r100_cs_dump_packet(p, pkt);
  822. return r;
  823. }
  824. if (reloc->lobj.tiling_flags & RADEON_TILING_MACRO)
  825. tile_flags |= R300_DEPTHMACROTILE_ENABLE;
  826. if (reloc->lobj.tiling_flags & RADEON_TILING_MICRO)
  827. tile_flags |= R300_DEPTHMICROTILE_TILED;;
  828. tmp = ib_chunk->kdata[idx] & ~(0x7 << 16);
  829. tmp |= tile_flags;
  830. ib[idx] = tmp;
  831. track->zb.pitch = ib_chunk->kdata[idx] & 0x3FFC;
  832. break;
  833. case 0x4104:
  834. for (i = 0; i < 16; i++) {
  835. bool enabled;
  836. enabled = !!(ib_chunk->kdata[idx] & (1 << i));
  837. track->textures[i].enabled = enabled;
  838. }
  839. break;
  840. case 0x44C0:
  841. case 0x44C4:
  842. case 0x44C8:
  843. case 0x44CC:
  844. case 0x44D0:
  845. case 0x44D4:
  846. case 0x44D8:
  847. case 0x44DC:
  848. case 0x44E0:
  849. case 0x44E4:
  850. case 0x44E8:
  851. case 0x44EC:
  852. case 0x44F0:
  853. case 0x44F4:
  854. case 0x44F8:
  855. case 0x44FC:
  856. /* TX_FORMAT1_[0-15] */
  857. i = (reg - 0x44C0) >> 2;
  858. tmp = (ib_chunk->kdata[idx] >> 25) & 0x3;
  859. track->textures[i].tex_coord_type = tmp;
  860. switch ((ib_chunk->kdata[idx] & 0x1F)) {
  861. case R300_TX_FORMAT_X8:
  862. case R300_TX_FORMAT_Y4X4:
  863. case R300_TX_FORMAT_Z3Y3X2:
  864. track->textures[i].cpp = 1;
  865. break;
  866. case R300_TX_FORMAT_X16:
  867. case R300_TX_FORMAT_Y8X8:
  868. case R300_TX_FORMAT_Z5Y6X5:
  869. case R300_TX_FORMAT_Z6Y5X5:
  870. case R300_TX_FORMAT_W4Z4Y4X4:
  871. case R300_TX_FORMAT_W1Z5Y5X5:
  872. case R300_TX_FORMAT_DXT1:
  873. case R300_TX_FORMAT_D3DMFT_CxV8U8:
  874. case R300_TX_FORMAT_B8G8_B8G8:
  875. case R300_TX_FORMAT_G8R8_G8B8:
  876. track->textures[i].cpp = 2;
  877. break;
  878. case R300_TX_FORMAT_Y16X16:
  879. case R300_TX_FORMAT_Z11Y11X10:
  880. case R300_TX_FORMAT_Z10Y11X11:
  881. case R300_TX_FORMAT_W8Z8Y8X8:
  882. case R300_TX_FORMAT_W2Z10Y10X10:
  883. case 0x17:
  884. case R300_TX_FORMAT_FL_I32:
  885. case 0x1e:
  886. case R300_TX_FORMAT_DXT3:
  887. case R300_TX_FORMAT_DXT5:
  888. track->textures[i].cpp = 4;
  889. break;
  890. case R300_TX_FORMAT_W16Z16Y16X16:
  891. case R300_TX_FORMAT_FL_R16G16B16A16:
  892. case R300_TX_FORMAT_FL_I32A32:
  893. track->textures[i].cpp = 8;
  894. break;
  895. case R300_TX_FORMAT_FL_R32G32B32A32:
  896. track->textures[i].cpp = 16;
  897. break;
  898. default:
  899. DRM_ERROR("Invalid texture format %u\n",
  900. (ib_chunk->kdata[idx] & 0x1F));
  901. return -EINVAL;
  902. break;
  903. }
  904. break;
  905. case 0x4400:
  906. case 0x4404:
  907. case 0x4408:
  908. case 0x440C:
  909. case 0x4410:
  910. case 0x4414:
  911. case 0x4418:
  912. case 0x441C:
  913. case 0x4420:
  914. case 0x4424:
  915. case 0x4428:
  916. case 0x442C:
  917. case 0x4430:
  918. case 0x4434:
  919. case 0x4438:
  920. case 0x443C:
  921. /* TX_FILTER0_[0-15] */
  922. i = (reg - 0x4400) >> 2;
  923. tmp = ib_chunk->kdata[idx] & 0x7;
  924. if (tmp == 2 || tmp == 4 || tmp == 6) {
  925. track->textures[i].roundup_w = false;
  926. }
  927. tmp = (ib_chunk->kdata[idx] >> 3) & 0x7;
  928. if (tmp == 2 || tmp == 4 || tmp == 6) {
  929. track->textures[i].roundup_h = false;
  930. }
  931. break;
  932. case 0x4500:
  933. case 0x4504:
  934. case 0x4508:
  935. case 0x450C:
  936. case 0x4510:
  937. case 0x4514:
  938. case 0x4518:
  939. case 0x451C:
  940. case 0x4520:
  941. case 0x4524:
  942. case 0x4528:
  943. case 0x452C:
  944. case 0x4530:
  945. case 0x4534:
  946. case 0x4538:
  947. case 0x453C:
  948. /* TX_FORMAT2_[0-15] */
  949. i = (reg - 0x4500) >> 2;
  950. tmp = ib_chunk->kdata[idx] & 0x3FFF;
  951. track->textures[i].pitch = tmp + 1;
  952. if (p->rdev->family >= CHIP_RV515) {
  953. tmp = ((ib_chunk->kdata[idx] >> 15) & 1) << 11;
  954. track->textures[i].width_11 = tmp;
  955. tmp = ((ib_chunk->kdata[idx] >> 16) & 1) << 11;
  956. track->textures[i].height_11 = tmp;
  957. }
  958. break;
  959. case 0x4480:
  960. case 0x4484:
  961. case 0x4488:
  962. case 0x448C:
  963. case 0x4490:
  964. case 0x4494:
  965. case 0x4498:
  966. case 0x449C:
  967. case 0x44A0:
  968. case 0x44A4:
  969. case 0x44A8:
  970. case 0x44AC:
  971. case 0x44B0:
  972. case 0x44B4:
  973. case 0x44B8:
  974. case 0x44BC:
  975. /* TX_FORMAT0_[0-15] */
  976. i = (reg - 0x4480) >> 2;
  977. tmp = ib_chunk->kdata[idx] & 0x7FF;
  978. track->textures[i].width = tmp + 1;
  979. tmp = (ib_chunk->kdata[idx] >> 11) & 0x7FF;
  980. track->textures[i].height = tmp + 1;
  981. tmp = (ib_chunk->kdata[idx] >> 26) & 0xF;
  982. track->textures[i].num_levels = tmp;
  983. tmp = ib_chunk->kdata[idx] & (1 << 31);
  984. track->textures[i].use_pitch = !!tmp;
  985. tmp = (ib_chunk->kdata[idx] >> 22) & 0xF;
  986. track->textures[i].txdepth = tmp;
  987. break;
  988. case R300_ZB_ZPASS_ADDR:
  989. r = r100_cs_packet_next_reloc(p, &reloc);
  990. if (r) {
  991. DRM_ERROR("No reloc for ib[%d]=0x%04X\n",
  992. idx, reg);
  993. r100_cs_dump_packet(p, pkt);
  994. return r;
  995. }
  996. ib[idx] = ib_chunk->kdata[idx] + ((u32)reloc->lobj.gpu_offset);
  997. break;
  998. case 0x4be8:
  999. /* valid register only on RV530 */
  1000. if (p->rdev->family == CHIP_RV530)
  1001. break;
  1002. /* fallthrough do not move */
  1003. default:
  1004. printk(KERN_ERR "Forbidden register 0x%04X in cs at %d\n",
  1005. reg, idx);
  1006. return -EINVAL;
  1007. }
  1008. return 0;
  1009. }
  1010. static int r300_packet3_check(struct radeon_cs_parser *p,
  1011. struct radeon_cs_packet *pkt)
  1012. {
  1013. struct radeon_cs_chunk *ib_chunk;
  1014. struct radeon_cs_reloc *reloc;
  1015. struct r100_cs_track *track;
  1016. volatile uint32_t *ib;
  1017. unsigned idx;
  1018. unsigned i, c;
  1019. int r;
  1020. ib = p->ib->ptr;
  1021. ib_chunk = &p->chunks[p->chunk_ib_idx];
  1022. idx = pkt->idx + 1;
  1023. track = (struct r100_cs_track *)p->track;
  1024. switch(pkt->opcode) {
  1025. case PACKET3_3D_LOAD_VBPNTR:
  1026. c = ib_chunk->kdata[idx++] & 0x1F;
  1027. track->num_arrays = c;
  1028. for (i = 0; i < (c - 1); i+=2, idx+=3) {
  1029. r = r100_cs_packet_next_reloc(p, &reloc);
  1030. if (r) {
  1031. DRM_ERROR("No reloc for packet3 %d\n",
  1032. pkt->opcode);
  1033. r100_cs_dump_packet(p, pkt);
  1034. return r;
  1035. }
  1036. ib[idx+1] = ib_chunk->kdata[idx+1] + ((u32)reloc->lobj.gpu_offset);
  1037. track->arrays[i + 0].robj = reloc->robj;
  1038. track->arrays[i + 0].esize = ib_chunk->kdata[idx] >> 8;
  1039. track->arrays[i + 0].esize &= 0x7F;
  1040. r = r100_cs_packet_next_reloc(p, &reloc);
  1041. if (r) {
  1042. DRM_ERROR("No reloc for packet3 %d\n",
  1043. pkt->opcode);
  1044. r100_cs_dump_packet(p, pkt);
  1045. return r;
  1046. }
  1047. ib[idx+2] = ib_chunk->kdata[idx+2] + ((u32)reloc->lobj.gpu_offset);
  1048. track->arrays[i + 1].robj = reloc->robj;
  1049. track->arrays[i + 1].esize = ib_chunk->kdata[idx] >> 24;
  1050. track->arrays[i + 1].esize &= 0x7F;
  1051. }
  1052. if (c & 1) {
  1053. r = r100_cs_packet_next_reloc(p, &reloc);
  1054. if (r) {
  1055. DRM_ERROR("No reloc for packet3 %d\n",
  1056. pkt->opcode);
  1057. r100_cs_dump_packet(p, pkt);
  1058. return r;
  1059. }
  1060. ib[idx+1] = ib_chunk->kdata[idx+1] + ((u32)reloc->lobj.gpu_offset);
  1061. track->arrays[i + 0].robj = reloc->robj;
  1062. track->arrays[i + 0].esize = ib_chunk->kdata[idx] >> 8;
  1063. track->arrays[i + 0].esize &= 0x7F;
  1064. }
  1065. break;
  1066. case PACKET3_INDX_BUFFER:
  1067. r = r100_cs_packet_next_reloc(p, &reloc);
  1068. if (r) {
  1069. DRM_ERROR("No reloc for packet3 %d\n", pkt->opcode);
  1070. r100_cs_dump_packet(p, pkt);
  1071. return r;
  1072. }
  1073. ib[idx+1] = ib_chunk->kdata[idx+1] + ((u32)reloc->lobj.gpu_offset);
  1074. r = r100_cs_track_check_pkt3_indx_buffer(p, pkt, reloc->robj);
  1075. if (r) {
  1076. return r;
  1077. }
  1078. break;
  1079. /* Draw packet */
  1080. case PACKET3_3D_DRAW_IMMD:
  1081. /* Number of dwords is vtx_size * (num_vertices - 1)
  1082. * PRIM_WALK must be equal to 3 vertex data in embedded
  1083. * in cmd stream */
  1084. if (((ib_chunk->kdata[idx+1] >> 4) & 0x3) != 3) {
  1085. DRM_ERROR("PRIM_WALK must be 3 for IMMD draw\n");
  1086. return -EINVAL;
  1087. }
  1088. track->vap_vf_cntl = ib_chunk->kdata[idx+1];
  1089. track->immd_dwords = pkt->count - 1;
  1090. r = r100_cs_track_check(p->rdev, track);
  1091. if (r) {
  1092. return r;
  1093. }
  1094. break;
  1095. case PACKET3_3D_DRAW_IMMD_2:
  1096. /* Number of dwords is vtx_size * (num_vertices - 1)
  1097. * PRIM_WALK must be equal to 3 vertex data in embedded
  1098. * in cmd stream */
  1099. if (((ib_chunk->kdata[idx] >> 4) & 0x3) != 3) {
  1100. DRM_ERROR("PRIM_WALK must be 3 for IMMD draw\n");
  1101. return -EINVAL;
  1102. }
  1103. track->vap_vf_cntl = ib_chunk->kdata[idx];
  1104. track->immd_dwords = pkt->count;
  1105. r = r100_cs_track_check(p->rdev, track);
  1106. if (r) {
  1107. return r;
  1108. }
  1109. break;
  1110. case PACKET3_3D_DRAW_VBUF:
  1111. track->vap_vf_cntl = ib_chunk->kdata[idx + 1];
  1112. r = r100_cs_track_check(p->rdev, track);
  1113. if (r) {
  1114. return r;
  1115. }
  1116. break;
  1117. case PACKET3_3D_DRAW_VBUF_2:
  1118. track->vap_vf_cntl = ib_chunk->kdata[idx];
  1119. r = r100_cs_track_check(p->rdev, track);
  1120. if (r) {
  1121. return r;
  1122. }
  1123. break;
  1124. case PACKET3_3D_DRAW_INDX:
  1125. track->vap_vf_cntl = ib_chunk->kdata[idx + 1];
  1126. r = r100_cs_track_check(p->rdev, track);
  1127. if (r) {
  1128. return r;
  1129. }
  1130. break;
  1131. case PACKET3_3D_DRAW_INDX_2:
  1132. track->vap_vf_cntl = ib_chunk->kdata[idx];
  1133. r = r100_cs_track_check(p->rdev, track);
  1134. if (r) {
  1135. return r;
  1136. }
  1137. break;
  1138. case PACKET3_NOP:
  1139. break;
  1140. default:
  1141. DRM_ERROR("Packet3 opcode %x not supported\n", pkt->opcode);
  1142. return -EINVAL;
  1143. }
  1144. return 0;
  1145. }
  1146. int r300_cs_parse(struct radeon_cs_parser *p)
  1147. {
  1148. struct radeon_cs_packet pkt;
  1149. struct r100_cs_track *track;
  1150. int r;
  1151. track = kzalloc(sizeof(*track), GFP_KERNEL);
  1152. r100_cs_track_clear(p->rdev, track);
  1153. p->track = track;
  1154. do {
  1155. r = r100_cs_packet_parse(p, &pkt, p->idx);
  1156. if (r) {
  1157. return r;
  1158. }
  1159. p->idx += pkt.count + 2;
  1160. switch (pkt.type) {
  1161. case PACKET_TYPE0:
  1162. r = r100_cs_parse_packet0(p, &pkt,
  1163. p->rdev->config.r300.reg_safe_bm,
  1164. p->rdev->config.r300.reg_safe_bm_size,
  1165. &r300_packet0_check);
  1166. break;
  1167. case PACKET_TYPE2:
  1168. break;
  1169. case PACKET_TYPE3:
  1170. r = r300_packet3_check(p, &pkt);
  1171. break;
  1172. default:
  1173. DRM_ERROR("Unknown packet type %d !\n", pkt.type);
  1174. return -EINVAL;
  1175. }
  1176. if (r) {
  1177. return r;
  1178. }
  1179. } while (p->idx < p->chunks[p->chunk_ib_idx].length_dw);
  1180. return 0;
  1181. }
  1182. void r300_set_reg_safe(struct radeon_device *rdev)
  1183. {
  1184. rdev->config.r300.reg_safe_bm = r300_reg_safe_bm;
  1185. rdev->config.r300.reg_safe_bm_size = ARRAY_SIZE(r300_reg_safe_bm);
  1186. }
  1187. int r300_init(struct radeon_device *rdev)
  1188. {
  1189. r300_set_reg_safe(rdev);
  1190. return 0;
  1191. }
  1192. void r300_mc_program(struct radeon_device *rdev)
  1193. {
  1194. struct r100_mc_save save;
  1195. int r;
  1196. r = r100_debugfs_mc_info_init(rdev);
  1197. if (r) {
  1198. dev_err(rdev->dev, "Failed to create r100_mc debugfs file.\n");
  1199. }
  1200. /* Stops all mc clients */
  1201. r100_mc_stop(rdev, &save);
  1202. if (rdev->flags & RADEON_IS_AGP) {
  1203. WREG32(R_00014C_MC_AGP_LOCATION,
  1204. S_00014C_MC_AGP_START(rdev->mc.gtt_start >> 16) |
  1205. S_00014C_MC_AGP_TOP(rdev->mc.gtt_end >> 16));
  1206. WREG32(R_000170_AGP_BASE, lower_32_bits(rdev->mc.agp_base));
  1207. WREG32(R_00015C_AGP_BASE_2,
  1208. upper_32_bits(rdev->mc.agp_base) & 0xff);
  1209. } else {
  1210. WREG32(R_00014C_MC_AGP_LOCATION, 0x0FFFFFFF);
  1211. WREG32(R_000170_AGP_BASE, 0);
  1212. WREG32(R_00015C_AGP_BASE_2, 0);
  1213. }
  1214. /* Wait for mc idle */
  1215. if (r300_mc_wait_for_idle(rdev))
  1216. DRM_INFO("Failed to wait MC idle before programming MC.\n");
  1217. /* Program MC, should be a 32bits limited address space */
  1218. WREG32(R_000148_MC_FB_LOCATION,
  1219. S_000148_MC_FB_START(rdev->mc.vram_start >> 16) |
  1220. S_000148_MC_FB_TOP(rdev->mc.vram_end >> 16));
  1221. r100_mc_resume(rdev, &save);
  1222. }