Merge a245be26e4 on remote branch

Change-Id: I6487bb9bb5a4301622ebcb85b6faebb352d870e8
This commit is contained in:
Linux Build Service Account 2021-11-05 08:44:22 -07:00
commit 2ae2aed006
17 changed files with 122 additions and 67 deletions

View file

@ -3051,7 +3051,7 @@ static int dp_display_setup_colospace(struct dp_display *dp_display,
struct dp_display_private *dp;
if (!dp_display || !panel) {
pr_err("invalid input\n");
DP_ERR("invalid input\n");
return -EINVAL;
}

View file

@ -1,6 +1,6 @@
// SPDX-License-Identifier: GPL-2.0-only
/*
* Copyright (c) 2017-2020, The Linux Foundation. All rights reserved.
* Copyright (c) 2017-2021, The Linux Foundation. All rights reserved.
*/
#include <drm/drm_atomic_helper.h>
@ -336,7 +336,7 @@ int dp_connector_set_colorspace(struct drm_connector *connector,
sde_conn = to_sde_connector(connector);
if (!sde_conn->drv_panel) {
pr_err("invalid dp panel\n");
DP_ERR("invalid dp panel\n");
return -EINVAL;
}

View file

@ -1,6 +1,6 @@
// SPDX-License-Identifier: GPL-2.0-only
/*
* Copyright (c) 2012-2020, The Linux Foundation. All rights reserved.
* Copyright (c) 2012-2021, The Linux Foundation. All rights reserved.
*/
#include "dp_panel.h"
@ -2571,7 +2571,7 @@ static int dp_panel_set_colorspace(struct dp_panel *dp_panel,
struct dp_panel_private *panel;
if (!dp_panel) {
pr_err("invalid input\n");
DP_ERR("invalid input\n");
rc = -EINVAL;
goto end;
}

View file

@ -657,34 +657,34 @@ static int dsi_ctrl_clocks_deinit(struct dsi_ctrl *ctrl)
struct dsi_link_hs_clk_info *hs_link = &ctrl->clk_info.hs_link_clks;
struct dsi_clk_link_set *rcg = &ctrl->clk_info.rcg_clks;
if (core->mdp_core_clk)
if (!IS_ERR_OR_NULL(core->mdp_core_clk))
devm_clk_put(&ctrl->pdev->dev, core->mdp_core_clk);
if (core->iface_clk)
if (!IS_ERR_OR_NULL(core->iface_clk))
devm_clk_put(&ctrl->pdev->dev, core->iface_clk);
if (core->core_mmss_clk)
if (!IS_ERR_OR_NULL(core->core_mmss_clk))
devm_clk_put(&ctrl->pdev->dev, core->core_mmss_clk);
if (core->bus_clk)
if (!IS_ERR_OR_NULL(core->bus_clk))
devm_clk_put(&ctrl->pdev->dev, core->bus_clk);
if (core->mnoc_clk)
if (!IS_ERR_OR_NULL(core->mnoc_clk))
devm_clk_put(&ctrl->pdev->dev, core->mnoc_clk);
memset(core, 0x0, sizeof(*core));
if (hs_link->byte_clk)
if (!IS_ERR_OR_NULL(hs_link->byte_clk))
devm_clk_put(&ctrl->pdev->dev, hs_link->byte_clk);
if (hs_link->pixel_clk)
if (!IS_ERR_OR_NULL(hs_link->pixel_clk))
devm_clk_put(&ctrl->pdev->dev, hs_link->pixel_clk);
if (lp_link->esc_clk)
if (!IS_ERR_OR_NULL(lp_link->esc_clk))
devm_clk_put(&ctrl->pdev->dev, lp_link->esc_clk);
if (hs_link->byte_intf_clk)
if (!IS_ERR_OR_NULL(hs_link->byte_intf_clk))
devm_clk_put(&ctrl->pdev->dev, hs_link->byte_intf_clk);
memset(hs_link, 0x0, sizeof(*hs_link));
memset(lp_link, 0x0, sizeof(*lp_link));
if (rcg->byte_clk)
if (!IS_ERR_OR_NULL(rcg->byte_clk))
devm_clk_put(&ctrl->pdev->dev, rcg->byte_clk);
if (rcg->pixel_clk)
if (!IS_ERR_OR_NULL(rcg->pixel_clk))
devm_clk_put(&ctrl->pdev->dev, rcg->pixel_clk);
memset(rcg, 0x0, sizeof(*rcg));

View file

@ -1488,7 +1488,7 @@ void msm_mode_object_event_notify(struct drm_mode_object *obj,
static int msm_release(struct inode *inode, struct file *filp)
{
struct drm_file *file_priv = filp->private_data;
struct drm_file *file_priv;
struct drm_minor *minor;
struct drm_device *dev;
struct msm_drm_private *priv;
@ -1500,6 +1500,7 @@ static int msm_release(struct inode *inode, struct file *filp)
mutex_lock(&msm_release_lock);
file_priv = filp->private_data;
if (!file_priv) {
ret = -EINVAL;
goto end;

View file

@ -1833,7 +1833,7 @@ static int _sde_connector_lm_preference(struct sde_connector *sde_conn,
return -EINVAL;
}
sde_hw_mixer_set_preference(sde_kms->catalog, num_lm, disp_type);
sde_conn->lm_mask = sde_hw_mixer_set_preference(sde_kms->catalog, num_lm, disp_type);
return ret;
}

View file

@ -547,6 +547,7 @@ struct sde_connector {
bool hdr_supported;
u32 color_enc_fmt;
u32 lm_mask;
u8 hdr_plus_app_ver;
u32 qsync_mode;

View file

@ -267,13 +267,11 @@ static int _sde_encoder_wait_timeout(int32_t drm_id, int32_t hw_id,
return rc;
}
bool sde_encoder_is_primary_display(struct drm_encoder *drm_enc)
u32 sde_encoder_get_display_type(struct drm_encoder *drm_enc)
{
struct sde_encoder_virt *sde_enc = to_sde_encoder_virt(drm_enc);
return sde_enc &&
(sde_enc->disp_info.display_type ==
SDE_CONNECTOR_PRIMARY);
return sde_enc ? sde_enc->disp_info.display_type : 0;
}
bool sde_encoder_is_dsi_display(struct drm_encoder *drm_enc)

View file

@ -523,12 +523,12 @@ bool sde_encoder_is_cwb_disabling(struct drm_encoder *drm_enc,
struct drm_crtc *drm_crtc);
/**
* sde_encoder_is_primary_display - checks if underlying display is primary
* display or not.
* sde_encoder_get_display_type - returns the display_type of underlying
* display
* @drm_enc: Pointer to drm encoder structure
* @Return: true if it is primary display. false if secondary display
* @Return: display_type
*/
bool sde_encoder_is_primary_display(struct drm_encoder *enc);
u32 sde_encoder_get_display_type(struct drm_encoder *enc);
/**
* sde_encoder_is_dsi_display - checks if underlying display is DSI

View file

@ -1727,6 +1727,9 @@ static void sde_encoder_phys_wb_disable(struct sde_encoder_phys *phys_enc)
}
if (phys_enc->in_clone_mode) {
if (hw_wb->ops.setup_crop)
hw_wb->ops.setup_crop(hw_wb, NULL, false);
_sde_encoder_phys_wb_setup_cwb(phys_enc, false);
_sde_encoder_phys_wb_update_cwb_flush(phys_enc, false);
phys_enc->enable_state = SDE_ENC_DISABLING;

View file

@ -425,6 +425,7 @@ enum {
MIXER_BLOCKS,
MIXER_DISP,
MIXER_CWB,
MIXER_CWB_MASK,
MIXER_PROP_MAX,
};
@ -710,6 +711,7 @@ static struct sde_prop_type mixer_prop[] = {
PROP_TYPE_STRING_ARRAY},
{MIXER_CWB, "qcom,sde-mixer-cwb-pref", false,
PROP_TYPE_STRING_ARRAY},
{MIXER_CWB_MASK, "qcom,sde-mixer-cwb-mask", false, PROP_TYPE_U32_ARRAY},
};
static struct sde_prop_type mixer_blocks_prop[] = {
@ -1976,10 +1978,10 @@ void sde_hw_ctl_set_preference(struct sde_mdss_cfg *sde_cfg,
}
}
void sde_hw_mixer_set_preference(struct sde_mdss_cfg *sde_cfg, u32 num_lm,
u32 sde_hw_mixer_set_preference(struct sde_mdss_cfg *sde_cfg, u32 num_lm,
uint32_t disp_type)
{
u32 i, cnt = 0, sec_cnt = 0;
u32 i, cnt = 0, sec_cnt = 0, lm_mask = 0;
if (disp_type == SDE_CONNECTOR_PRIMARY) {
for (i = 0; i < sde_cfg->mixer_count; i++) {
@ -1998,6 +2000,7 @@ void sde_hw_mixer_set_preference(struct sde_mdss_cfg *sde_cfg, u32 num_lm,
if (cnt < num_lm) {
set_bit(SDE_DISP_PRIMARY_PREF,
&sde_cfg->mixer[i].features);
lm_mask |= BIT(sde_cfg->mixer[i].id - 1);
cnt++;
}
@ -2036,10 +2039,13 @@ void sde_hw_mixer_set_preference(struct sde_mdss_cfg *sde_cfg, u32 num_lm,
BIT(SDE_DISP_PRIMARY_PREF))) {
set_bit(SDE_DISP_SECONDARY_PREF,
&sde_cfg->mixer[i].features);
lm_mask |= BIT(sde_cfg->mixer[i].id - 1);
cnt++;
}
}
}
return lm_mask;
}
static int sde_mixer_parse_dt(struct device_node *np,
@ -2151,6 +2157,9 @@ static int sde_mixer_parse_dt(struct device_node *np,
if (BIT(mixer->id - LM_0) & sde_cfg->cwb_virtual_mixers_mask)
set_bit(SDE_MIXER_IS_VIRTUAL, &mixer->features);
mixer->cwb_mask = !props->exists[MIXER_CWB_MASK] ? 0x0 :
PROP_VALUE_ACCESS(props->values, MIXER_CWB_MASK, i);
mixer->pingpong = pp_count > 0 ? pp_idx + PINGPONG_0
: PINGPONG_MAX;
mixer->dspp = dspp_count > 0 ? dspp_idx + DSPP_0

View file

@ -977,6 +977,7 @@ struct sde_sspp_cfg {
* @pingpong: ID of connected PingPong, PINGPONG_MAX if unsupported
* @ds: ID of connected DS, DS_MAX if unsupported
* @lm_pair_mask: Bitmask of LMs that can be controlled by same CTL
* @cwb_mask: Bitmask of LMs connected to cwb mux from this LM id
*/
struct sde_lm_cfg {
SDE_HW_BLK_INFO;
@ -985,6 +986,7 @@ struct sde_lm_cfg {
u32 pingpong;
u32 ds;
unsigned long lm_pair_mask;
u32 cwb_mask;
};
/**
@ -1641,8 +1643,10 @@ struct sde_mdss_hw_cfg_handler {
* @sde_cfg: pointer to sspp cfg
* @num_lm: num lms to set preference
* @disp_type: is the given display primary/secondary
*
* Return: layer mixer mask allocated for the disp_type
*/
void sde_hw_mixer_set_preference(struct sde_mdss_cfg *sde_cfg, u32 num_lm,
u32 sde_hw_mixer_set_preference(struct sde_mdss_cfg *sde_cfg, u32 num_lm,
uint32_t disp_type);
/**

View file

@ -215,9 +215,8 @@ static void sde_hw_wb_crop(struct sde_hw_wb *ctx, struct sde_hw_wb_cfg *wb, bool
struct sde_hw_blk_reg_map *c = &ctx->hw;
u32 crop_xy;
crop_xy = (wb->crop.y << 16) | wb->crop.x;
if (crop) {
crop_xy = (wb->crop.y << 16) | wb->crop.x;
SDE_REG_WRITE(c, WB_CROP_CTRL, 0x1);
SDE_REG_WRITE(c, WB_CROP_OFFSET, crop_xy);
} else {

View file

@ -111,6 +111,8 @@ struct sde_rm_requirements {
uint64_t top_ctrl;
const struct sde_rm_topology_def *topology;
struct sde_encoder_hw_resources hw_res;
u32 cwb_requested_disp_type;
u32 conn_lm_mask;
};
/**
@ -981,7 +983,8 @@ static bool _sde_rm_check_lm_and_get_connected_blks(
struct sde_rm_hw_blk **dspp,
struct sde_rm_hw_blk **ds,
struct sde_rm_hw_blk **pp,
struct sde_rm_hw_blk *primary_lm)
struct sde_rm_hw_blk *primary_lm,
u32 conn_lm_mask)
{
const struct sde_lm_cfg *lm_cfg = to_sde_hw_mixer(lm->hw)->cap;
const struct sde_pingpong_cfg *pp_cfg;
@ -1038,6 +1041,13 @@ static bool _sde_rm_check_lm_and_get_connected_blks(
SDE_DEBUG("fail: cwb supported lm not allocated\n");
return false;
}
if (lm_cfg->cwb_mask && RM_RQ_CWB(reqs) &&
!(BIT(ffs(conn_lm_mask) - 1) & lm_cfg->cwb_mask)) {
SDE_DEBUG("cwb mixer not compatible id:%d cwb_mask:0x%x lm_mask:0x%x\n",
lm_cfg->id, lm_cfg->cwb_mask, conn_lm_mask);
return false;
}
} else if ((!is_conn_primary && lm_primary_pref) ||
(!is_conn_secondary && lm_secondary_pref)) {
SDE_DEBUG(
@ -1083,7 +1093,7 @@ static int _sde_rm_reserve_lms(
struct sde_rm_hw_blk *ds[MAX_BLOCKS];
struct sde_rm_hw_blk *pp[MAX_BLOCKS];
struct sde_rm_hw_iter iter_i, iter_j;
u32 lm_mask = 0;
u32 lm_mask = 0, conn_lm_mask = 0;
int lm_count = 0;
int i, rc = 0;
@ -1092,6 +1102,9 @@ static int _sde_rm_reserve_lms(
return 0;
}
if (RM_RQ_CWB(reqs))
conn_lm_mask = reqs->conn_lm_mask;
/* Find a primary mixer */
sde_rm_init_hw_iter(&iter_i, 0, SDE_HW_BLK_LM);
while (lm_count != reqs->topology->num_lm &&
@ -1115,12 +1128,15 @@ static int _sde_rm_reserve_lms(
if (!_sde_rm_check_lm_and_get_connected_blks(
rm, rsvp, reqs, lm[lm_count],
&dspp[lm_count], &ds[lm_count],
&pp[lm_count], NULL))
&pp[lm_count], NULL, conn_lm_mask))
continue;
lm_mask |= (1 << iter_i.blk->id);
++lm_count;
if (RM_RQ_CWB(reqs))
conn_lm_mask = conn_lm_mask & ~BIT(ffs(conn_lm_mask) - 1);
/* Return if peer is not needed */
if (lm_count == reqs->topology->num_lm)
break;
@ -1140,7 +1156,7 @@ static int _sde_rm_reserve_lms(
if (!_sde_rm_check_lm_and_get_connected_blks(
rm, rsvp, reqs, iter_j.blk,
&dspp[lm_count], &ds[lm_count],
&pp[lm_count], iter_i.blk))
&pp[lm_count], iter_i.blk, conn_lm_mask))
continue;
SDE_DEBUG("blk id = %d, _lm_ids[%d] = %d\n",
@ -1153,6 +1169,10 @@ static int _sde_rm_reserve_lms(
lm_mask |= (1 << iter_j.blk->id);
++lm_count;
if (RM_RQ_CWB(reqs))
conn_lm_mask = conn_lm_mask & ~BIT(ffs(conn_lm_mask) - 1);
break;
}
@ -2005,6 +2025,26 @@ int sde_rm_cont_splash_res_init(struct msm_drm_private *priv,
return 0;
}
static struct drm_connector *_sde_rm_get_connector(
struct drm_encoder *enc)
{
struct drm_connector *conn = NULL, *conn_search;
struct sde_connector *c_conn = NULL;
struct drm_connector_list_iter conn_iter;
drm_connector_list_iter_begin(enc->dev, &conn_iter);
drm_for_each_connector_iter(conn_search, &conn_iter) {
c_conn = to_sde_connector(conn_search);
if (c_conn->encoder == enc) {
conn = conn_search;
break;
}
}
drm_connector_list_iter_end(&conn_iter);
return conn;
}
static int _sde_rm_populate_requirements(
struct sde_rm *rm,
struct drm_encoder *enc,
@ -2013,6 +2053,8 @@ static int _sde_rm_populate_requirements(
struct sde_rm_requirements *reqs)
{
const struct drm_display_mode *mode = &crtc_state->mode;
struct drm_encoder *encoder_iter;
struct drm_connector *conn;
int i, num_lm;
reqs->top_ctrl = sde_connector_get_property(conn_state,
@ -2041,7 +2083,7 @@ static int _sde_rm_populate_requirements(
reqs->top_ctrl |= BIT(SDE_RM_TOPCTL_DSPP);
if (!RM_RQ_DS(reqs) && rm->hw_mdp->caps->has_dest_scaler &&
sde_encoder_is_primary_display(enc))
(sde_encoder_get_display_type(enc) == SDE_CONNECTOR_PRIMARY))
reqs->top_ctrl |= BIT(SDE_RM_TOPCTL_DS);
}
@ -2075,8 +2117,22 @@ static int _sde_rm_populate_requirements(
reqs->topology->top_name, reqs->topology->num_ctl);
}
SDE_DEBUG("top_ctrl: 0x%llX num_h_tiles: %d\n", reqs->top_ctrl,
reqs->hw_res.display_num_of_h_tiles);
if (RM_RQ_CWB(reqs)) {
drm_for_each_encoder_mask(encoder_iter, enc->dev,
crtc_state->encoder_mask) {
if (drm_encoder_mask(encoder_iter) == drm_encoder_mask(enc))
continue;
reqs->cwb_requested_disp_type = sde_encoder_get_display_type(encoder_iter);
conn = _sde_rm_get_connector(encoder_iter);
if (conn)
reqs->conn_lm_mask = to_sde_connector(conn)->lm_mask;
break;
}
}
SDE_DEBUG("top_ctrl: 0x%llX num_h_tiles: %d cwb_req_disp_type:%d\n", reqs->top_ctrl,
reqs->hw_res.display_num_of_h_tiles, reqs->cwb_requested_disp_type);
SDE_DEBUG("num_lm: %d num_ctl: %d topology: %d split_display: %d\n",
reqs->topology->num_lm, reqs->topology->num_ctl,
reqs->topology->top_name,
@ -2120,26 +2176,6 @@ static struct sde_rm_rsvp *_sde_rm_get_rsvp_cur(struct sde_rm *rm,
return _sde_rm_get_rsvp(rm, enc, false);
}
static struct drm_connector *_sde_rm_get_connector(
struct drm_encoder *enc)
{
struct drm_connector *conn = NULL, *conn_search;
struct sde_connector *c_conn = NULL;
struct drm_connector_list_iter conn_iter;
drm_connector_list_iter_begin(enc->dev, &conn_iter);
drm_for_each_connector_iter(conn_search, &conn_iter) {
c_conn = to_sde_connector(conn_search);
if (c_conn->encoder == enc) {
conn = conn_search;
break;
}
}
drm_connector_list_iter_end(&conn_iter);
return conn;
}
int sde_rm_update_topology(struct sde_rm *rm,
struct drm_connector_state *conn_state,
struct msm_display_topology *topology)

View file

@ -352,6 +352,8 @@ static u32 sde_rsc_timer_calculate(struct sde_rsc_priv *rsc,
line_time_ns, prefill_time_ns);
pr_debug("static wakeup time:%lld cxo:%u\n", total, cxo_period_ns);
SDE_EVT32(rsc->cmd_config.fps, rsc->cmd_config.vtotal, total);
pdc_backoff_time_ns = rsc_backoff_time_ns;
rsc_backoff_time_ns = div_u64(rsc_backoff_time_ns, cxo_period_ns);
rsc->timer_config.rsc_backoff_time_ns = (u32) rsc_backoff_time_ns;

View file

@ -1,6 +1,6 @@
// SPDX-License-Identifier: GPL-2.0-only
/*
* Copyright (c) 2012, 2015-2020, The Linux Foundation. All rights reserved.
* Copyright (c) 2012, 2015-2021, The Linux Foundation. All rights reserved.
*/
#define pr_fmt(fmt) "%s: " fmt, __func__
@ -79,7 +79,7 @@ u32 sde_apply_comp_ratio_factor(u32 quota,
return quota;
}
#define RES_1080p (1088*1920)
#define RES_1080p (1088*1920)
#define RES_UHD (3840*2160)
#define RES_WQXGA (2560*1600)
#define XIN_HALT_TIMEOUT_US 0x4000
@ -507,10 +507,10 @@ int sde_update_reg_bus_vote(struct reg_bus_client *bus_client, u32 usecase_ndx)
}
if (ret) {
pr_err("rotator: reg_bus_hdl set failed ab=%llu, ib=%llu\n",
SDEROT_ERR("rotator: reg_bus_hdl set failed ab=%llu, ib=%llu\n",
reg_bus_value->ab, reg_bus_value->ib);
if (sde_res->reg_bus_usecase_ndx == VOTE_INDEX_DISABLE)
pr_err("rotator: reg_bus_hdl was disabled\n");
SDEROT_ERR("rotator: reg_bus_hdl was disabled\n");
} else {
sde_res->reg_bus_usecase_ndx = max_usecase_ndx;
}
@ -841,7 +841,7 @@ static int sde_mdp_bus_scale_register(struct sde_rot_data_type *mdata)
mdata->reg_bus_hdl = of_icc_get(&mdata->pdev->dev, "qcom,sde-reg-bus");
if (mdata->reg_bus_hdl == NULL) {
pr_err("rotator: reg bus dt node missing\n");
SDEROT_ERR("rotator: reg bus dt node missing\n");
return 0;
} else if (IS_ERR(mdata->reg_bus_hdl)) {
SDEROT_ERR("reg bus handle parsing failed\n");

View file

@ -1,6 +1,6 @@
// SPDX-License-Identifier: GPL-2.0-only
/*
* Copyright (c) 2015-2020, The Linux Foundation. All rights reserved.
* Copyright (c) 2015-2021, The Linux Foundation. All rights reserved.
*/
#define pr_fmt(fmt) "%s: " fmt, __func__
@ -249,11 +249,13 @@ void sde_rotator_resync_timeline(struct sde_rot_timeline *tl)
spin_lock_irqsave(&tl->lock, flags);
val = tl->next_value - tl->curr_value;
if (val > 0) {
SDEROT_WARN("flush %s:%d\n", tl->name, val);
if (val > 0)
sde_rotator_inc_timeline_locked(tl, val);
}
spin_unlock_irqrestore(&tl->lock, flags);
if (val > 0)
SDEROT_WARN("flush %s:%d\n", tl->name, val);
}
/*