On 02/12/2019 18:12, Ville Syrjälä wrote: > On Mon, Dec 02, 2019 at 03:27:51AM -0800, Devarsh Thakkar wrote: >> Add function to derive floating value of vertical >> refresh rate from drm mode using pixel clock, >> horizontal total size and vertical total size. >> >> Use this function to find suitable mode having vrefresh >> value which is matching with user provided vrefresh value. >> >> If user doesn't provide any vrefresh value in args then >> update vertical refresh rate value in pipe args using this >> function. >> >> Also use this function for printing floating vrefresh while >> dumping all available modes. >> >> This will give more accurate picture to user for available modes >> differentiated by floating vertical refresh rate and help user >> select more appropriate mode using suitable refresh rate value. >> >> V3: Change name of function used to derive refresh rate. >> V2: 1) Don't use inline function for deriving refresh rate from mode. >> 2) If requested mode not found, print refresh rate only >> if user had provided it in args. >> >> Signed-off-by: Devarsh Thakkar <devarsh.thakkar@xxxxxxxxxx> >> --- >> tests/modetest/modetest.c | 40 +++++++++++++++++++++++++++------------- >> 1 file changed, 27 insertions(+), 13 deletions(-) >> >> diff --git a/tests/modetest/modetest.c b/tests/modetest/modetest.c >> index b4edfcb..19ce20f 100644 >> --- a/tests/modetest/modetest.c >> +++ b/tests/modetest/modetest.c >> @@ -133,6 +133,12 @@ static inline int64_t U642I64(uint64_t val) >> return (int64_t)*((int64_t *)&val); >> } >> >> +static float mode_vrefresh(drmModeModeInfo *mode) >> +{ >> + return mode->clock * 1000.00 >> + / (mode->htotal * mode->vtotal); >> +} >> + >> #define bit_name_fn(res) \ >> const char * res##_str(int type) { \ >> unsigned int i; \ >> @@ -210,9 +216,9 @@ static void dump_encoders(struct device *dev) >> >> static void dump_mode(drmModeModeInfo *mode) >> { >> - printf(" %s %d %d %d %d %d %d %d %d %d %d", >> + printf(" %s %.2f %d %d %d %d %d %d %d %d %d", >> mode->name, >> - mode->vrefresh, >> + mode_vrefresh(mode), >> mode->hdisplay, >> mode->hsync_start, >> mode->hsync_end, >> @@ -823,12 +829,11 @@ struct plane_arg { >> >> static drmModeModeInfo * >> connector_find_mode(struct device *dev, uint32_t con_id, const char *mode_str, >> - const float vrefresh) >> + float *vrefresh) > > This change still looks pointless. Without this, you cannot set 1000/1001 CEA alternate clock modes, so, no this is not pointless. This is actual something I always wanted to implement ! Reviewed-by: Neil Armstrong <narmstrong@xxxxxxxxxxxx> > >> { >> drmModeConnector *connector; >> drmModeModeInfo *mode; >> int i; >> - float mode_vrefresh; >> >> connector = get_connector_by_id(dev, con_id); >> if (!connector || !connector->count_modes) >> @@ -837,16 +842,19 @@ connector_find_mode(struct device *dev, uint32_t con_id, const char *mode_str, >> for (i = 0; i < connector->count_modes; i++) { >> mode = &connector->modes[i]; >> if (!strcmp(mode->name, mode_str)) { >> - /* If the vertical refresh frequency is not specified then return the >> - * first mode that match with the name. Else, return the mode that match >> - * the name and the specified vertical refresh frequency. >> + /* If the vertical refresh frequency is not specified >> + * then return the first mode that match with the name >> + * and update corresponding vrefresh in pipe_arg. >> + * Else, return the mode that match the name and >> + * the specified vertical refresh frequency. >> */ >> - mode_vrefresh = mode->clock * 1000.00 >> - / (mode->htotal * mode->vtotal); >> - if (vrefresh == 0) >> + if (*vrefresh == 0) { >> + *vrefresh = mode_vrefresh(mode); >> return mode; >> - else if (fabs(mode_vrefresh - vrefresh) < 0.005) >> + } else if (fabs(mode_vrefresh(mode) >> + - *vrefresh) < 0.005) { >> return mode; >> + } >> } >> } >> >> @@ -909,9 +917,15 @@ static int pipe_find_crtc_and_mode(struct device *dev, struct pipe_arg *pipe) >> >> for (i = 0; i < (int)pipe->num_cons; i++) { >> mode = connector_find_mode(dev, pipe->con_ids[i], >> - pipe->mode_str, pipe->vrefresh); >> + pipe->mode_str, &pipe->vrefresh); >> if (mode == NULL) { >> - fprintf(stderr, >> + if (pipe->vrefresh) >> + fprintf(stderr, >> + "failed to find mode " >> + "\"%s-%.2fHz\" for connector %s\n", >> + pipe->mode_str, pipe->vrefresh, pipe->cons[i]); >> + else >> + fprintf(stderr, >> "failed to find mode \"%s\" for connector %s\n", >> pipe->mode_str, pipe->cons[i]); >> return -EINVAL; >> -- >> 2.7.4 > _______________________________________________ dri-devel mailing list dri-devel@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/dri-devel