diff --git a/drivers/video/fbdev/msm/mdss.h b/drivers/video/fbdev/msm/mdss.h index 4b3eeca1bb8e..83fb479fe1c5 100644 --- a/drivers/video/fbdev/msm/mdss.h +++ b/drivers/video/fbdev/msm/mdss.h @@ -158,6 +158,7 @@ enum mdss_hw_quirk { MDSS_QUIRK_DSC_2SLICE_PU_THRPUT, MDSS_QUIRK_DMA_BI_DIR, MDSS_QUIRK_MIN_BUS_VOTE, + MDSS_QUIRK_FMT_PACK_PATTERN, MDSS_QUIRK_MAX, }; diff --git a/drivers/video/fbdev/msm/mdss_mdp.c b/drivers/video/fbdev/msm/mdss_mdp.c index 36c35d00ab7d..55c98e75755f 100644 --- a/drivers/video/fbdev/msm/mdss_mdp.c +++ b/drivers/video/fbdev/msm/mdss_mdp.c @@ -1897,6 +1897,8 @@ ssize_t mdss_mdp_show_capabilities(struct device *dev, SPRINT(" bwc"); if (mdata->has_ubwc) SPRINT(" ubwc"); + if (mdata->has_wb_ubwc) + SPRINT(" wb_ubwc"); if (mdata->has_decimation) SPRINT(" decimation"); if (mdata->highest_bank_bit && !mdss_mdp_is_ubwc_supported(mdata)) diff --git a/drivers/video/fbdev/msm/mdss_mdp_formats.h b/drivers/video/fbdev/msm/mdss_mdp_formats.h index 9191ffb367c1..1865720ead06 100644 --- a/drivers/video/fbdev/msm/mdss_mdp_formats.h +++ b/drivers/video/fbdev/msm/mdss_mdp_formats.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2012-2015, The Linux Foundation. All rights reserved. +/* Copyright (c) 2012-2016, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -218,7 +218,8 @@ enum { static struct mdss_mdp_format_params_ubwc mdss_mdp_format_ubwc_map[] = { { .mdp_format = FMT_RGB_565(MDP_RGB_565_UBWC, - MDSS_MDP_FETCH_UBWC, VALID_ROT_WB_FORMAT, + MDSS_MDP_FETCH_UBWC, + VALID_ROT_WB_FORMAT | VALID_MDP_WB_INTF_FORMAT, C2_R_Cr, C0_G_Y, C1_B_Cb), .micro = { .tile_height = 4, @@ -227,7 +228,8 @@ static struct mdss_mdp_format_params_ubwc mdss_mdp_format_ubwc_map[] = { }, { .mdp_format = FMT_RGB_8888(MDP_RGBA_8888_UBWC, - MDSS_MDP_FETCH_UBWC, VALID_ROT_WB_FORMAT, 1, + MDSS_MDP_FETCH_UBWC, + VALID_ROT_WB_FORMAT | VALID_MDP_WB_INTF_FORMAT, 1, C2_R_Cr, C0_G_Y, C1_B_Cb, C3_ALPHA), .micro = { .tile_height = 4, @@ -236,7 +238,8 @@ static struct mdss_mdp_format_params_ubwc mdss_mdp_format_ubwc_map[] = { }, { .mdp_format = FMT_RGB_8888(MDP_RGBX_8888_UBWC, - MDSS_MDP_FETCH_UBWC, VALID_ROT_WB_FORMAT, 0, + MDSS_MDP_FETCH_UBWC, + VALID_ROT_WB_FORMAT | VALID_MDP_WB_INTF_FORMAT, 0, C2_R_Cr, C0_G_Y, C1_B_Cb, C3_ALPHA), .micro = { .tile_height = 4, @@ -246,7 +249,8 @@ static struct mdss_mdp_format_params_ubwc mdss_mdp_format_ubwc_map[] = { { .mdp_format = FMT_YUV_PSEUDO(MDP_Y_CBCR_H2V2_UBWC, MDSS_MDP_FETCH_UBWC, MDSS_MDP_CHROMA_420, - VALID_ROT_WB_FORMAT, C1_B_Cb, C2_R_Cr), + VALID_ROT_WB_FORMAT | VALID_MDP_WB_INTF_FORMAT, + C1_B_Cb, C2_R_Cr), .micro = { .tile_height = 8, .tile_width = 32, diff --git a/drivers/video/fbdev/msm/mdss_mdp_intf_writeback.c b/drivers/video/fbdev/msm/mdss_mdp_intf_writeback.c index c61771a3ad1c..4b7a76035586 100644 --- a/drivers/video/fbdev/msm/mdss_mdp_intf_writeback.c +++ b/drivers/video/fbdev/msm/mdss_mdp_intf_writeback.c @@ -299,15 +299,14 @@ static int mdss_mdp_writeback_format_setup(struct mdss_mdp_writeback_ctx *ctx, if (fmt->is_yuv && test_bit(MDSS_CAPS_YUV_CONFIG, mdata->mdss_caps_map)) dst_format |= BIT(15); - if (mdata->mdp_rev >= MDSS_MDP_HW_REV_102 && - mdata->mdp_rev < MDSS_MDP_HW_REV_200) { + if (mdss_has_quirk(mdata, MDSS_QUIRK_FMT_PACK_PATTERN)) { pattern = (fmt->element[3] << 24) | - (fmt->element[2] << 16) | + (fmt->element[2] << 15) | (fmt->element[1] << 8) | (fmt->element[0] << 0); } else { pattern = (fmt->element[3] << 24) | - (fmt->element[2] << 15) | + (fmt->element[2] << 16) | (fmt->element[1] << 8) | (fmt->element[0] << 0); } @@ -326,8 +325,7 @@ static int mdss_mdp_writeback_format_setup(struct mdss_mdp_writeback_ctx *ctx, outsize = (ctx->dst_rect.h << 16) | ctx->dst_rect.w; if (mdss_mdp_is_ubwc_format(fmt)) { - if (!ctl->cdm) - opmode |= BIT(0); + opmode |= BIT(0); dst_format |= BIT(31); if (mdata->highest_bank_bit) write_config |= (mdata->highest_bank_bit << 8); @@ -343,8 +341,7 @@ static int mdss_mdp_writeback_format_setup(struct mdss_mdp_writeback_ctx *ctx, } mdp_wb_write(ctx, MDSS_MDP_REG_WB_ALPHA_X_VALUE, 0xFF); mdp_wb_write(ctx, MDSS_MDP_REG_WB_DST_FORMAT, dst_format); - if (!ctl->cdm) - mdp_wb_write(ctx, MDSS_MDP_REG_WB_DST_OP_MODE, opmode); + mdp_wb_write(ctx, MDSS_MDP_REG_WB_DST_OP_MODE, opmode); mdp_wb_write(ctx, MDSS_MDP_REG_WB_DST_PACK_PATTERN, pattern); mdp_wb_write(ctx, MDSS_MDP_REG_WB_DST_YSTRIDE0, ystride0); mdp_wb_write(ctx, MDSS_MDP_REG_WB_DST_YSTRIDE1, ystride1); diff --git a/drivers/video/fbdev/msm/mdss_mdp_wfd.c b/drivers/video/fbdev/msm/mdss_mdp_wfd.c index 63534f0afde9..25b2fdcfc1b1 100644 --- a/drivers/video/fbdev/msm/mdss_mdp_wfd.c +++ b/drivers/video/fbdev/msm/mdss_mdp_wfd.c @@ -345,6 +345,12 @@ static int mdss_mdp_wfd_validate_out_configuration(struct mdss_mdp_wfd *wfd, layer->buffer.format); return -EINVAL; } + + if (!ctl->mdata->has_wb_ubwc && mdss_mdp_is_ubwc_format(fmt)) { + pr_err("wb=%d does not support UBWC fmt:%d\n", wb_idx, + layer->buffer.format); + return -EINVAL; + } } return 0; }