Commit | Line | Data |
---|---|---|
1590700d BS |
1 | #ifndef __NV50_KMS_WNDW_H__ |
2 | #define __NV50_KMS_WNDW_H__ | |
3 | #define nv50_wndw(p) container_of((p), struct nv50_wndw, plane) | |
4 | #include "disp.h" | |
5 | #include "atom.h" | |
119608a7 | 6 | #include "lut.h" |
1590700d | 7 | |
1590700d BS |
8 | struct nv50_wndw_ctxdma { |
9 | struct list_head head; | |
10 | struct nvif_object object; | |
11 | }; | |
12 | ||
13 | struct nv50_wndw { | |
14 | const struct nv50_wndw_func *func; | |
15 | const struct nv50_wimm_func *immd; | |
16 | int id; | |
53e0a3e7 | 17 | struct nv50_disp_interlock interlock; |
1590700d BS |
18 | |
19 | struct { | |
20 | struct nvif_object *parent; | |
21 | struct list_head list; | |
22 | } ctxdma; | |
23 | ||
24 | struct drm_plane plane; | |
25 | ||
119608a7 BS |
26 | struct nv50_lut ilut; |
27 | ||
1590700d BS |
28 | struct nv50_dmac wndw; |
29 | struct nv50_dmac wimm; | |
30 | ||
1590700d BS |
31 | u16 ntfy; |
32 | u16 sema; | |
33 | u32 data; | |
34 | }; | |
35 | ||
36 | int nv50_wndw_new_(const struct nv50_wndw_func *, struct drm_device *, | |
37 | enum drm_plane_type, const char *name, int index, | |
3638a820 JSS |
38 | const u32 *format, u32 heads, |
39 | enum nv50_disp_interlock_type, u32 interlock_data, | |
40 | struct nv50_wndw **); | |
53e0a3e7 BS |
41 | void nv50_wndw_flush_set(struct nv50_wndw *, u32 *interlock, |
42 | struct nv50_wndw_atom *); | |
43 | void nv50_wndw_flush_clr(struct nv50_wndw *, u32 *interlock, bool flush, | |
44 | struct nv50_wndw_atom *); | |
ccd27db8 | 45 | void nv50_wndw_ntfy_enable(struct nv50_wndw *, struct nv50_wndw_atom *); |
1590700d BS |
46 | int nv50_wndw_wait_armed(struct nv50_wndw *, struct nv50_wndw_atom *); |
47 | ||
48 | struct nv50_wndw_func { | |
49 | int (*acquire)(struct nv50_wndw *, struct nv50_wndw_atom *asyw, | |
50 | struct nv50_head_atom *asyh); | |
51 | void (*release)(struct nv50_wndw *, struct nv50_wndw_atom *asyw, | |
52 | struct nv50_head_atom *asyh); | |
53 | void (*prepare)(struct nv50_wndw *, struct nv50_head_atom *asyh, | |
54 | struct nv50_wndw_atom *asyw); | |
55 | ||
34cf8cae | 56 | int (*sema_set)(struct nv50_wndw *, struct nv50_wndw_atom *); |
c686051a | 57 | int (*sema_clr)(struct nv50_wndw *); |
ccd27db8 | 58 | void (*ntfy_reset)(struct nouveau_bo *, u32 offset); |
fe8a2eec | 59 | int (*ntfy_set)(struct nv50_wndw *, struct nv50_wndw_atom *); |
bcae99c2 | 60 | int (*ntfy_clr)(struct nv50_wndw *); |
ccd27db8 BS |
61 | int (*ntfy_wait_begun)(struct nouveau_bo *, u32 offset, |
62 | struct nvif_device *); | |
79af598a | 63 | void (*ilut)(struct nv50_wndw *wndw, struct nv50_wndw_atom *asyh, int size); |
88b70352 IM |
64 | void (*csc)(struct nv50_wndw *, struct nv50_wndw_atom *, |
65 | const struct drm_color_ctm *); | |
72587dca | 66 | int (*csc_set)(struct nv50_wndw *, struct nv50_wndw_atom *); |
cfb4120d | 67 | int (*csc_clr)(struct nv50_wndw *); |
cb55cd0c | 68 | bool ilut_identity; |
13199270 | 69 | int ilut_size; |
119608a7 | 70 | bool olut_core; |
222439eb | 71 | int (*xlut_set)(struct nv50_wndw *, struct nv50_wndw_atom *); |
34838908 | 72 | int (*xlut_clr)(struct nv50_wndw *); |
6d6e11e2 | 73 | int (*image_set)(struct nv50_wndw *, struct nv50_wndw_atom *); |
8944d8b3 | 74 | int (*image_clr)(struct nv50_wndw *); |
0a4693e8 | 75 | int (*scale_set)(struct nv50_wndw *, struct nv50_wndw_atom *); |
85bdfcd4 | 76 | int (*blend_set)(struct nv50_wndw *, struct nv50_wndw_atom *); |
1590700d | 77 | |
3afb4db7 | 78 | int (*update)(struct nv50_wndw *, u32 *interlock); |
1590700d BS |
79 | }; |
80 | ||
81 | extern const struct drm_plane_funcs nv50_wndw; | |
82 | ||
2ce7f386 | 83 | void base507c_ntfy_reset(struct nouveau_bo *, u32); |
fe8a2eec | 84 | int base507c_ntfy_set(struct nv50_wndw *, struct nv50_wndw_atom *); |
bcae99c2 | 85 | int base507c_ntfy_clr(struct nv50_wndw *); |
2ce7f386 | 86 | int base507c_ntfy_wait_begun(struct nouveau_bo *, u32, struct nvif_device *); |
8944d8b3 | 87 | int base507c_image_clr(struct nv50_wndw *); |
3afb4db7 | 88 | int base507c_update(struct nv50_wndw *, u32 *); |
2ce7f386 | 89 | |
dffa4878 BS |
90 | void base907c_csc(struct nv50_wndw *, struct nv50_wndw_atom *, |
91 | const struct drm_color_ctm *); | |
92 | ||
1590700d | 93 | struct nv50_wimm_func { |
bea8395c | 94 | int (*point)(struct nv50_wndw *, struct nv50_wndw_atom *); |
1590700d | 95 | |
9659be21 | 96 | int (*update)(struct nv50_wndw *, u32 *interlock); |
1590700d | 97 | }; |
2ce7f386 BS |
98 | |
99 | extern const struct nv50_wimm_func curs507a; | |
374b5580 | 100 | bool curs507a_space(struct nv50_wndw *); |
facaed62 | 101 | |
bea8395c BS |
102 | static inline __must_check int |
103 | nvif_chan_wait(struct nv50_dmac *dmac, u32 size) | |
104 | { | |
105 | struct nv50_wndw *wndw = container_of(dmac, typeof(*wndw), wimm); | |
106 | return curs507a_space(wndw) ? 0 : -ETIMEDOUT; | |
107 | } | |
108 | ||
facaed62 BS |
109 | int wndwc37e_new(struct nouveau_drm *, enum drm_plane_type, int, s32, |
110 | struct nv50_wndw **); | |
563737c5 BS |
111 | int wndwc37e_new_(const struct nv50_wndw_func *, struct nouveau_drm *, |
112 | enum drm_plane_type type, int index, s32 oclass, u32 heads, | |
113 | struct nv50_wndw **); | |
114 | int wndwc37e_acquire(struct nv50_wndw *, struct nv50_wndw_atom *, | |
115 | struct nv50_head_atom *); | |
116 | void wndwc37e_release(struct nv50_wndw *, struct nv50_wndw_atom *, | |
117 | struct nv50_head_atom *); | |
34cf8cae | 118 | int wndwc37e_sema_set(struct nv50_wndw *, struct nv50_wndw_atom *); |
c686051a | 119 | int wndwc37e_sema_clr(struct nv50_wndw *); |
fe8a2eec | 120 | int wndwc37e_ntfy_set(struct nv50_wndw *, struct nv50_wndw_atom *); |
bcae99c2 | 121 | int wndwc37e_ntfy_clr(struct nv50_wndw *); |
8944d8b3 | 122 | int wndwc37e_image_clr(struct nv50_wndw *); |
85bdfcd4 | 123 | int wndwc37e_blend_set(struct nv50_wndw *, struct nv50_wndw_atom *); |
3afb4db7 | 124 | int wndwc37e_update(struct nv50_wndw *, u32 *); |
563737c5 BS |
125 | |
126 | int wndwc57e_new(struct nouveau_drm *, enum drm_plane_type, int, s32, | |
127 | struct nv50_wndw **); | |
79af598a | 128 | void wndwc57e_ilut(struct nv50_wndw *, struct nv50_wndw_atom *, int); |
8ef23b6f BS |
129 | int wndwc57e_ilut_set(struct nv50_wndw *, struct nv50_wndw_atom *); |
130 | int wndwc57e_ilut_clr(struct nv50_wndw *); | |
131 | int wndwc57e_csc_set(struct nv50_wndw *, struct nv50_wndw_atom *); | |
132 | int wndwc57e_csc_clr(struct nv50_wndw *); | |
133 | ||
134 | int wndwc67e_new(struct nouveau_drm *, enum drm_plane_type, int, s32, | |
135 | struct nv50_wndw **); | |
facaed62 BS |
136 | |
137 | int nv50_wndw_new(struct nouveau_drm *, enum drm_plane_type, int index, | |
138 | struct nv50_wndw **); | |
1590700d | 139 | #endif |