#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; \
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;
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) &&
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);
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;
}
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) {
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");
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)
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);
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;
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");
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;