disp: msm: sde: update wb line width for linear format
This change adds support for enabling WB maximum linewidth based on color format is linear or UWBC. Change-Id: Icc71eb14b3156e06036a4a82029d9d7a5c89e909 Signed-off-by: Prabhanjan Kandula <pkandula@codeaurora.org>
这个提交包含在:

提交者
Gerrit - the friendly Code Review server

父节点
c5fb2101de
当前提交
0d6151b303
@@ -24,6 +24,10 @@
|
|||||||
|
|
||||||
#define TO_S15D16(_x_) ((_x_) << 7)
|
#define TO_S15D16(_x_) ((_x_) << 7)
|
||||||
|
|
||||||
|
#define SDE_WB_MAX_LINEWIDTH(fmt, wb_cfg) \
|
||||||
|
(SDE_FORMAT_IS_UBWC(fmt) ? wb_cfg->sblk->maxlinewidth : \
|
||||||
|
wb_cfg->sblk->maxlinewidth_linear)
|
||||||
|
|
||||||
static const u32 cwb_irq_tbl[PINGPONG_MAX] = {SDE_NONE, INTR_IDX_PP1_OVFL,
|
static const u32 cwb_irq_tbl[PINGPONG_MAX] = {SDE_NONE, INTR_IDX_PP1_OVFL,
|
||||||
INTR_IDX_PP2_OVFL, INTR_IDX_PP3_OVFL, INTR_IDX_PP4_OVFL,
|
INTR_IDX_PP2_OVFL, INTR_IDX_PP3_OVFL, INTR_IDX_PP4_OVFL,
|
||||||
INTR_IDX_PP5_OVFL, SDE_NONE, SDE_NONE};
|
INTR_IDX_PP5_OVFL, SDE_NONE, SDE_NONE};
|
||||||
@@ -766,9 +770,10 @@ static int sde_encoder_phys_wb_atomic_check(
|
|||||||
SDE_ERROR("invalid roi y=%d, h=%d, fb h=%d\n",
|
SDE_ERROR("invalid roi y=%d, h=%d, fb h=%d\n",
|
||||||
wb_roi.y, wb_roi.h, fb->height);
|
wb_roi.y, wb_roi.h, fb->height);
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
} else if (wb_roi.w > wb_cfg->sblk->maxlinewidth) {
|
} else if (wb_roi.w > SDE_WB_MAX_LINEWIDTH(fmt, wb_cfg)) {
|
||||||
SDE_ERROR("invalid roi w=%d, maxlinewidth=%u\n",
|
SDE_ERROR("invalid roi ubwc=%d w=%d, maxlinewidth=%u\n",
|
||||||
wb_roi.w, wb_cfg->sblk->maxlinewidth);
|
SDE_FORMAT_IS_UBWC(fmt), wb_roi.w,
|
||||||
|
SDE_WB_MAX_LINEWIDTH(fmt, wb_cfg));
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@@ -784,9 +789,10 @@ static int sde_encoder_phys_wb_atomic_check(
|
|||||||
SDE_ERROR("invalid fb h=%d, mode h=%d\n", fb->height,
|
SDE_ERROR("invalid fb h=%d, mode h=%d\n", fb->height,
|
||||||
mode->vdisplay);
|
mode->vdisplay);
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
} else if (fb->width > wb_cfg->sblk->maxlinewidth) {
|
} else if (fb->width > SDE_WB_MAX_LINEWIDTH(fmt, wb_cfg)) {
|
||||||
SDE_ERROR("invalid fb w=%d, maxlinewidth=%u\n",
|
SDE_ERROR("invalid fb ubwc=%d w=%d, maxlinewidth=%u\n",
|
||||||
fb->width, wb_cfg->sblk->maxlinewidth);
|
SDE_FORMAT_IS_UBWC(fmt), fb->width,
|
||||||
|
SDE_WB_MAX_LINEWIDTH(fmt, wb_cfg));
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -182,6 +182,7 @@ enum sde_prop {
|
|||||||
MIXER_LINEWIDTH,
|
MIXER_LINEWIDTH,
|
||||||
MIXER_BLEND,
|
MIXER_BLEND,
|
||||||
WB_LINEWIDTH,
|
WB_LINEWIDTH,
|
||||||
|
WB_LINEWIDTH_LINEAR,
|
||||||
BANK_BIT,
|
BANK_BIT,
|
||||||
UBWC_VERSION,
|
UBWC_VERSION,
|
||||||
UBWC_STATIC,
|
UBWC_STATIC,
|
||||||
@@ -542,6 +543,8 @@ static struct sde_prop_type sde_prop[] = {
|
|||||||
{MIXER_LINEWIDTH, "qcom,sde-mixer-linewidth", false, PROP_TYPE_U32},
|
{MIXER_LINEWIDTH, "qcom,sde-mixer-linewidth", false, PROP_TYPE_U32},
|
||||||
{MIXER_BLEND, "qcom,sde-mixer-blendstages", false, PROP_TYPE_U32},
|
{MIXER_BLEND, "qcom,sde-mixer-blendstages", false, PROP_TYPE_U32},
|
||||||
{WB_LINEWIDTH, "qcom,sde-wb-linewidth", false, PROP_TYPE_U32},
|
{WB_LINEWIDTH, "qcom,sde-wb-linewidth", false, PROP_TYPE_U32},
|
||||||
|
{WB_LINEWIDTH_LINEAR, "qcom,sde-wb-linewidth-linear",
|
||||||
|
false, PROP_TYPE_U32},
|
||||||
{BANK_BIT, "qcom,sde-highest-bank-bit", false, PROP_TYPE_U32},
|
{BANK_BIT, "qcom,sde-highest-bank-bit", false, PROP_TYPE_U32},
|
||||||
{UBWC_VERSION, "qcom,sde-ubwc-version", false, PROP_TYPE_U32},
|
{UBWC_VERSION, "qcom,sde-ubwc-version", false, PROP_TYPE_U32},
|
||||||
{UBWC_STATIC, "qcom,sde-ubwc-static", false, PROP_TYPE_U32},
|
{UBWC_STATIC, "qcom,sde-ubwc-static", false, PROP_TYPE_U32},
|
||||||
@@ -2298,6 +2301,7 @@ static int sde_wb_parse_dt(struct device_node *np, struct sde_mdss_cfg *sde_cfg)
|
|||||||
if (!prop_exists[WB_LEN])
|
if (!prop_exists[WB_LEN])
|
||||||
wb->len = DEFAULT_SDE_HW_BLOCK_LEN;
|
wb->len = DEFAULT_SDE_HW_BLOCK_LEN;
|
||||||
sblk->maxlinewidth = sde_cfg->max_wb_linewidth;
|
sblk->maxlinewidth = sde_cfg->max_wb_linewidth;
|
||||||
|
sblk->maxlinewidth_linear = sde_cfg->max_wb_linewidth_linear;
|
||||||
|
|
||||||
if (wb->id >= LINE_MODE_WB_OFFSET)
|
if (wb->id >= LINE_MODE_WB_OFFSET)
|
||||||
set_bit(SDE_WB_LINE_MODE, &wb->features);
|
set_bit(SDE_WB_LINE_MODE, &wb->features);
|
||||||
@@ -3654,6 +3658,11 @@ static void _sde_top_parse_dt_helper(struct sde_mdss_cfg *cfg,
|
|||||||
PROP_VALUE_ACCESS(props->values, WB_LINEWIDTH, 0) :
|
PROP_VALUE_ACCESS(props->values, WB_LINEWIDTH, 0) :
|
||||||
DEFAULT_SDE_LINE_WIDTH;
|
DEFAULT_SDE_LINE_WIDTH;
|
||||||
|
|
||||||
|
/* if wb linear width is not defined use the line width as default */
|
||||||
|
cfg->max_wb_linewidth_linear = props->exists[WB_LINEWIDTH_LINEAR] ?
|
||||||
|
PROP_VALUE_ACCESS(props->values, WB_LINEWIDTH_LINEAR, 0)
|
||||||
|
: cfg->max_wb_linewidth;
|
||||||
|
|
||||||
cfg->max_mixer_width = props->exists[MIXER_LINEWIDTH] ?
|
cfg->max_mixer_width = props->exists[MIXER_LINEWIDTH] ?
|
||||||
PROP_VALUE_ACCESS(props->values, MIXER_LINEWIDTH, 0) :
|
PROP_VALUE_ACCESS(props->values, MIXER_LINEWIDTH, 0) :
|
||||||
DEFAULT_SDE_LINE_WIDTH;
|
DEFAULT_SDE_LINE_WIDTH;
|
||||||
|
@@ -817,6 +817,7 @@ struct sde_vdc_sub_blks {
|
|||||||
|
|
||||||
struct sde_wb_sub_blocks {
|
struct sde_wb_sub_blocks {
|
||||||
u32 maxlinewidth;
|
u32 maxlinewidth;
|
||||||
|
u32 maxlinewidth_linear;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct sde_mdss_base_cfg {
|
struct sde_mdss_base_cfg {
|
||||||
@@ -1364,6 +1365,7 @@ struct sde_perf_cfg {
|
|||||||
* @max_mixer_blendstages max layer mixer blend stages or
|
* @max_mixer_blendstages max layer mixer blend stages or
|
||||||
* supported z order
|
* supported z order
|
||||||
* @max_wb_linewidth max writeback line width support.
|
* @max_wb_linewidth max writeback line width support.
|
||||||
|
* @max_wb_linewidth_linear max writeback line width for linear formats.
|
||||||
* @max_display_width maximum display width support.
|
* @max_display_width maximum display width support.
|
||||||
* @max_display_height maximum display height support.
|
* @max_display_height maximum display height support.
|
||||||
* @max_lm_per_display maximum layer mixer per display
|
* @max_lm_per_display maximum layer mixer per display
|
||||||
@@ -1433,6 +1435,7 @@ struct sde_mdss_cfg {
|
|||||||
u32 max_mixer_width;
|
u32 max_mixer_width;
|
||||||
u32 max_mixer_blendstages;
|
u32 max_mixer_blendstages;
|
||||||
u32 max_wb_linewidth;
|
u32 max_wb_linewidth;
|
||||||
|
u32 max_wb_linewidth_linear;
|
||||||
|
|
||||||
u32 max_display_width;
|
u32 max_display_width;
|
||||||
u32 max_display_height;
|
u32 max_display_height;
|
||||||
|
@@ -97,9 +97,11 @@ int sde_wb_connector_get_modes(struct drm_connector *connector, void *display,
|
|||||||
num_modes++;
|
num_modes++;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
u32 max_width = (wb_dev->wb_cfg && wb_dev->wb_cfg->sblk) ?
|
u32 max_width = SDE_WB_MODE_MAX_WIDTH;
|
||||||
wb_dev->wb_cfg->sblk->maxlinewidth :
|
|
||||||
SDE_WB_MODE_MAX_WIDTH;
|
if (wb_dev->wb_cfg && wb_dev->wb_cfg->sblk)
|
||||||
|
max_width = max(wb_dev->wb_cfg->sblk->maxlinewidth,
|
||||||
|
wb_dev->wb_cfg->sblk->maxlinewidth_linear);
|
||||||
|
|
||||||
num_modes = drm_add_modes_noedid(connector, max_width,
|
num_modes = drm_add_modes_noedid(connector, max_width,
|
||||||
SDE_WB_MODE_MAX_HEIGHT);
|
SDE_WB_MODE_MAX_HEIGHT);
|
||||||
@@ -298,21 +300,24 @@ int sde_wb_get_info(struct drm_connector *connector,
|
|||||||
struct msm_display_info *info, void *display)
|
struct msm_display_info *info, void *display)
|
||||||
{
|
{
|
||||||
struct sde_wb_device *wb_dev = display;
|
struct sde_wb_device *wb_dev = display;
|
||||||
|
u32 max_width = SDE_WB_MODE_MAX_WIDTH;
|
||||||
|
|
||||||
if (!info || !wb_dev) {
|
if (!info || !wb_dev) {
|
||||||
pr_err("invalid params\n");
|
pr_err("invalid params\n");
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (wb_dev->wb_cfg && wb_dev->wb_cfg->sblk)
|
||||||
|
max_width = max(wb_dev->wb_cfg->sblk->maxlinewidth,
|
||||||
|
wb_dev->wb_cfg->sblk->maxlinewidth_linear);
|
||||||
|
|
||||||
memset(info, 0, sizeof(struct msm_display_info));
|
memset(info, 0, sizeof(struct msm_display_info));
|
||||||
info->intf_type = DRM_MODE_CONNECTOR_VIRTUAL;
|
info->intf_type = DRM_MODE_CONNECTOR_VIRTUAL;
|
||||||
info->num_of_h_tiles = 1;
|
info->num_of_h_tiles = 1;
|
||||||
info->h_tile_instance[0] = sde_wb_get_index(display);
|
info->h_tile_instance[0] = sde_wb_get_index(display);
|
||||||
info->is_connected = true;
|
info->is_connected = true;
|
||||||
info->capabilities = MSM_DISPLAY_CAP_HOT_PLUG | MSM_DISPLAY_CAP_EDID;
|
info->capabilities = MSM_DISPLAY_CAP_HOT_PLUG | MSM_DISPLAY_CAP_EDID;
|
||||||
info->max_width = (wb_dev->wb_cfg && wb_dev->wb_cfg->sblk) ?
|
info->max_width = max_width;
|
||||||
wb_dev->wb_cfg->sblk->maxlinewidth :
|
|
||||||
SDE_WB_MODE_MAX_WIDTH;
|
|
||||||
info->max_height = SDE_WB_MODE_MAX_HEIGHT;
|
info->max_height = SDE_WB_MODE_MAX_HEIGHT;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@@ -391,6 +396,10 @@ int sde_wb_connector_set_info_blob(struct drm_connector *connector,
|
|||||||
"maxlinewidth",
|
"maxlinewidth",
|
||||||
wb_dev->wb_cfg->sblk->maxlinewidth);
|
wb_dev->wb_cfg->sblk->maxlinewidth);
|
||||||
|
|
||||||
|
sde_kms_info_add_keyint(info,
|
||||||
|
"maxlinewidth_linear",
|
||||||
|
wb_dev->wb_cfg->sblk->maxlinewidth_linear);
|
||||||
|
|
||||||
sde_kms_info_start(info, "features");
|
sde_kms_info_start(info, "features");
|
||||||
if (wb_dev->wb_cfg && (wb_dev->wb_cfg->features & BIT(SDE_WB_UBWC)))
|
if (wb_dev->wb_cfg && (wb_dev->wb_cfg->features & BIT(SDE_WB_UBWC)))
|
||||||
sde_kms_info_append(info, "wb_ubwc");
|
sde_kms_info_append(info, "wb_ubwc");
|
||||||
|
在新工单中引用
屏蔽一个用户