intel_bios.c 45.4 KB
Newer Older
J
Jesse Barnes 已提交
1
/*
2
 * Copyright © 2006 Intel Corporation
J
Jesse Barnes 已提交
3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
 *
 * Permission is hereby granted, free of charge, to any person obtaining a
 * copy of this software and associated documentation files (the "Software"),
 * to deal in the Software without restriction, including without limitation
 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
 * and/or sell copies of the Software, and to permit persons to whom the
 * Software is furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice (including the next
 * paragraph) shall be included in all copies or substantial portions of the
 * Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 * SOFTWARE.
 *
 * Authors:
 *    Eric Anholt <eric@anholt.net>
 *
 */
27

28
#include <drm/drm_dp_helper.h>
29 30
#include <drm/drmP.h>
#include <drm/i915_drm.h>
J
Jesse Barnes 已提交
31
#include "i915_drv.h"
32 33 34

#define _INTEL_BIOS_PRIVATE
#include "intel_vbt_defs.h"
J
Jesse Barnes 已提交
35

36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57
/**
 * DOC: Video BIOS Table (VBT)
 *
 * The Video BIOS Table, or VBT, provides platform and board specific
 * configuration information to the driver that is not discoverable or available
 * through other means. The configuration is mostly related to display
 * hardware. The VBT is available via the ACPI OpRegion or, on older systems, in
 * the PCI ROM.
 *
 * The VBT consists of a VBT Header (defined as &struct vbt_header), a BDB
 * Header (&struct bdb_header), and a number of BIOS Data Blocks (BDB) that
 * contain the actual configuration information. The VBT Header, and thus the
 * VBT, begins with "$VBT" signature. The VBT Header contains the offset of the
 * BDB Header. The data blocks are concatenated after the BDB Header. The data
 * blocks have a 1-byte Block ID, 2-byte Block Size, and Block Size bytes of
 * data. (Block 53, the MIPI Sequence Block is an exception.)
 *
 * The driver parses the VBT during load. The relevant information is stored in
 * driver private data for ease of use, and the actual VBT is not read after
 * that.
 */

58 59
#define	SLAVE_ADDR1	0x70
#define	SLAVE_ADDR2	0x72
J
Jesse Barnes 已提交
60

61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76
/* Get BDB block size given a pointer to Block ID. */
static u32 _get_blocksize(const u8 *block_base)
{
	/* The MIPI Sequence Block v3+ has a separate size field. */
	if (*block_base == BDB_MIPI_SEQUENCE && *(block_base + 3) >= 3)
		return *((const u32 *)(block_base + 4));
	else
		return *((const u16 *)(block_base + 1));
}

/* Get BDB block size give a pointer to data after Block ID and Block Size. */
static u32 get_blocksize(const void *block_data)
{
	return _get_blocksize(block_data - 3);
}

77 78
static const void *
find_section(const void *_bdb, int section_id)
J
Jesse Barnes 已提交
79
{
80 81
	const struct bdb_header *bdb = _bdb;
	const u8 *base = _bdb;
J
Jesse Barnes 已提交
82
	int index = 0;
83
	u32 total, current_size;
J
Jesse Barnes 已提交
84 85 86 87 88 89 90
	u8 current_id;

	/* skip to first section */
	index += bdb->header_size;
	total = bdb->bdb_size;

	/* walk the sections looking for section_id */
91
	while (index + 3 < total) {
J
Jesse Barnes 已提交
92
		current_id = *(base + index);
93 94
		current_size = _get_blocksize(base + index);
		index += 3;
95

96 97 98
		if (index + current_size > total)
			return NULL;

J
Jesse Barnes 已提交
99 100
		if (current_id == section_id)
			return base + index;
101

J
Jesse Barnes 已提交
102 103 104 105 106 107 108
		index += current_size;
	}

	return NULL;
}

static void
109
fill_detail_timing_data(struct drm_display_mode *panel_fixed_mode,
110
			const struct lvds_dvo_timing *dvo_timing)
111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131
{
	panel_fixed_mode->hdisplay = (dvo_timing->hactive_hi << 8) |
		dvo_timing->hactive_lo;
	panel_fixed_mode->hsync_start = panel_fixed_mode->hdisplay +
		((dvo_timing->hsync_off_hi << 8) | dvo_timing->hsync_off_lo);
	panel_fixed_mode->hsync_end = panel_fixed_mode->hsync_start +
		dvo_timing->hsync_pulse_width;
	panel_fixed_mode->htotal = panel_fixed_mode->hdisplay +
		((dvo_timing->hblank_hi << 8) | dvo_timing->hblank_lo);

	panel_fixed_mode->vdisplay = (dvo_timing->vactive_hi << 8) |
		dvo_timing->vactive_lo;
	panel_fixed_mode->vsync_start = panel_fixed_mode->vdisplay +
		dvo_timing->vsync_off;
	panel_fixed_mode->vsync_end = panel_fixed_mode->vsync_start +
		dvo_timing->vsync_pulse_width;
	panel_fixed_mode->vtotal = panel_fixed_mode->vdisplay +
		((dvo_timing->vblank_hi << 8) | dvo_timing->vblank_lo);
	panel_fixed_mode->clock = dvo_timing->clock * 10;
	panel_fixed_mode->type = DRM_MODE_TYPE_PREFERRED;

132 133 134 135 136 137 138 139 140 141
	if (dvo_timing->hsync_positive)
		panel_fixed_mode->flags |= DRM_MODE_FLAG_PHSYNC;
	else
		panel_fixed_mode->flags |= DRM_MODE_FLAG_NHSYNC;

	if (dvo_timing->vsync_positive)
		panel_fixed_mode->flags |= DRM_MODE_FLAG_PVSYNC;
	else
		panel_fixed_mode->flags |= DRM_MODE_FLAG_NVSYNC;

142 143 144 145 146 147 148 149 150
	/* Some VBTs have bogus h/vtotal values */
	if (panel_fixed_mode->hsync_end > panel_fixed_mode->htotal)
		panel_fixed_mode->htotal = panel_fixed_mode->hsync_end + 1;
	if (panel_fixed_mode->vsync_end > panel_fixed_mode->vtotal)
		panel_fixed_mode->vtotal = panel_fixed_mode->vsync_end + 1;

	drm_mode_set_name(panel_fixed_mode);
}

151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172
static const struct lvds_dvo_timing *
get_lvds_dvo_timing(const struct bdb_lvds_lfp_data *lvds_lfp_data,
		    const struct bdb_lvds_lfp_data_ptrs *lvds_lfp_data_ptrs,
		    int index)
{
	/*
	 * the size of fp_timing varies on the different platform.
	 * So calculate the DVO timing relative offset in LVDS data
	 * entry to get the DVO timing entry
	 */

	int lfp_data_size =
		lvds_lfp_data_ptrs->ptr[1].dvo_timing_offset -
		lvds_lfp_data_ptrs->ptr[0].dvo_timing_offset;
	int dvo_timing_offset =
		lvds_lfp_data_ptrs->ptr[0].dvo_timing_offset -
		lvds_lfp_data_ptrs->ptr[0].fp_timing_offset;
	char *entry = (char *)lvds_lfp_data->data + lfp_data_size * index;

	return (struct lvds_dvo_timing *)(entry + dvo_timing_offset);
}

173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194
/* get lvds_fp_timing entry
 * this function may return NULL if the corresponding entry is invalid
 */
static const struct lvds_fp_timing *
get_lvds_fp_timing(const struct bdb_header *bdb,
		   const struct bdb_lvds_lfp_data *data,
		   const struct bdb_lvds_lfp_data_ptrs *ptrs,
		   int index)
{
	size_t data_ofs = (const u8 *)data - (const u8 *)bdb;
	u16 data_size = ((const u16 *)data)[-1]; /* stored in header */
	size_t ofs;

	if (index >= ARRAY_SIZE(ptrs->ptr))
		return NULL;
	ofs = ptrs->ptr[index].fp_timing_offset;
	if (ofs < data_ofs ||
	    ofs + sizeof(struct lvds_fp_timing) > data_ofs + data_size)
		return NULL;
	return (const struct lvds_fp_timing *)((const u8 *)bdb + ofs);
}

195 196 197
/* Try to find integrated panel data */
static void
parse_lfp_panel_data(struct drm_i915_private *dev_priv,
198
		     const struct bdb_header *bdb)
J
Jesse Barnes 已提交
199
{
200 201 202 203
	const struct bdb_lvds_options *lvds_options;
	const struct bdb_lvds_lfp_data *lvds_lfp_data;
	const struct bdb_lvds_lfp_data_ptrs *lvds_lfp_data_ptrs;
	const struct lvds_dvo_timing *panel_dvo_timing;
204
	const struct lvds_fp_timing *fp_timing;
J
Jesse Barnes 已提交
205
	struct drm_display_mode *panel_fixed_mode;
206
	int panel_type;
207
	int drrs_mode;
J
Jesse Barnes 已提交
208 209 210 211 212

	lvds_options = find_section(bdb, BDB_LVDS_OPTIONS);
	if (!lvds_options)
		return;

213
	dev_priv->vbt.lvds_dither = lvds_options->pixel_dither;
214 215 216
	if (lvds_options->panel_type > 0xf) {
		DRM_DEBUG_KMS("Invalid VBT panel type 0x%x\n",
			      lvds_options->panel_type);
J
Jesse Barnes 已提交
217
		return;
218
	}
219

220
	panel_type = lvds_options->panel_type;
221
	dev_priv->vbt.panel_type = panel_type;
J
Jesse Barnes 已提交
222

223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244
	drrs_mode = (lvds_options->dps_panel_type_bits
				>> (panel_type * 2)) & MODE_MASK;
	/*
	 * VBT has static DRRS = 0 and seamless DRRS = 2.
	 * The below piece of code is required to adjust vbt.drrs_type
	 * to match the enum drrs_support_type.
	 */
	switch (drrs_mode) {
	case 0:
		dev_priv->vbt.drrs_type = STATIC_DRRS_SUPPORT;
		DRM_DEBUG_KMS("DRRS supported mode is static\n");
		break;
	case 2:
		dev_priv->vbt.drrs_type = SEAMLESS_DRRS_SUPPORT;
		DRM_DEBUG_KMS("DRRS supported mode is seamless\n");
		break;
	default:
		dev_priv->vbt.drrs_type = DRRS_NOT_SUPPORTED;
		DRM_DEBUG_KMS("DRRS not supported (VBT input)\n");
		break;
	}

J
Jesse Barnes 已提交
245 246 247 248
	lvds_lfp_data = find_section(bdb, BDB_LVDS_LFP_DATA);
	if (!lvds_lfp_data)
		return;

J
Jesse Barnes 已提交
249 250 251 252
	lvds_lfp_data_ptrs = find_section(bdb, BDB_LVDS_LFP_DATA_PTRS);
	if (!lvds_lfp_data_ptrs)
		return;

253
	dev_priv->vbt.lvds_vbt = 1;
J
Jesse Barnes 已提交
254

255 256
	panel_dvo_timing = get_lvds_dvo_timing(lvds_lfp_data,
					       lvds_lfp_data_ptrs,
257
					       panel_type);
J
Jesse Barnes 已提交
258

259
	panel_fixed_mode = kzalloc(sizeof(*panel_fixed_mode), GFP_KERNEL);
260 261
	if (!panel_fixed_mode)
		return;
J
Jesse Barnes 已提交
262

263
	fill_detail_timing_data(panel_fixed_mode, panel_dvo_timing);
J
Jesse Barnes 已提交
264

265
	dev_priv->vbt.lfp_lvds_vbt_mode = panel_fixed_mode;
J
Jesse Barnes 已提交
266

267
	DRM_DEBUG_KMS("Found panel mode in BIOS VBT tables:\n");
268
	drm_mode_debug_printmodeline(panel_fixed_mode);
269

270 271
	fp_timing = get_lvds_fp_timing(bdb, lvds_lfp_data,
				       lvds_lfp_data_ptrs,
272
				       panel_type);
273 274 275 276
	if (fp_timing) {
		/* check the resolution, just to be sure */
		if (fp_timing->x_res == panel_fixed_mode->hdisplay &&
		    fp_timing->y_res == panel_fixed_mode->vdisplay) {
277
			dev_priv->vbt.bios_lvds_val = fp_timing->lvds_reg_val;
278
			DRM_DEBUG_KMS("VBT initial LVDS value %x\n",
279
				      dev_priv->vbt.bios_lvds_val);
280 281
		}
	}
282 283
}

284
static void
285 286
parse_lfp_backlight(struct drm_i915_private *dev_priv,
		    const struct bdb_header *bdb)
287 288 289
{
	const struct bdb_lfp_backlight_data *backlight_data;
	const struct bdb_lfp_backlight_data_entry *entry;
290
	int panel_type = dev_priv->vbt.panel_type;
291 292 293 294 295 296 297 298 299 300 301 302 303

	backlight_data = find_section(bdb, BDB_LVDS_BACKLIGHT);
	if (!backlight_data)
		return;

	if (backlight_data->entry_size != sizeof(backlight_data->data[0])) {
		DRM_DEBUG_KMS("Unsupported backlight data entry size %u\n",
			      backlight_data->entry_size);
		return;
	}

	entry = &backlight_data->data[panel_type];

304 305 306 307 308 309 310
	dev_priv->vbt.backlight.present = entry->type == BDB_BACKLIGHT_TYPE_PWM;
	if (!dev_priv->vbt.backlight.present) {
		DRM_DEBUG_KMS("PWM backlight not present in VBT (type %u)\n",
			      entry->type);
		return;
	}

311 312
	dev_priv->vbt.backlight.pwm_freq_hz = entry->pwm_freq_hz;
	dev_priv->vbt.backlight.active_low_pwm = entry->active_low_pwm;
313
	dev_priv->vbt.backlight.min_brightness = entry->min_brightness;
314 315 316 317
	DRM_DEBUG_KMS("VBT backlight PWM modulation frequency %u Hz, "
		      "active %s, min brightness %u, level %u\n",
		      dev_priv->vbt.backlight.pwm_freq_hz,
		      dev_priv->vbt.backlight.active_low_pwm ? "low" : "high",
318
		      dev_priv->vbt.backlight.min_brightness,
319 320 321
		      backlight_data->level[panel_type]);
}

322 323 324
/* Try to find sdvo panel data */
static void
parse_sdvo_panel_data(struct drm_i915_private *dev_priv,
325
		      const struct bdb_header *bdb)
326
{
327
	const struct lvds_dvo_timing *dvo_timing;
328
	struct drm_display_mode *panel_fixed_mode;
329
	int index;
J
Jesse Barnes 已提交
330

331
	index = i915.vbt_sdvo_panel_type;
332 333 334 335 336
	if (index == -2) {
		DRM_DEBUG_KMS("Ignore SDVO panel mode from BIOS VBT tables.\n");
		return;
	}

337
	if (index == -1) {
338
		const struct bdb_sdvo_lvds_options *sdvo_lvds_options;
339 340 341 342 343 344 345

		sdvo_lvds_options = find_section(bdb, BDB_SDVO_LVDS_OPTIONS);
		if (!sdvo_lvds_options)
			return;

		index = sdvo_lvds_options->panel_type;
	}
346 347 348 349 350

	dvo_timing = find_section(bdb, BDB_SDVO_PANEL_DTDS);
	if (!dvo_timing)
		return;

351
	panel_fixed_mode = kzalloc(sizeof(*panel_fixed_mode), GFP_KERNEL);
352 353 354
	if (!panel_fixed_mode)
		return;

355
	fill_detail_timing_data(panel_fixed_mode, dvo_timing + index);
356

357
	dev_priv->vbt.sdvo_lvds_vbt_mode = panel_fixed_mode;
J
Jesse Barnes 已提交
358

359 360
	DRM_DEBUG_KMS("Found SDVO panel mode in BIOS VBT tables:\n");
	drm_mode_debug_printmodeline(panel_fixed_mode);
J
Jesse Barnes 已提交
361 362
}

363
static int intel_bios_ssc_frequency(struct drm_i915_private *dev_priv,
364 365
				    bool alternate)
{
366
	switch (INTEL_INFO(dev_priv)->gen) {
367
	case 2:
368
		return alternate ? 66667 : 48000;
369 370
	case 3:
	case 4:
371
		return alternate ? 100000 : 96000;
372
	default:
373
		return alternate ? 100000 : 120000;
374 375 376
	}
}

J
Jesse Barnes 已提交
377 378
static void
parse_general_features(struct drm_i915_private *dev_priv,
379
		       const struct bdb_header *bdb)
J
Jesse Barnes 已提交
380
{
381
	const struct bdb_general_features *general;
J
Jesse Barnes 已提交
382 383

	general = find_section(bdb, BDB_GENERAL_FEATURES);
384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403
	if (!general)
		return;

	dev_priv->vbt.int_tv_support = general->int_tv_support;
	/* int_crt_support can't be trusted on earlier platforms */
	if (bdb->version >= 155 &&
	    (HAS_DDI(dev_priv) || IS_VALLEYVIEW(dev_priv)))
		dev_priv->vbt.int_crt_support = general->int_crt_support;
	dev_priv->vbt.lvds_use_ssc = general->enable_ssc;
	dev_priv->vbt.lvds_ssc_freq =
		intel_bios_ssc_frequency(dev_priv, general->ssc_freq);
	dev_priv->vbt.display_clock_mode = general->display_clock_mode;
	dev_priv->vbt.fdi_rx_polarity_inverted = general->fdi_rx_polarity_inverted;
	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",
		      dev_priv->vbt.int_tv_support,
		      dev_priv->vbt.int_crt_support,
		      dev_priv->vbt.lvds_use_ssc,
		      dev_priv->vbt.lvds_ssc_freq,
		      dev_priv->vbt.display_clock_mode,
		      dev_priv->vbt.fdi_rx_polarity_inverted);
J
Jesse Barnes 已提交
404 405
}

406 407
static void
parse_general_definitions(struct drm_i915_private *dev_priv,
408
			  const struct bdb_header *bdb)
409
{
410
	const struct bdb_general_definitions *general;
411 412 413 414 415 416

	general = find_section(bdb, BDB_GENERAL_DEFINITIONS);
	if (general) {
		u16 block_size = get_blocksize(general);
		if (block_size >= sizeof(*general)) {
			int bus_pin = general->crt_ddc_gmbus_pin;
417
			DRM_DEBUG_KMS("crt_ddc_bus_pin: %d\n", bus_pin);
418
			if (intel_gmbus_is_valid_pin(dev_priv, bus_pin))
419
				dev_priv->vbt.crt_ddc_pin = bus_pin;
420
		} else {
421
			DRM_DEBUG_KMS("BDB_GD too small (%d). Invalid.\n",
422
				      block_size);
423 424 425 426
		}
	}
}

427 428
static const union child_device_config *
child_device_ptr(const struct bdb_general_definitions *p_defs, int i)
429
{
430
	return (const void *) &p_defs->devices[i * p_defs->child_dev_size];
431 432
}

433 434
static void
parse_sdvo_device_mapping(struct drm_i915_private *dev_priv,
435
			  const struct bdb_header *bdb)
436 437
{
	struct sdvo_device_mapping *p_mapping;
438
	const struct bdb_general_definitions *p_defs;
439
	const struct old_child_dev_config *child; /* legacy */
440
	int i, child_device_num, count;
441
	u16	block_size;
442 443 444

	p_defs = find_section(bdb, BDB_GENERAL_DEFINITIONS);
	if (!p_defs) {
445
		DRM_DEBUG_KMS("No general definition block is found, unable to construct sdvo mapping.\n");
446 447
		return;
	}
448 449 450 451 452

	/*
	 * Only parse SDVO mappings when the general definitions block child
	 * device size matches that of the *legacy* child device config
	 * struct. Thus, SDVO mapping will be skipped for newer VBT.
453
	 */
454 455
	if (p_defs->child_dev_size != sizeof(*child)) {
		DRM_DEBUG_KMS("Unsupported child device size for SDVO mapping.\n");
456 457 458
		return;
	}
	/* get the block size of general definitions */
459
	block_size = get_blocksize(p_defs);
460 461
	/* get the number of child device */
	child_device_num = (block_size - sizeof(*p_defs)) /
462
		p_defs->child_dev_size;
463 464
	count = 0;
	for (i = 0; i < child_device_num; i++) {
465 466
		child = &child_device_ptr(p_defs, i)->old;
		if (!child->device_type) {
467 468 469
			/* skip the device block if device type is invalid */
			continue;
		}
470 471
		if (child->slave_addr != SLAVE_ADDR1 &&
		    child->slave_addr != SLAVE_ADDR2) {
472 473 474 475 476 477
			/*
			 * If the slave address is neither 0x70 nor 0x72,
			 * it is not a SDVO device. Skip it.
			 */
			continue;
		}
478 479
		if (child->dvo_port != DEVICE_PORT_DVOB &&
		    child->dvo_port != DEVICE_PORT_DVOC) {
480
			/* skip the incorrect SDVO port */
481
			DRM_DEBUG_KMS("Incorrect SDVO port. Skip it\n");
482 483
			continue;
		}
484
		DRM_DEBUG_KMS("the SDVO device with slave addr %2x is found on"
485 486 487 488
			      " %s port\n",
			      child->slave_addr,
			      (child->dvo_port == DEVICE_PORT_DVOB) ?
			      "SDVOB" : "SDVOC");
489
		p_mapping = &dev_priv->vbt.sdvo_mappings[child->dvo_port - 1];
490
		if (!p_mapping->initialized) {
491 492 493 494 495
			p_mapping->dvo_port = child->dvo_port;
			p_mapping->slave_addr = child->slave_addr;
			p_mapping->dvo_wiring = child->dvo_wiring;
			p_mapping->ddc_pin = child->ddc_pin;
			p_mapping->i2c_pin = child->i2c_pin;
496
			p_mapping->initialized = 1;
497
			DRM_DEBUG_KMS("SDVO device: dvo=%x, addr=%x, wiring=%d, ddc_pin=%d, i2c_pin=%d\n",
C
Chris Wilson 已提交
498 499 500 501
				      p_mapping->dvo_port,
				      p_mapping->slave_addr,
				      p_mapping->dvo_wiring,
				      p_mapping->ddc_pin,
502
				      p_mapping->i2c_pin);
503
		} else {
504
			DRM_DEBUG_KMS("Maybe one SDVO port is shared by "
505 506
					 "two SDVO device.\n");
		}
507
		if (child->slave2_addr) {
508 509
			/* Maybe this is a SDVO device with multiple inputs */
			/* And the mapping info is not added */
510 511
			DRM_DEBUG_KMS("there exists the slave2_addr. Maybe this"
				" is a SDVO device with multiple inputs.\n");
512 513 514 515 516 517
		}
		count++;
	}

	if (!count) {
		/* No SDVO device info is found */
518
		DRM_DEBUG_KMS("No SDVO device info is found in VBT\n");
519 520 521
	}
	return;
}
522 523 524

static void
parse_driver_features(struct drm_i915_private *dev_priv,
525
		      const struct bdb_header *bdb)
526
{
527
	const struct bdb_driver_features *driver;
528 529

	driver = find_section(bdb, BDB_DRIVER_FEATURES);
530 531 532
	if (!driver)
		return;

D
Daniel Vetter 已提交
533
	if (driver->lvds_config == BDB_DRIVER_FEATURE_EDP)
534
		dev_priv->vbt.edp.support = 1;
535

536 537 538 539 540 541 542 543 544
	DRM_DEBUG_KMS("DRRS State Enabled:%d\n", driver->drrs_enabled);
	/*
	 * If DRRS is not supported, drrs_type has to be set to 0.
	 * This is because, VBT is configured in such a way that
	 * static DRRS is 0 and DRRS not supported is represented by
	 * driver->drrs_enabled=false
	 */
	if (!driver->drrs_enabled)
		dev_priv->vbt.drrs_type = DRRS_NOT_SUPPORTED;
545 546
}

547
static void
548
parse_edp(struct drm_i915_private *dev_priv, const struct bdb_header *bdb)
549
{
550 551 552
	const struct bdb_edp *edp;
	const struct edp_power_seq *edp_pps;
	const struct edp_link_params *edp_link_params;
553
	int panel_type = dev_priv->vbt.panel_type;
554 555 556

	edp = find_section(bdb, BDB_EDP);
	if (!edp) {
557
		if (dev_priv->vbt.edp.support)
558
			DRM_DEBUG_KMS("No eDP BDB found but eDP panel supported.\n");
559 560 561 562 563
		return;
	}

	switch ((edp->color_depth >> (panel_type * 2)) & 3) {
	case EDP_18BPP:
564
		dev_priv->vbt.edp.bpp = 18;
565 566
		break;
	case EDP_24BPP:
567
		dev_priv->vbt.edp.bpp = 24;
568 569
		break;
	case EDP_30BPP:
570
		dev_priv->vbt.edp.bpp = 30;
571 572
		break;
	}
573

574 575 576
	/* Get the eDP sequencing and link info */
	edp_pps = &edp->power_seqs[panel_type];
	edp_link_params = &edp->link_params[panel_type];
577

578
	dev_priv->vbt.edp.pps = *edp_pps;
579

580 581
	switch (edp_link_params->rate) {
	case EDP_RATE_1_62:
582
		dev_priv->vbt.edp.rate = DP_LINK_BW_1_62;
583 584
		break;
	case EDP_RATE_2_7:
585
		dev_priv->vbt.edp.rate = DP_LINK_BW_2_7;
586 587 588 589 590 591 592
		break;
	default:
		DRM_DEBUG_KMS("VBT has unknown eDP link rate value %u\n",
			      edp_link_params->rate);
		break;
	}

593
	switch (edp_link_params->lanes) {
594
	case EDP_LANE_1:
595
		dev_priv->vbt.edp.lanes = 1;
596
		break;
597
	case EDP_LANE_2:
598
		dev_priv->vbt.edp.lanes = 2;
599
		break;
600
	case EDP_LANE_4:
601
		dev_priv->vbt.edp.lanes = 4;
602
		break;
603 604 605 606
	default:
		DRM_DEBUG_KMS("VBT has unknown eDP lane count value %u\n",
			      edp_link_params->lanes);
		break;
607
	}
608

609
	switch (edp_link_params->preemphasis) {
610
	case EDP_PREEMPHASIS_NONE:
611
		dev_priv->vbt.edp.preemphasis = DP_TRAIN_PRE_EMPH_LEVEL_0;
612
		break;
613
	case EDP_PREEMPHASIS_3_5dB:
614
		dev_priv->vbt.edp.preemphasis = DP_TRAIN_PRE_EMPH_LEVEL_1;
615
		break;
616
	case EDP_PREEMPHASIS_6dB:
617
		dev_priv->vbt.edp.preemphasis = DP_TRAIN_PRE_EMPH_LEVEL_2;
618
		break;
619
	case EDP_PREEMPHASIS_9_5dB:
620
		dev_priv->vbt.edp.preemphasis = DP_TRAIN_PRE_EMPH_LEVEL_3;
621
		break;
622 623 624 625
	default:
		DRM_DEBUG_KMS("VBT has unknown eDP pre-emphasis value %u\n",
			      edp_link_params->preemphasis);
		break;
626
	}
627

628
	switch (edp_link_params->vswing) {
629
	case EDP_VSWING_0_4V:
630
		dev_priv->vbt.edp.vswing = DP_TRAIN_VOLTAGE_SWING_LEVEL_0;
631
		break;
632
	case EDP_VSWING_0_6V:
633
		dev_priv->vbt.edp.vswing = DP_TRAIN_VOLTAGE_SWING_LEVEL_1;
634
		break;
635
	case EDP_VSWING_0_8V:
636
		dev_priv->vbt.edp.vswing = DP_TRAIN_VOLTAGE_SWING_LEVEL_2;
637
		break;
638
	case EDP_VSWING_1_2V:
639
		dev_priv->vbt.edp.vswing = DP_TRAIN_VOLTAGE_SWING_LEVEL_3;
640
		break;
641 642 643 644
	default:
		DRM_DEBUG_KMS("VBT has unknown eDP voltage swing value %u\n",
			      edp_link_params->vswing);
		break;
645
	}
646 647 648 649

	if (bdb->version >= 173) {
		uint8_t vswing;

650 651
		/* Don't read from VBT if module parameter has valid value*/
		if (i915.edp_vswing) {
652
			dev_priv->vbt.edp.low_vswing = i915.edp_vswing == 1;
653 654
		} else {
			vswing = (edp->edp_vswing_preemph >> (panel_type * 4)) & 0xF;
655
			dev_priv->vbt.edp.low_vswing = vswing == 0;
656
		}
657
	}
658 659
}

R
Rodrigo Vivi 已提交
660
static void
661
parse_psr(struct drm_i915_private *dev_priv, const struct bdb_header *bdb)
R
Rodrigo Vivi 已提交
662
{
663 664
	const struct bdb_psr *psr;
	const struct psr_table *psr_table;
665
	int panel_type = dev_priv->vbt.panel_type;
R
Rodrigo Vivi 已提交
666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704

	psr = find_section(bdb, BDB_PSR);
	if (!psr) {
		DRM_DEBUG_KMS("No PSR BDB found.\n");
		return;
	}

	psr_table = &psr->psr_table[panel_type];

	dev_priv->vbt.psr.full_link = psr_table->full_link;
	dev_priv->vbt.psr.require_aux_wakeup = psr_table->require_aux_to_wakeup;

	/* Allowed VBT values goes from 0 to 15 */
	dev_priv->vbt.psr.idle_frames = psr_table->idle_frames < 0 ? 0 :
		psr_table->idle_frames > 15 ? 15 : psr_table->idle_frames;

	switch (psr_table->lines_to_wait) {
	case 0:
		dev_priv->vbt.psr.lines_to_wait = PSR_0_LINES_TO_WAIT;
		break;
	case 1:
		dev_priv->vbt.psr.lines_to_wait = PSR_1_LINE_TO_WAIT;
		break;
	case 2:
		dev_priv->vbt.psr.lines_to_wait = PSR_4_LINES_TO_WAIT;
		break;
	case 3:
		dev_priv->vbt.psr.lines_to_wait = PSR_8_LINES_TO_WAIT;
		break;
	default:
		DRM_DEBUG_KMS("VBT has unknown PSR lines to wait %u\n",
			      psr_table->lines_to_wait);
		break;
	}

	dev_priv->vbt.psr.tp1_wakeup_time = psr_table->tp1_wakeup_time;
	dev_priv->vbt.psr.tp2_tp3_wakeup_time = psr_table->tp2_tp3_wakeup_time;
}

705
static void
706 707
parse_mipi_config(struct drm_i915_private *dev_priv,
		  const struct bdb_header *bdb)
708
{
709 710 711
	const struct bdb_mipi_config *start;
	const struct mipi_config *config;
	const struct mipi_pps_data *pps;
712
	int panel_type = dev_priv->vbt.panel_type;
713

714
	/* parse MIPI blocks only if LFP type is MIPI */
715
	if (!intel_bios_is_dsi_present(dev_priv, NULL))
716 717
		return;

718 719 720 721 722 723 724
	/* Initialize this to undefined indicating no generic MIPI support */
	dev_priv->vbt.dsi.panel_id = MIPI_DSI_UNDEFINED_PANEL_ID;

	/* Block #40 is already parsed and panel_fixed_mode is
	 * stored in dev_priv->lfp_lvds_vbt_mode
	 * resuse this when needed
	 */
725

726 727 728 729 730 731
	/* Parse #52 for panel index used from panel_type already
	 * parsed
	 */
	start = find_section(bdb, BDB_MIPI_CONFIG);
	if (!start) {
		DRM_DEBUG_KMS("No MIPI config BDB found");
732 733 734
		return;
	}

735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756
	DRM_DEBUG_DRIVER("Found MIPI Config block, panel index = %d\n",
								panel_type);

	/*
	 * get hold of the correct configuration block and pps data as per
	 * the panel_type as index
	 */
	config = &start->config[panel_type];
	pps = &start->pps[panel_type];

	/* store as of now full data. Trim when we realise all is not needed */
	dev_priv->vbt.dsi.config = kmemdup(config, sizeof(struct mipi_config), GFP_KERNEL);
	if (!dev_priv->vbt.dsi.config)
		return;

	dev_priv->vbt.dsi.pps = kmemdup(pps, sizeof(struct mipi_pps_data), GFP_KERNEL);
	if (!dev_priv->vbt.dsi.pps) {
		kfree(dev_priv->vbt.dsi.config);
		return;
	}

	/* We have mandatory mipi config blocks. Initialize as generic panel */
757
	dev_priv->vbt.dsi.panel_id = MIPI_DSI_GENERIC_PANEL_ID;
758 759
}

760 761 762
/* Find the sequence block and size for the given panel. */
static const u8 *
find_panel_sequence_block(const struct bdb_mipi_sequence *sequence,
763
			  u16 panel_id, u32 *seq_size)
764 765 766 767
{
	u32 total = get_blocksize(sequence);
	const u8 *data = &sequence->data[0];
	u8 current_id;
768 769
	u32 current_size;
	int header_size = sequence->version >= 3 ? 5 : 3;
770 771 772
	int index = 0;
	int i;

773 774 775 776 777 778 779 780 781 782
	/* skip new block size */
	if (sequence->version >= 3)
		data += 4;

	for (i = 0; i < MAX_MIPI_CONFIGURATIONS && index < total; i++) {
		if (index + header_size > total) {
			DRM_ERROR("Invalid sequence block (header)\n");
			return NULL;
		}

783
		current_id = *(data + index);
784 785 786 787
		if (sequence->version >= 3)
			current_size = *((const u32 *)(data + index + 1));
		else
			current_size = *((const u16 *)(data + index + 1));
788

789
		index += header_size;
790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808

		if (index + current_size > total) {
			DRM_ERROR("Invalid sequence block\n");
			return NULL;
		}

		if (current_id == panel_id) {
			*seq_size = current_size;
			return data + index;
		}

		index += current_size;
	}

	DRM_ERROR("Sequence block detected but no valid configuration\n");

	return NULL;
}

809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832
static int goto_next_sequence(const u8 *data, int index, int total)
{
	u16 len;

	/* Skip Sequence Byte. */
	for (index = index + 1; index < total; index += len) {
		u8 operation_byte = *(data + index);
		index++;

		switch (operation_byte) {
		case MIPI_SEQ_ELEM_END:
			return index;
		case MIPI_SEQ_ELEM_SEND_PKT:
			if (index + 4 > total)
				return 0;

			len = *((const u16 *)(data + index + 2)) + 4;
			break;
		case MIPI_SEQ_ELEM_DELAY:
			len = 4;
			break;
		case MIPI_SEQ_ELEM_GPIO:
			len = 2;
			break;
833 834 835 836 837
		case MIPI_SEQ_ELEM_I2C:
			if (index + 7 > total)
				return 0;
			len = *(data + index + 6) + 7;
			break;
838 839 840 841 842 843 844 845 846
		default:
			DRM_ERROR("Unknown operation byte\n");
			return 0;
		}
	}

	return 0;
}

847 848 849 850
static int goto_next_sequence_v3(const u8 *data, int index, int total)
{
	int seq_end;
	u16 len;
851
	u32 size_of_sequence;
852 853 854 855 856 857 858 859 860 861

	/*
	 * Could skip sequence based on Size of Sequence alone, but also do some
	 * checking on the structure.
	 */
	if (total < 5) {
		DRM_ERROR("Too small sequence size\n");
		return 0;
	}

862 863 864 865 866 867 868 869 870 871 872 873
	/* Skip Sequence Byte. */
	index++;

	/*
	 * Size of Sequence. Excludes the Sequence Byte and the size itself,
	 * includes MIPI_SEQ_ELEM_END byte, excludes the final MIPI_SEQ_END
	 * byte.
	 */
	size_of_sequence = *((const uint32_t *)(data + index));
	index += 4;

	seq_end = index + size_of_sequence;
874 875 876 877 878
	if (seq_end > total) {
		DRM_ERROR("Invalid sequence size\n");
		return 0;
	}

879
	for (; index < total; index += len) {
880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915
		u8 operation_byte = *(data + index);
		index++;

		if (operation_byte == MIPI_SEQ_ELEM_END) {
			if (index != seq_end) {
				DRM_ERROR("Invalid element structure\n");
				return 0;
			}
			return index;
		}

		len = *(data + index);
		index++;

		/*
		 * FIXME: Would be nice to check elements like for v1/v2 in
		 * goto_next_sequence() above.
		 */
		switch (operation_byte) {
		case MIPI_SEQ_ELEM_SEND_PKT:
		case MIPI_SEQ_ELEM_DELAY:
		case MIPI_SEQ_ELEM_GPIO:
		case MIPI_SEQ_ELEM_I2C:
		case MIPI_SEQ_ELEM_SPI:
		case MIPI_SEQ_ELEM_PMIC:
			break;
		default:
			DRM_ERROR("Unknown operation byte %u\n",
				  operation_byte);
			break;
		}
	}

	return 0;
}

916 917 918 919
static void
parse_mipi_sequence(struct drm_i915_private *dev_priv,
		    const struct bdb_header *bdb)
{
920
	int panel_type = dev_priv->vbt.panel_type;
921 922
	const struct bdb_mipi_sequence *sequence;
	const u8 *seq_data;
923
	u32 seq_size;
924
	u8 *data;
925
	int index = 0;
926 927 928 929

	/* Only our generic panel driver uses the sequence block. */
	if (dev_priv->vbt.dsi.panel_id != MIPI_DSI_GENERIC_PANEL_ID)
		return;
930 931 932 933 934 935 936

	sequence = find_section(bdb, BDB_MIPI_SEQUENCE);
	if (!sequence) {
		DRM_DEBUG_KMS("No MIPI Sequence found, parsing complete\n");
		return;
	}

937
	/* Fail gracefully for forward incompatible sequence block. */
938 939 940
	if (sequence->version >= 4) {
		DRM_ERROR("Unable to parse MIPI Sequence Block v%u\n",
			  sequence->version);
941 942 943
		return;
	}

944
	DRM_DEBUG_DRIVER("Found MIPI sequence block v%u\n", sequence->version);
945

946 947
	seq_data = find_panel_sequence_block(sequence, panel_type, &seq_size);
	if (!seq_data)
948 949
		return;

950 951
	data = kmemdup(seq_data, seq_size, GFP_KERNEL);
	if (!data)
952 953
		return;

954 955 956 957 958
	/* Parse the sequences, store pointers to each sequence. */
	for (;;) {
		u8 seq_id = *(data + index);
		if (seq_id == MIPI_SEQ_END)
			break;
959

960 961
		if (seq_id >= MIPI_SEQ_MAX) {
			DRM_ERROR("Unknown sequence %u\n", seq_id);
962 963 964
			goto err;
		}

965
		dev_priv->vbt.dsi.sequence[seq_id] = data + index;
966

967 968 969 970
		if (sequence->version >= 3)
			index = goto_next_sequence_v3(data, index, seq_size);
		else
			index = goto_next_sequence(data, index, seq_size);
971 972
		if (!index) {
			DRM_ERROR("Invalid sequence %u\n", seq_id);
973 974 975 976
			goto err;
		}
	}

977 978 979 980 981
	dev_priv->vbt.dsi.data = data;
	dev_priv->vbt.dsi.size = seq_size;
	dev_priv->vbt.dsi.seq_version = sequence->version;

	DRM_DEBUG_DRIVER("MIPI related VBT parsing complete\n");
982 983
	return;

984 985
err:
	kfree(data);
986
	memset(dev_priv->vbt.dsi.sequence, 0, sizeof(dev_priv->vbt.dsi.sequence));
987 988
}

989 990 991 992 993 994 995 996 997 998 999
static u8 translate_iboost(u8 val)
{
	static const u8 mapping[] = { 1, 3, 7 }; /* See VBT spec */

	if (val >= ARRAY_SIZE(mapping)) {
		DRM_DEBUG_KMS("Unsupported I_boost value found in VBT (%d), display may not work properly\n", val);
		return 0;
	}
	return mapping[val];
}

1000
static void parse_ddi_port(struct drm_i915_private *dev_priv, enum port port,
1001
			   const struct bdb_header *bdb)
1002 1003 1004 1005 1006
{
	union child_device_config *it, *child = NULL;
	struct ddi_vbt_port_info *info = &dev_priv->vbt.ddi_port_info[port];
	uint8_t hdmi_level_shift;
	int i, j;
1007
	bool is_dvi, is_hdmi, is_dp, is_edp, is_crt;
X
Xiong Zhang 已提交
1008
	uint8_t aux_channel, ddc_pin;
1009 1010 1011
	/* Each DDI port can have more than one value on the "DVO Port" field,
	 * so look for all the possible values for each port and abort if more
	 * than one is found. */
R
Rodrigo Vivi 已提交
1012 1013 1014 1015 1016 1017
	int dvo_ports[][3] = {
		{DVO_PORT_HDMIA, DVO_PORT_DPA, -1},
		{DVO_PORT_HDMIB, DVO_PORT_DPB, -1},
		{DVO_PORT_HDMIC, DVO_PORT_DPC, -1},
		{DVO_PORT_HDMID, DVO_PORT_DPD, -1},
		{DVO_PORT_CRT, DVO_PORT_HDMIE, DVO_PORT_DPE},
1018 1019 1020 1021 1022 1023
	};

	/* Find the child device to use, abort if more than one found. */
	for (i = 0; i < dev_priv->vbt.child_dev_num; i++) {
		it = dev_priv->vbt.child_dev + i;

R
Rodrigo Vivi 已提交
1024
		for (j = 0; j < 3; j++) {
1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040
			if (dvo_ports[port][j] == -1)
				break;

			if (it->common.dvo_port == dvo_ports[port][j]) {
				if (child) {
					DRM_DEBUG_KMS("More than one child device for port %c in VBT.\n",
						      port_name(port));
					return;
				}
				child = it;
			}
		}
	}
	if (!child)
		return;

1041
	aux_channel = child->raw[25];
X
Xiong Zhang 已提交
1042
	ddc_pin = child->common.ddc_pin;
1043

1044 1045 1046 1047 1048
	is_dvi = child->common.device_type & DEVICE_TYPE_TMDS_DVI_SIGNALING;
	is_dp = child->common.device_type & DEVICE_TYPE_DISPLAYPORT_OUTPUT;
	is_crt = child->common.device_type & DEVICE_TYPE_ANALOG_OUTPUT;
	is_hdmi = is_dvi && (child->common.device_type & DEVICE_TYPE_NOT_HDMI_OUTPUT) == 0;
	is_edp = is_dp && (child->common.device_type & DEVICE_TYPE_INTERNAL_CONNECTOR);
1049

1050 1051 1052 1053
	info->supports_dvi = is_dvi;
	info->supports_hdmi = is_hdmi;
	info->supports_dp = is_dp;

1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065
	DRM_DEBUG_KMS("Port %c VBT info: DP:%d HDMI:%d DVI:%d EDP:%d CRT:%d\n",
		      port_name(port), is_dp, is_hdmi, is_dvi, is_edp, is_crt);

	if (is_edp && is_dvi)
		DRM_DEBUG_KMS("Internal DP port %c is TMDS compatible\n",
			      port_name(port));
	if (is_crt && port != PORT_E)
		DRM_DEBUG_KMS("Port %c is analog\n", port_name(port));
	if (is_crt && (is_dvi || is_dp))
		DRM_DEBUG_KMS("Analog port %c is also DP or TMDS compatible\n",
			      port_name(port));
	if (is_dvi && (port == PORT_A || port == PORT_E))
M
Masanari Iida 已提交
1066
		DRM_DEBUG_KMS("Port %c is TMDS compatible\n", port_name(port));
1067 1068 1069 1070 1071
	if (!is_dvi && !is_dp && !is_crt)
		DRM_DEBUG_KMS("Port %c is not DP/TMDS/CRT compatible\n",
			      port_name(port));
	if (is_edp && (port == PORT_B || port == PORT_C || port == PORT_E))
		DRM_DEBUG_KMS("Port %c is internal DP\n", port_name(port));
1072 1073

	if (is_dvi) {
X
Xiong Zhang 已提交
1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090
		if (port == PORT_E) {
			info->alternate_ddc_pin = ddc_pin;
			/* if DDIE share ddc pin with other port, then
			 * dvi/hdmi couldn't exist on the shared port.
			 * Otherwise they share the same ddc bin and system
			 * couldn't communicate with them seperately. */
			if (ddc_pin == DDC_PIN_B) {
				dev_priv->vbt.ddi_port_info[PORT_B].supports_dvi = 0;
				dev_priv->vbt.ddi_port_info[PORT_B].supports_hdmi = 0;
			} else if (ddc_pin == DDC_PIN_C) {
				dev_priv->vbt.ddi_port_info[PORT_C].supports_dvi = 0;
				dev_priv->vbt.ddi_port_info[PORT_C].supports_hdmi = 0;
			} else if (ddc_pin == DDC_PIN_D) {
				dev_priv->vbt.ddi_port_info[PORT_D].supports_dvi = 0;
				dev_priv->vbt.ddi_port_info[PORT_D].supports_hdmi = 0;
			}
		} else if (ddc_pin == DDC_PIN_B && port != PORT_B)
1091
			DRM_DEBUG_KMS("Unexpected DDC pin for port B\n");
X
Xiong Zhang 已提交
1092
		else if (ddc_pin == DDC_PIN_C && port != PORT_C)
1093
			DRM_DEBUG_KMS("Unexpected DDC pin for port C\n");
X
Xiong Zhang 已提交
1094
		else if (ddc_pin == DDC_PIN_D && port != PORT_D)
1095 1096 1097 1098
			DRM_DEBUG_KMS("Unexpected DDC pin for port D\n");
	}

	if (is_dp) {
1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114
		if (port == PORT_E) {
			info->alternate_aux_channel = aux_channel;
			/* if DDIE share aux channel with other port, then
			 * DP couldn't exist on the shared port. Otherwise
			 * they share the same aux channel and system
			 * couldn't communicate with them seperately. */
			if (aux_channel == DP_AUX_A)
				dev_priv->vbt.ddi_port_info[PORT_A].supports_dp = 0;
			else if (aux_channel == DP_AUX_B)
				dev_priv->vbt.ddi_port_info[PORT_B].supports_dp = 0;
			else if (aux_channel == DP_AUX_C)
				dev_priv->vbt.ddi_port_info[PORT_C].supports_dp = 0;
			else if (aux_channel == DP_AUX_D)
				dev_priv->vbt.ddi_port_info[PORT_D].supports_dp = 0;
		}
		else if (aux_channel == DP_AUX_A && port != PORT_A)
1115
			DRM_DEBUG_KMS("Unexpected AUX channel for port A\n");
1116
		else if (aux_channel == DP_AUX_B && port != PORT_B)
1117
			DRM_DEBUG_KMS("Unexpected AUX channel for port B\n");
1118
		else if (aux_channel == DP_AUX_C && port != PORT_C)
1119
			DRM_DEBUG_KMS("Unexpected AUX channel for port C\n");
1120
		else if (aux_channel == DP_AUX_D && port != PORT_D)
1121 1122 1123
			DRM_DEBUG_KMS("Unexpected AUX channel for port D\n");
	}

1124 1125 1126
	if (bdb->version >= 158) {
		/* The VBT HDMI level shift values match the table we have. */
		hdmi_level_shift = child->raw[7] & 0xF;
1127 1128 1129 1130
		DRM_DEBUG_KMS("VBT HDMI level shift for port %c: %d\n",
			      port_name(port),
			      hdmi_level_shift);
		info->hdmi_level_shift = hdmi_level_shift;
1131
	}
1132 1133

	/* Parse the I_boost config for SKL and above */
1134
	if (bdb->version >= 196 && child->common.iboost) {
1135 1136 1137 1138 1139 1140 1141
		info->dp_boost_level = translate_iboost(child->common.iboost_level & 0xF);
		DRM_DEBUG_KMS("VBT (e)DP boost level for port %c: %d\n",
			      port_name(port), info->dp_boost_level);
		info->hdmi_boost_level = translate_iboost(child->common.iboost_level >> 4);
		DRM_DEBUG_KMS("VBT HDMI boost level for port %c: %d\n",
			      port_name(port), info->hdmi_boost_level);
	}
1142 1143 1144
}

static void parse_ddi_ports(struct drm_i915_private *dev_priv,
1145
			    const struct bdb_header *bdb)
1146 1147 1148
{
	enum port port;

1149
	if (!HAS_DDI(dev_priv))
1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161
		return;

	if (!dev_priv->vbt.child_dev_num)
		return;

	if (bdb->version < 155)
		return;

	for (port = PORT_A; port < I915_MAX_PORTS; port++)
		parse_ddi_port(dev_priv, port, bdb);
}

Z
Zhao Yakui 已提交
1162 1163
static void
parse_device_mapping(struct drm_i915_private *dev_priv,
1164
		     const struct bdb_header *bdb)
Z
Zhao Yakui 已提交
1165
{
1166 1167 1168
	const struct bdb_general_definitions *p_defs;
	const union child_device_config *p_child;
	union child_device_config *child_dev_ptr;
Z
Zhao Yakui 已提交
1169
	int i, child_device_num, count;
1170 1171
	u8 expected_size;
	u16 block_size;
Z
Zhao Yakui 已提交
1172 1173 1174

	p_defs = find_section(bdb, BDB_GENERAL_DEFINITIONS);
	if (!p_defs) {
1175
		DRM_DEBUG_KMS("No general definition block is found, no devices defined.\n");
Z
Zhao Yakui 已提交
1176 1177
		return;
	}
1178 1179 1180
	if (bdb->version < 106) {
		expected_size = 22;
	} else if (bdb->version < 109) {
1181 1182 1183
		expected_size = 27;
	} else if (bdb->version < 195) {
		BUILD_BUG_ON(sizeof(struct old_child_dev_config) != 33);
1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200
		expected_size = sizeof(struct old_child_dev_config);
	} else if (bdb->version == 195) {
		expected_size = 37;
	} else if (bdb->version <= 197) {
		expected_size = 38;
	} else {
		expected_size = 38;
		BUILD_BUG_ON(sizeof(*p_child) < 38);
		DRM_DEBUG_DRIVER("Expected child device config size for VBT version %u not known; assuming %u\n",
				 bdb->version, expected_size);
	}

	/* Flag an error for unexpected size, but continue anyway. */
	if (p_defs->child_dev_size != expected_size)
		DRM_ERROR("Unexpected child device config size %u (expected %u for VBT version %u)\n",
			  p_defs->child_dev_size, expected_size, bdb->version);

1201 1202 1203 1204 1205 1206 1207
	/* The legacy sized child device config is the minimum we need. */
	if (p_defs->child_dev_size < sizeof(struct old_child_dev_config)) {
		DRM_DEBUG_KMS("Child device config size %u is too small.\n",
			      p_defs->child_dev_size);
		return;
	}

Z
Zhao Yakui 已提交
1208 1209 1210 1211
	/* get the block size of general definitions */
	block_size = get_blocksize(p_defs);
	/* get the number of child device */
	child_device_num = (block_size - sizeof(*p_defs)) /
1212
				p_defs->child_dev_size;
Z
Zhao Yakui 已提交
1213 1214 1215
	count = 0;
	/* get the number of child device that is present */
	for (i = 0; i < child_device_num; i++) {
1216
		p_child = child_device_ptr(p_defs, i);
1217
		if (!p_child->common.device_type) {
Z
Zhao Yakui 已提交
1218 1219 1220 1221 1222 1223
			/* skip the device block if device type is invalid */
			continue;
		}
		count++;
	}
	if (!count) {
1224
		DRM_DEBUG_KMS("no child dev is parsed from VBT\n");
Z
Zhao Yakui 已提交
1225 1226
		return;
	}
1227 1228
	dev_priv->vbt.child_dev = kcalloc(count, sizeof(*p_child), GFP_KERNEL);
	if (!dev_priv->vbt.child_dev) {
Z
Zhao Yakui 已提交
1229 1230 1231 1232
		DRM_DEBUG_KMS("No memory space for child device\n");
		return;
	}

1233
	dev_priv->vbt.child_dev_num = count;
Z
Zhao Yakui 已提交
1234 1235
	count = 0;
	for (i = 0; i < child_device_num; i++) {
1236
		p_child = child_device_ptr(p_defs, i);
1237
		if (!p_child->common.device_type) {
Z
Zhao Yakui 已提交
1238 1239 1240
			/* skip the device block if device type is invalid */
			continue;
		}
1241

1242
		child_dev_ptr = dev_priv->vbt.child_dev + count;
Z
Zhao Yakui 已提交
1243
		count++;
1244 1245 1246 1247 1248 1249 1250 1251

		/*
		 * Copy as much as we know (sizeof) and is available
		 * (child_dev_size) of the child device. Accessing the data must
		 * depend on VBT version.
		 */
		memcpy(child_dev_ptr, p_child,
		       min_t(size_t, p_defs->child_dev_size, sizeof(*p_child)));
1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264

		/*
		 * copied full block, now init values when they are not
		 * available in current version
		 */
		if (bdb->version < 196) {
			/* Set default values for bits added from v196 */
			child_dev_ptr->common.iboost = 0;
			child_dev_ptr->common.hpd_invert = 0;
		}

		if (bdb->version < 192)
			child_dev_ptr->common.lspcon = 0;
Z
Zhao Yakui 已提交
1265 1266 1267
	}
	return;
}
1268

1269 1270 1271
static void
init_vbt_defaults(struct drm_i915_private *dev_priv)
{
1272
	enum port port;
1273

1274
	dev_priv->vbt.crt_ddc_pin = GMBUS_PIN_VGADDC;
1275

1276 1277 1278
	/* Default to having backlight */
	dev_priv->vbt.backlight.present = true;

1279
	/* LFP panel data */
1280 1281
	dev_priv->vbt.lvds_dither = 1;
	dev_priv->vbt.lvds_vbt = 0;
1282 1283

	/* SDVO panel data */
1284
	dev_priv->vbt.sdvo_lvds_vbt_mode = NULL;
1285 1286

	/* general features */
1287 1288
	dev_priv->vbt.int_tv_support = 1;
	dev_priv->vbt.int_crt_support = 1;
1289 1290

	/* Default to using SSC */
1291
	dev_priv->vbt.lvds_use_ssc = 1;
1292 1293 1294 1295
	/*
	 * Core/SandyBridge/IvyBridge use alternative (120MHz) reference
	 * clock for LVDS.
	 */
1296 1297
	dev_priv->vbt.lvds_ssc_freq = intel_bios_ssc_frequency(dev_priv,
			!HAS_PCH_SPLIT(dev_priv));
1298
	DRM_DEBUG_KMS("Set default to SSC at %d kHz\n", dev_priv->vbt.lvds_ssc_freq);
1299 1300

	for (port = PORT_A; port < I915_MAX_PORTS; port++) {
1301 1302 1303
		struct ddi_vbt_port_info *info =
			&dev_priv->vbt.ddi_port_info[port];

1304
		info->hdmi_level_shift = HDMI_LEVEL_SHIFT_UNKNOWN;
1305 1306 1307 1308

		info->supports_dvi = (port != PORT_A && port != PORT_E);
		info->supports_hdmi = info->supports_dvi;
		info->supports_dp = (port != PORT_E);
1309
	}
1310 1311
}

1312 1313 1314 1315 1316 1317 1318
static const struct bdb_header *get_bdb_header(const struct vbt_header *vbt)
{
	const void *_vbt = vbt;

	return _vbt + vbt->bdb_offset;
}

J
Jani Nikula 已提交
1319 1320 1321 1322 1323 1324 1325 1326
/**
 * intel_bios_is_valid_vbt - does the given buffer contain a valid VBT
 * @buf:	pointer to a buffer to validate
 * @size:	size of the buffer
 *
 * Returns true on valid VBT.
 */
bool intel_bios_is_valid_vbt(const void *buf, size_t size)
1327
{
J
Jani Nikula 已提交
1328
	const struct vbt_header *vbt = buf;
1329
	const struct bdb_header *bdb;
1330

1331
	if (!vbt)
J
Jani Nikula 已提交
1332
		return false;
1333

J
Jani Nikula 已提交
1334
	if (sizeof(struct vbt_header) > size) {
1335
		DRM_DEBUG_DRIVER("VBT header incomplete\n");
J
Jani Nikula 已提交
1336
		return false;
1337 1338 1339 1340
	}

	if (memcmp(vbt->signature, "$VBT", 4)) {
		DRM_DEBUG_DRIVER("VBT invalid signature\n");
J
Jani Nikula 已提交
1341
		return false;
1342 1343
	}

J
Jani Nikula 已提交
1344
	if (vbt->bdb_offset + sizeof(struct bdb_header) > size) {
1345
		DRM_DEBUG_DRIVER("BDB header incomplete\n");
J
Jani Nikula 已提交
1346
		return false;
1347 1348
	}

1349
	bdb = get_bdb_header(vbt);
J
Jani Nikula 已提交
1350
	if (vbt->bdb_offset + bdb->bdb_size > size) {
1351
		DRM_DEBUG_DRIVER("BDB incomplete\n");
J
Jani Nikula 已提交
1352
		return false;
1353 1354
	}

1355
	return vbt;
1356 1357
}

1358
static const struct vbt_header *find_vbt(void __iomem *bios, size_t size)
1359 1360 1361 1362 1363
{
	size_t i;

	/* Scour memory looking for the VBT signature. */
	for (i = 0; i + 4 < size; i++) {
J
Jani Nikula 已提交
1364
		void *vbt;
1365

J
Jani Nikula 已提交
1366 1367 1368 1369 1370 1371 1372 1373 1374 1375 1376 1377
		if (ioread32(bios + i) != *((const u32 *) "$VBT"))
			continue;

		/*
		 * This is the one place where we explicitly discard the address
		 * space (__iomem) of the BIOS/VBT.
		 */
		vbt = (void __force *) bios + i;
		if (intel_bios_is_valid_vbt(vbt, size - i))
			return vbt;

		break;
1378 1379
	}

J
Jani Nikula 已提交
1380
	return NULL;
1381 1382
}

J
Jesse Barnes 已提交
1383
/**
1384
 * intel_bios_init - find VBT and initialize settings from the BIOS
1385
 * @dev_priv: i915 device instance
J
Jesse Barnes 已提交
1386 1387 1388 1389 1390 1391
 *
 * Loads the Video BIOS and checks that the VBT exists.  Sets scratch registers
 * to appropriate values.
 *
 * Returns 0 on success, nonzero on failure.
 */
1392
int
1393
intel_bios_init(struct drm_i915_private *dev_priv)
J
Jesse Barnes 已提交
1394
{
1395
	struct pci_dev *pdev = dev_priv->dev->pdev;
J
Jani Nikula 已提交
1396
	const struct vbt_header *vbt = dev_priv->opregion.vbt;
1397
	const struct bdb_header *bdb;
1398 1399
	u8 __iomem *bios = NULL;

1400
	if (HAS_PCH_NOP(dev_priv))
1401 1402
		return -ENODEV;

1403
	init_vbt_defaults(dev_priv);
1404

J
Jani Nikula 已提交
1405
	if (!vbt) {
1406
		size_t size;
J
Jesse Barnes 已提交
1407

1408 1409 1410 1411
		bios = pci_map_rom(pdev, &size);
		if (!bios)
			return -1;

1412 1413
		vbt = find_vbt(bios, size);
		if (!vbt) {
1414 1415 1416
			pci_unmap_rom(pdev, bios);
			return -1;
		}
1417 1418

		DRM_DEBUG_KMS("Found valid VBT in PCI ROM\n");
1419
	}
J
Jesse Barnes 已提交
1420

1421 1422
	bdb = get_bdb_header(vbt);

1423 1424
	DRM_DEBUG_KMS("VBT signature \"%.*s\", BDB version %d\n",
		      (int)sizeof(vbt->signature), vbt->signature, bdb->version);
1425

J
Jesse Barnes 已提交
1426 1427
	/* Grab useful general definitions */
	parse_general_features(dev_priv, bdb);
1428
	parse_general_definitions(dev_priv, bdb);
1429
	parse_lfp_panel_data(dev_priv, bdb);
1430
	parse_lfp_backlight(dev_priv, bdb);
1431
	parse_sdvo_panel_data(dev_priv, bdb);
1432
	parse_sdvo_device_mapping(dev_priv, bdb);
Z
Zhao Yakui 已提交
1433
	parse_device_mapping(dev_priv, bdb);
1434
	parse_driver_features(dev_priv, bdb);
1435
	parse_edp(dev_priv, bdb);
R
Rodrigo Vivi 已提交
1436
	parse_psr(dev_priv, bdb);
1437 1438
	parse_mipi_config(dev_priv, bdb);
	parse_mipi_sequence(dev_priv, bdb);
1439
	parse_ddi_ports(dev_priv, bdb);
1440

1441 1442
	if (bios)
		pci_unmap_rom(pdev, bios);
J
Jesse Barnes 已提交
1443 1444 1445

	return 0;
}
1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486

/**
 * intel_bios_is_tv_present - is integrated TV present in VBT
 * @dev_priv:	i915 device instance
 *
 * Return true if TV is present. If no child devices were parsed from VBT,
 * assume TV is present.
 */
bool intel_bios_is_tv_present(struct drm_i915_private *dev_priv)
{
	union child_device_config *p_child;
	int i;

	if (!dev_priv->vbt.int_tv_support)
		return false;

	if (!dev_priv->vbt.child_dev_num)
		return true;

	for (i = 0; i < dev_priv->vbt.child_dev_num; i++) {
		p_child = dev_priv->vbt.child_dev + i;
		/*
		 * If the device type is not TV, continue.
		 */
		switch (p_child->old.device_type) {
		case DEVICE_TYPE_INT_TV:
		case DEVICE_TYPE_TV:
		case DEVICE_TYPE_TV_SVIDEO_COMPOSITE:
			break;
		default:
			continue;
		}
		/* Only when the addin_offset is non-zero, it is regarded
		 * as present.
		 */
		if (p_child->old.addin_offset)
			return true;
	}

	return false;
}
1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 1530 1531 1532 1533 1534 1535 1536

/**
 * intel_bios_is_lvds_present - is LVDS present in VBT
 * @dev_priv:	i915 device instance
 * @i2c_pin:	i2c pin for LVDS if present
 *
 * Return true if LVDS is present. If no child devices were parsed from VBT,
 * assume LVDS is present.
 */
bool intel_bios_is_lvds_present(struct drm_i915_private *dev_priv, u8 *i2c_pin)
{
	int i;

	if (!dev_priv->vbt.child_dev_num)
		return true;

	for (i = 0; i < dev_priv->vbt.child_dev_num; i++) {
		union child_device_config *uchild = dev_priv->vbt.child_dev + i;
		struct old_child_dev_config *child = &uchild->old;

		/* If the device type is not LFP, continue.
		 * We have to check both the new identifiers as well as the
		 * old for compatibility with some BIOSes.
		 */
		if (child->device_type != DEVICE_TYPE_INT_LFP &&
		    child->device_type != DEVICE_TYPE_LFP)
			continue;

		if (intel_gmbus_is_valid_pin(dev_priv, child->i2c_pin))
			*i2c_pin = child->i2c_pin;

		/* However, we cannot trust the BIOS writers to populate
		 * the VBT correctly.  Since LVDS requires additional
		 * information from AIM blocks, a non-zero addin offset is
		 * a good indicator that the LVDS is actually present.
		 */
		if (child->addin_offset)
			return true;

		/* But even then some BIOS writers perform some black magic
		 * and instantiate the device without reference to any
		 * additional data.  Trust that if the VBT was written into
		 * the OpRegion then they have validated the LVDS's existence.
		 */
		if (dev_priv->opregion.vbt)
			return true;
	}

	return false;
}
1537 1538 1539 1540 1541 1542 1543 1544 1545 1546 1547 1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559 1560 1561 1562 1563 1564 1565 1566 1567 1568 1569

/**
 * intel_bios_is_port_edp - is the device in given port eDP
 * @dev_priv:	i915 device instance
 * @port:	port to check
 *
 * Return true if the device in %port is eDP.
 */
bool intel_bios_is_port_edp(struct drm_i915_private *dev_priv, enum port port)
{
	union child_device_config *p_child;
	static const short port_mapping[] = {
		[PORT_B] = DVO_PORT_DPB,
		[PORT_C] = DVO_PORT_DPC,
		[PORT_D] = DVO_PORT_DPD,
		[PORT_E] = DVO_PORT_DPE,
	};
	int i;

	if (!dev_priv->vbt.child_dev_num)
		return false;

	for (i = 0; i < dev_priv->vbt.child_dev_num; i++) {
		p_child = dev_priv->vbt.child_dev + i;

		if (p_child->common.dvo_port == port_mapping[port] &&
		    (p_child->common.device_type & DEVICE_TYPE_eDP_BITS) ==
		    (DEVICE_TYPE_eDP & DEVICE_TYPE_eDP_BITS))
			return true;
	}

	return false;
}
1570 1571 1572 1573 1574 1575 1576 1577 1578 1579 1580 1581 1582 1583 1584 1585 1586 1587 1588 1589 1590 1591 1592 1593 1594 1595

/**
 * intel_bios_is_dsi_present - is DSI present in VBT
 * @dev_priv:	i915 device instance
 * @port:	port for DSI if present
 *
 * Return true if DSI is present, and return the port in %port.
 */
bool intel_bios_is_dsi_present(struct drm_i915_private *dev_priv,
			       enum port *port)
{
	union child_device_config *p_child;
	u8 dvo_port;
	int i;

	for (i = 0; i < dev_priv->vbt.child_dev_num; i++) {
		p_child = dev_priv->vbt.child_dev + i;

		if (!(p_child->common.device_type & DEVICE_TYPE_MIPI_OUTPUT))
			continue;

		dvo_port = p_child->common.dvo_port;

		switch (dvo_port) {
		case DVO_PORT_MIPIA:
		case DVO_PORT_MIPIC:
1596 1597
			if (port)
				*port = dvo_port - DVO_PORT_MIPIA;
1598 1599 1600 1601 1602 1603 1604 1605 1606 1607 1608
			return true;
		case DVO_PORT_MIPIB:
		case DVO_PORT_MIPID:
			DRM_DEBUG_KMS("VBT has unsupported DSI port %c\n",
				      port_name(dvo_port - DVO_PORT_MIPIA));
			break;
		}
	}

	return false;
}
1609 1610 1611 1612 1613 1614 1615 1616 1617 1618 1619 1620 1621 1622 1623 1624 1625 1626 1627 1628 1629 1630 1631 1632 1633 1634 1635 1636 1637 1638 1639 1640 1641 1642 1643 1644 1645 1646 1647 1648 1649 1650 1651 1652

/**
 * intel_bios_is_port_hpd_inverted - is HPD inverted for %port
 * @dev_priv:	i915 device instance
 * @port:	port to check
 *
 * Return true if HPD should be inverted for %port.
 */
bool
intel_bios_is_port_hpd_inverted(struct drm_i915_private *dev_priv,
				enum port port)
{
	int i;

	if (WARN_ON_ONCE(!IS_BROXTON(dev_priv)))
		return false;

	for (i = 0; i < dev_priv->vbt.child_dev_num; i++) {
		if (!dev_priv->vbt.child_dev[i].common.hpd_invert)
			continue;

		switch (dev_priv->vbt.child_dev[i].common.dvo_port) {
		case DVO_PORT_DPA:
		case DVO_PORT_HDMIA:
			if (port == PORT_A)
				return true;
			break;
		case DVO_PORT_DPB:
		case DVO_PORT_HDMIB:
			if (port == PORT_B)
				return true;
			break;
		case DVO_PORT_DPC:
		case DVO_PORT_HDMIC:
			if (port == PORT_C)
				return true;
			break;
		default:
			break;
		}
	}

	return false;
}