From patchwork Mon Nov 25 08:51:40 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Shirish S X-Patchwork-Id: 3235301 Return-Path: X-Original-To: patchwork-dri-devel@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork2.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.19.201]) by patchwork2.web.kernel.org (Postfix) with ESMTP id C35E0C045B for ; Tue, 26 Nov 2013 00:00:53 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id CE8932013A for ; Tue, 26 Nov 2013 00:00:52 +0000 (UTC) Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) by mail.kernel.org (Postfix) with ESMTP id D5E9520119 for ; Tue, 26 Nov 2013 00:00:51 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 145DBFB30C; Mon, 25 Nov 2013 16:00:50 -0800 (PST) X-Original-To: dri-devel@lists.freedesktop.org Delivered-To: dri-devel@lists.freedesktop.org Received: from mailout3.samsung.com (mailout3.samsung.com [203.254.224.33]) by gabe.freedesktop.org (Postfix) with ESMTP id BCB98FA53F for ; Mon, 25 Nov 2013 00:52:44 -0800 (PST) Received: from epcpsbgr5.samsung.com (u145.gpu120.samsung.co.kr [203.254.230.145]) by mailout3.samsung.com (Oracle Communications Messaging Server 7u4-24.01 (7.0.4.24.0) 64bit (built Nov 17 2011)) with ESMTP id <0MWT00GDM9ZV4TD0@mailout3.samsung.com> for dri-devel@lists.freedesktop.org; Mon, 25 Nov 2013 17:52:43 +0900 (KST) Received: from epcpsbgm2.samsung.com ( [172.20.52.124]) by epcpsbgr5.samsung.com (EPCPMTA) with SMTP id A5.32.18608.BDF03925; Mon, 25 Nov 2013 17:52:43 +0900 (KST) X-AuditID: cbfee691-b7f666d0000048b0-db-52930fdb5e8c Received: from epmmp2 ( [203.254.227.17]) by epcpsbgm2.samsung.com (EPCPMTA) with SMTP id F0.67.31284.BDF03925; Mon, 25 Nov 2013 17:52:43 +0900 (KST) Received: from rahulsharma-ubuntu.sisodomain.com ([107.108.83.245]) by mmp2.samsung.com (Oracle Communications Messaging Server 7u4-24.01(7.0.4.24.0) 64bit (built Nov 17 2011)) with ESMTPA id <0MWT0009U9ZOEIC0@mmp2.samsung.com>; Mon, 25 Nov 2013 17:52:43 +0900 (KST) From: Shirish S To: dri-devel@lists.freedesktop.org, ajax@redhat.com, ville.syrjala@linux.intel.com Subject: [PATCH] drm: edid: enable probing and listing of non rb modes Date: Mon, 25 Nov 2013 14:21:40 +0530 Message-id: <1385369500-4296-2-git-send-email-s.shirish@samsung.com> X-Mailer: git-send-email 1.7.9.5 In-reply-to: <1385369500-4296-1-git-send-email-s.shirish@samsung.com> References: <1385369500-4296-1-git-send-email-s.shirish@samsung.com> X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFvrNLMWRmVeSWpSXmKPExsWyRsSkRvc2/+Qgg/9rhCyu3lrAZLHg2Som i4UP7zJbXPn6ns1i2uyNjBZNOw6yWXz/t5DJgd1jdsNFFo+93xaweMw7Gehxv/s4k8f7fVfZ PPq2rGIMYIvisklJzcksSy3St0vgymhauo+l4KNSxaXlD1gbGDdKdzFyckgImEhsXL6eHcIW k7hwbz1bFyMXh5DAUkaJSysOssAUbZt7iBEiMZ1RYuLMC1BVk5gkDs46wQRSxSagLnFx8mpm EFtEIFRi3uVDYDazQKbEkd8nwGxhATeJhauusYLYLAKqEjMvdoHZvAIuEpOWXgHawAG0TUFi ziQbkDCngKvE1eNtYCVCQCUvFu5iAtkrIbCIXWLFnrPMEHMEJL5NPsQC0SsrsekAM8TRkhIH V9xgmcAovICRYRWjaGpBckFxUnqRqV5xYm5xaV66XnJ+7iZGYMCf/vds4g7G+wesDzEmA42b yCwlmpwPjJi8knhDYzMjC1MTU2Mjc0sz0oSVxHnTHyUFCQmkJ5akZqemFqQWxReV5qQWH2Jk 4uCUamDc0M/2+ZTPpOaMNjanOHmPMH7Okh9FCswyp7ILpBbtv5vlnxPm8/Hs3esHHn2cwzq1 kO/fHNnjYv/iH829YR4hyS3gzLMiSJenkNm/wiroh2Jk3aloze6C47IXfOPn/k6e/TM6Jybo bOG6H59/N4Qp9pncMdTc1HNjr7foysP1gixRh/UafyuxFGckGmoxFxUnAgA+GUHujgIAAA== X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFrrBIsWRmVeSWpSXmKPExsVy+t9jQd3b/JODDHZ0cVhcvbWAyWLBs1VM Fgsf3mW2uPL1PZvFtNkbGS2adhxks/j+byGTA7vH7IaLLB57vy1g8Zh3MtDjfvdxJo/3+66y efRtWcUYwBbVwGiTkZqYklqkkJqXnJ+SmZduq+QdHO8cb2pmYKhraGlhrqSQl5ibaqvk4hOg 65aZA3SMkkJZYk4pUCggsbhYSd8O04TQEDddC5jGCF3fkCC4HiMDNJCwhjGjaek+loKPShWX lj9gbWDcKN3FyMkhIWAisW3uIUYIW0ziwr31bF2MXBxCAtMZJSbOvADlTGKSODjrBBNIFZuA usTFyauZQWwRgVCJeZcPgdnMApkSR36fALOFBdwkFq66xgpiswioSsy82AVm8wq4SExaegVo GwfQNgWJOZNsQMKcAq4SV4+3gZUIAZW8WLiLaQIj7wJGhlWMoqkFyQXFSem5RnrFibnFpXnp esn5uZsYwfH0THoH46oGi0OMAhyMSjy8E6snBQmxJpYVV+YeYpTgYFYS4d1TBxTiTUmsrEot yo8vKs1JLT7EmAx01ERmKdHkfGCs55XEGxqbmJsam1qaWJiYWZImrCTOe7DVOlBIID2xJDU7 NbUgtQhmCxMHp1QDI3vI909bI3fqBty+8ePwF8VcTtGTye1zbBaLaR6ofcGpz+7UdWf3iveW O97Xxfilq7UEPb3+3D1EvYXvp+We5flzfb5HM09TUZ5s4Rxwce7Zde1KdvFHW94dSyvNz3GZ U/Tc+2DxWg/jPRJTJmgVm4pE5OW+b5ZOFGqYmXBzkcy0ZIbXKiwNSizFGYmGWsxFxYkAajPY PusCAAA= DLP-Filter: Pass X-MTR: 20000000000000000@CPGS X-CFilter-Loop: Reflected X-Mailman-Approved-At: Mon, 25 Nov 2013 16:00:28 -0800 Cc: airlied@redhat.com, shirish@chromium.org, Shirish S , daniel.vetter@ffwll.ch X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.13 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Sender: dri-devel-bounces@lists.freedesktop.org Errors-To: dri-devel-bounces@lists.freedesktop.org X-Spam-Status: No, score=-4.2 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_MED, RP_MATCHES_RCVD, UNPARSEABLE_RELAY autolearn=unavailable version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP The current solution checks for the existing RB mode, if available in the edid block returns by adding it, but does not populate the connector with the modes of same resolution but which are non-rb modes. As a result the probing and listing of non-rb modes can't be made, in case the rb mode's pixel clock is not supported but non-rb mode is supported. This patch changes the drm_mode_std mode selection to collect all the supported modes and not just one mode. Signed-off-by: Shirish S --- drivers/gpu/drm/drm_edid.c | 40 ++++++++++++++++++---------------------- 1 file changed, 18 insertions(+), 22 deletions(-) diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c index fb7cf0e..765aa96 100644 --- a/drivers/gpu/drm/drm_edid.c +++ b/drivers/gpu/drm/drm_edid.c @@ -1587,12 +1587,12 @@ bad_std_timing(u8 a, u8 b) * Take the standard timing params (in this case width, aspect, and refresh) * and convert them into a real mode using CVT/GTF/DMT. */ -static struct drm_display_mode * -drm_mode_std(struct drm_connector *connector, struct edid *edid, +unsigned int drm_mode_std(struct drm_connector *connector, struct edid *edid, struct std_timing *t, int revision) { struct drm_device *dev = connector->dev; struct drm_display_mode *m, *mode = NULL; + unsigned int modes = 0; int hsize, vsize; int vrefresh_rate; unsigned aspect_ratio = (t->vfreq_aspect & EDID_TIMING_ASPECT_MASK) @@ -1602,7 +1602,7 @@ drm_mode_std(struct drm_connector *connector, struct edid *edid, int timing_level = standard_timing_level(edid); if (bad_std_timing(t->hsize, t->vfreq_aspect)) - return NULL; + return modes; /* According to the EDID spec, the hdisplay = hsize * 8 + 248 */ hsize = t->hsize * 8 + 248; @@ -1638,7 +1638,7 @@ drm_mode_std(struct drm_connector *connector, struct edid *edid, list_for_each_entry(m, &connector->probed_modes, head) if (m->hdisplay == hsize && m->vdisplay == vsize && drm_mode_vrefresh(m) == vrefresh_rate) - return NULL; + return modes; /* HDTV hack, part 2 */ if (hsize == 1366 && vsize == 768 && vrefresh_rate == 60) { @@ -1647,19 +1647,21 @@ drm_mode_std(struct drm_connector *connector, struct edid *edid, mode->hdisplay = 1366; mode->hsync_start = mode->hsync_start - 1; mode->hsync_end = mode->hsync_end - 1; - return mode; + goto done; } /* check whether it can be found in default mode table */ if (drm_monitor_supports_rb(edid)) { mode = drm_mode_find_dmt(dev, hsize, vsize, vrefresh_rate, true); - if (mode) - return mode; + if (mode) { + drm_mode_probed_add(connector, mode); + modes++; + } } mode = drm_mode_find_dmt(dev, hsize, vsize, vrefresh_rate, false); if (mode) - return mode; + goto done; /* okay, generate it */ switch (timing_level) { @@ -1676,7 +1678,7 @@ drm_mode_std(struct drm_connector *connector, struct edid *edid, */ mode = drm_gtf_mode(dev, hsize, vsize, vrefresh_rate, 0, 0); if (!mode) - return NULL; + return modes; if (drm_mode_hsync(mode) > drm_gtf2_hbreak(edid)) { drm_mode_destroy(dev, mode); mode = drm_gtf_mode_complex(dev, hsize, vsize, @@ -1692,7 +1694,11 @@ drm_mode_std(struct drm_connector *connector, struct edid *edid, false); break; } - return mode; + +done: + drm_mode_probed_add(connector, mode); + return modes++; + } /* @@ -2174,15 +2180,10 @@ do_standard_modes(struct detailed_timing *timing, void *c) int i; for (i = 0; i < 6; i++) { struct std_timing *std; - struct drm_display_mode *newmode; std = &data->data.timings[i]; - newmode = drm_mode_std(connector, edid, std, + closure->modes += drm_mode_std(connector, edid, std, edid->revision); - if (newmode) { - drm_mode_probed_add(connector, newmode); - closure->modes++; - } } } } @@ -2203,15 +2204,10 @@ add_standard_modes(struct drm_connector *connector, struct edid *edid) }; for (i = 0; i < EDID_STD_TIMINGS; i++) { - struct drm_display_mode *newmode; - newmode = drm_mode_std(connector, edid, + modes += drm_mode_std(connector, edid, &edid->standard_timings[i], edid->revision); - if (newmode) { - drm_mode_probed_add(connector, newmode); - modes++; - } } if (version_greater(edid, 1, 0))