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

Commit d92000cd authored by Nilaan Gunabalachandran's avatar Nilaan Gunabalachandran
Browse files

disp: msm: add resource caps structure and api changes



Create a data structure to maintain available hardware resources
and track capabilities. This data structure is used to send
the current available resources and caps information to
connector ops get_mode_info, get_modes and validate_mode to
process the display mode.

Change-Id: If38fc628ee5ab4729821f88c0050ab45375187b8
Signed-off-by: default avatarNilaan Gunabalachandran <ngunabal@codeaurora.org>
parent dcea657c
Loading
Loading
Loading
Loading
+7 −6
Original line number Diff line number Diff line
@@ -357,7 +357,7 @@ int dp_connector_post_init(struct drm_connector *connector, void *display)
int dp_connector_get_mode_info(struct drm_connector *connector,
		const struct drm_display_mode *drm_mode,
		struct msm_mode_info *mode_info,
		u32 max_mixer_width, void *display)
		void *display, const struct msm_resource_caps_info *avail_res)
{
	const u32 dual_lm = 2;
	const u32 single_lm = 1;
@@ -369,8 +369,8 @@ int dp_connector_get_mode_info(struct drm_connector *connector,
	struct dp_display_mode dp_mode;
	struct dp_display *dp_disp = display;

	if (!drm_mode || !mode_info || !max_mixer_width || !connector ||
			!display) {
	if (!drm_mode || !mode_info || !avail_res ||
			!avail_res->max_mixer_width || !connector || !display) {
		pr_err("invalid params\n");
		return -EINVAL;
	}
@@ -381,7 +381,7 @@ int dp_connector_get_mode_info(struct drm_connector *connector,
	dp_panel = sde_conn->drv_panel;

	topology = &mode_info->topology;
	topology->num_lm = (max_mixer_width <= drm_mode->hdisplay) ?
	topology->num_lm = (avail_res->max_mixer_width <= drm_mode->hdisplay) ?
							dual_lm : single_lm;
	topology->num_enc = no_enc;
	topology->num_intf = single_intf;
@@ -472,7 +472,7 @@ void dp_connector_post_open(struct drm_connector *connector, void *display)
}

int dp_connector_get_modes(struct drm_connector *connector,
		void *display)
		void *display, const struct msm_resource_caps_info *avail_res)
{
	int rc = 0;
	struct dp_display *dp;
@@ -580,7 +580,8 @@ void dp_drm_bridge_deinit(void *data)
}

enum drm_mode_status dp_connector_mode_valid(struct drm_connector *connector,
		struct drm_display_mode *mode, void *display)
		struct drm_display_mode *mode, void *display,
		const struct msm_resource_caps_info *avail_res)
{
	struct dp_display *dp_disp;
	struct sde_connector *sde_conn;
+9 −7
Original line number Diff line number Diff line
@@ -60,35 +60,37 @@ enum drm_connector_status dp_connector_detect(struct drm_connector *conn,
 * dp_connector_get_modes - callback to add drm modes via drm_mode_probed_add()
 * @connector: Pointer to drm connector structure
 * @display: Pointer to private display handle
 * @avail_res: Pointer with curr available resources
 * Returns: Number of modes added
 */
int dp_connector_get_modes(struct drm_connector *connector,
		void *display);
		void *display, const struct msm_resource_caps_info *avail_res);

/**
 * dp_connector_mode_valid - callback to determine if specified mode is valid
 * @connector: Pointer to drm connector structure
 * @mode: Pointer to drm mode structure
 * @display: Pointer to private display handle
 * @avail_res: Pointer with curr available resources
 * Returns: Validity status for specified mode
 */
enum drm_mode_status dp_connector_mode_valid(struct drm_connector *connector,
		struct drm_display_mode *mode,
		void *display);
		void *display, const struct msm_resource_caps_info *avail_res);

/**
 * dp_connector_get_mode_info - retrieve information of the mode selected
 * @connector: Pointer to drm connector structure
 * @drm_mode: Display mode set for the display
 * @mode_info: Out parameter. Information of the mode
 * @max_mixer_width: max width supported by HW layer mixer
 * @display: Pointer to private display structure
 * @avail_res: Pointer with curr available resources
 * Returns: zero on success
 */
int dp_connector_get_mode_info(struct drm_connector *connector,
		const struct drm_display_mode *drm_mode,
		struct msm_mode_info *mode_info,
		u32 max_mixer_width, void *display);
		void *display, const struct msm_resource_caps_info *avail_res);

/**
 * dp_connector_get_info - retrieve connector display info
@@ -177,7 +179,7 @@ static inline enum drm_connector_status dp_connector_detect(


static inline int dp_connector_get_modes(struct drm_connector *connector,
		void *display)
		void *display, const struct msm_resource_caps_info *avail_res)
{
	return 0;
}
@@ -185,7 +187,7 @@ static inline int dp_connector_get_modes(struct drm_connector *connector,
static inline enum drm_mode_status dp_connector_mode_valid(
		struct drm_connector *connector,
		struct drm_display_mode *mode,
		void *display)
		void *display, const struct msm_resource_caps_info *avail_res)
{
	return MODE_OK;
}
@@ -193,7 +195,7 @@ static inline enum drm_mode_status dp_connector_mode_valid(
static inline int dp_connector_get_mode_info(struct drm_connector *connector,
		const struct drm_display_mode *drm_mode,
		struct msm_mode_info *mode_info,
		u32 max_mixer_width, void *display)
		void *display, const struct msm_resource_caps_info *avail_res)
{
	return 0;
}
+6 −5
Original line number Diff line number Diff line
@@ -1075,7 +1075,7 @@ dp_mst_connector_detect(struct drm_connector *connector, bool force,
}

static int dp_mst_connector_get_modes(struct drm_connector *connector,
		void *display)
		void *display, const struct msm_resource_caps_info *avail_res)
{
	struct sde_connector *c_conn = to_sde_connector(connector);
	struct dp_display *dp_display = display;
@@ -1102,7 +1102,7 @@ static int dp_mst_connector_get_modes(struct drm_connector *connector,
enum drm_mode_status dp_mst_connector_mode_valid(
		struct drm_connector *connector,
		struct drm_display_mode *mode,
		void *display)
		void *display, const struct msm_resource_caps_info *avail_res)
{
	struct dp_display *dp_display = display;
	struct dp_mst_private *mst;
@@ -1153,7 +1153,7 @@ enum drm_mode_status dp_mst_connector_mode_valid(
		return MODE_BAD;
	}

	return dp_connector_mode_valid(connector, mode, display);
	return dp_connector_mode_valid(connector, mode, display, avail_res);
}

int dp_mst_connector_get_info(struct drm_connector *connector,
@@ -1187,14 +1187,15 @@ int dp_mst_connector_get_info(struct drm_connector *connector,
int dp_mst_connector_get_mode_info(struct drm_connector *connector,
		const struct drm_display_mode *drm_mode,
		struct msm_mode_info *mode_info,
		u32 max_mixer_width, void *display)
		void *display,
		const struct msm_resource_caps_info *avail_res)
{
	int rc;

	DP_MST_DEBUG("enter:\n");

	rc = dp_connector_get_mode_info(connector, drm_mode, mode_info,
			max_mixer_width, display);
			display, avail_res);

	DP_MST_DEBUG("mst connector:%d get mode info. rc:%d\n",
			connector->base.id, rc);
+10 −7
Original line number Diff line number Diff line
@@ -5134,7 +5134,8 @@ static enum drm_connector_status dsi_display_drm_ext_detect(
}

static int dsi_display_drm_ext_get_modes(
		struct drm_connector *connector, void *disp)
		struct drm_connector *connector, void *disp,
		const struct msm_resource_caps_info *avail_res)
{
	struct dsi_display *display = disp;
	struct drm_display_mode *pmode, *pt;
@@ -5142,7 +5143,7 @@ static int dsi_display_drm_ext_get_modes(

	/* if there are modes defined in panel, ignore external modes */
	if (display->panel->num_timing_nodes)
		return dsi_connector_get_modes(connector, disp);
		return dsi_connector_get_modes(connector, disp, avail_res);

	count = display->ext_conn->helper_private->get_modes(
			display->ext_conn);
@@ -5160,13 +5161,13 @@ static int dsi_display_drm_ext_get_modes(
static enum drm_mode_status dsi_display_drm_ext_mode_valid(
		struct drm_connector *connector,
		struct drm_display_mode *mode,
		void *disp)
		void *disp, const struct msm_resource_caps_info *avail_res)
{
	struct dsi_display *display = disp;
	enum drm_mode_status status;

	/* always do internal mode_valid check */
	status = dsi_conn_mode_valid(connector, mode, disp);
	status = dsi_conn_mode_valid(connector, mode, disp, avail_res);
	if (status != MODE_OK)
		return status;

@@ -5228,11 +5229,12 @@ static int dsi_display_ext_get_info(struct drm_connector *connector,
static int dsi_display_ext_get_mode_info(struct drm_connector *connector,
	const struct drm_display_mode *drm_mode,
	struct msm_mode_info *mode_info,
	u32 max_mixer_width, void *display)
	void *display, const struct msm_resource_caps_info *avail_res)
{
	struct msm_display_topology *topology;

	if (!drm_mode || !mode_info)
	if (!drm_mode || !mode_info ||
			!avail_res || !avail_res->max_mixer_width)
		return -EINVAL;

	memset(mode_info, 0, sizeof(*mode_info));
@@ -5240,7 +5242,8 @@ static int dsi_display_ext_get_mode_info(struct drm_connector *connector,
	mode_info->vtotal = drm_mode->vtotal;

	topology = &mode_info->topology;
	topology->num_lm = (max_mixer_width <= drm_mode->hdisplay) ? 2 : 1;
	topology->num_lm = (avail_res->max_mixer_width
			<= drm_mode->hdisplay) ? 2 : 1;
	topology->num_enc = 0;
	topology->num_intf = topology->num_lm;

+4 −3
Original line number Diff line number Diff line
@@ -459,7 +459,7 @@ u64 dsi_drm_find_bit_clk_rate(void *display,
int dsi_conn_get_mode_info(struct drm_connector *connector,
		const struct drm_display_mode *drm_mode,
		struct msm_mode_info *mode_info,
		u32 max_mixer_width, void *display)
		void *display, const struct msm_resource_caps_info *avail_res)
{
	struct dsi_display_mode dsi_mode;
	struct dsi_mode_info *timing;
@@ -790,7 +790,8 @@ static void dsi_drm_update_checksum(struct edid *edid)
	edid->checksum = 0x100 - (sum & 0xFF);
}

int dsi_connector_get_modes(struct drm_connector *connector, void *data)
int dsi_connector_get_modes(struct drm_connector *connector, void *data,
		const struct msm_resource_caps_info *avail_res)
{
	int rc, i;
	u32 count = 0, edid_size;
@@ -871,7 +872,7 @@ int dsi_connector_get_modes(struct drm_connector *connector, void *data)

enum drm_mode_status dsi_conn_mode_valid(struct drm_connector *connector,
		struct drm_display_mode *mode,
		void *display)
		void *display, const struct msm_resource_caps_info *avail_res)
{
	struct dsi_display_mode dsi_mode;
	int rc;
Loading