On Mon, Nov 16, 2020 at 05:26:52PM +0000, Tvrtko Ursulin wrote:
> From: Tvrtko Ursulin <[email protected]>
> 
> In the previous patch we switched the lsgpu output to a short and user
> friendly format but some users will need a shorthand for getting other
> types of device selection filters than the defaut drm.
> 
> Add some command line switches to enable this:
> 
> $ lsgpu
> card0                   8086:193B    drm:/dev/dri/card0
> └─renderD128                         drm:/dev/dri/renderD128
> 
> $ lsgpu --sysfs
> card0                   8086:193B    
> sys:/sys/devices/pci0000:00/0000:00:02.0/drm/card0
> └─renderD128                         
> sys:/sys/devices/pci0000:00/0000:00:02.0/drm/renderD128
> 
> $ lsgpu --pci
> card0                   8086:193B    pci:vendor=8086,device=193B,card=0
> └─renderD128
> 
> v2:
>  * Fix pci filter format.
> 
> Signed-off-by: Tvrtko Ursulin <[email protected]>
> Suggested-by: Zbigniew Kempczyński <[email protected]>
> Cc: Petri Latvala <[email protected]>
> ---
>  lib/igt_device_scan.c | 83 ++++++++++++++++++++++++++++++++-----------
>  lib/igt_device_scan.h | 15 ++++++--
>  tools/intel_gpu_top.c |  6 +++-
>  tools/lsgpu.c         | 32 +++++++++++++----
>  4 files changed, 106 insertions(+), 30 deletions(-)
> 
> diff --git a/lib/igt_device_scan.c b/lib/igt_device_scan.c
> index ecb8db297f86..e97f7163ba70 100644
> --- a/lib/igt_device_scan.c
> +++ b/lib/igt_device_scan.c
> @@ -777,7 +777,9 @@ static bool __check_empty(struct igt_list_head *view)
>       return false;
>  }
>  
> -static void igt_devs_print_simple(struct igt_list_head *view)
> +static void
> +igt_devs_print_simple(struct igt_list_head *view,
> +                   const struct igt_devices_print_format *fmt)
>  {
>       struct igt_device *dev;
>  
> @@ -821,7 +823,38 @@ __find_pci(struct igt_list_head *view, const char *drm)
>       return NULL;
>  }
>  
> -static void igt_devs_print_user(struct igt_list_head *view)
> +static void __print_filter(char *buf, int len,
> +                        const struct igt_devices_print_format *fmt,
> +                        struct igt_device *dev,
> +                        bool render)
> +{
> +     int ret;
> +
> +     switch (fmt->option) {
> +     case IGT_PRINT_DRM:
> +             ret = snprintf(buf, len, "drm:%s",
> +                            render ? dev->drm_render : dev->drm_card);
> +             igt_assert(ret < len);
> +             break;
> +     case IGT_PRINT_SYSFS:
> +             ret = snprintf(buf, len, "sys:%s", dev->syspath);
> +             igt_assert(ret < len);
> +             break;
> +     case IGT_PRINT_PCI:
> +             if (!render) {
> +                     ret = snprintf(buf, len,
> +                                    "pci:vendor=%s,device=%s,card=%d",
> +                                    dev->vendor, dev->device,
> +                                    dev->gpu_index);
> +                     igt_assert(ret < len);
> +             }
> +             break;
> +     };

You could leave single assert after the switch but this is minor nit.

> +}
> +
> +static void
> +igt_devs_print_user(struct igt_list_head *view,
> +                 const struct igt_devices_print_format *fmt)
>  {
>       struct igt_device *dev;
>  
> @@ -834,7 +867,6 @@ static void igt_devs_print_user(struct igt_list_head 
> *view)
>               struct igt_device *dev2;
>               char filter[256];
>               char *drm_name;
> -             int ret;
>  
>               if (!is_drm_subsystem(dev))
>                       continue;
> @@ -845,16 +877,21 @@ static void igt_devs_print_user(struct igt_list_head 
> *view)
>               if (!drm_name || !*++drm_name)
>                       continue;
>  
> -             ret = snprintf(filter, sizeof(filter), "drm:%s", dev->drm_card);
> -             igt_assert(ret < sizeof(filter));
> -
>               pci_dev = __find_pci(view, dev->drm_card);
> -             if (pci_dev)
> +
> +             if (fmt->option == IGT_PRINT_PCI && !pci_dev)
> +                     continue;
> +
> +             if (pci_dev) {
> +                     __print_filter(filter, sizeof(filter), fmt, pci_dev,
> +                                    false);
>                       printf("%-24s%4s:%4s    %s\n",
>                              drm_name, pci_dev->vendor, pci_dev->device,
>                              filter);
> -             else
> +             } else {
> +                     __print_filter(filter, sizeof(filter), fmt, dev, false);
>                       printf("%-24s             %s\n", drm_name, filter);
> +             }
>  
>               num_children = 0;
>               igt_list_for_each_entry(dev2, view, link) {
> @@ -877,13 +914,15 @@ static void igt_devs_print_user(struct igt_list_head 
> *view)
>                       if (!drm_name || !*++drm_name)
>                               continue;
>  
> -                     ret = snprintf(filter, sizeof(filter), "drm:%s",
> -                                    dev2->drm_render);
> -                     igt_assert(ret < sizeof(filter));
> -
> -                     printf("%s%-22s             %s\n",
> -                            (++i == num_children) ? "└─" : "├─",
> -                            drm_name, filter);
> +                     printf("%s%-22s",
> +                             (++i == num_children) ? "└─" : "├─", drm_name);
> +                     if (fmt->option != IGT_PRINT_PCI) {
> +                             __print_filter(filter, sizeof(filter), fmt,
> +                                            dev2, true);
> +                             printf("             %s\n", filter);
> +                     } else {
> +                             printf("\n");
> +                     }
>               }
>       }
>  }
> @@ -908,7 +947,10 @@ static void print_ht(GHashTable *ht)
>       g_list_free(keys);
>  }
>  
> -static void igt_devs_print_detail(struct igt_list_head *view)
> +static void
> +igt_devs_print_detail(struct igt_list_head *view,
> +                   const struct igt_devices_print_format *fmt)
> +
>  {
>       struct igt_device *dev;
>  
> @@ -932,7 +974,8 @@ static void igt_devs_print_detail(struct igt_list_head 
> *view)
>  }
>  
>  static struct print_func {
> -     void (*prn)(struct igt_list_head *view);
> +     void (*prn)(struct igt_list_head *view,
> +                 const struct igt_devices_print_format *);
>  } print_functions[] = {
>       [IGT_PRINT_SIMPLE] = { .prn = igt_devs_print_simple },
>       [IGT_PRINT_DETAIL] = { .prn = igt_devs_print_detail },
> @@ -941,15 +984,15 @@ static struct print_func {
>  
>  /**
>   * igt_devices_print
> - * @printtype: IGT_PRINT_SIMPLE or IGT_PRINT_DETAIL
> + * @fmt: Print format as specified by struct igt_devices_print_format
>   *
>   * Function can be used by external tool to print device array in simple
>   * or detailed form. This function is added here to avoid exposing
>   * internal implementation data structures.
>   */
> -void igt_devices_print(enum igt_devices_print_type printtype)
> +void igt_devices_print(const struct igt_devices_print_format *fmt)
>  {
> -     print_functions[printtype].prn(&igt_devs.filtered);
> +     print_functions[fmt->type].prn(&igt_devs.filtered, fmt);
>  }
>  
>  /**
> diff --git a/lib/igt_device_scan.h b/lib/igt_device_scan.h
> index 9822c22cb69c..bb4be72345fb 100644
> --- a/lib/igt_device_scan.h
> +++ b/lib/igt_device_scan.h
> @@ -35,11 +35,22 @@
>  #include <unistd.h>
>  
>  enum igt_devices_print_type {
> -     IGT_PRINT_SIMPLE,
> +     IGT_PRINT_SIMPLE = 0,
>       IGT_PRINT_DETAIL,
>       IGT_PRINT_USER, /* End user friendly. */
>  };
>  
> +enum igt_devices_print_option {
> +     IGT_PRINT_DRM = 0,
> +     IGT_PRINT_SYSFS,
> +     IGT_PRINT_PCI,
> +};
> +
> +struct igt_devices_print_format {
> +     enum igt_devices_print_type   type;
> +     enum igt_devices_print_option option;
> +};
> +
>  #define INTEGRATED_I915_GPU_PCI_ID "0000:00:02.0"
>  #define PCI_SLOT_NAME_SIZE 12
>  struct igt_device_card {
> @@ -51,7 +62,7 @@ struct igt_device_card {
>  
>  void igt_devices_scan(bool force);
>  
> -void igt_devices_print(enum igt_devices_print_type printtype);
> +void igt_devices_print(const struct igt_devices_print_format *fmt);
>  void igt_devices_print_vendors(void);
>  void igt_device_print_filter_types(void);
>  
> diff --git a/tools/intel_gpu_top.c b/tools/intel_gpu_top.c
> index 5230472d2af4..07f88d555dc8 100644
> --- a/tools/intel_gpu_top.c
> +++ b/tools/intel_gpu_top.c
> @@ -1387,7 +1387,11 @@ int main(int argc, char **argv)
>       igt_devices_scan(false);
>  
>       if (list_device) {
> -             igt_devices_print(IGT_PRINT_USER);
> +             struct igt_devices_print_format fmt = {
> +                     .type = IGT_PRINT_USER
> +             };
> +
> +             igt_devices_print(&fmt);
>               goto exit;
>       }
>  
> diff --git a/tools/lsgpu.c b/tools/lsgpu.c
> index 3b234b73361a..169ab0c29e50 100644
> --- a/tools/lsgpu.c
> +++ b/tools/lsgpu.c
> @@ -91,7 +91,11 @@ static const char *usage_str =
>       "  -v, --list-vendors          List recognized vendors\n"
>       "  -l, --list-filter-types     List registered device filters types\n"
>       "  -d, --device filter         Device filter, can be given multiple 
> times\n"
> -     "  -h, --help                  Show this help message and exit\n";
> +     "  -h, --help                  Show this help message and exit\n"
> +     "\nOptions valid for default print out mode only:\n"
> +     "      --drm                   Show DRM filters (default) for each 
> device\n"
> +     "      --sysfs                 Show sysfs filters for each device\n"
> +     "      --pci                   Show PCI filters for each device\n";
>  
>  static void test_device_open(struct igt_device_card *card)
>  {
> @@ -153,6 +157,9 @@ static char *get_device_from_rc(void)
>  int main(int argc, char *argv[])
>  {
>       static struct option long_options[] = {
> +             {"drm",               no_argument,       NULL, 0},
> +             {"sysfs",             no_argument,       NULL, 1},
> +             {"pci",               no_argument,       NULL, 2},
>               {"print-simple",      no_argument,       NULL, 
> OPT_PRINT_SIMPLE},
>               {"print-detail",      no_argument,       NULL, 
> OPT_PRINT_DETAIL},
>               {"list-vendors",      no_argument,       NULL, 
> OPT_LIST_VENDORS},
> @@ -163,17 +170,19 @@ int main(int argc, char *argv[])
>       };
>       int c, index = 0;
>       char *env_device = NULL, *opt_device = NULL, *rc_device = NULL;
> -     enum igt_devices_print_type printtype = IGT_PRINT_USER;
> +     struct igt_devices_print_format fmt = {
> +                     .type = IGT_PRINT_USER,
> +     };
>  
>       while ((c = getopt_long(argc, argv, "spvld:h",
>                               long_options, &index)) != -1) {
>               switch(c) {
>  
>               case OPT_PRINT_SIMPLE:
> -                     printtype = IGT_PRINT_SIMPLE;
> +                     fmt.type = IGT_PRINT_SIMPLE;
>                       break;
>               case OPT_PRINT_DETAIL:
> -                     printtype = IGT_PRINT_DETAIL;
> +                     fmt.type = IGT_PRINT_DETAIL;
>                       break;
>               case OPT_LIST_VENDORS:
>                       g_show_vendors = true;
> @@ -187,6 +196,15 @@ int main(int argc, char *argv[])
>               case OPT_HELP:
>                       g_help = true;
>                       break;
> +             case 0:
> +                     fmt.option = IGT_PRINT_DRM;
> +                     break;
> +             case 1:
> +                     fmt.option = IGT_PRINT_SYSFS;
> +                     break;
> +             case 2:
> +                     fmt.option = IGT_PRINT_PCI;
> +                     break;
>               }
>       }
>  
> @@ -239,14 +257,14 @@ int main(int argc, char *argv[])
>               printf("Device detail:\n");
>               print_card(&card);
>               test_device_open(&card);
> -             if (printtype == IGT_PRINT_DETAIL) {
> +             if (fmt.type == IGT_PRINT_DETAIL) {
>                       printf("\n");
> -                     igt_devices_print(printtype);
> +                     igt_devices_print(&fmt);
>               }
>               printf("-------------------------------------------\n");
>  
>       } else {
> -             igt_devices_print(printtype);
> +             igt_devices_print(&fmt);
>       }
>  
>       free(rc_device);
> -- 
> 2.25.1
>

Ok, haven't tracked other issues and LGTM:

Reviewed-by: Zbigniew Kempczyński <[email protected]>

--
Zbigniew 
_______________________________________________
Intel-gfx mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

Reply via email to