diff --git a/msm/msm_drv.h b/msm/msm_drv.h index 313e183f84..761020687b 100644 --- a/msm/msm_drv.h +++ b/msm/msm_drv.h @@ -243,6 +243,7 @@ enum msm_mdp_conn_property { CONNECTOR_PROP_CACHE_STATE, CONNECTOR_PROP_DSC_MODE, CONNECTOR_PROP_WB_USAGE_TYPE, + CONNECTOR_PROP_WB_ROT_TYPE, /* total # of properties */ CONNECTOR_PROP_COUNT diff --git a/msm/sde/sde_hw_catalog.c b/msm/sde/sde_hw_catalog.c index 9821a04831..ebc5f5be28 100644 --- a/msm/sde/sde_hw_catalog.c +++ b/msm/sde/sde_hw_catalog.c @@ -2550,6 +2550,9 @@ static int sde_wb_parse_dt(struct device_node *np, struct sde_mdss_cfg *sde_cfg) sde_cfg->mdp[0].clk_ctrls[wb->clk_ctrl].bit_off); } + if (test_bit(SDE_FEATURE_WB_ROTATION, sde_cfg->features)) + set_bit(SDE_WB_LINEAR_ROTATION, &wb->features); + wb->format_list = sde_cfg->wb_formats; } diff --git a/msm/sde/sde_hw_catalog.h b/msm/sde/sde_hw_catalog.h index 90541b7fcc..0d7d5fe444 100644 --- a/msm/sde/sde_hw_catalog.h +++ b/msm/sde/sde_hw_catalog.h @@ -637,6 +637,7 @@ enum { * @SDE_WB_DCWB_CTRL Separate DCWB control is available for configuring * @SDE_WB_CWB_DITHER_CTRL CWB dither is available for configuring * @SDE_WB_PROG_LINE Writeback block supports programmable line ptr + * @SDE_WB_LINEAR_ROTATION Writeback block supports line mode image rotation * @SDE_WB_MAX maximum value */ enum { @@ -661,6 +662,7 @@ enum { SDE_WB_DCWB_CTRL, SDE_WB_CWB_DITHER_CTRL, SDE_WB_PROG_LINE, + SDE_WB_LINEAR_ROTATION, SDE_WB_MAX }; @@ -708,7 +710,7 @@ enum { * @SDE_FEATURE_CWB_DITHER CWB dither is supported * @SDE_FEATURE_DEDICATED_CWB Dedicated-CWB supported * @SDE_FEATURE_DUAL_DEDICATED_CWB Dual Dedicated-CWB supported - * @SDE_FEATURE_IDLE_PC Idle Power Collapse supported + * @SDE_FEATURE_WB_ROTATION Support for image rotation through WB block * @SDE_FEATURE_3D_MERGE_RESET 3D merge reset supported * @SDE_FEATURE_DECIMATION Decimation supported * @SDE_FEATURE_COMBINED_ALPHA Combined Alpha supported @@ -751,6 +753,7 @@ enum sde_mdss_features { SDE_FEATURE_CWB_DITHER, SDE_FEATURE_DEDICATED_CWB, SDE_FEATURE_DUAL_DEDICATED_CWB, + SDE_FEATURE_WB_ROTATION, SDE_FEATURE_IDLE_PC, SDE_FEATURE_3D_MERGE_RESET, SDE_FEATURE_DECIMATION, diff --git a/msm/sde/sde_hw_mdss.h b/msm/sde/sde_hw_mdss.h index 58e49ffcb7..25c7fe4a53 100644 --- a/msm/sde/sde_hw_mdss.h +++ b/msm/sde/sde_hw_mdss.h @@ -502,11 +502,27 @@ enum sde_sys_cache_state { * WB_USAGE_WFD: WB connector used for WFD * WB_USAGE_CWB: WB connector used for concurrent writeback * WB_USAGE_OFFLINE_WB: WB connector used for 2-pass composition + * WB_USAGE_ROT: WB connector used for image rotation for 2 pass composition */ enum sde_wb_usage_type { WB_USAGE_WFD, WB_USAGE_CWB, WB_USAGE_OFFLINE_WB, + WB_USAGE_ROT, +}; + +/** + * enum sde_wb_rot_type: Type of rotation use case of the WB connector + * WB_ROT_NONE : WB Rotation not in use + * WB_ROT_SINGLE: WB Rotation used in single job mode for full image rotation + * WB_ROT_JOB1: WB Rotation used for rotating half image as first-job + * WB_ROT_JOB2: WB Rotation used for rotating half image as second-job + */ +enum sde_wb_rot_type { + WB_ROT_NONE, + WB_ROT_SINGLE, + WB_ROT_JOB1, + WB_ROT_JOB2, }; /** struct sde_format - defines the format configuration which diff --git a/msm/sde/sde_wb.c b/msm/sde/sde_wb.c index 27a1537b57..0c27f1998a 100644 --- a/msm/sde/sde_wb.c +++ b/msm/sde/sde_wb.c @@ -609,6 +609,14 @@ int sde_wb_connector_post_init(struct drm_connector *connector, void *display) {WB_USAGE_WFD, "wb_usage_wfd"}, {WB_USAGE_CWB, "wb_usage_cwb"}, {WB_USAGE_OFFLINE_WB, "wb_usage_offline_wb"}, + {WB_USAGE_ROT, "wb_usage_rot"}, + }; + + static const struct drm_prop_enum_list e_wb_rotate_type[] = { + {WB_ROT_NONE, "wb_rot_none"}, + {WB_ROT_SINGLE, "wb_rot_single"}, + {WB_ROT_JOB1, "wb_rot_job1"}, + {WB_ROT_JOB2, "wb_rot_job2"}, }; if (!connector || !display || !wb_dev->wb_cfg || !wb_dev->drm_dev->dev_private) { @@ -662,6 +670,11 @@ int sde_wb_connector_post_init(struct drm_connector *connector, void *display) msm_property_install_range(&c_conn->property_info, "dnsc_blur", 0x0, 0, ~0, 0, CONNECTOR_PROP_DNSC_BLUR); + if (wb_dev->wb_cfg->features & BIT(SDE_WB_LINEAR_ROTATION)) + msm_property_install_enum(&c_conn->property_info, "wb_rotate_type", + 0x0, 0, e_wb_rotate_type, ARRAY_SIZE(e_wb_rotate_type), + 0, CONNECTOR_PROP_WB_ROT_TYPE); + msm_property_install_enum(&c_conn->property_info, "wb_usage_type", 0x0, 0, e_wb_usage_type, ARRAY_SIZE(e_wb_usage_type), 0, CONNECTOR_PROP_WB_USAGE_TYPE);