radeon_clocks.c 25 KB

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