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