int
 nvkm_falcon_reset(struct nvkm_falcon *falcon)
 {
-       nvkm_falcon_disable(falcon);
-       return nvkm_falcon_enable(falcon);
+       if (!falcon->func->reset) {
+               nvkm_falcon_disable(falcon);
+               return nvkm_falcon_enable(falcon);
+       }
+
+       return falcon->func->reset(falcon);
 }
 
 int
 
  */
 #include "priv.h"
 
+static int
+gm200_pmu_flcn_reset(struct nvkm_falcon *falcon)
+{
+       struct nvkm_pmu *pmu = container_of(falcon, typeof(*pmu), falcon);
+
+       nvkm_falcon_wr32(falcon, 0x014, 0x0000ffff);
+       pmu->func->reset(pmu);
+       return nvkm_falcon_enable(falcon);
+}
+
+const struct nvkm_falcon_func
+gm200_pmu_flcn = {
+       .debug = 0xc08,
+       .fbif = 0xe00,
+       .load_imem = nvkm_falcon_v1_load_imem,
+       .load_dmem = nvkm_falcon_v1_load_dmem,
+       .read_dmem = nvkm_falcon_v1_read_dmem,
+       .bind_context = nvkm_falcon_v1_bind_context,
+       .wait_for_halt = nvkm_falcon_v1_wait_for_halt,
+       .clear_interrupt = nvkm_falcon_v1_clear_interrupt,
+       .set_start_addr = nvkm_falcon_v1_set_start_addr,
+       .start = nvkm_falcon_v1_start,
+       .enable = nvkm_falcon_v1_enable,
+       .disable = nvkm_falcon_v1_disable,
+       .reset = gm200_pmu_flcn_reset,
+       .cmdq = { 0x4a0, 0x4b0, 4 },
+       .msgq = { 0x4c8, 0x4cc, 0 },
+};
+
 static const struct nvkm_pmu_func
 gm200_pmu = {
-       .flcn = >215_pmu_flcn,
+       .flcn = &gm200_pmu_flcn,
        .enabled = gf100_pmu_enabled,
        .reset = gf100_pmu_reset,
 };
 
 
 void gk110_pmu_pgob(struct nvkm_pmu *, bool);
 
+extern const struct nvkm_falcon_func gm200_pmu_flcn;
+
 void gm20b_pmu_acr_bld_patch(struct nvkm_acr *, u32, s64);
 void gm20b_pmu_acr_bld_write(struct nvkm_acr *, u32, struct nvkm_acr_lsfw *);
 int gm20b_pmu_acr_boot(struct nvkm_falcon *);