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

Commit 52855c70 authored by Nilaan Gunabalachandran's avatar Nilaan Gunabalachandran Committed by Gerrit - the friendly Code Review server
Browse files

disp: msm: sde: dynamic lm reservation for secondary disp



Primary and secondary displays should have first priority
when reserving lms. Static reservation can potentially block
higher resolutions for the required displays. This patch gets
the layer mixer requirement for primary or secondary display
if available. It reserves those layer mixers dynamically
for the respective display when connector is registered.

Change-Id: Id69dac4c72d6b20008049f4aeb71c0f97d0a426b
Signed-off-by: default avatarNilaan Gunabalachandran <ngunabal@codeaurora.org>
parent 06f8bcc1
Loading
Loading
Loading
Loading
+6 −5
Original line number Diff line number Diff line
@@ -5075,9 +5075,9 @@ static int dsi_display_ext_get_info(struct drm_connector *connector,
	info->is_connected = connector->status != connector_status_disconnected;

	if (!strcmp(display->display_type, "primary"))
		info->is_primary = true;
	else
		info->is_primary = false;
		info->display_type = SDE_CONNECTOR_PRIMARY;
	else if (!strcmp(display->display_type, "secondary"))
		info->display_type = SDE_CONNECTOR_SECONDARY;

	info->capabilities |= (MSM_DISPLAY_CAP_VID_MODE |
			MSM_DISPLAY_CAP_EDID | MSM_DISPLAY_CAP_HOT_PLUG);
@@ -5431,10 +5431,11 @@ int dsi_display_get_info(struct drm_connector *connector,
		info->h_tile_instance[i] = display->ctrl[i].ctrl->cell_index;

	info->is_connected = true;
	info->is_primary = false;

	if (!strcmp(display->display_type, "primary"))
		info->is_primary = true;
		info->display_type = SDE_CONNECTOR_PRIMARY;
	else if (!strcmp(display->display_type, "secondary"))
		info->display_type = SDE_CONNECTOR_SECONDARY;

	info->width_mm = phy_props.panel_width_mm;
	info->height_mm = phy_props.panel_height_mm;
+2 −2
Original line number Diff line number Diff line
@@ -486,7 +486,7 @@ struct msm_mode_info {
 * @max_height:         Max height of display. In case of hot pluggable display
 *                      this is max height supported by controller
 * @clk_rate:           DSI bit clock per lane in HZ.
 * @is_primary:         Set to true if display is primary display
 * @display_type:       Enum for type of display
 * @is_te_using_watchdog_timer:  Boolean to indicate watchdog TE is
 *				 used instead of panel TE in cmd mode panels
 * @roi_caps:           Region of interest capability info
@@ -509,7 +509,7 @@ struct msm_display_info {
	uint32_t max_height;
	uint64_t clk_rate;

	bool is_primary;
	uint32_t display_type;
	bool is_te_using_watchdog_timer;
	struct msm_roi_caps roi_caps;

+10 −5
Original line number Diff line number Diff line
@@ -1533,8 +1533,8 @@ int sde_connector_helper_reset_custom_properties(
	return 0;
}

static int _sde_connector_primary_preference(struct sde_connector *sde_conn,
		struct sde_kms *sde_kms)
static int _sde_connector_lm_preference(struct sde_connector *sde_conn,
		 struct sde_kms *sde_kms, uint32_t disp_type)
{
	int ret = 0;
	u32 num_lm = 0;
@@ -1544,6 +1544,11 @@ static int _sde_connector_primary_preference(struct sde_connector *sde_conn,
		return -EINVAL;
	}

	if (!disp_type || disp_type >= SDE_CONNECTOR_MAX) {
		SDE_DEBUG("invalid display_type");
		return -EINVAL;
	}

	ret = sde_conn->ops.get_default_lms(sde_conn->display, &num_lm);
	if (ret || !num_lm) {
		SDE_DEBUG("failed to get default lm count");
@@ -1557,7 +1562,7 @@ static int _sde_connector_primary_preference(struct sde_connector *sde_conn,
		return -EINVAL;
	}

	sde_hw_mixer_set_preference(sde_kms->catalog, num_lm);
	sde_hw_mixer_set_preference(sde_kms->catalog, num_lm, disp_type);

	return ret;
}
@@ -2453,8 +2458,8 @@ struct drm_connector *sde_connector_init(struct drm_device *dev,
		goto error_destroy_property;
	}

	if (display_info.is_primary)
		_sde_connector_primary_preference(c_conn, sde_kms);
	_sde_connector_lm_preference(c_conn, sde_kms,
			display_info.display_type);

	SDE_DEBUG("connector %d attach encoder %d\n",
			c_conn->base.base.id, encoder->base.id);
+10 −0
Original line number Diff line number Diff line
@@ -314,6 +314,16 @@ struct sde_connector_ops {
	int (*get_default_lms)(void *display, u32 *num_lm);
};

/**
 * enum sde_connector_display_type - list of display types
 */
enum sde_connector_display {
	SDE_CONNECTOR_UNDEFINED,
	SDE_CONNECTOR_PRIMARY,
	SDE_CONNECTOR_SECONDARY,
	SDE_CONNECTOR_MAX
};

/**
 * enum sde_connector_events - list of recognized connector events
 */
+12 −11
Original line number Diff line number Diff line
@@ -408,7 +408,9 @@ bool sde_encoder_is_primary_display(struct drm_encoder *drm_enc)
{
	struct sde_encoder_virt *sde_enc = to_sde_encoder_virt(drm_enc);

	return sde_enc && sde_enc->disp_info.is_primary;
	return sde_enc &&
		(sde_enc->disp_info.display_type ==
		SDE_CONNECTOR_PRIMARY);
}

int sde_encoder_in_cont_splash(struct drm_encoder *drm_enc)
@@ -659,7 +661,7 @@ void sde_encoder_get_hw_resources(struct drm_encoder *drm_enc,

	sde_connector_get_mode_info(conn_state, &sde_enc->mode_info);
	hw_res->topology = sde_enc->mode_info.topology;
	hw_res->is_primary = sde_enc->disp_info.is_primary;
	hw_res->display_type = sde_enc->disp_info.display_type;
}

void sde_encoder_destroy(struct drm_encoder *drm_enc)
@@ -1900,8 +1902,9 @@ static int _sde_encoder_update_rsc_client(
		qsync_mode = sde_connector_get_qsync_mode(
				sde_enc->cur_master->connector);

	if (sde_encoder_in_clone_mode(drm_enc) || !disp_info->is_primary ||
			  (disp_info->is_primary && qsync_mode))
	if (sde_encoder_in_clone_mode(drm_enc) ||
			(disp_info->display_type != SDE_CONNECTOR_PRIMARY) ||
			(disp_info->display_type && qsync_mode))
		rsc_state = enable ? SDE_RSC_CLK_STATE : SDE_RSC_IDLE_STATE;
	else if (sde_encoder_check_curr_mode(drm_enc, MSM_DISPLAY_CMD_MODE))
		rsc_state = enable ? SDE_RSC_CMD_STATE : SDE_RSC_IDLE_STATE;
@@ -1927,7 +1930,7 @@ static int _sde_encoder_update_rsc_client(
	}

	if (rsc_state != SDE_RSC_IDLE_STATE && !sde_enc->rsc_state_init
			&& disp_info->is_primary) {
			&& (disp_info->display_type == SDE_CONNECTOR_PRIMARY)) {
		/* update it only once */
		sde_enc->rsc_state_init = true;

@@ -2043,7 +2046,7 @@ static int _sde_encoder_resource_control_helper(struct drm_encoder *drm_enc,
	struct sde_kms *sde_kms;
	struct sde_encoder_virt *sde_enc;
	int rc;
	bool is_cmd_mode = false, is_primary;
	bool is_cmd_mode = false;

	sde_enc = to_sde_encoder_virt(drm_enc);
	priv = drm_enc->dev->dev_private;
@@ -2052,8 +2055,6 @@ static int _sde_encoder_resource_control_helper(struct drm_encoder *drm_enc,
	if (sde_encoder_check_curr_mode(drm_enc, MSM_DISPLAY_CMD_MODE))
		is_cmd_mode = true;

	is_primary = sde_enc->disp_info.is_primary;

	SDE_DEBUG_ENC(sde_enc, "enable:%d\n", enable);
	SDE_EVT32(DRMID(drm_enc), enable);

@@ -3258,7 +3259,7 @@ static void sde_encoder_virt_disable(struct drm_encoder *drm_enc)
	 * they have been fully disabled, so delay the pre-stop operations
	 * until after the physical disable calls have returned.
	 */
	if (sde_enc->disp_info.is_primary &&
	if (sde_enc->disp_info.display_type == SDE_CONNECTOR_PRIMARY &&
	    (intf_mode == INTF_MODE_CMD || intf_mode == INTF_MODE_VIDEO)) {
		sde_encoder_resource_control(drm_enc,
				SDE_ENC_RC_EVENT_PRE_STOP);
@@ -4640,7 +4641,6 @@ int sde_encoder_prepare_for_kickoff(struct drm_encoder *drm_enc,
	SDE_ATRACE_BEGIN("sde_encoder_prepare_for_kickoff");
	for (i = 0; i < sde_enc->num_phys_encs; i++) {
		phys = sde_enc->phys_encs[i];
		params->is_primary = sde_enc->disp_info.is_primary;
		params->frame_trigger_mode = sde_enc->frame_trigger_mode;
		params->recovery_events_enabled =
					sde_enc->recovery_events_enabled;
@@ -5476,7 +5476,8 @@ struct drm_encoder *sde_encoder_init(
	}
	snprintf(name, SDE_NAME_SIZE, "rsc_enc%u", drm_enc->base.id);
	sde_enc->rsc_client = sde_rsc_client_create(SDE_RSC_INDEX, name,
		disp_info->is_primary ? SDE_RSC_PRIMARY_DISP_CLIENT :
		(disp_info->display_type == SDE_CONNECTOR_PRIMARY) ?
		SDE_RSC_PRIMARY_DISP_CLIENT :
		SDE_RSC_EXTERNAL_DISP_CLIENT, intf_index + 1);
	if (IS_ERR_OR_NULL(sde_enc->rsc_client)) {
		SDE_DEBUG("sde rsc client create failed :%ld\n",
Loading