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

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

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

parents f0d4d74c 52855c70
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
@@ -411,7 +411,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)
@@ -662,7 +664,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)
@@ -1903,8 +1905,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;
@@ -1930,7 +1933,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;

@@ -2046,7 +2049,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;
@@ -2055,8 +2058,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);

@@ -3261,7 +3262,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);
@@ -4642,7 +4643,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;
@@ -5499,7 +5499,8 @@ struct drm_encoder *sde_encoder_init_with_ops(
	}
	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