static DisplayModePtr output_get_modes(xf86OutputPtr output) { drmModeConnectorPtr drm_connector = output->driver_private; drmModeModeInfoPtr drm_mode = NULL; DisplayModePtr modes = NULL, mode = NULL; int i; for (i = 0; i < drm_connector->count_modes; i++) { drm_mode = &drm_connector->modes[i]; if (drm_mode) { mode = xcalloc(1, sizeof(DisplayModeRec)); if (!mode) continue; mode->Clock = drm_mode->clock; mode->HDisplay = drm_mode->hdisplay; mode->HSyncStart = drm_mode->hsync_start; mode->HSyncEnd = drm_mode->hsync_end; mode->HTotal = drm_mode->htotal; mode->VDisplay = drm_mode->vdisplay; mode->VSyncStart = drm_mode->vsync_start; mode->VSyncEnd = drm_mode->vsync_end; mode->VTotal = drm_mode->vtotal; mode->Flags = drm_mode->flags; mode->HSkew = drm_mode->hskew; mode->VScan = drm_mode->vscan; mode->VRefresh = xf86ModeVRefresh(mode); mode->Private = (void *)drm_mode; mode->type = 0; if (drm_mode->type & DRM_MODE_TYPE_PREFERRED) mode->type |= M_T_PREFERRED; if (drm_mode->type & DRM_MODE_TYPE_DRIVER) mode->type |= M_T_DRIVER; xf86SetModeDefaultName(mode); modes = xf86ModesAdd(modes, mode); xf86PrintModeline(0, mode); } } return modes; }
static DisplayModePtr imxDisplayGetModes(ScrnInfoPtr pScrn, const char* fbDeviceName) { FILE* fpModes = NULL; int fdDev = -1; DisplayModePtr modesList = NULL; Bool savedVarScreenInfo = FALSE; struct fb_var_screeninfo fbVarScreenInfo; /* Access the frame buffer device. */ fdDev = fbdevHWGetFD(pScrn); if (-1 == fdDev) { xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "frame buffer device not available or initialized\n"); goto errorGetModes; } /* Query the FB variable screen info */ if (-1 == ioctl(fdDev, FBIOGET_VSCREENINFO, &fbVarScreenInfo)) { xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "unable to get FB VSCREENINFO for current mode: %s\n", strerror(errno)); goto errorGetModes; } savedVarScreenInfo = TRUE; /* Create the name of the sysnode file that contains the */ /* names of all the frame buffer modes. */ char sysnodeName[80]; sprintf(sysnodeName, "/sys/class/graphics/%s/modes", fbDeviceName); fpModes = fopen(sysnodeName, "r"); if (NULL == fpModes) { xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "unable to open sysnode '%s':%s \n", sysnodeName, strerror(errno)); goto errorGetModes; } /* Create name for the frame buffer device. */ char fullDeviceName[80]; strcpy(fullDeviceName, "/dev/"); strcat(fullDeviceName, fbDeviceName); /* Turn on frame buffer blanking. */ if (-1 == ioctl(fdDev, FBIOBLANK, FB_BLANK_NORMAL)) { xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "unable to blank frame buffer device '%s': %s\n", fullDeviceName, strerror(errno)); goto errorGetModes; } xf86DrvMsg(pScrn->scrnIndex, X_INFO, "printing discovered frame buffer '%s' supported modes:\n", fbDeviceName); /* Iterate over all the modes in the frame buffer list. */ char modeName[80]; while (NULL != fgets(modeName, sizeof(modeName), fpModes)) { imxRemoveTrailingNewLines(modeName); /* Attempt to set the mode */ if (!imxDisplaySetMode(pScrn, fbDeviceName, modeName)) { xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "unable to set frame buffer mode '%s'\n", modeName); continue; } DisplayModePtr mode = imxDisplayGetCurrentMode(pScrn, fdDev, modeName); if ((NULL != mode) && (mode->HDisplay > 0) && (mode->VDisplay > 0)) { xf86PrintModeline(pScrn->scrnIndex, mode); modesList = xf86ModesAdd(modesList, mode); } } /* Add current builtin mode */ DisplayModePtr builtinMode = imxDisplayGetBuiltinMode(pScrn); xf86PrintModeline(pScrn->scrnIndex, builtinMode); modesList = xf86ModesAdd(modesList, builtinMode); errorGetModes: /* Close file with list of modes. */ if (NULL != fpModes) { fclose(fpModes); } /* Restore FB back to the current mode */ if (savedVarScreenInfo) { if (-1 == ioctl(fdDev, FBIOPUT_VSCREENINFO, &fbVarScreenInfo)) { xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "unable to restore FB VSCREENINFO: %s\n", strerror(errno)); } } /* Turn off frame buffer blanking */ if (-1 != fdDev) { ioctl(fdDev, FBIOBLANK, FB_BLANK_UNBLANK); } /* Remove any duplicate modes found. */ modesList = xf86PruneDuplicateModes(modesList); return modesList; }
static DisplayModePtr output_get_modes(xf86OutputPtr output) { struct output_private *priv = output->driver_private; drmModeConnectorPtr drm_connector = priv->drm_connector; drmModeModeInfoPtr drm_mode = NULL; drmModePropertyPtr props = NULL; xf86MonPtr ddc_mon = NULL; DisplayModePtr modes = NULL, mode = NULL; int i; for (i = 0; i < drm_connector->count_props; i++) { props = drmModeGetProperty(priv->fd, drm_connector->props[i]); if (!props) continue; if (!(props->flags & DRM_MODE_PROP_BLOB)) goto out_free; if (!strcmp(props->name, "EDID")) { if (priv->edid_blob) drmModeFreePropertyBlob(priv->edid_blob); priv->edid_blob = drmModeGetPropertyBlob(priv->fd, drm_connector->prop_values[i]); } out_free: drmModeFreeProperty(props); } if (priv->edid_blob) { ddc_mon = xf86InterpretEDID(output->scrn->scrnIndex, priv->edid_blob->data); if (ddc_mon && priv->edid_blob->length > 128) ddc_mon->flags |= MONITOR_EDID_COMPLETE_RAWDATA; } xf86OutputSetEDID(output, ddc_mon); for (i = 0; i < drm_connector->count_modes; i++) { drm_mode = &drm_connector->modes[i]; if (drm_mode) { mode = calloc(1, sizeof(DisplayModeRec)); if (!mode) continue; mode->Clock = drm_mode->clock; mode->HDisplay = drm_mode->hdisplay; mode->HSyncStart = drm_mode->hsync_start; mode->HSyncEnd = drm_mode->hsync_end; mode->HTotal = drm_mode->htotal; mode->VDisplay = drm_mode->vdisplay; mode->VSyncStart = drm_mode->vsync_start; mode->VSyncEnd = drm_mode->vsync_end; mode->VTotal = drm_mode->vtotal; mode->Flags = drm_mode->flags; mode->HSkew = drm_mode->hskew; mode->VScan = drm_mode->vscan; mode->VRefresh = xf86ModeVRefresh(mode); mode->Private = (void *)drm_mode; mode->type = 0; if (drm_mode->type & DRM_MODE_TYPE_PREFERRED) mode->type |= M_T_PREFERRED; if (drm_mode->type & DRM_MODE_TYPE_DRIVER) mode->type |= M_T_DRIVER; xf86SetModeDefaultName(mode); modes = xf86ModesAdd(modes, mode); xf86PrintModeline(0, mode); } } return modes; }