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