<div dir="ltr">Hi tiantao,<div>Thanks for the patches.</div><div>I see you sent two patches about resolution. Could you just send them as a series?</div><div><br></div><div>Xinliang </div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Sat, 28 Dec 2019 at 08:59, Tian Tao <<a href="mailto:tiantao6@hisilicon.com">tiantao6@hisilicon.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">In the previous version, the callback function mode_valid of<br>
drm_connector_helper_funcs directly returned MODE_OK. Now we will<br>
ensure that the resolution is correct and return MODE_OK, otherwise<br>
return MODE_NOMODE.<br>
<br>
Signed-off-by: Tian Tao <<a href="mailto:tiantao6@hisilicon.com" target="_blank">tiantao6@hisilicon.com</a>><br>
Signed-off-by: Gong junjie <<a href="mailto:gongjunjie2@huawei.com" target="_blank">gongjunjie2@huawei.com</a>><br>
---<br>
 drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_vdac.c | 41 ++++++++++++++++++++++--<br>
 1 file changed, 39 insertions(+), 2 deletions(-)<br>
<br>
diff --git a/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_vdac.c b/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_vdac.c<br>
index 6d98fdc..3d08210 100644<br>
--- a/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_vdac.c<br>
+++ b/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_vdac.c<br>
@@ -11,22 +11,59 @@<br>
  *     Jianhua Li <<a href="mailto:lijianhua@huawei.com" target="_blank">lijianhua@huawei.com</a>><br>
  */<br>
<br>
+#include <drm/drm_gem_vram_helper.h><br>
 #include <drm/drm_atomic_helper.h><br>
 #include <drm/drm_probe_helper.h><br>
+#include <drm/drm_crtc_helper.h><br>
 #include <drm/drm_print.h><br>
<br>
 #include "hibmc_drm_drv.h"<br>
 #include "hibmc_drm_regs.h"<br>
<br>
+static const struct hibmc_resolution {<br>
+       int w;<br>
+       int h;<br>
+} hibmc_modetables[] = {<br>
+       {640, 480}, {800, 600}, {1024, 768}, {1152, 864}, {1280, 768},<br>
+       {1280, 720}, {1280, 960}, {1280, 1024}, {1440, 900}, {1600, 900},<br>
+       {1600, 1200}, {1920, 1080}, {1920, 1200}<br>
+};<br>
+<br>
+static int hibmc_valid_mode(int w, int h)<br>
+{<br>
+       int size = sizeof(hibmc_modetables) / sizeof(struct hibmc_resolution);<br>
+       int i;<br>
+<br>
+       for (i = 0; i < size; i++) {<br>
+               if (hibmc_modetables[i].w == w && hibmc_modetables[i].h == h)<br>
+                       return 0;<br>
+       }<br>
+<br>
+       return -1;<br>
+}<br>
+<br>
 static int hibmc_connector_get_modes(struct drm_connector *connector)<br>
 {<br>
-       return drm_add_modes_noedid(connector, 800, 600);<br>
+       int count;<br>
+<br>
+       drm_connector_update_edid_property(connector, NULL);<br>
+       count = drm_add_modes_noedid(connector, 1920, 1200);<br>
+       drm_set_preferred_mode(connector, 1024, 768);<br>
+<br>
+       return count;<br>
 }<br>
<br>
 static enum drm_mode_status hibmc_connector_mode_valid(struct drm_connector *connector,<br>
                                      struct drm_display_mode *mode)<br>
 {<br>
-       return MODE_OK;<br>
+       int vrefresh = drm_mode_vrefresh(mode);<br>
+<br>
+       if (vrefresh < 59 || vrefresh > 61)<br>
+               return MODE_NOMODE;<br>
+       else if (hibmc_valid_mode(mode->hdisplay, mode->vdisplay) != 0)<br>
+               return MODE_NOMODE;<br>
+       else<br>
+               return MODE_OK;<br>
 }<br>
<br>
 static const struct drm_connector_helper_funcs<br>
-- <br>
2.7.4<br>
<br>
</blockquote></div>