drm/msm: submit support for in-fences
Signed-off-by: Rob Clark <robdclark@gmail.com>
This commit is contained in:
parent
d9c181e22a
commit
f0a42bb542
@ -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 @@
|
|||||||
* 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,
|
|||||||
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,
|
|||||||
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,
|
|||||||
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 {
|
|||||||
};
|
};
|
||||||
|
|
||||||
/* 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 {
|
|||||||
__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
|
||||||
|
Loading…
Reference in New Issue
Block a user