#include "priv.h"
 #include "fuc/gf100.fuc3.h"
 
+#include <subdev/mc.h>
+
+void
+gf100_pmu_reset(struct nvkm_pmu *pmu)
+{
+       struct nvkm_device *device = pmu->subdev.device;
+       nvkm_mc_disable(device, NVKM_SUBDEV_PMU);
+       nvkm_mc_enable(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),
-       .reset = gt215_pmu_reset,
+       .reset = gf100_pmu_reset,
        .init = gt215_pmu_init,
        .fini = gt215_pmu_fini,
        .intr = gt215_pmu_intr,
 
        .code.size = sizeof(gf119_pmu_code),
        .data.data = gf119_pmu_data,
        .data.size = sizeof(gf119_pmu_data),
-       .reset = gt215_pmu_reset,
+       .reset = gf100_pmu_reset,
        .init = gt215_pmu_init,
        .fini = gt215_pmu_fini,
        .intr = gt215_pmu_intr,
 
        .code.size = sizeof(gk104_pmu_code),
        .data.data = gk104_pmu_data,
        .data.size = sizeof(gk104_pmu_data),
-       .reset = gt215_pmu_reset,
+       .reset = gf100_pmu_reset,
        .init = gt215_pmu_init,
        .fini = gt215_pmu_fini,
        .intr = gt215_pmu_intr,
 
        .code.size = sizeof(gk110_pmu_code),
        .data.data = gk110_pmu_data,
        .data.size = sizeof(gk110_pmu_data),
-       .reset = gt215_pmu_reset,
+       .reset = gf100_pmu_reset,
        .init = gt215_pmu_init,
        .fini = gt215_pmu_fini,
        .intr = gt215_pmu_intr,
 
        .code.size = sizeof(gk208_pmu_code),
        .data.data = gk208_pmu_data,
        .data.size = sizeof(gk208_pmu_data),
-       .reset = gt215_pmu_reset,
+       .reset = gf100_pmu_reset,
        .init = gt215_pmu_init,
        .fini = gt215_pmu_fini,
        .intr = gt215_pmu_intr,
 
 gk20a_pmu = {
        .init = gk20a_pmu_init,
        .fini = gk20a_pmu_fini,
-       .reset = gt215_pmu_reset,
+       .reset = gf100_pmu_reset,
 };
 
 int
 
        .code.size = sizeof(gm107_pmu_code),
        .data.data = gm107_pmu_data,
        .data.size = sizeof(gm107_pmu_data),
-       .reset = gt215_pmu_reset,
+       .reset = gf100_pmu_reset,
        .init = gt215_pmu_init,
        .fini = gt215_pmu_fini,
        .intr = gt215_pmu_intr,
 
 
 static const struct nvkm_pmu_func
 gp100_pmu = {
-       .reset = gt215_pmu_reset,
+       .reset = gf100_pmu_reset,
 };
 
 int
 
        nvkm_wr32(pmu->subdev.device, 0x10a014, 0x00000060);
 }
 
-void
+static void
 gt215_pmu_reset(struct nvkm_pmu *pmu)
 {
        struct nvkm_device *device = pmu->subdev.device;
-       nvkm_mask(device, 0x000200, 0x00002000, 0x00000000);
-       nvkm_mask(device, 0x000200, 0x00002000, 0x00002000);
-       nvkm_rd32(device, 0x000200);
+       nvkm_mask(device, 0x022210, 0x00000001, 0x00000000);
+       nvkm_mask(device, 0x022210, 0x00000001, 0x00000001);
+       nvkm_rd32(device, 0x022210);
 }
 
 int
 
        void (*pgob)(struct nvkm_pmu *, bool);
 };
 
-void gt215_pmu_reset(struct nvkm_pmu *);
 int gt215_pmu_init(struct nvkm_pmu *);
 void gt215_pmu_fini(struct nvkm_pmu *);
 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);
 
+void gf100_pmu_reset(struct nvkm_pmu *);
+
 void gk110_pmu_pgob(struct nvkm_pmu *, bool);
 #endif