Merge "msm: mdss: Correct DSC panel dimension when dest-scaler enabled"
This commit is contained in:
commit
fbad4dc35a
2 changed files with 50 additions and 12 deletions
|
@ -2964,6 +2964,7 @@ static u32 __dsc_get_common_mode(struct mdss_mdp_ctl *ctl, bool mux_3d)
|
|||
static void __dsc_get_pic_dim(struct mdss_mdp_mixer *mixer_l,
|
||||
struct mdss_mdp_mixer *mixer_r, u32 *pic_w, u32 *pic_h)
|
||||
{
|
||||
struct mdss_data_type *mdata = NULL;
|
||||
bool valid_l = mixer_l && mixer_l->valid_roi;
|
||||
bool valid_r = mixer_r && mixer_r->valid_roi;
|
||||
|
||||
|
@ -2971,13 +2972,29 @@ static void __dsc_get_pic_dim(struct mdss_mdp_mixer *mixer_l,
|
|||
*pic_h = 0;
|
||||
|
||||
if (valid_l) {
|
||||
*pic_w = mixer_l->roi.w;
|
||||
*pic_h = mixer_l->roi.h;
|
||||
mdata = mixer_l->ctl->mdata;
|
||||
if (test_bit(MDSS_CAPS_DEST_SCALER, mdata->mdss_caps_map) &&
|
||||
mixer_l->ds &&
|
||||
(mixer_l->ds->flags & DS_ENABLE)) {
|
||||
*pic_w = mixer_l->ds->scaler.dst_width;
|
||||
*pic_h = mixer_l->ds->scaler.dst_height;
|
||||
} else {
|
||||
*pic_w = mixer_l->roi.w;
|
||||
*pic_h = mixer_l->roi.h;
|
||||
}
|
||||
}
|
||||
|
||||
if (valid_r) {
|
||||
*pic_w += mixer_r->roi.w;
|
||||
*pic_h = mixer_r->roi.h;
|
||||
mdata = mixer_r->ctl->mdata;
|
||||
if (test_bit(MDSS_CAPS_DEST_SCALER, mdata->mdss_caps_map) &&
|
||||
mixer_r->ds &&
|
||||
(mixer_r->ds->flags & DS_ENABLE)) {
|
||||
*pic_w += mixer_r->ds->scaler.dst_width;
|
||||
*pic_h = mixer_r->ds->scaler.dst_height;
|
||||
} else {
|
||||
*pic_w += mixer_r->roi.w;
|
||||
*pic_h = mixer_r->roi.h;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -137,10 +137,7 @@ static int mdss_mdp_destination_scaler_pre_validate(struct mdss_mdp_ctl *ctl,
|
|||
if ((ds_data->lm_width > get_panel_xres(pinfo)) ||
|
||||
(ds_data->lm_height > get_panel_yres(pinfo)) ||
|
||||
(ds_data->lm_width == 0) ||
|
||||
(ds_data->lm_height == 0) ||
|
||||
(is_dsc_compression(pinfo) &&
|
||||
!is_lm_configs_dsc_compatible(pinfo,
|
||||
ds_data->lm_width, ds_data->lm_height))) {
|
||||
(ds_data->lm_height == 0)) {
|
||||
pr_err("Invalid left LM {%d,%d} setting\n",
|
||||
ds_data->lm_width, ds_data->lm_height);
|
||||
return -EINVAL;
|
||||
|
@ -167,10 +164,7 @@ static int mdss_mdp_destination_scaler_pre_validate(struct mdss_mdp_ctl *ctl,
|
|||
if ((ds_data->lm_width > get_panel_xres(pinfo)) ||
|
||||
(ds_data->lm_height > get_panel_yres(pinfo)) ||
|
||||
(ds_data->lm_width == 0) ||
|
||||
(ds_data->lm_height == 0) ||
|
||||
(is_dsc_compression(pinfo) &&
|
||||
!is_lm_configs_dsc_compatible(pinfo,
|
||||
ds_data->lm_width, ds_data->lm_height))) {
|
||||
(ds_data->lm_height == 0)) {
|
||||
pr_err("Invalid right LM {%d,%d} setting\n",
|
||||
ds_data->lm_width, ds_data->lm_height);
|
||||
return -EINVAL;
|
||||
|
@ -217,6 +211,8 @@ static int mdss_mdp_validate_destination_scaler(struct msm_fb_data_type *mfd,
|
|||
struct mdss_mdp_ctl *ctl;
|
||||
struct mdss_mdp_destination_scaler *ds_left = NULL;
|
||||
struct mdss_mdp_destination_scaler *ds_right = NULL;
|
||||
struct mdss_panel_info *pinfo;
|
||||
u32 scaler_width, scaler_height;
|
||||
|
||||
if (ds_data) {
|
||||
mdata = mfd_to_mdata(mfd);
|
||||
|
@ -293,6 +289,31 @@ static int mdss_mdp_validate_destination_scaler(struct msm_fb_data_type *mfd,
|
|||
if (ds_right)
|
||||
pr_debug("DS_RIGHT: flags=0x%X\n", ds_right->flags);
|
||||
|
||||
/*
|
||||
* When DSC is enabled, make sure the scaler output dimension is
|
||||
* correctly setup.
|
||||
*/
|
||||
pinfo = &ctl->panel_data->panel_info;
|
||||
scaler_width = 0;
|
||||
scaler_height = 0;
|
||||
if (ds_left && ds_left->flags) {
|
||||
scaler_width += ds_left->scaler.dst_width;
|
||||
scaler_height = ds_left->scaler.dst_height;
|
||||
}
|
||||
if (ds_right && ds_right->flags) {
|
||||
scaler_width += ds_right->scaler.dst_width;
|
||||
scaler_height = ds_right->scaler.dst_height;
|
||||
}
|
||||
pr_debug("DS output dimension: %dx%d\n", scaler_width, scaler_height);
|
||||
|
||||
if (ds_data[0].flags && (is_dsc_compression(pinfo) &&
|
||||
!is_lm_configs_dsc_compatible(pinfo,
|
||||
scaler_width, scaler_height))) {
|
||||
pr_err("Invalid Dest-scaler output width/height: %d/%d\n",
|
||||
scaler_width, scaler_height);
|
||||
ret = -EINVAL;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue