diff options
| author | Zhenyu Wang <zhenyuw@linux.intel.com> | 2010-01-12 22:19:52 -0500 |
|---|---|---|
| committer | Eric Anholt <eric@anholt.net> | 2010-01-15 17:12:47 -0500 |
| commit | 500a8cc466a24e2fbc4c86ef9c6467ae2ffdeb0c (patch) | |
| tree | 4f7878b036dd1767bc7e6f9d7db3b1907b8271db /drivers/gpu | |
| parent | 33814341f22f13cec17e8d7fbf6f7e8000e3efa4 (diff) | |
drm/i915: parse eDP panel color depth from VBT block
Signed-off-by: Zhenyu Wang <zhenyuw@linux.intel.com>
Signed-off-by: Eric Anholt <eric@anholt.net>
Diffstat (limited to 'drivers/gpu')
| -rw-r--r-- | drivers/gpu/drm/i915/i915_drv.h | 1 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/intel_bios.c | 32 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/intel_bios.h | 40 |
3 files changed, 73 insertions, 0 deletions
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h index 5f781a74bf52..2c1669488b5a 100644 --- a/drivers/gpu/drm/i915/i915_drv.h +++ b/drivers/gpu/drm/i915/i915_drv.h | |||
| @@ -283,6 +283,7 @@ typedef struct drm_i915_private { | |||
| 283 | unsigned int lvds_use_ssc:1; | 283 | unsigned int lvds_use_ssc:1; |
| 284 | unsigned int edp_support:1; | 284 | unsigned int edp_support:1; |
| 285 | int lvds_ssc_freq; | 285 | int lvds_ssc_freq; |
| 286 | int edp_bpp; | ||
| 286 | 287 | ||
| 287 | struct notifier_block lid_notifier; | 288 | struct notifier_block lid_notifier; |
| 288 | 289 | ||
diff --git a/drivers/gpu/drm/i915/intel_bios.c b/drivers/gpu/drm/i915/intel_bios.c index b53c46f202f6..15fbc1b5a83e 100644 --- a/drivers/gpu/drm/i915/intel_bios.c +++ b/drivers/gpu/drm/i915/intel_bios.c | |||
| @@ -33,6 +33,8 @@ | |||
| 33 | #define SLAVE_ADDR1 0x70 | 33 | #define SLAVE_ADDR1 0x70 |
| 34 | #define SLAVE_ADDR2 0x72 | 34 | #define SLAVE_ADDR2 0x72 |
| 35 | 35 | ||
| 36 | static int panel_type; | ||
| 37 | |||
| 36 | static void * | 38 | static void * |
| 37 | find_section(struct bdb_header *bdb, int section_id) | 39 | find_section(struct bdb_header *bdb, int section_id) |
| 38 | { | 40 | { |
| @@ -128,6 +130,7 @@ parse_lfp_panel_data(struct drm_i915_private *dev_priv, | |||
| 128 | dev_priv->lvds_dither = lvds_options->pixel_dither; | 130 | dev_priv->lvds_dither = lvds_options->pixel_dither; |
| 129 | if (lvds_options->panel_type == 0xff) | 131 | if (lvds_options->panel_type == 0xff) |
| 130 | return; | 132 | return; |
| 133 | panel_type = lvds_options->panel_type; | ||
| 131 | 134 | ||
| 132 | lvds_lfp_data = find_section(bdb, BDB_LVDS_LFP_DATA); | 135 | lvds_lfp_data = find_section(bdb, BDB_LVDS_LFP_DATA); |
| 133 | if (!lvds_lfp_data) | 136 | if (!lvds_lfp_data) |
| @@ -406,6 +409,34 @@ parse_driver_features(struct drm_i915_private *dev_priv, | |||
| 406 | } | 409 | } |
| 407 | 410 | ||
| 408 | static void | 411 | static void |
| 412 | parse_edp(struct drm_i915_private *dev_priv, struct bdb_header *bdb) | ||
| 413 | { | ||
| 414 | struct bdb_edp *edp; | ||
| 415 | |||
| 416 | edp = find_section(bdb, BDB_EDP); | ||
| 417 | if (!edp) { | ||
| 418 | if (SUPPORTS_EDP(dev_priv->dev) && dev_priv->edp_support) { | ||
| 419 | DRM_DEBUG_KMS("No eDP BDB found but eDP panel supported,\ | ||
| 420 | assume 18bpp panel color depth.\n"); | ||
| 421 | dev_priv->edp_bpp = 18; | ||
| 422 | } | ||
| 423 | return; | ||
| 424 | } | ||
| 425 | |||
| 426 | switch ((edp->color_depth >> (panel_type * 2)) & 3) { | ||
| 427 | case EDP_18BPP: | ||
| 428 | dev_priv->edp_bpp = 18; | ||
| 429 | break; | ||
| 430 | case EDP_24BPP: | ||
| 431 | dev_priv->edp_bpp = 24; | ||
| 432 | break; | ||
| 433 | case EDP_30BPP: | ||
| 434 | dev_priv->edp_bpp = 30; | ||
| 435 | break; | ||
| 436 | } | ||
| 437 | } | ||
| 438 | |||
| 439 | static void | ||
| 409 | parse_device_mapping(struct drm_i915_private *dev_priv, | 440 | parse_device_mapping(struct drm_i915_private *dev_priv, |
| 410 | struct bdb_header *bdb) | 441 | struct bdb_header *bdb) |
| 411 | { | 442 | { |
| @@ -522,6 +553,7 @@ intel_init_bios(struct drm_device *dev) | |||
| 522 | parse_sdvo_device_mapping(dev_priv, bdb); | 553 | parse_sdvo_device_mapping(dev_priv, bdb); |
| 523 | parse_device_mapping(dev_priv, bdb); | 554 | parse_device_mapping(dev_priv, bdb); |
| 524 | parse_driver_features(dev_priv, bdb); | 555 | parse_driver_features(dev_priv, bdb); |
| 556 | parse_edp(dev_priv, bdb); | ||
| 525 | 557 | ||
| 526 | pci_unmap_rom(pdev, bios); | 558 | pci_unmap_rom(pdev, bios); |
| 527 | 559 | ||
diff --git a/drivers/gpu/drm/i915/intel_bios.h b/drivers/gpu/drm/i915/intel_bios.h index 425ac9d7f724..4c18514f6f80 100644 --- a/drivers/gpu/drm/i915/intel_bios.h +++ b/drivers/gpu/drm/i915/intel_bios.h | |||
| @@ -98,6 +98,7 @@ struct vbios_data { | |||
| 98 | #define BDB_SDVO_LVDS_PNP_IDS 24 | 98 | #define BDB_SDVO_LVDS_PNP_IDS 24 |
| 99 | #define BDB_SDVO_LVDS_POWER_SEQ 25 | 99 | #define BDB_SDVO_LVDS_POWER_SEQ 25 |
| 100 | #define BDB_TV_OPTIONS 26 | 100 | #define BDB_TV_OPTIONS 26 |
| 101 | #define BDB_EDP 27 | ||
| 101 | #define BDB_LVDS_OPTIONS 40 | 102 | #define BDB_LVDS_OPTIONS 40 |
| 102 | #define BDB_LVDS_LFP_DATA_PTRS 41 | 103 | #define BDB_LVDS_LFP_DATA_PTRS 41 |
| 103 | #define BDB_LVDS_LFP_DATA 42 | 104 | #define BDB_LVDS_LFP_DATA 42 |
| @@ -426,6 +427,45 @@ struct bdb_driver_features { | |||
| 426 | u8 custom_vbt_version; | 427 | u8 custom_vbt_version; |
| 427 | } __attribute__((packed)); | 428 | } __attribute__((packed)); |
| 428 | 429 | ||
| 430 | #define EDP_18BPP 0 | ||
| 431 | #define EDP_24BPP 1 | ||
| 432 | #define EDP_30BPP 2 | ||
| 433 | #define EDP_RATE_1_62 0 | ||
| 434 | #define EDP_RATE_2_7 1 | ||
| 435 | #define EDP_LANE_1 0 | ||
| 436 | #define EDP_LANE_2 1 | ||
| 437 | #define EDP_LANE_4 3 | ||
| 438 | #define EDP_PREEMPHASIS_NONE 0 | ||
| 439 | #define EDP_PREEMPHASIS_3_5dB 1 | ||
| 440 | #define EDP_PREEMPHASIS_6dB 2 | ||
| 441 | #define EDP_PREEMPHASIS_9_5dB 3 | ||
| 442 | #define EDP_VSWING_0_4V 0 | ||
| 443 | #define EDP_VSWING_0_6V 1 | ||
| 444 | #define EDP_VSWING_0_8V 2 | ||
| 445 | #define EDP_VSWING_1_2V 3 | ||
| 446 | |||
| 447 | struct edp_power_seq { | ||
| 448 | u16 t3; | ||
| 449 | u16 t7; | ||
| 450 | u16 t9; | ||
| 451 | u16 t10; | ||
| 452 | u16 t12; | ||
| 453 | } __attribute__ ((packed)); | ||
| 454 | |||
| 455 | struct edp_link_params { | ||
| 456 | u8 rate:4; | ||
| 457 | u8 lanes:4; | ||
| 458 | u8 preemphasis:4; | ||
| 459 | u8 vswing:4; | ||
| 460 | } __attribute__ ((packed)); | ||
| 461 | |||
| 462 | struct bdb_edp { | ||
| 463 | struct edp_power_seq power_seqs[16]; | ||
| 464 | u32 color_depth; | ||
| 465 | u32 sdrrs_msa_timing_delay; | ||
| 466 | struct edp_link_params link_params[16]; | ||
| 467 | } __attribute__ ((packed)); | ||
| 468 | |||
| 429 | bool intel_init_bios(struct drm_device *dev); | 469 | bool intel_init_bios(struct drm_device *dev); |
| 430 | 470 | ||
| 431 | /* | 471 | /* |
