From patchwork Thu Oct 18 17:55:44 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Timo Alho X-Patchwork-Id: 986083 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=linux-tegra-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=nvidia.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=nvidia.com header.i=@nvidia.com header.b="DeOp5uIQ"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 42bcDL22dBz9s8T for ; Fri, 19 Oct 2018 04:56:17 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728569AbeJSB6U (ORCPT ); Thu, 18 Oct 2018 21:58:20 -0400 Received: from hqemgate15.nvidia.com ([216.228.121.64]:11317 "EHLO hqemgate15.nvidia.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728562AbeJSB6U (ORCPT ); Thu, 18 Oct 2018 21:58:20 -0400 Received: from hqpgpgate101.nvidia.com (Not Verified[216.228.121.13]) by hqemgate15.nvidia.com (using TLS: TLSv1.2, DES-CBC3-SHA) id ; Thu, 18 Oct 2018 10:56:10 -0700 Received: from HQMAIL104.nvidia.com ([172.20.161.6]) by hqpgpgate101.nvidia.com (PGP Universal service); Thu, 18 Oct 2018 10:56:15 -0700 X-PGP-Universal: processed; by hqpgpgate101.nvidia.com on Thu, 18 Oct 2018 10:56:15 -0700 Received: from HQMAIL101.nvidia.com (172.20.187.10) by HQMAIL104.nvidia.com (172.18.146.11) with Microsoft SMTP Server (TLS) id 15.0.1395.4; Thu, 18 Oct 2018 17:56:15 +0000 Received: from hqnvemgw02.nvidia.com (172.16.227.111) by HQMAIL101.nvidia.com (172.20.187.10) with Microsoft SMTP Server (TLS) id 15.0.1395.4 via Frontend Transport; Thu, 18 Oct 2018 17:56:15 +0000 Received: from talho-ln2.nvidia.com (Not Verified[10.21.24.139]) by hqnvemgw02.nvidia.com with Trustwave SEG (v7, 5, 8, 10121) id ; Thu, 18 Oct 2018 10:56:14 -0700 From: Timo Alho To: , , CC: , Timo Alho Subject: [PATCH V2 5/5] firmware: tegra: use in-band messages for firmware version query Date: Thu, 18 Oct 2018 20:55:44 +0300 Message-ID: <1539885344-18974-6-git-send-email-talho@nvidia.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1539885344-18974-1-git-send-email-talho@nvidia.com> References: <1539885344-18974-1-git-send-email-talho@nvidia.com> MIME-Version: 1.0 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=nvidia.com; s=n1; t=1539885370; bh=u2ctQ+xUHFdVGF+ui4pONGs0+Hhtpa0CjznjEnQiC4M=; h=X-PGP-Universal:From:To:CC:Subject:Date:Message-ID:X-Mailer: In-Reply-To:References:MIME-Version:Content-Type; b=DeOp5uIQ3BxwIknH4fPqe4AAYnLaZU1rAjDiA7m1y6VrBnkNEZdOad6pviXy7078M HSU8igtFruIomXPBPANCiaZo2Q/1SZnydYX9A+wIxh52hJsjxMfBstVSimZmzHR1R1 fRhTBU0eFIVdPWh7rH2tDlU66rCopGSXXwbXXN0pFkzlBO3nlvuUMlAIqhK4nEQ0vr k6OdOXuHWwRs3hYRM8myMV7e3uGucKp0n7kYxyW523scKRGAOhk2vNYxe9QKwdjnQG uufucvy2Y2Tu939WGt9TqDP1gPdM5KR6so2Y5dVb0YhfL1IpIcXeg2kqlubmkUa1xk 8lI/l25Cs9PYg== Sender: linux-tegra-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-tegra@vger.kernel.org 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 Acked-by: Sivaram Nair --- 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; +} + static void tegra_bpmp_channel_signal(struct tegra_bpmp_channel *channel) { unsigned long flags = channel->ob->flags;