blob: 47f43663adcb14427fd666fc26ace0efb6b7709b [file] [log] [blame]
Thierry Redingd8f4a9e2012-11-15 21:28:22 +00001/*
2 * Copyright (C) 2012 Avionic Design GmbH
3 * Copyright (C) 2012 NVIDIA CORPORATION. All rights reserved.
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License version 2 as
7 * published by the Free Software Foundation.
8 */
9
10#ifndef TEGRA_DC_H
11#define TEGRA_DC_H 1
12
Thierry Reding2d1c18f2017-08-30 17:25:34 +020013#include <linux/host1x.h>
14
15#include <drm/drm_crtc.h>
16
17#include "drm.h"
18
19struct tegra_output;
20
Thierry Redingb1415ff2017-11-10 16:00:05 +010021struct tegra_dc_state {
22 struct drm_crtc_state base;
23
24 struct clk *clk;
25 unsigned long pclk;
26 unsigned int div;
27
28 u32 planes;
29};
30
31static inline struct tegra_dc_state *to_dc_state(struct drm_crtc_state *state)
32{
33 if (state)
34 return container_of(state, struct tegra_dc_state, base);
35
36 return NULL;
37}
38
Thierry Reding2d1c18f2017-08-30 17:25:34 +020039struct tegra_dc_stats {
40 unsigned long frames;
41 unsigned long vblank;
42 unsigned long underflow;
43 unsigned long overflow;
44};
45
Thierry Reding47307952017-08-30 17:42:54 +020046struct tegra_windowgroup_soc {
47 unsigned int index;
48 unsigned int dc;
49 const unsigned int *windows;
50 unsigned int num_windows;
51};
52
Thierry Reding2d1c18f2017-08-30 17:25:34 +020053struct tegra_dc_soc_info {
Thierry Reding7116e9a2017-11-13 11:20:48 +010054 bool supports_background_color;
Thierry Reding2d1c18f2017-08-30 17:25:34 +020055 bool supports_interlacing;
56 bool supports_cursor;
57 bool supports_block_linear;
58 unsigned int pitch_align;
59 bool has_powergate;
60 bool broken_reset;
Thierry Reding47307952017-08-30 17:42:54 +020061 bool has_nvdisplay;
62 const struct tegra_windowgroup_soc *wgrps;
63 unsigned int num_wgrps;
Thierry Reding2d1c18f2017-08-30 17:25:34 +020064};
65
66struct tegra_dc {
67 struct host1x_client client;
68 struct host1x_syncpt *syncpt;
69 struct device *dev;
70 spinlock_t lock;
71
72 struct drm_crtc base;
73 unsigned int powergate;
74 int pipe;
75
76 struct clk *clk;
77 struct reset_control *rst;
78 void __iomem *regs;
79 int irq;
80
81 struct tegra_output *rgb;
82
83 struct tegra_dc_stats stats;
84 struct list_head list;
85
86 struct drm_info_list *debugfs_files;
Thierry Reding2d1c18f2017-08-30 17:25:34 +020087
Thierry Reding2d1c18f2017-08-30 17:25:34 +020088 const struct tegra_dc_soc_info *soc;
89
90 struct iommu_domain *domain;
91};
92
93static inline struct tegra_dc *
94host1x_client_to_dc(struct host1x_client *client)
95{
96 return container_of(client, struct tegra_dc, client);
97}
98
99static inline struct tegra_dc *to_tegra_dc(struct drm_crtc *crtc)
100{
101 return crtc ? container_of(crtc, struct tegra_dc, base) : NULL;
102}
103
104static inline void tegra_dc_writel(struct tegra_dc *dc, u32 value,
105 unsigned int offset)
106{
107 trace_dc_writel(dc->dev, offset, value);
108 writel(value, dc->regs + (offset << 2));
109}
110
111static inline u32 tegra_dc_readl(struct tegra_dc *dc, unsigned int offset)
112{
113 u32 value = readl(dc->regs + (offset << 2));
114
115 trace_dc_readl(dc->dev, offset, value);
116
117 return value;
118}
119
120struct tegra_dc_window {
121 struct {
122 unsigned int x;
123 unsigned int y;
124 unsigned int w;
125 unsigned int h;
126 } src;
127 struct {
128 unsigned int x;
129 unsigned int y;
130 unsigned int w;
131 unsigned int h;
132 } dst;
133 unsigned int bits_per_pixel;
134 unsigned int stride[2];
135 unsigned long base[3];
136 bool bottom_up;
137
138 struct tegra_bo_tiling tiling;
139 u32 format;
140 u32 swap;
141};
142
143/* from dc.c */
144void tegra_dc_commit(struct tegra_dc *dc);
145int tegra_dc_state_setup_clock(struct tegra_dc *dc,
146 struct drm_crtc_state *crtc_state,
147 struct clk *clk, unsigned long pclk,
148 unsigned int div);
149
150/* from rgb.c */
151int tegra_dc_rgb_probe(struct tegra_dc *dc);
152int tegra_dc_rgb_remove(struct tegra_dc *dc);
153int tegra_dc_rgb_init(struct drm_device *drm, struct tegra_dc *dc);
154int tegra_dc_rgb_exit(struct tegra_dc *dc);
155
Thierry Redingd8f4a9e2012-11-15 21:28:22 +0000156#define DC_CMD_GENERAL_INCR_SYNCPT 0x000
157#define DC_CMD_GENERAL_INCR_SYNCPT_CNTRL 0x001
Thierry Reding42e9ce02015-01-28 14:43:05 +0100158#define SYNCPT_CNTRL_NO_STALL (1 << 8)
159#define SYNCPT_CNTRL_SOFT_RESET (1 << 0)
Thierry Redingd8f4a9e2012-11-15 21:28:22 +0000160#define DC_CMD_GENERAL_INCR_SYNCPT_ERROR 0x002
161#define DC_CMD_WIN_A_INCR_SYNCPT 0x008
162#define DC_CMD_WIN_A_INCR_SYNCPT_CNTRL 0x009
163#define DC_CMD_WIN_A_INCR_SYNCPT_ERROR 0x00a
164#define DC_CMD_WIN_B_INCR_SYNCPT 0x010
165#define DC_CMD_WIN_B_INCR_SYNCPT_CNTRL 0x011
166#define DC_CMD_WIN_B_INCR_SYNCPT_ERROR 0x012
167#define DC_CMD_WIN_C_INCR_SYNCPT 0x018
168#define DC_CMD_WIN_C_INCR_SYNCPT_CNTRL 0x019
169#define DC_CMD_WIN_C_INCR_SYNCPT_ERROR 0x01a
170#define DC_CMD_CONT_SYNCPT_VSYNC 0x028
Thierry Reding42e9ce02015-01-28 14:43:05 +0100171#define SYNCPT_VSYNC_ENABLE (1 << 8)
Thierry Redingd8f4a9e2012-11-15 21:28:22 +0000172#define DC_CMD_DISPLAY_COMMAND_OPTION0 0x031
173#define DC_CMD_DISPLAY_COMMAND 0x032
174#define DISP_CTRL_MODE_STOP (0 << 5)
175#define DISP_CTRL_MODE_C_DISPLAY (1 << 5)
176#define DISP_CTRL_MODE_NC_DISPLAY (2 << 5)
Thierry Redingdec72732013-09-03 08:45:46 +0200177#define DISP_CTRL_MODE_MASK (3 << 5)
Thierry Redingd8f4a9e2012-11-15 21:28:22 +0000178#define DC_CMD_SIGNAL_RAISE 0x033
179#define DC_CMD_DISPLAY_POWER_CONTROL 0x036
180#define PW0_ENABLE (1 << 0)
181#define PW1_ENABLE (1 << 2)
182#define PW2_ENABLE (1 << 4)
183#define PW3_ENABLE (1 << 6)
184#define PW4_ENABLE (1 << 8)
185#define PM0_ENABLE (1 << 16)
186#define PM1_ENABLE (1 << 18)
187
188#define DC_CMD_INT_STATUS 0x037
189#define DC_CMD_INT_MASK 0x038
190#define DC_CMD_INT_ENABLE 0x039
191#define DC_CMD_INT_TYPE 0x03a
192#define DC_CMD_INT_POLARITY 0x03b
Thierry Reding47307952017-08-30 17:42:54 +0200193#define CTXSW_INT (1 << 0)
194#define FRAME_END_INT (1 << 1)
195#define VBLANK_INT (1 << 2)
196#define V_PULSE3_INT (1 << 4)
197#define V_PULSE2_INT (1 << 5)
198#define REGION_CRC_INT (1 << 6)
199#define REG_TMOUT_INT (1 << 7)
200#define WIN_A_UF_INT (1 << 8)
201#define WIN_B_UF_INT (1 << 9)
202#define WIN_C_UF_INT (1 << 10)
203#define MSF_INT (1 << 12)
204#define WIN_A_OF_INT (1 << 14)
205#define WIN_B_OF_INT (1 << 15)
206#define WIN_C_OF_INT (1 << 16)
207#define HEAD_UF_INT (1 << 23)
208#define SD3_BUCKET_WALK_DONE_INT (1 << 24)
209#define DSC_OBUF_UF_INT (1 << 26)
210#define DSC_RBUF_UF_INT (1 << 27)
211#define DSC_BBUF_UF_INT (1 << 28)
212#define DSC_TO_UF_INT (1 << 29)
Thierry Redingd8f4a9e2012-11-15 21:28:22 +0000213
214#define DC_CMD_SIGNAL_RAISE1 0x03c
215#define DC_CMD_SIGNAL_RAISE2 0x03d
216#define DC_CMD_SIGNAL_RAISE3 0x03e
217
218#define DC_CMD_STATE_ACCESS 0x040
Thierry Reding3c03c462012-11-28 12:00:18 +0100219#define READ_MUX (1 << 0)
220#define WRITE_MUX (1 << 2)
Thierry Redingd8f4a9e2012-11-15 21:28:22 +0000221
222#define DC_CMD_STATE_CONTROL 0x041
223#define GENERAL_ACT_REQ (1 << 0)
224#define WIN_A_ACT_REQ (1 << 1)
225#define WIN_B_ACT_REQ (1 << 2)
226#define WIN_C_ACT_REQ (1 << 3)
Thierry Redinge6876512013-12-20 13:58:33 +0100227#define CURSOR_ACT_REQ (1 << 7)
Thierry Redingd8f4a9e2012-11-15 21:28:22 +0000228#define GENERAL_UPDATE (1 << 8)
229#define WIN_A_UPDATE (1 << 9)
230#define WIN_B_UPDATE (1 << 10)
231#define WIN_C_UPDATE (1 << 11)
Thierry Redinge6876512013-12-20 13:58:33 +0100232#define CURSOR_UPDATE (1 << 15)
Thierry Redingc4755fb2017-11-13 11:08:13 +0100233#define COMMON_ACTREQ (1 << 16)
234#define COMMON_UPDATE (1 << 17)
Thierry Redingd8f4a9e2012-11-15 21:28:22 +0000235#define NC_HOST_TRIG (1 << 24)
236
237#define DC_CMD_DISPLAY_WINDOW_HEADER 0x042
238#define WINDOW_A_SELECT (1 << 4)
239#define WINDOW_B_SELECT (1 << 5)
240#define WINDOW_C_SELECT (1 << 6)
241
242#define DC_CMD_REG_ACT_CONTROL 0x043
243
244#define DC_COM_CRC_CONTROL 0x300
Thierry Reding6ca1f622015-04-01 14:59:40 +0200245#define DC_COM_CRC_CONTROL_ALWAYS (1 << 3)
246#define DC_COM_CRC_CONTROL_FULL_FRAME (0 << 2)
247#define DC_COM_CRC_CONTROL_ACTIVE_DATA (1 << 2)
248#define DC_COM_CRC_CONTROL_WAIT (1 << 1)
249#define DC_COM_CRC_CONTROL_ENABLE (1 << 0)
Thierry Redingd8f4a9e2012-11-15 21:28:22 +0000250#define DC_COM_CRC_CHECKSUM 0x301
251#define DC_COM_PIN_OUTPUT_ENABLE(x) (0x302 + (x))
252#define DC_COM_PIN_OUTPUT_POLARITY(x) (0x306 + (x))
253#define LVS_OUTPUT_POLARITY_LOW (1 << 28)
254#define LHS_OUTPUT_POLARITY_LOW (1 << 30)
255#define DC_COM_PIN_OUTPUT_DATA(x) (0x30a + (x))
256#define DC_COM_PIN_INPUT_ENABLE(x) (0x30e + (x))
257#define DC_COM_PIN_INPUT_DATA(x) (0x312 + (x))
258#define DC_COM_PIN_OUTPUT_SELECT(x) (0x314 + (x))
259
260#define DC_COM_PIN_MISC_CONTROL 0x31b
261#define DC_COM_PIN_PM0_CONTROL 0x31c
262#define DC_COM_PIN_PM0_DUTY_CYCLE 0x31d
263#define DC_COM_PIN_PM1_CONTROL 0x31e
264#define DC_COM_PIN_PM1_DUTY_CYCLE 0x31f
265
266#define DC_COM_SPI_CONTROL 0x320
267#define DC_COM_SPI_START_BYTE 0x321
268#define DC_COM_HSPI_WRITE_DATA_AB 0x322
269#define DC_COM_HSPI_WRITE_DATA_CD 0x323
270#define DC_COM_HSPI_CS_DC 0x324
271#define DC_COM_SCRATCH_REGISTER_A 0x325
272#define DC_COM_SCRATCH_REGISTER_B 0x326
273#define DC_COM_GPIO_CTRL 0x327
274#define DC_COM_GPIO_DEBOUNCE_COUNTER 0x328
275#define DC_COM_CRC_CHECKSUM_LATCHED 0x329
276
Thierry Reding47307952017-08-30 17:42:54 +0200277#define DC_COM_RG_UNDERFLOW 0x365
278#define UNDERFLOW_MODE_RED (1 << 8)
279#define UNDERFLOW_REPORT_ENABLE (1 << 0)
280
Thierry Redingd8f4a9e2012-11-15 21:28:22 +0000281#define DC_DISP_DISP_SIGNAL_OPTIONS0 0x400
Thierry Reding8fd3ffa2015-04-27 14:48:35 +0200282#define H_PULSE0_ENABLE (1 << 8)
283#define H_PULSE1_ENABLE (1 << 10)
284#define H_PULSE2_ENABLE (1 << 12)
Thierry Redingd8f4a9e2012-11-15 21:28:22 +0000285
286#define DC_DISP_DISP_SIGNAL_OPTIONS1 0x401
287
288#define DC_DISP_DISP_WIN_OPTIONS 0x402
Thierry Redinge6876512013-12-20 13:58:33 +0100289#define HDMI_ENABLE (1 << 30)
290#define DSI_ENABLE (1 << 29)
Thierry Reding459cc2c2015-07-30 10:34:24 +0200291#define SOR1_TIMING_CYA (1 << 27)
292#define SOR1_ENABLE (1 << 26)
Thierry Redinge6876512013-12-20 13:58:33 +0100293#define SOR_ENABLE (1 << 25)
294#define CURSOR_ENABLE (1 << 16)
Thierry Redingd8f4a9e2012-11-15 21:28:22 +0000295
296#define DC_DISP_DISP_MEM_HIGH_PRIORITY 0x403
297#define CURSOR_THRESHOLD(x) (((x) & 0x03) << 24)
298#define WINDOW_A_THRESHOLD(x) (((x) & 0x7f) << 16)
299#define WINDOW_B_THRESHOLD(x) (((x) & 0x7f) << 8)
300#define WINDOW_C_THRESHOLD(x) (((x) & 0xff) << 0)
301
302#define DC_DISP_DISP_MEM_HIGH_PRIORITY_TIMER 0x404
303#define CURSOR_DELAY(x) (((x) & 0x3f) << 24)
304#define WINDOW_A_DELAY(x) (((x) & 0x3f) << 16)
305#define WINDOW_B_DELAY(x) (((x) & 0x3f) << 8)
306#define WINDOW_C_DELAY(x) (((x) & 0x3f) << 0)
307
308#define DC_DISP_DISP_TIMING_OPTIONS 0x405
309#define VSYNC_H_POSITION(x) ((x) & 0xfff)
310
311#define DC_DISP_REF_TO_SYNC 0x406
312#define DC_DISP_SYNC_WIDTH 0x407
313#define DC_DISP_BACK_PORCH 0x408
314#define DC_DISP_ACTIVE 0x409
315#define DC_DISP_FRONT_PORCH 0x40a
316#define DC_DISP_H_PULSE0_CONTROL 0x40b
317#define DC_DISP_H_PULSE0_POSITION_A 0x40c
318#define DC_DISP_H_PULSE0_POSITION_B 0x40d
319#define DC_DISP_H_PULSE0_POSITION_C 0x40e
320#define DC_DISP_H_PULSE0_POSITION_D 0x40f
321#define DC_DISP_H_PULSE1_CONTROL 0x410
322#define DC_DISP_H_PULSE1_POSITION_A 0x411
323#define DC_DISP_H_PULSE1_POSITION_B 0x412
324#define DC_DISP_H_PULSE1_POSITION_C 0x413
325#define DC_DISP_H_PULSE1_POSITION_D 0x414
326#define DC_DISP_H_PULSE2_CONTROL 0x415
327#define DC_DISP_H_PULSE2_POSITION_A 0x416
328#define DC_DISP_H_PULSE2_POSITION_B 0x417
329#define DC_DISP_H_PULSE2_POSITION_C 0x418
330#define DC_DISP_H_PULSE2_POSITION_D 0x419
331#define DC_DISP_V_PULSE0_CONTROL 0x41a
332#define DC_DISP_V_PULSE0_POSITION_A 0x41b
333#define DC_DISP_V_PULSE0_POSITION_B 0x41c
334#define DC_DISP_V_PULSE0_POSITION_C 0x41d
335#define DC_DISP_V_PULSE1_CONTROL 0x41e
336#define DC_DISP_V_PULSE1_POSITION_A 0x41f
337#define DC_DISP_V_PULSE1_POSITION_B 0x420
338#define DC_DISP_V_PULSE1_POSITION_C 0x421
339#define DC_DISP_V_PULSE2_CONTROL 0x422
340#define DC_DISP_V_PULSE2_POSITION_A 0x423
341#define DC_DISP_V_PULSE3_CONTROL 0x424
342#define DC_DISP_V_PULSE3_POSITION_A 0x425
343#define DC_DISP_M0_CONTROL 0x426
344#define DC_DISP_M1_CONTROL 0x427
345#define DC_DISP_DI_CONTROL 0x428
346#define DC_DISP_PP_CONTROL 0x429
347#define DC_DISP_PP_SELECT_A 0x42a
348#define DC_DISP_PP_SELECT_B 0x42b
349#define DC_DISP_PP_SELECT_C 0x42c
350#define DC_DISP_PP_SELECT_D 0x42d
351
352#define PULSE_MODE_NORMAL (0 << 3)
353#define PULSE_MODE_ONE_CLOCK (1 << 3)
354#define PULSE_POLARITY_HIGH (0 << 4)
355#define PULSE_POLARITY_LOW (1 << 4)
356#define PULSE_QUAL_ALWAYS (0 << 6)
357#define PULSE_QUAL_VACTIVE (2 << 6)
358#define PULSE_QUAL_VACTIVE1 (3 << 6)
359#define PULSE_LAST_START_A (0 << 8)
360#define PULSE_LAST_END_A (1 << 8)
361#define PULSE_LAST_START_B (2 << 8)
362#define PULSE_LAST_END_B (3 << 8)
363#define PULSE_LAST_START_C (4 << 8)
364#define PULSE_LAST_END_C (5 << 8)
365#define PULSE_LAST_START_D (6 << 8)
366#define PULSE_LAST_END_D (7 << 8)
367
368#define PULSE_START(x) (((x) & 0xfff) << 0)
369#define PULSE_END(x) (((x) & 0xfff) << 16)
370
371#define DC_DISP_DISP_CLOCK_CONTROL 0x42e
372#define PIXEL_CLK_DIVIDER_PCD1 (0 << 8)
373#define PIXEL_CLK_DIVIDER_PCD1H (1 << 8)
374#define PIXEL_CLK_DIVIDER_PCD2 (2 << 8)
375#define PIXEL_CLK_DIVIDER_PCD3 (3 << 8)
376#define PIXEL_CLK_DIVIDER_PCD4 (4 << 8)
377#define PIXEL_CLK_DIVIDER_PCD6 (5 << 8)
378#define PIXEL_CLK_DIVIDER_PCD8 (6 << 8)
379#define PIXEL_CLK_DIVIDER_PCD9 (7 << 8)
380#define PIXEL_CLK_DIVIDER_PCD12 (8 << 8)
381#define PIXEL_CLK_DIVIDER_PCD16 (9 << 8)
382#define PIXEL_CLK_DIVIDER_PCD18 (10 << 8)
383#define PIXEL_CLK_DIVIDER_PCD24 (11 << 8)
384#define PIXEL_CLK_DIVIDER_PCD13 (12 << 8)
385#define SHIFT_CLK_DIVIDER(x) ((x) & 0xff)
386
387#define DC_DISP_DISP_INTERFACE_CONTROL 0x42f
388#define DISP_DATA_FORMAT_DF1P1C (0 << 0)
389#define DISP_DATA_FORMAT_DF1P2C24B (1 << 0)
390#define DISP_DATA_FORMAT_DF1P2C18B (2 << 0)
391#define DISP_DATA_FORMAT_DF1P2C16B (3 << 0)
392#define DISP_DATA_FORMAT_DF2S (4 << 0)
393#define DISP_DATA_FORMAT_DF3S (5 << 0)
394#define DISP_DATA_FORMAT_DFSPI (6 << 0)
395#define DISP_DATA_FORMAT_DF1P3C24B (7 << 0)
396#define DISP_DATA_FORMAT_DF1P3C18B (8 << 0)
397#define DISP_ALIGNMENT_MSB (0 << 8)
398#define DISP_ALIGNMENT_LSB (1 << 8)
399#define DISP_ORDER_RED_BLUE (0 << 9)
400#define DISP_ORDER_BLUE_RED (1 << 9)
401
402#define DC_DISP_DISP_COLOR_CONTROL 0x430
Thierry Reding47307952017-08-30 17:42:54 +0200403#define BASE_COLOR_SIZE666 ( 0 << 0)
404#define BASE_COLOR_SIZE111 ( 1 << 0)
405#define BASE_COLOR_SIZE222 ( 2 << 0)
406#define BASE_COLOR_SIZE333 ( 3 << 0)
407#define BASE_COLOR_SIZE444 ( 4 << 0)
408#define BASE_COLOR_SIZE555 ( 5 << 0)
409#define BASE_COLOR_SIZE565 ( 6 << 0)
410#define BASE_COLOR_SIZE332 ( 7 << 0)
411#define BASE_COLOR_SIZE888 ( 8 << 0)
412#define BASE_COLOR_SIZE101010 (10 << 0)
413#define BASE_COLOR_SIZE121212 (12 << 0)
Thierry Reding459cc2c2015-07-30 10:34:24 +0200414#define DITHER_CONTROL_MASK (3 << 8)
Thierry Redingd8f4a9e2012-11-15 21:28:22 +0000415#define DITHER_CONTROL_DISABLE (0 << 8)
416#define DITHER_CONTROL_ORDERED (2 << 8)
417#define DITHER_CONTROL_ERRDIFF (3 << 8)
Thierry Reding459cc2c2015-07-30 10:34:24 +0200418#define BASE_COLOR_SIZE_MASK (0xf << 0)
Thierry Reding47307952017-08-30 17:42:54 +0200419#define BASE_COLOR_SIZE_666 ( 0 << 0)
420#define BASE_COLOR_SIZE_111 ( 1 << 0)
421#define BASE_COLOR_SIZE_222 ( 2 << 0)
422#define BASE_COLOR_SIZE_333 ( 3 << 0)
423#define BASE_COLOR_SIZE_444 ( 4 << 0)
424#define BASE_COLOR_SIZE_555 ( 5 << 0)
425#define BASE_COLOR_SIZE_565 ( 6 << 0)
426#define BASE_COLOR_SIZE_332 ( 7 << 0)
427#define BASE_COLOR_SIZE_888 ( 8 << 0)
428#define BASE_COLOR_SIZE_101010 ( 10 << 0)
429#define BASE_COLOR_SIZE_121212 ( 12 << 0)
Thierry Redingd8f4a9e2012-11-15 21:28:22 +0000430
431#define DC_DISP_SHIFT_CLOCK_OPTIONS 0x431
Thierry Reding72d30282013-12-12 11:06:55 +0100432#define SC1_H_QUALIFIER_NONE (1 << 16)
433#define SC0_H_QUALIFIER_NONE (1 << 0)
Thierry Redingd8f4a9e2012-11-15 21:28:22 +0000434
435#define DC_DISP_DATA_ENABLE_OPTIONS 0x432
436#define DE_SELECT_ACTIVE_BLANK (0 << 0)
437#define DE_SELECT_ACTIVE (1 << 0)
438#define DE_SELECT_ACTIVE_IS (2 << 0)
439#define DE_CONTROL_ONECLK (0 << 2)
440#define DE_CONTROL_NORMAL (1 << 2)
441#define DE_CONTROL_EARLY_EXT (2 << 2)
442#define DE_CONTROL_EARLY (3 << 2)
443#define DE_CONTROL_ACTIVE_BLANK (4 << 2)
444
445#define DC_DISP_SERIAL_INTERFACE_OPTIONS 0x433
446#define DC_DISP_LCD_SPI_OPTIONS 0x434
447#define DC_DISP_BORDER_COLOR 0x435
448#define DC_DISP_COLOR_KEY0_LOWER 0x436
449#define DC_DISP_COLOR_KEY0_UPPER 0x437
450#define DC_DISP_COLOR_KEY1_LOWER 0x438
451#define DC_DISP_COLOR_KEY1_UPPER 0x439
452
453#define DC_DISP_CURSOR_FOREGROUND 0x43c
454#define DC_DISP_CURSOR_BACKGROUND 0x43d
455
456#define DC_DISP_CURSOR_START_ADDR 0x43e
Thierry Redinge6876512013-12-20 13:58:33 +0100457#define CURSOR_CLIP_DISPLAY (0 << 28)
458#define CURSOR_CLIP_WIN_A (1 << 28)
459#define CURSOR_CLIP_WIN_B (2 << 28)
460#define CURSOR_CLIP_WIN_C (3 << 28)
461#define CURSOR_SIZE_32x32 (0 << 24)
462#define CURSOR_SIZE_64x64 (1 << 24)
463#define CURSOR_SIZE_128x128 (2 << 24)
464#define CURSOR_SIZE_256x256 (3 << 24)
Thierry Redingd8f4a9e2012-11-15 21:28:22 +0000465#define DC_DISP_CURSOR_START_ADDR_NS 0x43f
466
467#define DC_DISP_CURSOR_POSITION 0x440
468#define DC_DISP_CURSOR_POSITION_NS 0x441
469
470#define DC_DISP_INIT_SEQ_CONTROL 0x442
471#define DC_DISP_SPI_INIT_SEQ_DATA_A 0x443
472#define DC_DISP_SPI_INIT_SEQ_DATA_B 0x444
473#define DC_DISP_SPI_INIT_SEQ_DATA_C 0x445
474#define DC_DISP_SPI_INIT_SEQ_DATA_D 0x446
475
476#define DC_DISP_DC_MCCIF_FIFOCTRL 0x480
477#define DC_DISP_MCCIF_DISPLAY0A_HYST 0x481
478#define DC_DISP_MCCIF_DISPLAY0B_HYST 0x482
479#define DC_DISP_MCCIF_DISPLAY1A_HYST 0x483
480#define DC_DISP_MCCIF_DISPLAY1B_HYST 0x484
481
482#define DC_DISP_DAC_CRT_CTRL 0x4c0
483#define DC_DISP_DISP_MISC_CONTROL 0x4c1
484#define DC_DISP_SD_CONTROL 0x4c2
485#define DC_DISP_SD_CSC_COEFF 0x4c3
486#define DC_DISP_SD_LUT(x) (0x4c4 + (x))
487#define DC_DISP_SD_FLICKER_CONTROL 0x4cd
488#define DC_DISP_DC_PIXEL_COUNT 0x4ce
489#define DC_DISP_SD_HISTOGRAM(x) (0x4cf + (x))
490#define DC_DISP_SD_BL_PARAMETERS 0x4d7
491#define DC_DISP_SD_BL_TF(x) (0x4d8 + (x))
492#define DC_DISP_SD_BL_CONTROL 0x4dc
493#define DC_DISP_SD_HW_K_VALUES 0x4dd
494#define DC_DISP_SD_MAN_K_VALUES 0x4de
495
Thierry Reding7116e9a2017-11-13 11:20:48 +0100496#define DC_DISP_BLEND_BACKGROUND_COLOR 0x4e4
497#define BACKGROUND_COLOR_ALPHA(x) (((x) & 0xff) << 24)
498#define BACKGROUND_COLOR_BLUE(x) (((x) & 0xff) << 16)
499#define BACKGROUND_COLOR_GREEN(x) (((x) & 0xff) << 8)
500#define BACKGROUND_COLOR_RED(x) (((x) & 0xff) << 0)
501
Thierry Reding8620fc62013-12-12 11:03:59 +0100502#define DC_DISP_INTERLACE_CONTROL 0x4e5
503#define INTERLACE_STATUS (1 << 2)
504#define INTERLACE_START (1 << 1)
505#define INTERLACE_ENABLE (1 << 0)
506
Thierry Redinge6876512013-12-20 13:58:33 +0100507#define DC_DISP_CURSOR_START_ADDR_HI 0x4ec
508#define DC_DISP_BLEND_CURSOR_CONTROL 0x4f1
509#define CURSOR_MODE_LEGACY (0 << 24)
510#define CURSOR_MODE_NORMAL (1 << 24)
511#define CURSOR_DST_BLEND_ZERO (0 << 16)
512#define CURSOR_DST_BLEND_K1 (1 << 16)
513#define CURSOR_DST_BLEND_NEG_K1_TIMES_SRC (2 << 16)
514#define CURSOR_DST_BLEND_MASK (3 << 16)
515#define CURSOR_SRC_BLEND_K1 (0 << 8)
516#define CURSOR_SRC_BLEND_K1_TIMES_SRC (1 << 8)
517#define CURSOR_SRC_BLEND_MASK (3 << 8)
518#define CURSOR_ALPHA 0xff
519
Thierry Redingc4755fb2017-11-13 11:08:13 +0100520#define DC_WIN_CORE_ACT_CONTROL 0x50e
521#define VCOUNTER (0 << 0)
522#define HCOUNTER (1 << 0)
523
524#define DC_WIN_CORE_IHUB_WGRP_LATENCY_CTLA 0x543
525#define LATENCY_CTL_MODE_ENABLE (1 << 2)
526
527#define DC_WIN_CORE_IHUB_WGRP_LATENCY_CTLB 0x544
528#define WATERMARK_MASK 0x1fffffff
529
530#define DC_WIN_CORE_PRECOMP_WGRP_PIPE_METER 0x560
531#define PIPE_METER_INT(x) (((x) & 0xff) << 8)
532#define PIPE_METER_FRAC(x) (((x) & 0xff) << 0)
533
534#define DC_WIN_CORE_IHUB_WGRP_POOL_CONFIG 0x561
535#define MEMPOOL_ENTRIES(x) (((x) & 0xffff) << 0)
536
537#define DC_WIN_CORE_IHUB_WGRP_FETCH_METER 0x562
538#define SLOTS(x) (((x) & 0xff) << 0)
539
540#define DC_WIN_CORE_IHUB_LINEBUF_CONFIG 0x563
541#define MODE_TWO_LINES (0 << 14)
542#define MODE_FOUR_LINES (1 << 14)
543
544#define DC_WIN_CORE_IHUB_THREAD_GROUP 0x568
545#define THREAD_NUM_MASK (0x1f << 1)
546#define THREAD_NUM(x) (((x) & 0x1f) << 1)
547#define THREAD_GROUP_ENABLE (1 << 0)
548
Thierry Redingf34bc782012-11-04 21:47:13 +0100549#define DC_WIN_CSC_YOF 0x611
550#define DC_WIN_CSC_KYRGB 0x612
551#define DC_WIN_CSC_KUR 0x613
552#define DC_WIN_CSC_KVR 0x614
553#define DC_WIN_CSC_KUG 0x615
554#define DC_WIN_CSC_KVG 0x616
555#define DC_WIN_CSC_KUB 0x617
556#define DC_WIN_CSC_KVB 0x618
557
Thierry Redingd8f4a9e2012-11-15 21:28:22 +0000558#define DC_WIN_WIN_OPTIONS 0x700
Thierry Redingeba66502014-02-25 12:04:06 +0100559#define H_DIRECTION (1 << 0)
560#define V_DIRECTION (1 << 2)
Thierry Redingd8f4a9e2012-11-15 21:28:22 +0000561#define COLOR_EXPAND (1 << 6)
Thierry Redingf34bc782012-11-04 21:47:13 +0100562#define CSC_ENABLE (1 << 18)
Thierry Redingd8f4a9e2012-11-15 21:28:22 +0000563#define WIN_ENABLE (1 << 30)
564
565#define DC_WIN_BYTE_SWAP 0x701
566#define BYTE_SWAP_NOSWAP (0 << 0)
567#define BYTE_SWAP_SWAP2 (1 << 0)
568#define BYTE_SWAP_SWAP4 (2 << 0)
569#define BYTE_SWAP_SWAP4HW (3 << 0)
570
571#define DC_WIN_BUFFER_CONTROL 0x702
572#define BUFFER_CONTROL_HOST (0 << 0)
573#define BUFFER_CONTROL_VI (1 << 0)
574#define BUFFER_CONTROL_EPP (2 << 0)
575#define BUFFER_CONTROL_MPEGE (3 << 0)
576#define BUFFER_CONTROL_SB2D (4 << 0)
577
578#define DC_WIN_COLOR_DEPTH 0x703
579#define WIN_COLOR_DEPTH_P1 0
580#define WIN_COLOR_DEPTH_P2 1
581#define WIN_COLOR_DEPTH_P4 2
582#define WIN_COLOR_DEPTH_P8 3
583#define WIN_COLOR_DEPTH_B4G4R4A4 4
584#define WIN_COLOR_DEPTH_B5G5R5A 5
585#define WIN_COLOR_DEPTH_B5G6R5 6
586#define WIN_COLOR_DEPTH_AB5G5R5 7
587#define WIN_COLOR_DEPTH_B8G8R8A8 12
588#define WIN_COLOR_DEPTH_R8G8B8A8 13
589#define WIN_COLOR_DEPTH_B6x2G6x2R6x2A8 14
590#define WIN_COLOR_DEPTH_R6x2G6x2B6x2A8 15
591#define WIN_COLOR_DEPTH_YCbCr422 16
592#define WIN_COLOR_DEPTH_YUV422 17
593#define WIN_COLOR_DEPTH_YCbCr420P 18
594#define WIN_COLOR_DEPTH_YUV420P 19
595#define WIN_COLOR_DEPTH_YCbCr422P 20
596#define WIN_COLOR_DEPTH_YUV422P 21
597#define WIN_COLOR_DEPTH_YCbCr422R 22
598#define WIN_COLOR_DEPTH_YUV422R 23
599#define WIN_COLOR_DEPTH_YCbCr422RA 24
600#define WIN_COLOR_DEPTH_YUV422RA 25
601
602#define DC_WIN_POSITION 0x704
Thierry Reding47307952017-08-30 17:42:54 +0200603#define H_POSITION(x) (((x) & 0x1fff) << 0) /* XXX 0x7fff on Tegra186 */
604#define V_POSITION(x) (((x) & 0x1fff) << 16) /* XXX 0x7fff on Tegra186 */
Thierry Redingd8f4a9e2012-11-15 21:28:22 +0000605
606#define DC_WIN_SIZE 0x705
Thierry Reding47307952017-08-30 17:42:54 +0200607#define H_SIZE(x) (((x) & 0x1fff) << 0) /* XXX 0x7fff on Tegra186 */
608#define V_SIZE(x) (((x) & 0x1fff) << 16) /* XXX 0x7fff on Tegra186 */
Thierry Redingd8f4a9e2012-11-15 21:28:22 +0000609
610#define DC_WIN_PRESCALED_SIZE 0x706
611#define H_PRESCALED_SIZE(x) (((x) & 0x7fff) << 0)
Thierry Reding47307952017-08-30 17:42:54 +0200612#define V_PRESCALED_SIZE(x) (((x) & 0x1fff) << 16) /* XXX 0x7fff on Tegra186 */
Thierry Redingd8f4a9e2012-11-15 21:28:22 +0000613
614#define DC_WIN_H_INITIAL_DDA 0x707
615#define DC_WIN_V_INITIAL_DDA 0x708
616#define DC_WIN_DDA_INC 0x709
617#define H_DDA_INC(x) (((x) & 0xffff) << 0)
618#define V_DDA_INC(x) (((x) & 0xffff) << 16)
619
620#define DC_WIN_LINE_STRIDE 0x70a
621#define DC_WIN_BUF_STRIDE 0x70b
622#define DC_WIN_UV_BUF_STRIDE 0x70c
623#define DC_WIN_BUFFER_ADDR_MODE 0x70d
Thierry Reding773af772013-10-04 22:34:01 +0200624#define DC_WIN_BUFFER_ADDR_MODE_LINEAR (0 << 0)
625#define DC_WIN_BUFFER_ADDR_MODE_TILE (1 << 0)
626#define DC_WIN_BUFFER_ADDR_MODE_LINEAR_UV (0 << 16)
627#define DC_WIN_BUFFER_ADDR_MODE_TILE_UV (1 << 16)
Thierry Reding47307952017-08-30 17:42:54 +0200628
Thierry Redingd8f4a9e2012-11-15 21:28:22 +0000629#define DC_WIN_DV_CONTROL 0x70e
630
631#define DC_WIN_BLEND_NOKEY 0x70f
632#define DC_WIN_BLEND_1WIN 0x710
633#define DC_WIN_BLEND_2WIN_X 0x711
634#define DC_WIN_BLEND_2WIN_Y 0x712
Thierry Redingf34bc782012-11-04 21:47:13 +0100635#define DC_WIN_BLEND_3WIN_XY 0x713
Thierry Redingd8f4a9e2012-11-15 21:28:22 +0000636
637#define DC_WIN_HP_FETCH_CONTROL 0x714
638
639#define DC_WINBUF_START_ADDR 0x800
640#define DC_WINBUF_START_ADDR_NS 0x801
641#define DC_WINBUF_START_ADDR_U 0x802
642#define DC_WINBUF_START_ADDR_U_NS 0x803
643#define DC_WINBUF_START_ADDR_V 0x804
644#define DC_WINBUF_START_ADDR_V_NS 0x805
645
646#define DC_WINBUF_ADDR_H_OFFSET 0x806
647#define DC_WINBUF_ADDR_H_OFFSET_NS 0x807
648#define DC_WINBUF_ADDR_V_OFFSET 0x808
649#define DC_WINBUF_ADDR_V_OFFSET_NS 0x809
650
651#define DC_WINBUF_UFLOW_STATUS 0x80a
Thierry Redingc134f012014-06-03 14:48:12 +0200652#define DC_WINBUF_SURFACE_KIND 0x80b
653#define DC_WINBUF_SURFACE_KIND_PITCH (0 << 0)
654#define DC_WINBUF_SURFACE_KIND_TILED (1 << 0)
655#define DC_WINBUF_SURFACE_KIND_BLOCK (2 << 0)
656#define DC_WINBUF_SURFACE_KIND_BLOCK_HEIGHT(x) (((x) & 0x7) << 4)
Thierry Redingd8f4a9e2012-11-15 21:28:22 +0000657
Thierry Reding31b02ca2017-10-12 17:40:46 +0200658#define DC_WINBUF_START_ADDR_HI 0x80d
659
Thierry Redingc4755fb2017-11-13 11:08:13 +0100660#define DC_WINBUF_CDE_CONTROL 0x82f
661#define ENABLE_SURFACE (1 << 0)
662
Thierry Redingd8f4a9e2012-11-15 21:28:22 +0000663#define DC_WINBUF_AD_UFLOW_STATUS 0xbca
664#define DC_WINBUF_BD_UFLOW_STATUS 0xdca
665#define DC_WINBUF_CD_UFLOW_STATUS 0xfca
666
Thierry Redingc4755fb2017-11-13 11:08:13 +0100667/* Tegra186 and later */
Thierry Reding47307952017-08-30 17:42:54 +0200668#define DC_DISP_CORE_SOR_SET_CONTROL(x) (0x403 + (x))
669#define PROTOCOL_MASK (0xf << 8)
670#define PROTOCOL_SINGLE_TMDS_A (0x1 << 8)
671
Thierry Redingc4755fb2017-11-13 11:08:13 +0100672#define DC_WIN_CORE_WINDOWGROUP_SET_CONTROL 0x702
673#define OWNER_MASK (0xf << 0)
674#define OWNER(x) (((x) & 0xf) << 0)
675
676#define DC_WIN_CROPPED_SIZE 0x706
677
678#define DC_WIN_PLANAR_STORAGE 0x709
679#define PITCH(x) (((x) >> 6) & 0x1fff)
680
681#define DC_WIN_SET_PARAMS 0x70d
682#define CLAMP_BEFORE_BLEND (1 << 15)
683#define DEGAMMA_NONE (0 << 13)
684#define DEGAMMA_SRGB (1 << 13)
685#define DEGAMMA_YUV8_10 (2 << 13)
686#define DEGAMMA_YUV12 (3 << 13)
687#define INPUT_RANGE_BYPASS (0 << 10)
688#define INPUT_RANGE_LIMITED (1 << 10)
689#define INPUT_RANGE_FULL (2 << 10)
690#define COLOR_SPACE_RGB (0 << 8)
691#define COLOR_SPACE_YUV_601 (1 << 8)
692#define COLOR_SPACE_YUV_709 (2 << 8)
693#define COLOR_SPACE_YUV_2020 (3 << 8)
694
695#define DC_WIN_WINDOWGROUP_SET_CONTROL_INPUT_SCALER 0x70e
696#define HORIZONTAL_TAPS_2 (1 << 3)
697#define HORIZONTAL_TAPS_5 (4 << 3)
698#define VERTICAL_TAPS_2 (1 << 0)
699#define VERTICAL_TAPS_5 (4 << 0)
700
701#define DC_WIN_WINDOWGROUP_SET_INPUT_SCALER_USAGE 0x711
702#define INPUT_SCALER_USE422 (1 << 2)
703#define INPUT_SCALER_VBYPASS (1 << 1)
704#define INPUT_SCALER_HBYPASS (1 << 0)
705
706#define DC_WIN_BLEND_LAYER_CONTROL 0x716
707#define COLOR_KEY_NONE (0 << 25)
708#define COLOR_KEY_SRC (1 << 25)
709#define COLOR_KEY_DST (2 << 25)
710#define BLEND_BYPASS (1 << 24)
711#define K2(x) (((x) & 0xff) << 16)
712#define K1(x) (((x) & 0xff) << 8)
713#define WINDOW_LAYER_DEPTH(x) (((x) & 0xff) << 0)
714
715#define DC_WIN_BLEND_MATCH_SELECT 0x717
716#define BLEND_FACTOR_DST_ALPHA_ZERO (0 << 12)
717#define BLEND_FACTOR_DST_ALPHA_ONE (1 << 12)
718#define BLEND_FACTOR_DST_ALPHA_NEG_K1_TIMES_SRC (2 << 12)
719#define BLEND_FACTOR_DST_ALPHA_K2 (3 << 12)
720#define BLEND_FACTOR_SRC_ALPHA_ZERO (0 << 8)
721#define BLEND_FACTOR_SRC_ALPHA_K1 (1 << 8)
722#define BLEND_FACTOR_SRC_ALPHA_K2 (2 << 8)
723#define BLEND_FACTOR_SRC_ALPHA_NEG_K1_TIMES_DST (3 << 8)
724#define BLEND_FACTOR_DST_COLOR_ZERO (0 << 4)
725#define BLEND_FACTOR_DST_COLOR_ONE (1 << 4)
726#define BLEND_FACTOR_DST_COLOR_K1 (2 << 4)
727#define BLEND_FACTOR_DST_COLOR_K2 (3 << 4)
728#define BLEND_FACTOR_DST_COLOR_K1_TIMES_DST (4 << 4)
729#define BLEND_FACTOR_DST_COLOR_NEG_K1_TIMES_DST (5 << 4)
730#define BLEND_FACTOR_DST_COLOR_NEG_K1_TIMES_SRC (6 << 4)
731#define BLEND_FACTOR_DST_COLOR_NEG_K1 (7 << 4)
732#define BLEND_FACTOR_SRC_COLOR_ZERO (0 << 0)
733#define BLEND_FACTOR_SRC_COLOR_ONE (1 << 0)
734#define BLEND_FACTOR_SRC_COLOR_K1 (2 << 0)
735#define BLEND_FACTOR_SRC_COLOR_K1_TIMES_DST (3 << 0)
736#define BLEND_FACTOR_SRC_COLOR_NEG_K1_TIMES_DST (4 << 0)
737#define BLEND_FACTOR_SRC_COLOR_K1_TIMES_SRC (5 << 0)
738
739#define DC_WIN_BLEND_NOMATCH_SELECT 0x718
740
741#define DC_WIN_PRECOMP_WGRP_PARAMS 0x724
742#define SWAP_UV (1 << 0)
743
744#define DC_WIN_WINDOW_SET_CONTROL 0x730
745#define CONTROL_CSC_ENABLE (1 << 5)
746
747#define DC_WINBUF_CROPPED_POINT 0x806
748#define OFFSET_Y(x) (((x) & 0xffff) << 16)
749#define OFFSET_X(x) (((x) & 0xffff) << 0)
750
Thierry Redingd8f4a9e2012-11-15 21:28:22 +0000751#endif /* TEGRA_DC_H */