diff options
Diffstat (limited to 'drivers/gpu/drm/lima/lima_sched.h')
| -rw-r--r-- | drivers/gpu/drm/lima/lima_sched.h | 102 | 
1 files changed, 102 insertions, 0 deletions
| diff --git a/drivers/gpu/drm/lima/lima_sched.h b/drivers/gpu/drm/lima/lima_sched.h new file mode 100644 index 000000000000..928af91c1118 --- /dev/null +++ b/drivers/gpu/drm/lima/lima_sched.h @@ -0,0 +1,102 @@ +/* SPDX-License-Identifier: GPL-2.0 OR MIT */ +/* Copyright 2017-2019 Qiang Yu <[email protected]> */ + +#ifndef __LIMA_SCHED_H__ +#define __LIMA_SCHED_H__ + +#include <drm/gpu_scheduler.h> + +struct lima_vm; + +struct lima_sched_task { +	struct drm_sched_job base; + +	struct lima_vm *vm; +	void *frame; + +	struct xarray deps; +	unsigned long last_dep; + +	struct lima_bo **bos; +	int num_bos; + +	/* 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_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); + +	struct work_struct error_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, +			    atomic_t *guilty); +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_context *context, +						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 |