xf86-video-intel: src/bios_reader/bios_reader.c src/i830_bios.c

Zhenyu Wang zhen at kemper.freedesktop.org
Mon Aug 3 20:39:42 PDT 2009


 src/bios_reader/bios_reader.c |   20 +++++++++++++++++---
 src/i830_bios.c               |    6 ++++--
 2 files changed, 21 insertions(+), 5 deletions(-)

New commits:
commit af45482a52999b52bf41468c458808e30c100e35
Author: Zhao Yakui <yakui.zhao at intel.com>
Date:   Fri Jul 24 10:44:20 2009 +0800

    Calculate the DVO relative offset in LVDS data entry to get the DVO timing
    
    Now the DVO timing in LVDS data entry is obtained by using the
    following step:
        a. get the entry size for every LVDS panel data
        b. Get the LVDS fp entry for the preferred panel type
        c. get the DVO timing by using entry->dvo_timing
    
        In our driver the entry->dvo_timing is related with the size of
    lvds_fp_timing. For example: the size is 46.
    
        But it seems that the size of lvds_fp_timing varies on the differnt
    platform. In such case we will get the incorrect DVO timing because of
    the incorrect DVO offset in LVDS panel data entry.
    
    Calculate the DVO timing offset in LVDS data entry to get the DVO timing
        a. get the DVO timing offset in the LVDS fp data entry by using the
    pointer definition in LVDS data ptr
        b. get the LVDS data entry
        c. get the DVO timing by adding the DVO timing offset to data entry
    
    https://bugs.freedesktop.org/show_bug.cgi?id=22787
    
    Signed-off-by: Zhao Yakui <yakui.zhao at intel.com>

diff --git a/src/bios_reader/bios_reader.c b/src/bios_reader/bios_reader.c
index cdc2045..35b144c 100644
--- a/src/bios_reader/bios_reader.c
+++ b/src/bios_reader/bios_reader.c
@@ -313,11 +313,23 @@ static void dump_lvds_data(void)
 {
     struct bdb_block *block;
     struct bdb_lvds_lfp_data *lvds_data;
+    struct bdb_lvds_lfp_data_ptrs *ptrs;
     int num_entries;
     int i;
     int hdisplay, hsyncstart, hsyncend, htotal;
     int vdisplay, vsyncstart, vsyncend, vtotal;
     float clock;
+    int lfp_data_size, dvo_offset;
+
+    block = find_section(BDB_LVDS_LFP_DATA_PTRS);
+    if (!block) {
+	printf("No LVDS ptr block\n");
+        return;
+    }
+    ptrs = block->data;
+    lfp_data_size = ptrs->ptr[1].fp_timing_offset - ptrs->ptr[0].fp_timing_offset;
+    dvo_offset = ptrs->ptr[0].dvo_timing_offset - ptrs->ptr[0].fp_timing_offset;
+    free(block);
 
     block = find_section(BDB_LVDS_LFP_DATA);
     if (!block) {
@@ -326,14 +338,16 @@ static void dump_lvds_data(void)
     }
 
     lvds_data = block->data;
-    num_entries = block->size / sizeof(struct bdb_lvds_lfp_data_entry);
+    num_entries = block->size / lfp_data_size;
 
     printf("LVDS panel data block (preferred block marked with '*'):\n");
     printf("  Number of entries: %d\n", num_entries);
 
     for (i = 0; i < num_entries; i++) {
-	struct bdb_lvds_lfp_data_entry *lfp_data = &lvds_data->data[i];
-	uint8_t *timing_data = (uint8_t *)&lfp_data->dvo_timing;
+	uint8_t *lfp_data_ptr = (uint8_t *)lvds_data->data + lfp_data_size * i;
+	uint8_t *timing_data = lfp_data_ptr + dvo_offset;
+	struct bdb_lvds_lfp_data_entry *lfp_data =
+			(struct bdb_lvds_flp_data_entry *)lfp_data_ptr;
 	char marker;
 
 	if (i == panel_type)
diff --git a/src/i830_bios.c b/src/i830_bios.c
index 60c307c..f4a2005 100644
--- a/src/i830_bios.c
+++ b/src/i830_bios.c
@@ -123,6 +123,7 @@ parse_integrated_panel_data(I830Ptr pI830, struct bdb_header *bdb)
     DisplayModePtr fixed_mode;
     unsigned char *timing_ptr;
     int lfp_data_size;
+    int dvo_offset;
 
     /* Defaults if we can't find VBT info */
     pI830->lvds_dither = 0;
@@ -146,10 +147,11 @@ parse_integrated_panel_data(I830Ptr pI830, struct bdb_header *bdb)
 
     lfp_data_size = lvds_lfp_data_ptrs->ptr[1].dvo_timing_offset -
 	lvds_lfp_data_ptrs->ptr[0].dvo_timing_offset;
+    dvo_offset = lvds_lfp_data_ptrs->ptr[0].dvo_timing_offset -
+			lvds_lfp_data_ptrs->ptr[0].fp_timing_offset;
     entry = (struct bdb_lvds_lfp_data_entry *)((uint8_t *)lvds_data->data +
 					       (lfp_data_size * lvds_options->panel_type));
-    timing_ptr = (unsigned char *)&entry->dvo_timing;
-
+    timing_ptr = (unsigned char *)entry + dvo_offset;
     if (pI830->skip_panel_detect)
 	return;
 


More information about the xorg-commit mailing list