Merge tag 'powerpc-6.6-6' of git://git.kernel.org/pub/scm/linux/kernel/git/powerpc...
[platform/kernel/linux-starfive.git] / drivers / gpu / drm / nouveau / nouveau_exec.h
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