1 #ifndef __NV50_KMS_WNDW_H__
2 #define __NV50_KMS_WNDW_H__
3 #define nv50_wndw(p) container_of((p), struct nv50_wndw, plane)
8 #include <nvif/notify.h>
10 struct nv50_wndw_ctxdma
{
11 struct list_head head
;
12 struct nvif_object object
;
16 const struct nv50_wndw_func
*func
;
17 const struct nv50_wimm_func
*immd
;
19 struct nv50_disp_interlock interlock
;
22 struct nvif_object
*parent
;
23 struct list_head list
;
26 struct drm_plane plane
;
30 struct nv50_dmac wndw
;
31 struct nv50_dmac wimm
;
33 struct nvif_notify notify
;
39 int nv50_wndw_new_(const struct nv50_wndw_func
*, struct drm_device
*,
40 enum drm_plane_type
, const char *name
, int index
,
41 const u32
*format
, enum nv50_disp_interlock_type
,
42 u32 interlock_data
, u32 heads
, struct nv50_wndw
**);
43 void nv50_wndw_init(struct nv50_wndw
*);
44 void nv50_wndw_fini(struct nv50_wndw
*);
45 void nv50_wndw_flush_set(struct nv50_wndw
*, u32
*interlock
,
46 struct nv50_wndw_atom
*);
47 void nv50_wndw_flush_clr(struct nv50_wndw
*, u32
*interlock
, bool flush
,
48 struct nv50_wndw_atom
*);
49 void nv50_wndw_ntfy_enable(struct nv50_wndw
*, struct nv50_wndw_atom
*);
50 int nv50_wndw_wait_armed(struct nv50_wndw
*, struct nv50_wndw_atom
*);
52 struct nv50_wndw_func
{
53 int (*acquire
)(struct nv50_wndw
*, struct nv50_wndw_atom
*asyw
,
54 struct nv50_head_atom
*asyh
);
55 void (*release
)(struct nv50_wndw
*, struct nv50_wndw_atom
*asyw
,
56 struct nv50_head_atom
*asyh
);
57 void (*prepare
)(struct nv50_wndw
*, struct nv50_head_atom
*asyh
,
58 struct nv50_wndw_atom
*asyw
);
60 int (*sema_set
)(struct nv50_wndw
*, struct nv50_wndw_atom
*);
61 int (*sema_clr
)(struct nv50_wndw
*);
62 void (*ntfy_reset
)(struct nouveau_bo
*, u32 offset
);
63 int (*ntfy_set
)(struct nv50_wndw
*, struct nv50_wndw_atom
*);
64 int (*ntfy_clr
)(struct nv50_wndw
*);
65 int (*ntfy_wait_begun
)(struct nouveau_bo
*, u32 offset
,
66 struct nvif_device
*);
67 bool (*ilut
)(struct nv50_wndw
*, struct nv50_wndw_atom
*, int);
68 void (*csc
)(struct nv50_wndw
*, struct nv50_wndw_atom
*,
69 const struct drm_color_ctm
*);
70 int (*csc_set
)(struct nv50_wndw
*, struct nv50_wndw_atom
*);
71 int (*csc_clr
)(struct nv50_wndw
*);
75 int (*xlut_set
)(struct nv50_wndw
*, struct nv50_wndw_atom
*);
76 int (*xlut_clr
)(struct nv50_wndw
*);
77 int (*image_set
)(struct nv50_wndw
*, struct nv50_wndw_atom
*);
78 int (*image_clr
)(struct nv50_wndw
*);
79 int (*scale_set
)(struct nv50_wndw
*, struct nv50_wndw_atom
*);
80 int (*blend_set
)(struct nv50_wndw
*, struct nv50_wndw_atom
*);
82 int (*update
)(struct nv50_wndw
*, u32
*interlock
);
85 extern const struct drm_plane_funcs nv50_wndw
;
87 void base507c_ntfy_reset(struct nouveau_bo
*, u32
);
88 int base507c_ntfy_set(struct nv50_wndw
*, struct nv50_wndw_atom
*);
89 int base507c_ntfy_clr(struct nv50_wndw
*);
90 int base507c_ntfy_wait_begun(struct nouveau_bo
*, u32
, struct nvif_device
*);
91 int base507c_image_clr(struct nv50_wndw
*);
92 int base507c_update(struct nv50_wndw
*, u32
*);
94 void base907c_csc(struct nv50_wndw
*, struct nv50_wndw_atom
*,
95 const struct drm_color_ctm
*);
97 struct nv50_wimm_func
{
98 int (*point
)(struct nv50_wndw
*, struct nv50_wndw_atom
*);
100 int (*update
)(struct nv50_wndw
*, u32
*interlock
);
103 extern const struct nv50_wimm_func curs507a
;
104 bool curs507a_space(struct nv50_wndw
*);
106 static inline __must_check
int
107 nvif_chan_wait(struct nv50_dmac
*dmac
, u32 size
)
109 struct nv50_wndw
*wndw
= container_of(dmac
, typeof(*wndw
), wimm
);
110 return curs507a_space(wndw
) ? 0 : -ETIMEDOUT
;
113 int wndwc37e_new(struct nouveau_drm
*, enum drm_plane_type
, int, s32
,
114 struct nv50_wndw
**);
115 int wndwc37e_new_(const struct nv50_wndw_func
*, struct nouveau_drm
*,
116 enum drm_plane_type type
, int index
, s32 oclass
, u32 heads
,
117 struct nv50_wndw
**);
118 int wndwc37e_acquire(struct nv50_wndw
*, struct nv50_wndw_atom
*,
119 struct nv50_head_atom
*);
120 void wndwc37e_release(struct nv50_wndw
*, struct nv50_wndw_atom
*,
121 struct nv50_head_atom
*);
122 int wndwc37e_sema_set(struct nv50_wndw
*, struct nv50_wndw_atom
*);
123 int wndwc37e_sema_clr(struct nv50_wndw
*);
124 int wndwc37e_ntfy_set(struct nv50_wndw
*, struct nv50_wndw_atom
*);
125 int wndwc37e_ntfy_clr(struct nv50_wndw
*);
126 int wndwc37e_image_clr(struct nv50_wndw
*);
127 int wndwc37e_blend_set(struct nv50_wndw
*, struct nv50_wndw_atom
*);
128 int wndwc37e_update(struct nv50_wndw
*, u32
*);
130 int wndwc57e_new(struct nouveau_drm
*, enum drm_plane_type
, int, s32
,
131 struct nv50_wndw
**);
132 bool wndwc57e_ilut(struct nv50_wndw
*, struct nv50_wndw_atom
*, int);
133 int wndwc57e_ilut_set(struct nv50_wndw
*, struct nv50_wndw_atom
*);
134 int wndwc57e_ilut_clr(struct nv50_wndw
*);
135 int wndwc57e_csc_set(struct nv50_wndw
*, struct nv50_wndw_atom
*);
136 int wndwc57e_csc_clr(struct nv50_wndw
*);
138 int wndwc67e_new(struct nouveau_drm
*, enum drm_plane_type
, int, s32
,
139 struct nv50_wndw
**);
141 int nv50_wndw_new(struct nouveau_drm
*, enum drm_plane_type
, int index
,
142 struct nv50_wndw
**);