drm/tegra: Add support for secondary syncpoint

Add support for secondary (non-job tracking) syncpoint used for
NVENC slice encoding.

Bug 3589873

Signed-off-by: Mikko Perttunen <mperttunen@nvidia.com>
Change-Id: I80204c23486dd476c6b67a3897934f301833c7f5
Reviewed-on: https://git-master.nvidia.com/r/c/linux-nvidia/+/2729281
Reviewed-by: svc_kernel_abi <svc_kernel_abi@nvidia.com>
Reviewed-by: Jonathan Hunter <jonathanh@nvidia.com>
GVS: Gerrit_Virtual_Submit
This commit is contained in:
Mikko Perttunen
2022-06-15 14:42:09 +03:00
committed by Laxman Dewangan
parent 9734cc0d92
commit 381919e9c3
3 changed files with 32 additions and 1 deletions

View File

@@ -34,7 +34,7 @@
#define DRIVER_DATE "20120330" #define DRIVER_DATE "20120330"
#define DRIVER_MAJOR 1 #define DRIVER_MAJOR 1
#define DRIVER_MINOR 0 #define DRIVER_MINOR 0
#define DRIVER_PATCHLEVEL 0 #define DRIVER_PATCHLEVEL 99
#define CARVEOUT_SZ SZ_64M #define CARVEOUT_SZ SZ_64M
#define CDMA_GATHER_FETCHES_MAX_NB 16383 #define CDMA_GATHER_FETCHES_MAX_NB 16383

View File

@@ -916,6 +916,8 @@ struct drm_tegra_submit_syncpt {
__u32 value; __u32 value;
}; };
#define DRM_TEGRA_SUBMIT_SECONDARY_SYNCPT (1<<0)
struct drm_tegra_channel_submit { struct drm_tegra_channel_submit {
/** /**
* @context: [in] * @context: [in]
@@ -989,6 +991,20 @@ struct drm_tegra_channel_submit {
* Information about the syncpoint the job will increment. * Information about the syncpoint the job will increment.
*/ */
struct drm_tegra_submit_syncpt syncpt; 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 { struct drm_tegra_syncpoint_allocate {

View File

@@ -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 = host1x_syncpt_get(sp);
job->syncpt_incrs = args->syncpt.increments; 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; return 0;
} }
@@ -532,6 +542,11 @@ int tegra_drm_ioctl_channel_submit(struct drm_device *drm, void *data,
return -EINVAL; return -EINVAL;
} }
if (args->flags & !(DRM_TEGRA_SUBMIT_SECONDARY_SYNCPT)) {
SUBMIT_ERR(context, "invalid flags '%#x'", args->flags);
goto unlock;
}
if (args->syncobj_in) { if (args->syncobj_in) {
struct dma_fence *fence; struct dma_fence *fence;