void mdss_vbif_qos_remapper_setup(struct msm_panel_info *pinfo)
{
	uint32_t mask, reg_val, i;
	uint32_t left_pipe_xin_id, right_pipe_xin_id;
	uint32_t mdp_hw_rev = readl(MDP_HW_REV);
	uint32_t vbif_qos[4] = {0, 0, 0, 0};
	uint32_t vbif_offset;

	mdp_select_pipe_xin_id(pinfo,
			&left_pipe_xin_id, &right_pipe_xin_id);

	if (MDSS_IS_MAJOR_MINOR_MATCHING(mdp_hw_rev, MDSS_MDP_HW_REV_106) ||
		 MDSS_IS_MAJOR_MINOR_MATCHING(mdp_hw_rev, MDSS_MDP_HW_REV_108) ||
		 MDSS_IS_MAJOR_MINOR_MATCHING(mdp_hw_rev, MDSS_MDP_HW_REV_112)) {
		vbif_qos[0] = 2;
		vbif_qos[1] = 2;
		vbif_qos[2] = 2;
		vbif_qos[3] = 2;
	} else if (MDSS_IS_MAJOR_MINOR_MATCHING(mdp_hw_rev, MDSS_MDP_HW_REV_105) ||
		 MDSS_IS_MAJOR_MINOR_MATCHING(mdp_hw_rev, MDSS_MDP_HW_REV_109) ||
		 MDSS_IS_MAJOR_MINOR_MATCHING(mdp_hw_rev, MDSS_MDP_HW_REV_107) ||
		 MDSS_IS_MAJOR_MINOR_MATCHING(mdp_hw_rev, MDSS_MDP_HW_REV_110)) {
		vbif_qos[0] = 1;
		vbif_qos[1] = 2;
		vbif_qos[2] = 2;
		vbif_qos[3] = 2;
	} else {
		return;
	}

	vbif_offset = mdss_mdp_vbif_qos_remap_get_offset();

	for (i = 0; i < 4; i++) {
		/* VBIF_VBIF_QOS_REMAP_00 */
		reg_val = readl(REG_MDP(vbif_offset) + i*4);
		mask = 0x3 << (left_pipe_xin_id * 2);
		reg_val &= ~(mask);
		reg_val |= vbif_qos[i] << (left_pipe_xin_id * 2);

		if (pinfo->lcdc.dual_pipe) {
			mask = 0x3 << (right_pipe_xin_id * 2);
			reg_val &= ~(mask);
			reg_val |= vbif_qos[i] << (right_pipe_xin_id * 2);
		}
		writel(reg_val, REG_MDP(vbif_offset) + i*4);
	}
}
示例#2
0
int mdp_dsi_cmd_config(struct msm_panel_info *pinfo,
                struct fbcon_config *fb)
{
	uint32_t intf_sel, sintf_sel;
	uint32_t intf_base, sintf_base;
	uint32_t reg;
	int ret = NO_ERROR;
	uint32_t left_pipe, right_pipe;

	struct lcdc_panel_info *lcdc = NULL;

	if (pinfo == NULL)
		return ERR_INVALID_ARGS;

	lcdc =  &(pinfo->lcdc);
	if (lcdc == NULL)
		return ERR_INVALID_ARGS;

	mdp_set_intf_base(pinfo, &intf_sel, &sintf_sel, &intf_base, &sintf_base);

	if (pinfo->lcdc.split_display) {
		reg = BIT(1); /* Command mode */
		if (pinfo->lcdc.dst_split)
			reg |= BIT(2); /* Enable SMART_PANEL_FREE_RUN mode */
		if (pinfo->lcdc.pipe_swap)
			reg |= BIT(4); /* Use intf2 as trigger */
		else
			reg |= BIT(8); /* Use intf1 as trigger */
		writel(reg, MDP_REG_SPLIT_DISPLAY_UPPER_PIPE_CTL);
		writel(reg, MDP_REG_SPLIT_DISPLAY_LOWER_PIPE_CTL);
		writel(0x1, MDP_REG_SPLIT_DISPLAY_EN);
	}

	if (pinfo->lcdc.dst_split) {
		uint32_t ppb_offset = mdss_mdp_get_ppb_offset();
		writel(BIT(16) | BIT(20) | BIT(21), REG_MDP(ppb_offset + 0x4)); /* MMSS_MDP_PPB0_CNTL */
		writel(BIT(5), REG_MDP(ppb_offset)); /* MMSS_MDP_PPB0_CONFIG */
	}

	mdp_clk_gating_ctrl();

	if (pinfo->mipi.dual_dsi)
		intf_sel |= sintf_sel; /* INTF 2 enable */

	writel(intf_sel, MDP_DISP_INTF_SEL);

	mdp_select_pipe_type(pinfo, &left_pipe, &right_pipe);
	mdss_vbif_setup();
	mdss_smp_setup(pinfo, left_pipe, right_pipe);
	mdss_qos_remapper_setup();
	mdss_vbif_qos_remapper_setup(pinfo);

	mdss_source_pipe_config(fb, pinfo, left_pipe);

	if (pinfo->lcdc.dual_pipe)
		mdss_source_pipe_config(fb, pinfo, right_pipe);

	mdss_layer_mixer_setup(fb, pinfo);

	writel(0x213F, MDP_PANEL_FORMAT + intf_base);
	reg = 0x21f00 | mdss_mdp_ctl_out_sel(pinfo, 1);
	writel(reg, MDP_CTL_0_BASE + CTL_TOP);

	if (pinfo->fbc.enabled)
		mdss_fbc_cfg(pinfo);

	if (pinfo->mipi.dual_dsi) {
		writel(0x213F, sintf_base + MDP_PANEL_FORMAT);
		if (!pinfo->lcdc.dst_split) {
			reg = 0x21f00 | mdss_mdp_ctl_out_sel(pinfo, 0);
			writel(reg, MDP_CTL_1_BASE + CTL_TOP);
		}
	}

	return ret;
}
示例#3
0
static void mdss_intf_tg_setup(struct msm_panel_info *pinfo, uint32_t intf_base)
{
	uint32_t hsync_period, vsync_period;
	uint32_t hsync_start_x, hsync_end_x;
	uint32_t display_hctl, hsync_ctl, display_vstart, display_vend;
	uint32_t adjust_xres = 0;

	struct lcdc_panel_info *lcdc = NULL;
	struct intf_timing_params itp = {0};

	if (pinfo == NULL)
		return;

	lcdc =  &(pinfo->lcdc);
	if (lcdc == NULL)
		return;

	adjust_xres = pinfo->xres;
	if (pinfo->lcdc.split_display) {
		adjust_xres /= 2;
		if (intf_base == (MDP_INTF_1_BASE + mdss_mdp_intf_offset())) {
			writel(BIT(8), MDP_REG_SPLIT_DISPLAY_LOWER_PIPE_CTL);
			writel(BIT(8), MDP_REG_SPLIT_DISPLAY_UPPER_PIPE_CTL);
			writel(0x1, MDP_REG_SPLIT_DISPLAY_EN);
		}
	}

	if (pinfo->lcdc.dst_split &&  (intf_base == (MDP_INTF_1_BASE + mdss_mdp_intf_offset()))) {
		uint32_t ppb_offset = mdss_mdp_get_ppb_offset();
		writel(BIT(16), REG_MDP(ppb_offset + 0x4)); /* MMSS_MDP_PPB0_CNTL */
		writel(BIT(5), REG_MDP(ppb_offset)); /* MMSS_MDP_PPB0_CONFIG */
	}

	if (!pinfo->fbc.enabled || !pinfo->fbc.comp_ratio)
		pinfo->fbc.comp_ratio = 1;

	itp.xres = (adjust_xres / pinfo->fbc.comp_ratio);
	itp.yres = pinfo->yres;
	itp.width =((adjust_xres + pinfo->lcdc.xres_pad) / pinfo->fbc.comp_ratio);
	itp.height = pinfo->yres + pinfo->lcdc.yres_pad;
	itp.h_back_porch = pinfo->lcdc.h_back_porch;
	itp.h_front_porch = pinfo->lcdc.h_front_porch;
	itp.v_back_porch =  pinfo->lcdc.v_back_porch;
	itp.v_front_porch = pinfo->lcdc.v_front_porch;
	itp.hsync_pulse_width = pinfo->lcdc.h_pulse_width;
	itp.vsync_pulse_width = pinfo->lcdc.v_pulse_width;

	itp.border_clr = pinfo->lcdc.border_clr;
	itp.underflow_clr = pinfo->lcdc.underflow_clr;
	itp.hsync_skew = pinfo->lcdc.hsync_skew;

	hsync_period = itp.hsync_pulse_width + itp.h_back_porch +
			itp.width + itp.h_front_porch;

	vsync_period = itp.vsync_pulse_width + itp.v_back_porch +
			itp.height + itp.v_front_porch;

	hsync_start_x =
		itp.hsync_pulse_width +
		itp.h_back_porch;
	hsync_end_x =
		hsync_period - itp.h_front_porch - 1;

	display_vstart = (itp.vsync_pulse_width +
			itp.v_back_porch)
		* hsync_period + itp.hsync_skew;
	display_vend = ((vsync_period - itp.v_front_porch) * hsync_period)
		+ itp.hsync_skew - 1;

	if (intf_base == (MDP_INTF_0_BASE + mdss_mdp_intf_offset())) { /* eDP */
		display_vstart += itp.hsync_pulse_width + itp.h_back_porch;
		display_vend -= itp.h_front_porch;
	}

	hsync_ctl = (hsync_period << 16) | itp.hsync_pulse_width;
	display_hctl = (hsync_end_x << 16) | hsync_start_x;

	writel(hsync_ctl, MDP_HSYNC_CTL + intf_base);
	writel(vsync_period*hsync_period, MDP_VSYNC_PERIOD_F0 +
			intf_base);
	writel(0x00, MDP_VSYNC_PERIOD_F1 + intf_base);
	writel(itp.vsync_pulse_width*hsync_period,
			MDP_VSYNC_PULSE_WIDTH_F0 +
			intf_base);
	writel(0x00, MDP_VSYNC_PULSE_WIDTH_F1 + intf_base);
	writel(display_hctl, MDP_DISPLAY_HCTL + intf_base);
	writel(display_vstart, MDP_DISPLAY_V_START_F0 +
			intf_base);
	writel(0x00, MDP_DISPLAY_V_START_F1 + intf_base);
	writel(display_vend, MDP_DISPLAY_V_END_F0 +
			intf_base);
	writel(0x00, MDP_DISPLAY_V_END_F1 + intf_base);
	writel(0x00, MDP_ACTIVE_HCTL + intf_base);
	writel(0x00, MDP_ACTIVE_V_START_F0 + intf_base);
	writel(0x00, MDP_ACTIVE_V_START_F1 + intf_base);
	writel(0x00, MDP_ACTIVE_V_END_F0 + intf_base);
	writel(0x00, MDP_ACTIVE_V_END_F1 + intf_base);
	writel(0xFF, MDP_UNDERFFLOW_COLOR + intf_base);

	if (intf_base == (MDP_INTF_0_BASE + mdss_mdp_intf_offset())) /* eDP */
		writel(0x212A, MDP_PANEL_FORMAT + intf_base);
	else
		writel(0x213F, MDP_PANEL_FORMAT + intf_base);
}