aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBen Skeggs <bskeggs@redhat.com>2015-03-20 01:38:23 -0400
committerBen Skeggs <bskeggs@redhat.com>2015-04-14 03:00:51 -0400
commited22e684622533f903dfad9beb99d872536c3040 (patch)
tree1f5890453126ae4639b6f72c390867ab7ed884ba
parentf02a0e849dbd16541a1e75ef8c8719bc5f611219 (diff)
drm/nouveau/gr/gk104-gk20a: call pmu to disable any power-gating before ctor()
On some of these chipsets, reading NV_PGRAPH_GPC_GPM_PD_PES_TPC_ID_MASK can trigger a PRI fault and return an error code instead of a TPC mask, unless PGOB has been disabled first. Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
-rw-r--r--drivers/gpu/drm/nouveau/nvkm/engine/gr/gf100.h3
-rw-r--r--drivers/gpu/drm/nouveau/nvkm/engine/gr/gk104.c13
-rw-r--r--drivers/gpu/drm/nouveau/nvkm/engine/gr/gk110.c2
-rw-r--r--drivers/gpu/drm/nouveau/nvkm/engine/gr/gk110b.c2
-rw-r--r--drivers/gpu/drm/nouveau/nvkm/engine/gr/gk208.c2
5 files changed, 18 insertions, 4 deletions
diff --git a/drivers/gpu/drm/nouveau/nvkm/engine/gr/gf100.h b/drivers/gpu/drm/nouveau/nvkm/engine/gr/gf100.h
index fc821825a3cf..3110f63e00cb 100644
--- a/drivers/gpu/drm/nouveau/nvkm/engine/gr/gf100.h
+++ b/drivers/gpu/drm/nouveau/nvkm/engine/gr/gf100.h
@@ -124,6 +124,9 @@ void gf100_gr_dtor(struct nvkm_object *);
124int gf100_gr_init(struct nvkm_object *); 124int gf100_gr_init(struct nvkm_object *);
125void gf100_gr_zbc_init(struct gf100_gr_priv *); 125void gf100_gr_zbc_init(struct gf100_gr_priv *);
126 126
127int gk104_gr_ctor(struct nvkm_object *, struct nvkm_object *,
128 struct nvkm_oclass *, void *data, u32 size,
129 struct nvkm_object **);
127int gk104_gr_init(struct nvkm_object *); 130int gk104_gr_init(struct nvkm_object *);
128 131
129extern struct nvkm_ofuncs gf100_fermi_ofuncs; 132extern struct nvkm_ofuncs gf100_fermi_ofuncs;
diff --git a/drivers/gpu/drm/nouveau/nvkm/engine/gr/gk104.c b/drivers/gpu/drm/nouveau/nvkm/engine/gr/gk104.c
index 489fdd94b885..9d85238d024a 100644
--- a/drivers/gpu/drm/nouveau/nvkm/engine/gr/gk104.c
+++ b/drivers/gpu/drm/nouveau/nvkm/engine/gr/gk104.c
@@ -310,6 +310,17 @@ gk104_gr_init(struct nvkm_object *object)
310 return gf100_gr_init_ctxctl(priv); 310 return gf100_gr_init_ctxctl(priv);
311} 311}
312 312
313int
314gk104_gr_ctor(struct nvkm_object *parent, struct nvkm_object *engine,
315 struct nvkm_oclass *oclass, void *data, u32 size,
316 struct nvkm_object **pobject)
317{
318 struct nvkm_pmu *pmu = nvkm_pmu(parent);
319 if (pmu)
320 pmu->pgob(pmu, false);
321 return gf100_gr_ctor(parent, engine, oclass, data, size, pobject);
322}
323
313#include "fuc/hubgk104.fuc3.h" 324#include "fuc/hubgk104.fuc3.h"
314 325
315static struct gf100_gr_ucode 326static struct gf100_gr_ucode
@@ -334,7 +345,7 @@ struct nvkm_oclass *
334gk104_gr_oclass = &(struct gf100_gr_oclass) { 345gk104_gr_oclass = &(struct gf100_gr_oclass) {
335 .base.handle = NV_ENGINE(GR, 0xe4), 346 .base.handle = NV_ENGINE(GR, 0xe4),
336 .base.ofuncs = &(struct nvkm_ofuncs) { 347 .base.ofuncs = &(struct nvkm_ofuncs) {
337 .ctor = gf100_gr_ctor, 348 .ctor = gk104_gr_ctor,
338 .dtor = gf100_gr_dtor, 349 .dtor = gf100_gr_dtor,
339 .init = gk104_gr_init, 350 .init = gk104_gr_init,
340 .fini = _nvkm_gr_fini, 351 .fini = _nvkm_gr_fini,
diff --git a/drivers/gpu/drm/nouveau/nvkm/engine/gr/gk110.c b/drivers/gpu/drm/nouveau/nvkm/engine/gr/gk110.c
index 29569ac6b47b..291b60a9262e 100644
--- a/drivers/gpu/drm/nouveau/nvkm/engine/gr/gk110.c
+++ b/drivers/gpu/drm/nouveau/nvkm/engine/gr/gk110.c
@@ -197,7 +197,7 @@ struct nvkm_oclass *
197gk110_gr_oclass = &(struct gf100_gr_oclass) { 197gk110_gr_oclass = &(struct gf100_gr_oclass) {
198 .base.handle = NV_ENGINE(GR, 0xf0), 198 .base.handle = NV_ENGINE(GR, 0xf0),
199 .base.ofuncs = &(struct nvkm_ofuncs) { 199 .base.ofuncs = &(struct nvkm_ofuncs) {
200 .ctor = gf100_gr_ctor, 200 .ctor = gk104_gr_ctor,
201 .dtor = gf100_gr_dtor, 201 .dtor = gf100_gr_dtor,
202 .init = gk104_gr_init, 202 .init = gk104_gr_init,
203 .fini = _nvkm_gr_fini, 203 .fini = _nvkm_gr_fini,
diff --git a/drivers/gpu/drm/nouveau/nvkm/engine/gr/gk110b.c b/drivers/gpu/drm/nouveau/nvkm/engine/gr/gk110b.c
index 7771451af50b..9ff9eab0ccaf 100644
--- a/drivers/gpu/drm/nouveau/nvkm/engine/gr/gk110b.c
+++ b/drivers/gpu/drm/nouveau/nvkm/engine/gr/gk110b.c
@@ -102,7 +102,7 @@ struct nvkm_oclass *
102gk110b_gr_oclass = &(struct gf100_gr_oclass) { 102gk110b_gr_oclass = &(struct gf100_gr_oclass) {
103 .base.handle = NV_ENGINE(GR, 0xf1), 103 .base.handle = NV_ENGINE(GR, 0xf1),
104 .base.ofuncs = &(struct nvkm_ofuncs) { 104 .base.ofuncs = &(struct nvkm_ofuncs) {
105 .ctor = gf100_gr_ctor, 105 .ctor = gk104_gr_ctor,
106 .dtor = gf100_gr_dtor, 106 .dtor = gf100_gr_dtor,
107 .init = gk104_gr_init, 107 .init = gk104_gr_init,
108 .fini = _nvkm_gr_fini, 108 .fini = _nvkm_gr_fini,
diff --git a/drivers/gpu/drm/nouveau/nvkm/engine/gr/gk208.c b/drivers/gpu/drm/nouveau/nvkm/engine/gr/gk208.c
index 31d8e6055376..22d67fd8c323 100644
--- a/drivers/gpu/drm/nouveau/nvkm/engine/gr/gk208.c
+++ b/drivers/gpu/drm/nouveau/nvkm/engine/gr/gk208.c
@@ -176,7 +176,7 @@ struct nvkm_oclass *
176gk208_gr_oclass = &(struct gf100_gr_oclass) { 176gk208_gr_oclass = &(struct gf100_gr_oclass) {
177 .base.handle = NV_ENGINE(GR, 0x08), 177 .base.handle = NV_ENGINE(GR, 0x08),
178 .base.ofuncs = &(struct nvkm_ofuncs) { 178 .base.ofuncs = &(struct nvkm_ofuncs) {
179 .ctor = gf100_gr_ctor, 179 .ctor = gk104_gr_ctor,
180 .dtor = gf100_gr_dtor, 180 .dtor = gf100_gr_dtor,
181 .init = gk104_gr_init, 181 .init = gk104_gr_init,
182 .fini = _nvkm_gr_fini, 182 .fini = _nvkm_gr_fini,