void amdgpu_device_vram_access(struct amdgpu_device *adev, loff_t pos,
                               uint32_t *buf, size_t size, bool write)
 {
-       uint64_t last;
        unsigned long flags;
+       uint32_t hi = ~0;
+       uint64_t last;
+
+       spin_lock_irqsave(&adev->mmio_idx_lock, flags);
+       for (last = pos + size; pos < last; pos += 4) {
+               uint32_t tmp = pos >> 31;
 
-       last = size - 4;
-       for (last += pos; pos <= last; pos += 4) {
-               spin_lock_irqsave(&adev->mmio_idx_lock, flags);
                WREG32_NO_KIQ(mmMM_INDEX, ((uint32_t)pos) | 0x80000000);
-               WREG32_NO_KIQ(mmMM_INDEX_HI, pos >> 31);
+               if (tmp != hi) {
+                       WREG32_NO_KIQ(mmMM_INDEX_HI, tmp);
+                       hi = tmp;
+               }
                if (write)
                        WREG32_NO_KIQ(mmMM_DATA, *buf++);
                else
                        *buf++ = RREG32_NO_KIQ(mmMM_DATA);
-               spin_unlock_irqrestore(&adev->mmio_idx_lock, flags);
        }
+       spin_unlock_irqrestore(&adev->mmio_idx_lock, flags);
 }
 
 /*