support under 720p modes 24/198524/1
authorJunkyeong Kim <jk0430.kim@samsung.com>
Fri, 25 Jan 2019 06:58:31 +0000 (15:58 +0900)
committerJunkyeong Kim <jk0430.kim@samsung.com>
Fri, 25 Jan 2019 06:58:37 +0000 (15:58 +0900)
Change-Id: Iec9f2469295a58d330431eafe7050f38a632a820
Signed-off-by: Junkyeong Kim <jk0430.kim@samsung.com>
src/tdm_vc4_display.c

index cbaa822..981376d 100644 (file)
@@ -12,6 +12,9 @@ static int tdm_vc4_buffer_key;
 
 #define MIN_WIDTH   32
 
+#define MODE_WIDTH_LIMIT 1280
+#define MODE_HEIGHT_LIMIT 720
+
 #define LIST_INSERT_AFTER(__after, __item) \
                (__item)->prev = (__after); \
                (__item)->next = (__after)->next; \
@@ -73,6 +76,7 @@ struct _tdm_vc4_output_data {
        uint32_t pipe;
        uint32_t dpms_prop_id;
        int count_modes;
+       int count_drm_modes;
        drmModeModeInfoPtr vc4_modes;
        tdm_output_mode *output_modes;
        tdm_output_type connector_type;
@@ -356,7 +360,7 @@ _tdm_vc4_display_get_mode(tdm_vc4_output_data *output_data)
                return NULL;
        }
 
-       for (i = 0; i < output_data->count_modes; i++) {
+       for (i = 0; i < output_data->count_drm_modes; i++) {
                drmModeModeInfoPtr vc4_mode = &output_data->vc4_modes[i];
                if ((vc4_mode->hdisplay == output_data->current_mode->hdisplay) &&
                        (vc4_mode->vdisplay == output_data->current_mode->vdisplay) &&
@@ -1303,13 +1307,13 @@ tdm_error
 tdm_vc4_display_create_output_list(tdm_vc4_data *vc4_data)
 {
        tdm_vc4_output_data *output_data;
-       int i;
+       int i, count;
        tdm_error ret;
        drmModeConnectorPtr connector;
        drmModeEncoderPtr encoder;
        int conn_idx = -1;
        int hdmia_idx = -1, hdmib_idx = -1;
-       int crtc_id = 0, c, j;
+       int crtc_id = 0, c;
 
        RETURN_VAL_IF_FAIL(LIST_IS_EMPTY(&vc4_data->output_list),
                                           TDM_ERROR_OPERATION_FAILED);
@@ -1416,13 +1420,13 @@ tdm_vc4_display_create_output_list(tdm_vc4_data *vc4_data)
        else
                output_data->status = TDM_OUTPUT_CONN_STATUS_DISCONNECTED;
 
-       for (j = 0; j < connector->count_props; j++) {
+       for (i = 0; i < connector->count_props; i++) {
                drmModePropertyPtr prop = drmModeGetProperty(vc4_data->drm_fd,
-                                                                 connector->props[j]);
+                                                                 connector->props[i]);
                if (!prop)
                        continue;
                if (!strcmp(prop->name, "DPMS")) {
-                       output_data->dpms_prop_id = connector->props[j];
+                       output_data->dpms_prop_id = connector->props[i];
                        drmModeFreeProperty(prop);
                        break;
                }
@@ -1432,7 +1436,16 @@ tdm_vc4_display_create_output_list(tdm_vc4_data *vc4_data)
        if (output_data->dpms_prop_id == 0)
                TDM_WRN("not support DPMS");
 
-       output_data->count_modes = connector->count_modes;
+       count = 0;
+       for (i = 0; i < connector->count_modes; i++) {
+               if ((connector->modes[i].hdisplay > MODE_WIDTH_LIMIT) ||
+                       (connector->modes[i].vdisplay > MODE_HEIGHT_LIMIT))
+                       continue;
+               count++;
+       }
+
+       output_data->count_drm_modes = connector->count_modes;
+       output_data->count_modes = count;
        output_data->vc4_modes = calloc(connector->count_modes,
                                                                        sizeof(drmModeModeInfo));
        if (!output_data->vc4_modes) {
@@ -1443,7 +1456,7 @@ tdm_vc4_display_create_output_list(tdm_vc4_data *vc4_data)
                ret = TDM_ERROR_OUT_OF_MEMORY;
                goto failed_create;
        }
-       output_data->output_modes = calloc(connector->count_modes,
+       output_data->output_modes = calloc(output_data->count_modes,
                                                                           sizeof(tdm_output_mode));
        if (!output_data->output_modes) {
                TDM_ERR("alloc failed");
@@ -1454,10 +1467,15 @@ tdm_vc4_display_create_output_list(tdm_vc4_data *vc4_data)
                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]);
+       count = 0;
+       for (i = 0; i < connector->count_modes; i++) {
+               output_data->vc4_modes[i] = connector->modes[i];
+               if ((connector->modes[i].hdisplay > MODE_WIDTH_LIMIT) ||
+                       (connector->modes[i].vdisplay > MODE_HEIGHT_LIMIT))
+                       continue;
+               _tdm_vc4_display_to_tdm_mode(&output_data->vc4_modes[i],
+                                                                        &output_data->output_modes[count]);
+               count++;
        }
 
        if (vc4_data->hwc_mode)
@@ -1576,7 +1594,7 @@ vc4_output_get_capability(tdm_output *output, tdm_caps_output *caps)
        drmModeConnectorPtr connector = NULL;
        drmModeCrtcPtr crtc = NULL;
        drmModeObjectPropertiesPtr props = NULL;
-       int i;
+       int i, count;
        tdm_error ret;
 
        RETURN_VAL_IF_FAIL(output_data, TDM_ERROR_INVALID_PARAMETER);
@@ -1597,7 +1615,15 @@ vc4_output_get_capability(tdm_output *output, tdm_caps_output *caps)
        connector = drmModeGetConnector(vc4_data->drm_fd, output_data->connector_id);
        RETURN_VAL_IF_FAIL(connector, TDM_ERROR_OPERATION_FAILED);
 
-       caps->mode_count = connector->count_modes;
+       count = 0;
+       for (i = 0; i < connector->count_modes; i++) {
+               if ((connector->modes[i].hdisplay > MODE_WIDTH_LIMIT) ||
+                       (connector->modes[i].vdisplay > MODE_HEIGHT_LIMIT))
+                       continue;
+               count++;
+       }
+
+       caps->mode_count = count;
        caps->modes = calloc(1, sizeof(tdm_output_mode) * caps->mode_count);
        if (!caps->modes) {
                ret = TDM_ERROR_OUT_OF_MEMORY;
@@ -1610,14 +1636,14 @@ vc4_output_get_capability(tdm_output *output, tdm_caps_output *caps)
                tdm_output_mode *new_output_modes;
 
                new_drm_modes = calloc(connector->count_modes,
-                                               sizeof(drmModeModeInfo));
+                                                       sizeof(drmModeModeInfo));
                if (!new_drm_modes) {
                        ret = TDM_ERROR_OUT_OF_MEMORY;
                        TDM_ERR("alloc failed drm_modes\n");
                        goto failed_get;
                }
-               new_output_modes = calloc(connector->count_modes,
-                                               sizeof(tdm_output_mode));
+               new_output_modes = calloc(caps->mode_count,
+                                                       sizeof(tdm_output_mode));
                if (!new_output_modes) {
                        ret = TDM_ERROR_OUT_OF_MEMORY;
                        TDM_ERR("alloc failed output_modes\n");
@@ -1629,14 +1655,22 @@ vc4_output_get_capability(tdm_output *output, tdm_caps_output *caps)
 
                output_data->vc4_modes = new_drm_modes;
                output_data->output_modes = new_output_modes;
+               output_data->count_drm_modes = connector->count_modes;
                output_data->count_modes = caps->mode_count;
        }
 
-       for (i = 0; i < caps->mode_count; i++) {
+       count = 0;
+       for (i = 0; i < connector->count_modes; i++) {
                output_data->vc4_modes[i] = connector->modes[i];
+
+               if ((connector->modes[i].hdisplay > MODE_WIDTH_LIMIT) ||
+                       (connector->modes[i].vdisplay > MODE_HEIGHT_LIMIT))
+                       continue;
+
                _tdm_vc4_display_to_tdm_mode(&output_data->vc4_modes[i],
-                                                                        &output_data->output_modes[i]);
-               caps->modes[i] = output_data->output_modes[i];
+                                                                        &output_data->output_modes[count]);
+               caps->modes[count] = output_data->output_modes[count];
+               count++;
        }
 
        caps->mmWidth = connector->mmWidth;