rm->memory_new = hw->memory_new;
        rm->memory_wrap = hw->memory_wrap;
        rm->zero = false;
+       rm->set_bar0_window_addr = hw->set_bar0_window_addr;
 
        ret = nv50_instmem_new_(rm, device, type, inst, pinstmem);
        if (ret)
 
 
        spin_lock_irqsave(&imem->base.lock, flags);
        if (unlikely(imem->addr != base)) {
-               nvkm_wr32(device, 0x001700, base >> 16);
+               imem->base.func->set_bar0_window_addr(device, base);
                imem->addr = base;
        }
        nvkm_wr32(device, 0x700000 + addr, data);
 
        spin_lock_irqsave(&imem->base.lock, flags);
        if (unlikely(imem->addr != base)) {
-               nvkm_wr32(device, 0x001700, base >> 16);
+               imem->base.func->set_bar0_window_addr(device, base);
                imem->addr = base;
        }
        data = nvkm_rd32(device, 0x700000 + addr);
  * instmem subdev implementation
  *****************************************************************************/
 
+static void
+nv50_instmem_set_bar0_window_addr(struct nvkm_device *device, u64 addr)
+{
+       nvkm_wr32(device, 0x001700, addr >> 16);
+}
+
 static void
 nv50_instmem_fini(struct nvkm_instmem *base)
 {
        .memory_new = nv50_instobj_new,
        .memory_wrap = nv50_instobj_wrap,
        .zero = false,
+       .set_bar0_window_addr = nv50_instmem_set_bar0_window_addr,
 };
 
 int
 
                          bool zero, struct nvkm_memory **);
        int (*memory_wrap)(struct nvkm_instmem *, struct nvkm_memory *, struct nvkm_memory **);
        bool zero;
+       void (*set_bar0_window_addr)(struct nvkm_device *, u64 addr);
 };
 
 int nv50_instmem_new_(const struct nvkm_instmem_func *, struct nvkm_device *,