Loading drivers/media/platform/msm/sde/rotator/sde_rotator_base.h +2 −0 Original line number Diff line number Diff line Loading @@ -96,6 +96,7 @@ enum sde_rot_type { * @SDE_CAPS_R1_WB: MDSS V1.x WB block * @SDE_CAPS_R3_WB: MDSS V3.x WB block * @SDE_CAPS_R3_1P5_DOWNSCALE: 1.5x downscale rotator support * @SDE_CAPS_MIN_BUS_VOTE: minimum bus vote prior to power enable * @SDE_CAPS_SBUF_1: stream buffer support for inline rotation */ enum sde_caps_settings { Loading @@ -103,6 +104,7 @@ enum sde_caps_settings { SDE_CAPS_R3_WB, SDE_CAPS_R3_1P5_DOWNSCALE, SDE_CAPS_SEC_ATTACH_DETACH_SMMU, SDE_CAPS_MIN_BUS_VOTE, SDE_CAPS_SBUF_1, SDE_CAPS_MAX, }; Loading drivers/media/platform/msm/sde/rotator/sde_rotator_core.c +19 −0 Original line number Diff line number Diff line Loading @@ -67,6 +67,8 @@ #define ROT_OVERHEAD_NUMERATOR 27 #define ROT_OVERHEAD_DENOMINATOR 10000 /* default minimum bandwidth vote */ #define ROT_ENABLE_BW_VOTE 64000 /* * Max rotator hw blocks possible. Used for upper array limits instead of * alloc and freeing small array Loading Loading @@ -96,6 +98,9 @@ static struct msm_bus_scale_pdata rot_reg_bus_scale_table = { .active_only = 1, }; /* forward prototype */ static int sde_rotator_update_perf(struct sde_rot_mgr *mgr); static int sde_rotator_bus_scale_set_quota(struct sde_rot_bus_data_type *bus, u64 quota) { Loading Loading @@ -292,6 +297,7 @@ static int sde_rotator_update_clk(struct sde_rot_mgr *mgr) static void sde_rotator_footswitch_ctrl(struct sde_rot_mgr *mgr, bool on) { struct sde_rot_data_type *mdata = sde_rot_get_mdata(); int ret; if (WARN_ON(mgr->regulator_enable == on)) { Loading @@ -302,6 +308,11 @@ static void sde_rotator_footswitch_ctrl(struct sde_rot_mgr *mgr, bool on) SDEROT_EVTLOG(on); SDEROT_DBG("%s: rotator regulators\n", on ? "Enable" : "Disable"); if (test_bit(SDE_CAPS_MIN_BUS_VOTE, mdata->sde_caps_map) && on) { mgr->minimum_bw_vote = mgr->enable_bw_vote; sde_rotator_update_perf(mgr); } if (mgr->ops_hw_pre_pmevent) mgr->ops_hw_pre_pmevent(mgr, on); Loading @@ -316,6 +327,11 @@ static void sde_rotator_footswitch_ctrl(struct sde_rot_mgr *mgr, bool on) if (mgr->ops_hw_post_pmevent) mgr->ops_hw_post_pmevent(mgr, on); if (test_bit(SDE_CAPS_MIN_BUS_VOTE, mdata->sde_caps_map) && !on) { mgr->minimum_bw_vote = 0; sde_rotator_update_perf(mgr); } mgr->regulator_enable = on; } Loading Loading @@ -1323,6 +1339,7 @@ static int sde_rotator_update_perf(struct sde_rot_mgr *mgr) } total_bw += mgr->pending_close_bw_vote; total_bw = max_t(u64, total_bw, mgr->minimum_bw_vote); sde_rotator_enable_reg_bus(mgr, total_bw); ATRACE_INT("bus_quota", total_bw); sde_rotator_bus_scale_set_quota(&mgr->data_bus, total_bw); Loading Loading @@ -2794,6 +2811,7 @@ int sde_rotator_core_init(struct sde_rot_mgr **pmgr, mgr->pdev = pdev; mgr->device = &pdev->dev; mgr->pending_close_bw_vote = 0; mgr->enable_bw_vote = ROT_ENABLE_BW_VOTE; mgr->hwacquire_timeout = ROT_HW_ACQUIRE_TIMEOUT_IN_MS; mgr->queue_count = 1; mgr->pixel_per_clk.numer = ROT_PIXEL_PER_CLK_NUMERATOR; Loading Loading @@ -3013,6 +3031,7 @@ int sde_rotator_pm_suspend(struct device *dev) sde_rot_mgr_lock(mgr); atomic_inc(&mgr->device_suspended); sde_rotator_suspend_cancel_rot_work(mgr); mgr->minimum_bw_vote = 0; sde_rotator_update_perf(mgr); ATRACE_END("pm_active"); SDEROT_DBG("end pm active %d\n", atomic_read(&mgr->device_suspended)); Loading drivers/media/platform/msm/sde/rotator/sde_rotator_core.h +4 −0 Original line number Diff line number Diff line Loading @@ -367,6 +367,8 @@ struct sde_rot_bus_data_type { * @doneq: array of rotator done queue corresponding to hardware queue * @file_list: list of all sessions managed by rotator manager * @pending_close_bw_vote: bandwidth of closed sessions with pending work * @minimum_bw_vote: minimum bandwidth required for current use case * @enable_bw_vote: minimum bandwidth required for power enable * @data_bus: data bus configuration state * @reg_bus: register bus configuration state * @module_power: power/clock configuration state Loading Loading @@ -406,6 +408,8 @@ struct sde_rot_mgr { struct list_head file_list; u64 pending_close_bw_vote; u64 minimum_bw_vote; u64 enable_bw_vote; struct sde_rot_bus_data_type data_bus; struct sde_rot_bus_data_type reg_bus; Loading drivers/media/platform/msm/sde/rotator/sde_rotator_debug.c +6 −0 Original line number Diff line number Diff line Loading @@ -868,6 +868,12 @@ static int sde_rotator_core_create_debugfs( return -EINVAL; } if (!debugfs_create_u64("enable_bw_vote", 0644, debugfs_root, &mgr->enable_bw_vote)) { SDEROT_WARN("failed to create enable_bw_vote\n"); return -EINVAL; } if (mgr->ops_hw_create_debugfs) { ret = mgr->ops_hw_create_debugfs(mgr, debugfs_root); if (ret) Loading drivers/media/platform/msm/sde/rotator/sde_rotator_r3.c +1 −0 Original line number Diff line number Diff line Loading @@ -2210,6 +2210,7 @@ static int sde_rotator_hw_rev_init(struct sde_hw_rotator *rot) /* features exposed via mdss h/w version */ if (IS_SDE_MAJOR_MINOR_SAME(mdata->mdss_version, SDE_MDP_HW_REV_400)) { SDEROT_DBG("Supporting sys cache inline rotation\n"); set_bit(SDE_CAPS_MIN_BUS_VOTE, mdata->sde_caps_map); set_bit(SDE_CAPS_SBUF_1, mdata->sde_caps_map); rot->inpixfmts = sde_hw_rotator_v4_inpixfmts; rot->num_inpixfmt = ARRAY_SIZE(sde_hw_rotator_v4_inpixfmts); Loading Loading
drivers/media/platform/msm/sde/rotator/sde_rotator_base.h +2 −0 Original line number Diff line number Diff line Loading @@ -96,6 +96,7 @@ enum sde_rot_type { * @SDE_CAPS_R1_WB: MDSS V1.x WB block * @SDE_CAPS_R3_WB: MDSS V3.x WB block * @SDE_CAPS_R3_1P5_DOWNSCALE: 1.5x downscale rotator support * @SDE_CAPS_MIN_BUS_VOTE: minimum bus vote prior to power enable * @SDE_CAPS_SBUF_1: stream buffer support for inline rotation */ enum sde_caps_settings { Loading @@ -103,6 +104,7 @@ enum sde_caps_settings { SDE_CAPS_R3_WB, SDE_CAPS_R3_1P5_DOWNSCALE, SDE_CAPS_SEC_ATTACH_DETACH_SMMU, SDE_CAPS_MIN_BUS_VOTE, SDE_CAPS_SBUF_1, SDE_CAPS_MAX, }; Loading
drivers/media/platform/msm/sde/rotator/sde_rotator_core.c +19 −0 Original line number Diff line number Diff line Loading @@ -67,6 +67,8 @@ #define ROT_OVERHEAD_NUMERATOR 27 #define ROT_OVERHEAD_DENOMINATOR 10000 /* default minimum bandwidth vote */ #define ROT_ENABLE_BW_VOTE 64000 /* * Max rotator hw blocks possible. Used for upper array limits instead of * alloc and freeing small array Loading Loading @@ -96,6 +98,9 @@ static struct msm_bus_scale_pdata rot_reg_bus_scale_table = { .active_only = 1, }; /* forward prototype */ static int sde_rotator_update_perf(struct sde_rot_mgr *mgr); static int sde_rotator_bus_scale_set_quota(struct sde_rot_bus_data_type *bus, u64 quota) { Loading Loading @@ -292,6 +297,7 @@ static int sde_rotator_update_clk(struct sde_rot_mgr *mgr) static void sde_rotator_footswitch_ctrl(struct sde_rot_mgr *mgr, bool on) { struct sde_rot_data_type *mdata = sde_rot_get_mdata(); int ret; if (WARN_ON(mgr->regulator_enable == on)) { Loading @@ -302,6 +308,11 @@ static void sde_rotator_footswitch_ctrl(struct sde_rot_mgr *mgr, bool on) SDEROT_EVTLOG(on); SDEROT_DBG("%s: rotator regulators\n", on ? "Enable" : "Disable"); if (test_bit(SDE_CAPS_MIN_BUS_VOTE, mdata->sde_caps_map) && on) { mgr->minimum_bw_vote = mgr->enable_bw_vote; sde_rotator_update_perf(mgr); } if (mgr->ops_hw_pre_pmevent) mgr->ops_hw_pre_pmevent(mgr, on); Loading @@ -316,6 +327,11 @@ static void sde_rotator_footswitch_ctrl(struct sde_rot_mgr *mgr, bool on) if (mgr->ops_hw_post_pmevent) mgr->ops_hw_post_pmevent(mgr, on); if (test_bit(SDE_CAPS_MIN_BUS_VOTE, mdata->sde_caps_map) && !on) { mgr->minimum_bw_vote = 0; sde_rotator_update_perf(mgr); } mgr->regulator_enable = on; } Loading Loading @@ -1323,6 +1339,7 @@ static int sde_rotator_update_perf(struct sde_rot_mgr *mgr) } total_bw += mgr->pending_close_bw_vote; total_bw = max_t(u64, total_bw, mgr->minimum_bw_vote); sde_rotator_enable_reg_bus(mgr, total_bw); ATRACE_INT("bus_quota", total_bw); sde_rotator_bus_scale_set_quota(&mgr->data_bus, total_bw); Loading Loading @@ -2794,6 +2811,7 @@ int sde_rotator_core_init(struct sde_rot_mgr **pmgr, mgr->pdev = pdev; mgr->device = &pdev->dev; mgr->pending_close_bw_vote = 0; mgr->enable_bw_vote = ROT_ENABLE_BW_VOTE; mgr->hwacquire_timeout = ROT_HW_ACQUIRE_TIMEOUT_IN_MS; mgr->queue_count = 1; mgr->pixel_per_clk.numer = ROT_PIXEL_PER_CLK_NUMERATOR; Loading Loading @@ -3013,6 +3031,7 @@ int sde_rotator_pm_suspend(struct device *dev) sde_rot_mgr_lock(mgr); atomic_inc(&mgr->device_suspended); sde_rotator_suspend_cancel_rot_work(mgr); mgr->minimum_bw_vote = 0; sde_rotator_update_perf(mgr); ATRACE_END("pm_active"); SDEROT_DBG("end pm active %d\n", atomic_read(&mgr->device_suspended)); Loading
drivers/media/platform/msm/sde/rotator/sde_rotator_core.h +4 −0 Original line number Diff line number Diff line Loading @@ -367,6 +367,8 @@ struct sde_rot_bus_data_type { * @doneq: array of rotator done queue corresponding to hardware queue * @file_list: list of all sessions managed by rotator manager * @pending_close_bw_vote: bandwidth of closed sessions with pending work * @minimum_bw_vote: minimum bandwidth required for current use case * @enable_bw_vote: minimum bandwidth required for power enable * @data_bus: data bus configuration state * @reg_bus: register bus configuration state * @module_power: power/clock configuration state Loading Loading @@ -406,6 +408,8 @@ struct sde_rot_mgr { struct list_head file_list; u64 pending_close_bw_vote; u64 minimum_bw_vote; u64 enable_bw_vote; struct sde_rot_bus_data_type data_bus; struct sde_rot_bus_data_type reg_bus; Loading
drivers/media/platform/msm/sde/rotator/sde_rotator_debug.c +6 −0 Original line number Diff line number Diff line Loading @@ -868,6 +868,12 @@ static int sde_rotator_core_create_debugfs( return -EINVAL; } if (!debugfs_create_u64("enable_bw_vote", 0644, debugfs_root, &mgr->enable_bw_vote)) { SDEROT_WARN("failed to create enable_bw_vote\n"); return -EINVAL; } if (mgr->ops_hw_create_debugfs) { ret = mgr->ops_hw_create_debugfs(mgr, debugfs_root); if (ret) Loading
drivers/media/platform/msm/sde/rotator/sde_rotator_r3.c +1 −0 Original line number Diff line number Diff line Loading @@ -2210,6 +2210,7 @@ static int sde_rotator_hw_rev_init(struct sde_hw_rotator *rot) /* features exposed via mdss h/w version */ if (IS_SDE_MAJOR_MINOR_SAME(mdata->mdss_version, SDE_MDP_HW_REV_400)) { SDEROT_DBG("Supporting sys cache inline rotation\n"); set_bit(SDE_CAPS_MIN_BUS_VOTE, mdata->sde_caps_map); set_bit(SDE_CAPS_SBUF_1, mdata->sde_caps_map); rot->inpixfmts = sde_hw_rotator_v4_inpixfmts; rot->num_inpixfmt = ARRAY_SIZE(sde_hw_rotator_v4_inpixfmts); Loading