From 52d8b3d97aacb7413b288bdc2d8124041f0dce48 Mon Sep 17 00:00:00 2001 From: Andrei-Liviu Simion Date: Fri, 23 Jan 2015 00:07:40 -0800 Subject: [PATCH] dptx: Update to use common video driver. Signed-off-by: Andrei-Liviu Simion --- XilinxProcessorIPLib/drivers/dptx/src/xdptx.h | 5 +- .../drivers/dptx/src/xdptx_spm.c | 102 ++++++++++++------ 2 files changed, 69 insertions(+), 38 deletions(-) diff --git a/XilinxProcessorIPLib/drivers/dptx/src/xdptx.h b/XilinxProcessorIPLib/drivers/dptx/src/xdptx.h index a1b4e26a..8299bead 100644 --- a/XilinxProcessorIPLib/drivers/dptx/src/xdptx.h +++ b/XilinxProcessorIPLib/drivers/dptx/src/xdptx.h @@ -324,11 +324,8 @@ typedef struct { */ typedef struct { XVidC_VideoTimingMode Vtm; /**< The video timing. */ - u32 PixelClkHz; /**< The pixel clock of the stream (in + u32 PixelClockHz; /**< The pixel clock of the stream (in Hz). */ - u32 HClkTotal; /**< Horizontal total time (in - pixels). */ - u32 VClkTotal; /**< Vertical total time (in pixels). */ u32 HStart; /**< Horizontal blank start (in pixels). */ u32 VStart; /**< Vertical blank start (in lines). */ diff --git a/XilinxProcessorIPLib/drivers/dptx/src/xdptx_spm.c b/XilinxProcessorIPLib/drivers/dptx/src/xdptx_spm.c index c970cbbc..884a5f0d 100644 --- a/XilinxProcessorIPLib/drivers/dptx/src/xdptx_spm.c +++ b/XilinxProcessorIPLib/drivers/dptx/src/xdptx_spm.c @@ -144,11 +144,11 @@ void XDptx_CfgMsaRecalculate(XDptx *InstancePtr, u8 Stream) /* Set the user pixel width to handle clocks that exceed the * capabilities of the DisplayPort TX core. */ if (MsaConfig->OverrideUserPixelWidth == 0) { - if ((MsaConfig->PixelClkHz > 300000000) && + if ((MsaConfig->PixelClockHz > 300000000) && (LinkConfig->LaneCount == XDPTX_LANE_COUNT_SET_4)) { MsaConfig->UserPixelWidth = 4; } - else if ((MsaConfig->PixelClkHz > 75000000) && + else if ((MsaConfig->PixelClockHz > 75000000) && (LinkConfig->LaneCount != XDPTX_LANE_COUNT_SET_1)) { MsaConfig->UserPixelWidth = 2; } @@ -163,14 +163,6 @@ void XDptx_CfgMsaRecalculate(XDptx *InstancePtr, u8 Stream) MsaConfig->Vtm.Timing.HBackPorch; MsaConfig->VStart = MsaConfig->Vtm.Timing.F0PVSyncWidth + MsaConfig->Vtm.Timing.F0PVBackPorch; - MsaConfig->HClkTotal = (MsaConfig->Vtm.Timing.HSyncWidth + - MsaConfig->Vtm.Timing.HBackPorch + - MsaConfig->Vtm.Timing.HFrontPorch + - MsaConfig->Vtm.Timing.HActive); - MsaConfig->VClkTotal = (MsaConfig->Vtm.Timing.F0PVSyncWidth + - MsaConfig->Vtm.Timing.F0PVBackPorch + - MsaConfig->Vtm.Timing.F0PVFrontPorch + - MsaConfig->Vtm.Timing.VActive); /* Miscellaneous attributes. */ if (MsaConfig->BitsPerColor == 6) { @@ -238,7 +230,7 @@ void XDptx_CfgMsaRecalculate(XDptx *InstancePtr, u8 Stream) /* Calculate the average number of bytes per transfer unit. * Note: Both the integer and the fractional part is stored in * AvgBytesPerTU. */ - VideoBw = (MsaConfig->PixelClkHz * BitsPerPixel) / 8000; + VideoBw = ((MsaConfig->PixelClockHz / 1000) * BitsPerPixel) / 8; LinkBw = (LinkConfig->LaneCount * LinkConfig->LinkRate * 27); MsaConfig->AvgBytesPerTU = (VideoBw * MsaConfig->TransferUnitSize) / LinkBw; @@ -292,27 +284,39 @@ void XDptx_CfgMsaUseStandardVideoMode(XDptx *InstancePtr, u8 Stream, /* Configure the MSA values from the display monitor DMT table. */ MsaConfig->Vtm.Timing.HActive = XVidC_VideoTimingModes[VideoMode].Timing.HActive; - MsaConfig->Vtm.Timing.VActive = - XVidC_VideoTimingModes[VideoMode].Timing.VActive; - MsaConfig->Vtm.Timing.HSyncPolarity = - XVidC_VideoTimingModes[VideoMode].Timing.HSyncPolarity; - MsaConfig->Vtm.Timing.VSyncPolarity = - XVidC_VideoTimingModes[VideoMode].Timing.VSyncPolarity; MsaConfig->Vtm.Timing.HFrontPorch = XVidC_VideoTimingModes[VideoMode].Timing.HFrontPorch; MsaConfig->Vtm.Timing.HSyncWidth = XVidC_VideoTimingModes[VideoMode].Timing.HSyncWidth; MsaConfig->Vtm.Timing.HBackPorch = XVidC_VideoTimingModes[VideoMode].Timing.HBackPorch; + MsaConfig->Vtm.Timing.HTotal = + XVidC_VideoTimingModes[VideoMode].Timing.HTotal; + MsaConfig->Vtm.Timing.HSyncPolarity = + XVidC_VideoTimingModes[VideoMode].Timing.HSyncPolarity; + MsaConfig->Vtm.Timing.VActive = + XVidC_VideoTimingModes[VideoMode].Timing.VActive; MsaConfig->Vtm.Timing.F0PVFrontPorch = XVidC_VideoTimingModes[VideoMode].Timing.F0PVFrontPorch; MsaConfig->Vtm.Timing.F0PVSyncWidth = XVidC_VideoTimingModes[VideoMode].Timing.F0PVSyncWidth; MsaConfig->Vtm.Timing.F0PVBackPorch = XVidC_VideoTimingModes[VideoMode].Timing.F0PVBackPorch; + MsaConfig->Vtm.Timing.F0PVTotal = + XVidC_VideoTimingModes[VideoMode].Timing.F0PVTotal; + MsaConfig->Vtm.Timing.F1VFrontPorch = + XVidC_VideoTimingModes[VideoMode].Timing.F1VFrontPorch; + MsaConfig->Vtm.Timing.F1VSyncWidth = + XVidC_VideoTimingModes[VideoMode].Timing.F1VSyncWidth; + MsaConfig->Vtm.Timing.F1VBackPorch = + XVidC_VideoTimingModes[VideoMode].Timing.F1VBackPorch; + MsaConfig->Vtm.Timing.F1VTotal = + XVidC_VideoTimingModes[VideoMode].Timing.F1VTotal; + MsaConfig->Vtm.Timing.VSyncPolarity = + XVidC_VideoTimingModes[VideoMode].Timing.VSyncPolarity; /* Calculate the pixel clock frequency. */ - MsaConfig->PixelClkHz = + MsaConfig->PixelClockHz = XVidC_GetPixelClockHzByVmId(MsaConfig->Vtm.VmId); /* Calculate the rest of the MSA values. */ @@ -378,8 +382,8 @@ void XDptx_CfgMsaUseEdidPreferredTiming(XDptx *InstancePtr, u8 Stream, u8 *Edid) XDPTX_EDID_DTD_XRES_XBLANK_U4_XRES_SHIFT) << 8) | Ptm[XDPTX_EDID_DTD_VRES_LSB]; - MsaConfig->PixelClkHz = ((Ptm[XDPTX_EDID_DTD_PIXEL_CLK_KHZ_MSB] << - 8) | Ptm[XDPTX_EDID_DTD_PIXEL_CLK_KHZ_LSB]) * 10000; + MsaConfig->PixelClockHz = (((Ptm[XDPTX_EDID_DTD_PIXEL_CLK_KHZ_MSB] << + 8) | Ptm[XDPTX_EDID_DTD_PIXEL_CLK_KHZ_LSB]) * 10) * 1000; MsaConfig->Vtm.Timing.HFrontPorch = (((Ptm[XDPTX_EDID_DTD_XFPORCH_XSPW_U2] & @@ -415,6 +419,22 @@ void XDptx_CfgMsaUseEdidPreferredTiming(XDptx *InstancePtr, u8 Stream, u8 *Edid) (MsaConfig->Vtm.Timing.F0PVFrontPorch + 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 = XVIDC_VM_USE_EDID_PREFERRED; + /* Calculate the rest of the MSA values. */ XDptx_CfgMsaRecalculate(InstancePtr, Stream); } @@ -426,7 +446,7 @@ void XDptx_CfgMsaUseEdidPreferredTiming(XDptx *InstancePtr, u8 Stream, u8 *Edid) * attributes, the rest of the attributes may be derived. The minimal required * main stream attributes (MSA) that must be contained in the MsaConfigCustom * structure are: - * - Pixel clock (in KHz) + * - Pixel clock (in Hz) * - Horizontal sync polarity * - Vertical sync polarity * - Horizontal sync pulse width @@ -467,27 +487,41 @@ void XDptx_CfgMsaUseCustom(XDptx *InstancePtr, u8 Stream, MsaConfig = &InstancePtr->MsaConfig[Stream - 1]; /* 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 = MsaConfigCustom->Vtm.Timing.HActive; - MsaConfig->Vtm.Timing.VActive = - MsaConfigCustom->Vtm.Timing.VActive; - MsaConfig->PixelClkHz = MsaConfigCustom->PixelClkHz; - MsaConfig->Vtm.Timing.HSyncPolarity = - MsaConfigCustom->Vtm.Timing.HSyncPolarity; - MsaConfig->Vtm.Timing.VSyncPolarity = - MsaConfigCustom->Vtm.Timing.VSyncPolarity; MsaConfig->Vtm.Timing.HFrontPorch = MsaConfigCustom->Vtm.Timing.HFrontPorch; MsaConfig->Vtm.Timing.HSyncWidth = MsaConfigCustom->Vtm.Timing.HSyncWidth; MsaConfig->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 = MsaConfigCustom->Vtm.Timing.F0PVFrontPorch; MsaConfig->Vtm.Timing.F0PVSyncWidth = MsaConfigCustom->Vtm.Timing.F0PVSyncWidth; MsaConfig->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) { /* Calculate the rest of the MSA values. */ @@ -500,8 +534,6 @@ void XDptx_CfgMsaUseCustom(XDptx *InstancePtr, u8 Stream, MsaConfig->NVid = MsaConfigCustom->NVid; MsaConfig->HStart = MsaConfigCustom->HStart; MsaConfig->VStart = MsaConfigCustom->VStart; - MsaConfig->HClkTotal = MsaConfigCustom->HClkTotal; - MsaConfig->VClkTotal = MsaConfigCustom->VClkTotal; MsaConfig->Misc0 = MsaConfigCustom->Misc0; MsaConfig->Misc1 = MsaConfigCustom->Misc1; MsaConfig->DataPerLane = MsaConfigCustom->DataPerLane; @@ -713,9 +745,10 @@ void XDptx_SetMsaValues(XDptx *InstancePtr, u8 Stream) /* Set the main stream attributes to the associated DisplayPort TX core * registers. */ XDptx_WriteReg(Config->BaseAddr, XDPTX_MAIN_STREAM_HTOTAL + - StreamOffset[Stream - 1], MsaConfig->HClkTotal); + StreamOffset[Stream - 1], MsaConfig->Vtm.Timing.HTotal); XDptx_WriteReg(Config->BaseAddr, XDPTX_MAIN_STREAM_VTOTAL + - StreamOffset[Stream - 1], MsaConfig->VClkTotal); + StreamOffset[Stream - 1], + MsaConfig->Vtm.Timing.F0PVTotal); XDptx_WriteReg(Config->BaseAddr, XDPTX_MAIN_STREAM_POLARITY + StreamOffset[Stream - 1], MsaConfig->Vtm.Timing.HSyncPolarity | @@ -740,7 +773,8 @@ void XDptx_SetMsaValues(XDptx *InstancePtr, u8 Stream) XDptx_WriteReg(Config->BaseAddr, XDPTX_MAIN_STREAM_MISC1 + StreamOffset[Stream - 1], MsaConfig->Misc1); XDptx_WriteReg(Config->BaseAddr, XDPTX_M_VID + - StreamOffset[Stream - 1], MsaConfig->PixelClkHz / 1000); + StreamOffset[Stream - 1], + MsaConfig->PixelClockHz / 1000); XDptx_WriteReg(Config->BaseAddr, XDPTX_N_VID + StreamOffset[Stream - 1], MsaConfig->NVid); XDptx_WriteReg(Config->BaseAddr, XDPTX_USER_PIXEL_WIDTH + @@ -797,7 +831,7 @@ static void XDptx_CalculateTs(XDptx *InstancePtr, u8 Stream, u8 BitsPerPixel) u32 TsInt; u32 TsFrac; - PeakPixelBw = ((double)MsaConfig->PixelClkHz) * + PeakPixelBw = ((double)MsaConfig->PixelClockHz / 1000000) * ((double)BitsPerPixel / 8); LinkBw = (LinkConfig->LaneCount * LinkConfig->LinkRate * 27);