1 /* SPDX-License-Identifier: GPL-2.0 OR MIT */
2 /* Copyright 2017-2019 Qiang Yu <yuq825@gmail.com> */
4 #ifndef __LIMA_SCHED_H__
5 #define __LIMA_SCHED_H__
7 #include <drm/gpu_scheduler.h>
8 #include <linux/list.h>
9 #include <linux/xarray.h>
14 struct lima_sched_error_task
{
15 struct list_head list
;
20 struct lima_sched_task
{
21 struct drm_sched_job base
;
27 unsigned long last_dep
;
36 struct dma_fence
*fence
;
39 struct lima_sched_context
{
40 struct drm_sched_entity base
;
43 #define LIMA_SCHED_PIPE_MAX_MMU 8
44 #define LIMA_SCHED_PIPE_MAX_L2_CACHE 2
45 #define LIMA_SCHED_PIPE_MAX_PROCESSOR 8
49 struct lima_sched_pipe
{
50 struct drm_gpu_scheduler base
;
54 spinlock_t fence_lock
;
56 struct lima_device
*ldev
;
58 struct lima_sched_task
*current_task
;
59 struct lima_vm
*current_vm
;
61 struct lima_ip
*mmu
[LIMA_SCHED_PIPE_MAX_MMU
];
64 struct lima_ip
*l2_cache
[LIMA_SCHED_PIPE_MAX_L2_CACHE
];
67 struct lima_ip
*processor
[LIMA_SCHED_PIPE_MAX_PROCESSOR
];
70 struct lima_ip
*bcast_processor
;
71 struct lima_ip
*bcast_mmu
;
78 struct kmem_cache
*task_slab
;
80 int (*task_validate
)(struct lima_sched_pipe
*pipe
, struct lima_sched_task
*task
);
81 void (*task_run
)(struct lima_sched_pipe
*pipe
, struct lima_sched_task
*task
);
82 void (*task_fini
)(struct lima_sched_pipe
*pipe
);
83 void (*task_error
)(struct lima_sched_pipe
*pipe
);
84 void (*task_mmu_error
)(struct lima_sched_pipe
*pipe
);
85 int (*task_recover
)(struct lima_sched_pipe
*pipe
);
87 struct work_struct recover_work
;
90 int lima_sched_task_init(struct lima_sched_task
*task
,
91 struct lima_sched_context
*context
,
92 struct lima_bo
**bos
, int num_bos
,
94 void lima_sched_task_fini(struct lima_sched_task
*task
);
96 int lima_sched_context_init(struct lima_sched_pipe
*pipe
,
97 struct lima_sched_context
*context
,
99 void lima_sched_context_fini(struct lima_sched_pipe
*pipe
,
100 struct lima_sched_context
*context
);
101 struct dma_fence
*lima_sched_context_queue_task(struct lima_sched_context
*context
,
102 struct lima_sched_task
*task
);
104 int lima_sched_pipe_init(struct lima_sched_pipe
*pipe
, const char *name
);
105 void lima_sched_pipe_fini(struct lima_sched_pipe
*pipe
);
106 void lima_sched_pipe_task_done(struct lima_sched_pipe
*pipe
);
108 static inline void lima_sched_pipe_mmu_error(struct lima_sched_pipe
*pipe
)
111 pipe
->task_mmu_error(pipe
);
114 int lima_sched_slab_init(void);
115 void lima_sched_slab_fini(void);