summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexandre Courbot <gnurou@gmail.com>2016-02-11 11:10:04 +0900
committerBen Skeggs <bskeggs@redhat.com>2016-02-25 13:22:10 +1000
commitbc51e674a1477137eb68b60e12a338e8c57c251a (patch)
tree7ec64addd690e32f3088e0ccd94ebe029551a1cd
parent88bb3b73debd696c73234b276dd70a41cefe0381 (diff)
downloadnouveau-bc51e674a1477137eb68b60e12a338e8c57c251a.tar.gz
devinit/gf100-: detect if BIOS invoked devinit
It is not advisable to perform devinit if it has already been done. VBIOS will very likely have invoked devinit if the GPU is the primary graphics device, but there is no accurate way to detect this fact yet. This patch adds such a method for gf100 and later chips, by means of the NV_PTOP_SCRATCH1_DEVINIT_COMPLETED bit. This bit is set to 1 by devinit, and reset to 0 when the GPU is powered. Signed-off-by: Alexandre Courbot <acourbot@nvidia.com> Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
-rw-r--r--drm/nouveau/nvkm/subdev/devinit/gf100.c14
-rw-r--r--drm/nouveau/nvkm/subdev/devinit/gm107.c2
-rw-r--r--drm/nouveau/nvkm/subdev/devinit/gm200.c2
-rw-r--r--drm/nouveau/nvkm/subdev/devinit/nv50.h1
4 files changed, 16 insertions, 3 deletions
diff --git a/drm/nouveau/nvkm/subdev/devinit/gf100.c b/drm/nouveau/nvkm/subdev/devinit/gf100.c
index 22b0140e2..2923598b5 100644
--- a/drm/nouveau/nvkm/subdev/devinit/gf100.c
+++ b/drm/nouveau/nvkm/subdev/devinit/gf100.c
@@ -90,9 +90,21 @@ gf100_devinit_disable(struct nvkm_devinit *init)
return disable;
}
+void
+gf100_devinit_preinit(struct nvkm_devinit *base)
+{
+ struct nv50_devinit *init = nv50_devinit(base);
+ struct nvkm_subdev *subdev = &init->base.subdev;
+ struct nvkm_device *device = subdev->device;
+
+ /* This bit is set by devinit, and flips back to 0 on suspend */
+ if (!base->post)
+ base->post = ((nvkm_rd32(device, 0x2240c) & BIT(1)) == 0);
+}
+
static const struct nvkm_devinit_func
gf100_devinit = {
- .preinit = nv50_devinit_preinit,
+ .preinit = gf100_devinit_preinit,
.init = nv50_devinit_init,
.post = nv04_devinit_post,
.pll_set = gf100_devinit_pll_set,
diff --git a/drm/nouveau/nvkm/subdev/devinit/gm107.c b/drm/nouveau/nvkm/subdev/devinit/gm107.c
index 2be98bd78..28ca01be3 100644
--- a/drm/nouveau/nvkm/subdev/devinit/gm107.c
+++ b/drm/nouveau/nvkm/subdev/devinit/gm107.c
@@ -46,7 +46,7 @@ gm107_devinit_disable(struct nvkm_devinit *init)
static const struct nvkm_devinit_func
gm107_devinit = {
- .preinit = nv50_devinit_preinit,
+ .preinit = gf100_devinit_preinit,
.init = nv50_devinit_init,
.post = nv04_devinit_post,
.pll_set = gf100_devinit_pll_set,
diff --git a/drm/nouveau/nvkm/subdev/devinit/gm200.c b/drm/nouveau/nvkm/subdev/devinit/gm200.c
index d3f2e4119..a410c0db8 100644
--- a/drm/nouveau/nvkm/subdev/devinit/gm200.c
+++ b/drm/nouveau/nvkm/subdev/devinit/gm200.c
@@ -166,7 +166,7 @@ gm200_devinit_post(struct nvkm_devinit *base, bool post)
static const struct nvkm_devinit_func
gm200_devinit = {
- .preinit = nv50_devinit_preinit,
+ .preinit = gf100_devinit_preinit,
.init = nv50_devinit_init,
.post = gm200_devinit_post,
.pll_set = gf100_devinit_pll_set,
diff --git a/drm/nouveau/nvkm/subdev/devinit/nv50.h b/drm/nouveau/nvkm/subdev/devinit/nv50.h
index 5de70a848..25d2ae3af 100644
--- a/drm/nouveau/nvkm/subdev/devinit/nv50.h
+++ b/drm/nouveau/nvkm/subdev/devinit/nv50.h
@@ -20,6 +20,7 @@ int gf100_devinit_ctor(struct nvkm_object *, struct nvkm_object *,
struct nvkm_oclass *, void *, u32,
struct nvkm_object **);
int gf100_devinit_pll_set(struct nvkm_devinit *, u32, u32);
+void gf100_devinit_preinit(struct nvkm_devinit *);
u64 gm107_devinit_disable(struct nvkm_devinit *);
#endif