drm/msm: split locking and pinning BO's
authorRob Clark <robdclark@gmail.com>
Mon, 14 Mar 2016 17:56:37 +0000 (13:56 -0400)
committerRob Clark <robdclark@gmail.com>
Sun, 8 May 2016 14:16:03 +0000 (10:16 -0400)
Split up locking and pinning buffers in the submit path.  This is needed
because we'll want to insert fencing in between the two steps.

This makes things end up looking more similar to etnaviv submit code
(which was originally modelled on the msm code but has already added
'struct fence' support).

Signed-off-by: Rob Clark <robdclark@gmail.com>
drivers/gpu/drm/msm/msm_gem.h
drivers/gpu/drm/msm/msm_gem_submit.c

index 6fc59bfeedeb52cb06a2518d53912f5f215a3437..b8904517117d5443ab3db773952c05f75e86b6f9 100644 (file)
@@ -100,7 +100,7 @@ struct msm_gem_submit {
        struct list_head bo_list;
        struct ww_acquire_ctx ticket;
        uint32_t fence;
-       bool valid;
+       bool valid;         /* true if no cmdstream patching needed */
        unsigned int nr_cmds;
        unsigned int nr_bos;
        struct {
index 43d2181231c080fe5f2a246b796c1e3e77e9f570..b231544b3f52dc729d1449080a791be1bc50be63 100644 (file)
@@ -24,7 +24,7 @@
  */
 
 /* make sure these don't conflict w/ MSM_SUBMIT_BO_x */
-#define BO_VALID    0x8000
+#define BO_VALID    0x8000   /* is current addr in cmdstream correct/valid? */
 #define BO_LOCKED   0x4000
 #define BO_PINNED   0x2000
 
@@ -136,16 +136,13 @@ static void submit_unlock_unpin_bo(struct msm_gem_submit *submit, int i)
 }
 
 /* This is where we make sure all the bo's are reserved and pin'd: */
-static int submit_validate_objects(struct msm_gem_submit *submit)
+static int submit_lock_objects(struct msm_gem_submit *submit)
 {
        int contended, slow_locked = -1, i, ret = 0;
 
 retry:
-       submit->valid = true;
-
        for (i = 0; i < submit->nr_bos; i++) {
                struct msm_gem_object *msm_obj = submit->bos[i].obj;
-               uint32_t iova;
 
                if (slow_locked == i)
                        slow_locked = -1;
@@ -159,30 +156,6 @@ retry:
                                goto fail;
                        submit->bos[i].flags |= BO_LOCKED;
                }
-
-
-               /* if locking succeeded, pin bo: */
-               ret = msm_gem_get_iova_locked(&msm_obj->base,
-                               submit->gpu->id, &iova);
-
-               /* this would break the logic in the fail path.. there is no
-                * reason for this to happen, but just to be on the safe side
-                * let's notice if this starts happening in the future:
-                */
-               WARN_ON(ret == -EDEADLK);
-
-               if (ret)
-                       goto fail;
-
-               submit->bos[i].flags |= BO_PINNED;
-
-               if (iova == submit->bos[i].iova) {
-                       submit->bos[i].flags |= BO_VALID;
-               } else {
-                       submit->bos[i].iova = iova;
-                       submit->bos[i].flags &= ~BO_VALID;
-                       submit->valid = false;
-               }
        }
 
        ww_acquire_done(&submit->ticket);
@@ -211,6 +184,38 @@ fail:
        return ret;
 }
 
+static int submit_pin_objects(struct msm_gem_submit *submit)
+{
+       int i, ret = 0;
+
+       submit->valid = true;
+
+       for (i = 0; i < submit->nr_bos; i++) {
+               struct msm_gem_object *msm_obj = submit->bos[i].obj;
+               uint32_t iova;
+
+               /* if locking succeeded, pin bo: */
+               ret = msm_gem_get_iova_locked(&msm_obj->base,
+                               submit->gpu->id, &iova);
+
+               if (ret)
+                       break;
+
+               submit->bos[i].flags |= BO_PINNED;
+
+               if (iova == submit->bos[i].iova) {
+                       submit->bos[i].flags |= BO_VALID;
+               } else {
+                       submit->bos[i].iova = iova;
+                       /* iova changed, so address in cmdstream is not valid: */
+                       submit->bos[i].flags &= ~BO_VALID;
+                       submit->valid = false;
+               }
+       }
+
+       return ret;
+}
+
 static int submit_bo(struct msm_gem_submit *submit, uint32_t idx,
                struct msm_gem_object **obj, uint32_t *iova, bool *valid)
 {
@@ -349,7 +354,11 @@ int msm_ioctl_gem_submit(struct drm_device *dev, void *data,
        if (ret)
                goto out;
 
-       ret = submit_validate_objects(submit);
+       ret = submit_lock_objects(submit);
+       if (ret)
+               goto out;
+
+       ret = submit_pin_objects(submit);
        if (ret)
                goto out;