1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20#ifndef DRM_ATMEL_HLCDC_LAYER_H
21#define DRM_ATMEL_HLCDC_LAYER_H
22
23#include <linux/mfd/atmel-hlcdc.h>
24
25#include <drm/drm_crtc.h>
26#include <drm/drm_flip_work.h>
27#include <drm/drmP.h>
28
29#define ATMEL_HLCDC_LAYER_CHER 0x0
30#define ATMEL_HLCDC_LAYER_CHDR 0x4
31#define ATMEL_HLCDC_LAYER_CHSR 0x8
32#define ATMEL_HLCDC_LAYER_DMA_CHAN BIT(0)
33#define ATMEL_HLCDC_LAYER_UPDATE BIT(1)
34#define ATMEL_HLCDC_LAYER_A2Q BIT(2)
35#define ATMEL_HLCDC_LAYER_RST BIT(8)
36
37#define ATMEL_HLCDC_LAYER_IER 0xc
38#define ATMEL_HLCDC_LAYER_IDR 0x10
39#define ATMEL_HLCDC_LAYER_IMR 0x14
40#define ATMEL_HLCDC_LAYER_ISR 0x18
41#define ATMEL_HLCDC_LAYER_DFETCH BIT(0)
42#define ATMEL_HLCDC_LAYER_LFETCH BIT(1)
43#define ATMEL_HLCDC_LAYER_DMA_IRQ BIT(2)
44#define ATMEL_HLCDC_LAYER_DSCR_IRQ BIT(3)
45#define ATMEL_HLCDC_LAYER_ADD_IRQ BIT(4)
46#define ATMEL_HLCDC_LAYER_DONE_IRQ BIT(5)
47#define ATMEL_HLCDC_LAYER_OVR_IRQ BIT(6)
48
49#define ATMEL_HLCDC_LAYER_PLANE_HEAD(n) (((n) * 0x10) + 0x1c)
50#define ATMEL_HLCDC_LAYER_PLANE_ADDR(n) (((n) * 0x10) + 0x20)
51#define ATMEL_HLCDC_LAYER_PLANE_CTRL(n) (((n) * 0x10) + 0x24)
52#define ATMEL_HLCDC_LAYER_PLANE_NEXT(n) (((n) * 0x10) + 0x28)
53#define ATMEL_HLCDC_LAYER_CFG(p, c) (((c) * 4) + ((p)->max_planes * 0x10) + 0x1c)
54
55#define ATMEL_HLCDC_LAYER_DMA_CFG_ID 0
56#define ATMEL_HLCDC_LAYER_DMA_CFG(p) ATMEL_HLCDC_LAYER_CFG(p, ATMEL_HLCDC_LAYER_DMA_CFG_ID)
57#define ATMEL_HLCDC_LAYER_DMA_SIF BIT(0)
58#define ATMEL_HLCDC_LAYER_DMA_BLEN_MASK GENMASK(5, 4)
59#define ATMEL_HLCDC_LAYER_DMA_BLEN_SINGLE (0 << 4)
60#define ATMEL_HLCDC_LAYER_DMA_BLEN_INCR4 (1 << 4)
61#define ATMEL_HLCDC_LAYER_DMA_BLEN_INCR8 (2 << 4)
62#define ATMEL_HLCDC_LAYER_DMA_BLEN_INCR16 (3 << 4)
63#define ATMEL_HLCDC_LAYER_DMA_DLBO BIT(8)
64#define ATMEL_HLCDC_LAYER_DMA_ROTDIS BIT(12)
65#define ATMEL_HLCDC_LAYER_DMA_LOCKDIS BIT(13)
66
67#define ATMEL_HLCDC_LAYER_FORMAT_CFG_ID 1
68#define ATMEL_HLCDC_LAYER_FORMAT_CFG(p) ATMEL_HLCDC_LAYER_CFG(p, ATMEL_HLCDC_LAYER_FORMAT_CFG_ID)
69#define ATMEL_HLCDC_LAYER_RGB (0 << 0)
70#define ATMEL_HLCDC_LAYER_CLUT (1 << 0)
71#define ATMEL_HLCDC_LAYER_YUV (2 << 0)
72#define ATMEL_HLCDC_RGB_MODE(m) (((m) & 0xf) << 4)
73#define ATMEL_HLCDC_CLUT_MODE(m) (((m) & 0x3) << 8)
74#define ATMEL_HLCDC_YUV_MODE(m) (((m) & 0xf) << 12)
75#define ATMEL_HLCDC_YUV422ROT BIT(16)
76#define ATMEL_HLCDC_YUV422SWP BIT(17)
77#define ATMEL_HLCDC_DSCALEOPT BIT(20)
78
79#define ATMEL_HLCDC_XRGB4444_MODE (ATMEL_HLCDC_LAYER_RGB | ATMEL_HLCDC_RGB_MODE(0))
80#define ATMEL_HLCDC_ARGB4444_MODE (ATMEL_HLCDC_LAYER_RGB | ATMEL_HLCDC_RGB_MODE(1))
81#define ATMEL_HLCDC_RGBA4444_MODE (ATMEL_HLCDC_LAYER_RGB | ATMEL_HLCDC_RGB_MODE(2))
82#define ATMEL_HLCDC_RGB565_MODE (ATMEL_HLCDC_LAYER_RGB | ATMEL_HLCDC_RGB_MODE(3))
83#define ATMEL_HLCDC_ARGB1555_MODE (ATMEL_HLCDC_LAYER_RGB | ATMEL_HLCDC_RGB_MODE(4))
84#define ATMEL_HLCDC_XRGB8888_MODE (ATMEL_HLCDC_LAYER_RGB | ATMEL_HLCDC_RGB_MODE(9))
85#define ATMEL_HLCDC_RGB888_MODE (ATMEL_HLCDC_LAYER_RGB | ATMEL_HLCDC_RGB_MODE(10))
86#define ATMEL_HLCDC_ARGB8888_MODE (ATMEL_HLCDC_LAYER_RGB | ATMEL_HLCDC_RGB_MODE(12))
87#define ATMEL_HLCDC_RGBA8888_MODE (ATMEL_HLCDC_LAYER_RGB | ATMEL_HLCDC_RGB_MODE(13))
88
89#define ATMEL_HLCDC_AYUV_MODE (ATMEL_HLCDC_LAYER_YUV | ATMEL_HLCDC_YUV_MODE(0))
90#define ATMEL_HLCDC_YUYV_MODE (ATMEL_HLCDC_LAYER_YUV | ATMEL_HLCDC_YUV_MODE(1))
91#define ATMEL_HLCDC_UYVY_MODE (ATMEL_HLCDC_LAYER_YUV | ATMEL_HLCDC_YUV_MODE(2))
92#define ATMEL_HLCDC_YVYU_MODE (ATMEL_HLCDC_LAYER_YUV | ATMEL_HLCDC_YUV_MODE(3))
93#define ATMEL_HLCDC_VYUY_MODE (ATMEL_HLCDC_LAYER_YUV | ATMEL_HLCDC_YUV_MODE(4))
94#define ATMEL_HLCDC_NV61_MODE (ATMEL_HLCDC_LAYER_YUV | ATMEL_HLCDC_YUV_MODE(5))
95#define ATMEL_HLCDC_YUV422_MODE (ATMEL_HLCDC_LAYER_YUV | ATMEL_HLCDC_YUV_MODE(6))
96#define ATMEL_HLCDC_NV21_MODE (ATMEL_HLCDC_LAYER_YUV | ATMEL_HLCDC_YUV_MODE(7))
97#define ATMEL_HLCDC_YUV420_MODE (ATMEL_HLCDC_LAYER_YUV | ATMEL_HLCDC_YUV_MODE(8))
98
99#define ATMEL_HLCDC_LAYER_POS_CFG(p) ATMEL_HLCDC_LAYER_CFG(p, (p)->desc->layout.pos)
100#define ATMEL_HLCDC_LAYER_SIZE_CFG(p) ATMEL_HLCDC_LAYER_CFG(p, (p)->desc->layout.size)
101#define ATMEL_HLCDC_LAYER_MEMSIZE_CFG(p) ATMEL_HLCDC_LAYER_CFG(p, (p)->desc->layout.memsize)
102#define ATMEL_HLCDC_LAYER_XSTRIDE_CFG(p) ATMEL_HLCDC_LAYER_CFG(p, (p)->desc->layout.xstride)
103#define ATMEL_HLCDC_LAYER_PSTRIDE_CFG(p) ATMEL_HLCDC_LAYER_CFG(p, (p)->desc->layout.pstride)
104#define ATMEL_HLCDC_LAYER_DFLTCOLOR_CFG(p) ATMEL_HLCDC_LAYER_CFG(p, (p)->desc->layout.default_color)
105#define ATMEL_HLCDC_LAYER_CRKEY_CFG(p) ATMEL_HLCDC_LAYER_CFG(p, (p)->desc->layout.chroma_key)
106#define ATMEL_HLCDC_LAYER_CRKEY_MASK_CFG(p) ATMEL_HLCDC_LAYER_CFG(p, (p)->desc->layout.chroma_key_mask)
107
108#define ATMEL_HLCDC_LAYER_GENERAL_CFG(p) ATMEL_HLCDC_LAYER_CFG(p, (p)->desc->layout.general_config)
109#define ATMEL_HLCDC_LAYER_CRKEY BIT(0)
110#define ATMEL_HLCDC_LAYER_INV BIT(1)
111#define ATMEL_HLCDC_LAYER_ITER2BL BIT(2)
112#define ATMEL_HLCDC_LAYER_ITER BIT(3)
113#define ATMEL_HLCDC_LAYER_REVALPHA BIT(4)
114#define ATMEL_HLCDC_LAYER_GAEN BIT(5)
115#define ATMEL_HLCDC_LAYER_LAEN BIT(6)
116#define ATMEL_HLCDC_LAYER_OVR BIT(7)
117#define ATMEL_HLCDC_LAYER_DMA BIT(8)
118#define ATMEL_HLCDC_LAYER_REP BIT(9)
119#define ATMEL_HLCDC_LAYER_DSTKEY BIT(10)
120#define ATMEL_HLCDC_LAYER_DISCEN BIT(11)
121#define ATMEL_HLCDC_LAYER_GA_SHIFT 16
122#define ATMEL_HLCDC_LAYER_GA_MASK GENMASK(23, ATMEL_HLCDC_LAYER_GA_SHIFT)
123#define ATMEL_HLCDC_LAYER_GA(x) ((x) << ATMEL_HLCDC_LAYER_GA_SHIFT)
124
125#define ATMEL_HLCDC_LAYER_CSC_CFG(p, o) ATMEL_HLCDC_LAYER_CFG(p, (p)->desc->layout.csc + o)
126
127#define ATMEL_HLCDC_LAYER_DISC_POS_CFG(p) ATMEL_HLCDC_LAYER_CFG(p, (p)->desc->layout.disc_pos)
128
129#define ATMEL_HLCDC_LAYER_DISC_SIZE_CFG(p) ATMEL_HLCDC_LAYER_CFG(p, (p)->desc->layout.disc_size)
130
131#define ATMEL_HLCDC_MAX_PLANES 3
132
133#define ATMEL_HLCDC_DMA_CHANNEL_DSCR_RESERVED BIT(0)
134#define ATMEL_HLCDC_DMA_CHANNEL_DSCR_LOADED BIT(1)
135#define ATMEL_HLCDC_DMA_CHANNEL_DSCR_DONE BIT(2)
136#define ATMEL_HLCDC_DMA_CHANNEL_DSCR_OVERRUN BIT(3)
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165struct atmel_hlcdc_layer_cfg_layout {
166 int xstride[ATMEL_HLCDC_MAX_PLANES];
167 int pstride[ATMEL_HLCDC_MAX_PLANES];
168 int pos;
169 int size;
170 int memsize;
171 int default_color;
172 int chroma_key;
173 int chroma_key_mask;
174 int general_config;
175 int disc_pos;
176 int disc_size;
177 int csc;
178};
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193struct atmel_hlcdc_layer_fb_flip {
194 struct atmel_hlcdc_dma_channel_dscr *dscrs[ATMEL_HLCDC_MAX_PLANES];
195 struct drm_flip_task *task;
196 struct drm_framebuffer *fb;
197 int ngems;
198 u32 status;
199};
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215struct atmel_hlcdc_dma_channel_dscr {
216 dma_addr_t addr;
217 u32 ctrl;
218 dma_addr_t next;
219 u32 status;
220} __aligned(sizeof(u64));
221
222
223
224
225enum atmel_hlcdc_layer_type {
226 ATMEL_HLCDC_BASE_LAYER,
227 ATMEL_HLCDC_OVERLAY_LAYER,
228 ATMEL_HLCDC_CURSOR_LAYER,
229 ATMEL_HLCDC_PP_LAYER,
230};
231
232
233
234
235
236
237
238
239
240struct atmel_hlcdc_formats {
241 int nformats;
242 uint32_t *formats;
243};
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260struct atmel_hlcdc_layer_desc {
261 const char *name;
262 enum atmel_hlcdc_layer_type type;
263 int id;
264 int regs_offset;
265 int nconfigs;
266 struct atmel_hlcdc_formats *formats;
267 struct atmel_hlcdc_layer_cfg_layout layout;
268 int max_width;
269 int max_height;
270};
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291struct atmel_hlcdc_layer_update_slot {
292 struct atmel_hlcdc_layer_fb_flip *fb_flip;
293 unsigned long *updated_configs;
294 u32 *configs;
295};
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316struct atmel_hlcdc_layer_update {
317 struct atmel_hlcdc_layer_update_slot slots[2];
318 int pending;
319 int next;
320};
321
322enum atmel_hlcdc_layer_dma_channel_status {
323 ATMEL_HLCDC_LAYER_DISABLED,
324 ATMEL_HLCDC_LAYER_ENABLED,
325 ATMEL_HLCDC_LAYER_DISABLING,
326};
327
328
329
330
331
332
333
334
335
336
337
338
339struct atmel_hlcdc_layer_dma_channel {
340 enum atmel_hlcdc_layer_dma_channel_status status;
341 struct atmel_hlcdc_layer_fb_flip *cur;
342 struct atmel_hlcdc_layer_fb_flip *queue;
343 struct atmel_hlcdc_dma_channel_dscr *dscrs;
344};
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360struct atmel_hlcdc_layer {
361 const struct atmel_hlcdc_layer_desc *desc;
362 int max_planes;
363 struct atmel_hlcdc *hlcdc;
364 struct workqueue_struct *wq;
365 struct drm_flip_work gc;
366 struct atmel_hlcdc_layer_dma_channel dma;
367 struct atmel_hlcdc_layer_update update;
368 spinlock_t lock;
369};
370
371void atmel_hlcdc_layer_irq(struct atmel_hlcdc_layer *layer);
372
373int atmel_hlcdc_layer_init(struct drm_device *dev,
374 struct atmel_hlcdc_layer *layer,
375 const struct atmel_hlcdc_layer_desc *desc);
376
377void atmel_hlcdc_layer_cleanup(struct drm_device *dev,
378 struct atmel_hlcdc_layer *layer);
379
380void atmel_hlcdc_layer_disable(struct atmel_hlcdc_layer *layer);
381
382int atmel_hlcdc_layer_update_start(struct atmel_hlcdc_layer *layer);
383
384void atmel_hlcdc_layer_update_cfg(struct atmel_hlcdc_layer *layer, int cfg,
385 u32 mask, u32 val);
386
387void atmel_hlcdc_layer_update_set_fb(struct atmel_hlcdc_layer *layer,
388 struct drm_framebuffer *fb,
389 unsigned int *offsets);
390
391void atmel_hlcdc_layer_update_set_finished(struct atmel_hlcdc_layer *layer,
392 void (*finished)(void *data),
393 void *finished_data);
394
395void atmel_hlcdc_layer_update_rollback(struct atmel_hlcdc_layer *layer);
396
397void atmel_hlcdc_layer_update_commit(struct atmel_hlcdc_layer *layer);
398
399#endif
400