Subversion Repositories Kolibri OS

Rev

Rev 3746 | Rev 4560 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
2351 Serge 1
/*
2
 * Copyright © 2006 Intel Corporation
3
 *
4
 * Permission is hereby granted, free of charge, to any person obtaining a
5
 * copy of this software and associated documentation files (the "Software"),
6
 * to deal in the Software without restriction, including without limitation
7
 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8
 * and/or sell copies of the Software, and to permit persons to whom the
9
 * Software is furnished to do so, subject to the following conditions:
10
 *
11
 * The above copyright notice and this permission notice (including the next
12
 * paragraph) shall be included in all copies or substantial portions of the
13
 * Software.
14
 *
15
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
18
 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
 * SOFTWARE.
22
 *
23
 * Authors:
24
 *    Eric Anholt 
25
 *
26
 */
27
#include 
3031 serge 28
#include 
29
#include 
2351 Serge 30
#include "i915_drv.h"
31
#include "intel_bios.h"
32
 
33
#define	SLAVE_ADDR1	0x70
34
#define	SLAVE_ADDR2	0x72
35
 
36
static int panel_type;
37
 
38
static void *
39
find_section(struct bdb_header *bdb, int section_id)
40
{
41
	u8 *base = (u8 *)bdb;
42
	int index = 0;
43
	u16 total, current_size;
44
	u8 current_id;
45
 
46
	/* skip to first section */
47
	index += bdb->header_size;
48
	total = bdb->bdb_size;
49
 
50
	/* walk the sections looking for section_id */
51
	while (index < total) {
52
		current_id = *(base + index);
53
		index++;
54
		current_size = *((u16 *)(base + index));
55
		index += 2;
56
		if (current_id == section_id)
57
			return base + index;
58
		index += current_size;
59
	}
60
 
61
	return NULL;
62
}
63
 
64
static u16
65
get_blocksize(void *p)
66
{
67
	u16 *block_ptr, block_size;
68
 
69
	block_ptr = (u16 *)((char *)p - 2);
70
	block_size = *block_ptr;
71
	return block_size;
72
}
73
 
74
static void
75
fill_detail_timing_data(struct drm_display_mode *panel_fixed_mode,
76
			const struct lvds_dvo_timing *dvo_timing)
77
{
78
	panel_fixed_mode->hdisplay = (dvo_timing->hactive_hi << 8) |
79
		dvo_timing->hactive_lo;
80
	panel_fixed_mode->hsync_start = panel_fixed_mode->hdisplay +
81
		((dvo_timing->hsync_off_hi << 8) | dvo_timing->hsync_off_lo);
82
	panel_fixed_mode->hsync_end = panel_fixed_mode->hsync_start +
83
		dvo_timing->hsync_pulse_width;
84
	panel_fixed_mode->htotal = panel_fixed_mode->hdisplay +
85
		((dvo_timing->hblank_hi << 8) | dvo_timing->hblank_lo);
86
 
87
	panel_fixed_mode->vdisplay = (dvo_timing->vactive_hi << 8) |
88
		dvo_timing->vactive_lo;
89
	panel_fixed_mode->vsync_start = panel_fixed_mode->vdisplay +
90
		dvo_timing->vsync_off;
91
	panel_fixed_mode->vsync_end = panel_fixed_mode->vsync_start +
92
		dvo_timing->vsync_pulse_width;
93
	panel_fixed_mode->vtotal = panel_fixed_mode->vdisplay +
94
		((dvo_timing->vblank_hi << 8) | dvo_timing->vblank_lo);
95
	panel_fixed_mode->clock = dvo_timing->clock * 10;
96
	panel_fixed_mode->type = DRM_MODE_TYPE_PREFERRED;
97
 
98
	if (dvo_timing->hsync_positive)
99
		panel_fixed_mode->flags |= DRM_MODE_FLAG_PHSYNC;
100
	else
101
		panel_fixed_mode->flags |= DRM_MODE_FLAG_NHSYNC;
102
 
103
	if (dvo_timing->vsync_positive)
104
		panel_fixed_mode->flags |= DRM_MODE_FLAG_PVSYNC;
105
	else
106
		panel_fixed_mode->flags |= DRM_MODE_FLAG_NVSYNC;
107
 
108
	/* Some VBTs have bogus h/vtotal values */
109
	if (panel_fixed_mode->hsync_end > panel_fixed_mode->htotal)
110
		panel_fixed_mode->htotal = panel_fixed_mode->hsync_end + 1;
111
	if (panel_fixed_mode->vsync_end > panel_fixed_mode->vtotal)
112
		panel_fixed_mode->vtotal = panel_fixed_mode->vsync_end + 1;
113
 
114
	drm_mode_set_name(panel_fixed_mode);
115
}
116
 
117
static bool
118
lvds_dvo_timing_equal_size(const struct lvds_dvo_timing *a,
119
			   const struct lvds_dvo_timing *b)
120
{
121
	if (a->hactive_hi != b->hactive_hi ||
122
	    a->hactive_lo != b->hactive_lo)
123
		return false;
124
 
125
	if (a->hsync_off_hi != b->hsync_off_hi ||
126
	    a->hsync_off_lo != b->hsync_off_lo)
127
		return false;
128
 
129
	if (a->hsync_pulse_width != b->hsync_pulse_width)
130
		return false;
131
 
132
	if (a->hblank_hi != b->hblank_hi ||
133
	    a->hblank_lo != b->hblank_lo)
134
		return false;
135
 
136
	if (a->vactive_hi != b->vactive_hi ||
137
	    a->vactive_lo != b->vactive_lo)
138
		return false;
139
 
140
	if (a->vsync_off != b->vsync_off)
141
		return false;
142
 
143
	if (a->vsync_pulse_width != b->vsync_pulse_width)
144
		return false;
145
 
146
	if (a->vblank_hi != b->vblank_hi ||
147
	    a->vblank_lo != b->vblank_lo)
148
		return false;
149
 
150
	return true;
151
}
152
 
153
static const struct lvds_dvo_timing *
154
get_lvds_dvo_timing(const struct bdb_lvds_lfp_data *lvds_lfp_data,
155
		    const struct bdb_lvds_lfp_data_ptrs *lvds_lfp_data_ptrs,
156
		    int index)
157
{
158
	/*
159
	 * the size of fp_timing varies on the different platform.
160
	 * So calculate the DVO timing relative offset in LVDS data
161
	 * entry to get the DVO timing entry
162
	 */
163
 
164
	int lfp_data_size =
165
		lvds_lfp_data_ptrs->ptr[1].dvo_timing_offset -
166
		lvds_lfp_data_ptrs->ptr[0].dvo_timing_offset;
167
	int dvo_timing_offset =
168
		lvds_lfp_data_ptrs->ptr[0].dvo_timing_offset -
169
		lvds_lfp_data_ptrs->ptr[0].fp_timing_offset;
170
	char *entry = (char *)lvds_lfp_data->data + lfp_data_size * index;
171
 
172
	return (struct lvds_dvo_timing *)(entry + dvo_timing_offset);
173
}
174
 
3031 serge 175
/* get lvds_fp_timing entry
176
 * this function may return NULL if the corresponding entry is invalid
177
 */
178
static const struct lvds_fp_timing *
179
get_lvds_fp_timing(const struct bdb_header *bdb,
180
		   const struct bdb_lvds_lfp_data *data,
181
		   const struct bdb_lvds_lfp_data_ptrs *ptrs,
182
		   int index)
183
{
184
	size_t data_ofs = (const u8 *)data - (const u8 *)bdb;
185
	u16 data_size = ((const u16 *)data)[-1]; /* stored in header */
186
	size_t ofs;
187
 
188
	if (index >= ARRAY_SIZE(ptrs->ptr))
189
		return NULL;
190
	ofs = ptrs->ptr[index].fp_timing_offset;
191
	if (ofs < data_ofs ||
192
	    ofs + sizeof(struct lvds_fp_timing) > data_ofs + data_size)
193
		return NULL;
194
	return (const struct lvds_fp_timing *)((const u8 *)bdb + ofs);
195
}
196
 
2351 Serge 197
/* Try to find integrated panel data */
198
static void
199
parse_lfp_panel_data(struct drm_i915_private *dev_priv,
200
			    struct bdb_header *bdb)
201
{
202
	const struct bdb_lvds_options *lvds_options;
203
	const struct bdb_lvds_lfp_data *lvds_lfp_data;
204
	const struct bdb_lvds_lfp_data_ptrs *lvds_lfp_data_ptrs;
205
	const struct lvds_dvo_timing *panel_dvo_timing;
3031 serge 206
	const struct lvds_fp_timing *fp_timing;
2351 Serge 207
	struct drm_display_mode *panel_fixed_mode;
208
	int i, downclock;
209
 
210
	lvds_options = find_section(bdb, BDB_LVDS_OPTIONS);
211
	if (!lvds_options)
212
		return;
213
 
4104 Serge 214
	dev_priv->vbt.lvds_dither = lvds_options->pixel_dither;
2351 Serge 215
	if (lvds_options->panel_type == 0xff)
216
		return;
217
 
218
	panel_type = lvds_options->panel_type;
219
 
220
	lvds_lfp_data = find_section(bdb, BDB_LVDS_LFP_DATA);
221
	if (!lvds_lfp_data)
222
		return;
223
 
224
	lvds_lfp_data_ptrs = find_section(bdb, BDB_LVDS_LFP_DATA_PTRS);
225
	if (!lvds_lfp_data_ptrs)
226
		return;
227
 
4104 Serge 228
	dev_priv->vbt.lvds_vbt = 1;
2351 Serge 229
 
230
	panel_dvo_timing = get_lvds_dvo_timing(lvds_lfp_data,
231
					       lvds_lfp_data_ptrs,
232
					       lvds_options->panel_type);
233
 
234
	panel_fixed_mode = kzalloc(sizeof(*panel_fixed_mode), GFP_KERNEL);
235
	if (!panel_fixed_mode)
236
		return;
237
 
238
	fill_detail_timing_data(panel_fixed_mode, panel_dvo_timing);
239
 
4104 Serge 240
	dev_priv->vbt.lfp_lvds_vbt_mode = panel_fixed_mode;
2351 Serge 241
 
242
	DRM_DEBUG_KMS("Found panel mode in BIOS VBT tables:\n");
243
	drm_mode_debug_printmodeline(panel_fixed_mode);
244
 
245
	/*
246
	 * Iterate over the LVDS panel timing info to find the lowest clock
247
	 * for the native resolution.
248
	 */
249
	downclock = panel_dvo_timing->clock;
250
	for (i = 0; i < 16; i++) {
251
		const struct lvds_dvo_timing *dvo_timing;
252
 
253
		dvo_timing = get_lvds_dvo_timing(lvds_lfp_data,
254
						 lvds_lfp_data_ptrs,
255
						 i);
256
		if (lvds_dvo_timing_equal_size(dvo_timing, panel_dvo_timing) &&
257
		    dvo_timing->clock < downclock)
258
			downclock = dvo_timing->clock;
259
	}
260
 
261
	if (downclock < panel_dvo_timing->clock && i915_lvds_downclock) {
262
		dev_priv->lvds_downclock_avail = 1;
263
		dev_priv->lvds_downclock = downclock * 10;
264
		DRM_DEBUG_KMS("LVDS downclock is found in VBT. "
265
			      "Normal Clock %dKHz, downclock %dKHz\n",
266
			      panel_fixed_mode->clock, 10*downclock);
267
	}
3031 serge 268
 
269
	fp_timing = get_lvds_fp_timing(bdb, lvds_lfp_data,
270
				       lvds_lfp_data_ptrs,
271
				       lvds_options->panel_type);
272
	if (fp_timing) {
273
		/* check the resolution, just to be sure */
274
		if (fp_timing->x_res == panel_fixed_mode->hdisplay &&
275
		    fp_timing->y_res == panel_fixed_mode->vdisplay) {
4104 Serge 276
			dev_priv->vbt.bios_lvds_val = fp_timing->lvds_reg_val;
3031 serge 277
			DRM_DEBUG_KMS("VBT initial LVDS value %x\n",
4104 Serge 278
				      dev_priv->vbt.bios_lvds_val);
3031 serge 279
		}
280
	}
2351 Serge 281
}
282
 
283
/* Try to find sdvo panel data */
284
static void
285
parse_sdvo_panel_data(struct drm_i915_private *dev_priv,
286
		      struct bdb_header *bdb)
287
{
288
	struct lvds_dvo_timing *dvo_timing;
289
	struct drm_display_mode *panel_fixed_mode;
290
	int index;
291
 
292
	index = i915_vbt_sdvo_panel_type;
3031 serge 293
	if (index == -2) {
294
		DRM_DEBUG_KMS("Ignore SDVO panel mode from BIOS VBT tables.\n");
295
		return;
296
	}
297
 
2351 Serge 298
	if (index == -1) {
299
		struct bdb_sdvo_lvds_options *sdvo_lvds_options;
300
 
301
		sdvo_lvds_options = find_section(bdb, BDB_SDVO_LVDS_OPTIONS);
302
		if (!sdvo_lvds_options)
303
			return;
304
 
305
		index = sdvo_lvds_options->panel_type;
306
	}
307
 
308
	dvo_timing = find_section(bdb, BDB_SDVO_PANEL_DTDS);
309
	if (!dvo_timing)
310
		return;
311
 
312
	panel_fixed_mode = kzalloc(sizeof(*panel_fixed_mode), GFP_KERNEL);
313
	if (!panel_fixed_mode)
314
		return;
315
 
316
	fill_detail_timing_data(panel_fixed_mode, dvo_timing + index);
317
 
4104 Serge 318
	dev_priv->vbt.sdvo_lvds_vbt_mode = panel_fixed_mode;
2351 Serge 319
 
320
	DRM_DEBUG_KMS("Found SDVO panel mode in BIOS VBT tables:\n");
321
	drm_mode_debug_printmodeline(panel_fixed_mode);
322
}
323
 
324
static int intel_bios_ssc_frequency(struct drm_device *dev,
325
				    bool alternate)
326
{
327
	switch (INTEL_INFO(dev)->gen) {
328
	case 2:
329
		return alternate ? 66 : 48;
330
	case 3:
331
	case 4:
332
		return alternate ? 100 : 96;
333
	default:
334
		return alternate ? 100 : 120;
335
	}
336
}
337
 
338
static void
339
parse_general_features(struct drm_i915_private *dev_priv,
340
		       struct bdb_header *bdb)
341
{
342
	struct drm_device *dev = dev_priv->dev;
343
	struct bdb_general_features *general;
344
 
345
	general = find_section(bdb, BDB_GENERAL_FEATURES);
346
	if (general) {
4104 Serge 347
		dev_priv->vbt.int_tv_support = general->int_tv_support;
348
		dev_priv->vbt.int_crt_support = general->int_crt_support;
349
		dev_priv->vbt.lvds_use_ssc = general->enable_ssc;
350
		dev_priv->vbt.lvds_ssc_freq =
2351 Serge 351
			intel_bios_ssc_frequency(dev, general->ssc_freq);
4104 Serge 352
		dev_priv->vbt.display_clock_mode = general->display_clock_mode;
353
		dev_priv->vbt.fdi_rx_polarity_inverted = general->fdi_rx_polarity_inverted;
3746 Serge 354
		DRM_DEBUG_KMS("BDB_GENERAL_FEATURES int_tv_support %d int_crt_support %d lvds_use_ssc %d lvds_ssc_freq %d display_clock_mode %d fdi_rx_polarity_inverted %d\n",
4104 Serge 355
			      dev_priv->vbt.int_tv_support,
356
			      dev_priv->vbt.int_crt_support,
357
			      dev_priv->vbt.lvds_use_ssc,
358
			      dev_priv->vbt.lvds_ssc_freq,
359
			      dev_priv->vbt.display_clock_mode,
360
			      dev_priv->vbt.fdi_rx_polarity_inverted);
2351 Serge 361
	}
362
}
363
 
364
static void
365
parse_general_definitions(struct drm_i915_private *dev_priv,
366
			  struct bdb_header *bdb)
367
{
368
	struct bdb_general_definitions *general;
369
 
370
	general = find_section(bdb, BDB_GENERAL_DEFINITIONS);
371
	if (general) {
372
		u16 block_size = get_blocksize(general);
373
		if (block_size >= sizeof(*general)) {
374
			int bus_pin = general->crt_ddc_gmbus_pin;
375
			DRM_DEBUG_KMS("crt_ddc_bus_pin: %d\n", bus_pin);
3031 serge 376
			if (intel_gmbus_is_port_valid(bus_pin))
4104 Serge 377
				dev_priv->vbt.crt_ddc_pin = bus_pin;
2351 Serge 378
		} else {
379
			DRM_DEBUG_KMS("BDB_GD too small (%d). Invalid.\n",
380
				  block_size);
381
		}
382
	}
383
}
384
 
385
static void
386
parse_sdvo_device_mapping(struct drm_i915_private *dev_priv,
387
			  struct bdb_header *bdb)
388
{
389
	struct sdvo_device_mapping *p_mapping;
390
	struct bdb_general_definitions *p_defs;
391
	struct child_device_config *p_child;
392
	int i, child_device_num, count;
393
	u16	block_size;
394
 
395
	p_defs = find_section(bdb, BDB_GENERAL_DEFINITIONS);
396
	if (!p_defs) {
397
		DRM_DEBUG_KMS("No general definition block is found, unable to construct sdvo mapping.\n");
398
		return;
399
	}
400
	/* judge whether the size of child device meets the requirements.
401
	 * If the child device size obtained from general definition block
402
	 * is different with sizeof(struct child_device_config), skip the
403
	 * parsing of sdvo device info
404
	 */
405
	if (p_defs->child_dev_size != sizeof(*p_child)) {
406
		/* different child dev size . Ignore it */
407
		DRM_DEBUG_KMS("different child size is found. Invalid.\n");
408
		return;
409
	}
410
	/* get the block size of general definitions */
411
	block_size = get_blocksize(p_defs);
412
	/* get the number of child device */
413
	child_device_num = (block_size - sizeof(*p_defs)) /
414
				sizeof(*p_child);
415
	count = 0;
416
	for (i = 0; i < child_device_num; i++) {
417
		p_child = &(p_defs->devices[i]);
418
		if (!p_child->device_type) {
419
			/* skip the device block if device type is invalid */
420
			continue;
421
		}
422
		if (p_child->slave_addr != SLAVE_ADDR1 &&
423
			p_child->slave_addr != SLAVE_ADDR2) {
424
			/*
425
			 * If the slave address is neither 0x70 nor 0x72,
426
			 * it is not a SDVO device. Skip it.
427
			 */
428
			continue;
429
		}
430
		if (p_child->dvo_port != DEVICE_PORT_DVOB &&
431
			p_child->dvo_port != DEVICE_PORT_DVOC) {
432
			/* skip the incorrect SDVO port */
433
			DRM_DEBUG_KMS("Incorrect SDVO port. Skip it\n");
434
			continue;
435
		}
436
		DRM_DEBUG_KMS("the SDVO device with slave addr %2x is found on"
437
				" %s port\n",
438
				p_child->slave_addr,
439
				(p_child->dvo_port == DEVICE_PORT_DVOB) ?
440
					"SDVOB" : "SDVOC");
441
		p_mapping = &(dev_priv->sdvo_mappings[p_child->dvo_port - 1]);
442
		if (!p_mapping->initialized) {
443
			p_mapping->dvo_port = p_child->dvo_port;
444
			p_mapping->slave_addr = p_child->slave_addr;
445
			p_mapping->dvo_wiring = p_child->dvo_wiring;
446
			p_mapping->ddc_pin = p_child->ddc_pin;
447
			p_mapping->i2c_pin = p_child->i2c_pin;
448
			p_mapping->initialized = 1;
449
			DRM_DEBUG_KMS("SDVO device: dvo=%x, addr=%x, wiring=%d, ddc_pin=%d, i2c_pin=%d\n",
450
				      p_mapping->dvo_port,
451
				      p_mapping->slave_addr,
452
				      p_mapping->dvo_wiring,
453
				      p_mapping->ddc_pin,
454
				      p_mapping->i2c_pin);
455
		} else {
456
			DRM_DEBUG_KMS("Maybe one SDVO port is shared by "
457
					 "two SDVO device.\n");
458
		}
459
		if (p_child->slave2_addr) {
460
			/* Maybe this is a SDVO device with multiple inputs */
461
			/* And the mapping info is not added */
462
			DRM_DEBUG_KMS("there exists the slave2_addr. Maybe this"
463
				" is a SDVO device with multiple inputs.\n");
464
		}
465
		count++;
466
	}
467
 
468
	if (!count) {
469
		/* No SDVO device info is found */
470
		DRM_DEBUG_KMS("No SDVO device info is found in VBT\n");
471
	}
472
	return;
473
}
474
 
475
static void
476
parse_driver_features(struct drm_i915_private *dev_priv,
477
		       struct bdb_header *bdb)
478
{
479
	struct drm_device *dev = dev_priv->dev;
480
	struct bdb_driver_features *driver;
481
 
482
	driver = find_section(bdb, BDB_DRIVER_FEATURES);
483
	if (!driver)
484
		return;
485
 
486
	if (SUPPORTS_EDP(dev) &&
487
	    driver->lvds_config == BDB_DRIVER_FEATURE_EDP)
4104 Serge 488
		dev_priv->vbt.edp_support = 1;
2351 Serge 489
 
490
	if (driver->dual_frequency)
491
		dev_priv->render_reclock_avail = true;
492
}
493
 
494
static void
495
parse_edp(struct drm_i915_private *dev_priv, struct bdb_header *bdb)
496
{
497
	struct bdb_edp *edp;
498
	struct edp_power_seq *edp_pps;
499
	struct edp_link_params *edp_link_params;
500
 
501
	edp = find_section(bdb, BDB_EDP);
502
	if (!edp) {
4104 Serge 503
		if (SUPPORTS_EDP(dev_priv->dev) && dev_priv->vbt.edp_support)
3120 serge 504
			DRM_DEBUG_KMS("No eDP BDB found but eDP panel supported.\n");
2351 Serge 505
		return;
506
	}
507
 
508
	switch ((edp->color_depth >> (panel_type * 2)) & 3) {
509
	case EDP_18BPP:
4104 Serge 510
		dev_priv->vbt.edp_bpp = 18;
2351 Serge 511
		break;
512
	case EDP_24BPP:
4104 Serge 513
		dev_priv->vbt.edp_bpp = 24;
2351 Serge 514
		break;
515
	case EDP_30BPP:
4104 Serge 516
		dev_priv->vbt.edp_bpp = 30;
2351 Serge 517
		break;
518
	}
519
 
520
	/* Get the eDP sequencing and link info */
521
	edp_pps = &edp->power_seqs[panel_type];
522
	edp_link_params = &edp->link_params[panel_type];
523
 
4104 Serge 524
	dev_priv->vbt.edp_pps = *edp_pps;
2351 Serge 525
 
4104 Serge 526
	dev_priv->vbt.edp_rate = edp_link_params->rate ? DP_LINK_BW_2_7 :
2351 Serge 527
		DP_LINK_BW_1_62;
528
	switch (edp_link_params->lanes) {
529
	case 0:
4104 Serge 530
		dev_priv->vbt.edp_lanes = 1;
2351 Serge 531
		break;
532
	case 1:
4104 Serge 533
		dev_priv->vbt.edp_lanes = 2;
2351 Serge 534
		break;
535
	case 3:
536
	default:
4104 Serge 537
		dev_priv->vbt.edp_lanes = 4;
2351 Serge 538
		break;
539
	}
540
	switch (edp_link_params->preemphasis) {
541
	case 0:
4104 Serge 542
		dev_priv->vbt.edp_preemphasis = DP_TRAIN_PRE_EMPHASIS_0;
2351 Serge 543
		break;
544
	case 1:
4104 Serge 545
		dev_priv->vbt.edp_preemphasis = DP_TRAIN_PRE_EMPHASIS_3_5;
2351 Serge 546
		break;
547
	case 2:
4104 Serge 548
		dev_priv->vbt.edp_preemphasis = DP_TRAIN_PRE_EMPHASIS_6;
2351 Serge 549
		break;
550
	case 3:
4104 Serge 551
		dev_priv->vbt.edp_preemphasis = DP_TRAIN_PRE_EMPHASIS_9_5;
2351 Serge 552
		break;
553
	}
554
	switch (edp_link_params->vswing) {
555
	case 0:
4104 Serge 556
		dev_priv->vbt.edp_vswing = DP_TRAIN_VOLTAGE_SWING_400;
2351 Serge 557
		break;
558
	case 1:
4104 Serge 559
		dev_priv->vbt.edp_vswing = DP_TRAIN_VOLTAGE_SWING_600;
2351 Serge 560
		break;
561
	case 2:
4104 Serge 562
		dev_priv->vbt.edp_vswing = DP_TRAIN_VOLTAGE_SWING_800;
2351 Serge 563
		break;
564
	case 3:
4104 Serge 565
		dev_priv->vbt.edp_vswing = DP_TRAIN_VOLTAGE_SWING_1200;
2351 Serge 566
		break;
567
	}
568
}
569
 
570
static void
571
parse_device_mapping(struct drm_i915_private *dev_priv,
572
		       struct bdb_header *bdb)
573
{
574
	struct bdb_general_definitions *p_defs;
575
	struct child_device_config *p_child, *child_dev_ptr;
576
	int i, child_device_num, count;
577
	u16	block_size;
578
 
579
	p_defs = find_section(bdb, BDB_GENERAL_DEFINITIONS);
580
	if (!p_defs) {
581
		DRM_DEBUG_KMS("No general definition block is found, no devices defined.\n");
582
		return;
583
	}
584
	/* judge whether the size of child device meets the requirements.
585
	 * If the child device size obtained from general definition block
586
	 * is different with sizeof(struct child_device_config), skip the
587
	 * parsing of sdvo device info
588
	 */
589
	if (p_defs->child_dev_size != sizeof(*p_child)) {
590
		/* different child dev size . Ignore it */
591
		DRM_DEBUG_KMS("different child size is found. Invalid.\n");
592
		return;
593
	}
594
	/* get the block size of general definitions */
595
	block_size = get_blocksize(p_defs);
596
	/* get the number of child device */
597
	child_device_num = (block_size - sizeof(*p_defs)) /
598
				sizeof(*p_child);
599
	count = 0;
600
	/* get the number of child device that is present */
601
	for (i = 0; i < child_device_num; i++) {
602
		p_child = &(p_defs->devices[i]);
603
		if (!p_child->device_type) {
604
			/* skip the device block if device type is invalid */
605
			continue;
606
		}
607
		count++;
608
	}
609
	if (!count) {
610
		DRM_DEBUG_KMS("no child dev is parsed from VBT\n");
611
		return;
612
	}
4104 Serge 613
	dev_priv->vbt.child_dev = kcalloc(count, sizeof(*p_child), GFP_KERNEL);
614
	if (!dev_priv->vbt.child_dev) {
2351 Serge 615
		DRM_DEBUG_KMS("No memory space for child device\n");
616
		return;
617
	}
618
 
4104 Serge 619
	dev_priv->vbt.child_dev_num = count;
2351 Serge 620
	count = 0;
621
	for (i = 0; i < child_device_num; i++) {
622
		p_child = &(p_defs->devices[i]);
623
		if (!p_child->device_type) {
624
			/* skip the device block if device type is invalid */
625
			continue;
626
		}
4104 Serge 627
		child_dev_ptr = dev_priv->vbt.child_dev + count;
2351 Serge 628
		count++;
629
		memcpy((void *)child_dev_ptr, (void *)p_child,
630
					sizeof(*p_child));
631
	}
632
	return;
633
}
634
 
635
static void
636
init_vbt_defaults(struct drm_i915_private *dev_priv)
637
{
638
	struct drm_device *dev = dev_priv->dev;
639
 
4104 Serge 640
	dev_priv->vbt.crt_ddc_pin = GMBUS_PORT_VGADDC;
2351 Serge 641
 
642
	/* LFP panel data */
4104 Serge 643
	dev_priv->vbt.lvds_dither = 1;
644
	dev_priv->vbt.lvds_vbt = 0;
2351 Serge 645
 
646
	/* SDVO panel data */
4104 Serge 647
	dev_priv->vbt.sdvo_lvds_vbt_mode = NULL;
2351 Serge 648
 
649
	/* general features */
4104 Serge 650
	dev_priv->vbt.int_tv_support = 1;
651
	dev_priv->vbt.int_crt_support = 1;
2351 Serge 652
 
653
	/* Default to using SSC */
4104 Serge 654
	dev_priv->vbt.lvds_use_ssc = 1;
655
	dev_priv->vbt.lvds_ssc_freq = intel_bios_ssc_frequency(dev, 1);
656
	DRM_DEBUG_KMS("Set default to SSC at %dMHz\n", dev_priv->vbt.lvds_ssc_freq);
2351 Serge 657
}
658
 
3120 serge 659
 
2351 Serge 660
/**
661
 * intel_parse_bios - find VBT and initialize settings from the BIOS
662
 * @dev: DRM device
663
 *
664
 * Loads the Video BIOS and checks that the VBT exists.  Sets scratch registers
665
 * to appropriate values.
666
 *
667
 * Returns 0 on success, nonzero on failure.
668
 */
3031 serge 669
int
2351 Serge 670
intel_parse_bios(struct drm_device *dev)
671
{
672
	struct drm_i915_private *dev_priv = dev->dev_private;
673
	struct pci_dev *pdev = dev->pdev;
674
	struct bdb_header *bdb = NULL;
675
	u8 __iomem *bios = NULL;
676
 
3746 Serge 677
	if (HAS_PCH_NOP(dev))
678
		return -ENODEV;
679
 
2351 Serge 680
	init_vbt_defaults(dev_priv);
681
 
682
	/* XXX Should this validation be moved to intel_opregion.c? */
683
	if (dev_priv->opregion.vbt) {
684
		struct vbt_header *vbt = dev_priv->opregion.vbt;
685
		if (memcmp(vbt->signature, "$VBT", 4) == 0) {
686
			DRM_DEBUG_KMS("Using VBT from OpRegion: %20s\n",
687
					 vbt->signature);
688
			bdb = (struct bdb_header *)((char *)vbt + vbt->bdb_offset);
689
		} else
690
			dev_priv->opregion.vbt = NULL;
691
	}
692
 
693
	if (bdb == NULL) {
694
		struct vbt_header *vbt = NULL;
695
		size_t size;
696
		int i;
697
 
2360 Serge 698
		bios = pci_map_rom(pdev, &size);
2351 Serge 699
		if (!bios)
700
			return -1;
701
 
702
		/* Scour memory looking for the VBT signature */
703
		for (i = 0; i + 4 < size; i++) {
704
			if (!memcmp(bios + i, "$VBT", 4)) {
705
				vbt = (struct vbt_header *)(bios + i);
706
				break;
707
			}
708
		}
709
 
710
		if (!vbt) {
3031 serge 711
			DRM_DEBUG_DRIVER("VBT signature missing\n");
2351 Serge 712
			pci_unmap_rom(pdev, bios);
713
			return -1;
714
		}
715
 
716
		bdb = (struct bdb_header *)(bios + i + vbt->bdb_offset);
717
	}
718
 
719
	/* Grab useful general definitions */
720
	parse_general_features(dev_priv, bdb);
721
	parse_general_definitions(dev_priv, bdb);
722
	parse_lfp_panel_data(dev_priv, bdb);
723
	parse_sdvo_panel_data(dev_priv, bdb);
724
	parse_sdvo_device_mapping(dev_priv, bdb);
725
	parse_device_mapping(dev_priv, bdb);
726
	parse_driver_features(dev_priv, bdb);
727
	parse_edp(dev_priv, bdb);
728
 
729
	if (bios)
730
		pci_unmap_rom(pdev, bios);
731
 
732
	return 0;
733
}
734
 
735
/* Ensure that vital registers have been initialised, even if the BIOS
736
 * is absent or just failing to do its job.
737
 */
738
void intel_setup_bios(struct drm_device *dev)
739
{
740
	struct drm_i915_private *dev_priv = dev->dev_private;
741
 
742
	 /* Set the Panel Power On/Off timings if uninitialized. */
3243 Serge 743
	if (!HAS_PCH_SPLIT(dev) &&
744
	    I915_READ(PP_ON_DELAYS) == 0 && I915_READ(PP_OFF_DELAYS) == 0) {
2351 Serge 745
		/* Set T2 to 40ms and T5 to 200ms */
746
		I915_WRITE(PP_ON_DELAYS, 0x019007d0);
747
 
748
		/* Set T3 to 35ms and Tx to 200ms */
749
		I915_WRITE(PP_OFF_DELAYS, 0x015e07d0);
750
	}
751
}