radeon_cp.c 64 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224
  1. /* radeon_cp.c -- CP support for Radeon -*- linux-c -*- */
  2. /*
  3. * Copyright 2000 Precision Insight, Inc., Cedar Park, Texas.
  4. * Copyright 2000 VA Linux Systems, Inc., Fremont, California.
  5. * Copyright 2007 Advanced Micro Devices, Inc.
  6. * All Rights Reserved.
  7. *
  8. * Permission is hereby granted, free of charge, to any person obtaining a
  9. * copy of this software and associated documentation files (the "Software"),
  10. * to deal in the Software without restriction, including without limitation
  11. * the rights to use, copy, modify, merge, publish, distribute, sublicense,
  12. * and/or sell copies of the Software, and to permit persons to whom the
  13. * Software is furnished to do so, subject to the following conditions:
  14. *
  15. * The above copyright notice and this permission notice (including the next
  16. * paragraph) shall be included in all copies or substantial portions of the
  17. * Software.
  18. *
  19. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  20. * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  21. * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
  22. * PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
  23. * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
  24. * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
  25. * DEALINGS IN THE SOFTWARE.
  26. *
  27. * Authors:
  28. * Kevin E. Martin <martin@valinux.com>
  29. * Gareth Hughes <gareth@valinux.com>
  30. */
  31. #include "drmP.h"
  32. #include "drm.h"
  33. #include "drm_sarea.h"
  34. #include "radeon_drm.h"
  35. #include "radeon_drv.h"
  36. #include "r300_reg.h"
  37. #include "radeon_microcode.h"
  38. #define RADEON_FIFO_DEBUG 0
  39. static int radeon_do_cleanup_cp(struct drm_device * dev);
  40. static void radeon_do_cp_start(drm_radeon_private_t * dev_priv);
  41. u32 radeon_read_ring_rptr(drm_radeon_private_t *dev_priv, u32 off)
  42. {
  43. u32 val;
  44. if (dev_priv->flags & RADEON_IS_AGP) {
  45. val = DRM_READ32(dev_priv->ring_rptr, off);
  46. } else {
  47. val = *(((volatile u32 *)
  48. dev_priv->ring_rptr->handle) +
  49. (off / sizeof(u32)));
  50. val = le32_to_cpu(val);
  51. }
  52. return val;
  53. }
  54. u32 radeon_get_ring_head(drm_radeon_private_t *dev_priv)
  55. {
  56. if (dev_priv->writeback_works)
  57. return radeon_read_ring_rptr(dev_priv, 0);
  58. else {
  59. if ((dev_priv->flags & RADEON_FAMILY_MASK) >= CHIP_R600)
  60. return RADEON_READ(R600_CP_RB_RPTR);
  61. else
  62. return RADEON_READ(RADEON_CP_RB_RPTR);
  63. }
  64. }
  65. void radeon_write_ring_rptr(drm_radeon_private_t *dev_priv, u32 off, u32 val)
  66. {
  67. if (dev_priv->flags & RADEON_IS_AGP)
  68. DRM_WRITE32(dev_priv->ring_rptr, off, val);
  69. else
  70. *(((volatile u32 *) dev_priv->ring_rptr->handle) +
  71. (off / sizeof(u32))) = cpu_to_le32(val);
  72. }
  73. void radeon_set_ring_head(drm_radeon_private_t *dev_priv, u32 val)
  74. {
  75. radeon_write_ring_rptr(dev_priv, 0, val);
  76. }
  77. u32 radeon_get_scratch(drm_radeon_private_t *dev_priv, int index)
  78. {
  79. if (dev_priv->writeback_works) {
  80. if ((dev_priv->flags & RADEON_FAMILY_MASK) >= CHIP_R600)
  81. return radeon_read_ring_rptr(dev_priv,
  82. R600_SCRATCHOFF(index));
  83. else
  84. return radeon_read_ring_rptr(dev_priv,
  85. RADEON_SCRATCHOFF(index));
  86. } else {
  87. if ((dev_priv->flags & RADEON_FAMILY_MASK) >= CHIP_R600)
  88. return RADEON_READ(R600_SCRATCH_REG0 + 4*index);
  89. else
  90. return RADEON_READ(RADEON_SCRATCH_REG0 + 4*index);
  91. }
  92. }
  93. u32 RADEON_READ_MM(drm_radeon_private_t *dev_priv, int addr)
  94. {
  95. u32 ret;
  96. if (addr < 0x10000)
  97. ret = DRM_READ32(dev_priv->mmio, addr);
  98. else {
  99. DRM_WRITE32(dev_priv->mmio, RADEON_MM_INDEX, addr);
  100. ret = DRM_READ32(dev_priv->mmio, RADEON_MM_DATA);
  101. }
  102. return ret;
  103. }
  104. static u32 R500_READ_MCIND(drm_radeon_private_t *dev_priv, int addr)
  105. {
  106. u32 ret;
  107. RADEON_WRITE(R520_MC_IND_INDEX, 0x7f0000 | (addr & 0xff));
  108. ret = RADEON_READ(R520_MC_IND_DATA);
  109. RADEON_WRITE(R520_MC_IND_INDEX, 0);
  110. return ret;
  111. }
  112. static u32 RS480_READ_MCIND(drm_radeon_private_t *dev_priv, int addr)
  113. {
  114. u32 ret;
  115. RADEON_WRITE(RS480_NB_MC_INDEX, addr & 0xff);
  116. ret = RADEON_READ(RS480_NB_MC_DATA);
  117. RADEON_WRITE(RS480_NB_MC_INDEX, 0xff);
  118. return ret;
  119. }
  120. static u32 RS690_READ_MCIND(drm_radeon_private_t *dev_priv, int addr)
  121. {
  122. u32 ret;
  123. RADEON_WRITE(RS690_MC_INDEX, (addr & RS690_MC_INDEX_MASK));
  124. ret = RADEON_READ(RS690_MC_DATA);
  125. RADEON_WRITE(RS690_MC_INDEX, RS690_MC_INDEX_MASK);
  126. return ret;
  127. }
  128. static u32 RS600_READ_MCIND(drm_radeon_private_t *dev_priv, int addr)
  129. {
  130. u32 ret;
  131. RADEON_WRITE(RS600_MC_INDEX, ((addr & RS600_MC_ADDR_MASK) |
  132. RS600_MC_IND_CITF_ARB0));
  133. ret = RADEON_READ(RS600_MC_DATA);
  134. return ret;
  135. }
  136. static u32 IGP_READ_MCIND(drm_radeon_private_t *dev_priv, int addr)
  137. {
  138. if (((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RS690) ||
  139. ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RS740))
  140. return RS690_READ_MCIND(dev_priv, addr);
  141. else if ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RS600)
  142. return RS600_READ_MCIND(dev_priv, addr);
  143. else
  144. return RS480_READ_MCIND(dev_priv, addr);
  145. }
  146. u32 radeon_read_fb_location(drm_radeon_private_t *dev_priv)
  147. {
  148. if ((dev_priv->flags & RADEON_FAMILY_MASK) >= CHIP_RV770)
  149. return RADEON_READ(R700_MC_VM_FB_LOCATION);
  150. else if ((dev_priv->flags & RADEON_FAMILY_MASK) >= CHIP_R600)
  151. return RADEON_READ(R600_MC_VM_FB_LOCATION);
  152. else if ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RV515)
  153. return R500_READ_MCIND(dev_priv, RV515_MC_FB_LOCATION);
  154. else if (((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RS690) ||
  155. ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RS740))
  156. return RS690_READ_MCIND(dev_priv, RS690_MC_FB_LOCATION);
  157. else if ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RS600)
  158. return RS600_READ_MCIND(dev_priv, RS600_MC_FB_LOCATION);
  159. else if ((dev_priv->flags & RADEON_FAMILY_MASK) > CHIP_RV515)
  160. return R500_READ_MCIND(dev_priv, R520_MC_FB_LOCATION);
  161. else
  162. return RADEON_READ(RADEON_MC_FB_LOCATION);
  163. }
  164. static void radeon_write_fb_location(drm_radeon_private_t *dev_priv, u32 fb_loc)
  165. {
  166. if ((dev_priv->flags & RADEON_FAMILY_MASK) >= CHIP_RV770)
  167. RADEON_WRITE(R700_MC_VM_FB_LOCATION, fb_loc);
  168. else if ((dev_priv->flags & RADEON_FAMILY_MASK) >= CHIP_R600)
  169. RADEON_WRITE(R600_MC_VM_FB_LOCATION, fb_loc);
  170. else if ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RV515)
  171. R500_WRITE_MCIND(RV515_MC_FB_LOCATION, fb_loc);
  172. else if (((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RS690) ||
  173. ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RS740))
  174. RS690_WRITE_MCIND(RS690_MC_FB_LOCATION, fb_loc);
  175. else if ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RS600)
  176. RS600_WRITE_MCIND(RS600_MC_FB_LOCATION, fb_loc);
  177. else if ((dev_priv->flags & RADEON_FAMILY_MASK) > CHIP_RV515)
  178. R500_WRITE_MCIND(R520_MC_FB_LOCATION, fb_loc);
  179. else
  180. RADEON_WRITE(RADEON_MC_FB_LOCATION, fb_loc);
  181. }
  182. void radeon_write_agp_location(drm_radeon_private_t *dev_priv, u32 agp_loc)
  183. {
  184. /*R6xx/R7xx: AGP_TOP and BOT are actually 18 bits each */
  185. if ((dev_priv->flags & RADEON_FAMILY_MASK) >= CHIP_RV770) {
  186. RADEON_WRITE(R700_MC_VM_AGP_BOT, agp_loc & 0xffff); /* FIX ME */
  187. RADEON_WRITE(R700_MC_VM_AGP_TOP, (agp_loc >> 16) & 0xffff);
  188. } else if ((dev_priv->flags & RADEON_FAMILY_MASK) >= CHIP_R600) {
  189. RADEON_WRITE(R600_MC_VM_AGP_BOT, agp_loc & 0xffff); /* FIX ME */
  190. RADEON_WRITE(R600_MC_VM_AGP_TOP, (agp_loc >> 16) & 0xffff);
  191. } else if ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RV515)
  192. R500_WRITE_MCIND(RV515_MC_AGP_LOCATION, agp_loc);
  193. else if (((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RS690) ||
  194. ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RS740))
  195. RS690_WRITE_MCIND(RS690_MC_AGP_LOCATION, agp_loc);
  196. else if ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RS600)
  197. RS600_WRITE_MCIND(RS600_MC_AGP_LOCATION, agp_loc);
  198. else if ((dev_priv->flags & RADEON_FAMILY_MASK) > CHIP_RV515)
  199. R500_WRITE_MCIND(R520_MC_AGP_LOCATION, agp_loc);
  200. else
  201. RADEON_WRITE(RADEON_MC_AGP_LOCATION, agp_loc);
  202. }
  203. void radeon_write_agp_base(drm_radeon_private_t *dev_priv, u64 agp_base)
  204. {
  205. u32 agp_base_hi = upper_32_bits(agp_base);
  206. u32 agp_base_lo = agp_base & 0xffffffff;
  207. u32 r6xx_agp_base = (agp_base >> 22) & 0x3ffff;
  208. /* R6xx/R7xx must be aligned to a 4MB boundry */
  209. if ((dev_priv->flags & RADEON_FAMILY_MASK) >= CHIP_RV770)
  210. RADEON_WRITE(R700_MC_VM_AGP_BASE, r6xx_agp_base);
  211. else if ((dev_priv->flags & RADEON_FAMILY_MASK) >= CHIP_R600)
  212. RADEON_WRITE(R600_MC_VM_AGP_BASE, r6xx_agp_base);
  213. else if ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RV515) {
  214. R500_WRITE_MCIND(RV515_MC_AGP_BASE, agp_base_lo);
  215. R500_WRITE_MCIND(RV515_MC_AGP_BASE_2, agp_base_hi);
  216. } else if (((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RS690) ||
  217. ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RS740)) {
  218. RS690_WRITE_MCIND(RS690_MC_AGP_BASE, agp_base_lo);
  219. RS690_WRITE_MCIND(RS690_MC_AGP_BASE_2, agp_base_hi);
  220. } else if ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RS600) {
  221. RS600_WRITE_MCIND(RS600_AGP_BASE, agp_base_lo);
  222. RS600_WRITE_MCIND(RS600_AGP_BASE_2, agp_base_hi);
  223. } else if ((dev_priv->flags & RADEON_FAMILY_MASK) > CHIP_RV515) {
  224. R500_WRITE_MCIND(R520_MC_AGP_BASE, agp_base_lo);
  225. R500_WRITE_MCIND(R520_MC_AGP_BASE_2, agp_base_hi);
  226. } else if (((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RS400) ||
  227. ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RS480)) {
  228. RADEON_WRITE(RADEON_AGP_BASE, agp_base_lo);
  229. RADEON_WRITE(RS480_AGP_BASE_2, agp_base_hi);
  230. } else {
  231. RADEON_WRITE(RADEON_AGP_BASE, agp_base_lo);
  232. if ((dev_priv->flags & RADEON_FAMILY_MASK) >= CHIP_R200)
  233. RADEON_WRITE(RADEON_AGP_BASE_2, agp_base_hi);
  234. }
  235. }
  236. void radeon_enable_bm(struct drm_radeon_private *dev_priv)
  237. {
  238. u32 tmp;
  239. /* Turn on bus mastering */
  240. if (((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RS690) ||
  241. ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RS740)) {
  242. /* rs600/rs690/rs740 */
  243. tmp = RADEON_READ(RADEON_BUS_CNTL) & ~RS600_BUS_MASTER_DIS;
  244. RADEON_WRITE(RADEON_BUS_CNTL, tmp);
  245. } else if (((dev_priv->flags & RADEON_FAMILY_MASK) <= CHIP_RV350) ||
  246. ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_R420) ||
  247. ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RS400) ||
  248. ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RS480)) {
  249. /* r1xx, r2xx, r300, r(v)350, r420/r481, rs400/rs480 */
  250. tmp = RADEON_READ(RADEON_BUS_CNTL) & ~RADEON_BUS_MASTER_DIS;
  251. RADEON_WRITE(RADEON_BUS_CNTL, tmp);
  252. } /* PCIE cards appears to not need this */
  253. }
  254. static int RADEON_READ_PLL(struct drm_device * dev, int addr)
  255. {
  256. drm_radeon_private_t *dev_priv = dev->dev_private;
  257. RADEON_WRITE8(RADEON_CLOCK_CNTL_INDEX, addr & 0x1f);
  258. return RADEON_READ(RADEON_CLOCK_CNTL_DATA);
  259. }
  260. static u32 RADEON_READ_PCIE(drm_radeon_private_t *dev_priv, int addr)
  261. {
  262. RADEON_WRITE8(RADEON_PCIE_INDEX, addr & 0xff);
  263. return RADEON_READ(RADEON_PCIE_DATA);
  264. }
  265. #if RADEON_FIFO_DEBUG
  266. static void radeon_status(drm_radeon_private_t * dev_priv)
  267. {
  268. printk("%s:\n", __func__);
  269. printk("RBBM_STATUS = 0x%08x\n",
  270. (unsigned int)RADEON_READ(RADEON_RBBM_STATUS));
  271. printk("CP_RB_RTPR = 0x%08x\n",
  272. (unsigned int)RADEON_READ(RADEON_CP_RB_RPTR));
  273. printk("CP_RB_WTPR = 0x%08x\n",
  274. (unsigned int)RADEON_READ(RADEON_CP_RB_WPTR));
  275. printk("AIC_CNTL = 0x%08x\n",
  276. (unsigned int)RADEON_READ(RADEON_AIC_CNTL));
  277. printk("AIC_STAT = 0x%08x\n",
  278. (unsigned int)RADEON_READ(RADEON_AIC_STAT));
  279. printk("AIC_PT_BASE = 0x%08x\n",
  280. (unsigned int)RADEON_READ(RADEON_AIC_PT_BASE));
  281. printk("TLB_ADDR = 0x%08x\n",
  282. (unsigned int)RADEON_READ(RADEON_AIC_TLB_ADDR));
  283. printk("TLB_DATA = 0x%08x\n",
  284. (unsigned int)RADEON_READ(RADEON_AIC_TLB_DATA));
  285. }
  286. #endif
  287. /* ================================================================
  288. * Engine, FIFO control
  289. */
  290. static int radeon_do_pixcache_flush(drm_radeon_private_t * dev_priv)
  291. {
  292. u32 tmp;
  293. int i;
  294. dev_priv->stats.boxes |= RADEON_BOX_WAIT_IDLE;
  295. if ((dev_priv->flags & RADEON_FAMILY_MASK) <= CHIP_RV280) {
  296. tmp = RADEON_READ(RADEON_RB3D_DSTCACHE_CTLSTAT);
  297. tmp |= RADEON_RB3D_DC_FLUSH_ALL;
  298. RADEON_WRITE(RADEON_RB3D_DSTCACHE_CTLSTAT, tmp);
  299. for (i = 0; i < dev_priv->usec_timeout; i++) {
  300. if (!(RADEON_READ(RADEON_RB3D_DSTCACHE_CTLSTAT)
  301. & RADEON_RB3D_DC_BUSY)) {
  302. return 0;
  303. }
  304. DRM_UDELAY(1);
  305. }
  306. } else {
  307. /* don't flush or purge cache here or lockup */
  308. return 0;
  309. }
  310. #if RADEON_FIFO_DEBUG
  311. DRM_ERROR("failed!\n");
  312. radeon_status(dev_priv);
  313. #endif
  314. return -EBUSY;
  315. }
  316. static int radeon_do_wait_for_fifo(drm_radeon_private_t * dev_priv, int entries)
  317. {
  318. int i;
  319. dev_priv->stats.boxes |= RADEON_BOX_WAIT_IDLE;
  320. for (i = 0; i < dev_priv->usec_timeout; i++) {
  321. int slots = (RADEON_READ(RADEON_RBBM_STATUS)
  322. & RADEON_RBBM_FIFOCNT_MASK);
  323. if (slots >= entries)
  324. return 0;
  325. DRM_UDELAY(1);
  326. }
  327. DRM_DEBUG("wait for fifo failed status : 0x%08X 0x%08X\n",
  328. RADEON_READ(RADEON_RBBM_STATUS),
  329. RADEON_READ(R300_VAP_CNTL_STATUS));
  330. #if RADEON_FIFO_DEBUG
  331. DRM_ERROR("failed!\n");
  332. radeon_status(dev_priv);
  333. #endif
  334. return -EBUSY;
  335. }
  336. static int radeon_do_wait_for_idle(drm_radeon_private_t * dev_priv)
  337. {
  338. int i, ret;
  339. dev_priv->stats.boxes |= RADEON_BOX_WAIT_IDLE;
  340. ret = radeon_do_wait_for_fifo(dev_priv, 64);
  341. if (ret)
  342. return ret;
  343. for (i = 0; i < dev_priv->usec_timeout; i++) {
  344. if (!(RADEON_READ(RADEON_RBBM_STATUS)
  345. & RADEON_RBBM_ACTIVE)) {
  346. radeon_do_pixcache_flush(dev_priv);
  347. return 0;
  348. }
  349. DRM_UDELAY(1);
  350. }
  351. DRM_DEBUG("wait idle failed status : 0x%08X 0x%08X\n",
  352. RADEON_READ(RADEON_RBBM_STATUS),
  353. RADEON_READ(R300_VAP_CNTL_STATUS));
  354. #if RADEON_FIFO_DEBUG
  355. DRM_ERROR("failed!\n");
  356. radeon_status(dev_priv);
  357. #endif
  358. return -EBUSY;
  359. }
  360. static void radeon_init_pipes(drm_radeon_private_t *dev_priv)
  361. {
  362. uint32_t gb_tile_config, gb_pipe_sel = 0;
  363. if ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RV530) {
  364. uint32_t z_pipe_sel = RADEON_READ(RV530_GB_PIPE_SELECT2);
  365. if ((z_pipe_sel & 3) == 3)
  366. dev_priv->num_z_pipes = 2;
  367. else
  368. dev_priv->num_z_pipes = 1;
  369. } else
  370. dev_priv->num_z_pipes = 1;
  371. /* RS4xx/RS6xx/R4xx/R5xx */
  372. if ((dev_priv->flags & RADEON_FAMILY_MASK) >= CHIP_R420) {
  373. gb_pipe_sel = RADEON_READ(R400_GB_PIPE_SELECT);
  374. dev_priv->num_gb_pipes = ((gb_pipe_sel >> 12) & 0x3) + 1;
  375. } else {
  376. /* R3xx */
  377. if (((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_R300) ||
  378. ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_R350)) {
  379. dev_priv->num_gb_pipes = 2;
  380. } else {
  381. /* R3Vxx */
  382. dev_priv->num_gb_pipes = 1;
  383. }
  384. }
  385. DRM_INFO("Num pipes: %d\n", dev_priv->num_gb_pipes);
  386. gb_tile_config = (R300_ENABLE_TILING | R300_TILE_SIZE_16 /*| R300_SUBPIXEL_1_16*/);
  387. switch (dev_priv->num_gb_pipes) {
  388. case 2: gb_tile_config |= R300_PIPE_COUNT_R300; break;
  389. case 3: gb_tile_config |= R300_PIPE_COUNT_R420_3P; break;
  390. case 4: gb_tile_config |= R300_PIPE_COUNT_R420; break;
  391. default:
  392. case 1: gb_tile_config |= R300_PIPE_COUNT_RV350; break;
  393. }
  394. if ((dev_priv->flags & RADEON_FAMILY_MASK) >= CHIP_RV515) {
  395. RADEON_WRITE_PLL(R500_DYN_SCLK_PWMEM_PIPE, (1 | ((gb_pipe_sel >> 8) & 0xf) << 4));
  396. RADEON_WRITE(R300_SU_REG_DEST, ((1 << dev_priv->num_gb_pipes) - 1));
  397. }
  398. RADEON_WRITE(R300_GB_TILE_CONFIG, gb_tile_config);
  399. radeon_do_wait_for_idle(dev_priv);
  400. RADEON_WRITE(R300_DST_PIPE_CONFIG, RADEON_READ(R300_DST_PIPE_CONFIG) | R300_PIPE_AUTO_CONFIG);
  401. RADEON_WRITE(R300_RB2D_DSTCACHE_MODE, (RADEON_READ(R300_RB2D_DSTCACHE_MODE) |
  402. R300_DC_AUTOFLUSH_ENABLE |
  403. R300_DC_DC_DISABLE_IGNORE_PE));
  404. }
  405. /* ================================================================
  406. * CP control, initialization
  407. */
  408. /* Load the microcode for the CP */
  409. static void radeon_cp_load_microcode(drm_radeon_private_t * dev_priv)
  410. {
  411. int i;
  412. DRM_DEBUG("\n");
  413. radeon_do_wait_for_idle(dev_priv);
  414. RADEON_WRITE(RADEON_CP_ME_RAM_ADDR, 0);
  415. if (((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_R100) ||
  416. ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RV100) ||
  417. ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RV200) ||
  418. ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RS100) ||
  419. ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RS200)) {
  420. DRM_INFO("Loading R100 Microcode\n");
  421. for (i = 0; i < 256; i++) {
  422. RADEON_WRITE(RADEON_CP_ME_RAM_DATAH,
  423. R100_cp_microcode[i][1]);
  424. RADEON_WRITE(RADEON_CP_ME_RAM_DATAL,
  425. R100_cp_microcode[i][0]);
  426. }
  427. } else if (((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_R200) ||
  428. ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RV250) ||
  429. ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RV280) ||
  430. ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RS300)) {
  431. DRM_INFO("Loading R200 Microcode\n");
  432. for (i = 0; i < 256; i++) {
  433. RADEON_WRITE(RADEON_CP_ME_RAM_DATAH,
  434. R200_cp_microcode[i][1]);
  435. RADEON_WRITE(RADEON_CP_ME_RAM_DATAL,
  436. R200_cp_microcode[i][0]);
  437. }
  438. } else if (((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_R300) ||
  439. ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_R350) ||
  440. ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RV350) ||
  441. ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RV380) ||
  442. ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RS400) ||
  443. ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RS480)) {
  444. DRM_INFO("Loading R300 Microcode\n");
  445. for (i = 0; i < 256; i++) {
  446. RADEON_WRITE(RADEON_CP_ME_RAM_DATAH,
  447. R300_cp_microcode[i][1]);
  448. RADEON_WRITE(RADEON_CP_ME_RAM_DATAL,
  449. R300_cp_microcode[i][0]);
  450. }
  451. } else if (((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_R420) ||
  452. ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_R423) ||
  453. ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RV410)) {
  454. DRM_INFO("Loading R400 Microcode\n");
  455. for (i = 0; i < 256; i++) {
  456. RADEON_WRITE(RADEON_CP_ME_RAM_DATAH,
  457. R420_cp_microcode[i][1]);
  458. RADEON_WRITE(RADEON_CP_ME_RAM_DATAL,
  459. R420_cp_microcode[i][0]);
  460. }
  461. } else if (((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RS690) ||
  462. ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RS740)) {
  463. DRM_INFO("Loading RS690/RS740 Microcode\n");
  464. for (i = 0; i < 256; i++) {
  465. RADEON_WRITE(RADEON_CP_ME_RAM_DATAH,
  466. RS690_cp_microcode[i][1]);
  467. RADEON_WRITE(RADEON_CP_ME_RAM_DATAL,
  468. RS690_cp_microcode[i][0]);
  469. }
  470. } else if ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RS600) {
  471. DRM_INFO("Loading RS600 Microcode\n");
  472. for (i = 0; i < 256; i++) {
  473. RADEON_WRITE(RADEON_CP_ME_RAM_DATAH,
  474. RS600_cp_microcode[i][1]);
  475. RADEON_WRITE(RADEON_CP_ME_RAM_DATAL,
  476. RS600_cp_microcode[i][0]);
  477. }
  478. } else if (((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RV515) ||
  479. ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_R520) ||
  480. ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RV530) ||
  481. ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_R580) ||
  482. ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RV560) ||
  483. ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RV570)) {
  484. DRM_INFO("Loading R500 Microcode\n");
  485. for (i = 0; i < 256; i++) {
  486. RADEON_WRITE(RADEON_CP_ME_RAM_DATAH,
  487. R520_cp_microcode[i][1]);
  488. RADEON_WRITE(RADEON_CP_ME_RAM_DATAL,
  489. R520_cp_microcode[i][0]);
  490. }
  491. }
  492. }
  493. /* Flush any pending commands to the CP. This should only be used just
  494. * prior to a wait for idle, as it informs the engine that the command
  495. * stream is ending.
  496. */
  497. static void radeon_do_cp_flush(drm_radeon_private_t * dev_priv)
  498. {
  499. DRM_DEBUG("\n");
  500. #if 0
  501. u32 tmp;
  502. tmp = RADEON_READ(RADEON_CP_RB_WPTR) | (1 << 31);
  503. RADEON_WRITE(RADEON_CP_RB_WPTR, tmp);
  504. #endif
  505. }
  506. /* Wait for the CP to go idle.
  507. */
  508. int radeon_do_cp_idle(drm_radeon_private_t * dev_priv)
  509. {
  510. RING_LOCALS;
  511. DRM_DEBUG("\n");
  512. BEGIN_RING(6);
  513. RADEON_PURGE_CACHE();
  514. RADEON_PURGE_ZCACHE();
  515. RADEON_WAIT_UNTIL_IDLE();
  516. ADVANCE_RING();
  517. COMMIT_RING();
  518. return radeon_do_wait_for_idle(dev_priv);
  519. }
  520. /* Start the Command Processor.
  521. */
  522. static void radeon_do_cp_start(drm_radeon_private_t * dev_priv)
  523. {
  524. RING_LOCALS;
  525. DRM_DEBUG("\n");
  526. radeon_do_wait_for_idle(dev_priv);
  527. RADEON_WRITE(RADEON_CP_CSQ_CNTL, dev_priv->cp_mode);
  528. dev_priv->cp_running = 1;
  529. BEGIN_RING(8);
  530. /* isync can only be written through cp on r5xx write it here */
  531. OUT_RING(CP_PACKET0(RADEON_ISYNC_CNTL, 0));
  532. OUT_RING(RADEON_ISYNC_ANY2D_IDLE3D |
  533. RADEON_ISYNC_ANY3D_IDLE2D |
  534. RADEON_ISYNC_WAIT_IDLEGUI |
  535. RADEON_ISYNC_CPSCRATCH_IDLEGUI);
  536. RADEON_PURGE_CACHE();
  537. RADEON_PURGE_ZCACHE();
  538. RADEON_WAIT_UNTIL_IDLE();
  539. ADVANCE_RING();
  540. COMMIT_RING();
  541. dev_priv->track_flush |= RADEON_FLUSH_EMITED | RADEON_PURGE_EMITED;
  542. }
  543. /* Reset the Command Processor. This will not flush any pending
  544. * commands, so you must wait for the CP command stream to complete
  545. * before calling this routine.
  546. */
  547. static void radeon_do_cp_reset(drm_radeon_private_t * dev_priv)
  548. {
  549. u32 cur_read_ptr;
  550. DRM_DEBUG("\n");
  551. cur_read_ptr = RADEON_READ(RADEON_CP_RB_RPTR);
  552. RADEON_WRITE(RADEON_CP_RB_WPTR, cur_read_ptr);
  553. SET_RING_HEAD(dev_priv, cur_read_ptr);
  554. dev_priv->ring.tail = cur_read_ptr;
  555. }
  556. /* Stop the Command Processor. This will not flush any pending
  557. * commands, so you must flush the command stream and wait for the CP
  558. * to go idle before calling this routine.
  559. */
  560. static void radeon_do_cp_stop(drm_radeon_private_t * dev_priv)
  561. {
  562. DRM_DEBUG("\n");
  563. RADEON_WRITE(RADEON_CP_CSQ_CNTL, RADEON_CSQ_PRIDIS_INDDIS);
  564. dev_priv->cp_running = 0;
  565. }
  566. /* Reset the engine. This will stop the CP if it is running.
  567. */
  568. static int radeon_do_engine_reset(struct drm_device * dev)
  569. {
  570. drm_radeon_private_t *dev_priv = dev->dev_private;
  571. u32 clock_cntl_index = 0, mclk_cntl = 0, rbbm_soft_reset;
  572. DRM_DEBUG("\n");
  573. radeon_do_pixcache_flush(dev_priv);
  574. if ((dev_priv->flags & RADEON_FAMILY_MASK) <= CHIP_RV410) {
  575. /* may need something similar for newer chips */
  576. clock_cntl_index = RADEON_READ(RADEON_CLOCK_CNTL_INDEX);
  577. mclk_cntl = RADEON_READ_PLL(dev, RADEON_MCLK_CNTL);
  578. RADEON_WRITE_PLL(RADEON_MCLK_CNTL, (mclk_cntl |
  579. RADEON_FORCEON_MCLKA |
  580. RADEON_FORCEON_MCLKB |
  581. RADEON_FORCEON_YCLKA |
  582. RADEON_FORCEON_YCLKB |
  583. RADEON_FORCEON_MC |
  584. RADEON_FORCEON_AIC));
  585. }
  586. rbbm_soft_reset = RADEON_READ(RADEON_RBBM_SOFT_RESET);
  587. RADEON_WRITE(RADEON_RBBM_SOFT_RESET, (rbbm_soft_reset |
  588. RADEON_SOFT_RESET_CP |
  589. RADEON_SOFT_RESET_HI |
  590. RADEON_SOFT_RESET_SE |
  591. RADEON_SOFT_RESET_RE |
  592. RADEON_SOFT_RESET_PP |
  593. RADEON_SOFT_RESET_E2 |
  594. RADEON_SOFT_RESET_RB));
  595. RADEON_READ(RADEON_RBBM_SOFT_RESET);
  596. RADEON_WRITE(RADEON_RBBM_SOFT_RESET, (rbbm_soft_reset &
  597. ~(RADEON_SOFT_RESET_CP |
  598. RADEON_SOFT_RESET_HI |
  599. RADEON_SOFT_RESET_SE |
  600. RADEON_SOFT_RESET_RE |
  601. RADEON_SOFT_RESET_PP |
  602. RADEON_SOFT_RESET_E2 |
  603. RADEON_SOFT_RESET_RB)));
  604. RADEON_READ(RADEON_RBBM_SOFT_RESET);
  605. if ((dev_priv->flags & RADEON_FAMILY_MASK) <= CHIP_RV410) {
  606. RADEON_WRITE_PLL(RADEON_MCLK_CNTL, mclk_cntl);
  607. RADEON_WRITE(RADEON_CLOCK_CNTL_INDEX, clock_cntl_index);
  608. RADEON_WRITE(RADEON_RBBM_SOFT_RESET, rbbm_soft_reset);
  609. }
  610. /* setup the raster pipes */
  611. if ((dev_priv->flags & RADEON_FAMILY_MASK) >= CHIP_R300)
  612. radeon_init_pipes(dev_priv);
  613. /* Reset the CP ring */
  614. radeon_do_cp_reset(dev_priv);
  615. /* The CP is no longer running after an engine reset */
  616. dev_priv->cp_running = 0;
  617. /* Reset any pending vertex, indirect buffers */
  618. radeon_freelist_reset(dev);
  619. return 0;
  620. }
  621. static void radeon_cp_init_ring_buffer(struct drm_device * dev,
  622. drm_radeon_private_t *dev_priv,
  623. struct drm_file *file_priv)
  624. {
  625. struct drm_radeon_master_private *master_priv;
  626. u32 ring_start, cur_read_ptr;
  627. /* Initialize the memory controller. With new memory map, the fb location
  628. * is not changed, it should have been properly initialized already. Part
  629. * of the problem is that the code below is bogus, assuming the GART is
  630. * always appended to the fb which is not necessarily the case
  631. */
  632. if (!dev_priv->new_memmap)
  633. radeon_write_fb_location(dev_priv,
  634. ((dev_priv->gart_vm_start - 1) & 0xffff0000)
  635. | (dev_priv->fb_location >> 16));
  636. #if __OS_HAS_AGP
  637. if (dev_priv->flags & RADEON_IS_AGP) {
  638. radeon_write_agp_base(dev_priv, dev->agp->base);
  639. radeon_write_agp_location(dev_priv,
  640. (((dev_priv->gart_vm_start - 1 +
  641. dev_priv->gart_size) & 0xffff0000) |
  642. (dev_priv->gart_vm_start >> 16)));
  643. ring_start = (dev_priv->cp_ring->offset
  644. - dev->agp->base
  645. + dev_priv->gart_vm_start);
  646. } else
  647. #endif
  648. ring_start = (dev_priv->cp_ring->offset
  649. - (unsigned long)dev->sg->virtual
  650. + dev_priv->gart_vm_start);
  651. RADEON_WRITE(RADEON_CP_RB_BASE, ring_start);
  652. /* Set the write pointer delay */
  653. RADEON_WRITE(RADEON_CP_RB_WPTR_DELAY, 0);
  654. /* Initialize the ring buffer's read and write pointers */
  655. cur_read_ptr = RADEON_READ(RADEON_CP_RB_RPTR);
  656. RADEON_WRITE(RADEON_CP_RB_WPTR, cur_read_ptr);
  657. SET_RING_HEAD(dev_priv, cur_read_ptr);
  658. dev_priv->ring.tail = cur_read_ptr;
  659. #if __OS_HAS_AGP
  660. if (dev_priv->flags & RADEON_IS_AGP) {
  661. RADEON_WRITE(RADEON_CP_RB_RPTR_ADDR,
  662. dev_priv->ring_rptr->offset
  663. - dev->agp->base + dev_priv->gart_vm_start);
  664. } else
  665. #endif
  666. {
  667. RADEON_WRITE(RADEON_CP_RB_RPTR_ADDR,
  668. dev_priv->ring_rptr->offset
  669. - ((unsigned long) dev->sg->virtual)
  670. + dev_priv->gart_vm_start);
  671. }
  672. /* Set ring buffer size */
  673. #ifdef __BIG_ENDIAN
  674. RADEON_WRITE(RADEON_CP_RB_CNTL,
  675. RADEON_BUF_SWAP_32BIT |
  676. (dev_priv->ring.fetch_size_l2ow << 18) |
  677. (dev_priv->ring.rptr_update_l2qw << 8) |
  678. dev_priv->ring.size_l2qw);
  679. #else
  680. RADEON_WRITE(RADEON_CP_RB_CNTL,
  681. (dev_priv->ring.fetch_size_l2ow << 18) |
  682. (dev_priv->ring.rptr_update_l2qw << 8) |
  683. dev_priv->ring.size_l2qw);
  684. #endif
  685. /* Initialize the scratch register pointer. This will cause
  686. * the scratch register values to be written out to memory
  687. * whenever they are updated.
  688. *
  689. * We simply put this behind the ring read pointer, this works
  690. * with PCI GART as well as (whatever kind of) AGP GART
  691. */
  692. RADEON_WRITE(RADEON_SCRATCH_ADDR, RADEON_READ(RADEON_CP_RB_RPTR_ADDR)
  693. + RADEON_SCRATCH_REG_OFFSET);
  694. RADEON_WRITE(RADEON_SCRATCH_UMSK, 0x7);
  695. radeon_enable_bm(dev_priv);
  696. radeon_write_ring_rptr(dev_priv, RADEON_SCRATCHOFF(0), 0);
  697. RADEON_WRITE(RADEON_LAST_FRAME_REG, 0);
  698. radeon_write_ring_rptr(dev_priv, RADEON_SCRATCHOFF(1), 0);
  699. RADEON_WRITE(RADEON_LAST_DISPATCH_REG, 0);
  700. radeon_write_ring_rptr(dev_priv, RADEON_SCRATCHOFF(2), 0);
  701. RADEON_WRITE(RADEON_LAST_CLEAR_REG, 0);
  702. /* reset sarea copies of these */
  703. master_priv = file_priv->master->driver_priv;
  704. if (master_priv->sarea_priv) {
  705. master_priv->sarea_priv->last_frame = 0;
  706. master_priv->sarea_priv->last_dispatch = 0;
  707. master_priv->sarea_priv->last_clear = 0;
  708. }
  709. radeon_do_wait_for_idle(dev_priv);
  710. /* Sync everything up */
  711. RADEON_WRITE(RADEON_ISYNC_CNTL,
  712. (RADEON_ISYNC_ANY2D_IDLE3D |
  713. RADEON_ISYNC_ANY3D_IDLE2D |
  714. RADEON_ISYNC_WAIT_IDLEGUI |
  715. RADEON_ISYNC_CPSCRATCH_IDLEGUI));
  716. }
  717. static void radeon_test_writeback(drm_radeon_private_t * dev_priv)
  718. {
  719. u32 tmp;
  720. /* Start with assuming that writeback doesn't work */
  721. dev_priv->writeback_works = 0;
  722. /* Writeback doesn't seem to work everywhere, test it here and possibly
  723. * enable it if it appears to work
  724. */
  725. radeon_write_ring_rptr(dev_priv, RADEON_SCRATCHOFF(1), 0);
  726. RADEON_WRITE(RADEON_SCRATCH_REG1, 0xdeadbeef);
  727. for (tmp = 0; tmp < dev_priv->usec_timeout; tmp++) {
  728. u32 val;
  729. val = radeon_read_ring_rptr(dev_priv, RADEON_SCRATCHOFF(1));
  730. if (val == 0xdeadbeef)
  731. break;
  732. DRM_UDELAY(1);
  733. }
  734. if (tmp < dev_priv->usec_timeout) {
  735. dev_priv->writeback_works = 1;
  736. DRM_INFO("writeback test succeeded in %d usecs\n", tmp);
  737. } else {
  738. dev_priv->writeback_works = 0;
  739. DRM_INFO("writeback test failed\n");
  740. }
  741. if (radeon_no_wb == 1) {
  742. dev_priv->writeback_works = 0;
  743. DRM_INFO("writeback forced off\n");
  744. }
  745. if (!dev_priv->writeback_works) {
  746. /* Disable writeback to avoid unnecessary bus master transfer */
  747. RADEON_WRITE(RADEON_CP_RB_CNTL, RADEON_READ(RADEON_CP_RB_CNTL) |
  748. RADEON_RB_NO_UPDATE);
  749. RADEON_WRITE(RADEON_SCRATCH_UMSK, 0);
  750. }
  751. }
  752. /* Enable or disable IGP GART on the chip */
  753. static void radeon_set_igpgart(drm_radeon_private_t * dev_priv, int on)
  754. {
  755. u32 temp;
  756. if (on) {
  757. DRM_DEBUG("programming igp gart %08X %08lX %08X\n",
  758. dev_priv->gart_vm_start,
  759. (long)dev_priv->gart_info.bus_addr,
  760. dev_priv->gart_size);
  761. temp = IGP_READ_MCIND(dev_priv, RS480_MC_MISC_CNTL);
  762. if (((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RS690) ||
  763. ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RS740))
  764. IGP_WRITE_MCIND(RS480_MC_MISC_CNTL, (RS480_GART_INDEX_REG_EN |
  765. RS690_BLOCK_GFX_D3_EN));
  766. else
  767. IGP_WRITE_MCIND(RS480_MC_MISC_CNTL, RS480_GART_INDEX_REG_EN);
  768. IGP_WRITE_MCIND(RS480_AGP_ADDRESS_SPACE_SIZE, (RS480_GART_EN |
  769. RS480_VA_SIZE_32MB));
  770. temp = IGP_READ_MCIND(dev_priv, RS480_GART_FEATURE_ID);
  771. IGP_WRITE_MCIND(RS480_GART_FEATURE_ID, (RS480_HANG_EN |
  772. RS480_TLB_ENABLE |
  773. RS480_GTW_LAC_EN |
  774. RS480_1LEVEL_GART));
  775. temp = dev_priv->gart_info.bus_addr & 0xfffff000;
  776. temp |= (upper_32_bits(dev_priv->gart_info.bus_addr) & 0xff) << 4;
  777. IGP_WRITE_MCIND(RS480_GART_BASE, temp);
  778. temp = IGP_READ_MCIND(dev_priv, RS480_AGP_MODE_CNTL);
  779. IGP_WRITE_MCIND(RS480_AGP_MODE_CNTL, ((1 << RS480_REQ_TYPE_SNOOP_SHIFT) |
  780. RS480_REQ_TYPE_SNOOP_DIS));
  781. radeon_write_agp_base(dev_priv, dev_priv->gart_vm_start);
  782. dev_priv->gart_size = 32*1024*1024;
  783. temp = (((dev_priv->gart_vm_start - 1 + dev_priv->gart_size) &
  784. 0xffff0000) | (dev_priv->gart_vm_start >> 16));
  785. radeon_write_agp_location(dev_priv, temp);
  786. temp = IGP_READ_MCIND(dev_priv, RS480_AGP_ADDRESS_SPACE_SIZE);
  787. IGP_WRITE_MCIND(RS480_AGP_ADDRESS_SPACE_SIZE, (RS480_GART_EN |
  788. RS480_VA_SIZE_32MB));
  789. do {
  790. temp = IGP_READ_MCIND(dev_priv, RS480_GART_CACHE_CNTRL);
  791. if ((temp & RS480_GART_CACHE_INVALIDATE) == 0)
  792. break;
  793. DRM_UDELAY(1);
  794. } while (1);
  795. IGP_WRITE_MCIND(RS480_GART_CACHE_CNTRL,
  796. RS480_GART_CACHE_INVALIDATE);
  797. do {
  798. temp = IGP_READ_MCIND(dev_priv, RS480_GART_CACHE_CNTRL);
  799. if ((temp & RS480_GART_CACHE_INVALIDATE) == 0)
  800. break;
  801. DRM_UDELAY(1);
  802. } while (1);
  803. IGP_WRITE_MCIND(RS480_GART_CACHE_CNTRL, 0);
  804. } else {
  805. IGP_WRITE_MCIND(RS480_AGP_ADDRESS_SPACE_SIZE, 0);
  806. }
  807. }
  808. /* Enable or disable IGP GART on the chip */
  809. static void rs600_set_igpgart(drm_radeon_private_t *dev_priv, int on)
  810. {
  811. u32 temp;
  812. int i;
  813. if (on) {
  814. DRM_DEBUG("programming igp gart %08X %08lX %08X\n",
  815. dev_priv->gart_vm_start,
  816. (long)dev_priv->gart_info.bus_addr,
  817. dev_priv->gart_size);
  818. IGP_WRITE_MCIND(RS600_MC_PT0_CNTL, (RS600_EFFECTIVE_L2_CACHE_SIZE(6) |
  819. RS600_EFFECTIVE_L2_QUEUE_SIZE(6)));
  820. for (i = 0; i < 19; i++)
  821. IGP_WRITE_MCIND(RS600_MC_PT0_CLIENT0_CNTL + i,
  822. (RS600_ENABLE_TRANSLATION_MODE_OVERRIDE |
  823. RS600_SYSTEM_ACCESS_MODE_IN_SYS |
  824. RS600_SYSTEM_APERTURE_UNMAPPED_ACCESS_PASSTHROUGH |
  825. RS600_EFFECTIVE_L1_CACHE_SIZE(3) |
  826. RS600_ENABLE_FRAGMENT_PROCESSING |
  827. RS600_EFFECTIVE_L1_QUEUE_SIZE(3)));
  828. IGP_WRITE_MCIND(RS600_MC_PT0_CONTEXT0_CNTL, (RS600_ENABLE_PAGE_TABLE |
  829. RS600_PAGE_TABLE_TYPE_FLAT));
  830. /* disable all other contexts */
  831. for (i = 1; i < 8; i++)
  832. IGP_WRITE_MCIND(RS600_MC_PT0_CONTEXT0_CNTL + i, 0);
  833. /* setup the page table aperture */
  834. IGP_WRITE_MCIND(RS600_MC_PT0_CONTEXT0_FLAT_BASE_ADDR,
  835. dev_priv->gart_info.bus_addr);
  836. IGP_WRITE_MCIND(RS600_MC_PT0_CONTEXT0_FLAT_START_ADDR,
  837. dev_priv->gart_vm_start);
  838. IGP_WRITE_MCIND(RS600_MC_PT0_CONTEXT0_FLAT_END_ADDR,
  839. (dev_priv->gart_vm_start + dev_priv->gart_size - 1));
  840. IGP_WRITE_MCIND(RS600_MC_PT0_CONTEXT0_DEFAULT_READ_ADDR, 0);
  841. /* setup the system aperture */
  842. IGP_WRITE_MCIND(RS600_MC_PT0_SYSTEM_APERTURE_LOW_ADDR,
  843. dev_priv->gart_vm_start);
  844. IGP_WRITE_MCIND(RS600_MC_PT0_SYSTEM_APERTURE_HIGH_ADDR,
  845. (dev_priv->gart_vm_start + dev_priv->gart_size - 1));
  846. /* enable page tables */
  847. temp = IGP_READ_MCIND(dev_priv, RS600_MC_PT0_CNTL);
  848. IGP_WRITE_MCIND(RS600_MC_PT0_CNTL, (temp | RS600_ENABLE_PT));
  849. temp = IGP_READ_MCIND(dev_priv, RS600_MC_CNTL1);
  850. IGP_WRITE_MCIND(RS600_MC_CNTL1, (temp | RS600_ENABLE_PAGE_TABLES));
  851. /* invalidate the cache */
  852. temp = IGP_READ_MCIND(dev_priv, RS600_MC_PT0_CNTL);
  853. temp &= ~(RS600_INVALIDATE_ALL_L1_TLBS | RS600_INVALIDATE_L2_CACHE);
  854. IGP_WRITE_MCIND(RS600_MC_PT0_CNTL, temp);
  855. temp = IGP_READ_MCIND(dev_priv, RS600_MC_PT0_CNTL);
  856. temp |= RS600_INVALIDATE_ALL_L1_TLBS | RS600_INVALIDATE_L2_CACHE;
  857. IGP_WRITE_MCIND(RS600_MC_PT0_CNTL, temp);
  858. temp = IGP_READ_MCIND(dev_priv, RS600_MC_PT0_CNTL);
  859. temp &= ~(RS600_INVALIDATE_ALL_L1_TLBS | RS600_INVALIDATE_L2_CACHE);
  860. IGP_WRITE_MCIND(RS600_MC_PT0_CNTL, temp);
  861. temp = IGP_READ_MCIND(dev_priv, RS600_MC_PT0_CNTL);
  862. } else {
  863. IGP_WRITE_MCIND(RS600_MC_PT0_CNTL, 0);
  864. temp = IGP_READ_MCIND(dev_priv, RS600_MC_CNTL1);
  865. temp &= ~RS600_ENABLE_PAGE_TABLES;
  866. IGP_WRITE_MCIND(RS600_MC_CNTL1, temp);
  867. }
  868. }
  869. static void radeon_set_pciegart(drm_radeon_private_t * dev_priv, int on)
  870. {
  871. u32 tmp = RADEON_READ_PCIE(dev_priv, RADEON_PCIE_TX_GART_CNTL);
  872. if (on) {
  873. DRM_DEBUG("programming pcie %08X %08lX %08X\n",
  874. dev_priv->gart_vm_start,
  875. (long)dev_priv->gart_info.bus_addr,
  876. dev_priv->gart_size);
  877. RADEON_WRITE_PCIE(RADEON_PCIE_TX_DISCARD_RD_ADDR_LO,
  878. dev_priv->gart_vm_start);
  879. RADEON_WRITE_PCIE(RADEON_PCIE_TX_GART_BASE,
  880. dev_priv->gart_info.bus_addr);
  881. RADEON_WRITE_PCIE(RADEON_PCIE_TX_GART_START_LO,
  882. dev_priv->gart_vm_start);
  883. RADEON_WRITE_PCIE(RADEON_PCIE_TX_GART_END_LO,
  884. dev_priv->gart_vm_start +
  885. dev_priv->gart_size - 1);
  886. radeon_write_agp_location(dev_priv, 0xffffffc0); /* ?? */
  887. RADEON_WRITE_PCIE(RADEON_PCIE_TX_GART_CNTL,
  888. RADEON_PCIE_TX_GART_EN);
  889. } else {
  890. RADEON_WRITE_PCIE(RADEON_PCIE_TX_GART_CNTL,
  891. tmp & ~RADEON_PCIE_TX_GART_EN);
  892. }
  893. }
  894. /* Enable or disable PCI GART on the chip */
  895. static void radeon_set_pcigart(drm_radeon_private_t * dev_priv, int on)
  896. {
  897. u32 tmp;
  898. if (((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RS690) ||
  899. ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RS740) ||
  900. (dev_priv->flags & RADEON_IS_IGPGART)) {
  901. radeon_set_igpgart(dev_priv, on);
  902. return;
  903. }
  904. if ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RS600) {
  905. rs600_set_igpgart(dev_priv, on);
  906. return;
  907. }
  908. if (dev_priv->flags & RADEON_IS_PCIE) {
  909. radeon_set_pciegart(dev_priv, on);
  910. return;
  911. }
  912. tmp = RADEON_READ(RADEON_AIC_CNTL);
  913. if (on) {
  914. RADEON_WRITE(RADEON_AIC_CNTL,
  915. tmp | RADEON_PCIGART_TRANSLATE_EN);
  916. /* set PCI GART page-table base address
  917. */
  918. RADEON_WRITE(RADEON_AIC_PT_BASE, dev_priv->gart_info.bus_addr);
  919. /* set address range for PCI address translate
  920. */
  921. RADEON_WRITE(RADEON_AIC_LO_ADDR, dev_priv->gart_vm_start);
  922. RADEON_WRITE(RADEON_AIC_HI_ADDR, dev_priv->gart_vm_start
  923. + dev_priv->gart_size - 1);
  924. /* Turn off AGP aperture -- is this required for PCI GART?
  925. */
  926. radeon_write_agp_location(dev_priv, 0xffffffc0);
  927. RADEON_WRITE(RADEON_AGP_COMMAND, 0); /* clear AGP_COMMAND */
  928. } else {
  929. RADEON_WRITE(RADEON_AIC_CNTL,
  930. tmp & ~RADEON_PCIGART_TRANSLATE_EN);
  931. }
  932. }
  933. static int radeon_setup_pcigart_surface(drm_radeon_private_t *dev_priv)
  934. {
  935. struct drm_ati_pcigart_info *gart_info = &dev_priv->gart_info;
  936. struct radeon_virt_surface *vp;
  937. int i;
  938. for (i = 0; i < RADEON_MAX_SURFACES * 2; i++) {
  939. if (!dev_priv->virt_surfaces[i].file_priv ||
  940. dev_priv->virt_surfaces[i].file_priv == PCIGART_FILE_PRIV)
  941. break;
  942. }
  943. if (i >= 2 * RADEON_MAX_SURFACES)
  944. return -ENOMEM;
  945. vp = &dev_priv->virt_surfaces[i];
  946. for (i = 0; i < RADEON_MAX_SURFACES; i++) {
  947. struct radeon_surface *sp = &dev_priv->surfaces[i];
  948. if (sp->refcount)
  949. continue;
  950. vp->surface_index = i;
  951. vp->lower = gart_info->bus_addr;
  952. vp->upper = vp->lower + gart_info->table_size;
  953. vp->flags = 0;
  954. vp->file_priv = PCIGART_FILE_PRIV;
  955. sp->refcount = 1;
  956. sp->lower = vp->lower;
  957. sp->upper = vp->upper;
  958. sp->flags = 0;
  959. RADEON_WRITE(RADEON_SURFACE0_INFO + 16 * i, sp->flags);
  960. RADEON_WRITE(RADEON_SURFACE0_LOWER_BOUND + 16 * i, sp->lower);
  961. RADEON_WRITE(RADEON_SURFACE0_UPPER_BOUND + 16 * i, sp->upper);
  962. return 0;
  963. }
  964. return -ENOMEM;
  965. }
  966. static int radeon_do_init_cp(struct drm_device *dev, drm_radeon_init_t *init,
  967. struct drm_file *file_priv)
  968. {
  969. drm_radeon_private_t *dev_priv = dev->dev_private;
  970. struct drm_radeon_master_private *master_priv = file_priv->master->driver_priv;
  971. DRM_DEBUG("\n");
  972. /* if we require new memory map but we don't have it fail */
  973. if ((dev_priv->flags & RADEON_NEW_MEMMAP) && !dev_priv->new_memmap) {
  974. DRM_ERROR("Cannot initialise DRM on this card\nThis card requires a new X.org DDX for 3D\n");
  975. radeon_do_cleanup_cp(dev);
  976. return -EINVAL;
  977. }
  978. if (init->is_pci && (dev_priv->flags & RADEON_IS_AGP)) {
  979. DRM_DEBUG("Forcing AGP card to PCI mode\n");
  980. dev_priv->flags &= ~RADEON_IS_AGP;
  981. } else if (!(dev_priv->flags & (RADEON_IS_AGP | RADEON_IS_PCI | RADEON_IS_PCIE))
  982. && !init->is_pci) {
  983. DRM_DEBUG("Restoring AGP flag\n");
  984. dev_priv->flags |= RADEON_IS_AGP;
  985. }
  986. if ((!(dev_priv->flags & RADEON_IS_AGP)) && !dev->sg) {
  987. DRM_ERROR("PCI GART memory not allocated!\n");
  988. radeon_do_cleanup_cp(dev);
  989. return -EINVAL;
  990. }
  991. dev_priv->usec_timeout = init->usec_timeout;
  992. if (dev_priv->usec_timeout < 1 ||
  993. dev_priv->usec_timeout > RADEON_MAX_USEC_TIMEOUT) {
  994. DRM_DEBUG("TIMEOUT problem!\n");
  995. radeon_do_cleanup_cp(dev);
  996. return -EINVAL;
  997. }
  998. /* Enable vblank on CRTC1 for older X servers
  999. */
  1000. dev_priv->vblank_crtc = DRM_RADEON_VBLANK_CRTC1;
  1001. switch(init->func) {
  1002. case RADEON_INIT_R200_CP:
  1003. dev_priv->microcode_version = UCODE_R200;
  1004. break;
  1005. case RADEON_INIT_R300_CP:
  1006. dev_priv->microcode_version = UCODE_R300;
  1007. break;
  1008. default:
  1009. dev_priv->microcode_version = UCODE_R100;
  1010. }
  1011. dev_priv->do_boxes = 0;
  1012. dev_priv->cp_mode = init->cp_mode;
  1013. /* We don't support anything other than bus-mastering ring mode,
  1014. * but the ring can be in either AGP or PCI space for the ring
  1015. * read pointer.
  1016. */
  1017. if ((init->cp_mode != RADEON_CSQ_PRIBM_INDDIS) &&
  1018. (init->cp_mode != RADEON_CSQ_PRIBM_INDBM)) {
  1019. DRM_DEBUG("BAD cp_mode (%x)!\n", init->cp_mode);
  1020. radeon_do_cleanup_cp(dev);
  1021. return -EINVAL;
  1022. }
  1023. switch (init->fb_bpp) {
  1024. case 16:
  1025. dev_priv->color_fmt = RADEON_COLOR_FORMAT_RGB565;
  1026. break;
  1027. case 32:
  1028. default:
  1029. dev_priv->color_fmt = RADEON_COLOR_FORMAT_ARGB8888;
  1030. break;
  1031. }
  1032. dev_priv->front_offset = init->front_offset;
  1033. dev_priv->front_pitch = init->front_pitch;
  1034. dev_priv->back_offset = init->back_offset;
  1035. dev_priv->back_pitch = init->back_pitch;
  1036. switch (init->depth_bpp) {
  1037. case 16:
  1038. dev_priv->depth_fmt = RADEON_DEPTH_FORMAT_16BIT_INT_Z;
  1039. break;
  1040. case 32:
  1041. default:
  1042. dev_priv->depth_fmt = RADEON_DEPTH_FORMAT_24BIT_INT_Z;
  1043. break;
  1044. }
  1045. dev_priv->depth_offset = init->depth_offset;
  1046. dev_priv->depth_pitch = init->depth_pitch;
  1047. /* Hardware state for depth clears. Remove this if/when we no
  1048. * longer clear the depth buffer with a 3D rectangle. Hard-code
  1049. * all values to prevent unwanted 3D state from slipping through
  1050. * and screwing with the clear operation.
  1051. */
  1052. dev_priv->depth_clear.rb3d_cntl = (RADEON_PLANE_MASK_ENABLE |
  1053. (dev_priv->color_fmt << 10) |
  1054. (dev_priv->microcode_version ==
  1055. UCODE_R100 ? RADEON_ZBLOCK16 : 0));
  1056. dev_priv->depth_clear.rb3d_zstencilcntl =
  1057. (dev_priv->depth_fmt |
  1058. RADEON_Z_TEST_ALWAYS |
  1059. RADEON_STENCIL_TEST_ALWAYS |
  1060. RADEON_STENCIL_S_FAIL_REPLACE |
  1061. RADEON_STENCIL_ZPASS_REPLACE |
  1062. RADEON_STENCIL_ZFAIL_REPLACE | RADEON_Z_WRITE_ENABLE);
  1063. dev_priv->depth_clear.se_cntl = (RADEON_FFACE_CULL_CW |
  1064. RADEON_BFACE_SOLID |
  1065. RADEON_FFACE_SOLID |
  1066. RADEON_FLAT_SHADE_VTX_LAST |
  1067. RADEON_DIFFUSE_SHADE_FLAT |
  1068. RADEON_ALPHA_SHADE_FLAT |
  1069. RADEON_SPECULAR_SHADE_FLAT |
  1070. RADEON_FOG_SHADE_FLAT |
  1071. RADEON_VTX_PIX_CENTER_OGL |
  1072. RADEON_ROUND_MODE_TRUNC |
  1073. RADEON_ROUND_PREC_8TH_PIX);
  1074. dev_priv->ring_offset = init->ring_offset;
  1075. dev_priv->ring_rptr_offset = init->ring_rptr_offset;
  1076. dev_priv->buffers_offset = init->buffers_offset;
  1077. dev_priv->gart_textures_offset = init->gart_textures_offset;
  1078. master_priv->sarea = drm_getsarea(dev);
  1079. if (!master_priv->sarea) {
  1080. DRM_ERROR("could not find sarea!\n");
  1081. radeon_do_cleanup_cp(dev);
  1082. return -EINVAL;
  1083. }
  1084. dev_priv->cp_ring = drm_core_findmap(dev, init->ring_offset);
  1085. if (!dev_priv->cp_ring) {
  1086. DRM_ERROR("could not find cp ring region!\n");
  1087. radeon_do_cleanup_cp(dev);
  1088. return -EINVAL;
  1089. }
  1090. dev_priv->ring_rptr = drm_core_findmap(dev, init->ring_rptr_offset);
  1091. if (!dev_priv->ring_rptr) {
  1092. DRM_ERROR("could not find ring read pointer!\n");
  1093. radeon_do_cleanup_cp(dev);
  1094. return -EINVAL;
  1095. }
  1096. dev->agp_buffer_token = init->buffers_offset;
  1097. dev->agp_buffer_map = drm_core_findmap(dev, init->buffers_offset);
  1098. if (!dev->agp_buffer_map) {
  1099. DRM_ERROR("could not find dma buffer region!\n");
  1100. radeon_do_cleanup_cp(dev);
  1101. return -EINVAL;
  1102. }
  1103. if (init->gart_textures_offset) {
  1104. dev_priv->gart_textures =
  1105. drm_core_findmap(dev, init->gart_textures_offset);
  1106. if (!dev_priv->gart_textures) {
  1107. DRM_ERROR("could not find GART texture region!\n");
  1108. radeon_do_cleanup_cp(dev);
  1109. return -EINVAL;
  1110. }
  1111. }
  1112. #if __OS_HAS_AGP
  1113. if (dev_priv->flags & RADEON_IS_AGP) {
  1114. drm_core_ioremap_wc(dev_priv->cp_ring, dev);
  1115. drm_core_ioremap_wc(dev_priv->ring_rptr, dev);
  1116. drm_core_ioremap_wc(dev->agp_buffer_map, dev);
  1117. if (!dev_priv->cp_ring->handle ||
  1118. !dev_priv->ring_rptr->handle ||
  1119. !dev->agp_buffer_map->handle) {
  1120. DRM_ERROR("could not find ioremap agp regions!\n");
  1121. radeon_do_cleanup_cp(dev);
  1122. return -EINVAL;
  1123. }
  1124. } else
  1125. #endif
  1126. {
  1127. dev_priv->cp_ring->handle =
  1128. (void *)(unsigned long)dev_priv->cp_ring->offset;
  1129. dev_priv->ring_rptr->handle =
  1130. (void *)(unsigned long)dev_priv->ring_rptr->offset;
  1131. dev->agp_buffer_map->handle =
  1132. (void *)(unsigned long)dev->agp_buffer_map->offset;
  1133. DRM_DEBUG("dev_priv->cp_ring->handle %p\n",
  1134. dev_priv->cp_ring->handle);
  1135. DRM_DEBUG("dev_priv->ring_rptr->handle %p\n",
  1136. dev_priv->ring_rptr->handle);
  1137. DRM_DEBUG("dev->agp_buffer_map->handle %p\n",
  1138. dev->agp_buffer_map->handle);
  1139. }
  1140. dev_priv->fb_location = (radeon_read_fb_location(dev_priv) & 0xffff) << 16;
  1141. dev_priv->fb_size =
  1142. ((radeon_read_fb_location(dev_priv) & 0xffff0000u) + 0x10000)
  1143. - dev_priv->fb_location;
  1144. dev_priv->front_pitch_offset = (((dev_priv->front_pitch / 64) << 22) |
  1145. ((dev_priv->front_offset
  1146. + dev_priv->fb_location) >> 10));
  1147. dev_priv->back_pitch_offset = (((dev_priv->back_pitch / 64) << 22) |
  1148. ((dev_priv->back_offset
  1149. + dev_priv->fb_location) >> 10));
  1150. dev_priv->depth_pitch_offset = (((dev_priv->depth_pitch / 64) << 22) |
  1151. ((dev_priv->depth_offset
  1152. + dev_priv->fb_location) >> 10));
  1153. dev_priv->gart_size = init->gart_size;
  1154. /* New let's set the memory map ... */
  1155. if (dev_priv->new_memmap) {
  1156. u32 base = 0;
  1157. DRM_INFO("Setting GART location based on new memory map\n");
  1158. /* If using AGP, try to locate the AGP aperture at the same
  1159. * location in the card and on the bus, though we have to
  1160. * align it down.
  1161. */
  1162. #if __OS_HAS_AGP
  1163. if (dev_priv->flags & RADEON_IS_AGP) {
  1164. base = dev->agp->base;
  1165. /* Check if valid */
  1166. if ((base + dev_priv->gart_size - 1) >= dev_priv->fb_location &&
  1167. base < (dev_priv->fb_location + dev_priv->fb_size - 1)) {
  1168. DRM_INFO("Can't use AGP base @0x%08lx, won't fit\n",
  1169. dev->agp->base);
  1170. base = 0;
  1171. }
  1172. }
  1173. #endif
  1174. /* If not or if AGP is at 0 (Macs), try to put it elsewhere */
  1175. if (base == 0) {
  1176. base = dev_priv->fb_location + dev_priv->fb_size;
  1177. if (base < dev_priv->fb_location ||
  1178. ((base + dev_priv->gart_size) & 0xfffffffful) < base)
  1179. base = dev_priv->fb_location
  1180. - dev_priv->gart_size;
  1181. }
  1182. dev_priv->gart_vm_start = base & 0xffc00000u;
  1183. if (dev_priv->gart_vm_start != base)
  1184. DRM_INFO("GART aligned down from 0x%08x to 0x%08x\n",
  1185. base, dev_priv->gart_vm_start);
  1186. } else {
  1187. DRM_INFO("Setting GART location based on old memory map\n");
  1188. dev_priv->gart_vm_start = dev_priv->fb_location +
  1189. RADEON_READ(RADEON_CONFIG_APER_SIZE);
  1190. }
  1191. #if __OS_HAS_AGP
  1192. if (dev_priv->flags & RADEON_IS_AGP)
  1193. dev_priv->gart_buffers_offset = (dev->agp_buffer_map->offset
  1194. - dev->agp->base
  1195. + dev_priv->gart_vm_start);
  1196. else
  1197. #endif
  1198. dev_priv->gart_buffers_offset = (dev->agp_buffer_map->offset
  1199. - (unsigned long)dev->sg->virtual
  1200. + dev_priv->gart_vm_start);
  1201. DRM_DEBUG("dev_priv->gart_size %d\n", dev_priv->gart_size);
  1202. DRM_DEBUG("dev_priv->gart_vm_start 0x%x\n", dev_priv->gart_vm_start);
  1203. DRM_DEBUG("dev_priv->gart_buffers_offset 0x%lx\n",
  1204. dev_priv->gart_buffers_offset);
  1205. dev_priv->ring.start = (u32 *) dev_priv->cp_ring->handle;
  1206. dev_priv->ring.end = ((u32 *) dev_priv->cp_ring->handle
  1207. + init->ring_size / sizeof(u32));
  1208. dev_priv->ring.size = init->ring_size;
  1209. dev_priv->ring.size_l2qw = drm_order(init->ring_size / 8);
  1210. dev_priv->ring.rptr_update = /* init->rptr_update */ 4096;
  1211. dev_priv->ring.rptr_update_l2qw = drm_order( /* init->rptr_update */ 4096 / 8);
  1212. dev_priv->ring.fetch_size = /* init->fetch_size */ 32;
  1213. dev_priv->ring.fetch_size_l2ow = drm_order( /* init->fetch_size */ 32 / 16);
  1214. dev_priv->ring.tail_mask = (dev_priv->ring.size / sizeof(u32)) - 1;
  1215. dev_priv->ring.high_mark = RADEON_RING_HIGH_MARK;
  1216. #if __OS_HAS_AGP
  1217. if (dev_priv->flags & RADEON_IS_AGP) {
  1218. /* Turn off PCI GART */
  1219. radeon_set_pcigart(dev_priv, 0);
  1220. } else
  1221. #endif
  1222. {
  1223. u32 sctrl;
  1224. int ret;
  1225. dev_priv->gart_info.table_mask = DMA_BIT_MASK(32);
  1226. /* if we have an offset set from userspace */
  1227. if (dev_priv->pcigart_offset_set) {
  1228. dev_priv->gart_info.bus_addr =
  1229. (resource_size_t)dev_priv->pcigart_offset + dev_priv->fb_location;
  1230. dev_priv->gart_info.mapping.offset =
  1231. dev_priv->pcigart_offset + dev_priv->fb_aper_offset;
  1232. dev_priv->gart_info.mapping.size =
  1233. dev_priv->gart_info.table_size;
  1234. drm_core_ioremap_wc(&dev_priv->gart_info.mapping, dev);
  1235. dev_priv->gart_info.addr =
  1236. dev_priv->gart_info.mapping.handle;
  1237. if (dev_priv->flags & RADEON_IS_PCIE)
  1238. dev_priv->gart_info.gart_reg_if = DRM_ATI_GART_PCIE;
  1239. else
  1240. dev_priv->gart_info.gart_reg_if = DRM_ATI_GART_PCI;
  1241. dev_priv->gart_info.gart_table_location =
  1242. DRM_ATI_GART_FB;
  1243. DRM_DEBUG("Setting phys_pci_gart to %p %08lX\n",
  1244. dev_priv->gart_info.addr,
  1245. dev_priv->pcigart_offset);
  1246. } else {
  1247. if (dev_priv->flags & RADEON_IS_IGPGART)
  1248. dev_priv->gart_info.gart_reg_if = DRM_ATI_GART_IGP;
  1249. else
  1250. dev_priv->gart_info.gart_reg_if = DRM_ATI_GART_PCI;
  1251. dev_priv->gart_info.gart_table_location =
  1252. DRM_ATI_GART_MAIN;
  1253. dev_priv->gart_info.addr = NULL;
  1254. dev_priv->gart_info.bus_addr = 0;
  1255. if (dev_priv->flags & RADEON_IS_PCIE) {
  1256. DRM_ERROR
  1257. ("Cannot use PCI Express without GART in FB memory\n");
  1258. radeon_do_cleanup_cp(dev);
  1259. return -EINVAL;
  1260. }
  1261. }
  1262. sctrl = RADEON_READ(RADEON_SURFACE_CNTL);
  1263. RADEON_WRITE(RADEON_SURFACE_CNTL, 0);
  1264. if ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RS600)
  1265. ret = r600_page_table_init(dev);
  1266. else
  1267. ret = drm_ati_pcigart_init(dev, &dev_priv->gart_info);
  1268. RADEON_WRITE(RADEON_SURFACE_CNTL, sctrl);
  1269. if (!ret) {
  1270. DRM_ERROR("failed to init PCI GART!\n");
  1271. radeon_do_cleanup_cp(dev);
  1272. return -ENOMEM;
  1273. }
  1274. ret = radeon_setup_pcigart_surface(dev_priv);
  1275. if (ret) {
  1276. DRM_ERROR("failed to setup GART surface!\n");
  1277. if ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RS600)
  1278. r600_page_table_cleanup(dev, &dev_priv->gart_info);
  1279. else
  1280. drm_ati_pcigart_cleanup(dev, &dev_priv->gart_info);
  1281. radeon_do_cleanup_cp(dev);
  1282. return ret;
  1283. }
  1284. /* Turn on PCI GART */
  1285. radeon_set_pcigart(dev_priv, 1);
  1286. }
  1287. radeon_cp_load_microcode(dev_priv);
  1288. radeon_cp_init_ring_buffer(dev, dev_priv, file_priv);
  1289. dev_priv->last_buf = 0;
  1290. radeon_do_engine_reset(dev);
  1291. radeon_test_writeback(dev_priv);
  1292. return 0;
  1293. }
  1294. static int radeon_do_cleanup_cp(struct drm_device * dev)
  1295. {
  1296. drm_radeon_private_t *dev_priv = dev->dev_private;
  1297. DRM_DEBUG("\n");
  1298. /* Make sure interrupts are disabled here because the uninstall ioctl
  1299. * may not have been called from userspace and after dev_private
  1300. * is freed, it's too late.
  1301. */
  1302. if (dev->irq_enabled)
  1303. drm_irq_uninstall(dev);
  1304. #if __OS_HAS_AGP
  1305. if (dev_priv->flags & RADEON_IS_AGP) {
  1306. if (dev_priv->cp_ring != NULL) {
  1307. drm_core_ioremapfree(dev_priv->cp_ring, dev);
  1308. dev_priv->cp_ring = NULL;
  1309. }
  1310. if (dev_priv->ring_rptr != NULL) {
  1311. drm_core_ioremapfree(dev_priv->ring_rptr, dev);
  1312. dev_priv->ring_rptr = NULL;
  1313. }
  1314. if (dev->agp_buffer_map != NULL) {
  1315. drm_core_ioremapfree(dev->agp_buffer_map, dev);
  1316. dev->agp_buffer_map = NULL;
  1317. }
  1318. } else
  1319. #endif
  1320. {
  1321. if (dev_priv->gart_info.bus_addr) {
  1322. /* Turn off PCI GART */
  1323. radeon_set_pcigart(dev_priv, 0);
  1324. if ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RS600)
  1325. r600_page_table_cleanup(dev, &dev_priv->gart_info);
  1326. else {
  1327. if (!drm_ati_pcigart_cleanup(dev, &dev_priv->gart_info))
  1328. DRM_ERROR("failed to cleanup PCI GART!\n");
  1329. }
  1330. }
  1331. if (dev_priv->gart_info.gart_table_location == DRM_ATI_GART_FB)
  1332. {
  1333. drm_core_ioremapfree(&dev_priv->gart_info.mapping, dev);
  1334. dev_priv->gart_info.addr = NULL;
  1335. }
  1336. }
  1337. /* only clear to the start of flags */
  1338. memset(dev_priv, 0, offsetof(drm_radeon_private_t, flags));
  1339. return 0;
  1340. }
  1341. /* This code will reinit the Radeon CP hardware after a resume from disc.
  1342. * AFAIK, it would be very difficult to pickle the state at suspend time, so
  1343. * here we make sure that all Radeon hardware initialisation is re-done without
  1344. * affecting running applications.
  1345. *
  1346. * Charl P. Botha <http://cpbotha.net>
  1347. */
  1348. static int radeon_do_resume_cp(struct drm_device *dev, struct drm_file *file_priv)
  1349. {
  1350. drm_radeon_private_t *dev_priv = dev->dev_private;
  1351. if (!dev_priv) {
  1352. DRM_ERROR("Called with no initialization\n");
  1353. return -EINVAL;
  1354. }
  1355. DRM_DEBUG("Starting radeon_do_resume_cp()\n");
  1356. #if __OS_HAS_AGP
  1357. if (dev_priv->flags & RADEON_IS_AGP) {
  1358. /* Turn off PCI GART */
  1359. radeon_set_pcigart(dev_priv, 0);
  1360. } else
  1361. #endif
  1362. {
  1363. /* Turn on PCI GART */
  1364. radeon_set_pcigart(dev_priv, 1);
  1365. }
  1366. radeon_cp_load_microcode(dev_priv);
  1367. radeon_cp_init_ring_buffer(dev, dev_priv, file_priv);
  1368. radeon_do_engine_reset(dev);
  1369. radeon_irq_set_state(dev, RADEON_SW_INT_ENABLE, 1);
  1370. DRM_DEBUG("radeon_do_resume_cp() complete\n");
  1371. return 0;
  1372. }
  1373. int radeon_cp_init(struct drm_device *dev, void *data, struct drm_file *file_priv)
  1374. {
  1375. drm_radeon_private_t *dev_priv = dev->dev_private;
  1376. drm_radeon_init_t *init = data;
  1377. LOCK_TEST_WITH_RETURN(dev, file_priv);
  1378. if (init->func == RADEON_INIT_R300_CP)
  1379. r300_init_reg_flags(dev);
  1380. switch (init->func) {
  1381. case RADEON_INIT_CP:
  1382. case RADEON_INIT_R200_CP:
  1383. case RADEON_INIT_R300_CP:
  1384. return radeon_do_init_cp(dev, init, file_priv);
  1385. case RADEON_INIT_R600_CP:
  1386. return r600_do_init_cp(dev, init, file_priv);
  1387. case RADEON_CLEANUP_CP:
  1388. if ((dev_priv->flags & RADEON_FAMILY_MASK) >= CHIP_R600)
  1389. return r600_do_cleanup_cp(dev);
  1390. else
  1391. return radeon_do_cleanup_cp(dev);
  1392. }
  1393. return -EINVAL;
  1394. }
  1395. int radeon_cp_start(struct drm_device *dev, void *data, struct drm_file *file_priv)
  1396. {
  1397. drm_radeon_private_t *dev_priv = dev->dev_private;
  1398. DRM_DEBUG("\n");
  1399. LOCK_TEST_WITH_RETURN(dev, file_priv);
  1400. if (dev_priv->cp_running) {
  1401. DRM_DEBUG("while CP running\n");
  1402. return 0;
  1403. }
  1404. if (dev_priv->cp_mode == RADEON_CSQ_PRIDIS_INDDIS) {
  1405. DRM_DEBUG("called with bogus CP mode (%d)\n",
  1406. dev_priv->cp_mode);
  1407. return 0;
  1408. }
  1409. if ((dev_priv->flags & RADEON_FAMILY_MASK) >= CHIP_R600)
  1410. r600_do_cp_start(dev_priv);
  1411. else
  1412. radeon_do_cp_start(dev_priv);
  1413. return 0;
  1414. }
  1415. /* Stop the CP. The engine must have been idled before calling this
  1416. * routine.
  1417. */
  1418. int radeon_cp_stop(struct drm_device *dev, void *data, struct drm_file *file_priv)
  1419. {
  1420. drm_radeon_private_t *dev_priv = dev->dev_private;
  1421. drm_radeon_cp_stop_t *stop = data;
  1422. int ret;
  1423. DRM_DEBUG("\n");
  1424. LOCK_TEST_WITH_RETURN(dev, file_priv);
  1425. if (!dev_priv->cp_running)
  1426. return 0;
  1427. /* Flush any pending CP commands. This ensures any outstanding
  1428. * commands are exectuted by the engine before we turn it off.
  1429. */
  1430. if (stop->flush) {
  1431. radeon_do_cp_flush(dev_priv);
  1432. }
  1433. /* If we fail to make the engine go idle, we return an error
  1434. * code so that the DRM ioctl wrapper can try again.
  1435. */
  1436. if (stop->idle) {
  1437. if ((dev_priv->flags & RADEON_FAMILY_MASK) >= CHIP_R600)
  1438. ret = r600_do_cp_idle(dev_priv);
  1439. else
  1440. ret = radeon_do_cp_idle(dev_priv);
  1441. if (ret)
  1442. return ret;
  1443. }
  1444. /* Finally, we can turn off the CP. If the engine isn't idle,
  1445. * we will get some dropped triangles as they won't be fully
  1446. * rendered before the CP is shut down.
  1447. */
  1448. if ((dev_priv->flags & RADEON_FAMILY_MASK) >= CHIP_R600)
  1449. r600_do_cp_stop(dev_priv);
  1450. else
  1451. radeon_do_cp_stop(dev_priv);
  1452. /* Reset the engine */
  1453. if ((dev_priv->flags & RADEON_FAMILY_MASK) >= CHIP_R600)
  1454. r600_do_engine_reset(dev);
  1455. else
  1456. radeon_do_engine_reset(dev);
  1457. return 0;
  1458. }
  1459. void radeon_do_release(struct drm_device * dev)
  1460. {
  1461. drm_radeon_private_t *dev_priv = dev->dev_private;
  1462. int i, ret;
  1463. if (dev_priv) {
  1464. if (dev_priv->cp_running) {
  1465. /* Stop the cp */
  1466. if ((dev_priv->flags & RADEON_FAMILY_MASK) >= CHIP_R600) {
  1467. while ((ret = r600_do_cp_idle(dev_priv)) != 0) {
  1468. DRM_DEBUG("radeon_do_cp_idle %d\n", ret);
  1469. #ifdef __linux__
  1470. schedule();
  1471. #else
  1472. tsleep(&ret, PZERO, "rdnrel", 1);
  1473. #endif
  1474. }
  1475. } else {
  1476. while ((ret = radeon_do_cp_idle(dev_priv)) != 0) {
  1477. DRM_DEBUG("radeon_do_cp_idle %d\n", ret);
  1478. #ifdef __linux__
  1479. schedule();
  1480. #else
  1481. tsleep(&ret, PZERO, "rdnrel", 1);
  1482. #endif
  1483. }
  1484. }
  1485. if ((dev_priv->flags & RADEON_FAMILY_MASK) >= CHIP_R600) {
  1486. r600_do_cp_stop(dev_priv);
  1487. r600_do_engine_reset(dev);
  1488. } else {
  1489. radeon_do_cp_stop(dev_priv);
  1490. radeon_do_engine_reset(dev);
  1491. }
  1492. }
  1493. if ((dev_priv->flags & RADEON_FAMILY_MASK) < CHIP_R600) {
  1494. /* Disable *all* interrupts */
  1495. if (dev_priv->mmio) /* remove this after permanent addmaps */
  1496. RADEON_WRITE(RADEON_GEN_INT_CNTL, 0);
  1497. if (dev_priv->mmio) { /* remove all surfaces */
  1498. for (i = 0; i < RADEON_MAX_SURFACES; i++) {
  1499. RADEON_WRITE(RADEON_SURFACE0_INFO + 16 * i, 0);
  1500. RADEON_WRITE(RADEON_SURFACE0_LOWER_BOUND +
  1501. 16 * i, 0);
  1502. RADEON_WRITE(RADEON_SURFACE0_UPPER_BOUND +
  1503. 16 * i, 0);
  1504. }
  1505. }
  1506. }
  1507. /* Free memory heap structures */
  1508. radeon_mem_takedown(&(dev_priv->gart_heap));
  1509. radeon_mem_takedown(&(dev_priv->fb_heap));
  1510. /* deallocate kernel resources */
  1511. if ((dev_priv->flags & RADEON_FAMILY_MASK) >= CHIP_R600)
  1512. r600_do_cleanup_cp(dev);
  1513. else
  1514. radeon_do_cleanup_cp(dev);
  1515. }
  1516. }
  1517. /* Just reset the CP ring. Called as part of an X Server engine reset.
  1518. */
  1519. int radeon_cp_reset(struct drm_device *dev, void *data, struct drm_file *file_priv)
  1520. {
  1521. drm_radeon_private_t *dev_priv = dev->dev_private;
  1522. DRM_DEBUG("\n");
  1523. LOCK_TEST_WITH_RETURN(dev, file_priv);
  1524. if (!dev_priv) {
  1525. DRM_DEBUG("called before init done\n");
  1526. return -EINVAL;
  1527. }
  1528. if ((dev_priv->flags & RADEON_FAMILY_MASK) >= CHIP_R600)
  1529. r600_do_cp_reset(dev_priv);
  1530. else
  1531. radeon_do_cp_reset(dev_priv);
  1532. /* The CP is no longer running after an engine reset */
  1533. dev_priv->cp_running = 0;
  1534. return 0;
  1535. }
  1536. int radeon_cp_idle(struct drm_device *dev, void *data, struct drm_file *file_priv)
  1537. {
  1538. drm_radeon_private_t *dev_priv = dev->dev_private;
  1539. DRM_DEBUG("\n");
  1540. LOCK_TEST_WITH_RETURN(dev, file_priv);
  1541. if ((dev_priv->flags & RADEON_FAMILY_MASK) >= CHIP_R600)
  1542. return r600_do_cp_idle(dev_priv);
  1543. else
  1544. return radeon_do_cp_idle(dev_priv);
  1545. }
  1546. /* Added by Charl P. Botha to call radeon_do_resume_cp().
  1547. */
  1548. int radeon_cp_resume(struct drm_device *dev, void *data, struct drm_file *file_priv)
  1549. {
  1550. drm_radeon_private_t *dev_priv = dev->dev_private;
  1551. DRM_DEBUG("\n");
  1552. if ((dev_priv->flags & RADEON_FAMILY_MASK) >= CHIP_R600)
  1553. return r600_do_resume_cp(dev, file_priv);
  1554. else
  1555. return radeon_do_resume_cp(dev, file_priv);
  1556. }
  1557. int radeon_engine_reset(struct drm_device *dev, void *data, struct drm_file *file_priv)
  1558. {
  1559. drm_radeon_private_t *dev_priv = dev->dev_private;
  1560. DRM_DEBUG("\n");
  1561. LOCK_TEST_WITH_RETURN(dev, file_priv);
  1562. if ((dev_priv->flags & RADEON_FAMILY_MASK) >= CHIP_R600)
  1563. return r600_do_engine_reset(dev);
  1564. else
  1565. return radeon_do_engine_reset(dev);
  1566. }
  1567. /* ================================================================
  1568. * Fullscreen mode
  1569. */
  1570. /* KW: Deprecated to say the least:
  1571. */
  1572. int radeon_fullscreen(struct drm_device *dev, void *data, struct drm_file *file_priv)
  1573. {
  1574. return 0;
  1575. }
  1576. /* ================================================================
  1577. * Freelist management
  1578. */
  1579. /* Original comment: FIXME: ROTATE_BUFS is a hack to cycle through
  1580. * bufs until freelist code is used. Note this hides a problem with
  1581. * the scratch register * (used to keep track of last buffer
  1582. * completed) being written to before * the last buffer has actually
  1583. * completed rendering.
  1584. *
  1585. * KW: It's also a good way to find free buffers quickly.
  1586. *
  1587. * KW: Ideally this loop wouldn't exist, and freelist_get wouldn't
  1588. * sleep. However, bugs in older versions of radeon_accel.c mean that
  1589. * we essentially have to do this, else old clients will break.
  1590. *
  1591. * However, it does leave open a potential deadlock where all the
  1592. * buffers are held by other clients, which can't release them because
  1593. * they can't get the lock.
  1594. */
  1595. struct drm_buf *radeon_freelist_get(struct drm_device * dev)
  1596. {
  1597. struct drm_device_dma *dma = dev->dma;
  1598. drm_radeon_private_t *dev_priv = dev->dev_private;
  1599. drm_radeon_buf_priv_t *buf_priv;
  1600. struct drm_buf *buf;
  1601. int i, t;
  1602. int start;
  1603. if (++dev_priv->last_buf >= dma->buf_count)
  1604. dev_priv->last_buf = 0;
  1605. start = dev_priv->last_buf;
  1606. for (t = 0; t < dev_priv->usec_timeout; t++) {
  1607. u32 done_age = GET_SCRATCH(dev_priv, 1);
  1608. DRM_DEBUG("done_age = %d\n", done_age);
  1609. for (i = start; i < dma->buf_count; i++) {
  1610. buf = dma->buflist[i];
  1611. buf_priv = buf->dev_private;
  1612. if (buf->file_priv == NULL || (buf->pending &&
  1613. buf_priv->age <=
  1614. done_age)) {
  1615. dev_priv->stats.requested_bufs++;
  1616. buf->pending = 0;
  1617. return buf;
  1618. }
  1619. start = 0;
  1620. }
  1621. if (t) {
  1622. DRM_UDELAY(1);
  1623. dev_priv->stats.freelist_loops++;
  1624. }
  1625. }
  1626. DRM_DEBUG("returning NULL!\n");
  1627. return NULL;
  1628. }
  1629. #if 0
  1630. struct drm_buf *radeon_freelist_get(struct drm_device * dev)
  1631. {
  1632. struct drm_device_dma *dma = dev->dma;
  1633. drm_radeon_private_t *dev_priv = dev->dev_private;
  1634. drm_radeon_buf_priv_t *buf_priv;
  1635. struct drm_buf *buf;
  1636. int i, t;
  1637. int start;
  1638. u32 done_age;
  1639. done_age = radeon_read_ring_rptr(dev_priv, RADEON_SCRATCHOFF(1));
  1640. if (++dev_priv->last_buf >= dma->buf_count)
  1641. dev_priv->last_buf = 0;
  1642. start = dev_priv->last_buf;
  1643. dev_priv->stats.freelist_loops++;
  1644. for (t = 0; t < 2; t++) {
  1645. for (i = start; i < dma->buf_count; i++) {
  1646. buf = dma->buflist[i];
  1647. buf_priv = buf->dev_private;
  1648. if (buf->file_priv == 0 || (buf->pending &&
  1649. buf_priv->age <=
  1650. done_age)) {
  1651. dev_priv->stats.requested_bufs++;
  1652. buf->pending = 0;
  1653. return buf;
  1654. }
  1655. }
  1656. start = 0;
  1657. }
  1658. return NULL;
  1659. }
  1660. #endif
  1661. void radeon_freelist_reset(struct drm_device * dev)
  1662. {
  1663. struct drm_device_dma *dma = dev->dma;
  1664. drm_radeon_private_t *dev_priv = dev->dev_private;
  1665. int i;
  1666. dev_priv->last_buf = 0;
  1667. for (i = 0; i < dma->buf_count; i++) {
  1668. struct drm_buf *buf = dma->buflist[i];
  1669. drm_radeon_buf_priv_t *buf_priv = buf->dev_private;
  1670. buf_priv->age = 0;
  1671. }
  1672. }
  1673. /* ================================================================
  1674. * CP command submission
  1675. */
  1676. int radeon_wait_ring(drm_radeon_private_t * dev_priv, int n)
  1677. {
  1678. drm_radeon_ring_buffer_t *ring = &dev_priv->ring;
  1679. int i;
  1680. u32 last_head = GET_RING_HEAD(dev_priv);
  1681. for (i = 0; i < dev_priv->usec_timeout; i++) {
  1682. u32 head = GET_RING_HEAD(dev_priv);
  1683. ring->space = (head - ring->tail) * sizeof(u32);
  1684. if (ring->space <= 0)
  1685. ring->space += ring->size;
  1686. if (ring->space > n)
  1687. return 0;
  1688. dev_priv->stats.boxes |= RADEON_BOX_WAIT_IDLE;
  1689. if (head != last_head)
  1690. i = 0;
  1691. last_head = head;
  1692. DRM_UDELAY(1);
  1693. }
  1694. /* FIXME: This return value is ignored in the BEGIN_RING macro! */
  1695. #if RADEON_FIFO_DEBUG
  1696. radeon_status(dev_priv);
  1697. DRM_ERROR("failed!\n");
  1698. #endif
  1699. return -EBUSY;
  1700. }
  1701. static int radeon_cp_get_buffers(struct drm_device *dev,
  1702. struct drm_file *file_priv,
  1703. struct drm_dma * d)
  1704. {
  1705. int i;
  1706. struct drm_buf *buf;
  1707. for (i = d->granted_count; i < d->request_count; i++) {
  1708. buf = radeon_freelist_get(dev);
  1709. if (!buf)
  1710. return -EBUSY; /* NOTE: broken client */
  1711. buf->file_priv = file_priv;
  1712. if (DRM_COPY_TO_USER(&d->request_indices[i], &buf->idx,
  1713. sizeof(buf->idx)))
  1714. return -EFAULT;
  1715. if (DRM_COPY_TO_USER(&d->request_sizes[i], &buf->total,
  1716. sizeof(buf->total)))
  1717. return -EFAULT;
  1718. d->granted_count++;
  1719. }
  1720. return 0;
  1721. }
  1722. int radeon_cp_buffers(struct drm_device *dev, void *data, struct drm_file *file_priv)
  1723. {
  1724. struct drm_device_dma *dma = dev->dma;
  1725. int ret = 0;
  1726. struct drm_dma *d = data;
  1727. LOCK_TEST_WITH_RETURN(dev, file_priv);
  1728. /* Please don't send us buffers.
  1729. */
  1730. if (d->send_count != 0) {
  1731. DRM_ERROR("Process %d trying to send %d buffers via drmDMA\n",
  1732. DRM_CURRENTPID, d->send_count);
  1733. return -EINVAL;
  1734. }
  1735. /* We'll send you buffers.
  1736. */
  1737. if (d->request_count < 0 || d->request_count > dma->buf_count) {
  1738. DRM_ERROR("Process %d trying to get %d buffers (of %d max)\n",
  1739. DRM_CURRENTPID, d->request_count, dma->buf_count);
  1740. return -EINVAL;
  1741. }
  1742. d->granted_count = 0;
  1743. if (d->request_count) {
  1744. ret = radeon_cp_get_buffers(dev, file_priv, d);
  1745. }
  1746. return ret;
  1747. }
  1748. int radeon_driver_load(struct drm_device *dev, unsigned long flags)
  1749. {
  1750. drm_radeon_private_t *dev_priv;
  1751. int ret = 0;
  1752. dev_priv = kzalloc(sizeof(drm_radeon_private_t), GFP_KERNEL);
  1753. if (dev_priv == NULL)
  1754. return -ENOMEM;
  1755. dev->dev_private = (void *)dev_priv;
  1756. dev_priv->flags = flags;
  1757. switch (flags & RADEON_FAMILY_MASK) {
  1758. case CHIP_R100:
  1759. case CHIP_RV200:
  1760. case CHIP_R200:
  1761. case CHIP_R300:
  1762. case CHIP_R350:
  1763. case CHIP_R420:
  1764. case CHIP_R423:
  1765. case CHIP_RV410:
  1766. case CHIP_RV515:
  1767. case CHIP_R520:
  1768. case CHIP_RV570:
  1769. case CHIP_R580:
  1770. dev_priv->flags |= RADEON_HAS_HIERZ;
  1771. break;
  1772. default:
  1773. /* all other chips have no hierarchical z buffer */
  1774. break;
  1775. }
  1776. if (drm_device_is_agp(dev))
  1777. dev_priv->flags |= RADEON_IS_AGP;
  1778. else if (drm_device_is_pcie(dev))
  1779. dev_priv->flags |= RADEON_IS_PCIE;
  1780. else
  1781. dev_priv->flags |= RADEON_IS_PCI;
  1782. ret = drm_addmap(dev, drm_get_resource_start(dev, 2),
  1783. drm_get_resource_len(dev, 2), _DRM_REGISTERS,
  1784. _DRM_READ_ONLY | _DRM_DRIVER, &dev_priv->mmio);
  1785. if (ret != 0)
  1786. return ret;
  1787. ret = drm_vblank_init(dev, 2);
  1788. if (ret) {
  1789. radeon_driver_unload(dev);
  1790. return ret;
  1791. }
  1792. DRM_DEBUG("%s card detected\n",
  1793. ((dev_priv->flags & RADEON_IS_AGP) ? "AGP" : (((dev_priv->flags & RADEON_IS_PCIE) ? "PCIE" : "PCI"))));
  1794. return ret;
  1795. }
  1796. int radeon_master_create(struct drm_device *dev, struct drm_master *master)
  1797. {
  1798. struct drm_radeon_master_private *master_priv;
  1799. unsigned long sareapage;
  1800. int ret;
  1801. master_priv = kzalloc(sizeof(*master_priv), GFP_KERNEL);
  1802. if (!master_priv)
  1803. return -ENOMEM;
  1804. /* prebuild the SAREA */
  1805. sareapage = max_t(unsigned long, SAREA_MAX, PAGE_SIZE);
  1806. ret = drm_addmap(dev, 0, sareapage, _DRM_SHM, _DRM_CONTAINS_LOCK,
  1807. &master_priv->sarea);
  1808. if (ret) {
  1809. DRM_ERROR("SAREA setup failed\n");
  1810. return ret;
  1811. }
  1812. master_priv->sarea_priv = master_priv->sarea->handle + sizeof(struct drm_sarea);
  1813. master_priv->sarea_priv->pfCurrentPage = 0;
  1814. master->driver_priv = master_priv;
  1815. return 0;
  1816. }
  1817. void radeon_master_destroy(struct drm_device *dev, struct drm_master *master)
  1818. {
  1819. struct drm_radeon_master_private *master_priv = master->driver_priv;
  1820. if (!master_priv)
  1821. return;
  1822. if (master_priv->sarea_priv &&
  1823. master_priv->sarea_priv->pfCurrentPage != 0)
  1824. radeon_cp_dispatch_flip(dev, master);
  1825. master_priv->sarea_priv = NULL;
  1826. if (master_priv->sarea)
  1827. drm_rmmap_locked(dev, master_priv->sarea);
  1828. kfree(master_priv);
  1829. master->driver_priv = NULL;
  1830. }
  1831. /* Create mappings for registers and framebuffer so userland doesn't necessarily
  1832. * have to find them.
  1833. */
  1834. int radeon_driver_firstopen(struct drm_device *dev)
  1835. {
  1836. int ret;
  1837. drm_local_map_t *map;
  1838. drm_radeon_private_t *dev_priv = dev->dev_private;
  1839. dev_priv->gart_info.table_size = RADEON_PCIGART_TABLE_SIZE;
  1840. dev_priv->fb_aper_offset = drm_get_resource_start(dev, 0);
  1841. ret = drm_addmap(dev, dev_priv->fb_aper_offset,
  1842. drm_get_resource_len(dev, 0), _DRM_FRAME_BUFFER,
  1843. _DRM_WRITE_COMBINING, &map);
  1844. if (ret != 0)
  1845. return ret;
  1846. return 0;
  1847. }
  1848. int radeon_driver_unload(struct drm_device *dev)
  1849. {
  1850. drm_radeon_private_t *dev_priv = dev->dev_private;
  1851. DRM_DEBUG("\n");
  1852. drm_rmmap(dev, dev_priv->mmio);
  1853. kfree(dev_priv);
  1854. dev->dev_private = NULL;
  1855. return 0;
  1856. }
  1857. void radeon_commit_ring(drm_radeon_private_t *dev_priv)
  1858. {
  1859. int i;
  1860. u32 *ring;
  1861. int tail_aligned;
  1862. /* check if the ring is padded out to 16-dword alignment */
  1863. tail_aligned = dev_priv->ring.tail & (RADEON_RING_ALIGN-1);
  1864. if (tail_aligned) {
  1865. int num_p2 = RADEON_RING_ALIGN - tail_aligned;
  1866. ring = dev_priv->ring.start;
  1867. /* pad with some CP_PACKET2 */
  1868. for (i = 0; i < num_p2; i++)
  1869. ring[dev_priv->ring.tail + i] = CP_PACKET2();
  1870. dev_priv->ring.tail += i;
  1871. dev_priv->ring.space -= num_p2 * sizeof(u32);
  1872. }
  1873. dev_priv->ring.tail &= dev_priv->ring.tail_mask;
  1874. DRM_MEMORYBARRIER();
  1875. GET_RING_HEAD( dev_priv );
  1876. if ((dev_priv->flags & RADEON_FAMILY_MASK) >= CHIP_R600) {
  1877. RADEON_WRITE(R600_CP_RB_WPTR, dev_priv->ring.tail);
  1878. /* read from PCI bus to ensure correct posting */
  1879. RADEON_READ(R600_CP_RB_RPTR);
  1880. } else {
  1881. RADEON_WRITE(RADEON_CP_RB_WPTR, dev_priv->ring.tail);
  1882. /* read from PCI bus to ensure correct posting */
  1883. RADEON_READ(RADEON_CP_RB_RPTR);
  1884. }
  1885. }