Skip to content

Commit

Permalink
drm/msm: split locking and pinning BO's
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Rob Clark committed May 8, 2016
1 parent 7d12a27 commit 340faef
Show file tree
Hide file tree
Showing 2 changed files with 40 additions and 31 deletions.
2 changes: 1 addition & 1 deletion drivers/gpu/drm/msm/msm_gem.h
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down
69 changes: 39 additions & 30 deletions drivers/gpu/drm/msm/msm_gem_submit.c
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down Expand Up @@ -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;
Expand All @@ -159,30 +156,6 @@ static int submit_validate_objects(struct msm_gem_submit *submit)
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);
Expand Down Expand Up @@ -211,6 +184,38 @@ static int submit_validate_objects(struct msm_gem_submit *submit)
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)
{
Expand Down Expand Up @@ -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;

Expand Down

0 comments on commit 340faef

Please sign in to comment.