All of lore.kernel.org
 help / color / mirror / Atom feed
From: Devarsh Thakkar <devarsh.thakkar@xilinx.com>
To: dri-devel@lists.freedesktop.org
Cc: rsk@xilinx.com, vcu-team@xilinx.com, dshah@xilinx.com,
	devarsh.thakkar@xilinx.com, varunkum@xilinx.com,
	satishna@xilinx.com
Subject: [PATCH libdrm] modetest: Add support for setting mode having floating vertical refresh rate
Date: Wed,  6 Nov 2019 07:25:44 -0800	[thread overview]
Message-ID: <1573053944-4933-1-git-send-email-devarsh.thakkar@xilinx.com> (raw)

For the scenario where user may require to modeset with a mode
supporting a fractional value for vertical refresh-rate,
appropriate mode can be selected by searching for mode
having matching fractional vertical refresh rate using
below equation.

vrefresh = 1000 * (pixel clock) / (htotal * vtotal) Khz.

We do this way since driver doesn't return float value of vrefresh
as it use int for vrefresh in struct drm_mode_info, but we derive
the actual value using pixel clock, htotal and vtotal values.

So for e.g. if user want to select mode having 59.94 Hz as refresh rate
then with this patch it be can done as shown in below command,
given there is an appropriate mode is available :

modetest -M xlnx -s 39:1920x1080-59.94@BG24 -v

NOTE: Above command was tested on xilinx DRM driver with DP
monitor which was supporting mode having 59.94 Hz refresh rate.

Signed-off-by: Devarsh Thakkar <devarsh.thakkar@xilinx.com>
---
 tests/modetest/modetest.c | 32 ++++++++++++++++++++++++--------
 1 file changed, 24 insertions(+), 8 deletions(-)

diff --git a/tests/modetest/modetest.c b/tests/modetest/modetest.c
index e66be66..9b3e410 100644
--- a/tests/modetest/modetest.c
+++ b/tests/modetest/modetest.c
@@ -795,7 +795,7 @@ struct pipe_arg {
        uint32_t crtc_id;
        char mode_str[64];
        char format_str[5];
-       unsigned int vrefresh;
+       float vrefresh;
        unsigned int fourcc;
        drmModeModeInfo *mode;
        struct crtc *crtc;
@@ -822,11 +822,12 @@ struct plane_arg {

 static drmModeModeInfo *
 connector_find_mode(struct device *dev, uint32_t con_id, const char *mode_str,
-        const unsigned int vrefresh)
+       const float vrefresh)
 {
        drmModeConnector *connector;
        drmModeModeInfo *mode;
        int i;
+       float mode_vrefresh;

        connector = get_connector_by_id(dev, con_id);
        if (!connector || !connector->count_modes)
@@ -839,9 +840,19 @@ connector_find_mode(struct device *dev, uint32_t con_id, const char *mode_str,
                         * first mode that match with the name. Else, return the mode that match
                         * the name and the specified vertical refresh frequency.
                         */
+                       float temp;
+
+                       mode_vrefresh = ((float)(mode->clock) * 1000.00)
+                                        / ((float)(mode->htotal)
+                                        * (float)mode->vtotal);
+                       /* Round off to 2 decimal places to match with user
+                        * provided value
+                        */
+                       temp = (int) (mode_vrefresh * 100 + 0.5);
+                       mode_vrefresh = (float) temp / 100;
                        if (vrefresh == 0)
                                return mode;
-                       else if (mode->vrefresh == vrefresh)
+                       else if (mode_vrefresh == vrefresh)
                                return mode;
                }
        }
@@ -1393,8 +1404,8 @@ static void atomic_set_mode(struct device *dev, struct pipe_arg *pipes, unsigned
                if (pipe->mode == NULL)
                        continue;

-               printf("setting mode %s-%dHz on connectors ",
-                      pipe->mode_str, pipe->mode->vrefresh);
+               printf("setting mode %s-%.2fHz on connectors ",
+                      pipe->mode_str, pipe->vrefresh);
                for (j = 0; j < pipe->num_cons; ++j) {
                        printf("%s, ", pipe->cons[j]);
                        add_property(dev, pipe->con_ids[j], "CRTC_ID", pipe->crtc->crtc->crtc_id);
@@ -1476,8 +1487,8 @@ static void set_mode(struct device *dev, struct pipe_arg *pipes, unsigned int co
                if (pipe->mode == NULL)
                        continue;

-               printf("setting mode %s-%dHz@%s on connectors ",
-                      pipe->mode_str, pipe->mode->vrefresh, pipe->format_str);
+               printf("setting mode %s-%.2fHz@%s on connectors ",
+                      pipe->mode_str, pipe->vrefresh, pipe->format_str);
                for (j = 0; j < pipe->num_cons; ++j)
                        printf("%s, ", pipe->cons[j]);
                printf("crtc %d\n", pipe->crtc->crtc->crtc_id);
@@ -1713,8 +1724,13 @@ static int parse_connector(struct pipe_arg *pipe, const char *arg)
        pipe->mode_str[len] = '\0';

        if (*p == '-') {
-               pipe->vrefresh = strtoul(p + 1, &endp, 10);
+               float temp;
+
+               pipe->vrefresh = strtof(p + 1, &endp);
                p = endp;
+               /* Round off to 2 decimal places */
+               temp = (int) (pipe->vrefresh * 100 + 0.5);
+               pipe->vrefresh = (float) temp / 100;
        }

        if (*p == '@') {
--
2.7.4

This email and any attachments are intended for the sole use of the named recipient(s) and contain(s) confidential information that may be proprietary, privileged or copyrighted under applicable law. If you are not the intended recipient, do not read, copy, or forward this email message or any attachments. Delete this email message and any attachments immediately.
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

                 reply	other threads:[~2019-11-06 15:26 UTC|newest]

Thread overview: [no followups] expand[flat|nested]  mbox.gz  Atom feed

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1573053944-4933-1-git-send-email-devarsh.thakkar@xilinx.com \
    --to=devarsh.thakkar@xilinx.com \
    --cc=dri-devel@lists.freedesktop.org \
    --cc=dshah@xilinx.com \
    --cc=rsk@xilinx.com \
    --cc=satishna@xilinx.com \
    --cc=varunkum@xilinx.com \
    --cc=vcu-team@xilinx.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.