Dave, have you checked this out yet?  Any chance you could apply this
useful cleanup?

Thanks,
Jesse

On Fri, 3 Jul 2009 01:44:24 -0700
"Wang, Quanxian" <[email protected]> wrote:

> Any comment for this patch?
> 
> Thanks
> 
> Quanxian Wang
> 
> >
> >
> >-----Original Message-----
> >From: [email protected] 
> >[mailto:[email protected]] On Behalf Of 
> >Wang, Quanxian
> >Sent: 2009年7月2日 10:58
> >To: [email protected]; [email protected]
> >Cc: Guo, Chaohong; [email protected]; Barnes, Jesse
> >Subject: [Intel-gfx] [PATCH] drm/i915: merge mode attributes 
> >of VBT and EDID together
> >
> >
> >Suggested by Jesse, I resend this patch to mailist 
> >[email protected] and drm owner Dave Airlied.
> >
> >Jesse wrote:
> >>Looks much better. Since it touches generic DRM code, you should
> >>probably send it to Dave and [email protected] as
> >>well.
> >
> >Thanks
> >
> >Regards
> >
> >Quanxian Wang
> >===========
> >
> >Since the mode attributes of EDID is almost the same as VBT,
> >we merge the implementation together for easy control
> >Thanks for good idea from Jesse Barness and Guo Chaohong
> >
> >Signed-off-by: Wang, Quanxian<[email protected]>
> >Signed-off-by: Guo, Changhong<[email protected]>
> >---
> > drivers/gpu/drm/drm_edid.c        |   59 
> >+++++++++++++++++++++++++++-----------
> > drivers/gpu/drm/i915/intel_bios.c |   49 
> >+++++++------------------------
> > include/drm/drm_crtc.h            |    2 +
> > 3 files changed, 56 insertions(+), 54 deletions(-)
> >
> >diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c
> >index 80cc6d0..2d6be50 100644
> >--- a/drivers/gpu/drm/drm_edid.c
> >+++ b/drivers/gpu/drm/drm_edid.c
> >@@ -273,6 +273,47 @@ struct drm_display_mode 
> >*drm_mode_std(struct drm_device *dev,
> >     return mode;
> > }
> > 
> >+/*
> >+ * fill_detail_timing_data - input the mode attributes from 
> >EDID and VBT
> >+ * panel_fixed_mode: the display mode to be set
> >+ * timing: timing info from VBT or EDID
> >+ */
> >+void
> >+fill_detail_timing_data(struct drm_display_mode *panel_fixed_mode,
> >+                    struct detailed_pixel_timing *timing)
> >+{
> >+    unsigned hactive = (timing->hactive_hblank_hi & 0xf0) 
> ><< 4 | timing->hactive_lo;
> >+    unsigned vactive = (timing->vactive_vblank_hi & 0xf0) 
> ><< 4 | timing->vactive_lo;
> >+    unsigned hblank = (timing->hactive_hblank_hi & 0xf) << 
> >8 | timing->hblank_lo;
> >+    unsigned vblank = (timing->vactive_vblank_hi & 0xf) << 
> >8 | timing->vblank_lo;
> >+    unsigned hsync_offset = 
> >(timing->hsync_vsync_offset_pulse_width_hi & 0xc0) << 2\ 
> >+                    | timing->hsync_offset_lo;
> >+    unsigned hsync_pulse_width = 
> >(timing->hsync_vsync_offset_pulse_width_hi & 0x30) \
> >+                    << 4 | timing->hsync_pulse_width_lo;
> >+    unsigned vsync_offset = 
> >(timing->hsync_vsync_offset_pulse_width_hi & 0xc) >> 2 |\
> >+                    timing->vsync_offset_pulse_width_lo >> 4;
> >+    unsigned vsync_pulse_width = 
> >(timing->hsync_vsync_offset_pulse_width_hi & 0x3)  \
> >+                    << 4 | 
> >(timing->vsync_offset_pulse_width_lo & 0xf);
> >+
> >+    panel_fixed_mode->hdisplay = hactive;
> >+    panel_fixed_mode->hsync_start = 
> >panel_fixed_mode->hdisplay + hsync_offset;
> >+    panel_fixed_mode->hsync_end = 
> >panel_fixed_mode->hsync_start + hsync_pulse_width;
> >+    panel_fixed_mode->htotal = panel_fixed_mode->hdisplay +
> >hblank; +
> >+    panel_fixed_mode->vdisplay = vactive;
> >+    panel_fixed_mode->vsync_start = 
> >panel_fixed_mode->vdisplay + vsync_offset;
> >+    panel_fixed_mode->vsync_end = 
> >panel_fixed_mode->vsync_start + vsync_pulse_width;
> >+    panel_fixed_mode->vtotal = panel_fixed_mode->vdisplay +
> >vblank; +
> >+    drm_mode_set_name(panel_fixed_mode);
> >+
> >+    /* Some VBTs have bogus h/vtotal values */
> >+    if (panel_fixed_mode->hsync_end > panel_fixed_mode->htotal)
> >+            panel_fixed_mode->htotal = 
> >panel_fixed_mode->hsync_end + 1;
> >+    if (panel_fixed_mode->vsync_end > panel_fixed_mode->vtotal)
> >+            panel_fixed_mode->vtotal = 
> >panel_fixed_mode->vsync_end + 1;
> >+}
> >+EXPORT_SYMBOL(fill_detail_timing_data);
> > /**
> >  * drm_mode_detailed - create a new mode from an EDID 
> >detailed timing section
> >  * @dev: DRM device (needed to create new mode)
> >@@ -292,12 +329,6 @@ static struct drm_display_mode 
> >*drm_mode_detailed(struct drm_device *dev,
> >     struct detailed_pixel_timing *pt = &timing->data.pixel_data;
> >     unsigned hactive = (pt->hactive_hblank_hi & 0xf0) << 4 
> >| pt->hactive_lo;
> >     unsigned vactive = (pt->vactive_vblank_hi & 0xf0) << 4 
> >| pt->vactive_lo;
> >-    unsigned hblank = (pt->hactive_hblank_hi & 0xf) << 8 | 
> >pt->hblank_lo;
> >-    unsigned vblank = (pt->vactive_vblank_hi & 0xf) << 8 | 
> >pt->vblank_lo;
> >-    unsigned hsync_offset = 
> >(pt->hsync_vsync_offset_pulse_width_hi & 0xc0) << 2 | 
> >pt->hsync_offset_lo;
> >-    unsigned hsync_pulse_width = 
> >(pt->hsync_vsync_offset_pulse_width_hi & 0x30) << 4 | 
> >pt->hsync_pulse_width_lo;
> >-    unsigned vsync_offset = 
> >(pt->hsync_vsync_offset_pulse_width_hi & 0xc) >> 2 | 
> >pt->vsync_offset_pulse_width_lo >> 4;
> >-    unsigned vsync_pulse_width = 
> >(pt->hsync_vsync_offset_pulse_width_hi & 0x3) << 4 | 
> >(pt->vsync_offset_pulse_width_lo & 0xf);
> > 
> >     /* ignore tiny modes */
> >     if (hactive < 64 || vactive < 64)
> >@@ -323,17 +354,7 @@ static struct drm_display_mode 
> >*drm_mode_detailed(struct drm_device *dev,
> > 
> >     mode->clock = le16_to_cpu(timing->pixel_clock) * 10;
> > 
> >-    mode->hdisplay = hactive;
> >-    mode->hsync_start = mode->hdisplay + hsync_offset;
> >-    mode->hsync_end = mode->hsync_start + hsync_pulse_width;
> >-    mode->htotal = mode->hdisplay + hblank;
> >-
> >-    mode->vdisplay = vactive;
> >-    mode->vsync_start = mode->vdisplay + vsync_offset;
> >-    mode->vsync_end = mode->vsync_start + vsync_pulse_width;
> >-    mode->vtotal = mode->vdisplay + vblank;
> >-
> >-    drm_mode_set_name(mode);
> >+    fill_detail_timing_data(mode,pt);
> > 
> >     if (pt->misc & DRM_EDID_PT_INTERLACED)
> >             mode->flags |= DRM_MODE_FLAG_INTERLACE;
> >diff --git a/drivers/gpu/drm/i915/intel_bios.c 
> >b/drivers/gpu/drm/i915/intel_bios.c
> >index 716409a..3741d27 100644
> >--- a/drivers/gpu/drm/i915/intel_bios.c
> >+++ b/drivers/gpu/drm/i915/intel_bios.c
> >@@ -29,6 +29,7 @@
> > #include "i915_drm.h"
> > #include "i915_drv.h"
> > #include "intel_bios.h"
> >+#include "drm_edid.h"
> > 
> > #define     SLAVE_ADDR1     0x70
> > #define     SLAVE_ADDR2     0x72
> >@@ -59,39 +60,6 @@ find_section(struct bdb_header *bdb, int
> >section_id)
> >     return NULL;
> > }
> > 
> >-static void
> >-fill_detail_timing_data(struct drm_display_mode *panel_fixed_mode,
> >-                    struct lvds_dvo_timing *dvo_timing)
> >-{
> >-    panel_fixed_mode->hdisplay = (dvo_timing->hactive_hi << 8) |
> >-            dvo_timing->hactive_lo;
> >-    panel_fixed_mode->hsync_start = panel_fixed_mode->hdisplay +
> >-            ((dvo_timing->hsync_off_hi << 8) | 
> >dvo_timing->hsync_off_lo);
> >-    panel_fixed_mode->hsync_end = panel_fixed_mode->hsync_start
> >+
> >-            dvo_timing->hsync_pulse_width;
> >-    panel_fixed_mode->htotal = panel_fixed_mode->hdisplay +
> >-            ((dvo_timing->hblank_hi << 8) |
> >dvo_timing->hblank_lo); -
> >-    panel_fixed_mode->vdisplay = (dvo_timing->vactive_hi << 8) |
> >-            dvo_timing->vactive_lo;
> >-    panel_fixed_mode->vsync_start = panel_fixed_mode->vdisplay +
> >-            dvo_timing->vsync_off;
> >-    panel_fixed_mode->vsync_end = panel_fixed_mode->vsync_start
> >+
> >-            dvo_timing->vsync_pulse_width;
> >-    panel_fixed_mode->vtotal = panel_fixed_mode->vdisplay +
> >-            ((dvo_timing->vblank_hi << 8) |
> >dvo_timing->vblank_lo);
> >-    panel_fixed_mode->clock = dvo_timing->clock * 10;
> >-    panel_fixed_mode->type = DRM_MODE_TYPE_PREFERRED;
> >-
> >-    /* Some VBTs have bogus h/vtotal values */
> >-    if (panel_fixed_mode->hsync_end > panel_fixed_mode->htotal)
> >-            panel_fixed_mode->htotal = 
> >panel_fixed_mode->hsync_end + 1;
> >-    if (panel_fixed_mode->vsync_end > panel_fixed_mode->vtotal)
> >-            panel_fixed_mode->vtotal = 
> >panel_fixed_mode->vsync_end + 1;
> >-
> >-    drm_mode_set_name(panel_fixed_mode);
> >-}
> >-
> > /* Try to find integrated panel data */
> > static void
> > parse_lfp_panel_data(struct drm_i915_private *dev_priv,
> >@@ -136,7 +104,12 @@ parse_lfp_panel_data(struct 
> >drm_i915_private *dev_priv,
> > 
> >     panel_fixed_mode = kzalloc(sizeof(*panel_fixed_mode), 
> >GFP_KERNEL);
> > 
> >-    fill_detail_timing_data(panel_fixed_mode, dvo_timing);
> >+    if (!panel_fixed_mode)
> >+            return;
> >+
> >+    /* Initialize the reserver to 0 since we don't use them */
> >+    dvo_timing->rsvd0 = 0;
> >+    fill_detail_timing_data(panel_fixed_mode, (struct 
> >detailed_pixel_timing *)dvo_timing);
> > 
> >     dev_priv->lfp_lvds_vbt_mode = panel_fixed_mode;
> > 
> >@@ -152,7 +125,7 @@ parse_sdvo_panel_data(struct 
> >drm_i915_private *dev_priv,
> >                   struct bdb_header *bdb)
> > {
> >     struct bdb_sdvo_lvds_options *sdvo_lvds_options;
> >-    struct lvds_dvo_timing *dvo_timing;
> >+    struct lvds_dvo_timing *dvo_timing, *pt;
> >     struct drm_display_mode *panel_fixed_mode;
> > 
> >     dev_priv->sdvo_lvds_vbt_mode = NULL;
> >@@ -170,8 +143,10 @@ parse_sdvo_panel_data(struct 
> >drm_i915_private *dev_priv,
> >     if (!panel_fixed_mode)
> >             return;
> > 
> >-    fill_detail_timing_data(panel_fixed_mode,
> >-                    dvo_timing + sdvo_lvds_options->panel_type);
> >+    pt=(dvo_timing + sdvo_lvds_options->panel_type);
> >+    /* Initialize the reserver to 0 since we don't use them */
> >+    pt->resvd=0;
> >+    fill_detail_timing_data(panel_fixed_mode,(struct 
> >detailed_pixel_timing *)pt);
> > 
> >     dev_priv->sdvo_lvds_vbt_mode = panel_fixed_mode;
> > 
> >diff --git a/include/drm/drm_crtc.h b/include/drm/drm_crtc.h
> >index 7300fb8..19e8521 100644
> >--- a/include/drm/drm_crtc.h
> >+++ b/include/drm/drm_crtc.h
> >@@ -736,4 +736,6 @@ extern int drm_mode_gamma_get_ioctl(struct 
> >drm_device *dev,
> > extern int drm_mode_gamma_set_ioctl(struct drm_device *dev,
> >                                 void *data, struct drm_file 
> >*file_priv);
> > extern bool drm_detect_hdmi_monitor(struct edid *edid);
> >+extern void fill_detail_timing_data(struct drm_display_mode 
> >*panel_fixed_mode,
> >+                                 struct 
> >detailed_pixel_timing *timing);
> > #endif /* __DRM_CRTC_H__ */
> > 
> >_______________________________________________
> >Intel-gfx mailing list
> >[email protected]
> >http://lists.freedesktop.org/mailman/listinfo/intel-gfx
> >_______________________________________________
> >Intel-gfx mailing list
> >[email protected]
> >http://lists.freedesktop.org/mailman/listinfo/intel-gfx
> >_______________________________________________
> >Intel-gfx mailing list
> >[email protected]
> >http://lists.freedesktop.org/mailman/listinfo/intel-gfx
> >

-- 
Jesse Barnes, Intel Open Source Technology Center

------------------------------------------------------------------------------
Enter the BlackBerry Developer Challenge  
This is your chance to win up to $100,000 in prizes! For a limited time, 
vendors submitting new applications to BlackBerry App World(TM) will have
the opportunity to enter the BlackBerry Developer Challenge. See full prize  
details at: http://p.sf.net/sfu/Challenge
--
_______________________________________________
Dri-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/dri-devel

Reply via email to