Commit f0a42bb5 authored by Rob Clark's avatar Rob Clark

drm/msm: submit support for in-fences

Signed-off-by: default avatarRob Clark <robdclark@gmail.com>
parent d9c181e2
...@@ -11,6 +11,7 @@ config DRM_MSM ...@@ -11,6 +11,7 @@ config DRM_MSM
select TMPFS select TMPFS
select QCOM_SCM select QCOM_SCM
select SND_SOC_HDMI_CODEC if SND_SOC select SND_SOC_HDMI_CODEC if SND_SOC
select SYNC_FILE
default y default y
help help
DRM/KMS driver for MSM/snapdragon. DRM/KMS driver for MSM/snapdragon.
......
...@@ -15,6 +15,8 @@ ...@@ -15,6 +15,8 @@
* this program. If not, see <http://www.gnu.org/licenses/>. * this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
#include <linux/sync_file.h>
#include "msm_drv.h" #include "msm_drv.h"
#include "msm_gpu.h" #include "msm_gpu.h"
#include "msm_gem.h" #include "msm_gem.h"
...@@ -361,6 +363,7 @@ int msm_ioctl_gem_submit(struct drm_device *dev, void *data, ...@@ -361,6 +363,7 @@ int msm_ioctl_gem_submit(struct drm_device *dev, void *data,
struct msm_file_private *ctx = file->driver_priv; struct msm_file_private *ctx = file->driver_priv;
struct msm_gem_submit *submit; struct msm_gem_submit *submit;
struct msm_gpu *gpu = priv->gpu; struct msm_gpu *gpu = priv->gpu;
struct fence *in_fence = NULL;
unsigned i; unsigned i;
int ret; int ret;
...@@ -394,9 +397,32 @@ int msm_ioctl_gem_submit(struct drm_device *dev, void *data, ...@@ -394,9 +397,32 @@ int msm_ioctl_gem_submit(struct drm_device *dev, void *data,
if (ret) if (ret)
goto out; goto out;
ret = submit_fence_sync(submit); if (args->flags & MSM_SUBMIT_FENCE_FD_IN) {
if (ret) in_fence = sync_file_get_fence(args->fence_fd);
goto out;
if (!in_fence) {
ret = -EINVAL;
goto out;
}
/* TODO if we get an array-fence due to userspace merging multiple
* fences, we need a way to determine if all the backing fences
* are from our own context..
*/
if (in_fence->context != gpu->fctx->context) {
ret = fence_wait(in_fence, true);
if (ret)
goto out;
}
}
if (!(args->fence & MSM_SUBMIT_NO_IMPLICIT)) {
ret = submit_fence_sync(submit);
if (ret)
goto out;
}
ret = submit_pin_objects(submit); ret = submit_pin_objects(submit);
if (ret) if (ret)
...@@ -467,6 +493,8 @@ int msm_ioctl_gem_submit(struct drm_device *dev, void *data, ...@@ -467,6 +493,8 @@ int msm_ioctl_gem_submit(struct drm_device *dev, void *data,
args->fence = submit->fence->seqno; args->fence = submit->fence->seqno;
out: out:
if (in_fence)
fence_put(in_fence);
submit_cleanup(submit); submit_cleanup(submit);
if (ret) if (ret)
msm_gem_submit_free(submit); msm_gem_submit_free(submit);
......
...@@ -185,8 +185,12 @@ struct drm_msm_gem_submit_bo { ...@@ -185,8 +185,12 @@ struct drm_msm_gem_submit_bo {
}; };
/* Valid submit ioctl flags: */ /* Valid submit ioctl flags: */
/* to start, nothing.. */ #define MSM_SUBMIT_NO_IMPLICIT 0x80000000 /* disable implicit sync */
#define MSM_SUBMIT_FLAGS 0 #define MSM_SUBMIT_FENCE_FD_IN 0x40000000 /* enable input fence_fd */
#define MSM_SUBMIT_FLAGS ( \
MSM_SUBMIT_NO_IMPLICIT | \
MSM_SUBMIT_FENCE_FD_IN | \
0)
/* Each cmdstream submit consists of a table of buffers involved, and /* Each cmdstream submit consists of a table of buffers involved, and
* one or more cmdstream buffers. This allows for conditional execution * one or more cmdstream buffers. This allows for conditional execution
...@@ -199,6 +203,7 @@ struct drm_msm_gem_submit { ...@@ -199,6 +203,7 @@ struct drm_msm_gem_submit {
__u32 nr_cmds; /* in, number of submit_cmd's */ __u32 nr_cmds; /* in, number of submit_cmd's */
__u64 __user bos; /* in, ptr to array of submit_bo's */ __u64 __user bos; /* in, ptr to array of submit_bo's */
__u64 __user cmds; /* in, ptr to array of submit_cmd's */ __u64 __user cmds; /* in, ptr to array of submit_cmd's */
__s32 fence_fd; /* in/out fence fd (see MSM_SUBMIT_FENCE_FD_IN) */
}; };
/* The normal way to synchronize with the GPU is just to CPU_PREP on /* The normal way to synchronize with the GPU is just to CPU_PREP on
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment