From patchwork Mon Jul 22 16:08:22 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ezequiel Garcia X-Patchwork-Id: 11052911 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 42D2C13B1 for ; Mon, 22 Jul 2019 16:08:49 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 3250228421 for ; Mon, 22 Jul 2019 16:08:49 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 26A762857F; Mon, 22 Jul 2019 16:08:49 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-5.2 required=2.0 tests=BAYES_00,MAILING_LIST_MULTI, RCVD_IN_DNSWL_MED,UNPARSEABLE_RELAY autolearn=ham version=3.3.1 Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher DHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id B8A7728421 for ; Mon, 22 Jul 2019 16:08:48 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id DE25689CB5; Mon, 22 Jul 2019 16:08:46 +0000 (UTC) X-Original-To: dri-devel@lists.freedesktop.org Delivered-To: dri-devel@lists.freedesktop.org Received: from bhuna.collabora.co.uk (bhuna.collabora.co.uk [46.235.227.227]) by gabe.freedesktop.org (Postfix) with ESMTPS id 125AC89CB5 for ; Mon, 22 Jul 2019 16:08:45 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) (Authenticated sender: ezequiel) with ESMTPSA id BFD4628AE09 From: Ezequiel Garcia To: dri-devel@lists.freedesktop.org Subject: [PATCH libdrm 1/2] modetest: Fix segmentation fault Date: Mon, 22 Jul 2019 13:08:22 -0300 Message-Id: <20190722160823.26668-1-ezequiel@collabora.com> X-Mailer: git-send-email 2.22.0 MIME-Version: 1.0 X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Ezequiel Garcia , rohan.garg@collabora.com, Emil Velikov Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" X-Virus-Scanned: ClamAV using ClamSMTP When a mode is set with just a connector "-s foo", we get a nasty segmentation fault. Fix it. Signed-off-by: Ezequiel Garcia --- tests/modetest/modetest.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tests/modetest/modetest.c b/tests/modetest/modetest.c index e66be6607e00..5e628127a130 100644 --- a/tests/modetest/modetest.c +++ b/tests/modetest/modetest.c @@ -1695,6 +1695,8 @@ static int parse_connector(struct pipe_arg *pipe, const char *arg) return -1; /* Parse the remaining parameters. */ + if (!endp) + return -1; if (*endp == '@') { arg = endp + 1; pipe->crtc_id = strtoul(arg, &endp, 10); From patchwork Mon Jul 22 16:08:23 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ezequiel Garcia X-Patchwork-Id: 11052913 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 90A8513AC for ; Mon, 22 Jul 2019 16:08:51 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 80717284C3 for ; Mon, 22 Jul 2019 16:08:51 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 74EDB28587; Mon, 22 Jul 2019 16:08:51 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-5.2 required=2.0 tests=BAYES_00,MAILING_LIST_MULTI, RCVD_IN_DNSWL_MED,UNPARSEABLE_RELAY autolearn=ham version=3.3.1 Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher DHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id 06EE4284C3 for ; Mon, 22 Jul 2019 16:08:51 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 6833289CE2; Mon, 22 Jul 2019 16:08:49 +0000 (UTC) X-Original-To: dri-devel@lists.freedesktop.org Delivered-To: dri-devel@lists.freedesktop.org Received: from bhuna.collabora.co.uk (bhuna.collabora.co.uk [46.235.227.227]) by gabe.freedesktop.org (Postfix) with ESMTPS id 6F55189CB5 for ; Mon, 22 Jul 2019 16:08:46 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) (Authenticated sender: ezequiel) with ESMTPSA id B9F8B28B0A8 From: Ezequiel Garcia To: dri-devel@lists.freedesktop.org Subject: [PATCH libdrm 2/2] modetest: Add a new "-r" option to set a default mode Date: Mon, 22 Jul 2019 13:08:23 -0300 Message-Id: <20190722160823.26668-2-ezequiel@collabora.com> X-Mailer: git-send-email 2.22.0 In-Reply-To: <20190722160823.26668-1-ezequiel@collabora.com> References: <20190722160823.26668-1-ezequiel@collabora.com> MIME-Version: 1.0 X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Ezequiel Garcia , rohan.garg@collabora.com, Emil Velikov Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" X-Virus-Scanned: ClamAV using ClamSMTP This option finds the first connected connector and then sets its preferred mode on it. Set this option to be set when no mode or plane is set explicitily. This allows to quickly test, in cases where one just needs something displayed. Signed-off-by: Ezequiel Garcia Reviewed-by: Rohan Garg --- tests/modetest/modetest.c | 81 ++++++++++++++++++++++++++++++++++++--- 1 file changed, 75 insertions(+), 6 deletions(-) diff --git a/tests/modetest/modetest.c b/tests/modetest/modetest.c index 5e628127a130..6042aaae7cca 100644 --- a/tests/modetest/modetest.c +++ b/tests/modetest/modetest.c @@ -901,7 +901,9 @@ static int pipe_find_crtc_and_mode(struct device *dev, struct pipe_arg *pipe) drmModeModeInfo *mode = NULL; int i; - pipe->mode = NULL; + /* If set_preferred is used, a mode is already set. */ + if (pipe->mode) + goto find_crtc; for (i = 0; i < (int)pipe->num_cons; i++) { mode = connector_find_mode(dev, pipe->con_ids[i], @@ -913,7 +915,9 @@ static int pipe_find_crtc_and_mode(struct device *dev, struct pipe_arg *pipe) return -EINVAL; } } + pipe->mode = mode; +find_crtc: /* If the CRTC ID was specified, get the corresponding CRTC. Otherwise * locate a CRTC that can be attached to all the connectors. */ @@ -935,7 +939,6 @@ static int pipe_find_crtc_and_mode(struct device *dev, struct pipe_arg *pipe) return -EINVAL; } - pipe->mode = mode; pipe->crtc->mode = mode; return 0; @@ -1813,7 +1816,7 @@ static void parse_fill_patterns(char *arg) static void usage(char *name) { - fprintf(stderr, "usage: %s [-acDdefMPpsCvw]\n", name); + fprintf(stderr, "usage: %s [-acDdefMPpsCvrw]\n", name); fprintf(stderr, "\n Query options:\n\n"); fprintf(stderr, "\t-c\tlist connectors\n"); @@ -1826,6 +1829,7 @@ static void usage(char *name) fprintf(stderr, "\t-s [,][@]:[-][@]\tset a mode\n"); fprintf(stderr, "\t-C\ttest hw cursor\n"); fprintf(stderr, "\t-v\ttest vsynced page flipping\n"); + fprintf(stderr, "\t-r\tset the preferred mode\n"); fprintf(stderr, "\t-w ::\tset property\n"); fprintf(stderr, "\t-a \tuse atomic API\n"); fprintf(stderr, "\t-F pattern1,pattern2\tspecify fill patterns\n"); @@ -1874,6 +1878,9 @@ static int pipe_resolve_connectors(struct device *dev, struct pipe_arg *pipe) char *endp; for (i = 0; i < pipe->num_cons; i++) { + /* If set_preferred is used, the connector is already resolved. */ + if (pipe->con_ids[i]) + continue; id = strtoul(pipe->cons[i], &endp, 10); if (endp == pipe->cons[i]) { connector = get_connector_by_name(dev, pipe->cons[i]); @@ -1885,14 +1892,62 @@ static int pipe_resolve_connectors(struct device *dev, struct pipe_arg *pipe) id = connector->connector_id; } - pipe->con_ids[i] = id; } return 0; } -static char optstr[] = "acdD:efF:M:P:ps:Cvw:"; +static char optstr[] = "acdD:efF:M:P:ps:Cvrw:"; + +static int pipe_find_preferred(struct device *dev, struct pipe_arg *pipe) +{ + drmModeRes *res = dev->resources->res; + drmModeConnector *con = NULL; + char *con_str; + int i; + + for (i = 0; i < res->count_connectors; i++) { + con = drmModeGetConnector(dev->fd, res->connectors[i]); + if (con->connection == DRM_MODE_CONNECTED) + break; + drmModeFreeConnector(con); + con = NULL; + } + + if (!con) { + printf("no connected connector!\n"); + return -1; + } + + con_str = malloc(8); + sprintf(con_str, "%d", con->connector_id); + strcpy(pipe->format_str, "XR24"); + pipe->fourcc = util_format_fourcc(pipe->format_str); + pipe->num_cons = 1; + pipe->con_ids = calloc(1, sizeof(*pipe->con_ids)); + pipe->cons = calloc(1, sizeof(*pipe->cons)); + pipe->con_ids[0] = con->connector_id; + pipe->cons[0] = (const char*)con_str; + + /* A CRTC possible will be chosen by pipe_find_crtc_and_mode. */ + pipe->crtc_id = (uint32_t)-1; + + /* Return the first mode if no preferred. */ + pipe->mode = &con->modes[0]; + for (i = 0; i < con->count_modes; i++) { + drmModeModeInfo *current_mode = &con->modes[i]; + + if (current_mode->type & DRM_MODE_TYPE_PREFERRED) { + pipe->mode = current_mode; + break; + } + } + + sprintf(pipe->mode_str, "%dx%d", pipe->mode->hdisplay, pipe->mode->vdisplay); + + return 0; +} int main(int argc, char **argv) { @@ -1903,6 +1958,7 @@ int main(int argc, char **argv) int drop_master = 0; int test_vsync = 0; int test_cursor = 0; + int set_preferred = 0; int use_atomic = 0; char *device = NULL; char *module = NULL; @@ -1987,6 +2043,9 @@ int main(int argc, char **argv) case 'v': test_vsync = 1; break; + case 'r': + set_preferred = 1; + break; case 'w': prop_args = realloc(prop_args, (prop_count + 1) * sizeof *prop_args); @@ -2008,7 +2067,7 @@ int main(int argc, char **argv) } if (!args || (args == 1 && use_atomic)) - encoders = connectors = crtcs = planes = framebuffers = 1; + set_preferred = encoders = connectors = crtcs = planes = framebuffers = 1; dev.fd = util_open(device, module); if (dev.fd < 0) @@ -2044,6 +2103,16 @@ int main(int argc, char **argv) return 1; } + if (set_preferred) { + count = 1; + pipe_args = calloc(1, sizeof(*pipe_args)); + ret = pipe_find_preferred(&dev, &pipe_args[0]); + if (ret) { + fprintf(stderr, "can't get preferred connector and mode: %s\n", strerror(errno)); + return 1; + } + } + for (i = 0; i < count; i++) { if (pipe_resolve_connectors(&dev, &pipe_args[i]) < 0) { free_resources(dev.resources);