[PATCH i-g-t 20/20] tools/intel_vbt_decode: Decode device handle as a bitmask

Jani Nikula jani.nikula at intel.com
Fri May 31 15:10:44 UTC 2024


On Fri, 31 May 2024, Ville Syrjala <ville.syrjala at linux.intel.com> wrote:
> From: Ville Syrjälä <ville.syrjala at linux.intel.com>
>
> Some VBT blocks contain bitmasks of device handles (where multiple
> bits can be set simultanously). Allow decoding such things by
> having child_device_handle() take in the whole bitmask instead of
> assuming just one bit.
>
> We'll cheat a bit with a static buffer for the output string.
> That should be fine given the simplicity of the tool.
>
> Signed-off-by: Ville Syrjälä <ville.syrjala at linux.intel.com>
> ---
>  tools/intel_vbt_decode.c | 29 +++++++++++++++++++++++++----
>  1 file changed, 25 insertions(+), 4 deletions(-)
>
> diff --git a/tools/intel_vbt_decode.c b/tools/intel_vbt_decode.c
> index b0c30ffcbc0a..40c05fbadacb 100644
> --- a/tools/intel_vbt_decode.c
> +++ b/tools/intel_vbt_decode.c
> @@ -820,9 +820,17 @@ static const int num_child_device_handles =
>  static const char *child_device_handle(struct context *context,
>  				       uint16_t handle)
>  {
> -	int i;
> +	static char buffer[64];
> +	size_t len = sizeof(buffer);
> +	char *ptr = buffer;
> +	bool first = true;

Bikeshed, I've found it to be handy to do:

	const char *sep = "";

> +
> +	if (handle == 0)
> +		return "none";
> +
> +	for (int i = 0; i < num_child_device_handles; i++) {
> +		int r;
>  
> -	for (i = 0; i < num_child_device_handles; i++) {
>  		if (!(child_device_handles[i].handle & handle))
>  			continue;
>  
> @@ -834,10 +842,23 @@ static const char *child_device_handle(struct context *context,
>  		    context->bdb->version > child_device_handles[i].max_ver)
>  			continue;
>  
> -		return child_device_handles[i].name;
> +		handle &= ~child_device_handles[i].handle;
> +
> +		r = snprintf(ptr, len, "%s%s", first ? "" : ",",
> +			     child_device_handles[i].name);

And

		r = snprintf(ptr, len, "%s%s", sep,
			     child_device_handles[i].name);
		sep = ","

but what you have works too.


> +		if (r < 0 || r >= len)
> +			break;
> +
> +		first = false;
> +		ptr += r;
> +		len -= r;
>  	}
>  
> -	return "unknown";
> +	if (handle)
> +		snprintf(ptr, len, "%sunknown(0x%x)",
> +			 first ? "" : ",", handle);
> +
> +	return buffer;
>  }
>  
>  static const char *dvo_port_names[] = {

-- 
Jani Nikula, Intel


More information about the igt-dev mailing list