radeon_clocks.c 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835
  1. /*
  2. * Copyright 2008 Advanced Micro Devices, Inc.
  3. * Copyright 2008 Red Hat Inc.
  4. * Copyright 2009 Jerome Glisse.
  5. *
  6. * Permission is hereby granted, free of charge, to any person obtaining a
  7. * copy of this software and associated documentation files (the "Software"),
  8. * to deal in the Software without restriction, including without limitation
  9. * the rights to use, copy, modify, merge, publish, distribute, sublicense,
  10. * and/or sell copies of the Software, and to permit persons to whom the
  11. * Software is furnished to do so, subject to the following conditions:
  12. *
  13. * The above copyright notice and this permission notice shall be included in
  14. * all copies or substantial portions of the Software.
  15. *
  16. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  17. * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  18. * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
  19. * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
  20. * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
  21. * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
  22. * OTHER DEALINGS IN THE SOFTWARE.
  23. *
  24. * Authors: Dave Airlie
  25. * Alex Deucher
  26. * Jerome Glisse
  27. */
  28. #include "drmP.h"
  29. #include "radeon_drm.h"
  30. #include "radeon_reg.h"
  31. #include "radeon.h"
  32. #include "atom.h"
  33. /* 10 khz */
  34. static uint32_t radeon_legacy_get_engine_clock(struct radeon_device *rdev)
  35. {
  36. struct radeon_pll *spll = &rdev->clock.spll;
  37. uint32_t fb_div, ref_div, post_div, sclk;
  38. fb_div = RREG32_PLL(RADEON_M_SPLL_REF_FB_DIV);
  39. fb_div = (fb_div >> RADEON_SPLL_FB_DIV_SHIFT) & RADEON_SPLL_FB_DIV_MASK;
  40. fb_div <<= 1;
  41. fb_div *= spll->reference_freq;
  42. ref_div =
  43. RREG32_PLL(RADEON_M_SPLL_REF_FB_DIV) & RADEON_M_SPLL_REF_DIV_MASK;
  44. sclk = fb_div / ref_div;
  45. post_div = RREG32_PLL(RADEON_SCLK_CNTL) & RADEON_SCLK_SRC_SEL_MASK;
  46. if (post_div == 2)
  47. sclk >>= 1;
  48. else if (post_div == 3)
  49. sclk >>= 2;
  50. else if (post_div == 4)
  51. sclk >>= 4;
  52. return sclk;
  53. }
  54. /* 10 khz */
  55. static uint32_t radeon_legacy_get_memory_clock(struct radeon_device *rdev)
  56. {
  57. struct radeon_pll *mpll = &rdev->clock.mpll;
  58. uint32_t fb_div, ref_div, post_div, mclk;
  59. fb_div = RREG32_PLL(RADEON_M_SPLL_REF_FB_DIV);
  60. fb_div = (fb_div >> RADEON_MPLL_FB_DIV_SHIFT) & RADEON_MPLL_FB_DIV_MASK;
  61. fb_div <<= 1;
  62. fb_div *= mpll->reference_freq;
  63. ref_div =
  64. RREG32_PLL(RADEON_M_SPLL_REF_FB_DIV) & RADEON_M_SPLL_REF_DIV_MASK;
  65. mclk = fb_div / ref_div;
  66. post_div = RREG32_PLL(RADEON_MCLK_CNTL) & 0x7;
  67. if (post_div == 2)
  68. mclk >>= 1;
  69. else if (post_div == 3)
  70. mclk >>= 2;
  71. else if (post_div == 4)
  72. mclk >>= 4;
  73. return mclk;
  74. }
  75. void radeon_get_clock_info(struct drm_device *dev)
  76. {
  77. struct radeon_device *rdev = dev->dev_private;
  78. struct radeon_pll *p1pll = &rdev->clock.p1pll;
  79. struct radeon_pll *p2pll = &rdev->clock.p2pll;
  80. struct radeon_pll *spll = &rdev->clock.spll;
  81. struct radeon_pll *mpll = &rdev->clock.mpll;
  82. int ret;
  83. if (rdev->is_atom_bios)
  84. ret = radeon_atom_get_clock_info(dev);
  85. else
  86. ret = radeon_combios_get_clock_info(dev);
  87. if (ret) {
  88. if (p1pll->reference_div < 2)
  89. p1pll->reference_div = 12;
  90. if (p2pll->reference_div < 2)
  91. p2pll->reference_div = 12;
  92. if (rdev->family < CHIP_RS600) {
  93. if (spll->reference_div < 2)
  94. spll->reference_div =
  95. RREG32_PLL(RADEON_M_SPLL_REF_FB_DIV) &
  96. RADEON_M_SPLL_REF_DIV_MASK;
  97. }
  98. if (mpll->reference_div < 2)
  99. mpll->reference_div = spll->reference_div;
  100. } else {
  101. if (ASIC_IS_AVIVO(rdev)) {
  102. /* TODO FALLBACK */
  103. } else {
  104. DRM_INFO("Using generic clock info\n");
  105. if (rdev->flags & RADEON_IS_IGP) {
  106. p1pll->reference_freq = 1432;
  107. p2pll->reference_freq = 1432;
  108. spll->reference_freq = 1432;
  109. mpll->reference_freq = 1432;
  110. } else {
  111. p1pll->reference_freq = 2700;
  112. p2pll->reference_freq = 2700;
  113. spll->reference_freq = 2700;
  114. mpll->reference_freq = 2700;
  115. }
  116. p1pll->reference_div =
  117. RREG32_PLL(RADEON_PPLL_REF_DIV) & 0x3ff;
  118. if (p1pll->reference_div < 2)
  119. p1pll->reference_div = 12;
  120. p2pll->reference_div = p1pll->reference_div;
  121. if (rdev->family >= CHIP_R420) {
  122. p1pll->pll_in_min = 100;
  123. p1pll->pll_in_max = 1350;
  124. p1pll->pll_out_min = 20000;
  125. p1pll->pll_out_max = 50000;
  126. p2pll->pll_in_min = 100;
  127. p2pll->pll_in_max = 1350;
  128. p2pll->pll_out_min = 20000;
  129. p2pll->pll_out_max = 50000;
  130. } else {
  131. p1pll->pll_in_min = 40;
  132. p1pll->pll_in_max = 500;
  133. p1pll->pll_out_min = 12500;
  134. p1pll->pll_out_max = 35000;
  135. p2pll->pll_in_min = 40;
  136. p2pll->pll_in_max = 500;
  137. p2pll->pll_out_min = 12500;
  138. p2pll->pll_out_max = 35000;
  139. }
  140. spll->reference_div =
  141. RREG32_PLL(RADEON_M_SPLL_REF_FB_DIV) &
  142. RADEON_M_SPLL_REF_DIV_MASK;
  143. mpll->reference_div = spll->reference_div;
  144. rdev->clock.default_sclk =
  145. radeon_legacy_get_engine_clock(rdev);
  146. rdev->clock.default_mclk =
  147. radeon_legacy_get_memory_clock(rdev);
  148. }
  149. }
  150. /* pixel clocks */
  151. if (ASIC_IS_AVIVO(rdev)) {
  152. p1pll->min_post_div = 2;
  153. p1pll->max_post_div = 0x7f;
  154. p1pll->min_frac_feedback_div = 0;
  155. p1pll->max_frac_feedback_div = 9;
  156. p2pll->min_post_div = 2;
  157. p2pll->max_post_div = 0x7f;
  158. p2pll->min_frac_feedback_div = 0;
  159. p2pll->max_frac_feedback_div = 9;
  160. } else {
  161. p1pll->min_post_div = 1;
  162. p1pll->max_post_div = 16;
  163. p1pll->min_frac_feedback_div = 0;
  164. p1pll->max_frac_feedback_div = 0;
  165. p2pll->min_post_div = 1;
  166. p2pll->max_post_div = 12;
  167. p2pll->min_frac_feedback_div = 0;
  168. p2pll->max_frac_feedback_div = 0;
  169. }
  170. p1pll->min_ref_div = 2;
  171. p1pll->max_ref_div = 0x3ff;
  172. p1pll->min_feedback_div = 4;
  173. p1pll->max_feedback_div = 0x7ff;
  174. p1pll->best_vco = 0;
  175. p2pll->min_ref_div = 2;
  176. p2pll->max_ref_div = 0x3ff;
  177. p2pll->min_feedback_div = 4;
  178. p2pll->max_feedback_div = 0x7ff;
  179. p2pll->best_vco = 0;
  180. /* system clock */
  181. spll->min_post_div = 1;
  182. spll->max_post_div = 1;
  183. spll->min_ref_div = 2;
  184. spll->max_ref_div = 0xff;
  185. spll->min_feedback_div = 4;
  186. spll->max_feedback_div = 0xff;
  187. spll->best_vco = 0;
  188. /* memory clock */
  189. mpll->min_post_div = 1;
  190. mpll->max_post_div = 1;
  191. mpll->min_ref_div = 2;
  192. mpll->max_ref_div = 0xff;
  193. mpll->min_feedback_div = 4;
  194. mpll->max_feedback_div = 0xff;
  195. mpll->best_vco = 0;
  196. }
  197. /* 10 khz */
  198. static uint32_t calc_eng_mem_clock(struct radeon_device *rdev,
  199. uint32_t req_clock,
  200. int *fb_div, int *post_div)
  201. {
  202. struct radeon_pll *spll = &rdev->clock.spll;
  203. int ref_div = spll->reference_div;
  204. if (!ref_div)
  205. ref_div =
  206. RREG32_PLL(RADEON_M_SPLL_REF_FB_DIV) &
  207. RADEON_M_SPLL_REF_DIV_MASK;
  208. if (req_clock < 15000) {
  209. *post_div = 8;
  210. req_clock *= 8;
  211. } else if (req_clock < 30000) {
  212. *post_div = 4;
  213. req_clock *= 4;
  214. } else if (req_clock < 60000) {
  215. *post_div = 2;
  216. req_clock *= 2;
  217. } else
  218. *post_div = 1;
  219. req_clock *= ref_div;
  220. req_clock += spll->reference_freq;
  221. req_clock /= (2 * spll->reference_freq);
  222. *fb_div = req_clock & 0xff;
  223. req_clock = (req_clock & 0xffff) << 1;
  224. req_clock *= spll->reference_freq;
  225. req_clock /= ref_div;
  226. req_clock /= *post_div;
  227. return req_clock;
  228. }
  229. /* 10 khz */
  230. void radeon_legacy_set_engine_clock(struct radeon_device *rdev,
  231. uint32_t eng_clock)
  232. {
  233. uint32_t tmp;
  234. int fb_div, post_div;
  235. /* XXX: wait for idle */
  236. eng_clock = calc_eng_mem_clock(rdev, eng_clock, &fb_div, &post_div);
  237. tmp = RREG32_PLL(RADEON_CLK_PIN_CNTL);
  238. tmp &= ~RADEON_DONT_USE_XTALIN;
  239. WREG32_PLL(RADEON_CLK_PIN_CNTL, tmp);
  240. tmp = RREG32_PLL(RADEON_SCLK_CNTL);
  241. tmp &= ~RADEON_SCLK_SRC_SEL_MASK;
  242. WREG32_PLL(RADEON_SCLK_CNTL, tmp);
  243. udelay(10);
  244. tmp = RREG32_PLL(RADEON_SPLL_CNTL);
  245. tmp |= RADEON_SPLL_SLEEP;
  246. WREG32_PLL(RADEON_SPLL_CNTL, tmp);
  247. udelay(2);
  248. tmp = RREG32_PLL(RADEON_SPLL_CNTL);
  249. tmp |= RADEON_SPLL_RESET;
  250. WREG32_PLL(RADEON_SPLL_CNTL, tmp);
  251. udelay(200);
  252. tmp = RREG32_PLL(RADEON_M_SPLL_REF_FB_DIV);
  253. tmp &= ~(RADEON_SPLL_FB_DIV_MASK << RADEON_SPLL_FB_DIV_SHIFT);
  254. tmp |= (fb_div & RADEON_SPLL_FB_DIV_MASK) << RADEON_SPLL_FB_DIV_SHIFT;
  255. WREG32_PLL(RADEON_M_SPLL_REF_FB_DIV, tmp);
  256. /* XXX: verify on different asics */
  257. tmp = RREG32_PLL(RADEON_SPLL_CNTL);
  258. tmp &= ~RADEON_SPLL_PVG_MASK;
  259. if ((eng_clock * post_div) >= 90000)
  260. tmp |= (0x7 << RADEON_SPLL_PVG_SHIFT);
  261. else
  262. tmp |= (0x4 << RADEON_SPLL_PVG_SHIFT);
  263. WREG32_PLL(RADEON_SPLL_CNTL, tmp);
  264. tmp = RREG32_PLL(RADEON_SPLL_CNTL);
  265. tmp &= ~RADEON_SPLL_SLEEP;
  266. WREG32_PLL(RADEON_SPLL_CNTL, tmp);
  267. udelay(2);
  268. tmp = RREG32_PLL(RADEON_SPLL_CNTL);
  269. tmp &= ~RADEON_SPLL_RESET;
  270. WREG32_PLL(RADEON_SPLL_CNTL, tmp);
  271. udelay(200);
  272. tmp = RREG32_PLL(RADEON_SCLK_CNTL);
  273. tmp &= ~RADEON_SCLK_SRC_SEL_MASK;
  274. switch (post_div) {
  275. case 1:
  276. default:
  277. tmp |= 1;
  278. break;
  279. case 2:
  280. tmp |= 2;
  281. break;
  282. case 4:
  283. tmp |= 3;
  284. break;
  285. case 8:
  286. tmp |= 4;
  287. break;
  288. }
  289. WREG32_PLL(RADEON_SCLK_CNTL, tmp);
  290. udelay(20);
  291. tmp = RREG32_PLL(RADEON_CLK_PIN_CNTL);
  292. tmp |= RADEON_DONT_USE_XTALIN;
  293. WREG32_PLL(RADEON_CLK_PIN_CNTL, tmp);
  294. udelay(10);
  295. }
  296. void radeon_legacy_set_clock_gating(struct radeon_device *rdev, int enable)
  297. {
  298. uint32_t tmp;
  299. if (enable) {
  300. if (rdev->flags & RADEON_SINGLE_CRTC) {
  301. tmp = RREG32_PLL(RADEON_SCLK_CNTL);
  302. if ((RREG32(RADEON_CONFIG_CNTL) &
  303. RADEON_CFG_ATI_REV_ID_MASK) >
  304. RADEON_CFG_ATI_REV_A13) {
  305. tmp &=
  306. ~(RADEON_SCLK_FORCE_CP |
  307. RADEON_SCLK_FORCE_RB);
  308. }
  309. tmp &=
  310. ~(RADEON_SCLK_FORCE_HDP | RADEON_SCLK_FORCE_DISP1 |
  311. RADEON_SCLK_FORCE_TOP | RADEON_SCLK_FORCE_SE |
  312. RADEON_SCLK_FORCE_IDCT | RADEON_SCLK_FORCE_RE |
  313. RADEON_SCLK_FORCE_PB | RADEON_SCLK_FORCE_TAM |
  314. RADEON_SCLK_FORCE_TDM);
  315. WREG32_PLL(RADEON_SCLK_CNTL, tmp);
  316. } else if (ASIC_IS_R300(rdev)) {
  317. if ((rdev->family == CHIP_RS400) ||
  318. (rdev->family == CHIP_RS480)) {
  319. tmp = RREG32_PLL(RADEON_SCLK_CNTL);
  320. tmp &=
  321. ~(RADEON_SCLK_FORCE_DISP2 |
  322. RADEON_SCLK_FORCE_CP |
  323. RADEON_SCLK_FORCE_HDP |
  324. RADEON_SCLK_FORCE_DISP1 |
  325. RADEON_SCLK_FORCE_TOP |
  326. RADEON_SCLK_FORCE_E2 | R300_SCLK_FORCE_VAP
  327. | RADEON_SCLK_FORCE_IDCT |
  328. RADEON_SCLK_FORCE_VIP | R300_SCLK_FORCE_SR
  329. | R300_SCLK_FORCE_PX | R300_SCLK_FORCE_TX
  330. | R300_SCLK_FORCE_US |
  331. RADEON_SCLK_FORCE_TV_SCLK |
  332. R300_SCLK_FORCE_SU |
  333. RADEON_SCLK_FORCE_OV0);
  334. tmp |= RADEON_DYN_STOP_LAT_MASK;
  335. tmp |=
  336. RADEON_SCLK_FORCE_TOP |
  337. RADEON_SCLK_FORCE_VIP;
  338. WREG32_PLL(RADEON_SCLK_CNTL, tmp);
  339. tmp = RREG32_PLL(RADEON_SCLK_MORE_CNTL);
  340. tmp &= ~RADEON_SCLK_MORE_FORCEON;
  341. tmp |= RADEON_SCLK_MORE_MAX_DYN_STOP_LAT;
  342. WREG32_PLL(RADEON_SCLK_MORE_CNTL, tmp);
  343. tmp = RREG32_PLL(RADEON_VCLK_ECP_CNTL);
  344. tmp |= (RADEON_PIXCLK_ALWAYS_ONb |
  345. RADEON_PIXCLK_DAC_ALWAYS_ONb);
  346. WREG32_PLL(RADEON_VCLK_ECP_CNTL, tmp);
  347. tmp = RREG32_PLL(RADEON_PIXCLKS_CNTL);
  348. tmp |= (RADEON_PIX2CLK_ALWAYS_ONb |
  349. RADEON_PIX2CLK_DAC_ALWAYS_ONb |
  350. RADEON_DISP_TVOUT_PIXCLK_TV_ALWAYS_ONb |
  351. R300_DVOCLK_ALWAYS_ONb |
  352. RADEON_PIXCLK_BLEND_ALWAYS_ONb |
  353. RADEON_PIXCLK_GV_ALWAYS_ONb |
  354. R300_PIXCLK_DVO_ALWAYS_ONb |
  355. RADEON_PIXCLK_LVDS_ALWAYS_ONb |
  356. RADEON_PIXCLK_TMDS_ALWAYS_ONb |
  357. R300_PIXCLK_TRANS_ALWAYS_ONb |
  358. R300_PIXCLK_TVO_ALWAYS_ONb |
  359. R300_P2G2CLK_ALWAYS_ONb |
  360. R300_P2G2CLK_ALWAYS_ONb);
  361. WREG32_PLL(RADEON_PIXCLKS_CNTL, tmp);
  362. } else if (rdev->family >= CHIP_RV350) {
  363. tmp = RREG32_PLL(R300_SCLK_CNTL2);
  364. tmp &= ~(R300_SCLK_FORCE_TCL |
  365. R300_SCLK_FORCE_GA |
  366. R300_SCLK_FORCE_CBA);
  367. tmp |= (R300_SCLK_TCL_MAX_DYN_STOP_LAT |
  368. R300_SCLK_GA_MAX_DYN_STOP_LAT |
  369. R300_SCLK_CBA_MAX_DYN_STOP_LAT);
  370. WREG32_PLL(R300_SCLK_CNTL2, tmp);
  371. tmp = RREG32_PLL(RADEON_SCLK_CNTL);
  372. tmp &=
  373. ~(RADEON_SCLK_FORCE_DISP2 |
  374. RADEON_SCLK_FORCE_CP |
  375. RADEON_SCLK_FORCE_HDP |
  376. RADEON_SCLK_FORCE_DISP1 |
  377. RADEON_SCLK_FORCE_TOP |
  378. RADEON_SCLK_FORCE_E2 | R300_SCLK_FORCE_VAP
  379. | RADEON_SCLK_FORCE_IDCT |
  380. RADEON_SCLK_FORCE_VIP | R300_SCLK_FORCE_SR
  381. | R300_SCLK_FORCE_PX | R300_SCLK_FORCE_TX
  382. | R300_SCLK_FORCE_US |
  383. RADEON_SCLK_FORCE_TV_SCLK |
  384. R300_SCLK_FORCE_SU |
  385. RADEON_SCLK_FORCE_OV0);
  386. tmp |= RADEON_DYN_STOP_LAT_MASK;
  387. WREG32_PLL(RADEON_SCLK_CNTL, tmp);
  388. tmp = RREG32_PLL(RADEON_SCLK_MORE_CNTL);
  389. tmp &= ~RADEON_SCLK_MORE_FORCEON;
  390. tmp |= RADEON_SCLK_MORE_MAX_DYN_STOP_LAT;
  391. WREG32_PLL(RADEON_SCLK_MORE_CNTL, tmp);
  392. tmp = RREG32_PLL(RADEON_VCLK_ECP_CNTL);
  393. tmp |= (RADEON_PIXCLK_ALWAYS_ONb |
  394. RADEON_PIXCLK_DAC_ALWAYS_ONb);
  395. WREG32_PLL(RADEON_VCLK_ECP_CNTL, tmp);
  396. tmp = RREG32_PLL(RADEON_PIXCLKS_CNTL);
  397. tmp |= (RADEON_PIX2CLK_ALWAYS_ONb |
  398. RADEON_PIX2CLK_DAC_ALWAYS_ONb |
  399. RADEON_DISP_TVOUT_PIXCLK_TV_ALWAYS_ONb |
  400. R300_DVOCLK_ALWAYS_ONb |
  401. RADEON_PIXCLK_BLEND_ALWAYS_ONb |
  402. RADEON_PIXCLK_GV_ALWAYS_ONb |
  403. R300_PIXCLK_DVO_ALWAYS_ONb |
  404. RADEON_PIXCLK_LVDS_ALWAYS_ONb |
  405. RADEON_PIXCLK_TMDS_ALWAYS_ONb |
  406. R300_PIXCLK_TRANS_ALWAYS_ONb |
  407. R300_PIXCLK_TVO_ALWAYS_ONb |
  408. R300_P2G2CLK_ALWAYS_ONb |
  409. R300_P2G2CLK_ALWAYS_ONb);
  410. WREG32_PLL(RADEON_PIXCLKS_CNTL, tmp);
  411. tmp = RREG32_PLL(RADEON_MCLK_MISC);
  412. tmp |= (RADEON_MC_MCLK_DYN_ENABLE |
  413. RADEON_IO_MCLK_DYN_ENABLE);
  414. WREG32_PLL(RADEON_MCLK_MISC, tmp);
  415. tmp = RREG32_PLL(RADEON_MCLK_CNTL);
  416. tmp |= (RADEON_FORCEON_MCLKA |
  417. RADEON_FORCEON_MCLKB);
  418. tmp &= ~(RADEON_FORCEON_YCLKA |
  419. RADEON_FORCEON_YCLKB |
  420. RADEON_FORCEON_MC);
  421. /* Some releases of vbios have set DISABLE_MC_MCLKA
  422. and DISABLE_MC_MCLKB bits in the vbios table. Setting these
  423. bits will cause H/W hang when reading video memory with dynamic clocking
  424. enabled. */
  425. if ((tmp & R300_DISABLE_MC_MCLKA) &&
  426. (tmp & R300_DISABLE_MC_MCLKB)) {
  427. /* If both bits are set, then check the active channels */
  428. tmp = RREG32_PLL(RADEON_MCLK_CNTL);
  429. if (rdev->mc.vram_width == 64) {
  430. if (RREG32(RADEON_MEM_CNTL) &
  431. R300_MEM_USE_CD_CH_ONLY)
  432. tmp &=
  433. ~R300_DISABLE_MC_MCLKB;
  434. else
  435. tmp &=
  436. ~R300_DISABLE_MC_MCLKA;
  437. } else {
  438. tmp &= ~(R300_DISABLE_MC_MCLKA |
  439. R300_DISABLE_MC_MCLKB);
  440. }
  441. }
  442. WREG32_PLL(RADEON_MCLK_CNTL, tmp);
  443. } else {
  444. tmp = RREG32_PLL(RADEON_SCLK_CNTL);
  445. tmp &= ~(R300_SCLK_FORCE_VAP);
  446. tmp |= RADEON_SCLK_FORCE_CP;
  447. WREG32_PLL(RADEON_SCLK_CNTL, tmp);
  448. udelay(15000);
  449. tmp = RREG32_PLL(R300_SCLK_CNTL2);
  450. tmp &= ~(R300_SCLK_FORCE_TCL |
  451. R300_SCLK_FORCE_GA |
  452. R300_SCLK_FORCE_CBA);
  453. WREG32_PLL(R300_SCLK_CNTL2, tmp);
  454. }
  455. } else {
  456. tmp = RREG32_PLL(RADEON_CLK_PWRMGT_CNTL);
  457. tmp &= ~(RADEON_ACTIVE_HILO_LAT_MASK |
  458. RADEON_DISP_DYN_STOP_LAT_MASK |
  459. RADEON_DYN_STOP_MODE_MASK);
  460. tmp |= (RADEON_ENGIN_DYNCLK_MODE |
  461. (0x01 << RADEON_ACTIVE_HILO_LAT_SHIFT));
  462. WREG32_PLL(RADEON_CLK_PWRMGT_CNTL, tmp);
  463. udelay(15000);
  464. tmp = RREG32_PLL(RADEON_CLK_PIN_CNTL);
  465. tmp |= RADEON_SCLK_DYN_START_CNTL;
  466. WREG32_PLL(RADEON_CLK_PIN_CNTL, tmp);
  467. udelay(15000);
  468. /* When DRI is enabled, setting DYN_STOP_LAT to zero can cause some R200
  469. to lockup randomly, leave them as set by BIOS.
  470. */
  471. tmp = RREG32_PLL(RADEON_SCLK_CNTL);
  472. /*tmp &= RADEON_SCLK_SRC_SEL_MASK; */
  473. tmp &= ~RADEON_SCLK_FORCEON_MASK;
  474. /*RAGE_6::A11 A12 A12N1 A13, RV250::A11 A12, R300 */
  475. if (((rdev->family == CHIP_RV250) &&
  476. ((RREG32(RADEON_CONFIG_CNTL) &
  477. RADEON_CFG_ATI_REV_ID_MASK) <
  478. RADEON_CFG_ATI_REV_A13))
  479. || ((rdev->family == CHIP_RV100)
  480. &&
  481. ((RREG32(RADEON_CONFIG_CNTL) &
  482. RADEON_CFG_ATI_REV_ID_MASK) <=
  483. RADEON_CFG_ATI_REV_A13))) {
  484. tmp |= RADEON_SCLK_FORCE_CP;
  485. tmp |= RADEON_SCLK_FORCE_VIP;
  486. }
  487. WREG32_PLL(RADEON_SCLK_CNTL, tmp);
  488. if ((rdev->family == CHIP_RV200) ||
  489. (rdev->family == CHIP_RV250) ||
  490. (rdev->family == CHIP_RV280)) {
  491. tmp = RREG32_PLL(RADEON_SCLK_MORE_CNTL);
  492. tmp &= ~RADEON_SCLK_MORE_FORCEON;
  493. /* RV200::A11 A12 RV250::A11 A12 */
  494. if (((rdev->family == CHIP_RV200) ||
  495. (rdev->family == CHIP_RV250)) &&
  496. ((RREG32(RADEON_CONFIG_CNTL) &
  497. RADEON_CFG_ATI_REV_ID_MASK) <
  498. RADEON_CFG_ATI_REV_A13)) {
  499. tmp |= RADEON_SCLK_MORE_FORCEON;
  500. }
  501. WREG32_PLL(RADEON_SCLK_MORE_CNTL, tmp);
  502. udelay(15000);
  503. }
  504. /* RV200::A11 A12, RV250::A11 A12 */
  505. if (((rdev->family == CHIP_RV200) ||
  506. (rdev->family == CHIP_RV250)) &&
  507. ((RREG32(RADEON_CONFIG_CNTL) &
  508. RADEON_CFG_ATI_REV_ID_MASK) <
  509. RADEON_CFG_ATI_REV_A13)) {
  510. tmp = RREG32_PLL(RADEON_PLL_PWRMGT_CNTL);
  511. tmp |= RADEON_TCL_BYPASS_DISABLE;
  512. WREG32_PLL(RADEON_PLL_PWRMGT_CNTL, tmp);
  513. }
  514. udelay(15000);
  515. /*enable dynamic mode for display clocks (PIXCLK and PIX2CLK) */
  516. tmp = RREG32_PLL(RADEON_PIXCLKS_CNTL);
  517. tmp |= (RADEON_PIX2CLK_ALWAYS_ONb |
  518. RADEON_PIX2CLK_DAC_ALWAYS_ONb |
  519. RADEON_PIXCLK_BLEND_ALWAYS_ONb |
  520. RADEON_PIXCLK_GV_ALWAYS_ONb |
  521. RADEON_PIXCLK_DIG_TMDS_ALWAYS_ONb |
  522. RADEON_PIXCLK_LVDS_ALWAYS_ONb |
  523. RADEON_PIXCLK_TMDS_ALWAYS_ONb);
  524. WREG32_PLL(RADEON_PIXCLKS_CNTL, tmp);
  525. udelay(15000);
  526. tmp = RREG32_PLL(RADEON_VCLK_ECP_CNTL);
  527. tmp |= (RADEON_PIXCLK_ALWAYS_ONb |
  528. RADEON_PIXCLK_DAC_ALWAYS_ONb);
  529. WREG32_PLL(RADEON_VCLK_ECP_CNTL, tmp);
  530. udelay(15000);
  531. }
  532. } else {
  533. /* Turn everything OFF (ForceON to everything) */
  534. if (rdev->flags & RADEON_SINGLE_CRTC) {
  535. tmp = RREG32_PLL(RADEON_SCLK_CNTL);
  536. tmp |= (RADEON_SCLK_FORCE_CP | RADEON_SCLK_FORCE_HDP |
  537. RADEON_SCLK_FORCE_DISP1 | RADEON_SCLK_FORCE_TOP
  538. | RADEON_SCLK_FORCE_E2 | RADEON_SCLK_FORCE_SE |
  539. RADEON_SCLK_FORCE_IDCT | RADEON_SCLK_FORCE_VIP |
  540. RADEON_SCLK_FORCE_RE | RADEON_SCLK_FORCE_PB |
  541. RADEON_SCLK_FORCE_TAM | RADEON_SCLK_FORCE_TDM |
  542. RADEON_SCLK_FORCE_RB);
  543. WREG32_PLL(RADEON_SCLK_CNTL, tmp);
  544. } else if ((rdev->family == CHIP_RS400) ||
  545. (rdev->family == CHIP_RS480)) {
  546. tmp = RREG32_PLL(RADEON_SCLK_CNTL);
  547. tmp |= (RADEON_SCLK_FORCE_DISP2 | RADEON_SCLK_FORCE_CP |
  548. RADEON_SCLK_FORCE_HDP | RADEON_SCLK_FORCE_DISP1
  549. | RADEON_SCLK_FORCE_TOP | RADEON_SCLK_FORCE_E2 |
  550. R300_SCLK_FORCE_VAP | RADEON_SCLK_FORCE_IDCT |
  551. RADEON_SCLK_FORCE_VIP | R300_SCLK_FORCE_SR |
  552. R300_SCLK_FORCE_PX | R300_SCLK_FORCE_TX |
  553. R300_SCLK_FORCE_US | RADEON_SCLK_FORCE_TV_SCLK |
  554. R300_SCLK_FORCE_SU | RADEON_SCLK_FORCE_OV0);
  555. WREG32_PLL(RADEON_SCLK_CNTL, tmp);
  556. tmp = RREG32_PLL(RADEON_SCLK_MORE_CNTL);
  557. tmp |= RADEON_SCLK_MORE_FORCEON;
  558. WREG32_PLL(RADEON_SCLK_MORE_CNTL, tmp);
  559. tmp = RREG32_PLL(RADEON_VCLK_ECP_CNTL);
  560. tmp &= ~(RADEON_PIXCLK_ALWAYS_ONb |
  561. RADEON_PIXCLK_DAC_ALWAYS_ONb |
  562. R300_DISP_DAC_PIXCLK_DAC_BLANK_OFF);
  563. WREG32_PLL(RADEON_VCLK_ECP_CNTL, tmp);
  564. tmp = RREG32_PLL(RADEON_PIXCLKS_CNTL);
  565. tmp &= ~(RADEON_PIX2CLK_ALWAYS_ONb |
  566. RADEON_PIX2CLK_DAC_ALWAYS_ONb |
  567. RADEON_DISP_TVOUT_PIXCLK_TV_ALWAYS_ONb |
  568. R300_DVOCLK_ALWAYS_ONb |
  569. RADEON_PIXCLK_BLEND_ALWAYS_ONb |
  570. RADEON_PIXCLK_GV_ALWAYS_ONb |
  571. R300_PIXCLK_DVO_ALWAYS_ONb |
  572. RADEON_PIXCLK_LVDS_ALWAYS_ONb |
  573. RADEON_PIXCLK_TMDS_ALWAYS_ONb |
  574. R300_PIXCLK_TRANS_ALWAYS_ONb |
  575. R300_PIXCLK_TVO_ALWAYS_ONb |
  576. R300_P2G2CLK_ALWAYS_ONb |
  577. R300_P2G2CLK_ALWAYS_ONb |
  578. R300_DISP_DAC_PIXCLK_DAC2_BLANK_OFF);
  579. WREG32_PLL(RADEON_PIXCLKS_CNTL, tmp);
  580. } else if (rdev->family >= CHIP_RV350) {
  581. /* for RV350/M10, no delays are required. */
  582. tmp = RREG32_PLL(R300_SCLK_CNTL2);
  583. tmp |= (R300_SCLK_FORCE_TCL |
  584. R300_SCLK_FORCE_GA | R300_SCLK_FORCE_CBA);
  585. WREG32_PLL(R300_SCLK_CNTL2, tmp);
  586. tmp = RREG32_PLL(RADEON_SCLK_CNTL);
  587. tmp |= (RADEON_SCLK_FORCE_DISP2 | RADEON_SCLK_FORCE_CP |
  588. RADEON_SCLK_FORCE_HDP | RADEON_SCLK_FORCE_DISP1
  589. | RADEON_SCLK_FORCE_TOP | RADEON_SCLK_FORCE_E2 |
  590. R300_SCLK_FORCE_VAP | RADEON_SCLK_FORCE_IDCT |
  591. RADEON_SCLK_FORCE_VIP | R300_SCLK_FORCE_SR |
  592. R300_SCLK_FORCE_PX | R300_SCLK_FORCE_TX |
  593. R300_SCLK_FORCE_US | RADEON_SCLK_FORCE_TV_SCLK |
  594. R300_SCLK_FORCE_SU | RADEON_SCLK_FORCE_OV0);
  595. WREG32_PLL(RADEON_SCLK_CNTL, tmp);
  596. tmp = RREG32_PLL(RADEON_SCLK_MORE_CNTL);
  597. tmp |= RADEON_SCLK_MORE_FORCEON;
  598. WREG32_PLL(RADEON_SCLK_MORE_CNTL, tmp);
  599. tmp = RREG32_PLL(RADEON_MCLK_CNTL);
  600. tmp |= (RADEON_FORCEON_MCLKA |
  601. RADEON_FORCEON_MCLKB |
  602. RADEON_FORCEON_YCLKA |
  603. RADEON_FORCEON_YCLKB | RADEON_FORCEON_MC);
  604. WREG32_PLL(RADEON_MCLK_CNTL, tmp);
  605. tmp = RREG32_PLL(RADEON_VCLK_ECP_CNTL);
  606. tmp &= ~(RADEON_PIXCLK_ALWAYS_ONb |
  607. RADEON_PIXCLK_DAC_ALWAYS_ONb |
  608. R300_DISP_DAC_PIXCLK_DAC_BLANK_OFF);
  609. WREG32_PLL(RADEON_VCLK_ECP_CNTL, tmp);
  610. tmp = RREG32_PLL(RADEON_PIXCLKS_CNTL);
  611. tmp &= ~(RADEON_PIX2CLK_ALWAYS_ONb |
  612. RADEON_PIX2CLK_DAC_ALWAYS_ONb |
  613. RADEON_DISP_TVOUT_PIXCLK_TV_ALWAYS_ONb |
  614. R300_DVOCLK_ALWAYS_ONb |
  615. RADEON_PIXCLK_BLEND_ALWAYS_ONb |
  616. RADEON_PIXCLK_GV_ALWAYS_ONb |
  617. R300_PIXCLK_DVO_ALWAYS_ONb |
  618. RADEON_PIXCLK_LVDS_ALWAYS_ONb |
  619. RADEON_PIXCLK_TMDS_ALWAYS_ONb |
  620. R300_PIXCLK_TRANS_ALWAYS_ONb |
  621. R300_PIXCLK_TVO_ALWAYS_ONb |
  622. R300_P2G2CLK_ALWAYS_ONb |
  623. R300_P2G2CLK_ALWAYS_ONb |
  624. R300_DISP_DAC_PIXCLK_DAC2_BLANK_OFF);
  625. WREG32_PLL(RADEON_PIXCLKS_CNTL, tmp);
  626. } else {
  627. tmp = RREG32_PLL(RADEON_SCLK_CNTL);
  628. tmp |= (RADEON_SCLK_FORCE_CP | RADEON_SCLK_FORCE_E2);
  629. tmp |= RADEON_SCLK_FORCE_SE;
  630. if (rdev->flags & RADEON_SINGLE_CRTC) {
  631. tmp |= (RADEON_SCLK_FORCE_RB |
  632. RADEON_SCLK_FORCE_TDM |
  633. RADEON_SCLK_FORCE_TAM |
  634. RADEON_SCLK_FORCE_PB |
  635. RADEON_SCLK_FORCE_RE |
  636. RADEON_SCLK_FORCE_VIP |
  637. RADEON_SCLK_FORCE_IDCT |
  638. RADEON_SCLK_FORCE_TOP |
  639. RADEON_SCLK_FORCE_DISP1 |
  640. RADEON_SCLK_FORCE_DISP2 |
  641. RADEON_SCLK_FORCE_HDP);
  642. } else if ((rdev->family == CHIP_R300) ||
  643. (rdev->family == CHIP_R350)) {
  644. tmp |= (RADEON_SCLK_FORCE_HDP |
  645. RADEON_SCLK_FORCE_DISP1 |
  646. RADEON_SCLK_FORCE_DISP2 |
  647. RADEON_SCLK_FORCE_TOP |
  648. RADEON_SCLK_FORCE_IDCT |
  649. RADEON_SCLK_FORCE_VIP);
  650. }
  651. WREG32_PLL(RADEON_SCLK_CNTL, tmp);
  652. udelay(16000);
  653. if ((rdev->family == CHIP_R300) ||
  654. (rdev->family == CHIP_R350)) {
  655. tmp = RREG32_PLL(R300_SCLK_CNTL2);
  656. tmp |= (R300_SCLK_FORCE_TCL |
  657. R300_SCLK_FORCE_GA |
  658. R300_SCLK_FORCE_CBA);
  659. WREG32_PLL(R300_SCLK_CNTL2, tmp);
  660. udelay(16000);
  661. }
  662. if (rdev->flags & RADEON_IS_IGP) {
  663. tmp = RREG32_PLL(RADEON_MCLK_CNTL);
  664. tmp &= ~(RADEON_FORCEON_MCLKA |
  665. RADEON_FORCEON_YCLKA);
  666. WREG32_PLL(RADEON_MCLK_CNTL, tmp);
  667. udelay(16000);
  668. }
  669. if ((rdev->family == CHIP_RV200) ||
  670. (rdev->family == CHIP_RV250) ||
  671. (rdev->family == CHIP_RV280)) {
  672. tmp = RREG32_PLL(RADEON_SCLK_MORE_CNTL);
  673. tmp |= RADEON_SCLK_MORE_FORCEON;
  674. WREG32_PLL(RADEON_SCLK_MORE_CNTL, tmp);
  675. udelay(16000);
  676. }
  677. tmp = RREG32_PLL(RADEON_PIXCLKS_CNTL);
  678. tmp &= ~(RADEON_PIX2CLK_ALWAYS_ONb |
  679. RADEON_PIX2CLK_DAC_ALWAYS_ONb |
  680. RADEON_PIXCLK_BLEND_ALWAYS_ONb |
  681. RADEON_PIXCLK_GV_ALWAYS_ONb |
  682. RADEON_PIXCLK_DIG_TMDS_ALWAYS_ONb |
  683. RADEON_PIXCLK_LVDS_ALWAYS_ONb |
  684. RADEON_PIXCLK_TMDS_ALWAYS_ONb);
  685. WREG32_PLL(RADEON_PIXCLKS_CNTL, tmp);
  686. udelay(16000);
  687. tmp = RREG32_PLL(RADEON_VCLK_ECP_CNTL);
  688. tmp &= ~(RADEON_PIXCLK_ALWAYS_ONb |
  689. RADEON_PIXCLK_DAC_ALWAYS_ONb);
  690. WREG32_PLL(RADEON_VCLK_ECP_CNTL, tmp);
  691. }
  692. }
  693. }
  694. static void radeon_apply_clock_quirks(struct radeon_device *rdev)
  695. {
  696. uint32_t tmp;
  697. /* XXX make sure engine is idle */
  698. if (rdev->family < CHIP_RS600) {
  699. tmp = RREG32_PLL(RADEON_SCLK_CNTL);
  700. if (ASIC_IS_R300(rdev) || ASIC_IS_RV100(rdev))
  701. tmp |= RADEON_SCLK_FORCE_CP | RADEON_SCLK_FORCE_VIP;
  702. if ((rdev->family == CHIP_RV250)
  703. || (rdev->family == CHIP_RV280))
  704. tmp |=
  705. RADEON_SCLK_FORCE_DISP1 | RADEON_SCLK_FORCE_DISP2;
  706. if ((rdev->family == CHIP_RV350)
  707. || (rdev->family == CHIP_RV380))
  708. tmp |= R300_SCLK_FORCE_VAP;
  709. if (rdev->family == CHIP_R420)
  710. tmp |= R300_SCLK_FORCE_PX | R300_SCLK_FORCE_TX;
  711. WREG32_PLL(RADEON_SCLK_CNTL, tmp);
  712. } else if (rdev->family < CHIP_R600) {
  713. tmp = RREG32_PLL(AVIVO_CP_DYN_CNTL);
  714. tmp |= AVIVO_CP_FORCEON;
  715. WREG32_PLL(AVIVO_CP_DYN_CNTL, tmp);
  716. tmp = RREG32_PLL(AVIVO_E2_DYN_CNTL);
  717. tmp |= AVIVO_E2_FORCEON;
  718. WREG32_PLL(AVIVO_E2_DYN_CNTL, tmp);
  719. tmp = RREG32_PLL(AVIVO_IDCT_DYN_CNTL);
  720. tmp |= AVIVO_IDCT_FORCEON;
  721. WREG32_PLL(AVIVO_IDCT_DYN_CNTL, tmp);
  722. }
  723. }
  724. int radeon_static_clocks_init(struct drm_device *dev)
  725. {
  726. struct radeon_device *rdev = dev->dev_private;
  727. /* XXX make sure engine is idle */
  728. if (radeon_dynclks != -1) {
  729. if (radeon_dynclks)
  730. radeon_set_clock_gating(rdev, 1);
  731. }
  732. radeon_apply_clock_quirks(rdev);
  733. return 0;
  734. }