[igt-dev] [PATCH i-g-t 4/4] Add device selection in IGT

Petri Latvala petri.latvala at intel.com
Mon Nov 18 12:14:04 UTC 2019


On Thu, Oct 24, 2019 at 02:05:15PM +0300, Arkadiusz Hiler wrote:
> From: Zbigniew Kempczyński <zbigniew.kempczynski at intel.com>
> 
> New IGT command line argument --device, IGT_DEVICE enviroment
> and .igtrc Common::Device were added to allow selecting device
> using device selection API.
> 
> v2 (Arek):
>  * remove functions acting on igt_device_card
>  * use only a single filter
> 
> Cc: Petri Latvala <petri.latvala at intel.com>
> Signed-off-by: Zbigniew Kempczyński <zbigniew.kempczynski at intel.com>
> Signed-off-by: Arkadiusz Hiler <arkadiusz.hiler at intel.com>
> ---
>  .../igt-gpu-tools/igt_test_programs.xml       |  7 ++
>  lib/drmtest.c                                 | 94 +++++++++++++++++--
>  lib/drmtest.h                                 |  2 +
>  lib/igt_core.c                                | 47 ++++++++++
>  4 files changed, 142 insertions(+), 8 deletions(-)
> 
> diff --git a/docs/reference/igt-gpu-tools/igt_test_programs.xml b/docs/reference/igt-gpu-tools/igt_test_programs.xml
> index b64ba474..fcce1458 100644
> --- a/docs/reference/igt-gpu-tools/igt_test_programs.xml
> +++ b/docs/reference/igt-gpu-tools/igt_test_programs.xml
> @@ -43,6 +43,13 @@
>              </para></listitem>
>            </varlistentry>
>  
> +          <varlistentry>
> +            <term><option>--device filter</option></term>
> +            <listitem><para>
> +                select device using filter (see "Device selection" for details)
> +            </para></listitem>
> +          </varlistentry>
> +
>            <varlistentry>
>              <term><option>--help-description</option></term>
>              <listitem><para>
> diff --git a/lib/drmtest.c b/lib/drmtest.c
> index c379a7b7..43471625 100644
> --- a/lib/drmtest.c
> +++ b/lib/drmtest.c
> @@ -55,6 +55,7 @@
>  #include "igt_gt.h"
>  #include "igt_kmod.h"
>  #include "igt_sysfs.h"
> +#include "igt_device_scan.h"
>  #include "version.h"
>  #include "config.h"
>  #include "intel_reg.h"
> @@ -266,14 +267,9 @@ static int __search_and_open(const char *base, int offset, unsigned int chipset)
>  	return -1;
>  }
>  
> -static int __open_driver(const char *base, int offset, unsigned int chipset)
> +static void __try_modprobe(unsigned int chipset)
>  {
>  	static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
> -	int fd;
> -
> -	fd = __search_and_open(base, offset, chipset);
> -	if (fd != -1)
> -		return fd;
>  
>  	pthread_mutex_lock(&mutex);
>  	for (const struct module *m = modules; m->module; m++) {
> @@ -285,26 +281,108 @@ static int __open_driver(const char *base, int offset, unsigned int chipset)
>  		}
>  	}
>  	pthread_mutex_unlock(&mutex);
> +}
> +
> +static int __open_driver(const char *base, int offset, unsigned int chipset)
> +{
> +	int fd;
> +
> +	fd = __search_and_open(base, offset, chipset);
> +	if (fd != -1)
> +		return fd;
> +
> +	__try_modprobe(chipset);
>  
>  	return __search_and_open(base, offset, chipset);
>  }
>  
> +static int __open_driver_exact(const char *name, unsigned int chipset)
> +{
> +	int fd;
> +
> +	fd = open_device(name, chipset);
> +	if (fd != -1)
> +		return fd;
> +
> +	__try_modprobe(chipset);
> +
> +	return open_device(name, chipset);
> +}
> +
> +/*
> + * A helper to get the first marching card in case a filter is set.

Cards can do what?

'matching' might be more appropriate.


> + * It does all the extra logging around the filters for us.
> + *
> + * @card: pointer to the igt_device_card structure to be filled
> + * when a card is found.
> + *
> + * Returns:
> + * True if card according to the added filter was found,
> + * false othwerwise.
> + */
> +static bool __get_the_first_card(struct igt_device_card *card)
> +{
> +	const char *filter;
> +
> +	if (igt_device_is_filter_set()) {
> +		filter = igt_device_filter_get();
> +		igt_info("Looking for devices to open using filter: %s\n", filter);
> +
> +		if (igt_device_card_match(filter, card)) {
> +			igt_info("Filter matched %s | %s\n", card->card, card->render);
> +			return true;
> +		}
> +
> +		igt_warn("No card matches the filter!\n");
> +	}
> +
> +	return false;
> +}
> +
>  /**
>   * __drm_open_driver:
>   * @chipset: OR'd flags for each chipset to search, eg. #DRIVER_INTEL
>   *
> - * Open the first DRM device we can find, searching up to 16 device nodes
> + * Function opens device in the following order:
> + * 1. when --device arguments are present device scanning will be executed,
> + * then filter argument is used to find matching one.
> + * 2. compatibility mode - open the first DRM device we can find,
> + * searching up to 16 device nodes.
>   *
>   * Returns:
>   * An open DRM fd or -1 on error
>   */
>  int __drm_open_driver(int chipset)
>  {
> +	if (igt_device_is_filter_set()) {
> +		bool found;
> +		struct igt_device_card card;
> +
> +		found = __get_the_first_card(&card);
> +
> +		if (!found || !strlen(card.card))
> +			return -1;
> +
> +		return __open_driver_exact(card.card, chipset);
> +	}
> +
>  	return __open_driver("/dev/dri/card", 0, chipset);
>  }

I'm a little confused how this all works with IGT_FORCE_DRIVER? And
how does this work for tests that open two different drivers?


-- 
Petri Latvala


More information about the igt-dev mailing list