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

Commit 697315b0 authored by qctecmdr's avatar qctecmdr Committed by Gerrit - the friendly Code Review server
Browse files

Merge "disp: msm: sde: correct line time to include compression ratio"

parents a6128a06 7401ef19
Loading
Loading
Loading
Loading
+18 −0
Original line number Diff line number Diff line
@@ -255,6 +255,8 @@ struct sde_crtc_misr_info {
 * @ltm_buffer_lock : muttx to protect ltm_buffers allcation and free
 * @ltm_lock        : Spinlock to protect ltm buffer_cnt, hist_en and ltm lists
 * @needs_hw_reset  : Initiate a hw ctl reset
 * @src_bpp         : source bpp used to calculate compression ratio
 * @target_bpp      : target bpp used to calculate compression ratio
 */
struct sde_crtc {
	struct drm_crtc base;
@@ -337,6 +339,9 @@ struct sde_crtc {
	struct mutex ltm_buffer_lock;
	spinlock_t ltm_lock;
	bool needs_hw_reset;

	int src_bpp;
	int target_bpp;
};

#define to_sde_crtc(x) container_of(x, struct sde_crtc, base)
@@ -830,4 +835,17 @@ void sde_crtc_misr_setup(struct drm_crtc *crtc, bool enable, u32 frame_count);
void sde_crtc_get_misr_info(struct drm_crtc *crtc,
		struct sde_crtc_misr_info *crtc_misr_info);

/**
 * sde_crtc_set_bpp - set src and target bpp values
 * @sde_crtc: Pointer to sde crtc struct
 * @src_bpp: source bpp value to be stored
 * @target_bpp: target value to be stored
 */
static inline void sde_crtc_set_bpp(struct sde_crtc *sde_crtc, int src_bpp,
		int target_bpp)
{
	sde_crtc->src_bpp = src_bpp;
	sde_crtc->target_bpp = target_bpp;
}

#endif /* _SDE_CRTC_H_ */
+2 −0
Original line number Diff line number Diff line
@@ -2134,6 +2134,8 @@ static void sde_encoder_virt_mode_set(struct drm_encoder *drm_enc,
	/* store the mode_info */
	sde_connector_state_get_mode_info(conn->state, &sde_enc->mode_info);

	sde_encoder_dce_set_bpp(sde_enc->mode_info, sde_enc->crtc);

	/* release resources before seamless mode change */
	if (msm_is_mode_seamless_dms(adj_mode) ||
			(msm_is_mode_seamless_dyn_clk(adj_mode) &&
+40 −0
Original line number Diff line number Diff line
@@ -842,6 +842,46 @@ void _dce_helper_flush_vdc(struct sde_encoder_virt *sde_enc)
	}
}

void sde_encoder_dce_set_bpp(struct msm_mode_info mode_info,
		struct drm_crtc *crtc)
{
	struct sde_crtc *sde_crtc = to_sde_crtc(crtc);
	enum msm_display_compression_type comp_type;
	int src_bpp, target_bpp;

	if (!sde_crtc) {
		SDE_DEBUG("invalid sde_crtc\n");
		return;
	}

	comp_type = mode_info.comp_info.comp_type;
	/**
	 * In cases where DSC or VDC compression type is not found, set
	 * src and target bpp to get compression ratio 8/8 (default).
	 */
	if (comp_type == MSM_DISPLAY_COMPRESSION_DSC) {
		struct msm_display_dsc_info dsc_info =
				mode_info.comp_info.dsc_info;
		src_bpp = msm_get_src_bpc(dsc_info.chroma_format,
				dsc_info.config.bits_per_component);
		target_bpp = dsc_info.config.bits_per_pixel >> 4;
	} else if (comp_type == MSM_DISPLAY_COMPRESSION_VDC) {
		struct msm_display_vdc_info vdc_info =
				mode_info.comp_info.vdc_info;
		src_bpp = msm_get_src_bpc(vdc_info.chroma_format,
				vdc_info.bits_per_component);
		target_bpp = vdc_info.bits_per_pixel >> 4;
	} else {
		src_bpp = 8;
		target_bpp = 8;
	}

	sde_crtc_set_bpp(sde_crtc, src_bpp, target_bpp);

	SDE_DEBUG("sde_crtc src_bpp = %d, target_bpp = %d\n",
			sde_crtc->src_bpp, sde_crtc->target_bpp);
}

void sde_encoder_dce_disable(struct sde_encoder_virt *sde_enc)
{
	enum msm_display_compression_type comp_type;
+8 −0
Original line number Diff line number Diff line
@@ -8,6 +8,14 @@

#include "sde_encoder.h"

/**
 * sde_encoder_dce_set_bpp : set src_bpp and target_bpp in sde_crtc
 * @msm_mode_info: Mode info
 * @crtc: Pointer to drm crtc structure
 */
void sde_encoder_dce_set_bpp(
		struct msm_mode_info mode_info, struct drm_crtc *crtc);

/**
 * sde_encoder_dce_disable : function to disable compression
 * @sde_enc: pointer to virtual encoder structure
+9 −4
Original line number Diff line number Diff line
@@ -549,9 +549,12 @@ uint32_t sde_copy_formats(
/**
 * sde_get_linetime   - returns the line time for a given mode
 * @mode:          pointer to drm mode to calculate the line time
 * @src_bpp:       source bpp
 * @target_bpp:    target bpp
 * Return:         line time of display mode in nS
 */
uint32_t sde_get_linetime(struct drm_display_mode *mode)
uint32_t sde_get_linetime(struct drm_display_mode *mode,
		int src_bpp, int target_bpp)
{
	u64 pclk_rate;
	u32 pclk_period;
@@ -570,10 +573,12 @@ uint32_t sde_get_linetime(struct drm_display_mode *mode)
	}

	/*
	 * Line time calculation based on Pixel clock and HTOTAL.
	 * Final unit is in ns.
	 * Line time calculation based on Pixel clock, HTOTAL, and comp_ratio.
	 * Compression ratio found by src_bpp/target_bpp. Final unit is in ns.
	 */
	line_time = (pclk_period * mode->htotal) / 1000;
	line_time = pclk_period * mode->htotal;
	line_time = DIV_ROUND_UP(mult_frac(line_time, target_bpp,
			src_bpp), 1000);
	if (line_time == 0) {
		SDE_ERROR("line time calculation is 0\n");
		return 0;
Loading