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
>
------------------------------------------------------------------------------
--
_______________________________________________
Dri-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/dri-devel

Reply via email to