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

Commit 98c9ba61 authored by Veera Sundaram Sankaran's avatar Veera Sundaram Sankaran
Browse files

disp: msm: sde: ignore HW recovery disable event



The current SDE driver logic during MDP hang cases is to send a capture
event to user-mode if recovery custom event is registered. Otherwise, it
will enforce a device panic for debugging purpose. This might have a race
condition during the display tear-down sequence as user-mode unregisters
the recovery event when the last frame is in progress. If the last frame
causes any MDP hang, it will result in a device reset. Support only the
event registration to avoid this case, since HW recovery is not expected
to be changed dynamically.

Change-Id: I8a11e1060b239ac6827f1d078e3e396cff4c1325
Signed-off-by: default avatarVeera Sundaram Sankaran <veeras@codeaurora.org>
parent a2a3c5e8
Loading
Loading
Loading
Loading
+3 −4
Original line number Diff line number Diff line
@@ -2994,8 +2994,7 @@ struct drm_connector *sde_connector_init(struct drm_device *dev,
	return ERR_PTR(rc);
}

static int _sde_conn_hw_recovery_handler(
		struct drm_connector *connector, bool val)
static int _sde_conn_enable_hw_recovery(struct drm_connector *connector)
{
	struct sde_connector *c_conn;

@@ -3006,7 +3005,7 @@ static int _sde_conn_hw_recovery_handler(
	c_conn = to_sde_connector(connector);

	if (c_conn->encoder)
		sde_encoder_recovery_events_handler(c_conn->encoder, val);
		sde_encoder_enable_recovery_event(c_conn->encoder);

	return 0;
}
@@ -3024,7 +3023,7 @@ int sde_connector_register_custom_event(struct sde_kms *kms,
		ret = 0;
		break;
	case DRM_EVENT_SDE_HW_RECOVERY:
		ret = _sde_conn_hw_recovery_handler(conn_drm, val);
		ret = _sde_conn_enable_hw_recovery(conn_drm);
		break;
	default:
		break;
+2 −3
Original line number Diff line number Diff line
@@ -5422,8 +5422,7 @@ bool sde_encoder_recovery_events_enabled(struct drm_encoder *encoder)
	return sde_enc->recovery_events_enabled;
}

void sde_encoder_recovery_events_handler(struct drm_encoder *encoder,
		bool enabled)
void sde_encoder_enable_recovery_event(struct drm_encoder *encoder)
{
	struct sde_encoder_virt *sde_enc;

@@ -5433,5 +5432,5 @@ void sde_encoder_recovery_events_handler(struct drm_encoder *encoder,
	}

	sde_enc = to_sde_encoder_virt(encoder);
	sde_enc->recovery_events_enabled = enabled;
	sde_enc->recovery_events_enabled = true;
}
+3 −4
Original line number Diff line number Diff line
@@ -486,12 +486,11 @@ int sde_encoder_display_failure_notification(struct drm_encoder *enc,
bool sde_encoder_recovery_events_enabled(struct drm_encoder *encoder);

/**
 * sde_encoder_recovery_events_handler - handler to enable/disable the
 * sw recovery for this connector
 * sde_encoder_enable_recovery_event - handler to enable the sw recovery
 * for this connector
 * @drm_enc:    Pointer to drm encoder structure
 */
void sde_encoder_recovery_events_handler(struct drm_encoder *encoder,
		bool val);
void sde_encoder_enable_recovery_event(struct drm_encoder *encoder);
/**
 * sde_encoder_in_clone_mode - checks if underlying phys encoder is in clone
 *	mode or independent display mode. ref@ WB in Concurrent writeback mode.