mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-01-06 06:40:08 +01:00
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:
parent
753c8bf834
commit
f54748ea38
2 changed files with 45 additions and 5 deletions
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
{
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue