Allow the caller to respond to when the VM update is finished.

Signed-off-by: Timur Kristóf <[email protected]>
---
 drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.c | 4 ++--
 drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c  | 5 ++++-
 drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h  | 2 +-
 drivers/gpu/drm/amd/amdgpu/gmc_v12_1.c  | 4 ++--
 4 files changed, 9 insertions(+), 6 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.c
index d790b7619ccd4..26aea960e2759 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.c
@@ -564,7 +564,7 @@ int amdgpu_gmc_handle_retry_fault(struct amdgpu_device 
*adev,
                }
 
                ret = amdgpu_vm_handle_fault(adev, entry->pasid, entry->vmid, 
node_id,
-                                            addr, entry->timestamp, 
write_fault);
+                                            addr, entry->timestamp, 
write_fault, NULL);
                adev->irq.ih_funcs->retry_cam_ack(adev, cam_index);
                if (ret)
                        return 1;
@@ -587,7 +587,7 @@ int amdgpu_gmc_handle_retry_fault(struct amdgpu_device 
*adev,
                 * tables
                 */
                if (amdgpu_vm_handle_fault(adev, entry->pasid, entry->vmid, 
node_id,
-                                          addr, entry->timestamp, write_fault))
+                                          addr, entry->timestamp, write_fault, 
NULL))
                        return 1;
        }
        return 0;
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
index b523a7b97d6f1..8c3ba7213eb22 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
@@ -2962,13 +2962,14 @@ struct amdgpu_vm *amdgpu_vm_lock_by_pasid(struct 
amdgpu_device *adev,
  *           GFX 9.4.3.
  * @addr: Address of the fault
  * @write_fault: true is write fault, false is read fault
+ * @fence: optional resulting fence, signaled after update is done
  *
  * Try to gracefully handle a VM fault. Return true if the fault was handled 
and
  * shouldn't be reported any more.
  */
 bool amdgpu_vm_handle_fault(struct amdgpu_device *adev, u32 pasid,
                            u32 vmid, u32 node_id, uint64_t addr,
-                           uint64_t ts, bool write_fault)
+                           uint64_t ts, bool write_fault, struct dma_fence 
**fence)
 {
        bool is_compute_context = false;
        struct amdgpu_bo *root;
@@ -3034,6 +3035,8 @@ bool amdgpu_vm_handle_fault(struct amdgpu_device *adev, 
u32 pasid,
 
        r = amdgpu_vm_update_pdes(adev, vm, true);
 
+       *fence = vm->last_update;
+
 error_unlock:
        amdgpu_bo_unreserve(root);
        if (r < 0)
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h
index cc096c005e348..72da6b3d98c70 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h
@@ -589,7 +589,7 @@ void amdgpu_vm_put_task_info(struct amdgpu_task_info 
*task_info);
 
 bool amdgpu_vm_handle_fault(struct amdgpu_device *adev, u32 pasid,
                            u32 vmid, u32 node_id, uint64_t addr, uint64_t ts,
-                           bool write_fault);
+                           bool write_fault, struct dma_fence **fence);
 
 struct amdgpu_vm *amdgpu_vm_lock_by_pasid(struct amdgpu_device *adev,
                                          struct amdgpu_bo **root, u32 pasid);
diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v12_1.c 
b/drivers/gpu/drm/amd/amdgpu/gmc_v12_1.c
index 855cd29cbffaa..da18c02013966 100644
--- a/drivers/gpu/drm/amd/amdgpu/gmc_v12_1.c
+++ b/drivers/gpu/drm/amd/amdgpu/gmc_v12_1.c
@@ -155,7 +155,7 @@ static int gmc_v12_1_process_interrupt(struct amdgpu_device 
*adev,
                        cam_index = entry->src_data[3] & 0x3ff;
 
                        ret = amdgpu_vm_handle_fault(adev, entry->pasid, 
entry->vmid, node_id,
-                                                       addr, entry->timestamp, 
write_fault);
+                                                       addr, entry->timestamp, 
write_fault, NULL);
                        WDOORBELL32(adev->irq.retry_cam_doorbell_index, 
cam_index);
                        if (ret)
                                return 1;
@@ -178,7 +178,7 @@ static int gmc_v12_1_process_interrupt(struct amdgpu_device 
*adev,
                         * tables
                         */
                        if (amdgpu_vm_handle_fault(adev, entry->pasid, 
entry->vmid, node_id,
-                                                  addr, entry->timestamp, 
write_fault))
+                                                  addr, entry->timestamp, 
write_fault, NULL))
                                return 1;
                }
        }
-- 
2.53.0

Reply via email to