xf86-video-intel: 2 commits - src/intel_display.c
Chris Wilson
ickle at kemper.freedesktop.org
Thu Aug 5 10:19:16 PDT 2010
src/intel_display.c | 102 ++++++++++++++++++++++++++++------------------------
1 file changed, 56 insertions(+), 46 deletions(-)
New commits:
commit 6304cb048c745be81dae13f1d936996e04eaa530
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date: Thu Aug 5 18:13:55 2010 +0100
display: Minor cleanup for adding extra LVDS modes
Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
diff --git a/src/intel_display.c b/src/intel_display.c
index f190c61..352b8a9 100644
--- a/src/intel_display.c
+++ b/src/intel_display.c
@@ -698,14 +698,12 @@ static Bool
intel_output_mode_valid(xf86OutputPtr output, DisplayModePtr pModes)
{
struct intel_output *intel_output = output->driver_private;
- drmModeConnectorPtr koutput = intel_output->mode_output;
/*
* If the connector type is LVDS, we will use the panel limit to
* verfiy whether the mode is valid.
*/
- if (koutput->connector_type == DRM_MODE_CONNECTOR_LVDS &&
- intel_output->has_lvds_limits) {
+ if (intel_output->has_lvds_limits) {
if (pModes->HDisplay > intel_output->lvds_hdisplay ||
pModes->VDisplay > intel_output->lvds_vdisplay)
return MODE_PANEL;
@@ -808,29 +806,32 @@ intel_output_get_modes(xf86OutputPtr output)
{
struct intel_output *intel_output = output->driver_private;
drmModeConnectorPtr koutput = intel_output->mode_output;
+ DisplayModePtr Modes = NULL;
int i;
- DisplayModePtr Modes = NULL, Mode;
- drmModeModeInfo *mode_ptr;
intel_output_attach_edid(output);
/* modes should already be available */
for (i = 0; i < koutput->count_modes; i++) {
- Mode = xnfalloc(sizeof(DisplayModeRec));
-
- mode_from_kmode(output->scrn, &koutput->modes[i], Mode);
- Modes = xf86ModesAdd(Modes, Mode);
+ DisplayModePtr Mode;
+ Mode = calloc(1, sizeof(DisplayModeRec));
+ if (Mode) {
+ mode_from_kmode(output->scrn, &koutput->modes[i], Mode);
+ Modes = xf86ModesAdd(Modes, Mode);
+ }
}
/*
* If the connector type is LVDS, we will traverse the kernel mode to
- * get the panel limit.
+ * get the panel limit. And then add all the standard modes to fake
+ * the fullscreen experience.
* If it is incorrect, please fix me.
*/
intel_output->has_lvds_limits = FALSE;
if (koutput->connector_type == DRM_MODE_CONNECTOR_LVDS) {
for (i = 0; i < koutput->count_modes; i++) {
+ drmModeModeInfo *mode_ptr;
mode_ptr = &koutput->modes[i];
if (mode_ptr->hdisplay > intel_output->lvds_hdisplay)
@@ -842,10 +843,9 @@ intel_output_get_modes(xf86OutputPtr output)
intel_output->has_lvds_limits =
intel_output->lvds_hdisplay &&
intel_output->lvds_vdisplay;
- }
- if (koutput->connector_type == DRM_MODE_CONNECTOR_LVDS)
Modes = intel_output_lvds_edid(output, Modes);
+ }
return Modes;
}
commit 41ae9564350cba8ac9f040f22bad8740e08e14c4
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date: Thu Aug 5 18:13:30 2010 +0100
display: Refactor EDID attachment to output.
Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
diff --git a/src/intel_display.c b/src/intel_display.c
index 1539976..f190c61 100644
--- a/src/intel_display.c
+++ b/src/intel_display.c
@@ -82,7 +82,6 @@ struct intel_output {
int output_id;
drmModeConnectorPtr mode_output;
drmModeEncoderPtr mode_encoder;
- drmModePropertyBlobPtr edid_blob;
int num_props;
struct intel_property *props;
void *private_data;
@@ -715,6 +714,49 @@ intel_output_mode_valid(xf86OutputPtr output, DisplayModePtr pModes)
return MODE_OK;
}
+static void
+intel_output_attach_edid(xf86OutputPtr output)
+{
+ struct intel_output *intel_output = output->driver_private;
+ drmModeConnectorPtr koutput = intel_output->mode_output;
+ struct intel_mode *mode = intel_output->mode;
+ drmModePropertyBlobPtr edid_blob = NULL;
+ int i;
+
+ /* look for an EDID property */
+ for (i = 0; i < koutput->count_props; i++) {
+ drmModePropertyPtr props;
+
+ props = drmModeGetProperty(mode->fd, koutput->props[i]);
+ if (!props)
+ continue;
+
+ if (!(props->flags & DRM_MODE_PROP_BLOB)) {
+ drmModeFreeProperty(props);
+ continue;
+ }
+
+ if (!strcmp(props->name, "EDID")) {
+ drmModeFreePropertyBlob(edid_blob);
+ edid_blob =
+ drmModeGetPropertyBlob(mode->fd,
+ koutput->prop_values[i]);
+ }
+ drmModeFreeProperty(props);
+ }
+
+ if (edid_blob) {
+ xf86OutputSetEDID(output,
+ xf86InterpretEDID(output->scrn->scrnIndex,
+ edid_blob->data));
+ drmModeFreePropertyBlob(edid_blob);
+ } else {
+ xf86OutputSetEDID(output,
+ xf86InterpretEDID(output->scrn->scrnIndex,
+ NULL));
+ }
+}
+
static DisplayModePtr
intel_output_lvds_edid(xf86OutputPtr output, DisplayModePtr modes)
{
@@ -766,40 +808,11 @@ intel_output_get_modes(xf86OutputPtr output)
{
struct intel_output *intel_output = output->driver_private;
drmModeConnectorPtr koutput = intel_output->mode_output;
- struct intel_mode *mode = intel_output->mode;
int i;
DisplayModePtr Modes = NULL, Mode;
- drmModePropertyPtr props;
drmModeModeInfo *mode_ptr;
- /* look for an EDID property */
- for (i = 0; i < koutput->count_props; i++) {
- props = drmModeGetProperty(mode->fd, koutput->props[i]);
- if (!props)
- continue;
-
- if (!(props->flags & DRM_MODE_PROP_BLOB)) {
- drmModeFreeProperty(props);
- continue;
- }
-
- if (!strcmp(props->name, "EDID")) {
- drmModeFreePropertyBlob(intel_output->edid_blob);
- intel_output->edid_blob =
- drmModeGetPropertyBlob(mode->fd,
- koutput->prop_values[i]);
- }
- drmModeFreeProperty(props);
- }
-
- if (intel_output->edid_blob)
- xf86OutputSetEDID(output,
- xf86InterpretEDID(output->scrn->scrnIndex,
- intel_output->edid_blob->data));
- else
- xf86OutputSetEDID(output,
- xf86InterpretEDID(output->scrn->scrnIndex,
- NULL));
+ intel_output_attach_edid(output);
/* modes should already be available */
for (i = 0; i < koutput->count_modes; i++) {
@@ -843,9 +856,6 @@ intel_output_destroy(xf86OutputPtr output)
struct intel_output *intel_output = output->driver_private;
int i;
- if (intel_output->edid_blob)
- drmModeFreePropertyBlob(intel_output->edid_blob);
-
for (i = 0; i < intel_output->num_props; i++) {
drmModeFreeProperty(intel_output->props[i].mode_prop);
free(intel_output->props[i].atoms);
More information about the xorg-commit
mailing list