drm/radeon/kms/atom: rework crtc modeset
- clean up tv timing handling - unify SetCRTC_Timing and SetCRTC_UsingDTDTiming Signed-off-by: Alex Deucher <alexdeucher@gmail.com> Signed-off-by: Dave Airlie <airlied@redhat.com>
This commit is contained in:

committed by
Dave Airlie

parent
2606c88608
commit
5a9bcacc0a
@@ -857,8 +857,7 @@ radeon_atombios_get_primary_dac_info(struct radeon_encoder *encoder)
|
||||
}
|
||||
|
||||
bool radeon_atom_get_tv_timings(struct radeon_device *rdev, int index,
|
||||
SET_CRTC_TIMING_PARAMETERS_PS_ALLOCATION *crtc_timing,
|
||||
int32_t *pixel_clock)
|
||||
struct drm_display_mode *mode)
|
||||
{
|
||||
struct radeon_mode_info *mode_info = &rdev->mode_info;
|
||||
ATOM_ANALOG_TV_INFO *tv_info;
|
||||
@@ -866,7 +865,7 @@ bool radeon_atom_get_tv_timings(struct radeon_device *rdev, int index,
|
||||
ATOM_DTD_FORMAT *dtd_timings;
|
||||
int data_index = GetIndexIntoMasterTable(DATA, AnalogTV_Info);
|
||||
u8 frev, crev;
|
||||
uint16_t data_offset;
|
||||
u16 data_offset, misc;
|
||||
|
||||
atom_parse_data_header(mode_info->atom_context, data_index, NULL, &frev, &crev, &data_offset);
|
||||
|
||||
@@ -876,28 +875,37 @@ bool radeon_atom_get_tv_timings(struct radeon_device *rdev, int index,
|
||||
if (index > MAX_SUPPORTED_TV_TIMING)
|
||||
return false;
|
||||
|
||||
crtc_timing->usH_Total = le16_to_cpu(tv_info->aModeTimings[index].usCRTC_H_Total);
|
||||
crtc_timing->usH_Disp = le16_to_cpu(tv_info->aModeTimings[index].usCRTC_H_Disp);
|
||||
crtc_timing->usH_SyncStart = le16_to_cpu(tv_info->aModeTimings[index].usCRTC_H_SyncStart);
|
||||
crtc_timing->usH_SyncWidth = le16_to_cpu(tv_info->aModeTimings[index].usCRTC_H_SyncWidth);
|
||||
mode->crtc_htotal = le16_to_cpu(tv_info->aModeTimings[index].usCRTC_H_Total);
|
||||
mode->crtc_hdisplay = le16_to_cpu(tv_info->aModeTimings[index].usCRTC_H_Disp);
|
||||
mode->crtc_hsync_start = le16_to_cpu(tv_info->aModeTimings[index].usCRTC_H_SyncStart);
|
||||
mode->crtc_hsync_end = le16_to_cpu(tv_info->aModeTimings[index].usCRTC_H_SyncStart) +
|
||||
le16_to_cpu(tv_info->aModeTimings[index].usCRTC_H_SyncWidth);
|
||||
|
||||
crtc_timing->usV_Total = le16_to_cpu(tv_info->aModeTimings[index].usCRTC_V_Total);
|
||||
crtc_timing->usV_Disp = le16_to_cpu(tv_info->aModeTimings[index].usCRTC_V_Disp);
|
||||
crtc_timing->usV_SyncStart = le16_to_cpu(tv_info->aModeTimings[index].usCRTC_V_SyncStart);
|
||||
crtc_timing->usV_SyncWidth = le16_to_cpu(tv_info->aModeTimings[index].usCRTC_V_SyncWidth);
|
||||
mode->crtc_vtotal = le16_to_cpu(tv_info->aModeTimings[index].usCRTC_V_Total);
|
||||
mode->crtc_vdisplay = le16_to_cpu(tv_info->aModeTimings[index].usCRTC_V_Disp);
|
||||
mode->crtc_vsync_start = le16_to_cpu(tv_info->aModeTimings[index].usCRTC_V_SyncStart);
|
||||
mode->crtc_vsync_end = le16_to_cpu(tv_info->aModeTimings[index].usCRTC_V_SyncStart) +
|
||||
le16_to_cpu(tv_info->aModeTimings[index].usCRTC_V_SyncWidth);
|
||||
|
||||
crtc_timing->susModeMiscInfo = tv_info->aModeTimings[index].susModeMiscInfo;
|
||||
mode->flags = 0;
|
||||
misc = le16_to_cpu(tv_info->aModeTimings[index].susModeMiscInfo.usAccess);
|
||||
if (misc & ATOM_VSYNC_POLARITY)
|
||||
mode->flags |= DRM_MODE_FLAG_NVSYNC;
|
||||
if (misc & ATOM_HSYNC_POLARITY)
|
||||
mode->flags |= DRM_MODE_FLAG_NHSYNC;
|
||||
if (misc & ATOM_COMPOSITESYNC)
|
||||
mode->flags |= DRM_MODE_FLAG_CSYNC;
|
||||
if (misc & ATOM_INTERLACE)
|
||||
mode->flags |= DRM_MODE_FLAG_INTERLACE;
|
||||
if (misc & ATOM_DOUBLE_CLOCK_MODE)
|
||||
mode->flags |= DRM_MODE_FLAG_DBLSCAN;
|
||||
|
||||
crtc_timing->ucOverscanRight = le16_to_cpu(tv_info->aModeTimings[index].usCRTC_OverscanRight);
|
||||
crtc_timing->ucOverscanLeft = le16_to_cpu(tv_info->aModeTimings[index].usCRTC_OverscanLeft);
|
||||
crtc_timing->ucOverscanBottom = le16_to_cpu(tv_info->aModeTimings[index].usCRTC_OverscanBottom);
|
||||
crtc_timing->ucOverscanTop = le16_to_cpu(tv_info->aModeTimings[index].usCRTC_OverscanTop);
|
||||
*pixel_clock = le16_to_cpu(tv_info->aModeTimings[index].usPixelClock) * 10;
|
||||
mode->clock = le16_to_cpu(tv_info->aModeTimings[index].usPixelClock) * 10;
|
||||
|
||||
if (index == 1) {
|
||||
/* PAL timings appear to have wrong values for totals */
|
||||
crtc_timing->usH_Total -= 1;
|
||||
crtc_timing->usV_Total -= 1;
|
||||
mode->crtc_htotal -= 1;
|
||||
mode->crtc_vtotal -= 1;
|
||||
}
|
||||
break;
|
||||
case 2:
|
||||
@@ -906,17 +914,36 @@ bool radeon_atom_get_tv_timings(struct radeon_device *rdev, int index,
|
||||
return false;
|
||||
|
||||
dtd_timings = &tv_info_v1_2->aModeTimings[index];
|
||||
crtc_timing->usH_Total = le16_to_cpu(dtd_timings->usHActive) + le16_to_cpu(dtd_timings->usHBlanking_Time);
|
||||
crtc_timing->usH_Disp = le16_to_cpu(dtd_timings->usHActive);
|
||||
crtc_timing->usH_SyncStart = le16_to_cpu(dtd_timings->usHActive) + le16_to_cpu(dtd_timings->usHSyncOffset);
|
||||
crtc_timing->usH_SyncWidth = le16_to_cpu(dtd_timings->usHSyncWidth);
|
||||
crtc_timing->usV_Total = le16_to_cpu(dtd_timings->usVActive) + le16_to_cpu(dtd_timings->usVBlanking_Time);
|
||||
crtc_timing->usV_Disp = le16_to_cpu(dtd_timings->usVActive);
|
||||
crtc_timing->usV_SyncStart = le16_to_cpu(dtd_timings->usVActive) + le16_to_cpu(dtd_timings->usVSyncOffset);
|
||||
crtc_timing->usV_SyncWidth = le16_to_cpu(dtd_timings->usVSyncWidth);
|
||||
mode->crtc_htotal = le16_to_cpu(dtd_timings->usHActive) +
|
||||
le16_to_cpu(dtd_timings->usHBlanking_Time);
|
||||
mode->crtc_hdisplay = le16_to_cpu(dtd_timings->usHActive);
|
||||
mode->crtc_hsync_start = le16_to_cpu(dtd_timings->usHActive) +
|
||||
le16_to_cpu(dtd_timings->usHSyncOffset);
|
||||
mode->crtc_hsync_end = mode->crtc_hsync_start +
|
||||
le16_to_cpu(dtd_timings->usHSyncWidth);
|
||||
|
||||
crtc_timing->susModeMiscInfo.usAccess = le16_to_cpu(dtd_timings->susModeMiscInfo.usAccess);
|
||||
*pixel_clock = le16_to_cpu(dtd_timings->usPixClk) * 10;
|
||||
mode->crtc_vtotal = le16_to_cpu(dtd_timings->usVActive) +
|
||||
le16_to_cpu(dtd_timings->usVBlanking_Time);
|
||||
mode->crtc_vdisplay = le16_to_cpu(dtd_timings->usVActive);
|
||||
mode->crtc_vsync_start = le16_to_cpu(dtd_timings->usVActive) +
|
||||
le16_to_cpu(dtd_timings->usVSyncOffset);
|
||||
mode->crtc_vsync_end = mode->crtc_vsync_start +
|
||||
le16_to_cpu(dtd_timings->usVSyncWidth);
|
||||
|
||||
mode->flags = 0;
|
||||
misc = le16_to_cpu(dtd_timings->susModeMiscInfo.usAccess);
|
||||
if (misc & ATOM_VSYNC_POLARITY)
|
||||
mode->flags |= DRM_MODE_FLAG_NVSYNC;
|
||||
if (misc & ATOM_HSYNC_POLARITY)
|
||||
mode->flags |= DRM_MODE_FLAG_NHSYNC;
|
||||
if (misc & ATOM_COMPOSITESYNC)
|
||||
mode->flags |= DRM_MODE_FLAG_CSYNC;
|
||||
if (misc & ATOM_INTERLACE)
|
||||
mode->flags |= DRM_MODE_FLAG_INTERLACE;
|
||||
if (misc & ATOM_DOUBLE_CLOCK_MODE)
|
||||
mode->flags |= DRM_MODE_FLAG_DBLSCAN;
|
||||
|
||||
mode->clock = le16_to_cpu(dtd_timings->usPixClk) * 10;
|
||||
break;
|
||||
}
|
||||
return true;
|
||||
|
Reference in New Issue
Block a user