1b88baab8SDanilo Krummrich /* SPDX-License-Identifier: MIT */
2b88baab8SDanilo Krummrich 
3b88baab8SDanilo Krummrich #ifndef __NOUVEAU_EXEC_H__
4b88baab8SDanilo Krummrich #define __NOUVEAU_EXEC_H__
5b88baab8SDanilo Krummrich 
6b88baab8SDanilo Krummrich #include <drm/drm_exec.h>
7b88baab8SDanilo Krummrich 
8b88baab8SDanilo Krummrich #include "nouveau_drv.h"
9b88baab8SDanilo Krummrich #include "nouveau_sched.h"
10b88baab8SDanilo Krummrich 
11b88baab8SDanilo Krummrich struct nouveau_exec_job_args {
12b88baab8SDanilo Krummrich 	struct drm_file *file_priv;
13b88baab8SDanilo Krummrich 	struct nouveau_sched_entity *sched_entity;
14b88baab8SDanilo Krummrich 
15b88baab8SDanilo Krummrich 	struct drm_exec exec;
16b88baab8SDanilo Krummrich 	struct nouveau_channel *chan;
17b88baab8SDanilo Krummrich 
18b88baab8SDanilo Krummrich 	struct {
19b88baab8SDanilo Krummrich 		struct drm_nouveau_sync *s;
20b88baab8SDanilo Krummrich 		u32 count;
21b88baab8SDanilo Krummrich 	} in_sync;
22b88baab8SDanilo Krummrich 
23b88baab8SDanilo Krummrich 	struct {
24b88baab8SDanilo Krummrich 		struct drm_nouveau_sync *s;
25b88baab8SDanilo Krummrich 		u32 count;
26b88baab8SDanilo Krummrich 	} out_sync;
27b88baab8SDanilo Krummrich 
28b88baab8SDanilo Krummrich 	struct {
29b88baab8SDanilo Krummrich 		struct drm_nouveau_exec_push *s;
30b88baab8SDanilo Krummrich 		u32 count;
31b88baab8SDanilo Krummrich 	} push;
32b88baab8SDanilo Krummrich };
33b88baab8SDanilo Krummrich 
34b88baab8SDanilo Krummrich struct nouveau_exec_job {
35b88baab8SDanilo Krummrich 	struct nouveau_job base;
36b88baab8SDanilo Krummrich 	struct nouveau_fence *fence;
37b88baab8SDanilo Krummrich 	struct nouveau_channel *chan;
38b88baab8SDanilo Krummrich 
39b88baab8SDanilo Krummrich 	struct {
40b88baab8SDanilo Krummrich 		struct drm_nouveau_exec_push *s;
41b88baab8SDanilo Krummrich 		u32 count;
42b88baab8SDanilo Krummrich 	} push;
43b88baab8SDanilo Krummrich };
44b88baab8SDanilo Krummrich 
45b88baab8SDanilo Krummrich #define to_nouveau_exec_job(job)		\
46b88baab8SDanilo Krummrich 		container_of((job), struct nouveau_exec_job, base)
47b88baab8SDanilo Krummrich 
48b88baab8SDanilo Krummrich int nouveau_exec_job_init(struct nouveau_exec_job **job,
49b88baab8SDanilo Krummrich 			  struct nouveau_exec_job_args *args);
50b88baab8SDanilo Krummrich 
51e39701e3SDanilo Krummrich int nouveau_exec_ioctl_exec(struct drm_device *dev, void *data,
52b88baab8SDanilo Krummrich 			    struct drm_file *file_priv);
53b88baab8SDanilo Krummrich 
54*d59e75eeSDanilo Krummrich static inline unsigned int
nouveau_exec_push_max_from_ib_max(int ib_max)55*d59e75eeSDanilo Krummrich nouveau_exec_push_max_from_ib_max(int ib_max)
56*d59e75eeSDanilo Krummrich {
57*d59e75eeSDanilo Krummrich 	/* Limit the number of IBs per job to half the size of the ring in order
58*d59e75eeSDanilo Krummrich 	 * to avoid the ring running dry between submissions and preserve one
59*d59e75eeSDanilo Krummrich 	 * more slot for the job's HW fence.
60*d59e75eeSDanilo Krummrich 	 */
61*d59e75eeSDanilo Krummrich 	return ib_max > 1 ? ib_max / 2 - 1 : 0;
62*d59e75eeSDanilo Krummrich }
63*d59e75eeSDanilo Krummrich 
64b88baab8SDanilo Krummrich #endif
65