|
|
@@ -860,23 +860,27 @@ static int cdns_mhdp_link_up(struct cdns_mhdp_device *mhdp)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
-u32 cdns_mhdp_get_bpp(u32 bpc, enum pixel_format pxlfmt)
|
|
|
+u32 cdns_mhdp_get_bpp(struct cdns_mhdp_display_fmt *fmt)
|
|
|
{
|
|
|
u32 bpp;
|
|
|
|
|
|
- switch (pxlfmt) {
|
|
|
- case PIXEL_FORMAT_RGB:
|
|
|
- case PIXEL_FORMAT_YCBCR_444:
|
|
|
- bpp = bpc * 3;
|
|
|
+ if (fmt->y_only)
|
|
|
+ return fmt->bpc;
|
|
|
+
|
|
|
+ switch (fmt->color_format) {
|
|
|
+ case DRM_COLOR_FORMAT_RGB444:
|
|
|
+ case DRM_COLOR_FORMAT_YCRCB444:
|
|
|
+ bpp = fmt->bpc * 3;
|
|
|
break;
|
|
|
- case PIXEL_FORMAT_YCBCR_422:
|
|
|
- bpp = bpc * 2;
|
|
|
+ case DRM_COLOR_FORMAT_YCRCB422:
|
|
|
+ bpp = fmt->bpc * 2;
|
|
|
break;
|
|
|
- case PIXEL_FORMAT_YCBCR_420:
|
|
|
- bpp = bpc * 3 / 2;
|
|
|
+ case DRM_COLOR_FORMAT_YCRCB420:
|
|
|
+ bpp = fmt->bpc * 3 / 2;
|
|
|
break;
|
|
|
default:
|
|
|
- bpp = bpc;
|
|
|
+ bpp = fmt->bpc * 3;
|
|
|
+ WARN_ON(1);
|
|
|
}
|
|
|
return bpp;
|
|
|
}
|
|
|
@@ -886,12 +890,12 @@ static int cdns_mhdp_sst_enable(struct drm_bridge *bridge)
|
|
|
struct cdns_mhdp_bridge *mhdp_bridge = to_mhdp_bridge(bridge);
|
|
|
struct cdns_mhdp_device *mhdp = mhdp_bridge->mhdp;
|
|
|
u32 rate, vs, vs_f, required_bandwidth, available_bandwidth;
|
|
|
- u32 bpp, bpc, tu_size = 30, line_thresh1, line_thresh2, line_thresh = 0;
|
|
|
+ u32 tu_size = 30, line_thresh1, line_thresh2, line_thresh = 0;
|
|
|
struct drm_display_mode *mode;
|
|
|
int pxlclock;
|
|
|
- enum pixel_format pxlfmt;
|
|
|
+ u32 bpp, bpc, pxlfmt;
|
|
|
|
|
|
- pxlfmt = cdns_mhdp_get_pxlfmt(mhdp->display_fmt.color_format);
|
|
|
+ pxlfmt = mhdp->display_fmt.color_format;
|
|
|
bpc = mhdp->display_fmt.bpc;
|
|
|
|
|
|
mode = &bridge->encoder->crtc->state->mode;
|
|
|
@@ -901,7 +905,7 @@ static int cdns_mhdp_sst_enable(struct drm_bridge *bridge)
|
|
|
|
|
|
rate = mhdp->link.rate / 1000;
|
|
|
|
|
|
- bpp = cdns_mhdp_get_bpp(bpc, pxlfmt);
|
|
|
+ bpp = cdns_mhdp_get_bpp(&mhdp->display_fmt);
|
|
|
|
|
|
/* find optimal tu_size */
|
|
|
required_bandwidth = pxlclock * bpp / 8;
|
|
|
@@ -922,7 +926,6 @@ static int cdns_mhdp_sst_enable(struct drm_bridge *bridge)
|
|
|
if (vs > 64)
|
|
|
return -EINVAL;
|
|
|
|
|
|
-
|
|
|
cdns_mhdp_reg_write(mhdp, CDNS_DP_FRAMER_TU,
|
|
|
CDNS_DP_FRAMER_TU_VS(vs) |
|
|
|
CDNS_DP_FRAMER_TU_SIZE(tu_size) |
|
|
|
@@ -946,59 +949,47 @@ static int cdns_mhdp_sst_enable(struct drm_bridge *bridge)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
-enum pixel_format cdns_mhdp_get_pxlfmt(u32 color_formats)
|
|
|
-{
|
|
|
- /* FIXME: what about Y_ONLY? how is it handled in the kernel? */
|
|
|
- if (color_formats & DRM_COLOR_FORMAT_YCRCB444)
|
|
|
- return PIXEL_FORMAT_YCBCR_444;
|
|
|
- if (color_formats & DRM_COLOR_FORMAT_YCRCB422)
|
|
|
- return PIXEL_FORMAT_YCBCR_422;
|
|
|
- if (color_formats & DRM_COLOR_FORMAT_YCRCB420)
|
|
|
- return PIXEL_FORMAT_YCBCR_420;
|
|
|
- return PIXEL_FORMAT_RGB;
|
|
|
-}
|
|
|
-
|
|
|
void cdns_mhdp_configure_video(struct drm_bridge *bridge)
|
|
|
{
|
|
|
struct cdns_mhdp_bridge *mhdp_bridge = to_mhdp_bridge(bridge);
|
|
|
struct cdns_mhdp_device *mhdp = mhdp_bridge->mhdp;
|
|
|
- unsigned int bpp, bpc, dp_framer_sp = 0, msa_horizontal_1,
|
|
|
+ unsigned int dp_framer_sp = 0, msa_horizontal_1,
|
|
|
msa_vertical_1, bnd_hsync2vsync, hsync2vsync_pol_ctrl,
|
|
|
misc0 = 0, misc1 = 0, pxl_repr,
|
|
|
front_porch, back_porch, msa_h0, msa_v0, hsync, vsync,
|
|
|
dp_vertical_1;
|
|
|
struct drm_display_mode *mode;
|
|
|
- enum pixel_format pxlfmt;
|
|
|
+ u32 bpp, bpc, pxlfmt;
|
|
|
u32 tmp;
|
|
|
u8 stream_id = mhdp_bridge->stream_id;
|
|
|
|
|
|
mode = &bridge->encoder->crtc->state->mode;
|
|
|
|
|
|
- pxlfmt = cdns_mhdp_get_pxlfmt(mhdp->display_fmt.color_format);
|
|
|
+ pxlfmt = mhdp->display_fmt.color_format;
|
|
|
bpc = mhdp->display_fmt.bpc;
|
|
|
|
|
|
/* if YCBCR supported and stream not SD, use ITU709 */
|
|
|
/* FIXME: handle ITU version with YCBCR420 when supported */
|
|
|
- if ((pxlfmt == PIXEL_FORMAT_YCBCR_444 ||
|
|
|
- pxlfmt == PIXEL_FORMAT_YCBCR_422) && mode->crtc_vdisplay >= 720)
|
|
|
+ if ((pxlfmt == DRM_COLOR_FORMAT_YCRCB444 ||
|
|
|
+ pxlfmt == DRM_COLOR_FORMAT_YCRCB422) && mode->crtc_vdisplay >= 720)
|
|
|
misc0 = DP_YCBCR_COEFFICIENTS_ITU709;
|
|
|
|
|
|
- bpp = cdns_mhdp_get_bpp(bpc, pxlfmt);
|
|
|
+ bpp = cdns_mhdp_get_bpp(&mhdp->display_fmt);
|
|
|
|
|
|
switch (pxlfmt) {
|
|
|
- case PIXEL_FORMAT_RGB:
|
|
|
+ case DRM_COLOR_FORMAT_RGB444:
|
|
|
pxl_repr = CDNS_DP_FRAMER_RGB << CDNS_DP_FRAMER_PXL_FORMAT;
|
|
|
misc0 |= DP_COLOR_FORMAT_RGB;
|
|
|
break;
|
|
|
- case PIXEL_FORMAT_YCBCR_444:
|
|
|
+ case DRM_COLOR_FORMAT_YCRCB444:
|
|
|
pxl_repr = CDNS_DP_FRAMER_YCBCR444 << CDNS_DP_FRAMER_PXL_FORMAT;
|
|
|
misc0 |= DP_COLOR_FORMAT_YCbCr444 | DP_TEST_DYNAMIC_RANGE_CEA;
|
|
|
break;
|
|
|
- case PIXEL_FORMAT_YCBCR_422:
|
|
|
+ case DRM_COLOR_FORMAT_YCRCB422:
|
|
|
pxl_repr = CDNS_DP_FRAMER_YCBCR422 << CDNS_DP_FRAMER_PXL_FORMAT;
|
|
|
misc0 |= DP_COLOR_FORMAT_YCbCr422 | DP_TEST_DYNAMIC_RANGE_CEA;
|
|
|
break;
|
|
|
- case PIXEL_FORMAT_YCBCR_420:
|
|
|
+ case DRM_COLOR_FORMAT_YCRCB420:
|
|
|
pxl_repr = CDNS_DP_FRAMER_YCBCR420 << CDNS_DP_FRAMER_PXL_FORMAT;
|
|
|
break;
|
|
|
default:
|
|
|
@@ -1093,11 +1084,11 @@ void cdns_mhdp_configure_video(struct drm_bridge *bridge)
|
|
|
if ((mode->flags & DRM_MODE_FLAG_INTERLACE) &&
|
|
|
mode->crtc_vtotal % 2 == 0)
|
|
|
misc1 = DP_TEST_INTERLACED;
|
|
|
- if (pxlfmt == PIXEL_FORMAT_Y_ONLY)
|
|
|
+ if (mhdp->display_fmt.y_only)
|
|
|
misc1 |= CDNS_DP_TEST_COLOR_FORMAT_RAW_Y_ONLY;
|
|
|
/* FIXME: use VSC SDP for Y420 */
|
|
|
/* FIXME: (CDNS) no code for Y420 in bare metal test */
|
|
|
- if (pxlfmt == PIXEL_FORMAT_YCBCR_420)
|
|
|
+ if (pxlfmt == DRM_COLOR_FORMAT_YCRCB420)
|
|
|
misc1 = CDNS_DP_TEST_VSC_SDP;
|
|
|
|
|
|
cdns_mhdp_reg_write(mhdp, CDNS_DP_MSA_MISC(stream_id),
|
|
|
@@ -1386,6 +1377,7 @@ static int mhdp_probe(struct platform_device *pdev)
|
|
|
mhdp->host.enhanced = true;
|
|
|
|
|
|
/* The only currently supported format */
|
|
|
+ mhdp->display_fmt.y_only = false;
|
|
|
mhdp->display_fmt.color_format = DRM_COLOR_FORMAT_RGB444;
|
|
|
mhdp->display_fmt.bpc = 8;
|
|
|
|