aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/emgd/emgd/include/mode.h
blob: 6933d51b0aa2b6a73bd0234d3f50cb4101a62c06 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
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
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
/* -*- pse-c -*-
 *-----------------------------------------------------------------------------
 * Filename: mode.h
 * $Revision: 1.5 $
 *-----------------------------------------------------------------------------
 * Copyright © 2002-2010, Intel Corporation.
 *
 * This program is free software; you can redistribute it and/or modify it
 * under the terms and conditions of the GNU General Public License,
 * version 2, as published by the Free Software Foundation.
 *
 * This program is distributed in the hope it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
 * more details.
 *
 * You should have received a copy of the GNU General Public License along with
 * this program; if not, write to the Free Software Foundation, Inc.,
 * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
 *
 *-----------------------------------------------------------------------------
 * Description:
 *  Contain header information for set mode support
 *-----------------------------------------------------------------------------
 */

#ifndef _MODE_H_
#define _MODE_H_

/* IO.h is needed for the FAR define */
#include <io.h>

#include <igd_init.h>
#include <igd_mode.h>
#include <general.h>
#include <context.h>
#include <cmd.h>
#include <pd.h>
#include <edid.h>
#include <displayid.h>
#include <igd_render.h>

#ifndef TRUE
#define TRUE  1
#endif

#ifndef FALSE
#define FALSE 0
#endif

#define IGD_INVALID_MODE 0

/*****************/
/* Plane Features */
/*****************/
#define IGD_PLANE_FEATURES_MASK      0x000000FF
#define IGD_PLANE_DISPLAY            0x00000001
#define IGD_PLANE_OVERLAY            0x00000002
#define IGD_PLANE_SPRITE             0x00000004
#define IGD_PLANE_CURSOR             0x00000008
#define IGD_PLANE_VGA                0x00000010
#define IGD_PLANE_DOUBLE             0x00000020
/*#define IGD_PLANE_CLONE            0x00000040 currently unused */
#define IGD_PLANE_DIH                0x00000080
#define IGD_PLANE_USE_PIPEA          0x00000100
#define IGD_PLANE_USE_PIPEB          0x00000200

/*****************/
/* Pipe Features */
/*****************/
/* pipe's supported features */
#define IGD_PIPE_FEATURES_MASK       0x000000FF
#define IGD_PIPE_DOUBLE              0x00000001
/* the following 2 bits are not pipe features but
 * pipe identification bits that share the same
 * pipe_features variable of the pipe structure
 * NOTE that these bit-wise OR flags in nibble-2
 * are also used in the port_features variable
 * of the port structure (same locations) but
 * called IGD_PORT_USE_PIPEX
 */
#define IGD_PIPE_IS_PIPEA            0x00000100
#define IGD_PIPE_IS_PIPEB            0x00000200

/*******************/
/* Cursor Features */
/*******************/
/*
 * Cursor's supported features
 */
/*
 * cursor's pipe usage regulations. These are copies of the PIPE_IS_ bits so
 * that a quick (pipe_features & plane_features & MASK) will tell you if
 * the pipe can be used.
 */
#define IGD_CURSOR_USE_PIPE_MASK       0x00000F00
#define IGD_CURSOR_USE_PIPEA           IGD_PIPE_IS_PIPEA
#define IGD_CURSOR_USE_PIPEB           IGD_PIPE_IS_PIPEB

/*****************/
/* Port features */
/*****************/
/*
 * Port's supported features
 *
 * port features also uses IGD_PORT_SHARE_MASK thus port feature bits
 * cannot collide with IGD_PORT_SHARE_MASK
 */
#define IGD_PORT_FEATURES_MASK       0x000000FF
#define IGD_RGBA_COLOR               0x00000001
#define IGD_RGBA_ALPHA               0x00000002
#define IGD_VGA_COMPRESS             0x00000004 /* Compress VGA to 640x480 */
#define IGD_PORT_GANG                0x00000008
/*
 * port's pipe usage regulations. These are copies of the PIPE_IS_ bits so
 * that a quick (pipe_features & port_features & MASK) will tell you if
 * the pipe can be used.
 */
#define IGD_PORT_USE_PIPE_MASK       0x00000F00
#define IGD_PORT_USE_PIPE_MASK_SHIFT 8
#define IGD_PORT_USE_PIPEA           IGD_PIPE_IS_PIPEA
#define IGD_PORT_USE_PIPEB           IGD_PIPE_IS_PIPEB
/*
 * Ports Sharing information. The port in question can share a pipe with the
 * listed ports. If a shares with b, b must share with a too.
 * Must be the same as IGD_PORT_MASK = 0x3f000
 */
#define IGD_PORT_SHARE_MASK          IGD_PORT_MASK
#define IGD_PORT_SHARE_ANALOG        IGD_PORT_ANALOG
#define IGD_PORT_SHARE_DIGITAL       IGD_PORT_DIGITAL
#define IGD_PORT_SHARE_LVDS          IGD_PORT_LVDS
#define IGD_PORT_SHARE_TV            IGD_PORT_TV

/* MAX rings, planes and ports connected to a pipe */
#define IGD_MAX_PIPE_QUEUES      4
#define IGD_MAX_PIPE_PLANES      5
#define IGD_MAX_PIPE_DISPLAYS    4
#define IGD_MAX_PIPES            2
#define MAX_DISPLAYS             IGD_MAX_DISPLAYS /* From igd_mode.h */

/* Parameters to mode_update_plane_pipe_ports */
#define MODE_UPDATE_PLANE  0x1
#define MODE_UPDATE_PIPE   0x2
#define MODE_UPDATE_PORT   0x4
#define MODE_UPDATE_NONE   0x0

#define PLANE(display) \
	((igd_display_plane_t *)(((igd_display_context_t *)display)->plane))
#define PIPE(display)  \
	((igd_display_pipe_t *)(((igd_display_context_t *)display)->pipe))
#define PORT(display, pn)  \
	((igd_display_port_t *)(((igd_display_context_t *)display)->port[pn-1]))
#define PORT_OWNER(display)  \
	((igd_display_port_t *)(((igd_display_context_t *)display)->port[display->port_number-1]))

#define MODE_IS_SUPPORTED(t) (t->mode_info_flags & IGD_MODE_SUPPORTED)
#define MODE_IS_VGA(t) \
	((((pd_timing_t *)t)->mode_info_flags & IGD_MODE_VESA) &&	\
		(t->mode_number < 0x1D))

/* #define DC_PORT_NUMBER(dc, i) ((dc >> (i * 4)) & 0x0f) */
#define DC_PORT_NUMBER IGD_DC_PORT_NUMBER

/* This structure is used for the mode table which is a list of all
 * supported modes. */

typedef pd_timing_t igd_timing_info_t, *pigd_timing_info_t;


/*
 * NOTE: The plane typedef is a generic type. Each plane type has an
 * equivalent typedef that is more specific to the type of plane. They
 * MUST remain equivalent. If you change one you must change them all.
 */
typedef struct _igd_plane {
	unsigned long plane_reg;       /* plane control register */
	unsigned long plane_features;  /* plane feature list */
	int           inuse;           /* plane inuse ? */
	int           ref_cnt;         /* # of displays using this plane */
	unsigned long *pixel_formats;  /* supported pixel formats */
	void *plane_info;              /* ptr to plane_info */
	struct _igd_plane *mirror;     /* pointer to mirror plane */
} igd_plane_t;

typedef struct _igd_display_plane {
	unsigned long plane_reg;         /* plane contron register */
	unsigned long plane_features;    /* list of plane features */
	int           inuse;             /* plane inuse ? */
	int           ref_cnt;           /* # of displays using this plane */
	unsigned long *pixel_formats;    /* list of pixel formats supported */
	igd_framebuffer_info_t *fb_info; /* attached fb to this plane */
	struct _igd_display_plane *mirror;  /* pointer to mirror plane */
} igd_display_plane_t, *pigd_display_plane_t;

typedef struct _igd_cursor {
	unsigned long cursor_reg;        /* cursor control register */
	unsigned long plane_features;    /* cursor plane features */
	int           inuse;             /* is this cursor in use? */
	int           ref_cnt;           /* # of displays using this plane */
	unsigned long *pixel_formats;    /* list of pixel_formats supported */
	igd_cursor_info_t *cursor_info;
	struct _igd_cursor *mirror;  /* pointer to mirror plane */
} igd_cursor_t;

typedef struct _igd_clock {
	unsigned long dpll_control;       /* DPLL control register */
	unsigned long mnp;                /* FPx0 register */
	unsigned long p_shift;            /* Bit location of P within control */
	unsigned long actual_dclk;		  /* The actual dotclock after calculating dpll */
}igd_clock_t;

typedef struct _igd_display_pipe {
	unsigned long pipe_num;             /* 0 Based index */
	unsigned long pipe_reg;             /* pipe configuration register */
	unsigned long timing_reg;           /* timing register(htotal) */
	unsigned long palette_reg;          /* palette register */
	igd_clock_t   *clock_reg;           /* DPLL clock registers */
	unsigned long pipe_features;        /* pipe features */
	int           inuse;                /* pipe allocated? TRUE/FALSE */
	int           ref_cnt;              /* # of displays using this pipe */
	cmd_queue_t *queue[IGD_MAX_PIPE_QUEUES]; /* Queues for this pipe */
	igd_display_plane_t   *plane;      /* dsp plane connected to pipe */
	igd_cursor_t          *cursor;     /* cursor connected to this pipe */
	void                  *sprite;     /* sprite connected to this pipe */
	igd_timing_info_t     *timing;     /* current timings on the port */
	igd_display_context_t *owner;      /* owner display of this pipe */
	unsigned long dclk;                /* current dclk running on this pipe */
}igd_display_pipe_t, *pigd_display_pipe_t;

typedef struct _igd_display_port {
	unsigned long port_type;            /* port type */
	unsigned long port_number;          /* port number */
	char          port_name[8];         /* port name DVO A, B, C, LVDS, ANALOG */
	unsigned long port_reg;             /* port control register */
	unsigned long i2c_reg;              /* GPIO pins for i2c on this port */
	unsigned long dab;                  /* i2c Device Address Byte */
	unsigned long ddc_reg;              /* GPIO pins for DDC on this port */
	unsigned long ddc_dab;
	unsigned long port_features;        /* port features */
	unsigned long clock_bits;           /* Clock input to use */
	int           inuse;                /* port is in use */
	unsigned long  power_state;         /* D Power state for the display/port */
	unsigned long bl_power_state;       /* D Power state for the FP backlight */
	struct _igd_display_port *mult_port;/* pointer to multiplexed port,
										 * if it is used in that way */
	igd_display_info_t    *pt_info;     /* port timing info */
	pd_driver_t           *pd_driver;
	void                  *pd_context;  /* Context returned from PD */
	pd_callback_t         *callback;    /* DD Callback to passed to PD */
	unsigned long         num_timing;   /* number of timings available */
	igd_timing_info_t     *timing_table; /* static/dynamic PD timings list */
	unsigned long         i2c_speed;    /* Connected encoder's I2C bus speed */
	unsigned long         ddc_speed;    /* DDC speed in KHz */
	igd_param_fp_info_t   *fp_info;     /* Flat panel parameter info if any */
	igd_param_dtd_list_t  *dtd_list;    /* EDID-less DTD info if any */
	igd_param_attr_list_t *attr_list;   /* Saved attributes if any */
	igd_attr_t            *tmp_attr;    /* Temp attr array, for copying */
	unsigned int          tmp_attr_num; /* Number of attr in temp array */
	igd_timing_info_t     *fp_native_dtd; /* FP native DTD */
	unsigned long         pd_type;      /* Display type given by port driver */
	unsigned long         pd_flags;     /* port driver flags */
	unsigned long         saved_bl_power_state;

	/* This attribute list is designed to eventually suck in things above
	 * such as fb_info.  For now, it only has color correction attributes */
	igd_attr_t            *attributes;

	unsigned char         firmware_type;
	union {
		displayid_t       *displayid;
		edid_t            *edid;         /* EDID information */
	};

    /* Added for VBIOS size Reduction */
	unsigned long         preserve;
	unsigned long         mult_preserve;
	unsigned long         vga_sync;

}igd_display_port_t, *pigd_display_port_t;

/* This structure is used to save mode state.
 * Rightnow, it is saving state of current port and its port driver state.
 * This information is used while restoring to a previously saved mode
 * state.
 * TODO: This can be extended to save all display modules (mode, dsp, pi) reg
 * information along with port driver's state information. This requires
 * changes to exiting reg module. */
#define MAX_PORT_DRIVERS     20
typedef struct _mode_pd_state {
		igd_display_port_t *port;       /* display port */
		void               *state;      /* and its port driver state */
} mode_pd_state_t;

typedef struct _mode_state_t {
	mode_pd_state_t pd_state[MAX_PORT_DRIVERS];
} mode_state_t;

#endif // _IGD_MODE_H_


/*----------------------------------------------------------------------------
 * File Revision History
 * $Id: mode.h,v 1.5 2010/07/23 16:54:50 bpaauwe Exp $
 * $Source: /nfs/fm/proj/eia/cvsroot/koheo/linux/egd_drm/emgd/include/mode.h,v $
 *----------------------------------------------------------------------------
 */