use hdmi connector to main output if there is no connected connector 68/165568/1
authorJunkyeong Kim <jk0430.kim@samsung.com>
Tue, 2 Jan 2018 07:07:52 +0000 (16:07 +0900)
committerJunkyeong Kim <jk0430.kim@samsung.com>
Tue, 2 Jan 2018 07:08:09 +0000 (16:08 +0900)
Change-Id: I5e97b72904439a691b90009502924b6195e57b2b
Signed-off-by: Junkyeong Kim <jk0430.kim@samsung.com>
src/tdm_vc4_display.c

index 4a98bbe..946c269 100644 (file)
@@ -889,15 +889,16 @@ tdm_vc4_display_create_output_list(tdm_vc4_data *vc4_data)
        tdm_vc4_output_data *output_data;
        int i;
        tdm_error ret;
+       drmModeConnectorPtr connector;
+       drmModeEncoderPtr encoder;
+       int conn_idx = -1;
+       int hdmia_idx = -1, hdmib_idx = -1;
+       int crtc_id = 0, c, j;
 
        RETURN_VAL_IF_FAIL(LIST_IS_EMPTY(&vc4_data->output_list),
                                           TDM_ERROR_OPERATION_FAILED);
 
        for (i = 0; i < vc4_data->mode_res->count_connectors; i++) {
-               drmModeConnectorPtr connector;
-               drmModeEncoderPtr encoder;
-               int crtc_id = 0, c, j;
-
                connector = drmModeGetConnector(vc4_data->drm_fd,
                                                                                vc4_data->mode_res->connectors[i]);
                if (!connector) {
@@ -912,136 +913,154 @@ tdm_vc4_display_create_output_list(tdm_vc4_data *vc4_data)
                 * To support various connectors, planes and crtcs, the new TDM backend
                 * should be implemented.
                 */
-               if (connector->connection != DRM_MODE_CONNECTED) {
+               if (connector->connection == DRM_MODE_CONNECTED) {
+                       conn_idx = i;
                        drmModeFreeConnector(connector);
-                       continue;
+                       break;
                }
 
-               if (connector->count_encoders != 1) {
-                       TDM_ERR("too many encoders: %d", connector->count_encoders);
-                       drmModeFreeConnector(connector);
-                       ret = TDM_ERROR_OPERATION_FAILED;
-                       goto failed_create;
-               }
+               if (connector->connector_type == DRM_MODE_CONNECTOR_HDMIA)
+                       hdmia_idx = i;
+               if (connector->connector_type == DRM_MODE_CONNECTOR_HDMIB)
+                       hdmib_idx = i;
 
-               encoder = drmModeGetEncoder(vc4_data->drm_fd, connector->encoders[0]);
-               if (!encoder) {
-                       TDM_ERR("no encoder");
-                       drmModeFreeConnector(connector);
-                       ret = TDM_ERROR_OPERATION_FAILED;
-                       goto failed_create;
-               }
+               drmModeFreeConnector(connector);
+       }
 
-               for (c = 0; c < vc4_data->mode_res->count_crtcs; c++) {
-                       if ((encoder->possible_crtcs & (1 << c)) == 0)
-                               continue;
+       /* use hdmi connector_id if there is no connector which is connected */
+       if (conn_idx == -1) {
+               if (hdmia_idx != -1)
+                       conn_idx = hdmia_idx;
+               else if (hdmib_idx != -1)
+                       conn_idx = hdmib_idx;
+               else
+                       conn_idx = 0;
+       }
 
-                       crtc_id = vc4_data->mode_res->crtcs[c];
-                       break;
-               }
+       connector = drmModeGetConnector(vc4_data->drm_fd,
+                                                                       vc4_data->mode_res->connectors[conn_idx]);
+       if (!connector) {
+               TDM_ERR("no connector");
+               ret = TDM_ERROR_OPERATION_FAILED;
+               goto failed_create;
+       }
 
-               if (crtc_id == 0) {
-                       TDM_ERR("no possible crtc");
-                       drmModeFreeConnector(connector);
-                       drmModeFreeEncoder(encoder);
-                       ret = TDM_ERROR_OPERATION_FAILED;
-                       goto failed_create;
-               }
+       if (connector->count_encoders != 1) {
+               TDM_ERR("too many encoders: %d", connector->count_encoders);
+               drmModeFreeConnector(connector);
+               ret = TDM_ERROR_OPERATION_FAILED;
+               goto failed_create;
+       }
 
-               output_data = calloc(1, sizeof(tdm_vc4_output_data));
-               if (!output_data) {
-                       TDM_ERR("alloc failed");
-                       drmModeFreeConnector(connector);
-                       drmModeFreeEncoder(encoder);
-                       ret = TDM_ERROR_OUT_OF_MEMORY;
-                       goto failed_create;
-               }
+       encoder = drmModeGetEncoder(vc4_data->drm_fd, connector->encoders[0]);
+       if (!encoder) {
+               TDM_ERR("no encoder");
+               drmModeFreeConnector(connector);
+               ret = TDM_ERROR_OPERATION_FAILED;
+               goto failed_create;
+       }
 
-               LIST_INITHEAD(&output_data->layer_list);
+       for (c = 0; c < vc4_data->mode_res->count_crtcs; c++) {
+               if ((encoder->possible_crtcs & (1 << c)) == 0)
+                       continue;
 
-               output_data->vc4_data = vc4_data;
-               output_data->connector_id = vc4_data->mode_res->connectors[i];
-               output_data->encoder_id = encoder->encoder_id;
-               output_data->crtc_id = crtc_id;
-               output_data->pipe = c;
-               output_data->connector_type = connector->connector_type;
-               output_data->connector_type_id = connector->connector_type_id;
+               crtc_id = vc4_data->mode_res->crtcs[c];
+               break;
+       }
 
-               if (connector->connection == DRM_MODE_CONNECTED)
-                       output_data->status = TDM_OUTPUT_CONN_STATUS_CONNECTED;
-               else
-                       output_data->status = TDM_OUTPUT_CONN_STATUS_DISCONNECTED;
-
-               for (j = 0; j < connector->count_props; j++) {
-                       drmModePropertyPtr prop = drmModeGetProperty(vc4_data->drm_fd,
-                                                                         connector->props[j]);
-                       if (!prop)
-                               continue;
-                       if (!strcmp(prop->name, "DPMS")) {
-                               output_data->dpms_prop_id = connector->props[j];
-                               drmModeFreeProperty(prop);
-                               break;
-                       }
-                       drmModeFreeProperty(prop);
-               }
+       if (crtc_id == 0) {
+               TDM_ERR("no possible crtc");
+               drmModeFreeConnector(connector);
+               drmModeFreeEncoder(encoder);
+               ret = TDM_ERROR_OPERATION_FAILED;
+               goto failed_create;
+       }
 
-               if (output_data->dpms_prop_id == 0)
-                       TDM_WRN("not support DPMS");
+       output_data = calloc(1, sizeof(tdm_vc4_output_data));
+       if (!output_data) {
+               TDM_ERR("alloc failed");
+               drmModeFreeConnector(connector);
+               drmModeFreeEncoder(encoder);
+               ret = TDM_ERROR_OUT_OF_MEMORY;
+               goto failed_create;
+       }
 
-               output_data->count_modes = connector->count_modes;
-               output_data->vc4_modes = calloc(connector->count_modes,
-                                                                               sizeof(drmModeModeInfo));
-               if (!output_data->vc4_modes) {
-                       TDM_ERR("alloc failed");
-                       free(output_data);
-                       drmModeFreeConnector(connector);
-                       drmModeFreeEncoder(encoder);
-                       ret = TDM_ERROR_OUT_OF_MEMORY;
-                       goto failed_create;
-               }
-               output_data->output_modes = calloc(connector->count_modes,
-                                                                                  sizeof(tdm_output_mode));
-               if (!output_data->output_modes) {
-                       TDM_ERR("alloc failed");
-                       free(output_data->vc4_modes);
-                       free(output_data);
-                       drmModeFreeConnector(connector);
-                       drmModeFreeEncoder(encoder);
-                       ret = TDM_ERROR_OUT_OF_MEMORY;
-                       goto failed_create;
-               }
-               for (j = 0; j < connector->count_modes; j++) {
-                       output_data->vc4_modes[j] = connector->modes[j];
-                       _tdm_vc4_display_to_tdm_mode(&output_data->vc4_modes[j],
-                                                                                &output_data->output_modes[j]);
-               }
+       LIST_INITHEAD(&output_data->layer_list);
 
-               if (vc4_data->hwc_mode) {
-                       output_data->hwc_enable = 1;
-                       output_data->target_hwc_window = NULL;
-                       LIST_INITHEAD(&output_data->hwc_window_list);
-               }
+       output_data->vc4_data = vc4_data;
+       output_data->connector_id = vc4_data->mode_res->connectors[conn_idx];
+       output_data->encoder_id = encoder->encoder_id;
+       output_data->crtc_id = crtc_id;
+       output_data->pipe = c;
+       output_data->connector_type = connector->connector_type;
+       output_data->connector_type_id = connector->connector_type_id;
 
-               LIST_ADDTAIL(&output_data->link, &vc4_data->output_list);
+       if (connector->connection == DRM_MODE_CONNECTED)
+               output_data->status = TDM_OUTPUT_CONN_STATUS_CONNECTED;
+       else
+               output_data->status = TDM_OUTPUT_CONN_STATUS_DISCONNECTED;
+
+       for (j = 0; j < connector->count_props; j++) {
+               drmModePropertyPtr prop = drmModeGetProperty(vc4_data->drm_fd,
+                                                                 connector->props[j]);
+               if (!prop)
+                       continue;
+               if (!strcmp(prop->name, "DPMS")) {
+                       output_data->dpms_prop_id = connector->props[j];
+                       drmModeFreeProperty(prop);
+                       break;
+               }
+               drmModeFreeProperty(prop);
+       }
 
-               TDM_DBG("output_data(%p) connector_id(%d:%d:%d-%d) encoder_id(%d) crtc_id(%d) pipe(%d) dpms_id(%d)",
-                               output_data, output_data->connector_id, output_data->status,
-                               output_data->connector_type,
-                               output_data->connector_type_id, output_data->encoder_id, output_data->crtc_id,
-                               output_data->pipe, output_data->dpms_prop_id);
+       if (output_data->dpms_prop_id == 0)
+               TDM_WRN("not support DPMS");
 
+       output_data->count_modes = connector->count_modes;
+       output_data->vc4_modes = calloc(connector->count_modes,
+                                                                       sizeof(drmModeModeInfo));
+       if (!output_data->vc4_modes) {
+               TDM_ERR("alloc failed");
+               free(output_data);
+               drmModeFreeConnector(connector);
                drmModeFreeEncoder(encoder);
+               ret = TDM_ERROR_OUT_OF_MEMORY;
+               goto failed_create;
+       }
+       output_data->output_modes = calloc(connector->count_modes,
+                                                                          sizeof(tdm_output_mode));
+       if (!output_data->output_modes) {
+               TDM_ERR("alloc failed");
+               free(output_data->vc4_modes);
+               free(output_data);
                drmModeFreeConnector(connector);
+               drmModeFreeEncoder(encoder);
+               ret = TDM_ERROR_OUT_OF_MEMORY;
+               goto failed_create;
+       }
+       for (j = 0; j < connector->count_modes; j++) {
+               output_data->vc4_modes[j] = connector->modes[j];
+               _tdm_vc4_display_to_tdm_mode(&output_data->vc4_modes[j],
+                                                                        &output_data->output_modes[j]);
+       }
 
-               /* The TDM drm backend is not interested with disconnected connectors.
-                * And it only considers 1 connected connector because it is the TDM
-                * reference backend and can't take care of all hardware devices.
-                * To support various connectors, planes and crtcs, the new TDM backend
-                * should be implemented.
-                */
-               break;
+       if (vc4_data->hwc_mode) {
+               output_data->hwc_enable = 1;
+               output_data->target_hwc_window = NULL;
+               LIST_INITHEAD(&output_data->hwc_window_list);
        }
 
+       LIST_ADDTAIL(&output_data->link, &vc4_data->output_list);
+
+       TDM_DBG("output_data(%p) connector_id(%d:%d:%d-%d) encoder_id(%d) crtc_id(%d) pipe(%d) dpms_id(%d)",
+                       output_data, output_data->connector_id, output_data->status,
+                       output_data->connector_type,
+                       output_data->connector_type_id, output_data->encoder_id, output_data->crtc_id,
+                       output_data->pipe, output_data->dpms_prop_id);
+
+       drmModeFreeEncoder(encoder);
+       drmModeFreeConnector(connector);
+
        TDM_DBG("output count: %d", vc4_data->mode_res->count_connectors);
 
        return TDM_ERROR_NONE;