r100.c 46 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704
  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_drm.h"
  32. #include "radeon_microcode.h"
  33. #include "radeon_reg.h"
  34. #include "radeon.h"
  35. /* This files gather functions specifics to:
  36. * r100,rv100,rs100,rv200,rs200,r200,rv250,rs300,rv280
  37. *
  38. * Some of these functions might be used by newer ASICs.
  39. */
  40. void r100_hdp_reset(struct radeon_device *rdev);
  41. void r100_gpu_init(struct radeon_device *rdev);
  42. int r100_gui_wait_for_idle(struct radeon_device *rdev);
  43. int r100_mc_wait_for_idle(struct radeon_device *rdev);
  44. void r100_gpu_wait_for_vsync(struct radeon_device *rdev);
  45. void r100_gpu_wait_for_vsync2(struct radeon_device *rdev);
  46. int r100_debugfs_mc_info_init(struct radeon_device *rdev);
  47. /*
  48. * PCI GART
  49. */
  50. void r100_pci_gart_tlb_flush(struct radeon_device *rdev)
  51. {
  52. /* TODO: can we do somethings here ? */
  53. /* It seems hw only cache one entry so we should discard this
  54. * entry otherwise if first GPU GART read hit this entry it
  55. * could end up in wrong address. */
  56. }
  57. int r100_pci_gart_enable(struct radeon_device *rdev)
  58. {
  59. uint32_t tmp;
  60. int r;
  61. /* Initialize common gart structure */
  62. r = radeon_gart_init(rdev);
  63. if (r) {
  64. return r;
  65. }
  66. if (rdev->gart.table.ram.ptr == NULL) {
  67. rdev->gart.table_size = rdev->gart.num_gpu_pages * 4;
  68. r = radeon_gart_table_ram_alloc(rdev);
  69. if (r) {
  70. return r;
  71. }
  72. }
  73. /* discard memory request outside of configured range */
  74. tmp = RREG32(RADEON_AIC_CNTL) | RADEON_DIS_OUT_OF_PCI_GART_ACCESS;
  75. WREG32(RADEON_AIC_CNTL, tmp);
  76. /* set address range for PCI address translate */
  77. WREG32(RADEON_AIC_LO_ADDR, rdev->mc.gtt_location);
  78. tmp = rdev->mc.gtt_location + rdev->mc.gtt_size - 1;
  79. WREG32(RADEON_AIC_HI_ADDR, tmp);
  80. /* Enable bus mastering */
  81. tmp = RREG32(RADEON_BUS_CNTL) & ~RADEON_BUS_MASTER_DIS;
  82. WREG32(RADEON_BUS_CNTL, tmp);
  83. /* set PCI GART page-table base address */
  84. WREG32(RADEON_AIC_PT_BASE, rdev->gart.table_addr);
  85. tmp = RREG32(RADEON_AIC_CNTL) | RADEON_PCIGART_TRANSLATE_EN;
  86. WREG32(RADEON_AIC_CNTL, tmp);
  87. r100_pci_gart_tlb_flush(rdev);
  88. rdev->gart.ready = true;
  89. return 0;
  90. }
  91. void r100_pci_gart_disable(struct radeon_device *rdev)
  92. {
  93. uint32_t tmp;
  94. /* discard memory request outside of configured range */
  95. tmp = RREG32(RADEON_AIC_CNTL) | RADEON_DIS_OUT_OF_PCI_GART_ACCESS;
  96. WREG32(RADEON_AIC_CNTL, tmp & ~RADEON_PCIGART_TRANSLATE_EN);
  97. WREG32(RADEON_AIC_LO_ADDR, 0);
  98. WREG32(RADEON_AIC_HI_ADDR, 0);
  99. }
  100. int r100_pci_gart_set_page(struct radeon_device *rdev, int i, uint64_t addr)
  101. {
  102. if (i < 0 || i > rdev->gart.num_gpu_pages) {
  103. return -EINVAL;
  104. }
  105. rdev->gart.table.ram.ptr[i] = cpu_to_le32(lower_32_bits(addr));
  106. return 0;
  107. }
  108. int r100_gart_enable(struct radeon_device *rdev)
  109. {
  110. if (rdev->flags & RADEON_IS_AGP) {
  111. r100_pci_gart_disable(rdev);
  112. return 0;
  113. }
  114. return r100_pci_gart_enable(rdev);
  115. }
  116. /*
  117. * MC
  118. */
  119. void r100_mc_disable_clients(struct radeon_device *rdev)
  120. {
  121. uint32_t ov0_scale_cntl, crtc_ext_cntl, crtc_gen_cntl, crtc2_gen_cntl;
  122. /* FIXME: is this function correct for rs100,rs200,rs300 ? */
  123. if (r100_gui_wait_for_idle(rdev)) {
  124. printk(KERN_WARNING "Failed to wait GUI idle while "
  125. "programming pipes. Bad things might happen.\n");
  126. }
  127. /* stop display and memory access */
  128. ov0_scale_cntl = RREG32(RADEON_OV0_SCALE_CNTL);
  129. WREG32(RADEON_OV0_SCALE_CNTL, ov0_scale_cntl & ~RADEON_SCALER_ENABLE);
  130. crtc_ext_cntl = RREG32(RADEON_CRTC_EXT_CNTL);
  131. WREG32(RADEON_CRTC_EXT_CNTL, crtc_ext_cntl | RADEON_CRTC_DISPLAY_DIS);
  132. crtc_gen_cntl = RREG32(RADEON_CRTC_GEN_CNTL);
  133. r100_gpu_wait_for_vsync(rdev);
  134. WREG32(RADEON_CRTC_GEN_CNTL,
  135. (crtc_gen_cntl & ~(RADEON_CRTC_CUR_EN | RADEON_CRTC_ICON_EN)) |
  136. RADEON_CRTC_DISP_REQ_EN_B | RADEON_CRTC_EXT_DISP_EN);
  137. if (!(rdev->flags & RADEON_SINGLE_CRTC)) {
  138. crtc2_gen_cntl = RREG32(RADEON_CRTC2_GEN_CNTL);
  139. r100_gpu_wait_for_vsync2(rdev);
  140. WREG32(RADEON_CRTC2_GEN_CNTL,
  141. (crtc2_gen_cntl &
  142. ~(RADEON_CRTC2_CUR_EN | RADEON_CRTC2_ICON_EN)) |
  143. RADEON_CRTC2_DISP_REQ_EN_B);
  144. }
  145. udelay(500);
  146. }
  147. void r100_mc_setup(struct radeon_device *rdev)
  148. {
  149. uint32_t tmp;
  150. int r;
  151. r = r100_debugfs_mc_info_init(rdev);
  152. if (r) {
  153. DRM_ERROR("Failed to register debugfs file for R100 MC !\n");
  154. }
  155. /* Write VRAM size in case we are limiting it */
  156. WREG32(RADEON_CONFIG_MEMSIZE, rdev->mc.vram_size);
  157. tmp = rdev->mc.vram_location + rdev->mc.vram_size - 1;
  158. tmp = REG_SET(RADEON_MC_FB_TOP, tmp >> 16);
  159. tmp |= REG_SET(RADEON_MC_FB_START, rdev->mc.vram_location >> 16);
  160. WREG32(RADEON_MC_FB_LOCATION, tmp);
  161. /* Enable bus mastering */
  162. tmp = RREG32(RADEON_BUS_CNTL) & ~RADEON_BUS_MASTER_DIS;
  163. WREG32(RADEON_BUS_CNTL, tmp);
  164. if (rdev->flags & RADEON_IS_AGP) {
  165. tmp = rdev->mc.gtt_location + rdev->mc.gtt_size - 1;
  166. tmp = REG_SET(RADEON_MC_AGP_TOP, tmp >> 16);
  167. tmp |= REG_SET(RADEON_MC_AGP_START, rdev->mc.gtt_location >> 16);
  168. WREG32(RADEON_MC_AGP_LOCATION, tmp);
  169. WREG32(RADEON_AGP_BASE, rdev->mc.agp_base);
  170. } else {
  171. WREG32(RADEON_MC_AGP_LOCATION, 0x0FFFFFFF);
  172. WREG32(RADEON_AGP_BASE, 0);
  173. }
  174. tmp = RREG32(RADEON_HOST_PATH_CNTL) & RADEON_HDP_APER_CNTL;
  175. tmp |= (7 << 28);
  176. WREG32(RADEON_HOST_PATH_CNTL, tmp | RADEON_HDP_SOFT_RESET | RADEON_HDP_READ_BUFFER_INVALIDATE);
  177. (void)RREG32(RADEON_HOST_PATH_CNTL);
  178. WREG32(RADEON_HOST_PATH_CNTL, tmp);
  179. (void)RREG32(RADEON_HOST_PATH_CNTL);
  180. }
  181. int r100_mc_init(struct radeon_device *rdev)
  182. {
  183. int r;
  184. if (r100_debugfs_rbbm_init(rdev)) {
  185. DRM_ERROR("Failed to register debugfs file for RBBM !\n");
  186. }
  187. r100_gpu_init(rdev);
  188. /* Disable gart which also disable out of gart access */
  189. r100_pci_gart_disable(rdev);
  190. /* Setup GPU memory space */
  191. rdev->mc.gtt_location = 0xFFFFFFFFUL;
  192. if (rdev->flags & RADEON_IS_AGP) {
  193. r = radeon_agp_init(rdev);
  194. if (r) {
  195. printk(KERN_WARNING "[drm] Disabling AGP\n");
  196. rdev->flags &= ~RADEON_IS_AGP;
  197. rdev->mc.gtt_size = radeon_gart_size * 1024 * 1024;
  198. } else {
  199. rdev->mc.gtt_location = rdev->mc.agp_base;
  200. }
  201. }
  202. r = radeon_mc_setup(rdev);
  203. if (r) {
  204. return r;
  205. }
  206. r100_mc_disable_clients(rdev);
  207. if (r100_mc_wait_for_idle(rdev)) {
  208. printk(KERN_WARNING "Failed to wait MC idle while "
  209. "programming pipes. Bad things might happen.\n");
  210. }
  211. r100_mc_setup(rdev);
  212. return 0;
  213. }
  214. void r100_mc_fini(struct radeon_device *rdev)
  215. {
  216. r100_pci_gart_disable(rdev);
  217. radeon_gart_table_ram_free(rdev);
  218. radeon_gart_fini(rdev);
  219. }
  220. /*
  221. * Fence emission
  222. */
  223. void r100_fence_ring_emit(struct radeon_device *rdev,
  224. struct radeon_fence *fence)
  225. {
  226. /* Who ever call radeon_fence_emit should call ring_lock and ask
  227. * for enough space (today caller are ib schedule and buffer move) */
  228. /* Wait until IDLE & CLEAN */
  229. radeon_ring_write(rdev, PACKET0(0x1720, 0));
  230. radeon_ring_write(rdev, (1 << 16) | (1 << 17));
  231. /* Emit fence sequence & fire IRQ */
  232. radeon_ring_write(rdev, PACKET0(rdev->fence_drv.scratch_reg, 0));
  233. radeon_ring_write(rdev, fence->seq);
  234. radeon_ring_write(rdev, PACKET0(RADEON_GEN_INT_STATUS, 0));
  235. radeon_ring_write(rdev, RADEON_SW_INT_FIRE);
  236. }
  237. /*
  238. * Writeback
  239. */
  240. int r100_wb_init(struct radeon_device *rdev)
  241. {
  242. int r;
  243. if (rdev->wb.wb_obj == NULL) {
  244. r = radeon_object_create(rdev, NULL, 4096,
  245. true,
  246. RADEON_GEM_DOMAIN_GTT,
  247. false, &rdev->wb.wb_obj);
  248. if (r) {
  249. DRM_ERROR("radeon: failed to create WB buffer (%d).\n", r);
  250. return r;
  251. }
  252. r = radeon_object_pin(rdev->wb.wb_obj,
  253. RADEON_GEM_DOMAIN_GTT,
  254. &rdev->wb.gpu_addr);
  255. if (r) {
  256. DRM_ERROR("radeon: failed to pin WB buffer (%d).\n", r);
  257. return r;
  258. }
  259. r = radeon_object_kmap(rdev->wb.wb_obj, (void **)&rdev->wb.wb);
  260. if (r) {
  261. DRM_ERROR("radeon: failed to map WB buffer (%d).\n", r);
  262. return r;
  263. }
  264. }
  265. WREG32(0x774, rdev->wb.gpu_addr);
  266. WREG32(0x70C, rdev->wb.gpu_addr + 1024);
  267. WREG32(0x770, 0xff);
  268. return 0;
  269. }
  270. void r100_wb_fini(struct radeon_device *rdev)
  271. {
  272. if (rdev->wb.wb_obj) {
  273. radeon_object_kunmap(rdev->wb.wb_obj);
  274. radeon_object_unpin(rdev->wb.wb_obj);
  275. radeon_object_unref(&rdev->wb.wb_obj);
  276. rdev->wb.wb = NULL;
  277. rdev->wb.wb_obj = NULL;
  278. }
  279. }
  280. int r100_copy_blit(struct radeon_device *rdev,
  281. uint64_t src_offset,
  282. uint64_t dst_offset,
  283. unsigned num_pages,
  284. struct radeon_fence *fence)
  285. {
  286. uint32_t cur_pages;
  287. uint32_t stride_bytes = PAGE_SIZE;
  288. uint32_t pitch;
  289. uint32_t stride_pixels;
  290. unsigned ndw;
  291. int num_loops;
  292. int r = 0;
  293. /* radeon limited to 16k stride */
  294. stride_bytes &= 0x3fff;
  295. /* radeon pitch is /64 */
  296. pitch = stride_bytes / 64;
  297. stride_pixels = stride_bytes / 4;
  298. num_loops = DIV_ROUND_UP(num_pages, 8191);
  299. /* Ask for enough room for blit + flush + fence */
  300. ndw = 64 + (10 * num_loops);
  301. r = radeon_ring_lock(rdev, ndw);
  302. if (r) {
  303. DRM_ERROR("radeon: moving bo (%d) asking for %u dw.\n", r, ndw);
  304. return -EINVAL;
  305. }
  306. while (num_pages > 0) {
  307. cur_pages = num_pages;
  308. if (cur_pages > 8191) {
  309. cur_pages = 8191;
  310. }
  311. num_pages -= cur_pages;
  312. /* pages are in Y direction - height
  313. page width in X direction - width */
  314. radeon_ring_write(rdev, PACKET3(PACKET3_BITBLT_MULTI, 8));
  315. radeon_ring_write(rdev,
  316. RADEON_GMC_SRC_PITCH_OFFSET_CNTL |
  317. RADEON_GMC_DST_PITCH_OFFSET_CNTL |
  318. RADEON_GMC_SRC_CLIPPING |
  319. RADEON_GMC_DST_CLIPPING |
  320. RADEON_GMC_BRUSH_NONE |
  321. (RADEON_COLOR_FORMAT_ARGB8888 << 8) |
  322. RADEON_GMC_SRC_DATATYPE_COLOR |
  323. RADEON_ROP3_S |
  324. RADEON_DP_SRC_SOURCE_MEMORY |
  325. RADEON_GMC_CLR_CMP_CNTL_DIS |
  326. RADEON_GMC_WR_MSK_DIS);
  327. radeon_ring_write(rdev, (pitch << 22) | (src_offset >> 10));
  328. radeon_ring_write(rdev, (pitch << 22) | (dst_offset >> 10));
  329. radeon_ring_write(rdev, (0x1fff) | (0x1fff << 16));
  330. radeon_ring_write(rdev, 0);
  331. radeon_ring_write(rdev, (0x1fff) | (0x1fff << 16));
  332. radeon_ring_write(rdev, num_pages);
  333. radeon_ring_write(rdev, num_pages);
  334. radeon_ring_write(rdev, cur_pages | (stride_pixels << 16));
  335. }
  336. radeon_ring_write(rdev, PACKET0(RADEON_DSTCACHE_CTLSTAT, 0));
  337. radeon_ring_write(rdev, RADEON_RB2D_DC_FLUSH_ALL);
  338. radeon_ring_write(rdev, PACKET0(RADEON_WAIT_UNTIL, 0));
  339. radeon_ring_write(rdev,
  340. RADEON_WAIT_2D_IDLECLEAN |
  341. RADEON_WAIT_HOST_IDLECLEAN |
  342. RADEON_WAIT_DMA_GUI_IDLE);
  343. if (fence) {
  344. r = radeon_fence_emit(rdev, fence);
  345. }
  346. radeon_ring_unlock_commit(rdev);
  347. return r;
  348. }
  349. /*
  350. * CP
  351. */
  352. void r100_ring_start(struct radeon_device *rdev)
  353. {
  354. int r;
  355. r = radeon_ring_lock(rdev, 2);
  356. if (r) {
  357. return;
  358. }
  359. radeon_ring_write(rdev, PACKET0(RADEON_ISYNC_CNTL, 0));
  360. radeon_ring_write(rdev,
  361. RADEON_ISYNC_ANY2D_IDLE3D |
  362. RADEON_ISYNC_ANY3D_IDLE2D |
  363. RADEON_ISYNC_WAIT_IDLEGUI |
  364. RADEON_ISYNC_CPSCRATCH_IDLEGUI);
  365. radeon_ring_unlock_commit(rdev);
  366. }
  367. static void r100_cp_load_microcode(struct radeon_device *rdev)
  368. {
  369. int i;
  370. if (r100_gui_wait_for_idle(rdev)) {
  371. printk(KERN_WARNING "Failed to wait GUI idle while "
  372. "programming pipes. Bad things might happen.\n");
  373. }
  374. WREG32(RADEON_CP_ME_RAM_ADDR, 0);
  375. if ((rdev->family == CHIP_R100) || (rdev->family == CHIP_RV100) ||
  376. (rdev->family == CHIP_RV200) || (rdev->family == CHIP_RS100) ||
  377. (rdev->family == CHIP_RS200)) {
  378. DRM_INFO("Loading R100 Microcode\n");
  379. for (i = 0; i < 256; i++) {
  380. WREG32(RADEON_CP_ME_RAM_DATAH, R100_cp_microcode[i][1]);
  381. WREG32(RADEON_CP_ME_RAM_DATAL, R100_cp_microcode[i][0]);
  382. }
  383. } else if ((rdev->family == CHIP_R200) ||
  384. (rdev->family == CHIP_RV250) ||
  385. (rdev->family == CHIP_RV280) ||
  386. (rdev->family == CHIP_RS300)) {
  387. DRM_INFO("Loading R200 Microcode\n");
  388. for (i = 0; i < 256; i++) {
  389. WREG32(RADEON_CP_ME_RAM_DATAH, R200_cp_microcode[i][1]);
  390. WREG32(RADEON_CP_ME_RAM_DATAL, R200_cp_microcode[i][0]);
  391. }
  392. } else if ((rdev->family == CHIP_R300) ||
  393. (rdev->family == CHIP_R350) ||
  394. (rdev->family == CHIP_RV350) ||
  395. (rdev->family == CHIP_RV380) ||
  396. (rdev->family == CHIP_RS400) ||
  397. (rdev->family == CHIP_RS480)) {
  398. DRM_INFO("Loading R300 Microcode\n");
  399. for (i = 0; i < 256; i++) {
  400. WREG32(RADEON_CP_ME_RAM_DATAH, R300_cp_microcode[i][1]);
  401. WREG32(RADEON_CP_ME_RAM_DATAL, R300_cp_microcode[i][0]);
  402. }
  403. } else if ((rdev->family == CHIP_R420) ||
  404. (rdev->family == CHIP_R423) ||
  405. (rdev->family == CHIP_RV410)) {
  406. DRM_INFO("Loading R400 Microcode\n");
  407. for (i = 0; i < 256; i++) {
  408. WREG32(RADEON_CP_ME_RAM_DATAH, R420_cp_microcode[i][1]);
  409. WREG32(RADEON_CP_ME_RAM_DATAL, R420_cp_microcode[i][0]);
  410. }
  411. } else if ((rdev->family == CHIP_RS690) ||
  412. (rdev->family == CHIP_RS740)) {
  413. DRM_INFO("Loading RS690/RS740 Microcode\n");
  414. for (i = 0; i < 256; i++) {
  415. WREG32(RADEON_CP_ME_RAM_DATAH, RS690_cp_microcode[i][1]);
  416. WREG32(RADEON_CP_ME_RAM_DATAL, RS690_cp_microcode[i][0]);
  417. }
  418. } else if (rdev->family == CHIP_RS600) {
  419. DRM_INFO("Loading RS600 Microcode\n");
  420. for (i = 0; i < 256; i++) {
  421. WREG32(RADEON_CP_ME_RAM_DATAH, RS600_cp_microcode[i][1]);
  422. WREG32(RADEON_CP_ME_RAM_DATAL, RS600_cp_microcode[i][0]);
  423. }
  424. } else if ((rdev->family == CHIP_RV515) ||
  425. (rdev->family == CHIP_R520) ||
  426. (rdev->family == CHIP_RV530) ||
  427. (rdev->family == CHIP_R580) ||
  428. (rdev->family == CHIP_RV560) ||
  429. (rdev->family == CHIP_RV570)) {
  430. DRM_INFO("Loading R500 Microcode\n");
  431. for (i = 0; i < 256; i++) {
  432. WREG32(RADEON_CP_ME_RAM_DATAH, R520_cp_microcode[i][1]);
  433. WREG32(RADEON_CP_ME_RAM_DATAL, R520_cp_microcode[i][0]);
  434. }
  435. }
  436. }
  437. int r100_cp_init(struct radeon_device *rdev, unsigned ring_size)
  438. {
  439. unsigned rb_bufsz;
  440. unsigned rb_blksz;
  441. unsigned max_fetch;
  442. unsigned pre_write_timer;
  443. unsigned pre_write_limit;
  444. unsigned indirect2_start;
  445. unsigned indirect1_start;
  446. uint32_t tmp;
  447. int r;
  448. if (r100_debugfs_cp_init(rdev)) {
  449. DRM_ERROR("Failed to register debugfs file for CP !\n");
  450. }
  451. /* Reset CP */
  452. tmp = RREG32(RADEON_CP_CSQ_STAT);
  453. if ((tmp & (1 << 31))) {
  454. DRM_INFO("radeon: cp busy (0x%08X) resetting\n", tmp);
  455. WREG32(RADEON_CP_CSQ_MODE, 0);
  456. WREG32(RADEON_CP_CSQ_CNTL, 0);
  457. WREG32(RADEON_RBBM_SOFT_RESET, RADEON_SOFT_RESET_CP);
  458. tmp = RREG32(RADEON_RBBM_SOFT_RESET);
  459. mdelay(2);
  460. WREG32(RADEON_RBBM_SOFT_RESET, 0);
  461. tmp = RREG32(RADEON_RBBM_SOFT_RESET);
  462. mdelay(2);
  463. tmp = RREG32(RADEON_CP_CSQ_STAT);
  464. if ((tmp & (1 << 31))) {
  465. DRM_INFO("radeon: cp reset failed (0x%08X)\n", tmp);
  466. }
  467. } else {
  468. DRM_INFO("radeon: cp idle (0x%08X)\n", tmp);
  469. }
  470. /* Align ring size */
  471. rb_bufsz = drm_order(ring_size / 8);
  472. ring_size = (1 << (rb_bufsz + 1)) * 4;
  473. r100_cp_load_microcode(rdev);
  474. r = radeon_ring_init(rdev, ring_size);
  475. if (r) {
  476. return r;
  477. }
  478. /* Each time the cp read 1024 bytes (16 dword/quadword) update
  479. * the rptr copy in system ram */
  480. rb_blksz = 9;
  481. /* cp will read 128bytes at a time (4 dwords) */
  482. max_fetch = 1;
  483. rdev->cp.align_mask = 16 - 1;
  484. /* Write to CP_RB_WPTR will be delayed for pre_write_timer clocks */
  485. pre_write_timer = 64;
  486. /* Force CP_RB_WPTR write if written more than one time before the
  487. * delay expire
  488. */
  489. pre_write_limit = 0;
  490. /* Setup the cp cache like this (cache size is 96 dwords) :
  491. * RING 0 to 15
  492. * INDIRECT1 16 to 79
  493. * INDIRECT2 80 to 95
  494. * So ring cache size is 16dwords (> (2 * max_fetch = 2 * 4dwords))
  495. * indirect1 cache size is 64dwords (> (2 * max_fetch = 2 * 4dwords))
  496. * indirect2 cache size is 16dwords (> (2 * max_fetch = 2 * 4dwords))
  497. * Idea being that most of the gpu cmd will be through indirect1 buffer
  498. * so it gets the bigger cache.
  499. */
  500. indirect2_start = 80;
  501. indirect1_start = 16;
  502. /* cp setup */
  503. WREG32(0x718, pre_write_timer | (pre_write_limit << 28));
  504. WREG32(RADEON_CP_RB_CNTL,
  505. #ifdef __BIG_ENDIAN
  506. RADEON_BUF_SWAP_32BIT |
  507. #endif
  508. REG_SET(RADEON_RB_BUFSZ, rb_bufsz) |
  509. REG_SET(RADEON_RB_BLKSZ, rb_blksz) |
  510. REG_SET(RADEON_MAX_FETCH, max_fetch) |
  511. RADEON_RB_NO_UPDATE);
  512. /* Set ring address */
  513. DRM_INFO("radeon: ring at 0x%016lX\n", (unsigned long)rdev->cp.gpu_addr);
  514. WREG32(RADEON_CP_RB_BASE, rdev->cp.gpu_addr);
  515. /* Force read & write ptr to 0 */
  516. tmp = RREG32(RADEON_CP_RB_CNTL);
  517. WREG32(RADEON_CP_RB_CNTL, tmp | RADEON_RB_RPTR_WR_ENA);
  518. WREG32(RADEON_CP_RB_RPTR_WR, 0);
  519. WREG32(RADEON_CP_RB_WPTR, 0);
  520. WREG32(RADEON_CP_RB_CNTL, tmp);
  521. udelay(10);
  522. rdev->cp.rptr = RREG32(RADEON_CP_RB_RPTR);
  523. rdev->cp.wptr = RREG32(RADEON_CP_RB_WPTR);
  524. /* Set cp mode to bus mastering & enable cp*/
  525. WREG32(RADEON_CP_CSQ_MODE,
  526. REG_SET(RADEON_INDIRECT2_START, indirect2_start) |
  527. REG_SET(RADEON_INDIRECT1_START, indirect1_start));
  528. WREG32(0x718, 0);
  529. WREG32(0x744, 0x00004D4D);
  530. WREG32(RADEON_CP_CSQ_CNTL, RADEON_CSQ_PRIBM_INDBM);
  531. radeon_ring_start(rdev);
  532. r = radeon_ring_test(rdev);
  533. if (r) {
  534. DRM_ERROR("radeon: cp isn't working (%d).\n", r);
  535. return r;
  536. }
  537. rdev->cp.ready = true;
  538. return 0;
  539. }
  540. void r100_cp_fini(struct radeon_device *rdev)
  541. {
  542. /* Disable ring */
  543. rdev->cp.ready = false;
  544. WREG32(RADEON_CP_CSQ_CNTL, 0);
  545. radeon_ring_fini(rdev);
  546. DRM_INFO("radeon: cp finalized\n");
  547. }
  548. void r100_cp_disable(struct radeon_device *rdev)
  549. {
  550. /* Disable ring */
  551. rdev->cp.ready = false;
  552. WREG32(RADEON_CP_CSQ_MODE, 0);
  553. WREG32(RADEON_CP_CSQ_CNTL, 0);
  554. if (r100_gui_wait_for_idle(rdev)) {
  555. printk(KERN_WARNING "Failed to wait GUI idle while "
  556. "programming pipes. Bad things might happen.\n");
  557. }
  558. }
  559. int r100_cp_reset(struct radeon_device *rdev)
  560. {
  561. uint32_t tmp;
  562. bool reinit_cp;
  563. int i;
  564. reinit_cp = rdev->cp.ready;
  565. rdev->cp.ready = false;
  566. WREG32(RADEON_CP_CSQ_MODE, 0);
  567. WREG32(RADEON_CP_CSQ_CNTL, 0);
  568. WREG32(RADEON_RBBM_SOFT_RESET, RADEON_SOFT_RESET_CP);
  569. (void)RREG32(RADEON_RBBM_SOFT_RESET);
  570. udelay(200);
  571. WREG32(RADEON_RBBM_SOFT_RESET, 0);
  572. /* Wait to prevent race in RBBM_STATUS */
  573. mdelay(1);
  574. for (i = 0; i < rdev->usec_timeout; i++) {
  575. tmp = RREG32(RADEON_RBBM_STATUS);
  576. if (!(tmp & (1 << 16))) {
  577. DRM_INFO("CP reset succeed (RBBM_STATUS=0x%08X)\n",
  578. tmp);
  579. if (reinit_cp) {
  580. return r100_cp_init(rdev, rdev->cp.ring_size);
  581. }
  582. return 0;
  583. }
  584. DRM_UDELAY(1);
  585. }
  586. tmp = RREG32(RADEON_RBBM_STATUS);
  587. DRM_ERROR("Failed to reset CP (RBBM_STATUS=0x%08X)!\n", tmp);
  588. return -1;
  589. }
  590. /*
  591. * CS functions
  592. */
  593. int r100_cs_parse_packet0(struct radeon_cs_parser *p,
  594. struct radeon_cs_packet *pkt,
  595. const unsigned *auth, unsigned n,
  596. radeon_packet0_check_t check)
  597. {
  598. unsigned reg;
  599. unsigned i, j, m;
  600. unsigned idx;
  601. int r;
  602. idx = pkt->idx + 1;
  603. reg = pkt->reg;
  604. /* Check that register fall into register range
  605. * determined by the number of entry (n) in the
  606. * safe register bitmap.
  607. */
  608. if (pkt->one_reg_wr) {
  609. if ((reg >> 7) > n) {
  610. return -EINVAL;
  611. }
  612. } else {
  613. if (((reg + (pkt->count << 2)) >> 7) > n) {
  614. return -EINVAL;
  615. }
  616. }
  617. for (i = 0; i <= pkt->count; i++, idx++) {
  618. j = (reg >> 7);
  619. m = 1 << ((reg >> 2) & 31);
  620. if (auth[j] & m) {
  621. r = check(p, pkt, idx, reg);
  622. if (r) {
  623. return r;
  624. }
  625. }
  626. if (pkt->one_reg_wr) {
  627. if (!(auth[j] & m)) {
  628. break;
  629. }
  630. } else {
  631. reg += 4;
  632. }
  633. }
  634. return 0;
  635. }
  636. void r100_cs_dump_packet(struct radeon_cs_parser *p,
  637. struct radeon_cs_packet *pkt)
  638. {
  639. struct radeon_cs_chunk *ib_chunk;
  640. volatile uint32_t *ib;
  641. unsigned i;
  642. unsigned idx;
  643. ib = p->ib->ptr;
  644. ib_chunk = &p->chunks[p->chunk_ib_idx];
  645. idx = pkt->idx;
  646. for (i = 0; i <= (pkt->count + 1); i++, idx++) {
  647. DRM_INFO("ib[%d]=0x%08X\n", idx, ib[idx]);
  648. }
  649. }
  650. /**
  651. * r100_cs_packet_parse() - parse cp packet and point ib index to next packet
  652. * @parser: parser structure holding parsing context.
  653. * @pkt: where to store packet informations
  654. *
  655. * Assume that chunk_ib_index is properly set. Will return -EINVAL
  656. * if packet is bigger than remaining ib size. or if packets is unknown.
  657. **/
  658. int r100_cs_packet_parse(struct radeon_cs_parser *p,
  659. struct radeon_cs_packet *pkt,
  660. unsigned idx)
  661. {
  662. struct radeon_cs_chunk *ib_chunk = &p->chunks[p->chunk_ib_idx];
  663. uint32_t header = ib_chunk->kdata[idx];
  664. if (idx >= ib_chunk->length_dw) {
  665. DRM_ERROR("Can not parse packet at %d after CS end %d !\n",
  666. idx, ib_chunk->length_dw);
  667. return -EINVAL;
  668. }
  669. pkt->idx = idx;
  670. pkt->type = CP_PACKET_GET_TYPE(header);
  671. pkt->count = CP_PACKET_GET_COUNT(header);
  672. switch (pkt->type) {
  673. case PACKET_TYPE0:
  674. pkt->reg = CP_PACKET0_GET_REG(header);
  675. pkt->one_reg_wr = CP_PACKET0_GET_ONE_REG_WR(header);
  676. break;
  677. case PACKET_TYPE3:
  678. pkt->opcode = CP_PACKET3_GET_OPCODE(header);
  679. break;
  680. case PACKET_TYPE2:
  681. pkt->count = -1;
  682. break;
  683. default:
  684. DRM_ERROR("Unknown packet type %d at %d !\n", pkt->type, idx);
  685. return -EINVAL;
  686. }
  687. if ((pkt->count + 1 + pkt->idx) >= ib_chunk->length_dw) {
  688. DRM_ERROR("Packet (%d:%d:%d) end after CS buffer (%d) !\n",
  689. pkt->idx, pkt->type, pkt->count, ib_chunk->length_dw);
  690. return -EINVAL;
  691. }
  692. return 0;
  693. }
  694. /**
  695. * r100_cs_packet_next_vline() - parse userspace VLINE packet
  696. * @parser: parser structure holding parsing context.
  697. *
  698. * Userspace sends a special sequence for VLINE waits.
  699. * PACKET0 - VLINE_START_END + value
  700. * PACKET0 - WAIT_UNTIL +_value
  701. * RELOC (P3) - crtc_id in reloc.
  702. *
  703. * This function parses this and relocates the VLINE START END
  704. * and WAIT UNTIL packets to the correct crtc.
  705. * It also detects a switched off crtc and nulls out the
  706. * wait in that case.
  707. */
  708. int r100_cs_packet_parse_vline(struct radeon_cs_parser *p)
  709. {
  710. struct radeon_cs_chunk *ib_chunk;
  711. struct drm_mode_object *obj;
  712. struct drm_crtc *crtc;
  713. struct radeon_crtc *radeon_crtc;
  714. struct radeon_cs_packet p3reloc, waitreloc;
  715. int crtc_id;
  716. int r;
  717. uint32_t header, h_idx, reg;
  718. ib_chunk = &p->chunks[p->chunk_ib_idx];
  719. /* parse the wait until */
  720. r = r100_cs_packet_parse(p, &waitreloc, p->idx);
  721. if (r)
  722. return r;
  723. /* check its a wait until and only 1 count */
  724. if (waitreloc.reg != RADEON_WAIT_UNTIL ||
  725. waitreloc.count != 0) {
  726. DRM_ERROR("vline wait had illegal wait until segment\n");
  727. r = -EINVAL;
  728. return r;
  729. }
  730. if (ib_chunk->kdata[waitreloc.idx + 1] != RADEON_WAIT_CRTC_VLINE) {
  731. DRM_ERROR("vline wait had illegal wait until\n");
  732. r = -EINVAL;
  733. return r;
  734. }
  735. /* jump over the NOP */
  736. r = r100_cs_packet_parse(p, &p3reloc, p->idx);
  737. if (r)
  738. return r;
  739. h_idx = p->idx - 2;
  740. p->idx += waitreloc.count;
  741. p->idx += p3reloc.count;
  742. header = ib_chunk->kdata[h_idx];
  743. crtc_id = ib_chunk->kdata[h_idx + 5];
  744. reg = ib_chunk->kdata[h_idx] >> 2;
  745. mutex_lock(&p->rdev->ddev->mode_config.mutex);
  746. obj = drm_mode_object_find(p->rdev->ddev, crtc_id, DRM_MODE_OBJECT_CRTC);
  747. if (!obj) {
  748. DRM_ERROR("cannot find crtc %d\n", crtc_id);
  749. r = -EINVAL;
  750. goto out;
  751. }
  752. crtc = obj_to_crtc(obj);
  753. radeon_crtc = to_radeon_crtc(crtc);
  754. crtc_id = radeon_crtc->crtc_id;
  755. if (!crtc->enabled) {
  756. /* if the CRTC isn't enabled - we need to nop out the wait until */
  757. ib_chunk->kdata[h_idx + 2] = PACKET2(0);
  758. ib_chunk->kdata[h_idx + 3] = PACKET2(0);
  759. } else if (crtc_id == 1) {
  760. switch (reg) {
  761. case AVIVO_D1MODE_VLINE_START_END:
  762. header &= R300_CP_PACKET0_REG_MASK;
  763. header |= AVIVO_D2MODE_VLINE_START_END >> 2;
  764. break;
  765. case RADEON_CRTC_GUI_TRIG_VLINE:
  766. header &= R300_CP_PACKET0_REG_MASK;
  767. header |= RADEON_CRTC2_GUI_TRIG_VLINE >> 2;
  768. break;
  769. default:
  770. DRM_ERROR("unknown crtc reloc\n");
  771. r = -EINVAL;
  772. goto out;
  773. }
  774. ib_chunk->kdata[h_idx] = header;
  775. ib_chunk->kdata[h_idx + 3] |= RADEON_ENG_DISPLAY_SELECT_CRTC1;
  776. }
  777. out:
  778. mutex_unlock(&p->rdev->ddev->mode_config.mutex);
  779. return r;
  780. }
  781. /**
  782. * r100_cs_packet_next_reloc() - parse next packet which should be reloc packet3
  783. * @parser: parser structure holding parsing context.
  784. * @data: pointer to relocation data
  785. * @offset_start: starting offset
  786. * @offset_mask: offset mask (to align start offset on)
  787. * @reloc: reloc informations
  788. *
  789. * Check next packet is relocation packet3, do bo validation and compute
  790. * GPU offset using the provided start.
  791. **/
  792. int r100_cs_packet_next_reloc(struct radeon_cs_parser *p,
  793. struct radeon_cs_reloc **cs_reloc)
  794. {
  795. struct radeon_cs_chunk *ib_chunk;
  796. struct radeon_cs_chunk *relocs_chunk;
  797. struct radeon_cs_packet p3reloc;
  798. unsigned idx;
  799. int r;
  800. if (p->chunk_relocs_idx == -1) {
  801. DRM_ERROR("No relocation chunk !\n");
  802. return -EINVAL;
  803. }
  804. *cs_reloc = NULL;
  805. ib_chunk = &p->chunks[p->chunk_ib_idx];
  806. relocs_chunk = &p->chunks[p->chunk_relocs_idx];
  807. r = r100_cs_packet_parse(p, &p3reloc, p->idx);
  808. if (r) {
  809. return r;
  810. }
  811. p->idx += p3reloc.count + 2;
  812. if (p3reloc.type != PACKET_TYPE3 || p3reloc.opcode != PACKET3_NOP) {
  813. DRM_ERROR("No packet3 for relocation for packet at %d.\n",
  814. p3reloc.idx);
  815. r100_cs_dump_packet(p, &p3reloc);
  816. return -EINVAL;
  817. }
  818. idx = ib_chunk->kdata[p3reloc.idx + 1];
  819. if (idx >= relocs_chunk->length_dw) {
  820. DRM_ERROR("Relocs at %d after relocations chunk end %d !\n",
  821. idx, relocs_chunk->length_dw);
  822. r100_cs_dump_packet(p, &p3reloc);
  823. return -EINVAL;
  824. }
  825. /* FIXME: we assume reloc size is 4 dwords */
  826. *cs_reloc = p->relocs_ptr[(idx / 4)];
  827. return 0;
  828. }
  829. static int r100_packet0_check(struct radeon_cs_parser *p,
  830. struct radeon_cs_packet *pkt)
  831. {
  832. struct radeon_cs_chunk *ib_chunk;
  833. struct radeon_cs_reloc *reloc;
  834. volatile uint32_t *ib;
  835. uint32_t tmp;
  836. unsigned reg;
  837. unsigned i;
  838. unsigned idx;
  839. bool onereg;
  840. int r;
  841. ib = p->ib->ptr;
  842. ib_chunk = &p->chunks[p->chunk_ib_idx];
  843. idx = pkt->idx + 1;
  844. reg = pkt->reg;
  845. onereg = false;
  846. if (CP_PACKET0_GET_ONE_REG_WR(ib_chunk->kdata[pkt->idx])) {
  847. onereg = true;
  848. }
  849. for (i = 0; i <= pkt->count; i++, idx++, reg += 4) {
  850. switch (reg) {
  851. case RADEON_CRTC_GUI_TRIG_VLINE:
  852. r = r100_cs_packet_parse_vline(p);
  853. if (r) {
  854. DRM_ERROR("No reloc for ib[%d]=0x%04X\n",
  855. idx, reg);
  856. r100_cs_dump_packet(p, pkt);
  857. return r;
  858. }
  859. break;
  860. /* FIXME: only allow PACKET3 blit? easier to check for out of
  861. * range access */
  862. case RADEON_DST_PITCH_OFFSET:
  863. case RADEON_SRC_PITCH_OFFSET:
  864. r = r100_cs_packet_next_reloc(p, &reloc);
  865. if (r) {
  866. DRM_ERROR("No reloc for ib[%d]=0x%04X\n",
  867. idx, reg);
  868. r100_cs_dump_packet(p, pkt);
  869. return r;
  870. }
  871. tmp = ib_chunk->kdata[idx] & 0x003fffff;
  872. tmp += (((u32)reloc->lobj.gpu_offset) >> 10);
  873. ib[idx] = (ib_chunk->kdata[idx] & 0xffc00000) | tmp;
  874. break;
  875. case RADEON_RB3D_DEPTHOFFSET:
  876. case RADEON_RB3D_COLOROFFSET:
  877. case R300_RB3D_COLOROFFSET0:
  878. case R300_ZB_DEPTHOFFSET:
  879. case R200_PP_TXOFFSET_0:
  880. case R200_PP_TXOFFSET_1:
  881. case R200_PP_TXOFFSET_2:
  882. case R200_PP_TXOFFSET_3:
  883. case R200_PP_TXOFFSET_4:
  884. case R200_PP_TXOFFSET_5:
  885. case RADEON_PP_TXOFFSET_0:
  886. case RADEON_PP_TXOFFSET_1:
  887. case RADEON_PP_TXOFFSET_2:
  888. case R300_TX_OFFSET_0:
  889. case R300_TX_OFFSET_0+4:
  890. case R300_TX_OFFSET_0+8:
  891. case R300_TX_OFFSET_0+12:
  892. case R300_TX_OFFSET_0+16:
  893. case R300_TX_OFFSET_0+20:
  894. case R300_TX_OFFSET_0+24:
  895. case R300_TX_OFFSET_0+28:
  896. case R300_TX_OFFSET_0+32:
  897. case R300_TX_OFFSET_0+36:
  898. case R300_TX_OFFSET_0+40:
  899. case R300_TX_OFFSET_0+44:
  900. case R300_TX_OFFSET_0+48:
  901. case R300_TX_OFFSET_0+52:
  902. case R300_TX_OFFSET_0+56:
  903. case R300_TX_OFFSET_0+60:
  904. r = r100_cs_packet_next_reloc(p, &reloc);
  905. if (r) {
  906. DRM_ERROR("No reloc for ib[%d]=0x%04X\n",
  907. idx, reg);
  908. r100_cs_dump_packet(p, pkt);
  909. return r;
  910. }
  911. ib[idx] = ib_chunk->kdata[idx] + ((u32)reloc->lobj.gpu_offset);
  912. break;
  913. default:
  914. /* FIXME: we don't want to allow anyothers packet */
  915. break;
  916. }
  917. if (onereg) {
  918. /* FIXME: forbid onereg write to register on relocate */
  919. break;
  920. }
  921. }
  922. return 0;
  923. }
  924. int r100_cs_track_check_pkt3_indx_buffer(struct radeon_cs_parser *p,
  925. struct radeon_cs_packet *pkt,
  926. struct radeon_object *robj)
  927. {
  928. struct radeon_cs_chunk *ib_chunk;
  929. unsigned idx;
  930. ib_chunk = &p->chunks[p->chunk_ib_idx];
  931. idx = pkt->idx + 1;
  932. if ((ib_chunk->kdata[idx+2] + 1) > radeon_object_size(robj)) {
  933. DRM_ERROR("[drm] Buffer too small for PACKET3 INDX_BUFFER "
  934. "(need %u have %lu) !\n",
  935. ib_chunk->kdata[idx+2] + 1,
  936. radeon_object_size(robj));
  937. return -EINVAL;
  938. }
  939. return 0;
  940. }
  941. static int r100_packet3_check(struct radeon_cs_parser *p,
  942. struct radeon_cs_packet *pkt)
  943. {
  944. struct radeon_cs_chunk *ib_chunk;
  945. struct radeon_cs_reloc *reloc;
  946. unsigned idx;
  947. unsigned i, c;
  948. volatile uint32_t *ib;
  949. int r;
  950. ib = p->ib->ptr;
  951. ib_chunk = &p->chunks[p->chunk_ib_idx];
  952. idx = pkt->idx + 1;
  953. switch (pkt->opcode) {
  954. case PACKET3_3D_LOAD_VBPNTR:
  955. c = ib_chunk->kdata[idx++];
  956. for (i = 0; i < (c - 1); i += 2, idx += 3) {
  957. r = r100_cs_packet_next_reloc(p, &reloc);
  958. if (r) {
  959. DRM_ERROR("No reloc for packet3 %d\n",
  960. pkt->opcode);
  961. r100_cs_dump_packet(p, pkt);
  962. return r;
  963. }
  964. ib[idx+1] = ib_chunk->kdata[idx+1] + ((u32)reloc->lobj.gpu_offset);
  965. r = r100_cs_packet_next_reloc(p, &reloc);
  966. if (r) {
  967. DRM_ERROR("No reloc for packet3 %d\n",
  968. pkt->opcode);
  969. r100_cs_dump_packet(p, pkt);
  970. return r;
  971. }
  972. ib[idx+2] = ib_chunk->kdata[idx+2] + ((u32)reloc->lobj.gpu_offset);
  973. }
  974. if (c & 1) {
  975. r = r100_cs_packet_next_reloc(p, &reloc);
  976. if (r) {
  977. DRM_ERROR("No reloc for packet3 %d\n",
  978. pkt->opcode);
  979. r100_cs_dump_packet(p, pkt);
  980. return r;
  981. }
  982. ib[idx+1] = ib_chunk->kdata[idx+1] + ((u32)reloc->lobj.gpu_offset);
  983. }
  984. break;
  985. case PACKET3_INDX_BUFFER:
  986. r = r100_cs_packet_next_reloc(p, &reloc);
  987. if (r) {
  988. DRM_ERROR("No reloc for packet3 %d\n", pkt->opcode);
  989. r100_cs_dump_packet(p, pkt);
  990. return r;
  991. }
  992. ib[idx+1] = ib_chunk->kdata[idx+1] + ((u32)reloc->lobj.gpu_offset);
  993. r = r100_cs_track_check_pkt3_indx_buffer(p, pkt, reloc->robj);
  994. if (r) {
  995. return r;
  996. }
  997. break;
  998. case 0x23:
  999. /* FIXME: cleanup */
  1000. /* 3D_RNDR_GEN_INDX_PRIM on r100/r200 */
  1001. r = r100_cs_packet_next_reloc(p, &reloc);
  1002. if (r) {
  1003. DRM_ERROR("No reloc for packet3 %d\n", pkt->opcode);
  1004. r100_cs_dump_packet(p, pkt);
  1005. return r;
  1006. }
  1007. ib[idx] = ib_chunk->kdata[idx] + ((u32)reloc->lobj.gpu_offset);
  1008. break;
  1009. case PACKET3_3D_DRAW_IMMD:
  1010. /* triggers drawing using in-packet vertex data */
  1011. case PACKET3_3D_DRAW_IMMD_2:
  1012. /* triggers drawing using in-packet vertex data */
  1013. case PACKET3_3D_DRAW_VBUF_2:
  1014. /* triggers drawing of vertex buffers setup elsewhere */
  1015. case PACKET3_3D_DRAW_INDX_2:
  1016. /* triggers drawing using indices to vertex buffer */
  1017. case PACKET3_3D_DRAW_VBUF:
  1018. /* triggers drawing of vertex buffers setup elsewhere */
  1019. case PACKET3_3D_DRAW_INDX:
  1020. /* triggers drawing using indices to vertex buffer */
  1021. case PACKET3_NOP:
  1022. break;
  1023. default:
  1024. DRM_ERROR("Packet3 opcode %x not supported\n", pkt->opcode);
  1025. return -EINVAL;
  1026. }
  1027. return 0;
  1028. }
  1029. int r100_cs_parse(struct radeon_cs_parser *p)
  1030. {
  1031. struct radeon_cs_packet pkt;
  1032. int r;
  1033. do {
  1034. r = r100_cs_packet_parse(p, &pkt, p->idx);
  1035. if (r) {
  1036. return r;
  1037. }
  1038. p->idx += pkt.count + 2;
  1039. switch (pkt.type) {
  1040. case PACKET_TYPE0:
  1041. r = r100_packet0_check(p, &pkt);
  1042. break;
  1043. case PACKET_TYPE2:
  1044. break;
  1045. case PACKET_TYPE3:
  1046. r = r100_packet3_check(p, &pkt);
  1047. break;
  1048. default:
  1049. DRM_ERROR("Unknown packet type %d !\n",
  1050. pkt.type);
  1051. return -EINVAL;
  1052. }
  1053. if (r) {
  1054. return r;
  1055. }
  1056. } while (p->idx < p->chunks[p->chunk_ib_idx].length_dw);
  1057. return 0;
  1058. }
  1059. /*
  1060. * Global GPU functions
  1061. */
  1062. void r100_errata(struct radeon_device *rdev)
  1063. {
  1064. rdev->pll_errata = 0;
  1065. if (rdev->family == CHIP_RV200 || rdev->family == CHIP_RS200) {
  1066. rdev->pll_errata |= CHIP_ERRATA_PLL_DUMMYREADS;
  1067. }
  1068. if (rdev->family == CHIP_RV100 ||
  1069. rdev->family == CHIP_RS100 ||
  1070. rdev->family == CHIP_RS200) {
  1071. rdev->pll_errata |= CHIP_ERRATA_PLL_DELAY;
  1072. }
  1073. }
  1074. /* Wait for vertical sync on primary CRTC */
  1075. void r100_gpu_wait_for_vsync(struct radeon_device *rdev)
  1076. {
  1077. uint32_t crtc_gen_cntl, tmp;
  1078. int i;
  1079. crtc_gen_cntl = RREG32(RADEON_CRTC_GEN_CNTL);
  1080. if ((crtc_gen_cntl & RADEON_CRTC_DISP_REQ_EN_B) ||
  1081. !(crtc_gen_cntl & RADEON_CRTC_EN)) {
  1082. return;
  1083. }
  1084. /* Clear the CRTC_VBLANK_SAVE bit */
  1085. WREG32(RADEON_CRTC_STATUS, RADEON_CRTC_VBLANK_SAVE_CLEAR);
  1086. for (i = 0; i < rdev->usec_timeout; i++) {
  1087. tmp = RREG32(RADEON_CRTC_STATUS);
  1088. if (tmp & RADEON_CRTC_VBLANK_SAVE) {
  1089. return;
  1090. }
  1091. DRM_UDELAY(1);
  1092. }
  1093. }
  1094. /* Wait for vertical sync on secondary CRTC */
  1095. void r100_gpu_wait_for_vsync2(struct radeon_device *rdev)
  1096. {
  1097. uint32_t crtc2_gen_cntl, tmp;
  1098. int i;
  1099. crtc2_gen_cntl = RREG32(RADEON_CRTC2_GEN_CNTL);
  1100. if ((crtc2_gen_cntl & RADEON_CRTC2_DISP_REQ_EN_B) ||
  1101. !(crtc2_gen_cntl & RADEON_CRTC2_EN))
  1102. return;
  1103. /* Clear the CRTC_VBLANK_SAVE bit */
  1104. WREG32(RADEON_CRTC2_STATUS, RADEON_CRTC2_VBLANK_SAVE_CLEAR);
  1105. for (i = 0; i < rdev->usec_timeout; i++) {
  1106. tmp = RREG32(RADEON_CRTC2_STATUS);
  1107. if (tmp & RADEON_CRTC2_VBLANK_SAVE) {
  1108. return;
  1109. }
  1110. DRM_UDELAY(1);
  1111. }
  1112. }
  1113. int r100_rbbm_fifo_wait_for_entry(struct radeon_device *rdev, unsigned n)
  1114. {
  1115. unsigned i;
  1116. uint32_t tmp;
  1117. for (i = 0; i < rdev->usec_timeout; i++) {
  1118. tmp = RREG32(RADEON_RBBM_STATUS) & RADEON_RBBM_FIFOCNT_MASK;
  1119. if (tmp >= n) {
  1120. return 0;
  1121. }
  1122. DRM_UDELAY(1);
  1123. }
  1124. return -1;
  1125. }
  1126. int r100_gui_wait_for_idle(struct radeon_device *rdev)
  1127. {
  1128. unsigned i;
  1129. uint32_t tmp;
  1130. if (r100_rbbm_fifo_wait_for_entry(rdev, 64)) {
  1131. printk(KERN_WARNING "radeon: wait for empty RBBM fifo failed !"
  1132. " Bad things might happen.\n");
  1133. }
  1134. for (i = 0; i < rdev->usec_timeout; i++) {
  1135. tmp = RREG32(RADEON_RBBM_STATUS);
  1136. if (!(tmp & (1 << 31))) {
  1137. return 0;
  1138. }
  1139. DRM_UDELAY(1);
  1140. }
  1141. return -1;
  1142. }
  1143. int r100_mc_wait_for_idle(struct radeon_device *rdev)
  1144. {
  1145. unsigned i;
  1146. uint32_t tmp;
  1147. for (i = 0; i < rdev->usec_timeout; i++) {
  1148. /* read MC_STATUS */
  1149. tmp = RREG32(0x0150);
  1150. if (tmp & (1 << 2)) {
  1151. return 0;
  1152. }
  1153. DRM_UDELAY(1);
  1154. }
  1155. return -1;
  1156. }
  1157. void r100_gpu_init(struct radeon_device *rdev)
  1158. {
  1159. /* TODO: anythings to do here ? pipes ? */
  1160. r100_hdp_reset(rdev);
  1161. }
  1162. void r100_hdp_reset(struct radeon_device *rdev)
  1163. {
  1164. uint32_t tmp;
  1165. tmp = RREG32(RADEON_HOST_PATH_CNTL) & RADEON_HDP_APER_CNTL;
  1166. tmp |= (7 << 28);
  1167. WREG32(RADEON_HOST_PATH_CNTL, tmp | RADEON_HDP_SOFT_RESET | RADEON_HDP_READ_BUFFER_INVALIDATE);
  1168. (void)RREG32(RADEON_HOST_PATH_CNTL);
  1169. udelay(200);
  1170. WREG32(RADEON_RBBM_SOFT_RESET, 0);
  1171. WREG32(RADEON_HOST_PATH_CNTL, tmp);
  1172. (void)RREG32(RADEON_HOST_PATH_CNTL);
  1173. }
  1174. int r100_rb2d_reset(struct radeon_device *rdev)
  1175. {
  1176. uint32_t tmp;
  1177. int i;
  1178. WREG32(RADEON_RBBM_SOFT_RESET, RADEON_SOFT_RESET_E2);
  1179. (void)RREG32(RADEON_RBBM_SOFT_RESET);
  1180. udelay(200);
  1181. WREG32(RADEON_RBBM_SOFT_RESET, 0);
  1182. /* Wait to prevent race in RBBM_STATUS */
  1183. mdelay(1);
  1184. for (i = 0; i < rdev->usec_timeout; i++) {
  1185. tmp = RREG32(RADEON_RBBM_STATUS);
  1186. if (!(tmp & (1 << 26))) {
  1187. DRM_INFO("RB2D reset succeed (RBBM_STATUS=0x%08X)\n",
  1188. tmp);
  1189. return 0;
  1190. }
  1191. DRM_UDELAY(1);
  1192. }
  1193. tmp = RREG32(RADEON_RBBM_STATUS);
  1194. DRM_ERROR("Failed to reset RB2D (RBBM_STATUS=0x%08X)!\n", tmp);
  1195. return -1;
  1196. }
  1197. int r100_gpu_reset(struct radeon_device *rdev)
  1198. {
  1199. uint32_t status;
  1200. /* reset order likely matter */
  1201. status = RREG32(RADEON_RBBM_STATUS);
  1202. /* reset HDP */
  1203. r100_hdp_reset(rdev);
  1204. /* reset rb2d */
  1205. if (status & ((1 << 17) | (1 << 18) | (1 << 27))) {
  1206. r100_rb2d_reset(rdev);
  1207. }
  1208. /* TODO: reset 3D engine */
  1209. /* reset CP */
  1210. status = RREG32(RADEON_RBBM_STATUS);
  1211. if (status & (1 << 16)) {
  1212. r100_cp_reset(rdev);
  1213. }
  1214. /* Check if GPU is idle */
  1215. status = RREG32(RADEON_RBBM_STATUS);
  1216. if (status & (1 << 31)) {
  1217. DRM_ERROR("Failed to reset GPU (RBBM_STATUS=0x%08X)\n", status);
  1218. return -1;
  1219. }
  1220. DRM_INFO("GPU reset succeed (RBBM_STATUS=0x%08X)\n", status);
  1221. return 0;
  1222. }
  1223. /*
  1224. * VRAM info
  1225. */
  1226. static void r100_vram_get_type(struct radeon_device *rdev)
  1227. {
  1228. uint32_t tmp;
  1229. rdev->mc.vram_is_ddr = false;
  1230. if (rdev->flags & RADEON_IS_IGP)
  1231. rdev->mc.vram_is_ddr = true;
  1232. else if (RREG32(RADEON_MEM_SDRAM_MODE_REG) & RADEON_MEM_CFG_TYPE_DDR)
  1233. rdev->mc.vram_is_ddr = true;
  1234. if ((rdev->family == CHIP_RV100) ||
  1235. (rdev->family == CHIP_RS100) ||
  1236. (rdev->family == CHIP_RS200)) {
  1237. tmp = RREG32(RADEON_MEM_CNTL);
  1238. if (tmp & RV100_HALF_MODE) {
  1239. rdev->mc.vram_width = 32;
  1240. } else {
  1241. rdev->mc.vram_width = 64;
  1242. }
  1243. if (rdev->flags & RADEON_SINGLE_CRTC) {
  1244. rdev->mc.vram_width /= 4;
  1245. rdev->mc.vram_is_ddr = true;
  1246. }
  1247. } else if (rdev->family <= CHIP_RV280) {
  1248. tmp = RREG32(RADEON_MEM_CNTL);
  1249. if (tmp & RADEON_MEM_NUM_CHANNELS_MASK) {
  1250. rdev->mc.vram_width = 128;
  1251. } else {
  1252. rdev->mc.vram_width = 64;
  1253. }
  1254. } else {
  1255. /* newer IGPs */
  1256. rdev->mc.vram_width = 128;
  1257. }
  1258. }
  1259. static u32 r100_get_accessible_vram(struct radeon_device *rdev)
  1260. {
  1261. u32 aper_size;
  1262. u8 byte;
  1263. aper_size = RREG32(RADEON_CONFIG_APER_SIZE);
  1264. /* Set HDP_APER_CNTL only on cards that are known not to be broken,
  1265. * that is has the 2nd generation multifunction PCI interface
  1266. */
  1267. if (rdev->family == CHIP_RV280 ||
  1268. rdev->family >= CHIP_RV350) {
  1269. WREG32_P(RADEON_HOST_PATH_CNTL, RADEON_HDP_APER_CNTL,
  1270. ~RADEON_HDP_APER_CNTL);
  1271. DRM_INFO("Generation 2 PCI interface, using max accessible memory\n");
  1272. return aper_size * 2;
  1273. }
  1274. /* Older cards have all sorts of funny issues to deal with. First
  1275. * check if it's a multifunction card by reading the PCI config
  1276. * header type... Limit those to one aperture size
  1277. */
  1278. pci_read_config_byte(rdev->pdev, 0xe, &byte);
  1279. if (byte & 0x80) {
  1280. DRM_INFO("Generation 1 PCI interface in multifunction mode\n");
  1281. DRM_INFO("Limiting VRAM to one aperture\n");
  1282. return aper_size;
  1283. }
  1284. /* Single function older card. We read HDP_APER_CNTL to see how the BIOS
  1285. * have set it up. We don't write this as it's broken on some ASICs but
  1286. * we expect the BIOS to have done the right thing (might be too optimistic...)
  1287. */
  1288. if (RREG32(RADEON_HOST_PATH_CNTL) & RADEON_HDP_APER_CNTL)
  1289. return aper_size * 2;
  1290. return aper_size;
  1291. }
  1292. void r100_vram_init_sizes(struct radeon_device *rdev)
  1293. {
  1294. u64 config_aper_size;
  1295. u32 accessible;
  1296. config_aper_size = RREG32(RADEON_CONFIG_APER_SIZE);
  1297. if (rdev->flags & RADEON_IS_IGP) {
  1298. uint32_t tom;
  1299. /* read NB_TOM to get the amount of ram stolen for the GPU */
  1300. tom = RREG32(RADEON_NB_TOM);
  1301. rdev->mc.vram_size = (((tom >> 16) - (tom & 0xffff) + 1) << 16);
  1302. /* for IGPs we need to keep VRAM where it was put by the BIOS */
  1303. rdev->mc.vram_location = (tom & 0xffff) << 16;
  1304. WREG32(RADEON_CONFIG_MEMSIZE, rdev->mc.vram_size);
  1305. } else {
  1306. rdev->mc.vram_size = RREG32(RADEON_CONFIG_MEMSIZE);
  1307. /* Some production boards of m6 will report 0
  1308. * if it's 8 MB
  1309. */
  1310. if (rdev->mc.vram_size == 0) {
  1311. rdev->mc.vram_size = 8192 * 1024;
  1312. WREG32(RADEON_CONFIG_MEMSIZE, rdev->mc.vram_size);
  1313. }
  1314. /* let driver place VRAM */
  1315. rdev->mc.vram_location = 0xFFFFFFFFUL;
  1316. /* Fix for RN50, M6, M7 with 8/16/32(??) MBs of VRAM -
  1317. * Novell bug 204882 + along with lots of ubuntu ones */
  1318. if (config_aper_size > rdev->mc.vram_size)
  1319. rdev->mc.vram_size = config_aper_size;
  1320. }
  1321. /* work out accessible VRAM */
  1322. accessible = r100_get_accessible_vram(rdev);
  1323. rdev->mc.aper_base = drm_get_resource_start(rdev->ddev, 0);
  1324. rdev->mc.aper_size = drm_get_resource_len(rdev->ddev, 0);
  1325. if (accessible > rdev->mc.aper_size)
  1326. accessible = rdev->mc.aper_size;
  1327. if (rdev->mc.vram_size > rdev->mc.aper_size)
  1328. rdev->mc.vram_size = rdev->mc.aper_size;
  1329. }
  1330. void r100_vram_info(struct radeon_device *rdev)
  1331. {
  1332. r100_vram_get_type(rdev);
  1333. r100_vram_init_sizes(rdev);
  1334. }
  1335. /*
  1336. * Indirect registers accessor
  1337. */
  1338. void r100_pll_errata_after_index(struct radeon_device *rdev)
  1339. {
  1340. if (!(rdev->pll_errata & CHIP_ERRATA_PLL_DUMMYREADS)) {
  1341. return;
  1342. }
  1343. (void)RREG32(RADEON_CLOCK_CNTL_DATA);
  1344. (void)RREG32(RADEON_CRTC_GEN_CNTL);
  1345. }
  1346. static void r100_pll_errata_after_data(struct radeon_device *rdev)
  1347. {
  1348. /* This workarounds is necessary on RV100, RS100 and RS200 chips
  1349. * or the chip could hang on a subsequent access
  1350. */
  1351. if (rdev->pll_errata & CHIP_ERRATA_PLL_DELAY) {
  1352. udelay(5000);
  1353. }
  1354. /* This function is required to workaround a hardware bug in some (all?)
  1355. * revisions of the R300. This workaround should be called after every
  1356. * CLOCK_CNTL_INDEX register access. If not, register reads afterward
  1357. * may not be correct.
  1358. */
  1359. if (rdev->pll_errata & CHIP_ERRATA_R300_CG) {
  1360. uint32_t save, tmp;
  1361. save = RREG32(RADEON_CLOCK_CNTL_INDEX);
  1362. tmp = save & ~(0x3f | RADEON_PLL_WR_EN);
  1363. WREG32(RADEON_CLOCK_CNTL_INDEX, tmp);
  1364. tmp = RREG32(RADEON_CLOCK_CNTL_DATA);
  1365. WREG32(RADEON_CLOCK_CNTL_INDEX, save);
  1366. }
  1367. }
  1368. uint32_t r100_pll_rreg(struct radeon_device *rdev, uint32_t reg)
  1369. {
  1370. uint32_t data;
  1371. WREG8(RADEON_CLOCK_CNTL_INDEX, reg & 0x3f);
  1372. r100_pll_errata_after_index(rdev);
  1373. data = RREG32(RADEON_CLOCK_CNTL_DATA);
  1374. r100_pll_errata_after_data(rdev);
  1375. return data;
  1376. }
  1377. void r100_pll_wreg(struct radeon_device *rdev, uint32_t reg, uint32_t v)
  1378. {
  1379. WREG8(RADEON_CLOCK_CNTL_INDEX, ((reg & 0x3f) | RADEON_PLL_WR_EN));
  1380. r100_pll_errata_after_index(rdev);
  1381. WREG32(RADEON_CLOCK_CNTL_DATA, v);
  1382. r100_pll_errata_after_data(rdev);
  1383. }
  1384. uint32_t r100_mm_rreg(struct radeon_device *rdev, uint32_t reg)
  1385. {
  1386. if (reg < 0x10000)
  1387. return readl(((void __iomem *)rdev->rmmio) + reg);
  1388. else {
  1389. writel(reg, ((void __iomem *)rdev->rmmio) + RADEON_MM_INDEX);
  1390. return readl(((void __iomem *)rdev->rmmio) + RADEON_MM_DATA);
  1391. }
  1392. }
  1393. void r100_mm_wreg(struct radeon_device *rdev, uint32_t reg, uint32_t v)
  1394. {
  1395. if (reg < 0x10000)
  1396. writel(v, ((void __iomem *)rdev->rmmio) + reg);
  1397. else {
  1398. writel(reg, ((void __iomem *)rdev->rmmio) + RADEON_MM_INDEX);
  1399. writel(v, ((void __iomem *)rdev->rmmio) + RADEON_MM_DATA);
  1400. }
  1401. }
  1402. int r100_init(struct radeon_device *rdev)
  1403. {
  1404. return 0;
  1405. }
  1406. /*
  1407. * Debugfs info
  1408. */
  1409. #if defined(CONFIG_DEBUG_FS)
  1410. static int r100_debugfs_rbbm_info(struct seq_file *m, void *data)
  1411. {
  1412. struct drm_info_node *node = (struct drm_info_node *) m->private;
  1413. struct drm_device *dev = node->minor->dev;
  1414. struct radeon_device *rdev = dev->dev_private;
  1415. uint32_t reg, value;
  1416. unsigned i;
  1417. seq_printf(m, "RBBM_STATUS 0x%08x\n", RREG32(RADEON_RBBM_STATUS));
  1418. seq_printf(m, "RBBM_CMDFIFO_STAT 0x%08x\n", RREG32(0xE7C));
  1419. seq_printf(m, "CP_STAT 0x%08x\n", RREG32(RADEON_CP_STAT));
  1420. for (i = 0; i < 64; i++) {
  1421. WREG32(RADEON_RBBM_CMDFIFO_ADDR, i | 0x100);
  1422. reg = (RREG32(RADEON_RBBM_CMDFIFO_DATA) - 1) >> 2;
  1423. WREG32(RADEON_RBBM_CMDFIFO_ADDR, i);
  1424. value = RREG32(RADEON_RBBM_CMDFIFO_DATA);
  1425. seq_printf(m, "[0x%03X] 0x%04X=0x%08X\n", i, reg, value);
  1426. }
  1427. return 0;
  1428. }
  1429. static int r100_debugfs_cp_ring_info(struct seq_file *m, void *data)
  1430. {
  1431. struct drm_info_node *node = (struct drm_info_node *) m->private;
  1432. struct drm_device *dev = node->minor->dev;
  1433. struct radeon_device *rdev = dev->dev_private;
  1434. uint32_t rdp, wdp;
  1435. unsigned count, i, j;
  1436. radeon_ring_free_size(rdev);
  1437. rdp = RREG32(RADEON_CP_RB_RPTR);
  1438. wdp = RREG32(RADEON_CP_RB_WPTR);
  1439. count = (rdp + rdev->cp.ring_size - wdp) & rdev->cp.ptr_mask;
  1440. seq_printf(m, "CP_STAT 0x%08x\n", RREG32(RADEON_CP_STAT));
  1441. seq_printf(m, "CP_RB_WPTR 0x%08x\n", wdp);
  1442. seq_printf(m, "CP_RB_RPTR 0x%08x\n", rdp);
  1443. seq_printf(m, "%u free dwords in ring\n", rdev->cp.ring_free_dw);
  1444. seq_printf(m, "%u dwords in ring\n", count);
  1445. for (j = 0; j <= count; j++) {
  1446. i = (rdp + j) & rdev->cp.ptr_mask;
  1447. seq_printf(m, "r[%04d]=0x%08x\n", i, rdev->cp.ring[i]);
  1448. }
  1449. return 0;
  1450. }
  1451. static int r100_debugfs_cp_csq_fifo(struct seq_file *m, void *data)
  1452. {
  1453. struct drm_info_node *node = (struct drm_info_node *) m->private;
  1454. struct drm_device *dev = node->minor->dev;
  1455. struct radeon_device *rdev = dev->dev_private;
  1456. uint32_t csq_stat, csq2_stat, tmp;
  1457. unsigned r_rptr, r_wptr, ib1_rptr, ib1_wptr, ib2_rptr, ib2_wptr;
  1458. unsigned i;
  1459. seq_printf(m, "CP_STAT 0x%08x\n", RREG32(RADEON_CP_STAT));
  1460. seq_printf(m, "CP_CSQ_MODE 0x%08x\n", RREG32(RADEON_CP_CSQ_MODE));
  1461. csq_stat = RREG32(RADEON_CP_CSQ_STAT);
  1462. csq2_stat = RREG32(RADEON_CP_CSQ2_STAT);
  1463. r_rptr = (csq_stat >> 0) & 0x3ff;
  1464. r_wptr = (csq_stat >> 10) & 0x3ff;
  1465. ib1_rptr = (csq_stat >> 20) & 0x3ff;
  1466. ib1_wptr = (csq2_stat >> 0) & 0x3ff;
  1467. ib2_rptr = (csq2_stat >> 10) & 0x3ff;
  1468. ib2_wptr = (csq2_stat >> 20) & 0x3ff;
  1469. seq_printf(m, "CP_CSQ_STAT 0x%08x\n", csq_stat);
  1470. seq_printf(m, "CP_CSQ2_STAT 0x%08x\n", csq2_stat);
  1471. seq_printf(m, "Ring rptr %u\n", r_rptr);
  1472. seq_printf(m, "Ring wptr %u\n", r_wptr);
  1473. seq_printf(m, "Indirect1 rptr %u\n", ib1_rptr);
  1474. seq_printf(m, "Indirect1 wptr %u\n", ib1_wptr);
  1475. seq_printf(m, "Indirect2 rptr %u\n", ib2_rptr);
  1476. seq_printf(m, "Indirect2 wptr %u\n", ib2_wptr);
  1477. /* FIXME: 0, 128, 640 depends on fifo setup see cp_init_kms
  1478. * 128 = indirect1_start * 8 & 640 = indirect2_start * 8 */
  1479. seq_printf(m, "Ring fifo:\n");
  1480. for (i = 0; i < 256; i++) {
  1481. WREG32(RADEON_CP_CSQ_ADDR, i << 2);
  1482. tmp = RREG32(RADEON_CP_CSQ_DATA);
  1483. seq_printf(m, "rfifo[%04d]=0x%08X\n", i, tmp);
  1484. }
  1485. seq_printf(m, "Indirect1 fifo:\n");
  1486. for (i = 256; i <= 512; i++) {
  1487. WREG32(RADEON_CP_CSQ_ADDR, i << 2);
  1488. tmp = RREG32(RADEON_CP_CSQ_DATA);
  1489. seq_printf(m, "ib1fifo[%04d]=0x%08X\n", i, tmp);
  1490. }
  1491. seq_printf(m, "Indirect2 fifo:\n");
  1492. for (i = 640; i < ib1_wptr; i++) {
  1493. WREG32(RADEON_CP_CSQ_ADDR, i << 2);
  1494. tmp = RREG32(RADEON_CP_CSQ_DATA);
  1495. seq_printf(m, "ib2fifo[%04d]=0x%08X\n", i, tmp);
  1496. }
  1497. return 0;
  1498. }
  1499. static int r100_debugfs_mc_info(struct seq_file *m, void *data)
  1500. {
  1501. struct drm_info_node *node = (struct drm_info_node *) m->private;
  1502. struct drm_device *dev = node->minor->dev;
  1503. struct radeon_device *rdev = dev->dev_private;
  1504. uint32_t tmp;
  1505. tmp = RREG32(RADEON_CONFIG_MEMSIZE);
  1506. seq_printf(m, "CONFIG_MEMSIZE 0x%08x\n", tmp);
  1507. tmp = RREG32(RADEON_MC_FB_LOCATION);
  1508. seq_printf(m, "MC_FB_LOCATION 0x%08x\n", tmp);
  1509. tmp = RREG32(RADEON_BUS_CNTL);
  1510. seq_printf(m, "BUS_CNTL 0x%08x\n", tmp);
  1511. tmp = RREG32(RADEON_MC_AGP_LOCATION);
  1512. seq_printf(m, "MC_AGP_LOCATION 0x%08x\n", tmp);
  1513. tmp = RREG32(RADEON_AGP_BASE);
  1514. seq_printf(m, "AGP_BASE 0x%08x\n", tmp);
  1515. tmp = RREG32(RADEON_HOST_PATH_CNTL);
  1516. seq_printf(m, "HOST_PATH_CNTL 0x%08x\n", tmp);
  1517. tmp = RREG32(0x01D0);
  1518. seq_printf(m, "AIC_CTRL 0x%08x\n", tmp);
  1519. tmp = RREG32(RADEON_AIC_LO_ADDR);
  1520. seq_printf(m, "AIC_LO_ADDR 0x%08x\n", tmp);
  1521. tmp = RREG32(RADEON_AIC_HI_ADDR);
  1522. seq_printf(m, "AIC_HI_ADDR 0x%08x\n", tmp);
  1523. tmp = RREG32(0x01E4);
  1524. seq_printf(m, "AIC_TLB_ADDR 0x%08x\n", tmp);
  1525. return 0;
  1526. }
  1527. static struct drm_info_list r100_debugfs_rbbm_list[] = {
  1528. {"r100_rbbm_info", r100_debugfs_rbbm_info, 0, NULL},
  1529. };
  1530. static struct drm_info_list r100_debugfs_cp_list[] = {
  1531. {"r100_cp_ring_info", r100_debugfs_cp_ring_info, 0, NULL},
  1532. {"r100_cp_csq_fifo", r100_debugfs_cp_csq_fifo, 0, NULL},
  1533. };
  1534. static struct drm_info_list r100_debugfs_mc_info_list[] = {
  1535. {"r100_mc_info", r100_debugfs_mc_info, 0, NULL},
  1536. };
  1537. #endif
  1538. int r100_debugfs_rbbm_init(struct radeon_device *rdev)
  1539. {
  1540. #if defined(CONFIG_DEBUG_FS)
  1541. return radeon_debugfs_add_files(rdev, r100_debugfs_rbbm_list, 1);
  1542. #else
  1543. return 0;
  1544. #endif
  1545. }
  1546. int r100_debugfs_cp_init(struct radeon_device *rdev)
  1547. {
  1548. #if defined(CONFIG_DEBUG_FS)
  1549. return radeon_debugfs_add_files(rdev, r100_debugfs_cp_list, 2);
  1550. #else
  1551. return 0;
  1552. #endif
  1553. }
  1554. int r100_debugfs_mc_info_init(struct radeon_device *rdev)
  1555. {
  1556. #if defined(CONFIG_DEBUG_FS)
  1557. return radeon_debugfs_add_files(rdev, r100_debugfs_mc_info_list, 1);
  1558. #else
  1559. return 0;
  1560. #endif
  1561. }