diff options
Diffstat (limited to 'tests/modetest')
| -rw-r--r-- | tests/modetest/modetest.c | 35 | 
1 files changed, 27 insertions, 8 deletions
| diff --git a/tests/modetest/modetest.c b/tests/modetest/modetest.c index 51c4e6da..bc9c9988 100644 --- a/tests/modetest/modetest.c +++ b/tests/modetest/modetest.c @@ -693,6 +693,7 @@ struct pipe_arg {  	uint32_t crtc_id;  	char mode_str[64];  	char format_str[5]; +	unsigned int vrefresh;  	unsigned int fourcc;  	drmModeModeInfo *mode;  	struct crtc *crtc; @@ -714,7 +715,8 @@ struct plane_arg {  };  static drmModeModeInfo * -connector_find_mode(struct device *dev, uint32_t con_id, const char *mode_str) +connector_find_mode(struct device *dev, uint32_t con_id, const char *mode_str, +        const unsigned int vrefresh)  {  	drmModeConnector *connector;  	drmModeModeInfo *mode; @@ -726,8 +728,16 @@ 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)) -			return mode; +		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 (vrefresh == 0) +				return mode; +			else if (mode->vrefresh == vrefresh) +				return mode; +		}  	}  	return NULL; @@ -789,7 +799,7 @@ 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->mode_str, pipe->vrefresh);  		if (mode == NULL) {  			fprintf(stderr,  				"failed to find mode \"%s\" for connector %u\n", @@ -1059,8 +1069,8 @@ static void set_mode(struct device *dev, struct pipe_arg *pipes, unsigned int co  		if (pipe->mode == NULL)  			continue; -		printf("setting mode %s@%s on connectors ", -		       pipe->mode_str, pipe->format_str); +		printf("setting mode %s-%dHz@%s on connectors ", +		       pipe->mode_str, pipe->mode->vrefresh, pipe->format_str);  		for (j = 0; j < pipe->num_cons; ++j)  			printf("%u, ", pipe->con_ids[j]);  		printf("crtc %d\n", pipe->crtc->crtc->crtc_id); @@ -1192,6 +1202,7 @@ static int parse_connector(struct pipe_arg *pipe, const char *arg)  	const char *p;  	char *endp; +	pipe->vrefresh = 0;  	pipe->crtc_id = (uint32_t)-1;  	strcpy(pipe->format_str, "XR24"); @@ -1226,11 +1237,19 @@ static int parse_connector(struct pipe_arg *pipe, const char *arg)  	arg = endp + 1; -	p = strchrnul(arg, '@'); +	/* Search for the vertical refresh or the format. */ +	p = strpbrk(arg, "-@"); +	if (p == NULL) +		p = arg + strlen(arg);  	len = min(sizeof pipe->mode_str - 1, (unsigned int)(p - arg));  	strncpy(pipe->mode_str, arg, len);  	pipe->mode_str[len] = '\0'; +	if (*p == '-') { +		pipe->vrefresh = strtoul(p + 1, &endp, 10); +		p = endp; +	} +  	if (*p == '@') {  		strncpy(pipe->format_str, p + 1, 4);  		pipe->format_str[4] = '\0'; @@ -1323,7 +1342,7 @@ static void usage(char *name)  	fprintf(stderr, "\n Test options:\n\n");  	fprintf(stderr, "\t-P <crtc_id>:<w>x<h>[+<x>+<y>][*<scale>][@<format>]\tset a plane\n"); -	fprintf(stderr, "\t-s <connector_id>[,<connector_id>][@<crtc_id>]:<mode>[@<format>]\tset a mode\n"); +	fprintf(stderr, "\t-s <connector_id>[,<connector_id>][@<crtc_id>]:<mode>[-<vrefresh>][@<format>]\tset a mode\n");  	fprintf(stderr, "\t-v\ttest vsynced page flipping\n");  	fprintf(stderr, "\t-w <obj_id>:<prop_name>:<value>\tset property\n"); | 
