1
2
3
4
5
6
7
8
9
10
11#ifndef DRM_ATMEL_HLCDC_H
12#define DRM_ATMEL_HLCDC_H
13
14#include <linux/regmap.h>
15
16#include <drm/drm_plane.h>
17
18#define ATMEL_HLCDC_LAYER_CHER 0x0
19#define ATMEL_HLCDC_LAYER_CHDR 0x4
20#define ATMEL_HLCDC_LAYER_CHSR 0x8
21#define ATMEL_HLCDC_LAYER_EN BIT(0)
22#define ATMEL_HLCDC_LAYER_UPDATE BIT(1)
23#define ATMEL_HLCDC_LAYER_A2Q BIT(2)
24#define ATMEL_HLCDC_LAYER_RST BIT(8)
25
26#define ATMEL_HLCDC_LAYER_IER 0xc
27#define ATMEL_HLCDC_LAYER_IDR 0x10
28#define ATMEL_HLCDC_LAYER_IMR 0x14
29#define ATMEL_HLCDC_LAYER_ISR 0x18
30#define ATMEL_HLCDC_LAYER_DFETCH BIT(0)
31#define ATMEL_HLCDC_LAYER_LFETCH BIT(1)
32#define ATMEL_HLCDC_LAYER_DMA_IRQ(p) BIT(2 + (8 * (p)))
33#define ATMEL_HLCDC_LAYER_DSCR_IRQ(p) BIT(3 + (8 * (p)))
34#define ATMEL_HLCDC_LAYER_ADD_IRQ(p) BIT(4 + (8 * (p)))
35#define ATMEL_HLCDC_LAYER_DONE_IRQ(p) BIT(5 + (8 * (p)))
36#define ATMEL_HLCDC_LAYER_OVR_IRQ(p) BIT(6 + (8 * (p)))
37
38#define ATMEL_HLCDC_LAYER_PLANE_HEAD(p) (((p) * 0x10) + 0x1c)
39#define ATMEL_HLCDC_LAYER_PLANE_ADDR(p) (((p) * 0x10) + 0x20)
40#define ATMEL_HLCDC_LAYER_PLANE_CTRL(p) (((p) * 0x10) + 0x24)
41#define ATMEL_HLCDC_LAYER_PLANE_NEXT(p) (((p) * 0x10) + 0x28)
42
43#define ATMEL_HLCDC_LAYER_DMA_CFG 0
44#define ATMEL_HLCDC_LAYER_DMA_SIF BIT(0)
45#define ATMEL_HLCDC_LAYER_DMA_BLEN_MASK GENMASK(5, 4)
46#define ATMEL_HLCDC_LAYER_DMA_BLEN_SINGLE (0 << 4)
47#define ATMEL_HLCDC_LAYER_DMA_BLEN_INCR4 (1 << 4)
48#define ATMEL_HLCDC_LAYER_DMA_BLEN_INCR8 (2 << 4)
49#define ATMEL_HLCDC_LAYER_DMA_BLEN_INCR16 (3 << 4)
50#define ATMEL_HLCDC_LAYER_DMA_DLBO BIT(8)
51#define ATMEL_HLCDC_LAYER_DMA_ROTDIS BIT(12)
52#define ATMEL_HLCDC_LAYER_DMA_LOCKDIS BIT(13)
53
54#define ATMEL_HLCDC_LAYER_FORMAT_CFG 1
55#define ATMEL_HLCDC_LAYER_RGB (0 << 0)
56#define ATMEL_HLCDC_LAYER_CLUT (1 << 0)
57#define ATMEL_HLCDC_LAYER_YUV (2 << 0)
58#define ATMEL_HLCDC_RGB_MODE(m) \
59 (ATMEL_HLCDC_LAYER_RGB | (((m) & 0xf) << 4))
60#define ATMEL_HLCDC_CLUT_MODE(m) \
61 (ATMEL_HLCDC_LAYER_CLUT | (((m) & 0x3) << 8))
62#define ATMEL_HLCDC_YUV_MODE(m) \
63 (ATMEL_HLCDC_LAYER_YUV | (((m) & 0xf) << 12))
64#define ATMEL_HLCDC_YUV422ROT BIT(16)
65#define ATMEL_HLCDC_YUV422SWP BIT(17)
66#define ATMEL_HLCDC_DSCALEOPT BIT(20)
67
68#define ATMEL_HLCDC_C1_MODE ATMEL_HLCDC_CLUT_MODE(0)
69#define ATMEL_HLCDC_C2_MODE ATMEL_HLCDC_CLUT_MODE(1)
70#define ATMEL_HLCDC_C4_MODE ATMEL_HLCDC_CLUT_MODE(2)
71#define ATMEL_HLCDC_C8_MODE ATMEL_HLCDC_CLUT_MODE(3)
72
73#define ATMEL_HLCDC_XRGB4444_MODE ATMEL_HLCDC_RGB_MODE(0)
74#define ATMEL_HLCDC_ARGB4444_MODE ATMEL_HLCDC_RGB_MODE(1)
75#define ATMEL_HLCDC_RGBA4444_MODE ATMEL_HLCDC_RGB_MODE(2)
76#define ATMEL_HLCDC_RGB565_MODE ATMEL_HLCDC_RGB_MODE(3)
77#define ATMEL_HLCDC_ARGB1555_MODE ATMEL_HLCDC_RGB_MODE(4)
78#define ATMEL_HLCDC_XRGB8888_MODE ATMEL_HLCDC_RGB_MODE(9)
79#define ATMEL_HLCDC_RGB888_MODE ATMEL_HLCDC_RGB_MODE(10)
80#define ATMEL_HLCDC_ARGB8888_MODE ATMEL_HLCDC_RGB_MODE(12)
81#define ATMEL_HLCDC_RGBA8888_MODE ATMEL_HLCDC_RGB_MODE(13)
82
83#define ATMEL_HLCDC_AYUV_MODE ATMEL_HLCDC_YUV_MODE(0)
84#define ATMEL_HLCDC_YUYV_MODE ATMEL_HLCDC_YUV_MODE(1)
85#define ATMEL_HLCDC_UYVY_MODE ATMEL_HLCDC_YUV_MODE(2)
86#define ATMEL_HLCDC_YVYU_MODE ATMEL_HLCDC_YUV_MODE(3)
87#define ATMEL_HLCDC_VYUY_MODE ATMEL_HLCDC_YUV_MODE(4)
88#define ATMEL_HLCDC_NV61_MODE ATMEL_HLCDC_YUV_MODE(5)
89#define ATMEL_HLCDC_YUV422_MODE ATMEL_HLCDC_YUV_MODE(6)
90#define ATMEL_HLCDC_NV21_MODE ATMEL_HLCDC_YUV_MODE(7)
91#define ATMEL_HLCDC_YUV420_MODE ATMEL_HLCDC_YUV_MODE(8)
92
93#define ATMEL_HLCDC_LAYER_POS(x, y) ((x) | ((y) << 16))
94#define ATMEL_HLCDC_LAYER_SIZE(w, h) (((w) - 1) | (((h) - 1) << 16))
95
96#define ATMEL_HLCDC_LAYER_CRKEY BIT(0)
97#define ATMEL_HLCDC_LAYER_INV BIT(1)
98#define ATMEL_HLCDC_LAYER_ITER2BL BIT(2)
99#define ATMEL_HLCDC_LAYER_ITER BIT(3)
100#define ATMEL_HLCDC_LAYER_REVALPHA BIT(4)
101#define ATMEL_HLCDC_LAYER_GAEN BIT(5)
102#define ATMEL_HLCDC_LAYER_LAEN BIT(6)
103#define ATMEL_HLCDC_LAYER_OVR BIT(7)
104#define ATMEL_HLCDC_LAYER_DMA BIT(8)
105#define ATMEL_HLCDC_LAYER_REP BIT(9)
106#define ATMEL_HLCDC_LAYER_DSTKEY BIT(10)
107#define ATMEL_HLCDC_LAYER_DISCEN BIT(11)
108#define ATMEL_HLCDC_LAYER_GA_SHIFT 16
109#define ATMEL_HLCDC_LAYER_GA_MASK \
110 GENMASK(23, ATMEL_HLCDC_LAYER_GA_SHIFT)
111#define ATMEL_HLCDC_LAYER_GA(x) \
112 ((x) << ATMEL_HLCDC_LAYER_GA_SHIFT)
113
114#define ATMEL_HLCDC_LAYER_DISC_POS(x, y) ((x) | ((y) << 16))
115#define ATMEL_HLCDC_LAYER_DISC_SIZE(w, h) (((w) - 1) | (((h) - 1) << 16))
116
117#define ATMEL_HLCDC_LAYER_SCALER_FACTORS(x, y) ((x) | ((y) << 16))
118#define ATMEL_HLCDC_LAYER_SCALER_ENABLE BIT(31)
119
120#define ATMEL_HLCDC_LAYER_MAX_PLANES 3
121
122#define ATMEL_HLCDC_DMA_CHANNEL_DSCR_RESERVED BIT(0)
123#define ATMEL_HLCDC_DMA_CHANNEL_DSCR_LOADED BIT(1)
124#define ATMEL_HLCDC_DMA_CHANNEL_DSCR_DONE BIT(2)
125#define ATMEL_HLCDC_DMA_CHANNEL_DSCR_OVERRUN BIT(3)
126
127#define ATMEL_HLCDC_CLUT_SIZE 256
128
129#define ATMEL_HLCDC_MAX_LAYERS 6
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160struct atmel_hlcdc_layer_cfg_layout {
161 int xstride[ATMEL_HLCDC_LAYER_MAX_PLANES];
162 int pstride[ATMEL_HLCDC_LAYER_MAX_PLANES];
163 int pos;
164 int size;
165 int memsize;
166 int default_color;
167 int chroma_key;
168 int chroma_key_mask;
169 int general_config;
170 int scaler_config;
171 struct {
172 int x;
173 int y;
174 } phicoeffs;
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
193
194struct atmel_hlcdc_dma_channel_dscr {
195 dma_addr_t addr;
196 u32 ctrl;
197 dma_addr_t next;
198 dma_addr_t self;
199} __aligned(sizeof(u64));
200
201
202
203
204enum atmel_hlcdc_layer_type {
205 ATMEL_HLCDC_NO_LAYER,
206 ATMEL_HLCDC_BASE_LAYER,
207 ATMEL_HLCDC_OVERLAY_LAYER,
208 ATMEL_HLCDC_CURSOR_LAYER,
209 ATMEL_HLCDC_PP_LAYER,
210};
211
212
213
214
215
216
217
218
219
220struct atmel_hlcdc_formats {
221 int nformats;
222 u32 *formats;
223};
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240struct atmel_hlcdc_layer_desc {
241 const char *name;
242 enum atmel_hlcdc_layer_type type;
243 int id;
244 int regs_offset;
245 int cfgs_offset;
246 int clut_offset;
247 struct atmel_hlcdc_formats *formats;
248 struct atmel_hlcdc_layer_cfg_layout layout;
249 int max_width;
250 int max_height;
251};
252
253
254
255
256
257
258
259
260
261
262struct atmel_hlcdc_layer {
263 const struct atmel_hlcdc_layer_desc *desc;
264 struct regmap *regmap;
265};
266
267
268
269
270
271
272
273
274struct atmel_hlcdc_plane {
275 struct drm_plane base;
276 struct atmel_hlcdc_layer layer;
277};
278
279static inline struct atmel_hlcdc_plane *
280drm_plane_to_atmel_hlcdc_plane(struct drm_plane *p)
281{
282 return container_of(p, struct atmel_hlcdc_plane, base);
283}
284
285static inline struct atmel_hlcdc_plane *
286atmel_hlcdc_layer_to_plane(struct atmel_hlcdc_layer *layer)
287{
288 return container_of(layer, struct atmel_hlcdc_plane, layer);
289}
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310struct atmel_hlcdc_dc_desc {
311 int min_width;
312 int min_height;
313 int max_width;
314 int max_height;
315 int max_spw;
316 int max_vpw;
317 int max_hpw;
318 bool conflicting_output_formats;
319 bool fixed_clksrc;
320 const struct atmel_hlcdc_layer_desc *layers;
321 int nlayers;
322};
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338struct atmel_hlcdc_dc {
339 const struct atmel_hlcdc_dc_desc *desc;
340 struct dma_pool *dscrpool;
341 struct atmel_hlcdc *hlcdc;
342 struct drm_crtc *crtc;
343 struct atmel_hlcdc_layer *layers[ATMEL_HLCDC_MAX_LAYERS];
344 struct workqueue_struct *wq;
345 struct {
346 u32 imr;
347 struct drm_atomic_state *state;
348 } suspend;
349 struct {
350 wait_queue_head_t wait;
351 bool pending;
352 } commit;
353};
354
355extern struct atmel_hlcdc_formats atmel_hlcdc_plane_rgb_formats;
356extern struct atmel_hlcdc_formats atmel_hlcdc_plane_rgb_and_yuv_formats;
357
358static inline void atmel_hlcdc_layer_write_reg(struct atmel_hlcdc_layer *layer,
359 unsigned int reg, u32 val)
360{
361 regmap_write(layer->regmap, layer->desc->regs_offset + reg, val);
362}
363
364static inline u32 atmel_hlcdc_layer_read_reg(struct atmel_hlcdc_layer *layer,
365 unsigned int reg)
366{
367 u32 val;
368
369 regmap_read(layer->regmap, layer->desc->regs_offset + reg, &val);
370
371 return val;
372}
373
374static inline void atmel_hlcdc_layer_write_cfg(struct atmel_hlcdc_layer *layer,
375 unsigned int cfgid, u32 val)
376{
377 atmel_hlcdc_layer_write_reg(layer,
378 layer->desc->cfgs_offset +
379 (cfgid * sizeof(u32)), val);
380}
381
382static inline u32 atmel_hlcdc_layer_read_cfg(struct atmel_hlcdc_layer *layer,
383 unsigned int cfgid)
384{
385 return atmel_hlcdc_layer_read_reg(layer,
386 layer->desc->cfgs_offset +
387 (cfgid * sizeof(u32)));
388}
389
390static inline void atmel_hlcdc_layer_write_clut(struct atmel_hlcdc_layer *layer,
391 unsigned int c, u32 val)
392{
393 regmap_write(layer->regmap,
394 layer->desc->clut_offset + c * sizeof(u32),
395 val);
396}
397
398static inline void atmel_hlcdc_layer_init(struct atmel_hlcdc_layer *layer,
399 const struct atmel_hlcdc_layer_desc *desc,
400 struct regmap *regmap)
401{
402 layer->desc = desc;
403 layer->regmap = regmap;
404}
405
406enum drm_mode_status
407atmel_hlcdc_dc_mode_valid(struct atmel_hlcdc_dc *dc,
408 const struct drm_display_mode *mode);
409
410int atmel_hlcdc_create_planes(struct drm_device *dev);
411void atmel_hlcdc_plane_irq(struct atmel_hlcdc_plane *plane);
412
413int atmel_hlcdc_plane_prepare_disc_area(struct drm_crtc_state *c_state);
414int atmel_hlcdc_plane_prepare_ahb_routing(struct drm_crtc_state *c_state);
415
416void atmel_hlcdc_crtc_irq(struct drm_crtc *c);
417
418int atmel_hlcdc_crtc_create(struct drm_device *dev);
419
420int atmel_hlcdc_create_outputs(struct drm_device *dev);
421int atmel_hlcdc_encoder_get_bus_fmt(struct drm_encoder *encoder);
422
423#endif
424