msm: mdss: Enable UBWC output format for writeback interface

Enable UBWC format for writeback output buffers in applicable
target devices.

CRs-Fixed: 979566
Change-Id: Ibbfaf9f1c314f44d76f4739ed64562861b26c4be
Signed-off-by: Jeykumar Sankaran <jsanka@codeaurora.org>
[dkeitel@codeaurora.org: fixed minor whitespace conflicts.]
Signed-off-by: David Keitel <dkeitel@codeaurora.org>
This commit is contained in:
Jeykumar Sankaran 2016-01-11 11:56:53 -08:00 committed by David Keitel
parent 6833d26cf6
commit c5c9cb7764
5 changed files with 23 additions and 13 deletions

View file

@ -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,
};

View file

@ -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))

View file

@ -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,

View file

@ -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);

View file

@ -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;
}