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

Commit cba5a14a authored by Linux Build Service Account's avatar Linux Build Service Account Committed by Gerrit - the friendly Code Review server
Browse files

Merge "drm/msm/sde: enable solver after enabling the vsync on interface" into msm-4.9

parents 7a3602fb 30fae8ad
Loading
Loading
Loading
Loading
+1 −2
Original line number Diff line number Diff line
@@ -1459,7 +1459,7 @@ static void sde_crtc_atomic_flush(struct drm_crtc *crtc,
				continue;

			cstate->rsc_client =
				sde_encoder_update_rsc_client(encoder, true);
				sde_encoder_get_rsc_client(encoder);
		}
		cstate->rsc_update = true;
	}
@@ -1796,7 +1796,6 @@ static void sde_crtc_disable(struct drm_crtc *crtc)
		if (encoder->crtc != crtc)
			continue;
		sde_encoder_register_frame_event_callback(encoder, NULL, NULL);
		sde_encoder_update_rsc_client(encoder, false);
		cstate->rsc_client = NULL;
		cstate->rsc_update = false;
	}
+69 −51
Original line number Diff line number Diff line
@@ -656,6 +656,71 @@ static int _sde_encoder_dsc_setup(struct sde_encoder_virt *sde_enc)
	return ret;
}

static int sde_encoder_update_rsc_client(
		struct drm_encoder *drm_enc, bool enable)
{
	struct sde_encoder_virt *sde_enc;
	enum sde_rsc_state rsc_state;
	struct sde_rsc_cmd_config rsc_config;
	int ret;
	struct msm_display_info *disp_info;

	if (!drm_enc) {
		SDE_ERROR("invalid encoder\n");
		return -EINVAL;
	}

	sde_enc = to_sde_encoder_virt(drm_enc);
	disp_info = &sde_enc->disp_info;

	/**
	 * only primary command mode panel can request CMD state.
	 * all other panels/displays can request for VID state including
	 * secondary command mode panel.
	 */
	rsc_state = enable ?
		(((disp_info->capabilities & MSM_DISPLAY_CAP_CMD_MODE) &&
		  disp_info->is_primary) ? SDE_RSC_CMD_STATE :
		SDE_RSC_VID_STATE) : SDE_RSC_IDLE_STATE;

	if (rsc_state != SDE_RSC_IDLE_STATE && !sde_enc->rsc_state_update
					&& disp_info->is_primary) {
		rsc_config.fps = disp_info->frame_rate;
		rsc_config.vtotal = disp_info->vtotal;
		rsc_config.prefill_lines = disp_info->prefill_lines;
		rsc_config.jitter = disp_info->jitter;
		/* update it only once */
		sde_enc->rsc_state_update = true;

		ret = sde_rsc_client_state_update(sde_enc->rsc_client,
			rsc_state, &rsc_config,
			drm_enc->crtc ? drm_enc->crtc->index : -1);
	} else {
		ret = sde_rsc_client_state_update(sde_enc->rsc_client,
			rsc_state, NULL,
			drm_enc->crtc ? drm_enc->crtc->index : -1);
	}

	if (ret)
		SDE_ERROR("sde rsc client update failed ret:%d\n", ret);

	return ret;
}

struct sde_rsc_client *sde_encoder_get_rsc_client(struct drm_encoder *drm_enc)
{
	struct sde_encoder_virt *sde_enc;
	struct msm_display_info *disp_info;

	if (!drm_enc)
		return NULL;

	sde_enc = to_sde_encoder_virt(drm_enc);
	disp_info = &sde_enc->disp_info;

	return disp_info->is_primary ? sde_enc->rsc_client : NULL;
}

static void sde_encoder_virt_mode_set(struct drm_encoder *drm_enc,
				      struct drm_display_mode *mode,
				      struct drm_display_mode *adj_mode)
@@ -778,6 +843,8 @@ static void sde_encoder_virt_enable(struct drm_encoder *drm_enc)
		}
	}

	sde_encoder_update_rsc_client(drm_enc, true);

	if (!sde_enc->cur_master)
		SDE_ERROR("virt encoder has no master! num_phys %d\n", i);
	else if (sde_enc->cur_master->ops.enable)
@@ -833,6 +900,8 @@ static void sde_encoder_virt_disable(struct drm_encoder *drm_enc)
		del_timer_sync(&sde_enc->frame_done_timer);
	}

	sde_encoder_update_rsc_client(drm_enc, false);

	if (sde_enc->cur_master && sde_enc->cur_master->ops.disable)
		sde_enc->cur_master->ops.disable(sde_enc->cur_master);

@@ -927,57 +996,6 @@ void sde_encoder_register_vblank_callback(struct drm_encoder *drm_enc,
	}
}

struct sde_rsc_client *sde_encoder_update_rsc_client(
		struct drm_encoder *drm_enc, bool enable)
{
	struct sde_encoder_virt *sde_enc;
	enum sde_rsc_state rsc_state;
	struct sde_rsc_cmd_config rsc_config;
	int ret;
	struct msm_display_info *disp_info;

	if (!drm_enc) {
		SDE_ERROR("invalid encoder\n");
		return NULL;
	}

	sde_enc = to_sde_encoder_virt(drm_enc);
	disp_info = &sde_enc->disp_info;

	/**
	 * only primary command mode panel can request CMD state.
	 * all other panels/displays can request for VID state including
	 * secondary command mode panel.
	 */
	rsc_state = enable ?
		(((disp_info->capabilities & MSM_DISPLAY_CAP_CMD_MODE) &&
		  disp_info->is_primary) ? SDE_RSC_CMD_STATE :
		SDE_RSC_VID_STATE) : SDE_RSC_IDLE_STATE;

	if (rsc_state != SDE_RSC_IDLE_STATE && !sde_enc->rsc_state_update
					&& disp_info->is_primary) {
		rsc_config.fps = disp_info->frame_rate;
		rsc_config.vtotal = disp_info->vtotal;
		rsc_config.prefill_lines = disp_info->prefill_lines;
		rsc_config.jitter = disp_info->jitter;
		/* update it only once */
		sde_enc->rsc_state_update = true;

		ret = sde_rsc_client_state_update(sde_enc->rsc_client,
			rsc_state, &rsc_config,
			drm_enc->crtc ? drm_enc->crtc->index : -1);
	} else {
		ret = sde_rsc_client_state_update(sde_enc->rsc_client,
			rsc_state, NULL,
			drm_enc->crtc ? drm_enc->crtc->index : -1);
	}

	if (ret)
		SDE_ERROR("sde rsc client update failed ret:%d\n", ret);

	return sde_enc->disp_info.is_primary ? sde_enc->rsc_client : NULL;
}

void sde_encoder_register_frame_event_callback(struct drm_encoder *drm_enc,
		void (*frame_event_cb)(void *, u32 event),
		void *frame_event_cb_data)
+2 −4
Original line number Diff line number Diff line
@@ -83,13 +83,11 @@ void sde_encoder_register_frame_event_callback(struct drm_encoder *encoder,
		void (*cb)(void *, u32), void *data);

/**
 * sde_encoder_update_rsc_client - updates the rsc client state for primary
 * sde_encoder_get_rsc_client - gets the rsc client state for primary
 *      for primary display.
 * @encoder:	encoder pointer
 * @enable:	enable/disable the client
 */
struct sde_rsc_client *sde_encoder_update_rsc_client(
		struct drm_encoder *encoder, bool enable);
struct sde_rsc_client *sde_encoder_get_rsc_client(struct drm_encoder *encoder);

/**
 * sde_encoder_prepare_for_kickoff - schedule double buffer flip of the ctl