[PATCH v15 3/5] tools/gputop/utils: Add gputop utility functions common to all drivers

Riana Tauro riana.tauro at intel.com
Thu Jun 26 09:32:23 UTC 2025



On 6/26/2025 2:46 PM, Soham Purkait wrote:
> Implement utility functions in gputop for common operations and data
> handling across different drivers.
> 
> v1:
>   - Refactor GPUTOP into a vendor-agnostic tool. (Lucas)
> v2:
>   - Remove magic number. (Krzysztof)
> 
> Signed-off-by: Soham Purkait <soham.purkait at intel.com>

Looks good to me
Reviewed-by: Riana Tauro <riana.tauro at intel.com>

> ---
>   tools/gputop/utils.c | 51 +++++++++++++++++++++++++++++++++++
>   tools/gputop/utils.h | 63 ++++++++++++++++++++++++++++++++++++++++++++
>   2 files changed, 114 insertions(+)
>   create mode 100644 tools/gputop/utils.c
>   create mode 100644 tools/gputop/utils.h
> 
> diff --git a/tools/gputop/utils.c b/tools/gputop/utils.c
> new file mode 100644
> index 000000000..7f260dc05
> --- /dev/null
> +++ b/tools/gputop/utils.c
> @@ -0,0 +1,51 @@
> +// SPDX-License-Identifier: MIT
> +/*
> + * Copyright © 2025 Intel Corporation
> + */
> +#include <assert.h>
> +
> +#include "utils.h"
> +
> +static const char * const bars[] = { " ", "▏", "▎", "▍", "▌", "▋", "▊", "▉", "█" };
> +
> +void n_spaces(const unsigned int n)
> +{
> +	unsigned int i;
> +
> +	for (i = 0; i < n; i++)
> +		putchar(' ');
> +}
> +
> +void print_percentage_bar(double percent, int max_len)
> +{
> +	int bar_len, i, len = max_len - 1;
> +	const int w = PERCLIENT_ENGINE_WIDTH;
> +
> +	len -= printf("|%5.1f%% ", percent);
> +
> +	/* no space left for bars, do what we can */
> +	if (len < 0)
> +		len = 0;
> +
> +	bar_len = ceil(w * percent * len / 100.0);
> +	if (bar_len > w * len)
> +		bar_len = w * len;
> +
> +	for (i = bar_len; i >= w; i -= w)
> +		printf("%s", bars[w]);
> +	if (i)
> +		printf("%s", bars[i]);
> +
> +	len -= (bar_len + (w - 1)) / w;
> +	n_spaces(len);
> +
> +	putchar('|');
> +}
> +
> +int print_engines_footer(int lines, int con_w, int con_h)
> +{
> +	if (lines++ < con_h)
> +		printf("\n");
> +
> +	return lines;
> +}
> diff --git a/tools/gputop/utils.h b/tools/gputop/utils.h
> new file mode 100644
> index 000000000..00befed56
> --- /dev/null
> +++ b/tools/gputop/utils.h
> @@ -0,0 +1,63 @@
> +/* SPDX-License-Identifier: MIT */
> +/*
> + * Copyright © 2025 Intel Corporation
> + */
> +
> +#ifndef COMMON_GPUTOP_H
> +#define COMMON_GPUTOP_H
> +
> +#include <glib.h>
> +#include <math.h>
> +#include <stdbool.h>
> +#include <stdio.h>
> +#include <stdlib.h>
> +
> +#include "igt_device_scan.h"
> +
> +#define ANSI_HEADER "\033[7m"
> +#define ANSI_RESET "\033[0m"
> +
> +#define PERCLIENT_ENGINE_WIDTH 8
> +
> +/**
> + * struct gputop_driver
> + *
> + * @device_present: It is set if at least a single device of the
> + * respective driver is found.
> + * @len: Number of total device discovered of the respective
> + * driver.
> + * @instances: pointer to the array of discovered instances
> + * of the devices of the same driver.
> + */
> +struct gputop_driver {
> +	bool device_present;
> +	int len;
> +	void *instances;
> +};
> +
> +/**
> + * struct device_operations - Structure to hold function
> + * pointers for device specific operations for each individual driver.
> + * @gputop_init: Function to initialize GPUTOP object
> + * @init_engines: Function to initialize engines for the respective driver.
> + * @pmu_init: Function to initialize the PMU (Performance Monitoring Unit).
> + * @pmu_sample: Function to sample PMU data.
> + * @print_engines: Function to print engine business.
> + * @clean_up: Function to release resources.
> + */
> +struct device_operations {
> +	void (*gputop_init)(void *ptr, int index,
> +			    struct igt_device_card *card);
> +	void *(*init_engines)(const void *obj, int index);
> +	int (*pmu_init)(const void *obj, int index);
> +	void (*pmu_sample)(const void *obj, int index);
> +	int (*print_engines)(const void *obj, int index, int lines,
> +			     int w, int h);
> +	void (*clean_up)(void *obj, int len);
> +};
> +
> +void print_percentage_bar(double percent, int max_len);
> +int print_engines_footer(int lines, int con_w, int con_h);
> +void n_spaces(const unsigned int n);
> +
> +#endif  /* COMMON_GPUTOP_H */



More information about the igt-dev mailing list