summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZhao Yakui <yakui.zhao@intel.com>2009-07-24 10:44:20 +0800
committerZhenyu Wang <zhenyuw@linux.intel.com>2009-08-04 11:32:26 +0800
commitaf45482a52999b52bf41468c458808e30c100e35 (patch)
treeadbd9570f7ed671bcecbecda8b6498f8d6ddcdf2
parent50e2a6734de43a135aa91cd6e6fb5147e15ce315 (diff)
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@intel.com>
-rw-r--r--src/bios_reader/bios_reader.c20
-rw-r--r--src/i830_bios.c6
2 files changed, 21 insertions, 5 deletions
diff --git a/src/bios_reader/bios_reader.c b/src/bios_reader/bios_reader.c
index cdc20453..35b144cb 100644
--- a/src/bios_reader/bios_reader.c
+++ b/src/bios_reader/bios_reader.c
@@ -315,2 +315,3 @@ static void dump_lvds_data(void)
struct bdb_lvds_lfp_data *lvds_data;
+ struct bdb_lvds_lfp_data_ptrs *ptrs;
int num_entries;
@@ -320,2 +321,13 @@ static void dump_lvds_data(void)
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);
@@ -328,3 +340,3 @@ 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;
@@ -334,4 +346,6 @@ static void dump_lvds_data(void)
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;
diff --git a/src/i830_bios.c b/src/i830_bios.c
index 60c307c2..f4a20053 100644
--- a/src/i830_bios.c
+++ b/src/i830_bios.c
@@ -125,2 +125,3 @@ parse_integrated_panel_data(I830Ptr pI830, struct bdb_header *bdb)
int lfp_data_size;
+ int dvo_offset;
@@ -148,6 +149,7 @@ parse_integrated_panel_data(I830Ptr pI830, struct bdb_header *bdb)
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)