summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorben <skeggsb@dhcp-40-153.bne.redhat.com>2015-06-25 09:06:57 +1000
committerBen Skeggs <bskeggs@redhat.com>2015-06-25 09:28:43 +1000
commit64b75967fe13499f12876ec10a31d9141e828714 (patch)
treed544260aa8155c99db884c49c5126aea52818a47
parentce044e891799745be2841dcdd228e5fb7c5b0aee (diff)
-rw-r--r--drm/nouveau/nvkm/subdev/pmu/gk104.c24
1 files changed, 24 insertions, 0 deletions
diff --git a/drm/nouveau/nvkm/subdev/pmu/gk104.c b/drm/nouveau/nvkm/subdev/pmu/gk104.c
index 28fdb8ea..242c094f 100644
--- a/drm/nouveau/nvkm/subdev/pmu/gk104.c
+++ b/drm/nouveau/nvkm/subdev/pmu/gk104.c
@@ -26,6 +26,21 @@
#include "priv.h"
#include "fuc/gf110.fuc4.h"
+#include <subdev/timer.h>
+
+static void
+magic(struct nvkm_pmu *pmu, u32 ctrl, int size)
+{
+ nv_wr32(pmu, 0x00c800, 0x00000000);
+ nv_wr32(pmu, 0x00c808, 0x00000000);
+ nv_wr32(pmu, 0x00c800, ctrl);
+ if (nv_wait(pmu, 0x00c800, 0x40000000, 0x40000000)) {
+ while (size--)
+ nv_wr32(pmu, 0x00c804, 0x00000000);
+ }
+ nv_wr32(pmu, 0x00c800, 0x00000000);
+}
+
static void
gk104_pmu_pgob(struct nvkm_pmu *pmu, bool enable)
{
@@ -48,6 +63,15 @@ gk104_pmu_pgob(struct nvkm_pmu *pmu, bool enable)
nv_mask(pmu, 0x000200, 0x08000000, 0x00000000);
nv_mask(pmu, 0x000200, 0x00001000, 0x00001000);
nv_rd32(pmu, 0x000200);
+
+ if (1) {
+ magic(pmu, 0x8200a41f, 6);
+ magic(pmu, 0x82000421, 1);
+ magic(pmu, 0x8400a41f, 6);
+ magic(pmu, 0x84000421, 1);
+ magic(pmu, 0x8a00a41f, 6);
+ magic(pmu, 0x8a000421, 1);
+ }
}
struct nvkm_oclass *