Commit 6434cf63 authored by Animesh Manna's avatar Animesh Manna Committed by Jani Nikula
Browse files

drm/i915/bios: calculate panel type as per child device index in VBT



Each LFP may have different panel type which is stored in LFP data
data block. Based on the child device index respective panel-type/
panel-type2 field will be used.

v1: Initial rfc verion.
v2: Based on review comments from Jani,
- Used panel-type instead addition panel-index variable.
- DEVICE_HANDLE_* name changed and placed before DEVICE_TYPE_*
macro.
v3:
- passing intel_bios_encoder_data as argument of
intel_bios_init_panel(). Passing NULL to indicate encoder is not
initialized yet for dsi as current focus is to enable dual EDP. [Jani]
v4:
- encoder->devdata used which is initialized before from vbt
structure. [Jani]

Signed-off-by: default avatarAnimesh Manna <animesh.manna@intel.com>
Reviewed-by: default avatarJani Nikula <jani.nikula@intel.com>
Acked-by: default avatarVille Syrjälä <ville.syrjala@linux.intel.com>
Signed-off-by: default avatarJani Nikula <jani.nikula@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20220620065138.5126-1-animesh.manna@intel.com
parent 47fa33cc
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -2049,7 +2049,7 @@ void icl_dsi_init(struct drm_i915_private *dev_priv)
	/* attach connector to encoder */
	intel_connector_attach_encoder(intel_connector, encoder);

	intel_bios_init_panel(dev_priv, &intel_connector->panel, NULL);
	intel_bios_init_panel(dev_priv, &intel_connector->panel, NULL, NULL);

	mutex_lock(&dev->mode_config.mutex);
	intel_panel_add_vbt_lfp_fixed_mode(intel_connector);
+14 −2
Original line number Diff line number Diff line
@@ -603,12 +603,14 @@ get_lfp_data_tail(const struct bdb_lvds_lfp_data *data,
}

static int opregion_get_panel_type(struct drm_i915_private *i915,
				   const struct intel_bios_encoder_data *devdata,
				   const struct edid *edid)
{
	return intel_opregion_get_panel_type(i915);
}

static int vbt_get_panel_type(struct drm_i915_private *i915,
			      const struct intel_bios_encoder_data *devdata,
			      const struct edid *edid)
{
	const struct bdb_lvds_options *lvds_options;
@@ -624,10 +626,16 @@ static int vbt_get_panel_type(struct drm_i915_private *i915,
		return -1;
	}

	if (devdata && devdata->child.handle == DEVICE_HANDLE_LFP2)
		return lvds_options->panel_type2;

	drm_WARN_ON(&i915->drm, devdata && devdata->child.handle != DEVICE_HANDLE_LFP1);

	return lvds_options->panel_type;
}

static int pnpid_get_panel_type(struct drm_i915_private *i915,
				const struct intel_bios_encoder_data *devdata,
				const struct edid *edid)
{
	const struct bdb_lvds_lfp_data *data;
@@ -674,6 +682,7 @@ static int pnpid_get_panel_type(struct drm_i915_private *i915,
}

static int fallback_get_panel_type(struct drm_i915_private *i915,
				   const struct intel_bios_encoder_data *devdata,
				   const struct edid *edid)
{
	return 0;
@@ -687,11 +696,13 @@ enum panel_type {
};

static int get_panel_type(struct drm_i915_private *i915,
			  const struct intel_bios_encoder_data *devdata,
			  const struct edid *edid)
{
	struct {
		const char *name;
		int (*get_panel_type)(struct drm_i915_private *i915,
				      const struct intel_bios_encoder_data *devdata,
				      const struct edid *edid);
		int panel_type;
	} panel_types[] = {
@@ -715,7 +726,7 @@ static int get_panel_type(struct drm_i915_private *i915,
	int i;

	for (i = 0; i < ARRAY_SIZE(panel_types); i++) {
		panel_types[i].panel_type = panel_types[i].get_panel_type(i915, edid);
		panel_types[i].panel_type = panel_types[i].get_panel_type(i915, devdata, edid);

		drm_WARN_ON(&i915->drm, panel_types[i].panel_type > 0xf &&
			    panel_types[i].panel_type != 0xff);
@@ -3126,11 +3137,12 @@ void intel_bios_init(struct drm_i915_private *i915)

void intel_bios_init_panel(struct drm_i915_private *i915,
			   struct intel_panel *panel,
			   const struct intel_bios_encoder_data *devdata,
			   const struct edid *edid)
{
	init_vbt_panel_defaults(panel);

	panel->vbt.panel_type = get_panel_type(i915, edid);
	panel->vbt.panel_type = get_panel_type(i915, devdata, edid);

	parse_panel_options(i915, panel);
	parse_generic_dtd(i915, panel);
+1 −0
Original line number Diff line number Diff line
@@ -234,6 +234,7 @@ struct mipi_pps_data {
void intel_bios_init(struct drm_i915_private *dev_priv);
void intel_bios_init_panel(struct drm_i915_private *dev_priv,
			   struct intel_panel *panel,
			   const struct intel_bios_encoder_data *devdata,
			   const struct edid *edid);
void intel_bios_fini_panel(struct intel_panel *panel);
void intel_bios_driver_remove(struct drm_i915_private *dev_priv);
+2 −1
Original line number Diff line number Diff line
@@ -5193,6 +5193,7 @@ static bool intel_edp_init_connector(struct intel_dp *intel_dp,
	struct drm_device *dev = &dev_priv->drm;
	struct drm_connector *connector = &intel_connector->base;
	struct drm_display_mode *fixed_mode;
	struct intel_encoder *encoder = &dp_to_dig_port(intel_dp)->base;
	bool has_dpcd;
	enum pipe pipe = INVALID_PIPE;
	struct edid *edid;
@@ -5250,7 +5251,7 @@ static bool intel_edp_init_connector(struct intel_dp *intel_dp,
	intel_connector->edid = edid;

	intel_bios_init_panel(dev_priv, &intel_connector->panel,
			      IS_ERR(edid) ? NULL : edid);
			      encoder->devdata, IS_ERR(edid) ? NULL : edid);

	intel_panel_add_edid_fixed_modes(intel_connector,
					 intel_connector->panel.vbt.drrs_type != DRRS_TYPE_NONE,
+1 −1
Original line number Diff line number Diff line
@@ -967,7 +967,7 @@ void intel_lvds_init(struct drm_i915_private *dev_priv)
	}
	intel_connector->edid = edid;

	intel_bios_init_panel(dev_priv, &intel_connector->panel,
	intel_bios_init_panel(dev_priv, &intel_connector->panel, NULL,
			      IS_ERR(edid) ? NULL : edid);

	/* Try EDID first */
Loading