diff options
| author | Linux Build Service Account <lnxbuild@localhost> | 2017-02-23 21:35:15 -0800 |
|---|---|---|
| committer | Gerrit - the friendly Code Review server <code-review@localhost> | 2017-02-23 21:35:15 -0800 |
| commit | 9902e5e86535db7917616cc379eab0873b12cf91 (patch) | |
| tree | e827d0f576d707d605bcaba96bb6588d55471cf1 /drivers/gpu | |
| parent | 52f45fc339d32298c3b21a0eddcb6dc5403eb8b5 (diff) | |
| parent | b4c63e6a5d0c6bde597a5043f01da78513c55273 (diff) | |
Merge "drm/msm: Get object iova from correct address space"
Diffstat (limited to 'drivers/gpu')
| -rw-r--r-- | drivers/gpu/drm/msm/msm_drv.c | 30 |
1 files changed, 17 insertions, 13 deletions
diff --git a/drivers/gpu/drm/msm/msm_drv.c b/drivers/gpu/drm/msm/msm_drv.c index 0231ac3f269f..f821a81c53a6 100644 --- a/drivers/gpu/drm/msm/msm_drv.c +++ b/drivers/gpu/drm/msm/msm_drv.c @@ -1192,27 +1192,20 @@ static int msm_ioctl_gem_cpu_fini(struct drm_device *dev, void *data, return ret; } -static int msm_ioctl_gem_info_iova(struct drm_device *dev, - struct drm_gem_object *obj, uint64_t *iova) -{ - struct msm_drm_private *priv = dev->dev_private; - - if (!priv->gpu) - return -EINVAL; - - return msm_gem_get_iova(obj, priv->gpu->aspace, iova); -} - static int msm_ioctl_gem_info(struct drm_device *dev, void *data, struct drm_file *file) { struct drm_msm_gem_info *args = data; struct drm_gem_object *obj; + struct msm_file_private *ctx = file->driver_priv; int ret = 0; if (args->flags & ~MSM_INFO_FLAGS) return -EINVAL; + if (!ctx || !ctx->aspace) + return -EINVAL; + obj = drm_gem_object_lookup(dev, file, args->handle); if (!obj) return -ENOENT; @@ -1220,7 +1213,7 @@ static int msm_ioctl_gem_info(struct drm_device *dev, void *data, if (args->flags & MSM_INFO_IOVA) { uint64_t iova; - ret = msm_ioctl_gem_info_iova(dev, obj, &iova); + ret = msm_gem_get_iova(obj, ctx->aspace, &iova); if (!ret) args->offset = iova; } else { @@ -1236,13 +1229,24 @@ static int msm_ioctl_wait_fence(struct drm_device *dev, void *data, struct drm_file *file) { struct drm_msm_wait_fence *args = data; - ktime_t timeout = to_ktime(args->timeout); + ktime_t timeout; + if (args->pad) { DRM_ERROR("invalid pad: %08x\n", args->pad); return -EINVAL; } + /* + * Special case - if the user passes a timeout of 0.0 just return the + * current fence status (0 for retired, -EBUSY for active) with no + * accompanying kernel logs. This can be a poor man's way of + * determining the status of a fence. + */ + if (args->timeout.tv_sec == 0 && args->timeout.tv_nsec == 0) + return msm_wait_fence(dev, args->fence, NULL, true); + + timeout = to_ktime(args->timeout); return msm_wait_fence(dev, args->fence, &timeout, true); } |
