Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e9028c3f authored by Ping Li's avatar Ping Li Committed by Stephen Boyd
Browse files

msm: mdss: Fix slower clocks during histogram and hist LUT accesses



Slower CNOC clock rates cause histogram and hist LUT access to take
longer time. Fix CNOC clock configuration at optimum rate in order
to avoid slow accesses to histogram and hist LUT.

Change-Id: I066bae9fd0b4261b71248cffea65d8949ff6aae2
Signed-off-by: default avatarPing Li <quicpingli@codeaurora.org>
parent 3ae3c1aa
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -123,6 +123,7 @@ struct mdss_data_type {
	void *video_intf;
	u32 nintf;

	u32 pp_bus_hdl;
	struct mdss_ad_info *ad_cfgs;
	u32 nad_cfgs;
	struct workqueue_struct *ad_calc_wq;
+20 −0
Original line number Diff line number Diff line
@@ -25,6 +25,7 @@

#include <mach/iommu_domains.h>
#include <mach/event_timer.h>
#include <mach/msm_bus.h>

#include "mdss.h"
#include "mdss_debug.h"
@@ -37,6 +38,9 @@
#define CHECK_BOUNDS(offset, size, max_size) \
	(((size) > (max_size)) || ((offset) > ((max_size) - (size))))

#define PP_CLK_CFG_OFF 0
#define PP_CLK_CFG_ON 1

static atomic_t ov_active_panels = ATOMIC_INIT(0);
static int mdss_mdp_overlay_free_fb_pipe(struct msm_fb_data_type *mfd);
static int mdss_mdp_overlay_fb_parse_dt(struct msm_fb_data_type *mfd);
@@ -1891,12 +1895,20 @@ static int mdss_mdp_histo_ioctl(struct msm_fb_data_type *mfd, u32 cmd,
	struct mdp_histogram_start_req hist_req;
	u32 block;
	struct mdss_overlay_private *mdp5_data = mfd_to_mdp5_data(mfd);
	u32 pp_bus_handle;
	static int req = -1;

	switch (cmd) {
	case MSMFB_HISTOGRAM_START:
		if (!mfd->panel_power_on)
			return -EPERM;

		pp_bus_handle = mdss_mdp_get_mdata()->pp_bus_hdl;
		req = msm_bus_scale_client_update_request(pp_bus_handle,
				PP_CLK_CFG_ON);
		if (req)
			pr_err("Updated pp_bus_scale failed, ret = %d", req);

		ret = copy_from_user(&hist_req, argp, sizeof(hist_req));
		if (ret)
			return ret;
@@ -1909,7 +1921,15 @@ static int mdss_mdp_histo_ioctl(struct msm_fb_data_type *mfd, u32 cmd,
		if (ret)
			return ret;

		pp_bus_handle = mdss_mdp_get_mdata()->pp_bus_hdl;
		ret = mdss_mdp_histogram_stop(mdp5_data->ctl, block);
		if (!req) {
			req = msm_bus_scale_client_update_request(pp_bus_handle,
				 PP_CLK_CFG_OFF);
			if (req)
				pr_err("Updated pp_bus_scale failed, ret = %d",
					req);
		}
		break;

	case MSMFB_HISTOGRAM:
+46 −0
Original line number Diff line number Diff line
@@ -19,6 +19,8 @@
#include <linux/uaccess.h>
#include <linux/spinlock.h>
#include <linux/delay.h>
#include <mach/msm_bus.h>
#include <mach/msm_bus_board.h>

struct mdp_csc_cfg mdp_csc_convert[MDSS_MDP_MAX_CSC] = {
	[MDSS_MDP_CSC_RGB2RGB] = {
@@ -226,6 +228,27 @@ static u32 igc_limited[IGC_LUT_ENTRIES] = {
#define SHARP_SMOOTH_THR_DEFAULT	8
#define SHARP_NOISE_THR_DEFAULT	2

#define MDP_PP_BUS_VECTOR_ENTRY(ab_val, ib_val)		\
	{						\
		.src = MSM_BUS_MASTER_SPDM,		\
		.dst = MSM_BUS_SLAVE_IMEM_CFG,		\
		.ab = (ab_val),				\
		.ib = (ib_val),				\
	}

#define SZ_37_5M (37500000 * 8)

static struct msm_bus_vectors mdp_pp_bus_vectors[] = {
	MDP_PP_BUS_VECTOR_ENTRY(0, 0),
	MDP_PP_BUS_VECTOR_ENTRY(0, SZ_37_5M),
};
static struct msm_bus_paths mdp_pp_bus_usecases[ARRAY_SIZE(mdp_pp_bus_vectors)];
static struct msm_bus_scale_pdata mdp_pp_bus_scale_table = {
	.usecase = mdp_pp_bus_usecases,
	.num_usecases = ARRAY_SIZE(mdp_pp_bus_usecases),
	.name = "mdss_pp",
};

struct mdss_pp_res_type {
	/* logical info */
	u32 pp_disp_flags[MDSS_BLOCK_DISP_NUM];
@@ -1283,6 +1306,7 @@ int mdss_mdp_pp_init(struct device *dev)
	int i, ret = 0;
	struct mdss_data_type *mdata = mdss_mdp_get_mdata();
	struct mdss_mdp_pipe *vig;
	struct msm_bus_scale_pdata *pp_bus_pdata;

	mutex_lock(&mdss_pp_mutex);
	if (!mdss_pp_res) {
@@ -1304,12 +1328,34 @@ int mdss_mdp_pp_init(struct device *dev)
			mutex_init(&vig[i].pp_res.hist.hist_mutex);
			spin_lock_init(&vig[i].pp_res.hist.hist_lock);
		}
		if (!mdata->pp_bus_hdl) {
			pp_bus_pdata = &mdp_pp_bus_scale_table;
			for (i = 0; i < pp_bus_pdata->num_usecases; i++) {
				mdp_pp_bus_usecases[i].num_paths = 1;
				mdp_pp_bus_usecases[i].vectors =
					&mdp_pp_bus_vectors[i];
			}

			mdata->pp_bus_hdl =
				msm_bus_scale_register_client(pp_bus_pdata);
			if (!mdata->pp_bus_hdl) {
				pr_err("not able to register pp_bus_scale\n");
				ret = -ENOMEM;
			}
			pr_debug("register pp_bus_hdl=%x\n", mdata->pp_bus_hdl);
		}

	}
	mutex_unlock(&mdss_pp_mutex);
	return ret;
}
void mdss_mdp_pp_term(struct device *dev)
{
	struct mdss_data_type *mdata = mdss_mdp_get_mdata();
	if (mdata->pp_bus_hdl) {
		msm_bus_scale_unregister_client(mdata->pp_bus_hdl);
		mdata->pp_bus_hdl = 0;
	}
	if (!mdss_pp_res) {
		mutex_lock(&mdss_pp_mutex);
		devm_kfree(dev, mdss_pp_res);