diff options
author | Ben Skeggs <bskeggs@redhat.com> | 2012-02-02 19:34:33 -0500 |
---|---|---|
committer | Ben Skeggs <bskeggs@redhat.com> | 2012-05-24 02:31:25 -0400 |
commit | 2b20fd0ab497df5284743975e4204c1c2b03a397 (patch) | |
tree | 9bb0d7112b43b1442e996ab0f9fbac8c32257511 /drivers/gpu/drm/nouveau/nva3_pm.c | |
parent | 5f54d29ee9dace1e2ef4e8c9873ad4dd7a06d11a (diff) |
drm/nva3/pm: initial attempt at handling 111100/111104
Probably not quite right, but this is enough now to make NVS300 reclock
between all 3 of its perflvls correctly.
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
Diffstat (limited to 'drivers/gpu/drm/nouveau/nva3_pm.c')
-rw-r--r-- | drivers/gpu/drm/nouveau/nva3_pm.c | 21 |
1 files changed, 21 insertions, 0 deletions
diff --git a/drivers/gpu/drm/nouveau/nva3_pm.c b/drivers/gpu/drm/nouveau/nva3_pm.c index 3a237887961e..8cbe59a8852b 100644 --- a/drivers/gpu/drm/nouveau/nva3_pm.c +++ b/drivers/gpu/drm/nouveau/nva3_pm.c | |||
@@ -456,6 +456,9 @@ mclk_timing_set(struct nouveau_mem_exec_func *exec) | |||
456 | if (info->ramcfg[2] & 0x02) | 456 | if (info->ramcfg[2] & 0x02) |
457 | unk718 |= 0x00000100; | 457 | unk718 |= 0x00000100; |
458 | nv_wr32(dev, 0x100718, unk718); | 458 | nv_wr32(dev, 0x100718, unk718); |
459 | |||
460 | if (info->ramcfg[2] & 0x10) | ||
461 | nv_wr32(dev, 0x111100, 0x48000000); /*XXX*/ | ||
459 | } | 462 | } |
460 | } | 463 | } |
461 | 464 | ||
@@ -498,15 +501,33 @@ prog_mem(struct drm_device *dev, struct nva3_pm_state *info) | |||
498 | nv_mask(dev, 0x004168, 0x003f3141, ctrl); | 501 | nv_mask(dev, 0x004168, 0x003f3141, ctrl); |
499 | } | 502 | } |
500 | 503 | ||
504 | if (info->ramcfg) { | ||
505 | if (info->ramcfg[2] & 0x10) { | ||
506 | nv_mask(dev, 0x111104, 0x00000600, 0x00000000); | ||
507 | } else { | ||
508 | nv_mask(dev, 0x111100, 0x40000000, 0x40000000); | ||
509 | nv_mask(dev, 0x111104, 0x00000180, 0x00000000); | ||
510 | } | ||
511 | } | ||
501 | if (info->rammap && !(info->rammap[4] & 0x02)) | 512 | if (info->rammap && !(info->rammap[4] & 0x02)) |
502 | nv_mask(dev, 0x100200, 0x00000800, 0x00000000); | 513 | nv_mask(dev, 0x100200, 0x00000800, 0x00000000); |
503 | nv_wr32(dev, 0x611200, 0x00003300); | 514 | nv_wr32(dev, 0x611200, 0x00003300); |
515 | if (!(info->ramcfg[2] & 0x10)) | ||
516 | nv_wr32(dev, 0x111100, 0x4c020000); /*XXX*/ | ||
504 | 517 | ||
505 | nouveau_mem_exec(&exec, info->perflvl); | 518 | nouveau_mem_exec(&exec, info->perflvl); |
506 | 519 | ||
507 | nv_wr32(dev, 0x611200, 0x00003330); | 520 | nv_wr32(dev, 0x611200, 0x00003330); |
508 | if (info->rammap && (info->rammap[4] & 0x02)) | 521 | if (info->rammap && (info->rammap[4] & 0x02)) |
509 | nv_mask(dev, 0x100200, 0x00000800, 0x00000800); | 522 | nv_mask(dev, 0x100200, 0x00000800, 0x00000800); |
523 | if (info->ramcfg) { | ||
524 | if (info->ramcfg[2] & 0x10) { | ||
525 | nv_mask(dev, 0x111104, 0x00000180, 0x00000180); | ||
526 | nv_mask(dev, 0x111100, 0x40000000, 0x00000000); | ||
527 | } else { | ||
528 | nv_mask(dev, 0x111104, 0x00000600, 0x00000600); | ||
529 | } | ||
530 | } | ||
510 | 531 | ||
511 | if (info->mclk.pll) { | 532 | if (info->mclk.pll) { |
512 | nv_mask(dev, 0x004168, 0x00000001, 0x00000000); | 533 | nv_mask(dev, 0x004168, 0x00000001, 0x00000000); |