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