diff --git a/src/bios_reader/bios_reader.c b/src/bios_reader/bios_reader.c index 9e05317..3680a73 100644 --- a/src/bios_reader/bios_reader.c +++ b/src/bios_reader/bios_reader.c @@ -180,6 +180,19 @@ static void dump_lvds_options(void *data) printf("\tPFIT mode: %d\n", options->pfit_mode); } +static void dump_lvds_ptr_data(void *data, unsigned char *base) +{ + struct bdb_lvds_lfp_data_ptrs *ptrs = data; + + struct lvds_fp_timing *fp_timing = + (struct lvds_fp_timing *)(base + ptrs->ptr[panel_type].fp_timing_offset); + + printf("LVDS timing pointer data:\n"); + + printf("\tpanel type %02i: %dx%d\n", panel_type, fp_timing->x_res, + fp_timing->y_res); +} + static void dump_lvds_data(void *data, unsigned char *base) { struct bdb_lvds_lfp_data *lvds_data = data; @@ -285,6 +298,8 @@ int main(int argc, char **argv) dump_general_definitions(find_section(bdb, BDB_GENERAL_DEFINITIONS)); dump_lvds_options(find_section(bdb, BDB_LVDS_OPTIONS)); dump_lvds_data(find_section(bdb, BDB_LVDS_LFP_DATA), bdb); + dump_lvds_ptr_data(find_section(bdb, BDB_LVDS_LFP_DATA_PTRS), + (unsigned char *)bdb); return 0; } diff --git a/src/i830_bios.c b/src/i830_bios.c index ff49025..2cb0b07 100644 --- a/src/i830_bios.c +++ b/src/i830_bios.c @@ -88,8 +88,8 @@ static void parse_panel_data(I830Ptr pI830, struct bdb_header *bdb) { struct bdb_lvds_options *lvds_options; - struct bdb_lvds_lfp_data *lvds_lfp_data; - struct bdb_lvds_lfp_data_entry *entry; + struct bdb_lvds_lfp_data_ptrs *lvds_lfp_data_ptrs; + int timing_offset; DisplayModePtr fixed_mode; unsigned char *timing_ptr; @@ -104,12 +104,13 @@ parse_panel_data(I830Ptr pI830, struct bdb_header *bdb) if (lvds_options->panel_type == 0xff) return; - lvds_lfp_data = find_section(bdb, BDB_LVDS_LFP_DATA); - if (!lvds_lfp_data) + lvds_lfp_data_ptrs = find_section(bdb, BDB_LVDS_LFP_DATA_PTRS); + if (!lvds_lfp_data_ptrs) return; - entry = &lvds_lfp_data->data[lvds_options->panel_type]; - timing_ptr = (unsigned char *)&entry->dvo_timing; + timing_offset = + lvds_lfp_data_ptrs->ptr[lvds_options->panel_type].dvo_timing_offset; + timing_ptr = (unsigned char *)bdb + timing_offset; fixed_mode = xnfalloc(sizeof(DisplayModeRec)); memset(fixed_mode, 0, sizeof(*fixed_mode));