uint32_t        vm_context0_cntl;
        uint32_t        vm_l2_pro_fault_status;
        uint32_t        vm_l2_pro_fault_cntl;
+
+       /*
+        * store the register distances between two continuous context domain
+        * and invalidation engine.
+        */
+       uint32_t        ctx_distance;
+       uint32_t        ctx_addr_distance; /* include LO32/HI32 */
+       uint32_t        eng_distance;
+       uint32_t        eng_addr_distance; /* include LO32/HI32 */
 };
 
 /*
 
                SOC15_REG_OFFSET(GC, 0, mmVM_L2_PROTECTION_FAULT_STATUS);
        hub->vm_l2_pro_fault_cntl =
                SOC15_REG_OFFSET(GC, 0, mmVM_L2_PROTECTION_FAULT_CNTL);
+
+       hub->ctx_distance = mmVM_CONTEXT1_CNTL - mmVM_CONTEXT0_CNTL;
+       hub->ctx_addr_distance = mmVM_CONTEXT1_PAGE_TABLE_BASE_ADDR_LO32 -
+               mmVM_CONTEXT0_PAGE_TABLE_BASE_ADDR_LO32;
+       hub->eng_distance = mmVM_INVALIDATE_ENG1_REQ - mmVM_INVALIDATE_ENG0_REQ;
+       hub->eng_addr_distance = mmVM_INVALIDATE_ENG1_ADDR_RANGE_LO32 -
+               mmVM_INVALIDATE_ENG0_ADDR_RANGE_LO32;
 }
 
                SOC15_REG_OFFSET(GC, 0, mmGCVM_L2_PROTECTION_FAULT_STATUS);
        hub->vm_l2_pro_fault_cntl =
                SOC15_REG_OFFSET(GC, 0, mmGCVM_L2_PROTECTION_FAULT_CNTL);
+
+       hub->ctx_distance = mmGCVM_CONTEXT1_CNTL - mmGCVM_CONTEXT0_CNTL;
+       hub->ctx_addr_distance = mmGCVM_CONTEXT1_PAGE_TABLE_BASE_ADDR_LO32 -
+               mmGCVM_CONTEXT0_PAGE_TABLE_BASE_ADDR_LO32;
+       hub->eng_distance = mmGCVM_INVALIDATE_ENG1_REQ -
+               mmGCVM_INVALIDATE_ENG0_REQ;
+       hub->eng_addr_distance = mmGCVM_INVALIDATE_ENG1_ADDR_RANGE_LO32 -
+               mmGCVM_INVALIDATE_ENG0_ADDR_RANGE_LO32;
 }
 
                SOC15_REG_OFFSET(GC, 0, mmGCVM_L2_PROTECTION_FAULT_STATUS);
        hub->vm_l2_pro_fault_cntl =
                SOC15_REG_OFFSET(GC, 0, mmGCVM_L2_PROTECTION_FAULT_CNTL);
+
+       hub->ctx_distance = mmGCVM_CONTEXT1_CNTL - mmGCVM_CONTEXT0_CNTL;
+       hub->ctx_addr_distance = mmGCVM_CONTEXT1_PAGE_TABLE_BASE_ADDR_LO32 -
+               mmGCVM_CONTEXT0_PAGE_TABLE_BASE_ADDR_LO32;
+       hub->eng_distance = mmGCVM_INVALIDATE_ENG1_REQ -
+               mmGCVM_INVALIDATE_ENG0_REQ;
+       hub->eng_addr_distance = mmGCVM_INVALIDATE_ENG1_ADDR_RANGE_LO32 -
+               mmGCVM_INVALIDATE_ENG0_ADDR_RANGE_LO32;
 }
 
 int gfxhub_v2_1_get_xgmi_info(struct amdgpu_device *adev)
 
        hub->vm_l2_pro_fault_cntl =
                SOC15_REG_OFFSET(MMHUB, 0, mmVM_L2_PROTECTION_FAULT_CNTL);
 
+       hub->ctx_distance = mmVM_CONTEXT1_CNTL - mmVM_CONTEXT0_CNTL;
+       hub->ctx_addr_distance = mmVM_CONTEXT1_PAGE_TABLE_BASE_ADDR_LO32 -
+               mmVM_CONTEXT0_PAGE_TABLE_BASE_ADDR_LO32;
+       hub->eng_distance = mmVM_INVALIDATE_ENG1_REQ - mmVM_INVALIDATE_ENG0_REQ;
+       hub->eng_addr_distance = mmVM_INVALIDATE_ENG1_ADDR_RANGE_LO32 -
+               mmVM_INVALIDATE_ENG0_ADDR_RANGE_LO32;
 }
 
 static void mmhub_v1_0_update_medium_grain_clock_gating(struct amdgpu_device *adev,
 
        hub->vm_l2_pro_fault_cntl =
                SOC15_REG_OFFSET(MMHUB, 0, mmMMVM_L2_PROTECTION_FAULT_CNTL);
 
+       hub->ctx_distance = mmMMVM_CONTEXT1_CNTL - mmMMVM_CONTEXT0_CNTL;
+       hub->ctx_addr_distance = mmMMVM_CONTEXT1_PAGE_TABLE_BASE_ADDR_LO32 -
+               mmMMVM_CONTEXT0_PAGE_TABLE_BASE_ADDR_LO32;
+       hub->eng_distance = mmMMVM_INVALIDATE_ENG1_REQ -
+               mmMMVM_INVALIDATE_ENG0_REQ;
+       hub->eng_addr_distance = mmMMVM_INVALIDATE_ENG1_ADDR_RANGE_LO32 -
+               mmMMVM_INVALIDATE_ENG0_ADDR_RANGE_LO32;
 }
 
 static void mmhub_v2_0_update_medium_grain_clock_gating(struct amdgpu_device *adev,
 
                        SOC15_REG_OFFSET(MMHUB, 0,
                                    mmVML2PF0_VM_L2_PROTECTION_FAULT_CNTL) +
                                    i * MMHUB_INSTANCE_REGISTER_OFFSET;
+
+               hub[i]->ctx_distance = mmVML2VC0_VM_CONTEXT1_CNTL -
+                       mmVML2VC0_VM_CONTEXT0_CNTL;
+               hub[i]->ctx_addr_distance = mmVML2VC0_VM_CONTEXT1_PAGE_TABLE_BASE_ADDR_LO32 -
+                       mmVML2VC0_VM_CONTEXT0_PAGE_TABLE_BASE_ADDR_LO32;
+               hub[i]->eng_distance = mmVML2VC0_VM_INVALIDATE_ENG1_REQ -
+                       mmVML2VC0_VM_INVALIDATE_ENG0_REQ;
+               hub[i]->eng_addr_distance = mmVML2VC0_VM_INVALIDATE_ENG1_ADDR_RANGE_LO32 -
+                       mmVML2VC0_VM_INVALIDATE_ENG0_ADDR_RANGE_LO32;
        }
 }