summaryrefslogtreecommitdiff
path: root/drm/nouveau/nvkm
diff options
context:
space:
mode:
authorBen Skeggs <bskeggs@redhat.com>2015-03-20 15:38:23 +1000
committerBen Skeggs <bskeggs@redhat.com>2015-04-13 15:53:45 +1000
commitd004d81a11f7e7b84afd94e58e57967c27264074 (patch)
tree3a2b07c406ec977dc8a19aa8e4fba669662f5854 /drm/nouveau/nvkm
parentb216a37a5086847d61508747042e28773a056176 (diff)
downloadnouveau-d004d81a11f7e7b84afd94e58e57967c27264074.tar.gz
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>
Diffstat (limited to 'drm/nouveau/nvkm')
-rw-r--r--drm/nouveau/nvkm/engine/gr/gf100.h3
-rw-r--r--drm/nouveau/nvkm/engine/gr/gk104.c13
-rw-r--r--drm/nouveau/nvkm/engine/gr/gk110.c2
-rw-r--r--drm/nouveau/nvkm/engine/gr/gk110b.c2
-rw-r--r--drm/nouveau/nvkm/engine/gr/gk208.c2
5 files changed, 18 insertions, 4 deletions
diff --git a/drm/nouveau/nvkm/engine/gr/gf100.h b/drm/nouveau/nvkm/engine/gr/gf100.h
index fc821825a..3110f63e0 100644
--- a/drm/nouveau/nvkm/engine/gr/gf100.h
+++ b/drm/nouveau/nvkm/engine/gr/gf100.h
@@ -124,6 +124,9 @@ void gf100_gr_dtor(struct nvkm_object *);
int gf100_gr_init(struct nvkm_object *);
void gf100_gr_zbc_init(struct gf100_gr_priv *);
+int gk104_gr_ctor(struct nvkm_object *, struct nvkm_object *,
+ struct nvkm_oclass *, void *data, u32 size,
+ struct nvkm_object **);
int gk104_gr_init(struct nvkm_object *);
extern struct nvkm_ofuncs gf100_fermi_ofuncs;
diff --git a/drm/nouveau/nvkm/engine/gr/gk104.c b/drm/nouveau/nvkm/engine/gr/gk104.c
index 489fdd94b..9d85238d0 100644
--- a/drm/nouveau/nvkm/engine/gr/gk104.c
+++ b/drm/nouveau/nvkm/engine/gr/gk104.c
@@ -310,6 +310,17 @@ gk104_gr_init(struct nvkm_object *object)
return gf100_gr_init_ctxctl(priv);
}
+int
+gk104_gr_ctor(struct nvkm_object *parent, struct nvkm_object *engine,
+ struct nvkm_oclass *oclass, void *data, u32 size,
+ struct nvkm_object **pobject)
+{
+ struct nvkm_pmu *pmu = nvkm_pmu(parent);
+ if (pmu)
+ pmu->pgob(pmu, false);
+ return gf100_gr_ctor(parent, engine, oclass, data, size, pobject);
+}
+
#include "fuc/hubgk104.fuc3.h"
static struct gf100_gr_ucode
@@ -334,7 +345,7 @@ struct nvkm_oclass *
gk104_gr_oclass = &(struct gf100_gr_oclass) {
.base.handle = NV_ENGINE(GR, 0xe4),
.base.ofuncs = &(struct nvkm_ofuncs) {
- .ctor = gf100_gr_ctor,
+ .ctor = gk104_gr_ctor,
.dtor = gf100_gr_dtor,
.init = gk104_gr_init,
.fini = _nvkm_gr_fini,
diff --git a/drm/nouveau/nvkm/engine/gr/gk110.c b/drm/nouveau/nvkm/engine/gr/gk110.c
index 29569ac6b..291b60a92 100644
--- a/drm/nouveau/nvkm/engine/gr/gk110.c
+++ b/drm/nouveau/nvkm/engine/gr/gk110.c
@@ -197,7 +197,7 @@ struct nvkm_oclass *
gk110_gr_oclass = &(struct gf100_gr_oclass) {
.base.handle = NV_ENGINE(GR, 0xf0),
.base.ofuncs = &(struct nvkm_ofuncs) {
- .ctor = gf100_gr_ctor,
+ .ctor = gk104_gr_ctor,
.dtor = gf100_gr_dtor,
.init = gk104_gr_init,
.fini = _nvkm_gr_fini,
diff --git a/drm/nouveau/nvkm/engine/gr/gk110b.c b/drm/nouveau/nvkm/engine/gr/gk110b.c
index 7771451af..9ff9eab0c 100644
--- a/drm/nouveau/nvkm/engine/gr/gk110b.c
+++ b/drm/nouveau/nvkm/engine/gr/gk110b.c
@@ -102,7 +102,7 @@ struct nvkm_oclass *
gk110b_gr_oclass = &(struct gf100_gr_oclass) {
.base.handle = NV_ENGINE(GR, 0xf1),
.base.ofuncs = &(struct nvkm_ofuncs) {
- .ctor = gf100_gr_ctor,
+ .ctor = gk104_gr_ctor,
.dtor = gf100_gr_dtor,
.init = gk104_gr_init,
.fini = _nvkm_gr_fini,
diff --git a/drm/nouveau/nvkm/engine/gr/gk208.c b/drm/nouveau/nvkm/engine/gr/gk208.c
index 31d8e6055..22d67fd8c 100644
--- a/drm/nouveau/nvkm/engine/gr/gk208.c
+++ b/drm/nouveau/nvkm/engine/gr/gk208.c
@@ -176,7 +176,7 @@ struct nvkm_oclass *
gk208_gr_oclass = &(struct gf100_gr_oclass) {
.base.handle = NV_ENGINE(GR, 0x08),
.base.ofuncs = &(struct nvkm_ofuncs) {
- .ctor = gf100_gr_ctor,
+ .ctor = gk104_gr_ctor,
.dtor = gf100_gr_dtor,
.init = gk104_gr_init,
.fini = _nvkm_gr_fini,