Commit 7603ba81 authored by Jani Nikula's avatar Jani Nikula
Browse files

drm/i915/hdmi: add error handling in g4x_hdmi_init()



Handle encoder and connector init failures in g4x_hdmi_init(). This is
similar to g4x_dp_init().

Cc: Sergey Senozhatsky <senozhatsky@chromium.org>
Cc: Ville Syrjala <ville.syrjala@linux.intel.com>
Reported-and-tested-by: default avatarSergey Senozhatsky <senozhatsky@chromium.org>
Closes: https://lore.kernel.org/r/20241031105145.2140590-1-senozhatsky@chromium.org


Reviewed-by: default avatarSergey Senozhatsky <senozhatsky@chromium.org>
Link: https://patchwork.freedesktop.org/patch/msgid/cafae7bf1f9ffb8f6a1d7a508cd2ce7dcf06fef7.1735568047.git.jani.nikula@intel.com


Signed-off-by: default avatarJani Nikula <jani.nikula@intel.com>
parent 7fb56536
Loading
Loading
Loading
Loading
+23 −12
Original line number Diff line number Diff line
@@ -683,7 +683,7 @@ static bool assert_hdmi_port_valid(struct drm_i915_private *i915, enum port port
			 "Platform does not support HDMI %c\n", port_name(port));
}

void g4x_hdmi_init(struct drm_i915_private *dev_priv,
bool g4x_hdmi_init(struct drm_i915_private *dev_priv,
		   i915_reg_t hdmi_reg, enum port port)
{
	struct intel_display *display = &dev_priv->display;
@@ -693,10 +693,10 @@ void g4x_hdmi_init(struct drm_i915_private *dev_priv,
	struct intel_connector *intel_connector;

	if (!assert_port_valid(dev_priv, port))
		return;
		return false;

	if (!assert_hdmi_port_valid(dev_priv, port))
		return;
		return false;

	devdata = intel_bios_encoder_data_lookup(display, port);

@@ -707,15 +707,13 @@ void g4x_hdmi_init(struct drm_i915_private *dev_priv,

	dig_port = kzalloc(sizeof(*dig_port), GFP_KERNEL);
	if (!dig_port)
		return;
		return false;

	dig_port->aux_ch = AUX_CH_NONE;

	intel_connector = intel_connector_alloc();
	if (!intel_connector) {
		kfree(dig_port);
		return;
	}
	if (!intel_connector)
		goto err_connector_alloc;

	intel_encoder = &dig_port->base;

@@ -723,9 +721,10 @@ void g4x_hdmi_init(struct drm_i915_private *dev_priv,

	mutex_init(&dig_port->hdcp_mutex);

	drm_encoder_init(&dev_priv->drm, &intel_encoder->base,
	if (drm_encoder_init(&dev_priv->drm, &intel_encoder->base,
			     &intel_hdmi_enc_funcs, DRM_MODE_ENCODER_TMDS,
			 "HDMI %c", port_name(port));
			     "HDMI %c", port_name(port)))
		goto err_encoder_init;

	intel_encoder->hotplug = intel_hdmi_hotplug;
	intel_encoder->compute_config = g4x_hdmi_compute_config;
@@ -788,5 +787,17 @@ void g4x_hdmi_init(struct drm_i915_private *dev_priv,

	intel_infoframe_init(dig_port);

	intel_hdmi_init_connector(dig_port, intel_connector);
	if (!intel_hdmi_init_connector(dig_port, intel_connector))
		goto err_init_connector;

	return true;

err_init_connector:
	drm_encoder_cleanup(&intel_encoder->base);
err_encoder_init:
	kfree(intel_connector);
err_connector_alloc:
	kfree(dig_port);

	return false;
}
+3 −2
Original line number Diff line number Diff line
@@ -16,14 +16,15 @@ struct drm_connector;
struct drm_i915_private;

#ifdef I915
void g4x_hdmi_init(struct drm_i915_private *dev_priv,
bool g4x_hdmi_init(struct drm_i915_private *dev_priv,
		   i915_reg_t hdmi_reg, enum port port);
int g4x_hdmi_connector_atomic_check(struct drm_connector *connector,
				    struct drm_atomic_state *state);
#else
static inline void g4x_hdmi_init(struct drm_i915_private *dev_priv,
static inline bool g4x_hdmi_init(struct drm_i915_private *dev_priv,
				 i915_reg_t hdmi_reg, int port)
{
	return false;
}
static inline int g4x_hdmi_connector_atomic_check(struct drm_connector *connector,
						  struct drm_atomic_state *state)