Re: [PATCH V2 5/5] firmware: tegra: use in-band messages for firmware version query

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Thu, Oct 18, 2018 at 08:55:44PM +0300, Timo Alho wrote:
> Add support for a new MRQ, that uses in-band messaging instead of IOVA
> buffer, to retrieve the firmware version 'tag' during boot. If an
> older firmware is used, that does not support the new MRQ, fall back
> to the earlier implementation.
> 
> Signed-off-by: Timo Alho <talho@xxxxxxxxxx>
> ---
>  drivers/firmware/tegra/bpmp.c | 34 ++++++++++++++++++++++++++++++++--
>  1 file changed, 32 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/firmware/tegra/bpmp.c b/drivers/firmware/tegra/bpmp.c
> index a7d8954..5f6634a 100644
> --- a/drivers/firmware/tegra/bpmp.c
> +++ b/drivers/firmware/tegra/bpmp.c
> @@ -549,8 +549,9 @@ static int tegra_bpmp_ping(struct tegra_bpmp *bpmp)
>  	return err;
>  }
>  
> -static int tegra_bpmp_get_firmware_tag(struct tegra_bpmp *bpmp, char *tag,
> -				       size_t size)
> +/* deprecated version of tag query */
> +static int tegra_bpmp_get_firmware_tag_old(struct tegra_bpmp *bpmp, char *tag,
> +					   size_t size)
>  {
>  	struct mrq_query_tag_request request;
>  	struct tegra_bpmp_message msg;
> @@ -585,6 +586,35 @@ static int tegra_bpmp_get_firmware_tag(struct tegra_bpmp *bpmp, char *tag,
>  	return err;
>  }
>  
> +static int tegra_bpmp_get_firmware_tag(struct tegra_bpmp *bpmp, char *tag,
> +				       size_t size)
> +{
> +	struct mrq_query_fw_tag_response resp;
> +	struct tegra_bpmp_message msg = {
> +		.mrq = MRQ_QUERY_FW_TAG,
> +		.rx = {
> +			.data = &resp,
> +			.size = sizeof(resp),
> +		},
> +	};
> +	int err;
> +	const size_t tag_sz = sizeof(resp.tag);
> +
> +	if (!tegra_bpmp_mrq_is_supported(bpmp, MRQ_QUERY_FW_TAG))
> +		return tegra_bpmp_get_firmware_tag_old(bpmp, tag, size);
> +
> +	err = tegra_bpmp_transfer(bpmp, &msg);
> +
> +	if (err)
> +		return err;
> +	if (msg.rx.ret < 0)
> +		return -EINVAL;
> +
> +	memcpy(tag, resp.tag, min(size, tag_sz));
> +
> +	return 0;
> +}

I find this slightly difficult to read because it mixes MRQ_QUERY_TAG
and MRQ_QUERY_FW_TAG code. I think a more readable version would be
something like this:

	if (tegra_bpmp_mrq_is_supported(bpmp, MRQ_QUERY_FW_TAG)) {
		/* all of the above here, except for the legacy code */
	}

	return tegra_bpmp_get_firmware_tag_old(bpmp, tag, size);

I think that also better reflects the logic: if the new MRQ is
supported, use it. Otherwise, fallback to the old code.

Thierry

Attachment: signature.asc
Description: PGP signature


[Index of Archives]     [ARM Kernel]     [Linux ARM]     [Linux ARM MSM]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux