dp: tx: Update to use new common video mode table and timing structure format.

Signed-off-by: Andrei-Liviu Simion <andrei.simion@xilinx.com>
This commit is contained in:
Andrei-Liviu Simion 2015-01-13 14:24:44 -08:00 committed by Nava kishore Manne
parent c9ef03a85f
commit 2d7f2abf8a
2 changed files with 86 additions and 33 deletions

View file

@ -288,6 +288,8 @@ typedef struct {
*/ */
typedef struct { typedef struct {
XVid_VideoTimingMode Vtm; /**< The video timing. */ XVid_VideoTimingMode Vtm; /**< The video timing. */
u32 PixelClockHz; /**< The pixel clock of the stream (in
Hz). */
u32 HClkTotal; /**< Horizontal total time (in u32 HClkTotal; /**< Horizontal total time (in
pixels). */ pixels). */
u32 VClkTotal; /**< Vertical total time (in pixels). */ u32 VClkTotal; /**< Vertical total time (in pixels). */

View file

@ -144,11 +144,11 @@ void XDptx_CfgMsaRecalculate(XDptx *InstancePtr, u8 Stream)
/* Set the user pixel width to handle clocks that exceed the /* Set the user pixel width to handle clocks that exceed the
* capabilities of the DisplayPort TX core. */ * capabilities of the DisplayPort TX core. */
if (MsaConfig->OverrideUserPixelWidth == 0) { if (MsaConfig->OverrideUserPixelWidth == 0) {
if ((MsaConfig->Vtm.PixelClkKhz > 300000) && if ((MsaConfig->PixelClockHz > 300000000) &&
(LinkConfig->LaneCount == XDPTX_LANE_COUNT_SET_4)) { (LinkConfig->LaneCount == XDPTX_LANE_COUNT_SET_4)) {
MsaConfig->UserPixelWidth = 4; MsaConfig->UserPixelWidth = 4;
} }
else if ((MsaConfig->Vtm.PixelClkKhz > 75000) && else if ((MsaConfig->PixelClockHz > 75000000) &&
(LinkConfig->LaneCount != XDPTX_LANE_COUNT_SET_1)) { (LinkConfig->LaneCount != XDPTX_LANE_COUNT_SET_1)) {
MsaConfig->UserPixelWidth = 2; MsaConfig->UserPixelWidth = 2;
} }
@ -238,7 +238,7 @@ void XDptx_CfgMsaRecalculate(XDptx *InstancePtr, u8 Stream)
/* Calculate the average number of bytes per transfer unit. /* Calculate the average number of bytes per transfer unit.
* Note: Both the integer and the fractional part is stored in * Note: Both the integer and the fractional part is stored in
* AvgBytesPerTU. */ * AvgBytesPerTU. */
VideoBw = (MsaConfig->Vtm.PixelClkKhz * BitsPerPixel) / 8; VideoBw = ((MsaConfig->PixelClockHz / 1000) * BitsPerPixel) / 8;
LinkBw = (LinkConfig->LaneCount * LinkConfig->LinkRate * 27); LinkBw = (LinkConfig->LaneCount * LinkConfig->LinkRate * 27);
MsaConfig->AvgBytesPerTU = (VideoBw * MsaConfig->AvgBytesPerTU = (VideoBw *
MsaConfig->TransferUnitSize) / LinkBw; MsaConfig->TransferUnitSize) / LinkBw;
@ -282,7 +282,7 @@ void XDptx_CfgMsaUseStandardVideoMode(XDptx *InstancePtr, u8 Stream,
/* Verify arguments. */ /* Verify arguments. */
Xil_AssertVoid(InstancePtr != NULL); Xil_AssertVoid(InstancePtr != NULL);
Xil_AssertVoid(VideoMode < XVID_VM_NUM_SUPPORT); Xil_AssertVoid(VideoMode < XVID_VM_NUM_SUPPORTED);
Xil_AssertVoid((Stream == XDPTX_STREAM_ID1) || Xil_AssertVoid((Stream == XDPTX_STREAM_ID1) ||
(Stream == XDPTX_STREAM_ID2) || (Stream == XDPTX_STREAM_ID3) || (Stream == XDPTX_STREAM_ID2) || (Stream == XDPTX_STREAM_ID3) ||
(Stream == XDPTX_STREAM_ID4)); (Stream == XDPTX_STREAM_ID4));
@ -290,28 +290,44 @@ void XDptx_CfgMsaUseStandardVideoMode(XDptx *InstancePtr, u8 Stream,
MsaConfig = &InstancePtr->MsaConfig[Stream - 1]; MsaConfig = &InstancePtr->MsaConfig[Stream - 1];
/* Configure the MSA values from the display monitor DMT table. */ /* Configure the MSA values from the display monitor DMT table. */
MsaConfig->Vtm.PixelClkKhz = MsaConfig->Vtm.VmId = XVid_VideoTimingModes[VideoMode].VmId;
XVid_VideoTimingModes[VideoMode].PixelClkKhz; MsaConfig->Vtm.FrameRate = XVid_VideoTimingModes[VideoMode].FrameRate;
MsaConfig->Vtm.Timing.HActive = MsaConfig->Vtm.Timing.HActive =
XVid_VideoTimingModes[VideoMode].Timing.HActive; XVid_VideoTimingModes[VideoMode].Timing.HActive;
MsaConfig->Vtm.Timing.VActive =
XVid_VideoTimingModes[VideoMode].Timing.VActive;
MsaConfig->Vtm.Timing.HSyncPolarity =
XVid_VideoTimingModes[VideoMode].Timing.HSyncPolarity;
MsaConfig->Vtm.Timing.VSyncPolarity =
XVid_VideoTimingModes[VideoMode].Timing.VSyncPolarity;
MsaConfig->Vtm.Timing.HFrontPorch = MsaConfig->Vtm.Timing.HFrontPorch =
XVid_VideoTimingModes[VideoMode].Timing.HFrontPorch; XVid_VideoTimingModes[VideoMode].Timing.HFrontPorch;
MsaConfig->Vtm.Timing.HSyncWidth = MsaConfig->Vtm.Timing.HSyncWidth =
XVid_VideoTimingModes[VideoMode].Timing.HSyncWidth; XVid_VideoTimingModes[VideoMode].Timing.HSyncWidth;
MsaConfig->Vtm.Timing.HBackPorch = MsaConfig->Vtm.Timing.HBackPorch =
XVid_VideoTimingModes[VideoMode].Timing.HBackPorch; XVid_VideoTimingModes[VideoMode].Timing.HBackPorch;
MsaConfig->Vtm.Timing.HTotal =
XVid_VideoTimingModes[VideoMode].Timing.HTotal;
MsaConfig->Vtm.Timing.HSyncPolarity =
XVid_VideoTimingModes[VideoMode].Timing.HSyncPolarity;
MsaConfig->Vtm.Timing.VActive =
XVid_VideoTimingModes[VideoMode].Timing.VActive;
MsaConfig->Vtm.Timing.F0PVFrontPorch = MsaConfig->Vtm.Timing.F0PVFrontPorch =
XVid_VideoTimingModes[VideoMode].Timing.F0PVFrontPorch; XVid_VideoTimingModes[VideoMode].Timing.F0PVFrontPorch;
MsaConfig->Vtm.Timing.F0PVSyncWidth = MsaConfig->Vtm.Timing.F0PVSyncWidth =
XVid_VideoTimingModes[VideoMode].Timing.F0PVSyncWidth; XVid_VideoTimingModes[VideoMode].Timing.F0PVSyncWidth;
MsaConfig->Vtm.Timing.F0PVBackPorch = MsaConfig->Vtm.Timing.F0PVBackPorch =
XVid_VideoTimingModes[VideoMode].Timing.F0PVBackPorch; XVid_VideoTimingModes[VideoMode].Timing.F0PVBackPorch;
MsaConfig->Vtm.Timing.F0PVTotal =
XVid_VideoTimingModes[VideoMode].Timing.F0PVTotal;
MsaConfig->Vtm.Timing.F1VFrontPorch =
XVid_VideoTimingModes[VideoMode].Timing.F1VFrontPorch;
MsaConfig->Vtm.Timing.F1VSyncWidth =
XVid_VideoTimingModes[VideoMode].Timing.F1VSyncWidth;
MsaConfig->Vtm.Timing.F1VBackPorch =
XVid_VideoTimingModes[VideoMode].Timing.F1VBackPorch;
MsaConfig->Vtm.Timing.F1VTotal =
XVid_VideoTimingModes[VideoMode].Timing.F1VTotal;
MsaConfig->Vtm.Timing.VSyncPolarity =
XVid_VideoTimingModes[VideoMode].Timing.VSyncPolarity;
/* Calculate the pixel clock frequency. */
MsaConfig->PixelClockHz =
XVid_GetPixelClockHzByVmId(MsaConfig->Vtm.VmId);
/* Calculate the rest of the MSA values. */ /* Calculate the rest of the MSA values. */
XDptx_CfgMsaRecalculate(InstancePtr, Stream); XDptx_CfgMsaRecalculate(InstancePtr, Stream);
@ -376,8 +392,8 @@ void XDptx_CfgMsaUseEdidPreferredTiming(XDptx *InstancePtr, u8 Stream, u8 *Edid)
XDPTX_EDID_DTD_XRES_XBLANK_U4_XRES_SHIFT) << 8) | XDPTX_EDID_DTD_XRES_XBLANK_U4_XRES_SHIFT) << 8) |
Ptm[XDPTX_EDID_DTD_VRES_LSB]; Ptm[XDPTX_EDID_DTD_VRES_LSB];
MsaConfig->Vtm.PixelClkKhz = ((Ptm[XDPTX_EDID_DTD_PIXEL_CLK_KHZ_MSB] << MsaConfig->PixelClockHz = (((Ptm[XDPTX_EDID_DTD_PIXEL_CLK_KHZ_MSB] <<
8) | Ptm[XDPTX_EDID_DTD_PIXEL_CLK_KHZ_LSB]) * 10; 8) | Ptm[XDPTX_EDID_DTD_PIXEL_CLK_KHZ_LSB]) * 10) * 1000;
MsaConfig->Vtm.Timing.HFrontPorch = MsaConfig->Vtm.Timing.HFrontPorch =
(((Ptm[XDPTX_EDID_DTD_XFPORCH_XSPW_U2] & (((Ptm[XDPTX_EDID_DTD_XFPORCH_XSPW_U2] &
@ -405,6 +421,7 @@ void XDptx_CfgMsaUseEdidPreferredTiming(XDptx *InstancePtr, u8 Stream, u8 *Edid)
(Ptm[XDPTX_EDID_DTD_VFPORCH_VSPW_L4] & (Ptm[XDPTX_EDID_DTD_VFPORCH_VSPW_L4] &
XDPTX_EDID_DTD_VFPORCH_VSPW_L4_VSPW_MASK); XDPTX_EDID_DTD_VFPORCH_VSPW_L4_VSPW_MASK);
/* Compute video mode timing values. */
MsaConfig->Vtm.Timing.HBackPorch = HBlank - MsaConfig->Vtm.Timing.HBackPorch = HBlank -
(MsaConfig->Vtm.Timing.HFrontPorch + (MsaConfig->Vtm.Timing.HFrontPorch +
MsaConfig->Vtm.Timing.HSyncWidth); MsaConfig->Vtm.Timing.HSyncWidth);
@ -413,6 +430,22 @@ void XDptx_CfgMsaUseEdidPreferredTiming(XDptx *InstancePtr, u8 Stream, u8 *Edid)
(MsaConfig->Vtm.Timing.F0PVFrontPorch + (MsaConfig->Vtm.Timing.F0PVFrontPorch +
MsaConfig->Vtm.Timing.F0PVSyncWidth); MsaConfig->Vtm.Timing.F0PVSyncWidth);
MsaConfig->Vtm.Timing.HTotal = (MsaConfig->Vtm.Timing.HSyncWidth +
MsaConfig->Vtm.Timing.HFrontPorch +
MsaConfig->Vtm.Timing.HActive +
MsaConfig->Vtm.Timing.HBackPorch);
MsaConfig->Vtm.Timing.F0PVTotal = (MsaConfig->Vtm.Timing.F0PVSyncWidth +
MsaConfig->Vtm.Timing.F0PVFrontPorch +
MsaConfig->Vtm.Timing.VActive +
MsaConfig->Vtm.Timing.F0PVBackPorch);
MsaConfig->Vtm.FrameRate = MsaConfig->PixelClockHz /
(MsaConfig->Vtm.Timing.HTotal *
MsaConfig->Vtm.Timing.F0PVTotal);
MsaConfig->Vtm.VmId = XVID_VM_USE_EDID_PREFERRED;
/* Calculate the rest of the MSA values. */ /* Calculate the rest of the MSA values. */
XDptx_CfgMsaRecalculate(InstancePtr, Stream); XDptx_CfgMsaRecalculate(InstancePtr, Stream);
} }
@ -424,17 +457,20 @@ void XDptx_CfgMsaUseEdidPreferredTiming(XDptx *InstancePtr, u8 Stream, u8 *Edid)
* attributes, the rest of the attributes may be derived. The minimal required * attributes, the rest of the attributes may be derived. The minimal required
* main stream attributes (MSA) that must be contained in the MsaConfigCustom * main stream attributes (MSA) that must be contained in the MsaConfigCustom
* structure are: * structure are:
* - Pixel clock (in KHz) * - Pixel clock (in Hz)
* - Horizontal sync polarity * - Frame rate
* - Vertical sync polarity * - Horizontal active resolution
* - Horizontal sync pulse width
* - Vertical sync pulse width
* - Horizontal resolution
* - Vertical resolution
* - Vertical back porch
* - Vertical front porch
* - Horizontal back porch
* - Horizontal front porch * - Horizontal front porch
* - Horizontal sync pulse width
* - Horizontal back porch
* - Horizontal total
* - Horizontal sync polarity
* - Vertical active resolution
* - Vertical back porch
* - Vertical sync pulse width
* - Vertical front porch
* - Vertical total
* - Vertical sync polarity
* *
* @param InstancePtr is a pointer to the XDptx instance. * @param InstancePtr is a pointer to the XDptx instance.
* @param Stream is the stream number for which the MSA values will be * @param Stream is the stream number for which the MSA values will be
@ -465,27 +501,41 @@ void XDptx_CfgMsaUseCustom(XDptx *InstancePtr, u8 Stream,
MsaConfig = &InstancePtr->MsaConfig[Stream - 1]; MsaConfig = &InstancePtr->MsaConfig[Stream - 1];
/* Copy the MSA values from the user configuration structure. */ /* Copy the MSA values from the user configuration structure. */
MsaConfig->PixelClockHz = MsaConfigCustom->PixelClockHz;
MsaConfig->Vtm.VmId = MsaConfigCustom->Vtm.VmId;
MsaConfig->Vtm.FrameRate = MsaConfigCustom->Vtm.FrameRate;
MsaConfig->Vtm.Timing.HActive = MsaConfig->Vtm.Timing.HActive =
MsaConfigCustom->Vtm.Timing.HActive; MsaConfigCustom->Vtm.Timing.HActive;
MsaConfig->Vtm.Timing.VActive =
MsaConfigCustom->Vtm.Timing.VActive;
MsaConfig->Vtm.PixelClkKhz = MsaConfigCustom->Vtm.PixelClkKhz;
MsaConfig->Vtm.Timing.HSyncPolarity =
MsaConfigCustom->Vtm.Timing.HSyncPolarity;
MsaConfig->Vtm.Timing.VSyncPolarity =
MsaConfigCustom->Vtm.Timing.VSyncPolarity;
MsaConfig->Vtm.Timing.HFrontPorch = MsaConfig->Vtm.Timing.HFrontPorch =
MsaConfigCustom->Vtm.Timing.HFrontPorch; MsaConfigCustom->Vtm.Timing.HFrontPorch;
MsaConfig->Vtm.Timing.HSyncWidth = MsaConfig->Vtm.Timing.HSyncWidth =
MsaConfigCustom->Vtm.Timing.HSyncWidth; MsaConfigCustom->Vtm.Timing.HSyncWidth;
MsaConfig->Vtm.Timing.HBackPorch = MsaConfig->Vtm.Timing.HBackPorch =
MsaConfigCustom->Vtm.Timing.HBackPorch; MsaConfigCustom->Vtm.Timing.HBackPorch;
MsaConfig->Vtm.Timing.HTotal =
MsaConfigCustom->Vtm.Timing.HTotal;
MsaConfig->Vtm.Timing.HSyncPolarity =
MsaConfigCustom->Vtm.Timing.HSyncPolarity;
MsaConfig->Vtm.Timing.VActive =
MsaConfigCustom->Vtm.Timing.VActive;
MsaConfig->Vtm.Timing.F0PVFrontPorch = MsaConfig->Vtm.Timing.F0PVFrontPorch =
MsaConfigCustom->Vtm.Timing.F0PVFrontPorch; MsaConfigCustom->Vtm.Timing.F0PVFrontPorch;
MsaConfig->Vtm.Timing.F0PVSyncWidth = MsaConfig->Vtm.Timing.F0PVSyncWidth =
MsaConfigCustom->Vtm.Timing.F0PVSyncWidth; MsaConfigCustom->Vtm.Timing.F0PVSyncWidth;
MsaConfig->Vtm.Timing.F0PVBackPorch = MsaConfig->Vtm.Timing.F0PVBackPorch =
MsaConfigCustom->Vtm.Timing.F0PVBackPorch; MsaConfigCustom->Vtm.Timing.F0PVBackPorch;
MsaConfig->Vtm.Timing.F0PVTotal =
MsaConfigCustom->Vtm.Timing.F0PVTotal;
MsaConfig->Vtm.Timing.F1VFrontPorch =
MsaConfigCustom->Vtm.Timing.F1VFrontPorch;
MsaConfig->Vtm.Timing.F1VSyncWidth =
MsaConfigCustom->Vtm.Timing.F1VSyncWidth;
MsaConfig->Vtm.Timing.F1VBackPorch =
MsaConfigCustom->Vtm.Timing.F1VBackPorch;
MsaConfig->Vtm.Timing.F1VTotal =
MsaConfigCustom->Vtm.Timing.F1VTotal;
MsaConfig->Vtm.Timing.VSyncPolarity =
MsaConfigCustom->Vtm.Timing.VSyncPolarity;
if (Recalculate) { if (Recalculate) {
/* Calculate the rest of the MSA values. */ /* Calculate the rest of the MSA values. */
@ -738,7 +788,8 @@ void XDptx_SetMsaValues(XDptx *InstancePtr, u8 Stream)
XDptx_WriteReg(Config->BaseAddr, XDPTX_MAIN_STREAM_MISC1 + XDptx_WriteReg(Config->BaseAddr, XDPTX_MAIN_STREAM_MISC1 +
StreamOffset[Stream - 1], MsaConfig->Misc1); StreamOffset[Stream - 1], MsaConfig->Misc1);
XDptx_WriteReg(Config->BaseAddr, XDPTX_M_VID + XDptx_WriteReg(Config->BaseAddr, XDPTX_M_VID +
StreamOffset[Stream - 1], MsaConfig->Vtm.PixelClkKhz); StreamOffset[Stream - 1],
MsaConfig->PixelClockHz / 1000);
XDptx_WriteReg(Config->BaseAddr, XDPTX_N_VID + XDptx_WriteReg(Config->BaseAddr, XDPTX_N_VID +
StreamOffset[Stream - 1], MsaConfig->NVid); StreamOffset[Stream - 1], MsaConfig->NVid);
XDptx_WriteReg(Config->BaseAddr, XDPTX_USER_PIXEL_WIDTH + XDptx_WriteReg(Config->BaseAddr, XDPTX_USER_PIXEL_WIDTH +
@ -795,7 +846,7 @@ static void XDptx_CalculateTs(XDptx *InstancePtr, u8 Stream, u8 BitsPerPixel)
u32 TsInt; u32 TsInt;
u32 TsFrac; u32 TsFrac;
PeakPixelBw = ((double)MsaConfig->Vtm.PixelClkKhz / 1000) * PeakPixelBw = ((double)MsaConfig->PixelClockHz / 1000000) *
((double)BitsPerPixel / 8); ((double)BitsPerPixel / 8);
LinkBw = (LinkConfig->LaneCount * LinkConfig->LinkRate * 27); LinkBw = (LinkConfig->LaneCount * LinkConfig->LinkRate * 27);