radeon_clocks.c 26 KB

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