drm/nouveau/pmu/gt215-: abstract detection of whether reset is needed
authorBen Skeggs <bskeggs@redhat.com>
Fri, 21 Jul 2017 00:45:32 +0000 (10:45 +1000)
committerBen Skeggs <bskeggs@redhat.com>
Tue, 22 Aug 2017 08:04:31 +0000 (18:04 +1000)
GT215, GF100-GP100, and GP10x are all different.

Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
13 files changed:
drivers/gpu/drm/nouveau/nvkm/subdev/pmu/base.c
drivers/gpu/drm/nouveau/nvkm/subdev/pmu/gf100.c
drivers/gpu/drm/nouveau/nvkm/subdev/pmu/gf119.c
drivers/gpu/drm/nouveau/nvkm/subdev/pmu/gk104.c
drivers/gpu/drm/nouveau/nvkm/subdev/pmu/gk110.c
drivers/gpu/drm/nouveau/nvkm/subdev/pmu/gk208.c
drivers/gpu/drm/nouveau/nvkm/subdev/pmu/gk20a.c
drivers/gpu/drm/nouveau/nvkm/subdev/pmu/gm107.c
drivers/gpu/drm/nouveau/nvkm/subdev/pmu/gm20b.c
drivers/gpu/drm/nouveau/nvkm/subdev/pmu/gp100.c
drivers/gpu/drm/nouveau/nvkm/subdev/pmu/gp102.c
drivers/gpu/drm/nouveau/nvkm/subdev/pmu/gt215.c
drivers/gpu/drm/nouveau/nvkm/subdev/pmu/priv.h

index 3306f9f..ce70a19 100644 (file)
@@ -75,7 +75,7 @@ nvkm_pmu_reset(struct nvkm_pmu *pmu)
 {
        struct nvkm_device *device = pmu->subdev.device;
 
-       if (!(nvkm_rd32(device, 0x000200) & 0x00002000))
+       if (!pmu->func->enabled(pmu))
                return 0;
 
        /* Inhibit interrupts, and wait for idle. */
index 976a082..0b45865 100644 (file)
@@ -34,12 +34,19 @@ gf100_pmu_reset(struct nvkm_pmu *pmu)
        nvkm_mc_enable(device, NVKM_SUBDEV_PMU);
 }
 
+bool
+gf100_pmu_enabled(struct nvkm_pmu *pmu)
+{
+       return nvkm_mc_enabled(pmu->subdev.device, NVKM_SUBDEV_PMU);
+}
+
 static const struct nvkm_pmu_func
 gf100_pmu = {
        .code.data = gf100_pmu_code,
        .code.size = sizeof(gf100_pmu_code),
        .data.data = gf100_pmu_data,
        .data.size = sizeof(gf100_pmu_data),
+       .enabled = gf100_pmu_enabled,
        .reset = gf100_pmu_reset,
        .init = gt215_pmu_init,
        .fini = gt215_pmu_fini,
index ca3b4df..3dfa79d 100644 (file)
@@ -30,6 +30,7 @@ gf119_pmu = {
        .code.size = sizeof(gf119_pmu_code),
        .data.data = gf119_pmu_data,
        .data.size = sizeof(gf119_pmu_data),
+       .enabled = gf100_pmu_enabled,
        .reset = gf100_pmu_reset,
        .init = gt215_pmu_init,
        .fini = gt215_pmu_fini,
index c26195d..8f7ec10 100644 (file)
@@ -109,6 +109,7 @@ gk104_pmu = {
        .code.size = sizeof(gk104_pmu_code),
        .data.data = gk104_pmu_data,
        .data.size = sizeof(gk104_pmu_data),
+       .enabled = gf100_pmu_enabled,
        .reset = gf100_pmu_reset,
        .init = gt215_pmu_init,
        .fini = gt215_pmu_fini,
index aac0258..345741d 100644 (file)
@@ -88,6 +88,7 @@ gk110_pmu = {
        .code.size = sizeof(gk110_pmu_code),
        .data.data = gk110_pmu_data,
        .data.size = sizeof(gk110_pmu_data),
+       .enabled = gf100_pmu_enabled,
        .reset = gf100_pmu_reset,
        .init = gt215_pmu_init,
        .fini = gt215_pmu_fini,
index 0efbc0f..e4acf78 100644 (file)
@@ -30,6 +30,7 @@ gk208_pmu = {
        .code.size = sizeof(gk208_pmu_code),
        .data.data = gk208_pmu_data,
        .data.size = sizeof(gk208_pmu_data),
+       .enabled = gf100_pmu_enabled,
        .reset = gf100_pmu_reset,
        .init = gt215_pmu_init,
        .fini = gt215_pmu_fini,
index 1486245..05e8185 100644 (file)
@@ -196,6 +196,7 @@ gk20a_dvfs_data= {
 
 static const struct nvkm_pmu_func
 gk20a_pmu = {
+       .enabled = gf100_pmu_enabled,
        .init = gk20a_pmu_init,
        .fini = gk20a_pmu_fini,
        .reset = gf100_pmu_reset,
index 25e18f2..459df1e 100644 (file)
@@ -32,6 +32,7 @@ gm107_pmu = {
        .code.size = sizeof(gm107_pmu_code),
        .data.data = gm107_pmu_data,
        .data.size = sizeof(gm107_pmu_data),
+       .enabled = gf100_pmu_enabled,
        .reset = gf100_pmu_reset,
        .init = gt215_pmu_init,
        .fini = gt215_pmu_fini,
index 44bef22..31c8431 100644 (file)
@@ -38,6 +38,7 @@ gm20b_pmu_recv(struct nvkm_pmu *pmu)
 
 static const struct nvkm_pmu_func
 gm20b_pmu = {
+       .enabled = gf100_pmu_enabled,
        .intr = gt215_pmu_intr,
        .recv = gm20b_pmu_recv,
 };
index 0e23d5d..e210cd6 100644 (file)
@@ -25,6 +25,7 @@
 
 static const struct nvkm_pmu_func
 gp100_pmu = {
+       .enabled = gf100_pmu_enabled,
        .reset = gf100_pmu_reset,
 };
 
index f017352..98c7a2a 100644 (file)
@@ -31,8 +31,15 @@ gp102_pmu_reset(struct nvkm_pmu *pmu)
        nvkm_mask(device, 0x10a3c0, 0x00000001, 0x00000000);
 }
 
+static bool
+gp102_pmu_enabled(struct nvkm_pmu *pmu)
+{
+       return !(nvkm_rd32(pmu->subdev.device, 0x10a3c0) & 0x00000001);
+}
+
 static const struct nvkm_pmu_func
 gp102_pmu = {
+       .enabled = gp102_pmu_enabled,
        .reset = gp102_pmu_reset,
 };
 
index 9b5d97d..e04216d 100644 (file)
@@ -189,6 +189,12 @@ gt215_pmu_reset(struct nvkm_pmu *pmu)
        nvkm_rd32(device, 0x022210);
 }
 
+static bool
+gt215_pmu_enabled(struct nvkm_pmu *pmu)
+{
+       return nvkm_rd32(pmu->subdev.device, 0x022210) & 0x00000001;
+}
+
 int
 gt215_pmu_init(struct nvkm_pmu *pmu)
 {
@@ -241,6 +247,7 @@ gt215_pmu = {
        .code.size = sizeof(gt215_pmu_code),
        .data.data = gt215_pmu_data,
        .data.size = sizeof(gt215_pmu_data),
+       .enabled = gt215_pmu_enabled,
        .reset = gt215_pmu_reset,
        .init = gt215_pmu_init,
        .fini = gt215_pmu_fini,
index 616641d..a4c48a1 100644 (file)
@@ -20,6 +20,7 @@ struct nvkm_pmu_func {
                u32  size;
        } data;
 
+       bool (*enabled)(struct nvkm_pmu *);
        void (*reset)(struct nvkm_pmu *);
        int (*init)(struct nvkm_pmu *);
        void (*fini)(struct nvkm_pmu *);
@@ -36,6 +37,7 @@ void gt215_pmu_intr(struct nvkm_pmu *);
 void gt215_pmu_recv(struct nvkm_pmu *);
 int gt215_pmu_send(struct nvkm_pmu *, u32[2], u32, u32, u32, u32);
 
+bool gf100_pmu_enabled(struct nvkm_pmu *);
 void gf100_pmu_reset(struct nvkm_pmu *);
 
 void gk110_pmu_pgob(struct nvkm_pmu *, bool);