uint32_t vmhub, uint32_t flush_type)
 {
        bool use_semaphore = gmc_v9_0_use_invalidate_semaphore(adev, vmhub);
-       u32 j, inv_req, tmp, sem, req, ack;
+       u32 j, inv_req, tmp, sem, req, ack, inst;
        const unsigned int eng = 17;
        struct amdgpu_vmhub *hub;
 
        /* This is necessary for a HW workaround under SRIOV as well
         * as GFXOFF under bare metal
         */
-       if (adev->gfx.kiq[0].ring.sched.ready &&
+       if (vmhub >= AMDGPU_MMHUB0(0))
+               inst = GET_INST(GC, 0);
+       else
+               inst = vmhub;
+       if (adev->gfx.kiq[inst].ring.sched.ready &&
            (amdgpu_sriov_runtime(adev) || !amdgpu_sriov_vf(adev))) {
                uint32_t req = hub->vm_inv_eng0_req + hub->eng_distance * eng;
                uint32_t ack = hub->vm_inv_eng0_ack + hub->eng_distance * eng;
 
                amdgpu_virt_kiq_reg_write_reg_wait(adev, req, ack, inv_req,
-                                                  1 << vmid);
+                                                  1 << vmid, inst);
                return;
        }
 
                for (j = 0; j < adev->usec_timeout; j++) {
                        /* a read return value of 1 means semaphore acquire */
                        if (vmhub >= AMDGPU_MMHUB0(0))
-                               tmp = RREG32_SOC15_IP_NO_KIQ(MMHUB, sem);
+                               tmp = RREG32_SOC15_IP_NO_KIQ(MMHUB, sem, inst);
                        else
-                               tmp = RREG32_SOC15_IP_NO_KIQ(GC, sem);
+                               tmp = RREG32_SOC15_IP_NO_KIQ(GC, sem, inst);
                        if (tmp & 0x1)
                                break;
                        udelay(1);
        }
 
        if (vmhub >= AMDGPU_MMHUB0(0))
-               WREG32_SOC15_IP_NO_KIQ(MMHUB, req, inv_req);
+               WREG32_SOC15_IP_NO_KIQ(MMHUB, req, inv_req, inst);
        else
-               WREG32_SOC15_IP_NO_KIQ(GC, req, inv_req);
+               WREG32_SOC15_IP_NO_KIQ(GC, req, inv_req, inst);
 
        /*
         * Issue a dummy read to wait for the ACK register to
 
        for (j = 0; j < adev->usec_timeout; j++) {
                if (vmhub >= AMDGPU_MMHUB0(0))
-                       tmp = RREG32_SOC15_IP_NO_KIQ(MMHUB, ack);
+                       tmp = RREG32_SOC15_IP_NO_KIQ(MMHUB, ack, inst);
                else
-                       tmp = RREG32_SOC15_IP_NO_KIQ(GC, ack);
+                       tmp = RREG32_SOC15_IP_NO_KIQ(GC, ack, inst);
                if (tmp & (1 << vmid))
                        break;
                udelay(1);
                 * write with 0 means semaphore release
                 */
                if (vmhub >= AMDGPU_MMHUB0(0))
-                       WREG32_SOC15_IP_NO_KIQ(MMHUB, sem, 0);
+                       WREG32_SOC15_IP_NO_KIQ(MMHUB, sem, 0, inst);
                else
-                       WREG32_SOC15_IP_NO_KIQ(GC, sem, 0);
+                       WREG32_SOC15_IP_NO_KIQ(GC, sem, 0, inst);
        }
 
        spin_unlock(&adev->gmc.invalidate_lock);
 
 
 #define RREG32_SOC15_IP(ip, reg) __RREG32_SOC15_RLC__(reg, 0, ip##_HWIP, 0)
 
-#define RREG32_SOC15_IP_NO_KIQ(ip, reg) __RREG32_SOC15_RLC__(reg, AMDGPU_REGS_NO_KIQ, ip##_HWIP, 0)
+#define RREG32_SOC15_IP_NO_KIQ(ip, reg, inst) __RREG32_SOC15_RLC__(reg, AMDGPU_REGS_NO_KIQ, ip##_HWIP, inst)
 
 #define RREG32_SOC15_NO_KIQ(ip, inst, reg) \
        __RREG32_SOC15_RLC__(adev->reg_offset[ip##_HWIP][inst][reg##_BASE_IDX] + reg, \
 #define WREG32_SOC15_IP(ip, reg, value) \
         __WREG32_SOC15_RLC__(reg, value, 0, ip##_HWIP, 0)
 
-#define WREG32_SOC15_IP_NO_KIQ(ip, reg, value) \
-        __WREG32_SOC15_RLC__(reg, value, AMDGPU_REGS_NO_KIQ, ip##_HWIP, 0)
+#define WREG32_SOC15_IP_NO_KIQ(ip, reg, value, inst) \
+        __WREG32_SOC15_RLC__(reg, value, AMDGPU_REGS_NO_KIQ, ip##_HWIP, inst)
 
 #define WREG32_SOC15_NO_KIQ(ip, inst, reg, value) \
        __WREG32_SOC15_RLC__(adev->reg_offset[ip##_HWIP][inst][reg##_BASE_IDX] + reg, \