diff options
author | Ben Skeggs <bskeggs@redhat.com> | 2015-03-20 15:38:23 +1000 |
---|---|---|
committer | Ben Skeggs <bskeggs@redhat.com> | 2015-04-13 15:53:45 +1000 |
commit | d004d81a11f7e7b84afd94e58e57967c27264074 (patch) | |
tree | 3a2b07c406ec977dc8a19aa8e4fba669662f5854 /drm/nouveau/nvkm | |
parent | b216a37a5086847d61508747042e28773a056176 (diff) | |
download | nouveau-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.h | 3 | ||||
-rw-r--r-- | drm/nouveau/nvkm/engine/gr/gk104.c | 13 | ||||
-rw-r--r-- | drm/nouveau/nvkm/engine/gr/gk110.c | 2 | ||||
-rw-r--r-- | drm/nouveau/nvkm/engine/gr/gk110b.c | 2 | ||||
-rw-r--r-- | drm/nouveau/nvkm/engine/gr/gk208.c | 2 |
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, |