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
336struct atmel_hlcdc_dc {
337 const struct atmel_hlcdc_dc_desc *desc;
338 struct dma_pool *dscrpool;
339 struct atmel_hlcdc *hlcdc;
340 struct drm_crtc *crtc;
341 struct atmel_hlcdc_layer *layers[ATMEL_HLCDC_MAX_LAYERS];
342 struct {
343 u32 imr;
344 struct drm_atomic_state *state;
345 } suspend;
346};
347
348extern struct atmel_hlcdc_formats atmel_hlcdc_plane_rgb_formats;
349extern struct atmel_hlcdc_formats atmel_hlcdc_plane_rgb_and_yuv_formats;
350
351static inline void atmel_hlcdc_layer_write_reg(struct atmel_hlcdc_layer *layer,
352 unsigned int reg, u32 val)
353{
354 regmap_write(layer->regmap, layer->desc->regs_offset + reg, val);
355}
356
357static inline u32 atmel_hlcdc_layer_read_reg(struct atmel_hlcdc_layer *layer,
358 unsigned int reg)
359{
360 u32 val;
361
362 regmap_read(layer->regmap, layer->desc->regs_offset + reg, &val);
363
364 return val;
365}
366
367static inline void atmel_hlcdc_layer_write_cfg(struct atmel_hlcdc_layer *layer,
368 unsigned int cfgid, u32 val)
369{
370 atmel_hlcdc_layer_write_reg(layer,
371 layer->desc->cfgs_offset +
372 (cfgid * sizeof(u32)), val);
373}
374
375static inline u32 atmel_hlcdc_layer_read_cfg(struct atmel_hlcdc_layer *layer,
376 unsigned int cfgid)
377{
378 return atmel_hlcdc_layer_read_reg(layer,
379 layer->desc->cfgs_offset +
380 (cfgid * sizeof(u32)));
381}
382
383static inline void atmel_hlcdc_layer_write_clut(struct atmel_hlcdc_layer *layer,
384 unsigned int c, u32 val)
385{
386 regmap_write(layer->regmap,
387 layer->desc->clut_offset + c * sizeof(u32),
388 val);
389}
390
391static inline void atmel_hlcdc_layer_init(struct atmel_hlcdc_layer *layer,
392 const struct atmel_hlcdc_layer_desc *desc,
393 struct regmap *regmap)
394{
395 layer->desc = desc;
396 layer->regmap = regmap;
397}
398
399enum drm_mode_status
400atmel_hlcdc_dc_mode_valid(struct atmel_hlcdc_dc *dc,
401 const struct drm_display_mode *mode);
402
403int atmel_hlcdc_create_planes(struct drm_device *dev);
404void atmel_hlcdc_plane_irq(struct atmel_hlcdc_plane *plane);
405
406int atmel_hlcdc_plane_prepare_disc_area(struct drm_crtc_state *c_state);
407int atmel_hlcdc_plane_prepare_ahb_routing(struct drm_crtc_state *c_state);
408
409void atmel_hlcdc_crtc_irq(struct drm_crtc *c);
410
411int atmel_hlcdc_crtc_create(struct drm_device *dev);
412
413int atmel_hlcdc_create_outputs(struct drm_device *dev);
414int atmel_hlcdc_encoder_get_bus_fmt(struct drm_encoder *encoder);
415
416#endif
417