Marking the context as guilty currently only makes the application which hits a single timeout problem to stop its rendering context entirely. All jobs submitted later are dropped from the guilty context. Lima runs on fairly underpowered hardware for modern standards and it is not entirely unreasonable that a rendering job may time out occasionally due to high system load or too demanding application stack. In this case it would be generally preferred to report the error but try to keep the application going. Other similar embedded GPU drivers don't make use of the guilty context flag. Now that there are reliability improvements to the lima timeout recovery handling, drop the guilty contexts to let the application keep running in this case. Signed-off-by: Erico Nunes <nunes.erico@gmail.com> Acked-by: Christian König <christian.koenig@amd.com> Reviewed-by: Vasily Khoruzhick <anarsoul@gmail.com> Signed-off-by: Qiang Yu <yuq825@gmail.com> Link: https://patchwork.freedesktop.org/patch/msgid/20240124025947.2110659-7-nunes.erico@gmail.com
112 lines
2.6 KiB
C
112 lines
2.6 KiB
C
/* SPDX-License-Identifier: GPL-2.0 OR MIT */
|
|
/* Copyright 2017-2019 Qiang Yu <yuq825@gmail.com> */
|
|
|
|
#ifndef __LIMA_SCHED_H__
|
|
#define __LIMA_SCHED_H__
|
|
|
|
#include <drm/gpu_scheduler.h>
|
|
#include <linux/list.h>
|
|
#include <linux/xarray.h>
|
|
|
|
struct lima_device;
|
|
struct lima_vm;
|
|
|
|
struct lima_sched_error_task {
|
|
struct list_head list;
|
|
void *data;
|
|
u32 size;
|
|
};
|
|
|
|
struct lima_sched_task {
|
|
struct drm_sched_job base;
|
|
|
|
struct lima_vm *vm;
|
|
void *frame;
|
|
|
|
struct lima_bo **bos;
|
|
int num_bos;
|
|
|
|
bool recoverable;
|
|
struct lima_bo *heap;
|
|
|
|
/* pipe fence */
|
|
struct dma_fence *fence;
|
|
};
|
|
|
|
struct lima_sched_context {
|
|
struct drm_sched_entity base;
|
|
};
|
|
|
|
#define LIMA_SCHED_PIPE_MAX_MMU 8
|
|
#define LIMA_SCHED_PIPE_MAX_L2_CACHE 2
|
|
#define LIMA_SCHED_PIPE_MAX_PROCESSOR 8
|
|
|
|
struct lima_ip;
|
|
|
|
struct lima_sched_pipe {
|
|
struct drm_gpu_scheduler base;
|
|
|
|
u64 fence_context;
|
|
u32 fence_seqno;
|
|
spinlock_t fence_lock;
|
|
|
|
struct lima_device *ldev;
|
|
|
|
struct lima_sched_task *current_task;
|
|
struct lima_vm *current_vm;
|
|
|
|
struct lima_ip *mmu[LIMA_SCHED_PIPE_MAX_MMU];
|
|
int num_mmu;
|
|
|
|
struct lima_ip *l2_cache[LIMA_SCHED_PIPE_MAX_L2_CACHE];
|
|
int num_l2_cache;
|
|
|
|
struct lima_ip *processor[LIMA_SCHED_PIPE_MAX_PROCESSOR];
|
|
int num_processor;
|
|
|
|
struct lima_ip *bcast_processor;
|
|
struct lima_ip *bcast_mmu;
|
|
|
|
u32 done;
|
|
bool error;
|
|
atomic_t task;
|
|
|
|
int frame_size;
|
|
struct kmem_cache *task_slab;
|
|
|
|
int (*task_validate)(struct lima_sched_pipe *pipe, struct lima_sched_task *task);
|
|
void (*task_run)(struct lima_sched_pipe *pipe, struct lima_sched_task *task);
|
|
void (*task_fini)(struct lima_sched_pipe *pipe);
|
|
void (*task_error)(struct lima_sched_pipe *pipe);
|
|
void (*task_mmu_error)(struct lima_sched_pipe *pipe);
|
|
int (*task_recover)(struct lima_sched_pipe *pipe);
|
|
|
|
struct work_struct recover_work;
|
|
};
|
|
|
|
int lima_sched_task_init(struct lima_sched_task *task,
|
|
struct lima_sched_context *context,
|
|
struct lima_bo **bos, int num_bos,
|
|
struct lima_vm *vm);
|
|
void lima_sched_task_fini(struct lima_sched_task *task);
|
|
|
|
int lima_sched_context_init(struct lima_sched_pipe *pipe,
|
|
struct lima_sched_context *context);
|
|
void lima_sched_context_fini(struct lima_sched_pipe *pipe,
|
|
struct lima_sched_context *context);
|
|
struct dma_fence *lima_sched_context_queue_task(struct lima_sched_task *task);
|
|
|
|
int lima_sched_pipe_init(struct lima_sched_pipe *pipe, const char *name);
|
|
void lima_sched_pipe_fini(struct lima_sched_pipe *pipe);
|
|
void lima_sched_pipe_task_done(struct lima_sched_pipe *pipe);
|
|
|
|
static inline void lima_sched_pipe_mmu_error(struct lima_sched_pipe *pipe)
|
|
{
|
|
pipe->error = true;
|
|
pipe->task_mmu_error(pipe);
|
|
}
|
|
|
|
int lima_sched_slab_init(void);
|
|
void lima_sched_slab_fini(void);
|
|
|
|
#endif
|