radeon_clocks.c 27 KB

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