diff --git a/drivers/gpu/drm/tegra/drm.c b/drivers/gpu/drm/tegra/drm.c index 55e56d19..94a23384 100644 --- a/drivers/gpu/drm/tegra/drm.c +++ b/drivers/gpu/drm/tegra/drm.c @@ -34,7 +34,7 @@ #define DRIVER_DATE "20120330" #define DRIVER_MAJOR 1 #define DRIVER_MINOR 0 -#define DRIVER_PATCHLEVEL 0 +#define DRIVER_PATCHLEVEL 99 #define CARVEOUT_SZ SZ_64M #define CDMA_GATHER_FETCHES_MAX_NB 16383 diff --git a/drivers/gpu/drm/tegra/include/uapi/drm/tegra_drm_next.h b/drivers/gpu/drm/tegra/include/uapi/drm/tegra_drm_next.h index ae6cbab5..eb76cb90 100644 --- a/drivers/gpu/drm/tegra/include/uapi/drm/tegra_drm_next.h +++ b/drivers/gpu/drm/tegra/include/uapi/drm/tegra_drm_next.h @@ -916,6 +916,8 @@ struct drm_tegra_submit_syncpt { __u32 value; }; +#define DRM_TEGRA_SUBMIT_SECONDARY_SYNCPT (1<<0) + struct drm_tegra_channel_submit { /** * @context: [in] @@ -989,6 +991,20 @@ struct drm_tegra_channel_submit { * Information about the syncpoint the job will increment. */ struct drm_tegra_submit_syncpt syncpt; + + /** + * @flags: [in] + * + * Flags. + */ + __u32 flags; + + /** + * @secondary_syncpt_id: [in] + * + * Secondary syncpoint the job may increment, not used for job tracking. + */ + __u32 secondary_syncpt_id; }; struct drm_tegra_syncpoint_allocate { diff --git a/drivers/gpu/drm/tegra/submit.c b/drivers/gpu/drm/tegra/submit.c index 0f66ccbf..60f54772 100644 --- a/drivers/gpu/drm/tegra/submit.c +++ b/drivers/gpu/drm/tegra/submit.c @@ -350,6 +350,16 @@ static int submit_get_syncpt(struct tegra_drm_context *context, struct host1x_jo job->syncpt = host1x_syncpt_get(sp); job->syncpt_incrs = args->syncpt.increments; + if (args->flags & DRM_TEGRA_SUBMIT_SECONDARY_SYNCPT) { + sp = xa_load(syncpoints, args->secondary_syncpt_id); + if (!sp) { + SUBMIT_ERR(context, "secondary syncpt was not allocated"); + return -EINVAL; + } + + job->secondary_syncpt = host1x_syncpt_get(sp); + } + return 0; } @@ -532,6 +542,11 @@ int tegra_drm_ioctl_channel_submit(struct drm_device *drm, void *data, return -EINVAL; } + if (args->flags & !(DRM_TEGRA_SUBMIT_SECONDARY_SYNCPT)) { + SUBMIT_ERR(context, "invalid flags '%#x'", args->flags); + goto unlock; + } + if (args->syncobj_in) { struct dma_fence *fence;