diff options
author | Paulo Zanoni <paulo.r.zanoni@intel.com> | 2013-09-11 17:02:47 -0400 |
---|---|---|
committer | Daniel Vetter <daniel.vetter@ffwll.ch> | 2013-10-01 01:45:04 -0400 |
commit | 768f69c9fe601af39dfeb377f45909896f201444 (patch) | |
tree | ce10f4bd9733cd6620360918d215decc404cc9b3 /drivers/gpu/drm/i915/intel_bios.c | |
parent | f740334775efd30631c556f7654b92dae66df494 (diff) |
drm/i915: VBT's child_device_config changes over time
We currently treat the child_device_config as a simple struct, but
this is not correct: new BDB versions change the meaning of some
offsets, so the struct needs to be adjusted for each version.
Since there are too many changes (today we're in version 170!), making
a big versioned union would be too complicated, so child_device_config
is now a union of 3 things: (i) a "raw" byte array that's safe to use
anywhere; (ii) an "old" structure that's the one we've been using and
should be safe to keep in the SDVO and TV code; and (iii) a "common"
structure that should contain only fields that are common for all the
known VBT versions.
Signed-off-by: Paulo Zanoni <paulo.r.zanoni@intel.com>
Reviewed-by: Rodrigo Vivi <rodrigo.vivi@gmail.com>
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Diffstat (limited to 'drivers/gpu/drm/i915/intel_bios.c')
-rw-r--r-- | drivers/gpu/drm/i915/intel_bios.c | 36 |
1 files changed, 18 insertions, 18 deletions
diff --git a/drivers/gpu/drm/i915/intel_bios.c b/drivers/gpu/drm/i915/intel_bios.c index 6668873fb3a8..33003b97f1f0 100644 --- a/drivers/gpu/drm/i915/intel_bios.c +++ b/drivers/gpu/drm/i915/intel_bios.c | |||
@@ -389,7 +389,7 @@ parse_sdvo_device_mapping(struct drm_i915_private *dev_priv, | |||
389 | { | 389 | { |
390 | struct sdvo_device_mapping *p_mapping; | 390 | struct sdvo_device_mapping *p_mapping; |
391 | struct bdb_general_definitions *p_defs; | 391 | struct bdb_general_definitions *p_defs; |
392 | struct child_device_config *p_child; | 392 | union child_device_config *p_child; |
393 | int i, child_device_num, count; | 393 | int i, child_device_num, count; |
394 | u16 block_size; | 394 | u16 block_size; |
395 | 395 | ||
@@ -416,36 +416,36 @@ parse_sdvo_device_mapping(struct drm_i915_private *dev_priv, | |||
416 | count = 0; | 416 | count = 0; |
417 | for (i = 0; i < child_device_num; i++) { | 417 | for (i = 0; i < child_device_num; i++) { |
418 | p_child = &(p_defs->devices[i]); | 418 | p_child = &(p_defs->devices[i]); |
419 | if (!p_child->device_type) { | 419 | if (!p_child->old.device_type) { |
420 | /* skip the device block if device type is invalid */ | 420 | /* skip the device block if device type is invalid */ |
421 | continue; | 421 | continue; |
422 | } | 422 | } |
423 | if (p_child->slave_addr != SLAVE_ADDR1 && | 423 | if (p_child->old.slave_addr != SLAVE_ADDR1 && |
424 | p_child->slave_addr != SLAVE_ADDR2) { | 424 | p_child->old.slave_addr != SLAVE_ADDR2) { |
425 | /* | 425 | /* |
426 | * If the slave address is neither 0x70 nor 0x72, | 426 | * If the slave address is neither 0x70 nor 0x72, |
427 | * it is not a SDVO device. Skip it. | 427 | * it is not a SDVO device. Skip it. |
428 | */ | 428 | */ |
429 | continue; | 429 | continue; |
430 | } | 430 | } |
431 | if (p_child->dvo_port != DEVICE_PORT_DVOB && | 431 | if (p_child->old.dvo_port != DEVICE_PORT_DVOB && |
432 | p_child->dvo_port != DEVICE_PORT_DVOC) { | 432 | p_child->old.dvo_port != DEVICE_PORT_DVOC) { |
433 | /* skip the incorrect SDVO port */ | 433 | /* skip the incorrect SDVO port */ |
434 | DRM_DEBUG_KMS("Incorrect SDVO port. Skip it\n"); | 434 | DRM_DEBUG_KMS("Incorrect SDVO port. Skip it\n"); |
435 | continue; | 435 | continue; |
436 | } | 436 | } |
437 | DRM_DEBUG_KMS("the SDVO device with slave addr %2x is found on" | 437 | DRM_DEBUG_KMS("the SDVO device with slave addr %2x is found on" |
438 | " %s port\n", | 438 | " %s port\n", |
439 | p_child->slave_addr, | 439 | p_child->old.slave_addr, |
440 | (p_child->dvo_port == DEVICE_PORT_DVOB) ? | 440 | (p_child->old.dvo_port == DEVICE_PORT_DVOB) ? |
441 | "SDVOB" : "SDVOC"); | 441 | "SDVOB" : "SDVOC"); |
442 | p_mapping = &(dev_priv->sdvo_mappings[p_child->dvo_port - 1]); | 442 | p_mapping = &(dev_priv->sdvo_mappings[p_child->old.dvo_port - 1]); |
443 | if (!p_mapping->initialized) { | 443 | if (!p_mapping->initialized) { |
444 | p_mapping->dvo_port = p_child->dvo_port; | 444 | p_mapping->dvo_port = p_child->old.dvo_port; |
445 | p_mapping->slave_addr = p_child->slave_addr; | 445 | p_mapping->slave_addr = p_child->old.slave_addr; |
446 | p_mapping->dvo_wiring = p_child->dvo_wiring; | 446 | p_mapping->dvo_wiring = p_child->old.dvo_wiring; |
447 | p_mapping->ddc_pin = p_child->ddc_pin; | 447 | p_mapping->ddc_pin = p_child->old.ddc_pin; |
448 | p_mapping->i2c_pin = p_child->i2c_pin; | 448 | p_mapping->i2c_pin = p_child->old.i2c_pin; |
449 | p_mapping->initialized = 1; | 449 | p_mapping->initialized = 1; |
450 | DRM_DEBUG_KMS("SDVO device: dvo=%x, addr=%x, wiring=%d, ddc_pin=%d, i2c_pin=%d\n", | 450 | DRM_DEBUG_KMS("SDVO device: dvo=%x, addr=%x, wiring=%d, ddc_pin=%d, i2c_pin=%d\n", |
451 | p_mapping->dvo_port, | 451 | p_mapping->dvo_port, |
@@ -457,7 +457,7 @@ parse_sdvo_device_mapping(struct drm_i915_private *dev_priv, | |||
457 | DRM_DEBUG_KMS("Maybe one SDVO port is shared by " | 457 | DRM_DEBUG_KMS("Maybe one SDVO port is shared by " |
458 | "two SDVO device.\n"); | 458 | "two SDVO device.\n"); |
459 | } | 459 | } |
460 | if (p_child->slave2_addr) { | 460 | if (p_child->old.slave2_addr) { |
461 | /* Maybe this is a SDVO device with multiple inputs */ | 461 | /* Maybe this is a SDVO device with multiple inputs */ |
462 | /* And the mapping info is not added */ | 462 | /* And the mapping info is not added */ |
463 | DRM_DEBUG_KMS("there exists the slave2_addr. Maybe this" | 463 | DRM_DEBUG_KMS("there exists the slave2_addr. Maybe this" |
@@ -588,7 +588,7 @@ parse_device_mapping(struct drm_i915_private *dev_priv, | |||
588 | struct bdb_header *bdb) | 588 | struct bdb_header *bdb) |
589 | { | 589 | { |
590 | struct bdb_general_definitions *p_defs; | 590 | struct bdb_general_definitions *p_defs; |
591 | struct child_device_config *p_child, *child_dev_ptr; | 591 | union child_device_config *p_child, *child_dev_ptr; |
592 | int i, child_device_num, count; | 592 | int i, child_device_num, count; |
593 | u16 block_size; | 593 | u16 block_size; |
594 | 594 | ||
@@ -616,7 +616,7 @@ parse_device_mapping(struct drm_i915_private *dev_priv, | |||
616 | /* get the number of child device that is present */ | 616 | /* get the number of child device that is present */ |
617 | for (i = 0; i < child_device_num; i++) { | 617 | for (i = 0; i < child_device_num; i++) { |
618 | p_child = &(p_defs->devices[i]); | 618 | p_child = &(p_defs->devices[i]); |
619 | if (!p_child->device_type) { | 619 | if (!p_child->common.device_type) { |
620 | /* skip the device block if device type is invalid */ | 620 | /* skip the device block if device type is invalid */ |
621 | continue; | 621 | continue; |
622 | } | 622 | } |
@@ -636,7 +636,7 @@ parse_device_mapping(struct drm_i915_private *dev_priv, | |||
636 | count = 0; | 636 | count = 0; |
637 | for (i = 0; i < child_device_num; i++) { | 637 | for (i = 0; i < child_device_num; i++) { |
638 | p_child = &(p_defs->devices[i]); | 638 | p_child = &(p_defs->devices[i]); |
639 | if (!p_child->device_type) { | 639 | if (!p_child->common.device_type) { |
640 | /* skip the device block if device type is invalid */ | 640 | /* skip the device block if device type is invalid */ |
641 | continue; | 641 | continue; |
642 | } | 642 | } |