[igt-dev] [PATCH i-g-t v3] lib/drmtest: Move open device to separate function

Petri Latvala petri.latvala at intel.com
Fri Aug 31 11:51:08 UTC 2018


On Fri, Aug 31, 2018 at 01:00:49PM +0200, Katarzyna Dec wrote:
> While working on IGT code and during reviewes I've noticed that
> it could be nice to have function that is opening particular device.
> Let's move out conditions for opening device and rename __open_device
> to __search_and_open() function.
> 
> v2: Refactored open_device even more by getting device name once and
> returning fd for it. (Chris)
> v3: Added name_size to __get_drm_device_name.
> 
> Signed-off-by: Katarzyna Dec <katarzyna.dec at intel.com>
> Cc: Daniele Ceraolo Spurio <daniele.ceraolospurio at intel.com>
> Cc: Chris Wilson <chris at chris-wilson.co.uk>
> ---



This breaks opening virtio_gpu.


-- 
Petri Latvala






>  lib/drmtest.c | 108 ++++++++++++++++++++++----------------------------
>  1 file changed, 48 insertions(+), 60 deletions(-)
> 
> diff --git a/lib/drmtest.c b/lib/drmtest.c
> index fae6f86f..d2c7a332 100644
> --- a/lib/drmtest.c
> +++ b/lib/drmtest.c
> @@ -77,12 +77,12 @@
>  
>  uint16_t __drm_device_id;
>  
> -static int __get_drm_device_name(int fd, char *name)
> +static int __get_drm_device_name(int fd, char *name, int name_size)
>  {
>  	drm_version_t version;
>  
>  	memset(&version, 0, sizeof(version));
> -	version.name_len = 4;
> +	version.name_len = name_size;
>  	version.name = name;
>  
>  	if (!drmIoctl(fd, DRM_IOCTL_VERSION, &version)){
> @@ -96,7 +96,7 @@ static bool __is_device(int fd, const char *expect)
>  {
>  	char name[5] = "";
>  
> -	if (__get_drm_device_name(fd, name))
> +	if (__get_drm_device_name(fd, name, 4))
>  		return false;
>  
>  	return strcmp(expect, name) == 0;
> @@ -107,26 +107,6 @@ bool is_i915_device(int fd)
>  	return __is_device(fd, "i915");
>  }
>  
> -static bool is_vc4_device(int fd)
> -{
> -	return __is_device(fd, "vc4");
> -}
> -
> -static bool is_vgem_device(int fd)
> -{
> -	return __is_device(fd, "vgem");
> -}
> -
> -static bool is_virtio_device(int fd)
> -{
> -	return __is_device(fd, "virt");
> -}
> -
> -static bool is_amd_device(int fd)
> -{
> -	return __is_device(fd, "amdg");
> -}
> -
>  static bool has_known_intel_chipset(int fd)
>  {
>  	struct drm_i915_getparam gp;
> @@ -218,38 +198,58 @@ static void modprobe_i915(const char *name)
>  	igt_i915_driver_load(NULL);
>  }
>  
> -static int __open_device(const char *base, int offset, unsigned int chipset)
> +static const struct module {
> +		unsigned int bit;
> +		const char *module;
> +		void (*modprobe)(const char *name);
> +	} modules[] = {
> +		{ DRIVER_AMDGPU, "amdgpu" },
> +		{ DRIVER_INTEL, "i915", modprobe_i915 },
> +		{ DRIVER_VC4, "vc4" },
> +		{ DRIVER_VGEM, "vgem" },
> +		{ DRIVER_VIRTIO, "virtio-gpu" },
> +		{}
> +	};
> +
> +static int open_device(const char *name, unsigned int chipset)
>  {
> -	for (int i = 0; i < 16; i++) {
> -		char name[80];
> -		int fd;
> +	int fd;
> +	char dev_name[16] = "";
> +	int chip = DRIVER_ANY;
>  
> -		sprintf(name, "%s%u", base, i + offset);
> -		fd = open(name, O_RDWR);
> -		if (fd == -1)
> -			continue;
> +	fd = open(name, O_RDWR);
> +	if (fd == -1)
> +		return -1;
>  
> -		if (chipset & DRIVER_INTEL && is_i915_device(fd) &&
> -		    has_known_intel_chipset(fd))
> -			return fd;
> +	if (__get_drm_device_name(fd, dev_name, (sizeof(dev_name) - 1)) == -1)
> +		return -1;
>  
> -		if (chipset & DRIVER_VC4 && is_vc4_device(fd))
> -			return fd;
> +	for (const struct module *m = modules; m->module; m++) {
> +		if (strcmp(m->module, dev_name) == 0) {
> +			chip = m->bit;
> +			break;
> +		}
> +	}
> +	if (chipset & chip)
> +		return fd;
>  
> -		if (chipset & DRIVER_VGEM && is_vgem_device(fd))
> -			return fd;
> +	close(fd);
>  
> -		if (chipset & DRIVER_VIRTIO && is_virtio_device(fd))
> -			return fd;
> +	return -1;
> +}
>  
> -		if (chipset & DRIVER_AMDGPU && is_amd_device(fd))
> -			return fd;
> +static int __search_and_open(const char *base, int offset, unsigned int chipset)
> +{
> +	for (int i = 0; i < 16; i++) {
> +		char name[80];
> +		int fd;
>  
> -		/* Only VGEM-specific tests should be run on VGEM */
> -		if (chipset == DRIVER_ANY && !is_vgem_device(fd))
> +		sprintf(name, "%s%u", base, i + offset);
> +		fd = open_device(name, chipset);
> +		if (fd == -1)
> +			continue;
> +		else
>  			return fd;
> -
> -		close(fd);
>  	}
>  
>  	return -1;
> @@ -258,21 +258,9 @@ static int __open_device(const char *base, int offset, unsigned int chipset)
>  static int __open_driver(const char *base, int offset, unsigned int chipset)
>  {
>  	static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
> -	static const struct module {
> -		unsigned int bit;
> -		const char *module;
> -		void (*modprobe)(const char *name);
> -	} modules[] = {
> -		{ DRIVER_AMDGPU, "amdgpu" },
> -		{ DRIVER_INTEL, "i915", modprobe_i915 },
> -		{ DRIVER_VC4, "vc4" },
> -		{ DRIVER_VGEM, "vgem" },
> -		{ DRIVER_VIRTIO, "virtio-gpu" },
> -		{}
> -	};
>  	int fd;
>  
> -	fd = __open_device(base, offset, chipset);
> +	fd = __search_and_open(base, offset, chipset);
>  	if (fd != -1)
>  		return fd;
>  
> @@ -287,7 +275,7 @@ static int __open_driver(const char *base, int offset, unsigned int chipset)
>  	}
>  	pthread_mutex_unlock(&mutex);
>  
> -	return __open_device(base, offset, chipset);
> +	return __search_and_open(base, offset, chipset);
>  }
>  
>  /**
> -- 
> 2.17.1
> 
> _______________________________________________
> igt-dev mailing list
> igt-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/igt-dev


More information about the igt-dev mailing list