diff options
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/gpu/drm/nouveau/nva3_pm.c | 19 |
1 files changed, 15 insertions, 4 deletions
diff --git a/drivers/gpu/drm/nouveau/nva3_pm.c b/drivers/gpu/drm/nouveau/nva3_pm.c index 8cbe59a8852b..d51e8f86b4d5 100644 --- a/drivers/gpu/drm/nouveau/nva3_pm.c +++ b/drivers/gpu/drm/nouveau/nva3_pm.c | |||
@@ -248,6 +248,8 @@ struct nva3_pm_state { | |||
248 | u8 rammap_len; | 248 | u8 rammap_len; |
249 | u8 *ramcfg; | 249 | u8 *ramcfg; |
250 | u8 ramcfg_len; | 250 | u8 ramcfg_len; |
251 | u32 r004018; | ||
252 | u32 r100760; | ||
251 | }; | 253 | }; |
252 | 254 | ||
253 | void * | 255 | void * |
@@ -383,19 +385,19 @@ mclk_clock_set(struct nouveau_mem_exec_func *exec) | |||
383 | if (!(ctrl & 0x00000008) && info->mclk.pll) { | 385 | if (!(ctrl & 0x00000008) && info->mclk.pll) { |
384 | nv_wr32(dev, 0x004000, (ctrl |= 0x00000008)); | 386 | nv_wr32(dev, 0x004000, (ctrl |= 0x00000008)); |
385 | nv_mask(dev, 0x1110e0, 0x00088000, 0x00088000); | 387 | nv_mask(dev, 0x1110e0, 0x00088000, 0x00088000); |
386 | nv_wr32(dev, 0x004018, 0x00001000); /*XXX*/ | 388 | nv_wr32(dev, 0x004018, 0x00001000); |
387 | nv_wr32(dev, 0x004000, (ctrl &= ~0x00000001)); | 389 | nv_wr32(dev, 0x004000, (ctrl &= ~0x00000001)); |
388 | nv_wr32(dev, 0x004004, info->mclk.pll); | 390 | nv_wr32(dev, 0x004004, info->mclk.pll); |
389 | nv_wr32(dev, 0x004000, (ctrl |= 0x00000001)); | 391 | nv_wr32(dev, 0x004000, (ctrl |= 0x00000001)); |
390 | udelay(64); | 392 | udelay(64); |
391 | nv_wr32(dev, 0x004018, 0x10005000); /*XXX*/ | 393 | nv_wr32(dev, 0x004018, 0x00005000 | info->r004018); |
392 | udelay(20); | 394 | udelay(20); |
393 | } else | 395 | } else |
394 | if (!info->mclk.pll) { | 396 | if (!info->mclk.pll) { |
395 | nv_mask(dev, 0x004168, 0x003f3040, info->mclk.clk); | 397 | nv_mask(dev, 0x004168, 0x003f3040, info->mclk.clk); |
396 | nv_wr32(dev, 0x004000, (ctrl |= 0x00000008)); | 398 | nv_wr32(dev, 0x004000, (ctrl |= 0x00000008)); |
397 | nv_mask(dev, 0x1110e0, 0x00088000, 0x00088000); | 399 | nv_mask(dev, 0x1110e0, 0x00088000, 0x00088000); |
398 | nv_wr32(dev, 0x004018, 0x1000d000); /*XXX*/ | 400 | nv_wr32(dev, 0x004018, 0x0000d000 | info->r004018); |
399 | } | 401 | } |
400 | 402 | ||
401 | if (info->rammap) { | 403 | if (info->rammap) { |
@@ -414,6 +416,9 @@ mclk_clock_set(struct nouveau_mem_exec_func *exec) | |||
414 | } else { | 416 | } else { |
415 | nv_mask(dev, 0x10053c, 0x00001000, 0x00001000); | 417 | nv_mask(dev, 0x10053c, 0x00001000, 0x00001000); |
416 | nv_mask(dev, 0x10f804, 0x80000000, 0x00000000); | 418 | nv_mask(dev, 0x10f804, 0x80000000, 0x00000000); |
419 | nv_mask(dev, 0x100760, 0x22222222, info->r100760); | ||
420 | nv_mask(dev, 0x1007a0, 0x22222222, info->r100760); | ||
421 | nv_mask(dev, 0x1007e0, 0x22222222, info->r100760); | ||
417 | } | 422 | } |
418 | } | 423 | } |
419 | 424 | ||
@@ -480,6 +485,12 @@ prog_mem(struct drm_device *dev, struct nva3_pm_state *info) | |||
480 | }; | 485 | }; |
481 | u32 ctrl; | 486 | u32 ctrl; |
482 | 487 | ||
488 | /* XXX: where the fuck does 750MHz come from? */ | ||
489 | if (info->perflvl->memory <= 750000) { | ||
490 | info->r004018 = 0x10000000; | ||
491 | info->r100760 = 0x22222222; | ||
492 | } | ||
493 | |||
483 | ctrl = nv_rd32(dev, 0x004000); | 494 | ctrl = nv_rd32(dev, 0x004000); |
484 | if (ctrl & 0x00000008) { | 495 | if (ctrl & 0x00000008) { |
485 | if (info->mclk.pll) { | 496 | if (info->mclk.pll) { |
@@ -489,7 +500,7 @@ prog_mem(struct drm_device *dev, struct nva3_pm_state *info) | |||
489 | nv_wr32(dev, 0x004000, (ctrl &= 0xffffffef)); | 500 | nv_wr32(dev, 0x004000, (ctrl &= 0xffffffef)); |
490 | nv_wait(dev, 0x004000, 0x00020000, 0x00020000); | 501 | nv_wait(dev, 0x004000, 0x00020000, 0x00020000); |
491 | nv_wr32(dev, 0x004000, (ctrl |= 0x00000010)); | 502 | nv_wr32(dev, 0x004000, (ctrl |= 0x00000010)); |
492 | nv_wr32(dev, 0x004018, 0x00005000); /*XXX*/ | 503 | nv_wr32(dev, 0x004018, 0x00005000 | info->r004018); |
493 | nv_wr32(dev, 0x004000, (ctrl |= 0x00000004)); | 504 | nv_wr32(dev, 0x004000, (ctrl |= 0x00000004)); |
494 | } | 505 | } |
495 | } else { | 506 | } else { |