radeon_cp.c 50 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773
  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 "radeon_drm.h"
  34. #include "radeon_drv.h"
  35. #include "r300_reg.h"
  36. #include "radeon_microcode.h"
  37. #define RADEON_FIFO_DEBUG 0
  38. static int radeon_do_cleanup_cp(struct drm_device * dev);
  39. static u32 R500_READ_MCIND(drm_radeon_private_t *dev_priv, int addr)
  40. {
  41. u32 ret;
  42. RADEON_WRITE(R520_MC_IND_INDEX, 0x7f0000 | (addr & 0xff));
  43. ret = RADEON_READ(R520_MC_IND_DATA);
  44. RADEON_WRITE(R520_MC_IND_INDEX, 0);
  45. return ret;
  46. }
  47. static u32 RS480_READ_MCIND(drm_radeon_private_t *dev_priv, int addr)
  48. {
  49. u32 ret;
  50. RADEON_WRITE(RS480_NB_MC_INDEX, addr & 0xff);
  51. ret = RADEON_READ(RS480_NB_MC_DATA);
  52. RADEON_WRITE(RS480_NB_MC_INDEX, 0xff);
  53. return ret;
  54. }
  55. static u32 RS690_READ_MCIND(drm_radeon_private_t *dev_priv, int addr)
  56. {
  57. u32 ret;
  58. RADEON_WRITE(RS690_MC_INDEX, (addr & RS690_MC_INDEX_MASK));
  59. ret = RADEON_READ(RS690_MC_DATA);
  60. RADEON_WRITE(RS690_MC_INDEX, RS690_MC_INDEX_MASK);
  61. return ret;
  62. }
  63. static u32 IGP_READ_MCIND(drm_radeon_private_t *dev_priv, int addr)
  64. {
  65. if ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RS690)
  66. return RS690_READ_MCIND(dev_priv, addr);
  67. else
  68. return RS480_READ_MCIND(dev_priv, addr);
  69. }
  70. u32 radeon_read_fb_location(drm_radeon_private_t *dev_priv)
  71. {
  72. if ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RV515)
  73. return R500_READ_MCIND(dev_priv, RV515_MC_FB_LOCATION);
  74. else if ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RS690)
  75. return RS690_READ_MCIND(dev_priv, RS690_MC_FB_LOCATION);
  76. else if ((dev_priv->flags & RADEON_FAMILY_MASK) > CHIP_RV515)
  77. return R500_READ_MCIND(dev_priv, R520_MC_FB_LOCATION);
  78. else
  79. return RADEON_READ(RADEON_MC_FB_LOCATION);
  80. }
  81. static void radeon_write_fb_location(drm_radeon_private_t *dev_priv, u32 fb_loc)
  82. {
  83. if ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RV515)
  84. R500_WRITE_MCIND(RV515_MC_FB_LOCATION, fb_loc);
  85. else if ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RS690)
  86. RS690_WRITE_MCIND(RS690_MC_FB_LOCATION, fb_loc);
  87. else if ((dev_priv->flags & RADEON_FAMILY_MASK) > CHIP_RV515)
  88. R500_WRITE_MCIND(R520_MC_FB_LOCATION, fb_loc);
  89. else
  90. RADEON_WRITE(RADEON_MC_FB_LOCATION, fb_loc);
  91. }
  92. static void radeon_write_agp_location(drm_radeon_private_t *dev_priv, u32 agp_loc)
  93. {
  94. if ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RV515)
  95. R500_WRITE_MCIND(RV515_MC_AGP_LOCATION, agp_loc);
  96. else if ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RS690)
  97. RS690_WRITE_MCIND(RS690_MC_AGP_LOCATION, agp_loc);
  98. else if ((dev_priv->flags & RADEON_FAMILY_MASK) > CHIP_RV515)
  99. R500_WRITE_MCIND(R520_MC_AGP_LOCATION, agp_loc);
  100. else
  101. RADEON_WRITE(RADEON_MC_AGP_LOCATION, agp_loc);
  102. }
  103. static void radeon_write_agp_base(drm_radeon_private_t *dev_priv, u64 agp_base)
  104. {
  105. u32 agp_base_hi = upper_32_bits(agp_base);
  106. u32 agp_base_lo = agp_base & 0xffffffff;
  107. if ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RV515) {
  108. R500_WRITE_MCIND(RV515_MC_AGP_BASE, agp_base_lo);
  109. R500_WRITE_MCIND(RV515_MC_AGP_BASE_2, agp_base_hi);
  110. } else if ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RS690) {
  111. RS690_WRITE_MCIND(RS690_MC_AGP_BASE, agp_base_lo);
  112. RS690_WRITE_MCIND(RS690_MC_AGP_BASE_2, agp_base_hi);
  113. } else if ((dev_priv->flags & RADEON_FAMILY_MASK) > CHIP_RV515) {
  114. R500_WRITE_MCIND(R520_MC_AGP_BASE, agp_base_lo);
  115. R500_WRITE_MCIND(R520_MC_AGP_BASE_2, agp_base_hi);
  116. } else if ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RS480) {
  117. RADEON_WRITE(RADEON_AGP_BASE, agp_base_lo);
  118. RADEON_WRITE(RS480_AGP_BASE_2, 0);
  119. } else {
  120. RADEON_WRITE(RADEON_AGP_BASE, agp_base_lo);
  121. if ((dev_priv->flags & RADEON_FAMILY_MASK) >= CHIP_R200)
  122. RADEON_WRITE(RADEON_AGP_BASE_2, agp_base_hi);
  123. }
  124. }
  125. static int RADEON_READ_PLL(struct drm_device * dev, int addr)
  126. {
  127. drm_radeon_private_t *dev_priv = dev->dev_private;
  128. RADEON_WRITE8(RADEON_CLOCK_CNTL_INDEX, addr & 0x1f);
  129. return RADEON_READ(RADEON_CLOCK_CNTL_DATA);
  130. }
  131. static u32 RADEON_READ_PCIE(drm_radeon_private_t *dev_priv, int addr)
  132. {
  133. RADEON_WRITE8(RADEON_PCIE_INDEX, addr & 0xff);
  134. return RADEON_READ(RADEON_PCIE_DATA);
  135. }
  136. #if RADEON_FIFO_DEBUG
  137. static void radeon_status(drm_radeon_private_t * dev_priv)
  138. {
  139. printk("%s:\n", __func__);
  140. printk("RBBM_STATUS = 0x%08x\n",
  141. (unsigned int)RADEON_READ(RADEON_RBBM_STATUS));
  142. printk("CP_RB_RTPR = 0x%08x\n",
  143. (unsigned int)RADEON_READ(RADEON_CP_RB_RPTR));
  144. printk("CP_RB_WTPR = 0x%08x\n",
  145. (unsigned int)RADEON_READ(RADEON_CP_RB_WPTR));
  146. printk("AIC_CNTL = 0x%08x\n",
  147. (unsigned int)RADEON_READ(RADEON_AIC_CNTL));
  148. printk("AIC_STAT = 0x%08x\n",
  149. (unsigned int)RADEON_READ(RADEON_AIC_STAT));
  150. printk("AIC_PT_BASE = 0x%08x\n",
  151. (unsigned int)RADEON_READ(RADEON_AIC_PT_BASE));
  152. printk("TLB_ADDR = 0x%08x\n",
  153. (unsigned int)RADEON_READ(RADEON_AIC_TLB_ADDR));
  154. printk("TLB_DATA = 0x%08x\n",
  155. (unsigned int)RADEON_READ(RADEON_AIC_TLB_DATA));
  156. }
  157. #endif
  158. /* ================================================================
  159. * Engine, FIFO control
  160. */
  161. static int radeon_do_pixcache_flush(drm_radeon_private_t * dev_priv)
  162. {
  163. u32 tmp;
  164. int i;
  165. dev_priv->stats.boxes |= RADEON_BOX_WAIT_IDLE;
  166. if ((dev_priv->flags & RADEON_FAMILY_MASK) <= CHIP_RV280) {
  167. tmp = RADEON_READ(RADEON_RB3D_DSTCACHE_CTLSTAT);
  168. tmp |= RADEON_RB3D_DC_FLUSH_ALL;
  169. RADEON_WRITE(RADEON_RB3D_DSTCACHE_CTLSTAT, tmp);
  170. for (i = 0; i < dev_priv->usec_timeout; i++) {
  171. if (!(RADEON_READ(RADEON_RB3D_DSTCACHE_CTLSTAT)
  172. & RADEON_RB3D_DC_BUSY)) {
  173. return 0;
  174. }
  175. DRM_UDELAY(1);
  176. }
  177. } else {
  178. /* 3D */
  179. tmp = RADEON_READ(R300_RB3D_DSTCACHE_CTLSTAT);
  180. tmp |= RADEON_RB3D_DC_FLUSH_ALL;
  181. RADEON_WRITE(R300_RB3D_DSTCACHE_CTLSTAT, tmp);
  182. /* 2D */
  183. tmp = RADEON_READ(R300_DSTCACHE_CTLSTAT);
  184. tmp |= RADEON_RB3D_DC_FLUSH_ALL;
  185. RADEON_WRITE(R300_DSTCACHE_CTLSTAT, tmp);
  186. for (i = 0; i < dev_priv->usec_timeout; i++) {
  187. if (!(RADEON_READ(R300_DSTCACHE_CTLSTAT)
  188. & RADEON_RB3D_DC_BUSY)) {
  189. return 0;
  190. }
  191. DRM_UDELAY(1);
  192. }
  193. }
  194. #if RADEON_FIFO_DEBUG
  195. DRM_ERROR("failed!\n");
  196. radeon_status(dev_priv);
  197. #endif
  198. return -EBUSY;
  199. }
  200. static int radeon_do_wait_for_fifo(drm_radeon_private_t * dev_priv, int entries)
  201. {
  202. int i;
  203. dev_priv->stats.boxes |= RADEON_BOX_WAIT_IDLE;
  204. for (i = 0; i < dev_priv->usec_timeout; i++) {
  205. int slots = (RADEON_READ(RADEON_RBBM_STATUS)
  206. & RADEON_RBBM_FIFOCNT_MASK);
  207. if (slots >= entries)
  208. return 0;
  209. DRM_UDELAY(1);
  210. }
  211. #if RADEON_FIFO_DEBUG
  212. DRM_ERROR("failed!\n");
  213. radeon_status(dev_priv);
  214. #endif
  215. return -EBUSY;
  216. }
  217. static int radeon_do_wait_for_idle(drm_radeon_private_t * dev_priv)
  218. {
  219. int i, ret;
  220. dev_priv->stats.boxes |= RADEON_BOX_WAIT_IDLE;
  221. ret = radeon_do_wait_for_fifo(dev_priv, 64);
  222. if (ret)
  223. return ret;
  224. for (i = 0; i < dev_priv->usec_timeout; i++) {
  225. if (!(RADEON_READ(RADEON_RBBM_STATUS)
  226. & RADEON_RBBM_ACTIVE)) {
  227. radeon_do_pixcache_flush(dev_priv);
  228. return 0;
  229. }
  230. DRM_UDELAY(1);
  231. }
  232. #if RADEON_FIFO_DEBUG
  233. DRM_ERROR("failed!\n");
  234. radeon_status(dev_priv);
  235. #endif
  236. return -EBUSY;
  237. }
  238. static void radeon_init_pipes(drm_radeon_private_t *dev_priv)
  239. {
  240. uint32_t gb_tile_config, gb_pipe_sel = 0;
  241. /* RS4xx/RS6xx/R4xx/R5xx */
  242. if ((dev_priv->flags & RADEON_FAMILY_MASK) >= CHIP_R420) {
  243. gb_pipe_sel = RADEON_READ(R400_GB_PIPE_SELECT);
  244. dev_priv->num_gb_pipes = ((gb_pipe_sel >> 12) & 0x3) + 1;
  245. } else {
  246. /* R3xx */
  247. if (((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_R300) ||
  248. ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_R350)) {
  249. dev_priv->num_gb_pipes = 2;
  250. } else {
  251. /* R3Vxx */
  252. dev_priv->num_gb_pipes = 1;
  253. }
  254. }
  255. DRM_INFO("Num pipes: %d\n", dev_priv->num_gb_pipes);
  256. gb_tile_config = (R300_ENABLE_TILING | R300_TILE_SIZE_16 /*| R300_SUBPIXEL_1_16*/);
  257. switch (dev_priv->num_gb_pipes) {
  258. case 2: gb_tile_config |= R300_PIPE_COUNT_R300; break;
  259. case 3: gb_tile_config |= R300_PIPE_COUNT_R420_3P; break;
  260. case 4: gb_tile_config |= R300_PIPE_COUNT_R420; break;
  261. default:
  262. case 1: gb_tile_config |= R300_PIPE_COUNT_RV350; break;
  263. }
  264. if ((dev_priv->flags & RADEON_FAMILY_MASK) >= CHIP_RV515) {
  265. RADEON_WRITE_PLL(R500_DYN_SCLK_PWMEM_PIPE, (1 | ((gb_pipe_sel >> 8) & 0xf) << 4));
  266. RADEON_WRITE(R500_SU_REG_DEST, ((1 << dev_priv->num_gb_pipes) - 1));
  267. }
  268. RADEON_WRITE(R300_GB_TILE_CONFIG, gb_tile_config);
  269. radeon_do_wait_for_idle(dev_priv);
  270. RADEON_WRITE(R300_DST_PIPE_CONFIG, RADEON_READ(R300_DST_PIPE_CONFIG) | R300_PIPE_AUTO_CONFIG);
  271. RADEON_WRITE(R300_RB2D_DSTCACHE_MODE, (RADEON_READ(R300_RB2D_DSTCACHE_MODE) |
  272. R300_DC_AUTOFLUSH_ENABLE |
  273. R300_DC_DC_DISABLE_IGNORE_PE));
  274. }
  275. /* ================================================================
  276. * CP control, initialization
  277. */
  278. /* Load the microcode for the CP */
  279. static void radeon_cp_load_microcode(drm_radeon_private_t * dev_priv)
  280. {
  281. int i;
  282. DRM_DEBUG("\n");
  283. radeon_do_wait_for_idle(dev_priv);
  284. RADEON_WRITE(RADEON_CP_ME_RAM_ADDR, 0);
  285. if (((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_R100) ||
  286. ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RV100) ||
  287. ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RV200) ||
  288. ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RS100) ||
  289. ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RS200)) {
  290. DRM_INFO("Loading R100 Microcode\n");
  291. for (i = 0; i < 256; i++) {
  292. RADEON_WRITE(RADEON_CP_ME_RAM_DATAH,
  293. R100_cp_microcode[i][1]);
  294. RADEON_WRITE(RADEON_CP_ME_RAM_DATAL,
  295. R100_cp_microcode[i][0]);
  296. }
  297. } else if (((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_R200) ||
  298. ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RV250) ||
  299. ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RV280) ||
  300. ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RS300)) {
  301. DRM_INFO("Loading R200 Microcode\n");
  302. for (i = 0; i < 256; i++) {
  303. RADEON_WRITE(RADEON_CP_ME_RAM_DATAH,
  304. R200_cp_microcode[i][1]);
  305. RADEON_WRITE(RADEON_CP_ME_RAM_DATAL,
  306. R200_cp_microcode[i][0]);
  307. }
  308. } else if (((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_R300) ||
  309. ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_R350) ||
  310. ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RV350) ||
  311. ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RV380) ||
  312. ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RS480)) {
  313. DRM_INFO("Loading R300 Microcode\n");
  314. for (i = 0; i < 256; i++) {
  315. RADEON_WRITE(RADEON_CP_ME_RAM_DATAH,
  316. R300_cp_microcode[i][1]);
  317. RADEON_WRITE(RADEON_CP_ME_RAM_DATAL,
  318. R300_cp_microcode[i][0]);
  319. }
  320. } else if (((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_R420) ||
  321. ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RV410)) {
  322. DRM_INFO("Loading R400 Microcode\n");
  323. for (i = 0; i < 256; i++) {
  324. RADEON_WRITE(RADEON_CP_ME_RAM_DATAH,
  325. R420_cp_microcode[i][1]);
  326. RADEON_WRITE(RADEON_CP_ME_RAM_DATAL,
  327. R420_cp_microcode[i][0]);
  328. }
  329. } else if ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RS690) {
  330. DRM_INFO("Loading RS690 Microcode\n");
  331. for (i = 0; i < 256; i++) {
  332. RADEON_WRITE(RADEON_CP_ME_RAM_DATAH,
  333. RS690_cp_microcode[i][1]);
  334. RADEON_WRITE(RADEON_CP_ME_RAM_DATAL,
  335. RS690_cp_microcode[i][0]);
  336. }
  337. } else if (((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RV515) ||
  338. ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_R520) ||
  339. ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RV530) ||
  340. ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_R580) ||
  341. ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RV560) ||
  342. ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RV570)) {
  343. DRM_INFO("Loading R500 Microcode\n");
  344. for (i = 0; i < 256; i++) {
  345. RADEON_WRITE(RADEON_CP_ME_RAM_DATAH,
  346. R520_cp_microcode[i][1]);
  347. RADEON_WRITE(RADEON_CP_ME_RAM_DATAL,
  348. R520_cp_microcode[i][0]);
  349. }
  350. }
  351. }
  352. /* Flush any pending commands to the CP. This should only be used just
  353. * prior to a wait for idle, as it informs the engine that the command
  354. * stream is ending.
  355. */
  356. static void radeon_do_cp_flush(drm_radeon_private_t * dev_priv)
  357. {
  358. DRM_DEBUG("\n");
  359. #if 0
  360. u32 tmp;
  361. tmp = RADEON_READ(RADEON_CP_RB_WPTR) | (1 << 31);
  362. RADEON_WRITE(RADEON_CP_RB_WPTR, tmp);
  363. #endif
  364. }
  365. /* Wait for the CP to go idle.
  366. */
  367. int radeon_do_cp_idle(drm_radeon_private_t * dev_priv)
  368. {
  369. RING_LOCALS;
  370. DRM_DEBUG("\n");
  371. BEGIN_RING(6);
  372. RADEON_PURGE_CACHE();
  373. RADEON_PURGE_ZCACHE();
  374. RADEON_WAIT_UNTIL_IDLE();
  375. ADVANCE_RING();
  376. COMMIT_RING();
  377. return radeon_do_wait_for_idle(dev_priv);
  378. }
  379. /* Start the Command Processor.
  380. */
  381. static void radeon_do_cp_start(drm_radeon_private_t * dev_priv)
  382. {
  383. RING_LOCALS;
  384. DRM_DEBUG("\n");
  385. radeon_do_wait_for_idle(dev_priv);
  386. RADEON_WRITE(RADEON_CP_CSQ_CNTL, dev_priv->cp_mode);
  387. dev_priv->cp_running = 1;
  388. BEGIN_RING(6);
  389. RADEON_PURGE_CACHE();
  390. RADEON_PURGE_ZCACHE();
  391. RADEON_WAIT_UNTIL_IDLE();
  392. ADVANCE_RING();
  393. COMMIT_RING();
  394. }
  395. /* Reset the Command Processor. This will not flush any pending
  396. * commands, so you must wait for the CP command stream to complete
  397. * before calling this routine.
  398. */
  399. static void radeon_do_cp_reset(drm_radeon_private_t * dev_priv)
  400. {
  401. u32 cur_read_ptr;
  402. DRM_DEBUG("\n");
  403. cur_read_ptr = RADEON_READ(RADEON_CP_RB_RPTR);
  404. RADEON_WRITE(RADEON_CP_RB_WPTR, cur_read_ptr);
  405. SET_RING_HEAD(dev_priv, cur_read_ptr);
  406. dev_priv->ring.tail = cur_read_ptr;
  407. }
  408. /* Stop the Command Processor. This will not flush any pending
  409. * commands, so you must flush the command stream and wait for the CP
  410. * to go idle before calling this routine.
  411. */
  412. static void radeon_do_cp_stop(drm_radeon_private_t * dev_priv)
  413. {
  414. DRM_DEBUG("\n");
  415. RADEON_WRITE(RADEON_CP_CSQ_CNTL, RADEON_CSQ_PRIDIS_INDDIS);
  416. dev_priv->cp_running = 0;
  417. }
  418. /* Reset the engine. This will stop the CP if it is running.
  419. */
  420. static int radeon_do_engine_reset(struct drm_device * dev)
  421. {
  422. drm_radeon_private_t *dev_priv = dev->dev_private;
  423. u32 clock_cntl_index = 0, mclk_cntl = 0, rbbm_soft_reset;
  424. DRM_DEBUG("\n");
  425. radeon_do_pixcache_flush(dev_priv);
  426. if ((dev_priv->flags & RADEON_FAMILY_MASK) <= CHIP_RV410) {
  427. /* may need something similar for newer chips */
  428. clock_cntl_index = RADEON_READ(RADEON_CLOCK_CNTL_INDEX);
  429. mclk_cntl = RADEON_READ_PLL(dev, RADEON_MCLK_CNTL);
  430. RADEON_WRITE_PLL(RADEON_MCLK_CNTL, (mclk_cntl |
  431. RADEON_FORCEON_MCLKA |
  432. RADEON_FORCEON_MCLKB |
  433. RADEON_FORCEON_YCLKA |
  434. RADEON_FORCEON_YCLKB |
  435. RADEON_FORCEON_MC |
  436. RADEON_FORCEON_AIC));
  437. }
  438. rbbm_soft_reset = RADEON_READ(RADEON_RBBM_SOFT_RESET);
  439. RADEON_WRITE(RADEON_RBBM_SOFT_RESET, (rbbm_soft_reset |
  440. RADEON_SOFT_RESET_CP |
  441. RADEON_SOFT_RESET_HI |
  442. RADEON_SOFT_RESET_SE |
  443. RADEON_SOFT_RESET_RE |
  444. RADEON_SOFT_RESET_PP |
  445. RADEON_SOFT_RESET_E2 |
  446. RADEON_SOFT_RESET_RB));
  447. RADEON_READ(RADEON_RBBM_SOFT_RESET);
  448. RADEON_WRITE(RADEON_RBBM_SOFT_RESET, (rbbm_soft_reset &
  449. ~(RADEON_SOFT_RESET_CP |
  450. RADEON_SOFT_RESET_HI |
  451. RADEON_SOFT_RESET_SE |
  452. RADEON_SOFT_RESET_RE |
  453. RADEON_SOFT_RESET_PP |
  454. RADEON_SOFT_RESET_E2 |
  455. RADEON_SOFT_RESET_RB)));
  456. RADEON_READ(RADEON_RBBM_SOFT_RESET);
  457. if ((dev_priv->flags & RADEON_FAMILY_MASK) <= CHIP_RV410) {
  458. RADEON_WRITE_PLL(RADEON_MCLK_CNTL, mclk_cntl);
  459. RADEON_WRITE(RADEON_CLOCK_CNTL_INDEX, clock_cntl_index);
  460. RADEON_WRITE(RADEON_RBBM_SOFT_RESET, rbbm_soft_reset);
  461. }
  462. /* setup the raster pipes */
  463. if ((dev_priv->flags & RADEON_FAMILY_MASK) >= CHIP_R300)
  464. radeon_init_pipes(dev_priv);
  465. /* Reset the CP ring */
  466. radeon_do_cp_reset(dev_priv);
  467. /* The CP is no longer running after an engine reset */
  468. dev_priv->cp_running = 0;
  469. /* Reset any pending vertex, indirect buffers */
  470. radeon_freelist_reset(dev);
  471. return 0;
  472. }
  473. static void radeon_cp_init_ring_buffer(struct drm_device * dev,
  474. drm_radeon_private_t * dev_priv)
  475. {
  476. u32 ring_start, cur_read_ptr;
  477. u32 tmp;
  478. /* Initialize the memory controller. With new memory map, the fb location
  479. * is not changed, it should have been properly initialized already. Part
  480. * of the problem is that the code below is bogus, assuming the GART is
  481. * always appended to the fb which is not necessarily the case
  482. */
  483. if (!dev_priv->new_memmap)
  484. radeon_write_fb_location(dev_priv,
  485. ((dev_priv->gart_vm_start - 1) & 0xffff0000)
  486. | (dev_priv->fb_location >> 16));
  487. #if __OS_HAS_AGP
  488. if (dev_priv->flags & RADEON_IS_AGP) {
  489. radeon_write_agp_base(dev_priv, dev->agp->base);
  490. radeon_write_agp_location(dev_priv,
  491. (((dev_priv->gart_vm_start - 1 +
  492. dev_priv->gart_size) & 0xffff0000) |
  493. (dev_priv->gart_vm_start >> 16)));
  494. ring_start = (dev_priv->cp_ring->offset
  495. - dev->agp->base
  496. + dev_priv->gart_vm_start);
  497. } else
  498. #endif
  499. ring_start = (dev_priv->cp_ring->offset
  500. - (unsigned long)dev->sg->virtual
  501. + dev_priv->gart_vm_start);
  502. RADEON_WRITE(RADEON_CP_RB_BASE, ring_start);
  503. /* Set the write pointer delay */
  504. RADEON_WRITE(RADEON_CP_RB_WPTR_DELAY, 0);
  505. /* Initialize the ring buffer's read and write pointers */
  506. cur_read_ptr = RADEON_READ(RADEON_CP_RB_RPTR);
  507. RADEON_WRITE(RADEON_CP_RB_WPTR, cur_read_ptr);
  508. SET_RING_HEAD(dev_priv, cur_read_ptr);
  509. dev_priv->ring.tail = cur_read_ptr;
  510. #if __OS_HAS_AGP
  511. if (dev_priv->flags & RADEON_IS_AGP) {
  512. RADEON_WRITE(RADEON_CP_RB_RPTR_ADDR,
  513. dev_priv->ring_rptr->offset
  514. - dev->agp->base + dev_priv->gart_vm_start);
  515. } else
  516. #endif
  517. {
  518. struct drm_sg_mem *entry = dev->sg;
  519. unsigned long tmp_ofs, page_ofs;
  520. tmp_ofs = dev_priv->ring_rptr->offset -
  521. (unsigned long)dev->sg->virtual;
  522. page_ofs = tmp_ofs >> PAGE_SHIFT;
  523. RADEON_WRITE(RADEON_CP_RB_RPTR_ADDR, entry->busaddr[page_ofs]);
  524. DRM_DEBUG("ring rptr: offset=0x%08lx handle=0x%08lx\n",
  525. (unsigned long)entry->busaddr[page_ofs],
  526. entry->handle + tmp_ofs);
  527. }
  528. /* Set ring buffer size */
  529. #ifdef __BIG_ENDIAN
  530. RADEON_WRITE(RADEON_CP_RB_CNTL,
  531. RADEON_BUF_SWAP_32BIT |
  532. (dev_priv->ring.fetch_size_l2ow << 18) |
  533. (dev_priv->ring.rptr_update_l2qw << 8) |
  534. dev_priv->ring.size_l2qw);
  535. #else
  536. RADEON_WRITE(RADEON_CP_RB_CNTL,
  537. (dev_priv->ring.fetch_size_l2ow << 18) |
  538. (dev_priv->ring.rptr_update_l2qw << 8) |
  539. dev_priv->ring.size_l2qw);
  540. #endif
  541. /* Start with assuming that writeback doesn't work */
  542. dev_priv->writeback_works = 0;
  543. /* Initialize the scratch register pointer. This will cause
  544. * the scratch register values to be written out to memory
  545. * whenever they are updated.
  546. *
  547. * We simply put this behind the ring read pointer, this works
  548. * with PCI GART as well as (whatever kind of) AGP GART
  549. */
  550. RADEON_WRITE(RADEON_SCRATCH_ADDR, RADEON_READ(RADEON_CP_RB_RPTR_ADDR)
  551. + RADEON_SCRATCH_REG_OFFSET);
  552. dev_priv->scratch = ((__volatile__ u32 *)
  553. dev_priv->ring_rptr->handle +
  554. (RADEON_SCRATCH_REG_OFFSET / sizeof(u32)));
  555. RADEON_WRITE(RADEON_SCRATCH_UMSK, 0x7);
  556. /* Turn on bus mastering */
  557. tmp = RADEON_READ(RADEON_BUS_CNTL) & ~RADEON_BUS_MASTER_DIS;
  558. RADEON_WRITE(RADEON_BUS_CNTL, tmp);
  559. dev_priv->sarea_priv->last_frame = dev_priv->scratch[0] = 0;
  560. RADEON_WRITE(RADEON_LAST_FRAME_REG, dev_priv->sarea_priv->last_frame);
  561. dev_priv->sarea_priv->last_dispatch = dev_priv->scratch[1] = 0;
  562. RADEON_WRITE(RADEON_LAST_DISPATCH_REG,
  563. dev_priv->sarea_priv->last_dispatch);
  564. dev_priv->sarea_priv->last_clear = dev_priv->scratch[2] = 0;
  565. RADEON_WRITE(RADEON_LAST_CLEAR_REG, dev_priv->sarea_priv->last_clear);
  566. radeon_do_wait_for_idle(dev_priv);
  567. /* Sync everything up */
  568. RADEON_WRITE(RADEON_ISYNC_CNTL,
  569. (RADEON_ISYNC_ANY2D_IDLE3D |
  570. RADEON_ISYNC_ANY3D_IDLE2D |
  571. RADEON_ISYNC_WAIT_IDLEGUI |
  572. RADEON_ISYNC_CPSCRATCH_IDLEGUI));
  573. }
  574. static void radeon_test_writeback(drm_radeon_private_t * dev_priv)
  575. {
  576. u32 tmp;
  577. /* Writeback doesn't seem to work everywhere, test it here and possibly
  578. * enable it if it appears to work
  579. */
  580. DRM_WRITE32(dev_priv->ring_rptr, RADEON_SCRATCHOFF(1), 0);
  581. RADEON_WRITE(RADEON_SCRATCH_REG1, 0xdeadbeef);
  582. for (tmp = 0; tmp < dev_priv->usec_timeout; tmp++) {
  583. if (DRM_READ32(dev_priv->ring_rptr, RADEON_SCRATCHOFF(1)) ==
  584. 0xdeadbeef)
  585. break;
  586. DRM_UDELAY(1);
  587. }
  588. if (tmp < dev_priv->usec_timeout) {
  589. dev_priv->writeback_works = 1;
  590. DRM_INFO("writeback test succeeded in %d usecs\n", tmp);
  591. } else {
  592. dev_priv->writeback_works = 0;
  593. DRM_INFO("writeback test failed\n");
  594. }
  595. if (radeon_no_wb == 1) {
  596. dev_priv->writeback_works = 0;
  597. DRM_INFO("writeback forced off\n");
  598. }
  599. if (!dev_priv->writeback_works) {
  600. /* Disable writeback to avoid unnecessary bus master transfer */
  601. RADEON_WRITE(RADEON_CP_RB_CNTL, RADEON_READ(RADEON_CP_RB_CNTL) |
  602. RADEON_RB_NO_UPDATE);
  603. RADEON_WRITE(RADEON_SCRATCH_UMSK, 0);
  604. }
  605. }
  606. /* Enable or disable IGP GART on the chip */
  607. static void radeon_set_igpgart(drm_radeon_private_t * dev_priv, int on)
  608. {
  609. u32 temp;
  610. if (on) {
  611. DRM_DEBUG("programming igp gart %08X %08lX %08X\n",
  612. dev_priv->gart_vm_start,
  613. (long)dev_priv->gart_info.bus_addr,
  614. dev_priv->gart_size);
  615. temp = IGP_READ_MCIND(dev_priv, RS480_MC_MISC_CNTL);
  616. if ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RS690)
  617. IGP_WRITE_MCIND(RS480_MC_MISC_CNTL, (RS480_GART_INDEX_REG_EN |
  618. RS690_BLOCK_GFX_D3_EN));
  619. else
  620. IGP_WRITE_MCIND(RS480_MC_MISC_CNTL, RS480_GART_INDEX_REG_EN);
  621. IGP_WRITE_MCIND(RS480_AGP_ADDRESS_SPACE_SIZE, (RS480_GART_EN |
  622. RS480_VA_SIZE_32MB));
  623. temp = IGP_READ_MCIND(dev_priv, RS480_GART_FEATURE_ID);
  624. IGP_WRITE_MCIND(RS480_GART_FEATURE_ID, (RS480_HANG_EN |
  625. RS480_TLB_ENABLE |
  626. RS480_GTW_LAC_EN |
  627. RS480_1LEVEL_GART));
  628. temp = dev_priv->gart_info.bus_addr & 0xfffff000;
  629. temp |= (upper_32_bits(dev_priv->gart_info.bus_addr) & 0xff) << 4;
  630. IGP_WRITE_MCIND(RS480_GART_BASE, temp);
  631. temp = IGP_READ_MCIND(dev_priv, RS480_AGP_MODE_CNTL);
  632. IGP_WRITE_MCIND(RS480_AGP_MODE_CNTL, ((1 << RS480_REQ_TYPE_SNOOP_SHIFT) |
  633. RS480_REQ_TYPE_SNOOP_DIS));
  634. radeon_write_agp_base(dev_priv, dev_priv->gart_vm_start);
  635. dev_priv->gart_size = 32*1024*1024;
  636. temp = (((dev_priv->gart_vm_start - 1 + dev_priv->gart_size) &
  637. 0xffff0000) | (dev_priv->gart_vm_start >> 16));
  638. radeon_write_agp_location(dev_priv, temp);
  639. temp = IGP_READ_MCIND(dev_priv, RS480_AGP_ADDRESS_SPACE_SIZE);
  640. IGP_WRITE_MCIND(RS480_AGP_ADDRESS_SPACE_SIZE, (RS480_GART_EN |
  641. RS480_VA_SIZE_32MB));
  642. do {
  643. temp = IGP_READ_MCIND(dev_priv, RS480_GART_CACHE_CNTRL);
  644. if ((temp & RS480_GART_CACHE_INVALIDATE) == 0)
  645. break;
  646. DRM_UDELAY(1);
  647. } while (1);
  648. IGP_WRITE_MCIND(RS480_GART_CACHE_CNTRL,
  649. RS480_GART_CACHE_INVALIDATE);
  650. do {
  651. temp = IGP_READ_MCIND(dev_priv, RS480_GART_CACHE_CNTRL);
  652. if ((temp & RS480_GART_CACHE_INVALIDATE) == 0)
  653. break;
  654. DRM_UDELAY(1);
  655. } while (1);
  656. IGP_WRITE_MCIND(RS480_GART_CACHE_CNTRL, 0);
  657. } else {
  658. IGP_WRITE_MCIND(RS480_AGP_ADDRESS_SPACE_SIZE, 0);
  659. }
  660. }
  661. static void radeon_set_pciegart(drm_radeon_private_t * dev_priv, int on)
  662. {
  663. u32 tmp = RADEON_READ_PCIE(dev_priv, RADEON_PCIE_TX_GART_CNTL);
  664. if (on) {
  665. DRM_DEBUG("programming pcie %08X %08lX %08X\n",
  666. dev_priv->gart_vm_start,
  667. (long)dev_priv->gart_info.bus_addr,
  668. dev_priv->gart_size);
  669. RADEON_WRITE_PCIE(RADEON_PCIE_TX_DISCARD_RD_ADDR_LO,
  670. dev_priv->gart_vm_start);
  671. RADEON_WRITE_PCIE(RADEON_PCIE_TX_GART_BASE,
  672. dev_priv->gart_info.bus_addr);
  673. RADEON_WRITE_PCIE(RADEON_PCIE_TX_GART_START_LO,
  674. dev_priv->gart_vm_start);
  675. RADEON_WRITE_PCIE(RADEON_PCIE_TX_GART_END_LO,
  676. dev_priv->gart_vm_start +
  677. dev_priv->gart_size - 1);
  678. radeon_write_agp_location(dev_priv, 0xffffffc0); /* ?? */
  679. RADEON_WRITE_PCIE(RADEON_PCIE_TX_GART_CNTL,
  680. RADEON_PCIE_TX_GART_EN);
  681. } else {
  682. RADEON_WRITE_PCIE(RADEON_PCIE_TX_GART_CNTL,
  683. tmp & ~RADEON_PCIE_TX_GART_EN);
  684. }
  685. }
  686. /* Enable or disable PCI GART on the chip */
  687. static void radeon_set_pcigart(drm_radeon_private_t * dev_priv, int on)
  688. {
  689. u32 tmp;
  690. if (((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RS690) ||
  691. (dev_priv->flags & RADEON_IS_IGPGART)) {
  692. radeon_set_igpgart(dev_priv, on);
  693. return;
  694. }
  695. if (dev_priv->flags & RADEON_IS_PCIE) {
  696. radeon_set_pciegart(dev_priv, on);
  697. return;
  698. }
  699. tmp = RADEON_READ(RADEON_AIC_CNTL);
  700. if (on) {
  701. RADEON_WRITE(RADEON_AIC_CNTL,
  702. tmp | RADEON_PCIGART_TRANSLATE_EN);
  703. /* set PCI GART page-table base address
  704. */
  705. RADEON_WRITE(RADEON_AIC_PT_BASE, dev_priv->gart_info.bus_addr);
  706. /* set address range for PCI address translate
  707. */
  708. RADEON_WRITE(RADEON_AIC_LO_ADDR, dev_priv->gart_vm_start);
  709. RADEON_WRITE(RADEON_AIC_HI_ADDR, dev_priv->gart_vm_start
  710. + dev_priv->gart_size - 1);
  711. /* Turn off AGP aperture -- is this required for PCI GART?
  712. */
  713. radeon_write_agp_location(dev_priv, 0xffffffc0);
  714. RADEON_WRITE(RADEON_AGP_COMMAND, 0); /* clear AGP_COMMAND */
  715. } else {
  716. RADEON_WRITE(RADEON_AIC_CNTL,
  717. tmp & ~RADEON_PCIGART_TRANSLATE_EN);
  718. }
  719. }
  720. static int radeon_do_init_cp(struct drm_device * dev, drm_radeon_init_t * init)
  721. {
  722. drm_radeon_private_t *dev_priv = dev->dev_private;
  723. DRM_DEBUG("\n");
  724. /* if we require new memory map but we don't have it fail */
  725. if ((dev_priv->flags & RADEON_NEW_MEMMAP) && !dev_priv->new_memmap) {
  726. DRM_ERROR("Cannot initialise DRM on this card\nThis card requires a new X.org DDX for 3D\n");
  727. radeon_do_cleanup_cp(dev);
  728. return -EINVAL;
  729. }
  730. if (init->is_pci && (dev_priv->flags & RADEON_IS_AGP)) {
  731. DRM_DEBUG("Forcing AGP card to PCI mode\n");
  732. dev_priv->flags &= ~RADEON_IS_AGP;
  733. } else if (!(dev_priv->flags & (RADEON_IS_AGP | RADEON_IS_PCI | RADEON_IS_PCIE))
  734. && !init->is_pci) {
  735. DRM_DEBUG("Restoring AGP flag\n");
  736. dev_priv->flags |= RADEON_IS_AGP;
  737. }
  738. if ((!(dev_priv->flags & RADEON_IS_AGP)) && !dev->sg) {
  739. DRM_ERROR("PCI GART memory not allocated!\n");
  740. radeon_do_cleanup_cp(dev);
  741. return -EINVAL;
  742. }
  743. dev_priv->usec_timeout = init->usec_timeout;
  744. if (dev_priv->usec_timeout < 1 ||
  745. dev_priv->usec_timeout > RADEON_MAX_USEC_TIMEOUT) {
  746. DRM_DEBUG("TIMEOUT problem!\n");
  747. radeon_do_cleanup_cp(dev);
  748. return -EINVAL;
  749. }
  750. /* Enable vblank on CRTC1 for older X servers
  751. */
  752. dev_priv->vblank_crtc = DRM_RADEON_VBLANK_CRTC1;
  753. switch(init->func) {
  754. case RADEON_INIT_R200_CP:
  755. dev_priv->microcode_version = UCODE_R200;
  756. break;
  757. case RADEON_INIT_R300_CP:
  758. dev_priv->microcode_version = UCODE_R300;
  759. break;
  760. default:
  761. dev_priv->microcode_version = UCODE_R100;
  762. }
  763. dev_priv->do_boxes = 0;
  764. dev_priv->cp_mode = init->cp_mode;
  765. /* We don't support anything other than bus-mastering ring mode,
  766. * but the ring can be in either AGP or PCI space for the ring
  767. * read pointer.
  768. */
  769. if ((init->cp_mode != RADEON_CSQ_PRIBM_INDDIS) &&
  770. (init->cp_mode != RADEON_CSQ_PRIBM_INDBM)) {
  771. DRM_DEBUG("BAD cp_mode (%x)!\n", init->cp_mode);
  772. radeon_do_cleanup_cp(dev);
  773. return -EINVAL;
  774. }
  775. switch (init->fb_bpp) {
  776. case 16:
  777. dev_priv->color_fmt = RADEON_COLOR_FORMAT_RGB565;
  778. break;
  779. case 32:
  780. default:
  781. dev_priv->color_fmt = RADEON_COLOR_FORMAT_ARGB8888;
  782. break;
  783. }
  784. dev_priv->front_offset = init->front_offset;
  785. dev_priv->front_pitch = init->front_pitch;
  786. dev_priv->back_offset = init->back_offset;
  787. dev_priv->back_pitch = init->back_pitch;
  788. switch (init->depth_bpp) {
  789. case 16:
  790. dev_priv->depth_fmt = RADEON_DEPTH_FORMAT_16BIT_INT_Z;
  791. break;
  792. case 32:
  793. default:
  794. dev_priv->depth_fmt = RADEON_DEPTH_FORMAT_24BIT_INT_Z;
  795. break;
  796. }
  797. dev_priv->depth_offset = init->depth_offset;
  798. dev_priv->depth_pitch = init->depth_pitch;
  799. /* Hardware state for depth clears. Remove this if/when we no
  800. * longer clear the depth buffer with a 3D rectangle. Hard-code
  801. * all values to prevent unwanted 3D state from slipping through
  802. * and screwing with the clear operation.
  803. */
  804. dev_priv->depth_clear.rb3d_cntl = (RADEON_PLANE_MASK_ENABLE |
  805. (dev_priv->color_fmt << 10) |
  806. (dev_priv->microcode_version ==
  807. UCODE_R100 ? RADEON_ZBLOCK16 : 0));
  808. dev_priv->depth_clear.rb3d_zstencilcntl =
  809. (dev_priv->depth_fmt |
  810. RADEON_Z_TEST_ALWAYS |
  811. RADEON_STENCIL_TEST_ALWAYS |
  812. RADEON_STENCIL_S_FAIL_REPLACE |
  813. RADEON_STENCIL_ZPASS_REPLACE |
  814. RADEON_STENCIL_ZFAIL_REPLACE | RADEON_Z_WRITE_ENABLE);
  815. dev_priv->depth_clear.se_cntl = (RADEON_FFACE_CULL_CW |
  816. RADEON_BFACE_SOLID |
  817. RADEON_FFACE_SOLID |
  818. RADEON_FLAT_SHADE_VTX_LAST |
  819. RADEON_DIFFUSE_SHADE_FLAT |
  820. RADEON_ALPHA_SHADE_FLAT |
  821. RADEON_SPECULAR_SHADE_FLAT |
  822. RADEON_FOG_SHADE_FLAT |
  823. RADEON_VTX_PIX_CENTER_OGL |
  824. RADEON_ROUND_MODE_TRUNC |
  825. RADEON_ROUND_PREC_8TH_PIX);
  826. dev_priv->ring_offset = init->ring_offset;
  827. dev_priv->ring_rptr_offset = init->ring_rptr_offset;
  828. dev_priv->buffers_offset = init->buffers_offset;
  829. dev_priv->gart_textures_offset = init->gart_textures_offset;
  830. dev_priv->sarea = drm_getsarea(dev);
  831. if (!dev_priv->sarea) {
  832. DRM_ERROR("could not find sarea!\n");
  833. radeon_do_cleanup_cp(dev);
  834. return -EINVAL;
  835. }
  836. dev_priv->cp_ring = drm_core_findmap(dev, init->ring_offset);
  837. if (!dev_priv->cp_ring) {
  838. DRM_ERROR("could not find cp ring region!\n");
  839. radeon_do_cleanup_cp(dev);
  840. return -EINVAL;
  841. }
  842. dev_priv->ring_rptr = drm_core_findmap(dev, init->ring_rptr_offset);
  843. if (!dev_priv->ring_rptr) {
  844. DRM_ERROR("could not find ring read pointer!\n");
  845. radeon_do_cleanup_cp(dev);
  846. return -EINVAL;
  847. }
  848. dev->agp_buffer_token = init->buffers_offset;
  849. dev->agp_buffer_map = drm_core_findmap(dev, init->buffers_offset);
  850. if (!dev->agp_buffer_map) {
  851. DRM_ERROR("could not find dma buffer region!\n");
  852. radeon_do_cleanup_cp(dev);
  853. return -EINVAL;
  854. }
  855. if (init->gart_textures_offset) {
  856. dev_priv->gart_textures =
  857. drm_core_findmap(dev, init->gart_textures_offset);
  858. if (!dev_priv->gart_textures) {
  859. DRM_ERROR("could not find GART texture region!\n");
  860. radeon_do_cleanup_cp(dev);
  861. return -EINVAL;
  862. }
  863. }
  864. dev_priv->sarea_priv =
  865. (drm_radeon_sarea_t *) ((u8 *) dev_priv->sarea->handle +
  866. init->sarea_priv_offset);
  867. #if __OS_HAS_AGP
  868. if (dev_priv->flags & RADEON_IS_AGP) {
  869. drm_core_ioremap(dev_priv->cp_ring, dev);
  870. drm_core_ioremap(dev_priv->ring_rptr, dev);
  871. drm_core_ioremap(dev->agp_buffer_map, dev);
  872. if (!dev_priv->cp_ring->handle ||
  873. !dev_priv->ring_rptr->handle ||
  874. !dev->agp_buffer_map->handle) {
  875. DRM_ERROR("could not find ioremap agp regions!\n");
  876. radeon_do_cleanup_cp(dev);
  877. return -EINVAL;
  878. }
  879. } else
  880. #endif
  881. {
  882. dev_priv->cp_ring->handle = (void *)dev_priv->cp_ring->offset;
  883. dev_priv->ring_rptr->handle =
  884. (void *)dev_priv->ring_rptr->offset;
  885. dev->agp_buffer_map->handle =
  886. (void *)dev->agp_buffer_map->offset;
  887. DRM_DEBUG("dev_priv->cp_ring->handle %p\n",
  888. dev_priv->cp_ring->handle);
  889. DRM_DEBUG("dev_priv->ring_rptr->handle %p\n",
  890. dev_priv->ring_rptr->handle);
  891. DRM_DEBUG("dev->agp_buffer_map->handle %p\n",
  892. dev->agp_buffer_map->handle);
  893. }
  894. dev_priv->fb_location = (radeon_read_fb_location(dev_priv) & 0xffff) << 16;
  895. dev_priv->fb_size =
  896. ((radeon_read_fb_location(dev_priv) & 0xffff0000u) + 0x10000)
  897. - dev_priv->fb_location;
  898. dev_priv->front_pitch_offset = (((dev_priv->front_pitch / 64) << 22) |
  899. ((dev_priv->front_offset
  900. + dev_priv->fb_location) >> 10));
  901. dev_priv->back_pitch_offset = (((dev_priv->back_pitch / 64) << 22) |
  902. ((dev_priv->back_offset
  903. + dev_priv->fb_location) >> 10));
  904. dev_priv->depth_pitch_offset = (((dev_priv->depth_pitch / 64) << 22) |
  905. ((dev_priv->depth_offset
  906. + dev_priv->fb_location) >> 10));
  907. dev_priv->gart_size = init->gart_size;
  908. /* New let's set the memory map ... */
  909. if (dev_priv->new_memmap) {
  910. u32 base = 0;
  911. DRM_INFO("Setting GART location based on new memory map\n");
  912. /* If using AGP, try to locate the AGP aperture at the same
  913. * location in the card and on the bus, though we have to
  914. * align it down.
  915. */
  916. #if __OS_HAS_AGP
  917. if (dev_priv->flags & RADEON_IS_AGP) {
  918. base = dev->agp->base;
  919. /* Check if valid */
  920. if ((base + dev_priv->gart_size - 1) >= dev_priv->fb_location &&
  921. base < (dev_priv->fb_location + dev_priv->fb_size - 1)) {
  922. DRM_INFO("Can't use AGP base @0x%08lx, won't fit\n",
  923. dev->agp->base);
  924. base = 0;
  925. }
  926. }
  927. #endif
  928. /* If not or if AGP is at 0 (Macs), try to put it elsewhere */
  929. if (base == 0) {
  930. base = dev_priv->fb_location + dev_priv->fb_size;
  931. if (base < dev_priv->fb_location ||
  932. ((base + dev_priv->gart_size) & 0xfffffffful) < base)
  933. base = dev_priv->fb_location
  934. - dev_priv->gart_size;
  935. }
  936. dev_priv->gart_vm_start = base & 0xffc00000u;
  937. if (dev_priv->gart_vm_start != base)
  938. DRM_INFO("GART aligned down from 0x%08x to 0x%08x\n",
  939. base, dev_priv->gart_vm_start);
  940. } else {
  941. DRM_INFO("Setting GART location based on old memory map\n");
  942. dev_priv->gart_vm_start = dev_priv->fb_location +
  943. RADEON_READ(RADEON_CONFIG_APER_SIZE);
  944. }
  945. #if __OS_HAS_AGP
  946. if (dev_priv->flags & RADEON_IS_AGP)
  947. dev_priv->gart_buffers_offset = (dev->agp_buffer_map->offset
  948. - dev->agp->base
  949. + dev_priv->gart_vm_start);
  950. else
  951. #endif
  952. dev_priv->gart_buffers_offset = (dev->agp_buffer_map->offset
  953. - (unsigned long)dev->sg->virtual
  954. + dev_priv->gart_vm_start);
  955. DRM_DEBUG("dev_priv->gart_size %d\n", dev_priv->gart_size);
  956. DRM_DEBUG("dev_priv->gart_vm_start 0x%x\n", dev_priv->gart_vm_start);
  957. DRM_DEBUG("dev_priv->gart_buffers_offset 0x%lx\n",
  958. dev_priv->gart_buffers_offset);
  959. dev_priv->ring.start = (u32 *) dev_priv->cp_ring->handle;
  960. dev_priv->ring.end = ((u32 *) dev_priv->cp_ring->handle
  961. + init->ring_size / sizeof(u32));
  962. dev_priv->ring.size = init->ring_size;
  963. dev_priv->ring.size_l2qw = drm_order(init->ring_size / 8);
  964. dev_priv->ring.rptr_update = /* init->rptr_update */ 4096;
  965. dev_priv->ring.rptr_update_l2qw = drm_order( /* init->rptr_update */ 4096 / 8);
  966. dev_priv->ring.fetch_size = /* init->fetch_size */ 32;
  967. dev_priv->ring.fetch_size_l2ow = drm_order( /* init->fetch_size */ 32 / 16);
  968. dev_priv->ring.tail_mask = (dev_priv->ring.size / sizeof(u32)) - 1;
  969. dev_priv->ring.high_mark = RADEON_RING_HIGH_MARK;
  970. #if __OS_HAS_AGP
  971. if (dev_priv->flags & RADEON_IS_AGP) {
  972. /* Turn off PCI GART */
  973. radeon_set_pcigart(dev_priv, 0);
  974. } else
  975. #endif
  976. {
  977. dev_priv->gart_info.table_mask = DMA_BIT_MASK(32);
  978. /* if we have an offset set from userspace */
  979. if (dev_priv->pcigart_offset_set) {
  980. dev_priv->gart_info.bus_addr =
  981. dev_priv->pcigart_offset + dev_priv->fb_location;
  982. dev_priv->gart_info.mapping.offset =
  983. dev_priv->pcigart_offset + dev_priv->fb_aper_offset;
  984. dev_priv->gart_info.mapping.size =
  985. dev_priv->gart_info.table_size;
  986. drm_core_ioremap(&dev_priv->gart_info.mapping, dev);
  987. dev_priv->gart_info.addr =
  988. dev_priv->gart_info.mapping.handle;
  989. if (dev_priv->flags & RADEON_IS_PCIE)
  990. dev_priv->gart_info.gart_reg_if = DRM_ATI_GART_PCIE;
  991. else
  992. dev_priv->gart_info.gart_reg_if = DRM_ATI_GART_PCI;
  993. dev_priv->gart_info.gart_table_location =
  994. DRM_ATI_GART_FB;
  995. DRM_DEBUG("Setting phys_pci_gart to %p %08lX\n",
  996. dev_priv->gart_info.addr,
  997. dev_priv->pcigart_offset);
  998. } else {
  999. if (dev_priv->flags & RADEON_IS_IGPGART)
  1000. dev_priv->gart_info.gart_reg_if = DRM_ATI_GART_IGP;
  1001. else
  1002. dev_priv->gart_info.gart_reg_if = DRM_ATI_GART_PCI;
  1003. dev_priv->gart_info.gart_table_location =
  1004. DRM_ATI_GART_MAIN;
  1005. dev_priv->gart_info.addr = NULL;
  1006. dev_priv->gart_info.bus_addr = 0;
  1007. if (dev_priv->flags & RADEON_IS_PCIE) {
  1008. DRM_ERROR
  1009. ("Cannot use PCI Express without GART in FB memory\n");
  1010. radeon_do_cleanup_cp(dev);
  1011. return -EINVAL;
  1012. }
  1013. }
  1014. if (!drm_ati_pcigart_init(dev, &dev_priv->gart_info)) {
  1015. DRM_ERROR("failed to init PCI GART!\n");
  1016. radeon_do_cleanup_cp(dev);
  1017. return -ENOMEM;
  1018. }
  1019. /* Turn on PCI GART */
  1020. radeon_set_pcigart(dev_priv, 1);
  1021. }
  1022. radeon_cp_load_microcode(dev_priv);
  1023. radeon_cp_init_ring_buffer(dev, dev_priv);
  1024. dev_priv->last_buf = 0;
  1025. radeon_do_engine_reset(dev);
  1026. radeon_test_writeback(dev_priv);
  1027. return 0;
  1028. }
  1029. static int radeon_do_cleanup_cp(struct drm_device * dev)
  1030. {
  1031. drm_radeon_private_t *dev_priv = dev->dev_private;
  1032. DRM_DEBUG("\n");
  1033. /* Make sure interrupts are disabled here because the uninstall ioctl
  1034. * may not have been called from userspace and after dev_private
  1035. * is freed, it's too late.
  1036. */
  1037. if (dev->irq_enabled)
  1038. drm_irq_uninstall(dev);
  1039. #if __OS_HAS_AGP
  1040. if (dev_priv->flags & RADEON_IS_AGP) {
  1041. if (dev_priv->cp_ring != NULL) {
  1042. drm_core_ioremapfree(dev_priv->cp_ring, dev);
  1043. dev_priv->cp_ring = NULL;
  1044. }
  1045. if (dev_priv->ring_rptr != NULL) {
  1046. drm_core_ioremapfree(dev_priv->ring_rptr, dev);
  1047. dev_priv->ring_rptr = NULL;
  1048. }
  1049. if (dev->agp_buffer_map != NULL) {
  1050. drm_core_ioremapfree(dev->agp_buffer_map, dev);
  1051. dev->agp_buffer_map = NULL;
  1052. }
  1053. } else
  1054. #endif
  1055. {
  1056. if (dev_priv->gart_info.bus_addr) {
  1057. /* Turn off PCI GART */
  1058. radeon_set_pcigart(dev_priv, 0);
  1059. if (!drm_ati_pcigart_cleanup(dev, &dev_priv->gart_info))
  1060. DRM_ERROR("failed to cleanup PCI GART!\n");
  1061. }
  1062. if (dev_priv->gart_info.gart_table_location == DRM_ATI_GART_FB)
  1063. {
  1064. drm_core_ioremapfree(&dev_priv->gart_info.mapping, dev);
  1065. dev_priv->gart_info.addr = 0;
  1066. }
  1067. }
  1068. /* only clear to the start of flags */
  1069. memset(dev_priv, 0, offsetof(drm_radeon_private_t, flags));
  1070. return 0;
  1071. }
  1072. /* This code will reinit the Radeon CP hardware after a resume from disc.
  1073. * AFAIK, it would be very difficult to pickle the state at suspend time, so
  1074. * here we make sure that all Radeon hardware initialisation is re-done without
  1075. * affecting running applications.
  1076. *
  1077. * Charl P. Botha <http://cpbotha.net>
  1078. */
  1079. static int radeon_do_resume_cp(struct drm_device * dev)
  1080. {
  1081. drm_radeon_private_t *dev_priv = dev->dev_private;
  1082. if (!dev_priv) {
  1083. DRM_ERROR("Called with no initialization\n");
  1084. return -EINVAL;
  1085. }
  1086. DRM_DEBUG("Starting radeon_do_resume_cp()\n");
  1087. #if __OS_HAS_AGP
  1088. if (dev_priv->flags & RADEON_IS_AGP) {
  1089. /* Turn off PCI GART */
  1090. radeon_set_pcigart(dev_priv, 0);
  1091. } else
  1092. #endif
  1093. {
  1094. /* Turn on PCI GART */
  1095. radeon_set_pcigart(dev_priv, 1);
  1096. }
  1097. radeon_cp_load_microcode(dev_priv);
  1098. radeon_cp_init_ring_buffer(dev, dev_priv);
  1099. radeon_do_engine_reset(dev);
  1100. radeon_enable_interrupt(dev);
  1101. DRM_DEBUG("radeon_do_resume_cp() complete\n");
  1102. return 0;
  1103. }
  1104. int radeon_cp_init(struct drm_device *dev, void *data, struct drm_file *file_priv)
  1105. {
  1106. drm_radeon_init_t *init = data;
  1107. LOCK_TEST_WITH_RETURN(dev, file_priv);
  1108. if (init->func == RADEON_INIT_R300_CP)
  1109. r300_init_reg_flags(dev);
  1110. switch (init->func) {
  1111. case RADEON_INIT_CP:
  1112. case RADEON_INIT_R200_CP:
  1113. case RADEON_INIT_R300_CP:
  1114. return radeon_do_init_cp(dev, init);
  1115. case RADEON_CLEANUP_CP:
  1116. return radeon_do_cleanup_cp(dev);
  1117. }
  1118. return -EINVAL;
  1119. }
  1120. int radeon_cp_start(struct drm_device *dev, void *data, struct drm_file *file_priv)
  1121. {
  1122. drm_radeon_private_t *dev_priv = dev->dev_private;
  1123. DRM_DEBUG("\n");
  1124. LOCK_TEST_WITH_RETURN(dev, file_priv);
  1125. if (dev_priv->cp_running) {
  1126. DRM_DEBUG("while CP running\n");
  1127. return 0;
  1128. }
  1129. if (dev_priv->cp_mode == RADEON_CSQ_PRIDIS_INDDIS) {
  1130. DRM_DEBUG("called with bogus CP mode (%d)\n",
  1131. dev_priv->cp_mode);
  1132. return 0;
  1133. }
  1134. radeon_do_cp_start(dev_priv);
  1135. return 0;
  1136. }
  1137. /* Stop the CP. The engine must have been idled before calling this
  1138. * routine.
  1139. */
  1140. int radeon_cp_stop(struct drm_device *dev, void *data, struct drm_file *file_priv)
  1141. {
  1142. drm_radeon_private_t *dev_priv = dev->dev_private;
  1143. drm_radeon_cp_stop_t *stop = data;
  1144. int ret;
  1145. DRM_DEBUG("\n");
  1146. LOCK_TEST_WITH_RETURN(dev, file_priv);
  1147. if (!dev_priv->cp_running)
  1148. return 0;
  1149. /* Flush any pending CP commands. This ensures any outstanding
  1150. * commands are exectuted by the engine before we turn it off.
  1151. */
  1152. if (stop->flush) {
  1153. radeon_do_cp_flush(dev_priv);
  1154. }
  1155. /* If we fail to make the engine go idle, we return an error
  1156. * code so that the DRM ioctl wrapper can try again.
  1157. */
  1158. if (stop->idle) {
  1159. ret = radeon_do_cp_idle(dev_priv);
  1160. if (ret)
  1161. return ret;
  1162. }
  1163. /* Finally, we can turn off the CP. If the engine isn't idle,
  1164. * we will get some dropped triangles as they won't be fully
  1165. * rendered before the CP is shut down.
  1166. */
  1167. radeon_do_cp_stop(dev_priv);
  1168. /* Reset the engine */
  1169. radeon_do_engine_reset(dev);
  1170. return 0;
  1171. }
  1172. void radeon_do_release(struct drm_device * dev)
  1173. {
  1174. drm_radeon_private_t *dev_priv = dev->dev_private;
  1175. int i, ret;
  1176. if (dev_priv) {
  1177. if (dev_priv->cp_running) {
  1178. /* Stop the cp */
  1179. while ((ret = radeon_do_cp_idle(dev_priv)) != 0) {
  1180. DRM_DEBUG("radeon_do_cp_idle %d\n", ret);
  1181. #ifdef __linux__
  1182. schedule();
  1183. #else
  1184. tsleep(&ret, PZERO, "rdnrel", 1);
  1185. #endif
  1186. }
  1187. radeon_do_cp_stop(dev_priv);
  1188. radeon_do_engine_reset(dev);
  1189. }
  1190. /* Disable *all* interrupts */
  1191. if (dev_priv->mmio) /* remove this after permanent addmaps */
  1192. RADEON_WRITE(RADEON_GEN_INT_CNTL, 0);
  1193. if (dev_priv->mmio) { /* remove all surfaces */
  1194. for (i = 0; i < RADEON_MAX_SURFACES; i++) {
  1195. RADEON_WRITE(RADEON_SURFACE0_INFO + 16 * i, 0);
  1196. RADEON_WRITE(RADEON_SURFACE0_LOWER_BOUND +
  1197. 16 * i, 0);
  1198. RADEON_WRITE(RADEON_SURFACE0_UPPER_BOUND +
  1199. 16 * i, 0);
  1200. }
  1201. }
  1202. /* Free memory heap structures */
  1203. radeon_mem_takedown(&(dev_priv->gart_heap));
  1204. radeon_mem_takedown(&(dev_priv->fb_heap));
  1205. /* deallocate kernel resources */
  1206. radeon_do_cleanup_cp(dev);
  1207. }
  1208. }
  1209. /* Just reset the CP ring. Called as part of an X Server engine reset.
  1210. */
  1211. int radeon_cp_reset(struct drm_device *dev, void *data, struct drm_file *file_priv)
  1212. {
  1213. drm_radeon_private_t *dev_priv = dev->dev_private;
  1214. DRM_DEBUG("\n");
  1215. LOCK_TEST_WITH_RETURN(dev, file_priv);
  1216. if (!dev_priv) {
  1217. DRM_DEBUG("called before init done\n");
  1218. return -EINVAL;
  1219. }
  1220. radeon_do_cp_reset(dev_priv);
  1221. /* The CP is no longer running after an engine reset */
  1222. dev_priv->cp_running = 0;
  1223. return 0;
  1224. }
  1225. int radeon_cp_idle(struct drm_device *dev, void *data, struct drm_file *file_priv)
  1226. {
  1227. drm_radeon_private_t *dev_priv = dev->dev_private;
  1228. DRM_DEBUG("\n");
  1229. LOCK_TEST_WITH_RETURN(dev, file_priv);
  1230. return radeon_do_cp_idle(dev_priv);
  1231. }
  1232. /* Added by Charl P. Botha to call radeon_do_resume_cp().
  1233. */
  1234. int radeon_cp_resume(struct drm_device *dev, void *data, struct drm_file *file_priv)
  1235. {
  1236. return radeon_do_resume_cp(dev);
  1237. }
  1238. int radeon_engine_reset(struct drm_device *dev, void *data, struct drm_file *file_priv)
  1239. {
  1240. DRM_DEBUG("\n");
  1241. LOCK_TEST_WITH_RETURN(dev, file_priv);
  1242. return radeon_do_engine_reset(dev);
  1243. }
  1244. /* ================================================================
  1245. * Fullscreen mode
  1246. */
  1247. /* KW: Deprecated to say the least:
  1248. */
  1249. int radeon_fullscreen(struct drm_device *dev, void *data, struct drm_file *file_priv)
  1250. {
  1251. return 0;
  1252. }
  1253. /* ================================================================
  1254. * Freelist management
  1255. */
  1256. /* Original comment: FIXME: ROTATE_BUFS is a hack to cycle through
  1257. * bufs until freelist code is used. Note this hides a problem with
  1258. * the scratch register * (used to keep track of last buffer
  1259. * completed) being written to before * the last buffer has actually
  1260. * completed rendering.
  1261. *
  1262. * KW: It's also a good way to find free buffers quickly.
  1263. *
  1264. * KW: Ideally this loop wouldn't exist, and freelist_get wouldn't
  1265. * sleep. However, bugs in older versions of radeon_accel.c mean that
  1266. * we essentially have to do this, else old clients will break.
  1267. *
  1268. * However, it does leave open a potential deadlock where all the
  1269. * buffers are held by other clients, which can't release them because
  1270. * they can't get the lock.
  1271. */
  1272. struct drm_buf *radeon_freelist_get(struct drm_device * dev)
  1273. {
  1274. struct drm_device_dma *dma = dev->dma;
  1275. drm_radeon_private_t *dev_priv = dev->dev_private;
  1276. drm_radeon_buf_priv_t *buf_priv;
  1277. struct drm_buf *buf;
  1278. int i, t;
  1279. int start;
  1280. if (++dev_priv->last_buf >= dma->buf_count)
  1281. dev_priv->last_buf = 0;
  1282. start = dev_priv->last_buf;
  1283. for (t = 0; t < dev_priv->usec_timeout; t++) {
  1284. u32 done_age = GET_SCRATCH(1);
  1285. DRM_DEBUG("done_age = %d\n", done_age);
  1286. for (i = start; i < dma->buf_count; i++) {
  1287. buf = dma->buflist[i];
  1288. buf_priv = buf->dev_private;
  1289. if (buf->file_priv == NULL || (buf->pending &&
  1290. buf_priv->age <=
  1291. done_age)) {
  1292. dev_priv->stats.requested_bufs++;
  1293. buf->pending = 0;
  1294. return buf;
  1295. }
  1296. start = 0;
  1297. }
  1298. if (t) {
  1299. DRM_UDELAY(1);
  1300. dev_priv->stats.freelist_loops++;
  1301. }
  1302. }
  1303. DRM_DEBUG("returning NULL!\n");
  1304. return NULL;
  1305. }
  1306. #if 0
  1307. struct drm_buf *radeon_freelist_get(struct drm_device * dev)
  1308. {
  1309. struct drm_device_dma *dma = dev->dma;
  1310. drm_radeon_private_t *dev_priv = dev->dev_private;
  1311. drm_radeon_buf_priv_t *buf_priv;
  1312. struct drm_buf *buf;
  1313. int i, t;
  1314. int start;
  1315. u32 done_age = DRM_READ32(dev_priv->ring_rptr, RADEON_SCRATCHOFF(1));
  1316. if (++dev_priv->last_buf >= dma->buf_count)
  1317. dev_priv->last_buf = 0;
  1318. start = dev_priv->last_buf;
  1319. dev_priv->stats.freelist_loops++;
  1320. for (t = 0; t < 2; t++) {
  1321. for (i = start; i < dma->buf_count; i++) {
  1322. buf = dma->buflist[i];
  1323. buf_priv = buf->dev_private;
  1324. if (buf->file_priv == 0 || (buf->pending &&
  1325. buf_priv->age <=
  1326. done_age)) {
  1327. dev_priv->stats.requested_bufs++;
  1328. buf->pending = 0;
  1329. return buf;
  1330. }
  1331. }
  1332. start = 0;
  1333. }
  1334. return NULL;
  1335. }
  1336. #endif
  1337. void radeon_freelist_reset(struct drm_device * dev)
  1338. {
  1339. struct drm_device_dma *dma = dev->dma;
  1340. drm_radeon_private_t *dev_priv = dev->dev_private;
  1341. int i;
  1342. dev_priv->last_buf = 0;
  1343. for (i = 0; i < dma->buf_count; i++) {
  1344. struct drm_buf *buf = dma->buflist[i];
  1345. drm_radeon_buf_priv_t *buf_priv = buf->dev_private;
  1346. buf_priv->age = 0;
  1347. }
  1348. }
  1349. /* ================================================================
  1350. * CP command submission
  1351. */
  1352. int radeon_wait_ring(drm_radeon_private_t * dev_priv, int n)
  1353. {
  1354. drm_radeon_ring_buffer_t *ring = &dev_priv->ring;
  1355. int i;
  1356. u32 last_head = GET_RING_HEAD(dev_priv);
  1357. for (i = 0; i < dev_priv->usec_timeout; i++) {
  1358. u32 head = GET_RING_HEAD(dev_priv);
  1359. ring->space = (head - ring->tail) * sizeof(u32);
  1360. if (ring->space <= 0)
  1361. ring->space += ring->size;
  1362. if (ring->space > n)
  1363. return 0;
  1364. dev_priv->stats.boxes |= RADEON_BOX_WAIT_IDLE;
  1365. if (head != last_head)
  1366. i = 0;
  1367. last_head = head;
  1368. DRM_UDELAY(1);
  1369. }
  1370. /* FIXME: This return value is ignored in the BEGIN_RING macro! */
  1371. #if RADEON_FIFO_DEBUG
  1372. radeon_status(dev_priv);
  1373. DRM_ERROR("failed!\n");
  1374. #endif
  1375. return -EBUSY;
  1376. }
  1377. static int radeon_cp_get_buffers(struct drm_device *dev,
  1378. struct drm_file *file_priv,
  1379. struct drm_dma * d)
  1380. {
  1381. int i;
  1382. struct drm_buf *buf;
  1383. for (i = d->granted_count; i < d->request_count; i++) {
  1384. buf = radeon_freelist_get(dev);
  1385. if (!buf)
  1386. return -EBUSY; /* NOTE: broken client */
  1387. buf->file_priv = file_priv;
  1388. if (DRM_COPY_TO_USER(&d->request_indices[i], &buf->idx,
  1389. sizeof(buf->idx)))
  1390. return -EFAULT;
  1391. if (DRM_COPY_TO_USER(&d->request_sizes[i], &buf->total,
  1392. sizeof(buf->total)))
  1393. return -EFAULT;
  1394. d->granted_count++;
  1395. }
  1396. return 0;
  1397. }
  1398. int radeon_cp_buffers(struct drm_device *dev, void *data, struct drm_file *file_priv)
  1399. {
  1400. struct drm_device_dma *dma = dev->dma;
  1401. int ret = 0;
  1402. struct drm_dma *d = data;
  1403. LOCK_TEST_WITH_RETURN(dev, file_priv);
  1404. /* Please don't send us buffers.
  1405. */
  1406. if (d->send_count != 0) {
  1407. DRM_ERROR("Process %d trying to send %d buffers via drmDMA\n",
  1408. DRM_CURRENTPID, d->send_count);
  1409. return -EINVAL;
  1410. }
  1411. /* We'll send you buffers.
  1412. */
  1413. if (d->request_count < 0 || d->request_count > dma->buf_count) {
  1414. DRM_ERROR("Process %d trying to get %d buffers (of %d max)\n",
  1415. DRM_CURRENTPID, d->request_count, dma->buf_count);
  1416. return -EINVAL;
  1417. }
  1418. d->granted_count = 0;
  1419. if (d->request_count) {
  1420. ret = radeon_cp_get_buffers(dev, file_priv, d);
  1421. }
  1422. return ret;
  1423. }
  1424. int radeon_driver_load(struct drm_device *dev, unsigned long flags)
  1425. {
  1426. drm_radeon_private_t *dev_priv;
  1427. int ret = 0;
  1428. dev_priv = drm_alloc(sizeof(drm_radeon_private_t), DRM_MEM_DRIVER);
  1429. if (dev_priv == NULL)
  1430. return -ENOMEM;
  1431. memset(dev_priv, 0, sizeof(drm_radeon_private_t));
  1432. dev->dev_private = (void *)dev_priv;
  1433. dev_priv->flags = flags;
  1434. switch (flags & RADEON_FAMILY_MASK) {
  1435. case CHIP_R100:
  1436. case CHIP_RV200:
  1437. case CHIP_R200:
  1438. case CHIP_R300:
  1439. case CHIP_R350:
  1440. case CHIP_R420:
  1441. case CHIP_RV410:
  1442. case CHIP_RV515:
  1443. case CHIP_R520:
  1444. case CHIP_RV570:
  1445. case CHIP_R580:
  1446. dev_priv->flags |= RADEON_HAS_HIERZ;
  1447. break;
  1448. default:
  1449. /* all other chips have no hierarchical z buffer */
  1450. break;
  1451. }
  1452. if (drm_device_is_agp(dev))
  1453. dev_priv->flags |= RADEON_IS_AGP;
  1454. else if (drm_device_is_pcie(dev))
  1455. dev_priv->flags |= RADEON_IS_PCIE;
  1456. else
  1457. dev_priv->flags |= RADEON_IS_PCI;
  1458. DRM_DEBUG("%s card detected\n",
  1459. ((dev_priv->flags & RADEON_IS_AGP) ? "AGP" : (((dev_priv->flags & RADEON_IS_PCIE) ? "PCIE" : "PCI"))));
  1460. return ret;
  1461. }
  1462. /* Create mappings for registers and framebuffer so userland doesn't necessarily
  1463. * have to find them.
  1464. */
  1465. int radeon_driver_firstopen(struct drm_device *dev)
  1466. {
  1467. int ret;
  1468. drm_local_map_t *map;
  1469. drm_radeon_private_t *dev_priv = dev->dev_private;
  1470. dev_priv->gart_info.table_size = RADEON_PCIGART_TABLE_SIZE;
  1471. ret = drm_addmap(dev, drm_get_resource_start(dev, 2),
  1472. drm_get_resource_len(dev, 2), _DRM_REGISTERS,
  1473. _DRM_READ_ONLY, &dev_priv->mmio);
  1474. if (ret != 0)
  1475. return ret;
  1476. dev_priv->fb_aper_offset = drm_get_resource_start(dev, 0);
  1477. ret = drm_addmap(dev, dev_priv->fb_aper_offset,
  1478. drm_get_resource_len(dev, 0), _DRM_FRAME_BUFFER,
  1479. _DRM_WRITE_COMBINING, &map);
  1480. if (ret != 0)
  1481. return ret;
  1482. return 0;
  1483. }
  1484. int radeon_driver_unload(struct drm_device *dev)
  1485. {
  1486. drm_radeon_private_t *dev_priv = dev->dev_private;
  1487. DRM_DEBUG("\n");
  1488. drm_free(dev_priv, sizeof(*dev_priv), DRM_MEM_DRIVER);
  1489. dev->dev_private = NULL;
  1490. return 0;
  1491. }