Browse Source

drm/nouveau/pmu/gt215: fix reset

The NV_PMC_ENABLE bit for PMU did not appear until GF100, and some other
unknown register needs to be poked instead.

Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
Ben Skeggs 8 years ago
parent
commit
715e7d261d

+ 11 - 1
drivers/gpu/drm/nouveau/nvkm/subdev/pmu/gf100.c

@@ -24,13 +24,23 @@
 #include "priv.h"
 #include "priv.h"
 #include "fuc/gf100.fuc3.h"
 #include "fuc/gf100.fuc3.h"
 
 
+#include <subdev/mc.h>
+
+void
+gf100_pmu_reset(struct nvkm_pmu *pmu)
+{
+	struct nvkm_device *device = pmu->subdev.device;
+	nvkm_mc_disable(device, NVKM_SUBDEV_PMU);
+	nvkm_mc_enable(device, NVKM_SUBDEV_PMU);
+}
+
 static const struct nvkm_pmu_func
 static const struct nvkm_pmu_func
 gf100_pmu = {
 gf100_pmu = {
 	.code.data = gf100_pmu_code,
 	.code.data = gf100_pmu_code,
 	.code.size = sizeof(gf100_pmu_code),
 	.code.size = sizeof(gf100_pmu_code),
 	.data.data = gf100_pmu_data,
 	.data.data = gf100_pmu_data,
 	.data.size = sizeof(gf100_pmu_data),
 	.data.size = sizeof(gf100_pmu_data),
-	.reset = gt215_pmu_reset,
+	.reset = gf100_pmu_reset,
 	.init = gt215_pmu_init,
 	.init = gt215_pmu_init,
 	.fini = gt215_pmu_fini,
 	.fini = gt215_pmu_fini,
 	.intr = gt215_pmu_intr,
 	.intr = gt215_pmu_intr,

+ 1 - 1
drivers/gpu/drm/nouveau/nvkm/subdev/pmu/gf119.c

@@ -30,7 +30,7 @@ gf119_pmu = {
 	.code.size = sizeof(gf119_pmu_code),
 	.code.size = sizeof(gf119_pmu_code),
 	.data.data = gf119_pmu_data,
 	.data.data = gf119_pmu_data,
 	.data.size = sizeof(gf119_pmu_data),
 	.data.size = sizeof(gf119_pmu_data),
-	.reset = gt215_pmu_reset,
+	.reset = gf100_pmu_reset,
 	.init = gt215_pmu_init,
 	.init = gt215_pmu_init,
 	.fini = gt215_pmu_fini,
 	.fini = gt215_pmu_fini,
 	.intr = gt215_pmu_intr,
 	.intr = gt215_pmu_intr,

+ 1 - 1
drivers/gpu/drm/nouveau/nvkm/subdev/pmu/gk104.c

@@ -109,7 +109,7 @@ gk104_pmu = {
 	.code.size = sizeof(gk104_pmu_code),
 	.code.size = sizeof(gk104_pmu_code),
 	.data.data = gk104_pmu_data,
 	.data.data = gk104_pmu_data,
 	.data.size = sizeof(gk104_pmu_data),
 	.data.size = sizeof(gk104_pmu_data),
-	.reset = gt215_pmu_reset,
+	.reset = gf100_pmu_reset,
 	.init = gt215_pmu_init,
 	.init = gt215_pmu_init,
 	.fini = gt215_pmu_fini,
 	.fini = gt215_pmu_fini,
 	.intr = gt215_pmu_intr,
 	.intr = gt215_pmu_intr,

+ 1 - 1
drivers/gpu/drm/nouveau/nvkm/subdev/pmu/gk110.c

@@ -88,7 +88,7 @@ gk110_pmu = {
 	.code.size = sizeof(gk110_pmu_code),
 	.code.size = sizeof(gk110_pmu_code),
 	.data.data = gk110_pmu_data,
 	.data.data = gk110_pmu_data,
 	.data.size = sizeof(gk110_pmu_data),
 	.data.size = sizeof(gk110_pmu_data),
-	.reset = gt215_pmu_reset,
+	.reset = gf100_pmu_reset,
 	.init = gt215_pmu_init,
 	.init = gt215_pmu_init,
 	.fini = gt215_pmu_fini,
 	.fini = gt215_pmu_fini,
 	.intr = gt215_pmu_intr,
 	.intr = gt215_pmu_intr,

+ 1 - 1
drivers/gpu/drm/nouveau/nvkm/subdev/pmu/gk208.c

@@ -30,7 +30,7 @@ gk208_pmu = {
 	.code.size = sizeof(gk208_pmu_code),
 	.code.size = sizeof(gk208_pmu_code),
 	.data.data = gk208_pmu_data,
 	.data.data = gk208_pmu_data,
 	.data.size = sizeof(gk208_pmu_data),
 	.data.size = sizeof(gk208_pmu_data),
-	.reset = gt215_pmu_reset,
+	.reset = gf100_pmu_reset,
 	.init = gt215_pmu_init,
 	.init = gt215_pmu_init,
 	.fini = gt215_pmu_fini,
 	.fini = gt215_pmu_fini,
 	.intr = gt215_pmu_intr,
 	.intr = gt215_pmu_intr,

+ 1 - 1
drivers/gpu/drm/nouveau/nvkm/subdev/pmu/gk20a.c

@@ -198,7 +198,7 @@ static const struct nvkm_pmu_func
 gk20a_pmu = {
 gk20a_pmu = {
 	.init = gk20a_pmu_init,
 	.init = gk20a_pmu_init,
 	.fini = gk20a_pmu_fini,
 	.fini = gk20a_pmu_fini,
-	.reset = gt215_pmu_reset,
+	.reset = gf100_pmu_reset,
 };
 };
 
 
 int
 int

+ 1 - 1
drivers/gpu/drm/nouveau/nvkm/subdev/pmu/gm107.c

@@ -32,7 +32,7 @@ gm107_pmu = {
 	.code.size = sizeof(gm107_pmu_code),
 	.code.size = sizeof(gm107_pmu_code),
 	.data.data = gm107_pmu_data,
 	.data.data = gm107_pmu_data,
 	.data.size = sizeof(gm107_pmu_data),
 	.data.size = sizeof(gm107_pmu_data),
-	.reset = gt215_pmu_reset,
+	.reset = gf100_pmu_reset,
 	.init = gt215_pmu_init,
 	.init = gt215_pmu_init,
 	.fini = gt215_pmu_fini,
 	.fini = gt215_pmu_fini,
 	.intr = gt215_pmu_intr,
 	.intr = gt215_pmu_intr,

+ 1 - 1
drivers/gpu/drm/nouveau/nvkm/subdev/pmu/gp100.c

@@ -25,7 +25,7 @@
 
 
 static const struct nvkm_pmu_func
 static const struct nvkm_pmu_func
 gp100_pmu = {
 gp100_pmu = {
-	.reset = gt215_pmu_reset,
+	.reset = gf100_pmu_reset,
 };
 };
 
 
 int
 int

+ 4 - 4
drivers/gpu/drm/nouveau/nvkm/subdev/pmu/gt215.c

@@ -180,13 +180,13 @@ gt215_pmu_fini(struct nvkm_pmu *pmu)
 	nvkm_wr32(pmu->subdev.device, 0x10a014, 0x00000060);
 	nvkm_wr32(pmu->subdev.device, 0x10a014, 0x00000060);
 }
 }
 
 
-void
+static void
 gt215_pmu_reset(struct nvkm_pmu *pmu)
 gt215_pmu_reset(struct nvkm_pmu *pmu)
 {
 {
 	struct nvkm_device *device = pmu->subdev.device;
 	struct nvkm_device *device = pmu->subdev.device;
-	nvkm_mask(device, 0x000200, 0x00002000, 0x00000000);
-	nvkm_mask(device, 0x000200, 0x00002000, 0x00002000);
-	nvkm_rd32(device, 0x000200);
+	nvkm_mask(device, 0x022210, 0x00000001, 0x00000000);
+	nvkm_mask(device, 0x022210, 0x00000001, 0x00000001);
+	nvkm_rd32(device, 0x022210);
 }
 }
 
 
 int
 int

+ 2 - 1
drivers/gpu/drm/nouveau/nvkm/subdev/pmu/priv.h

@@ -30,12 +30,13 @@ struct nvkm_pmu_func {
 	void (*pgob)(struct nvkm_pmu *, bool);
 	void (*pgob)(struct nvkm_pmu *, bool);
 };
 };
 
 
-void gt215_pmu_reset(struct nvkm_pmu *);
 int gt215_pmu_init(struct nvkm_pmu *);
 int gt215_pmu_init(struct nvkm_pmu *);
 void gt215_pmu_fini(struct nvkm_pmu *);
 void gt215_pmu_fini(struct nvkm_pmu *);
 void gt215_pmu_intr(struct nvkm_pmu *);
 void gt215_pmu_intr(struct nvkm_pmu *);
 void gt215_pmu_recv(struct nvkm_pmu *);
 void gt215_pmu_recv(struct nvkm_pmu *);
 int gt215_pmu_send(struct nvkm_pmu *, u32[2], u32, u32, u32, u32);
 int gt215_pmu_send(struct nvkm_pmu *, u32[2], u32, u32, u32, u32);
 
 
+void gf100_pmu_reset(struct nvkm_pmu *);
+
 void gk110_pmu_pgob(struct nvkm_pmu *, bool);
 void gk110_pmu_pgob(struct nvkm_pmu *, bool);
 #endif
 #endif