diff options
author | Ben Skeggs <bskeggs@redhat.com> | 2015-03-20 01:38:23 -0400 |
---|---|---|
committer | Ben Skeggs <bskeggs@redhat.com> | 2015-04-14 03:00:51 -0400 |
commit | ed22e684622533f903dfad9beb99d872536c3040 (patch) | |
tree | 1f5890453126ae4639b6f72c390867ab7ed884ba | |
parent | f02a0e849dbd16541a1e75ef8c8719bc5f611219 (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.h | 3 | ||||
-rw-r--r-- | drivers/gpu/drm/nouveau/nvkm/engine/gr/gk104.c | 13 | ||||
-rw-r--r-- | drivers/gpu/drm/nouveau/nvkm/engine/gr/gk110.c | 2 | ||||
-rw-r--r-- | drivers/gpu/drm/nouveau/nvkm/engine/gr/gk110b.c | 2 | ||||
-rw-r--r-- | drivers/gpu/drm/nouveau/nvkm/engine/gr/gk208.c | 2 |
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 *); | |||
124 | int gf100_gr_init(struct nvkm_object *); | 124 | int gf100_gr_init(struct nvkm_object *); |
125 | void gf100_gr_zbc_init(struct gf100_gr_priv *); | 125 | void gf100_gr_zbc_init(struct gf100_gr_priv *); |
126 | 126 | ||
127 | int gk104_gr_ctor(struct nvkm_object *, struct nvkm_object *, | ||
128 | struct nvkm_oclass *, void *data, u32 size, | ||
129 | struct nvkm_object **); | ||
127 | int gk104_gr_init(struct nvkm_object *); | 130 | int gk104_gr_init(struct nvkm_object *); |
128 | 131 | ||
129 | extern struct nvkm_ofuncs gf100_fermi_ofuncs; | 132 | extern 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 | ||
313 | int | ||
314 | gk104_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 | ||
315 | static struct gf100_gr_ucode | 326 | static struct gf100_gr_ucode |
@@ -334,7 +345,7 @@ struct nvkm_oclass * | |||
334 | gk104_gr_oclass = &(struct gf100_gr_oclass) { | 345 | gk104_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 * | |||
197 | gk110_gr_oclass = &(struct gf100_gr_oclass) { | 197 | gk110_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 * | |||
102 | gk110b_gr_oclass = &(struct gf100_gr_oclass) { | 102 | gk110b_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 * | |||
176 | gk208_gr_oclass = &(struct gf100_gr_oclass) { | 176 | gk208_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, |