radeon_hd: LVDS AtomBIOS mode reading

* This isn't done, but all we need to do now is create
  a simulated edid struct for LVDS screens.
This commit is contained in:
Alexander von Gluck IV
2012-02-17 08:13:29 -06:00
parent 437937ab64
commit e8790580ad
2 changed files with 23 additions and 6 deletions
@@ -125,9 +125,10 @@ connector_read_edid(uint32 connectorIndex, edid1_info* edid)
return false;
if (gConnector[connectorIndex]->type == VIDEO_CONNECTOR_LVDS) {
// we should call connector_read_edid_lvds at some point
ERROR("%s: LCD panel detected (LVDS), sending VESA EDID!\n",
__func__);
// TODO: connector_read_edid_lvds doesn't do anything yet
connector_read_edid_lvds(connectorIndex, edid);
memcpy(edid, &gInfo->shared_info->edid_info, sizeof(struct edid1_info));
return true;
}
@@ -153,7 +154,6 @@ connector_read_edid(uint32 connectorIndex, edid1_info* edid)
}
#if 0
bool
connector_read_edid_lvds(uint32 connectorIndex, edid1_info* edid)
{
@@ -162,11 +162,19 @@ connector_read_edid_lvds(uint32 connectorIndex, edid1_info* edid)
int index = GetIndexIntoMasterTable(DATA, LVDS_Info);
uint16 offset;
if (atom_parse_data_header(gAtomContexg, index, NULL,
union atomLVDSInfo {
struct _ATOM_LVDS_INFO info;
struct _ATOM_LVDS_INFO_V12 info_12;
};
if (atom_parse_data_header(gAtomContext, index, NULL,
&dceMajor, &dceMinor, &offset) == B_OK) {
lvdsInfo = (union lvds_info*)(gAtomContext->bios + offset);
union atomLVDSInfo* lvdsInfo
= (union atomLVDSInfo*)(gAtomContext->bios + offset);
display_timing timing;
// Pixel Clock
timing.pixel_clock
= B_LENDIAN_TO_HOST_INT16(lvdsInfo->info.sLCDTiming.usPixClk) * 10;
@@ -216,10 +224,18 @@ connector_read_edid_lvds(uint32 connectorIndex, edid1_info* edid)
timing.flags |= MODE_FLAG_DBLSCAN;
#endif
// TODO: generate a fake EDID with information above
// TODO: generate a fake EDID with information above. For now just dump
TRACE("%s: %" B_PRIu32 " %" B_PRIu16 " %" B_PRIu16 " %" B_PRIu16 " %" B_PRIu16
" %" B_PRIu16 " %" B_PRIu16 " %" B_PRIu16 " %" B_PRIu16 "\n",
__func__, timing.pixel_clock, timing.h_display, timing.h_sync_start,
timing.h_sync_end, timing.h_total, timing.v_display, timing.v_sync_start,
timing.v_sync_end, timing.v_total);
return true;
}
return false;
}
#endif
status_t
@@ -63,6 +63,7 @@ const int kConnectorConvert[] = {
status_t gpio_probe();
status_t connector_attach_gpio(uint32 id, uint8 hwPin);
bool connector_read_edid(uint32 connector, edid1_info* edid);
bool connector_read_edid_lvds(uint32 connectorIndex, edid1_info* edid);
status_t connector_probe();
status_t connector_probe_legacy();
bool connector_is_dp(uint32 connectorIndex);