freedreno/drm: Add preemption support

Signed-off-by: Rob Clark <robdclark@chromium.org>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/30544>
This commit is contained in:
Rob Clark 2024-09-25 11:47:41 -07:00 committed by Marge Bot
parent 753c8bf834
commit f54748ea38
2 changed files with 45 additions and 5 deletions

View file

@ -137,10 +137,10 @@ msm_pipe_wait(struct fd_pipe *pipe, const struct fd_fence *fence, uint64_t timeo
}
static int
open_submitqueue(struct fd_pipe *pipe, uint32_t prio)
__open_submitqueue(struct fd_pipe *pipe, uint32_t prio, uint32_t flags)
{
struct drm_msm_submitqueue req = {
.flags = 0,
.flags = flags,
.prio = prio,
};
uint64_t nr_prio = 1;
@ -157,12 +157,31 @@ open_submitqueue(struct fd_pipe *pipe, uint32_t prio)
ret = drmCommandWriteRead(pipe->dev->fd, DRM_MSM_SUBMITQUEUE_NEW, &req,
sizeof(req));
if (ret)
return ret;
to_msm_pipe(pipe)->queue_id = req.id;
return 0;
}
static int
open_submitqueue(struct fd_pipe *pipe, uint32_t prio)
{
const struct fd_dev_info *info = fd_dev_info_raw(&pipe->dev_id);
int ret = -1;
if (info && info->chip >= A7XX)
ret = __open_submitqueue(pipe, prio, MSM_SUBMITQUEUE_ALLOW_PREEMPT);
/* If kernel doesn't support preemption, try again without: */
if (ret)
ret = __open_submitqueue(pipe, prio, 0);
if (ret) {
ERROR_MSG("could not create submitqueue! %d (%s)", ret, strerror(errno));
return ret;
}
to_msm_pipe(pipe)->queue_id = req.id;
return 0;
}

View file

@ -148,12 +148,12 @@ out:
}
static int
open_submitqueue(struct fd_pipe *pipe, uint32_t prio)
__open_submitqueue(struct fd_pipe *pipe, uint32_t prio, uint32_t flags)
{
struct virtio_pipe *virtio_pipe = to_virtio_pipe(pipe);
struct drm_msm_submitqueue req = {
.flags = 0,
.flags = flags,
.prio = prio,
};
uint64_t nr_prio = 1;
@ -175,6 +175,27 @@ open_submitqueue(struct fd_pipe *pipe, uint32_t prio)
return 0;
}
static int
open_submitqueue(struct fd_pipe *pipe, uint32_t prio)
{
const struct fd_dev_info *info = fd_dev_info_raw(&pipe->dev_id);
int ret = -1;
if (info && info->chip >= A7XX)
ret = __open_submitqueue(pipe, prio, MSM_SUBMITQUEUE_ALLOW_PREEMPT);
/* If kernel doesn't support preemption, try again without: */
if (ret)
ret = __open_submitqueue(pipe, prio, 0);
if (ret) {
ERROR_MSG("could not create submitqueue! %d (%s)", ret, strerror(errno));
return ret;
}
return 0;
}
static void
close_submitqueue(struct fd_pipe *pipe, uint32_t queue_id)
{