From: "monk.liu" <monk....@amd.com>

Return the index of the first signaled fence in the fences ioctl.
This information is useful in some APIs like Vulkan.

Signed-off-by: monk.liu <monk.liu at amd.com>
Signed-off-by: Alex Deucher <alexander.deucher at amd.com>
---
 drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c | 4 +++-
 drivers/gpu/drm/amd/amdgpu/amdgpu_sa.c | 2 +-
 include/uapi/drm/amdgpu_drm.h          | 3 ++-
 3 files changed, 6 insertions(+), 3 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
index f0c3c356..f748162 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
@@ -1216,6 +1216,7 @@ static int amdgpu_cs_wait_any_fence(struct amdgpu_device 
*adev,
 {
        unsigned long timeout = amdgpu_gem_timeout(wait->in.timeout_ns);
        uint32_t fence_count = wait->in.fence_count;
+       uint32_t first = ~0;
        struct fence **array;
        unsigned i;
        long r;
@@ -1241,13 +1242,14 @@ static int amdgpu_cs_wait_any_fence(struct 
amdgpu_device *adev,
                }
        }

-       r = fence_wait_any_timeout(array, fence_count, true, timeout);
+       r = fence_wait_any_timeout(array, fence_count, true, timeout, &first);
        if (r < 0)
                goto err_free_fence_array;

 out:
        memset(wait, 0, sizeof(*wait));
        wait->out.status = (r > 0);
+       wait->out.first_signaled = first;
        /* set return value 0 to indicate success */
        r = 0;

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_sa.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_sa.c
index d8af37a..ed50d77 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_sa.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_sa.c
@@ -361,7 +361,7 @@ int amdgpu_sa_bo_new(struct amdgpu_sa_manager *sa_manager,
                if (count) {
                        spin_unlock(&sa_manager->wq.lock);
                        t = fence_wait_any_timeout(fences, count, false,
-                                                  MAX_SCHEDULE_TIMEOUT);
+                                                  MAX_SCHEDULE_TIMEOUT, NULL);
                        for (i = 0; i < count; ++i)
                                fence_put(fences[i]);

diff --git a/include/uapi/drm/amdgpu_drm.h b/include/uapi/drm/amdgpu_drm.h
index b726095..bca630c 100644
--- a/include/uapi/drm/amdgpu_drm.h
+++ b/include/uapi/drm/amdgpu_drm.h
@@ -328,7 +328,8 @@ struct drm_amdgpu_wait_fences_in {
 };

 struct drm_amdgpu_wait_fences_out {
-       __u64 status;
+       __u32 status;
+       __u32 first_signaled;
 };

 union drm_amdgpu_wait_fences {
-- 
2.5.5

Reply via email to