Skip to content

Commit

Permalink
drm: Fix crash on imx6 when no current encoder+crtc is bound
Browse files Browse the repository at this point in the history
imx6 crahes when trying drm backend. This depends heavily on
board used and this fix is generic doesn't affect existing configs
but just fixed edge case for specific board
  • Loading branch information
zhani committed Jul 12, 2023
1 parent 51e0951 commit a32c365
Showing 1 changed file with 30 additions and 3 deletions.
33 changes: 30 additions & 3 deletions platform/drm/cog-platform-drm.c
Original file line number Diff line number Diff line change
Expand Up @@ -352,6 +352,22 @@ check_drm(void)
return supported;
}

static int32_t
find_crtc_for_encoder(const drmModeRes *resources, const drmModeEncoder *encoder) {
int i;

for (i = 0; i < resources->count_crtcs; i++) {
const uint32_t crtc_mask = 1 << i;
const uint32_t crtc_id = resources->crtcs[i];
if (encoder->possible_crtcs & crtc_mask) {
return crtc_id;
}
}

/* no match found */
return -1;
}

static gboolean
init_drm(void)
{
Expand Down Expand Up @@ -494,19 +510,30 @@ init_drm(void)
(long)((drm_data.mode - drm_data.connector.obj->modes) / sizeof(drmModeModeInfo *)), drm_data.mode->name,
drm_data.mode->vrefresh);

/* Try the currently connected encoder+crtc */
for (int i = 0; i < drm_data.base_resources->count_encoders; ++i) {
drm_data.encoder = drmModeGetEncoder(drm_data.fd, drm_data.base_resources->encoders[i]);
if (drm_data.encoder->encoder_id == drm_data.connector.obj->encoder_id)
if (!drm_data.encoder) {
/* cannot retrieve encoder, ignoring... */
continue;
}

const int32_t crtc_id = find_crtc_for_encoder(drm_data.base_resources, drm_data.encoder);
if (crtc_id != 0) {
drm_data.crtc.obj_id = crtc_id;
break;
}

g_clear_pointer (&drm_data.encoder, drmModeFreeEncoder);
}
if (!drm_data.encoder)

if (!drm_data.encoder) {
fprintf(stderr, "no crtc for encoder found!\n");
return FALSE;
}

drm_data.connector.obj_id = drm_data.connector.obj->connector_id;

drm_data.crtc.obj_id = drm_data.encoder->crtc_id;
drm_data.crtc.obj = drmModeGetCrtc (drm_data.fd, drm_data.crtc.obj_id);
for (int i = 0; i < drm_data.base_resources->count_crtcs; ++i) {
if (drm_data.base_resources->crtcs[i] == drm_data.crtc.obj_id) {
Expand Down

0 comments on commit a32c365

Please sign in to comment.