Received: by 2002:a25:ca44:0:0:0:0:0 with SMTP id a65csp1888418ybg; Thu, 30 Jul 2020 05:29:37 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzL8dm8NQDH13toawEbJ2kzMVFpv0PQYgozapfo72uyFz/2BD0B51xDgss+0iyiEtgmD2U0 X-Received: by 2002:a17:906:aed4:: with SMTP id me20mr2445395ejb.141.1596112177261; Thu, 30 Jul 2020 05:29:37 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1596112177; cv=none; d=google.com; s=arc-20160816; b=FB7bwCF5gigAZfJHRgseIyij2xlKyYCis10JXxhyrLd1KXF6qkg76+XggVC43tvxxP vfSHEhpblsUv7WVv2rUiKNMSRdhqq67ttF2ti2mHK4fWC1NzQj577ef4cAQHgJmcToLB aUMSPxQWe7ioZJ0lbgxNcyGGBui+aFVZmLXFW8YqW7c1vNEH4rIcjf3gx+IKNZ5+5brt SfAvXrm6duJGtGuEUxgmbwXDXgbBcsQdBwykI5+DAltu6a/RusVnklKlI8oFE5eu4nOR UxwvFkJjq9xMI82vvZ47YeaENwyaJZzS5LCjVo/sS48+ETMKiV8MKWbud6l7F4/AQ/6G kozA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:to:from; bh=kwvsl/r0IwvaQSeLWZIEDCD/QsOgj/yQ+xIjwcGfCHg=; b=njHeNxy03NSP6x0NTeuVgX113GJnYba+a/HxJYfZxzw+za1Gs14CFPUVjo4spYiLPL VAL744HwBwhk4Fzik4mNg+92a3jUBIs51ORJ6kFd+teu3F/jG7L7r9KXFhK7TDPMo9Pb yOD8yM9mqxZeDlQ3PYBsO0XRVNqLB3X1RnyhkJQeJQNWt1bdzOF58RSek8kkbTGw2Qhj qQ0IVDHLlCGbQtOY8f+rbbMjlyGElN0lcVVWUN2Thx8Ip2LdPEfKTIq5ytUzs7w6y1K/ o7Mb6LRtbU9eqQAln0oBVQ4413+bmMCmFO7SlGZsc9+SJDRk3eweQwM/E4HIvQAmqD1e DxNQ== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id d6si2958087ejp.151.2020.07.30.05.29.15; Thu, 30 Jul 2020 05:29:37 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728622AbgG3M2w (ORCPT + 99 others); Thu, 30 Jul 2020 08:28:52 -0400 Received: from alexa-out.qualcomm.com ([129.46.98.28]:26713 "EHLO alexa-out.qualcomm.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728315AbgG3M2q (ORCPT ); Thu, 30 Jul 2020 08:28:46 -0400 Received: from ironmsg-lv-alpha.qualcomm.com ([10.47.202.13]) by alexa-out.qualcomm.com with ESMTP; 30 Jul 2020 05:28:46 -0700 Received: from ironmsg02-blr.qualcomm.com ([10.86.208.131]) by ironmsg-lv-alpha.qualcomm.com with ESMTP/TLS/AES256-SHA; 30 Jul 2020 05:28:44 -0700 Received: from gokulsri-linux.qualcomm.com ([10.201.2.207]) by ironmsg02-blr.qualcomm.com with ESMTP; 30 Jul 2020 17:58:13 +0530 Received: by gokulsri-linux.qualcomm.com (Postfix, from userid 432570) id 1DA23213B6; Thu, 30 Jul 2020 17:58:12 +0530 (IST) From: Gokul Sriram Palanisamy To: gokulsri@codeaurora.org, agross@kernel.org, bjorn.andersson@linaro.org, david.brown@linaro.org, devicetree@vger.kernel.org, jassisinghbrar@gmail.com, linux-arm-msm@vger.kernel.org, linux-clk@vger.kernel.org, linux-kernel@vger.kernel.org, linux-remoteproc@vger.kernel.org, mark.rutland@arm.com, mturquette@baylibre.com, nprakash@codeaurora.org, ohad@wizery.com, robh+dt@kernel.org, sboyd@kernel.org, sricharan@codeaurora.org Subject: [PATCH v7 3/9] remoteproc: qcom: Add support for split q6 + m3 wlan firmware Date: Thu, 30 Jul 2020 17:56:37 +0530 Message-Id: <1596112003-31663-4-git-send-email-gokulsri@codeaurora.org> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1596112003-31663-1-git-send-email-gokulsri@codeaurora.org> References: <1596112003-31663-1-git-send-email-gokulsri@codeaurora.org> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org IPQ8074 supports split firmware for q6 and m3 as well. So add support for loading the m3 firmware before q6. Now the drivers works fine for both split and unified firmwares. Signed-off-by: Gokul Sriram Palanisamy Signed-off-by: Sricharan R Signed-off-by: Nikhil Prakash V --- drivers/remoteproc/qcom_q6v5_wcss.c | 33 +++++++++++++++++++++++++++++---- 1 file changed, 29 insertions(+), 4 deletions(-) diff --git a/drivers/remoteproc/qcom_q6v5_wcss.c b/drivers/remoteproc/qcom_q6v5_wcss.c index ba932e6..4975a4c 100644 --- a/drivers/remoteproc/qcom_q6v5_wcss.c +++ b/drivers/remoteproc/qcom_q6v5_wcss.c @@ -139,6 +139,7 @@ struct q6v5_wcss { u32 version; bool requires_force_stop; bool need_mem_protection; + const char *m3_firmware_name; struct qcom_rproc_glink glink_subdev; struct qcom_rproc_ssr ssr_subdev; @@ -147,7 +148,8 @@ struct q6v5_wcss { struct wcss_data { int (*init_clock)(struct q6v5_wcss *wcss); int (*init_regulator)(struct q6v5_wcss *wcss); - const char *firmware_name; + const char *q6_firmware_name; + const char *m3_firmware_name; unsigned int crash_reason_smem; u32 version; bool aon_reset_required; @@ -788,8 +790,29 @@ static void *q6v5_wcss_da_to_va(struct rproc *rproc, u64 da, size_t len) static int q6v5_wcss_load(struct rproc *rproc, const struct firmware *fw) { struct q6v5_wcss *wcss = rproc->priv; + const struct firmware *m3_fw; int ret; + if (wcss->m3_firmware_name) { + ret = request_firmware(&m3_fw, wcss->m3_firmware_name, + wcss->dev); + if (ret) + goto skip_m3; + + ret = qcom_mdt_load_no_init(wcss->dev, m3_fw, + wcss->m3_firmware_name, 0, + wcss->mem_region, wcss->mem_phys, + wcss->mem_size, &wcss->mem_reloc); + + release_firmware(m3_fw); + + if (ret) { + dev_err(wcss->dev, "can't load m3_fw.bXX\n"); + return ret; + } + } + +skip_m3: if (wcss->need_mem_protection) ret = qcom_mdt_load(wcss->dev, fw, rproc->firmware, WCNSS_PAS_ID, wcss->mem_region, @@ -1068,7 +1091,7 @@ static int q6v5_wcss_probe(struct platform_device *pdev) return -EPROBE_DEFER; rproc = rproc_alloc(&pdev->dev, pdev->name, desc->ops, - desc->firmware_name, sizeof(*wcss)); + desc->q6_firmware_name, sizeof(*wcss)); if (!rproc) { dev_err(&pdev->dev, "failed to allocate rproc\n"); return -ENOMEM; @@ -1081,6 +1104,7 @@ static int q6v5_wcss_probe(struct platform_device *pdev) wcss->version = desc->version; wcss->requires_force_stop = desc->requires_force_stop; wcss->need_mem_protection = desc->need_mem_protection; + wcss->m3_firmware_name = desc->m3_firmware_name; ret = q6v5_wcss_init_mmio(wcss, pdev); if (ret) @@ -1143,7 +1167,8 @@ static int q6v5_wcss_remove(struct platform_device *pdev) static const struct wcss_data wcss_ipq8074_res_init = { .init_clock = ipq8074_init_clock, - .firmware_name = "IPQ8074/q6_fw.mdt", + .q6_firmware_name = "IPQ8074/q6_fw.mdt", + .m3_firmware_name = "IPQ8074/m3_fw.mdt", .crash_reason_smem = WCSS_CRASH_REASON, .aon_reset_required = true, .wcss_q6_reset_required = true, @@ -1156,7 +1181,7 @@ static const struct wcss_data wcss_qcs404_res_init = { .init_clock = qcs404_init_clock, .init_regulator = qcs404_init_regulator, .crash_reason_smem = WCSS_CRASH_REASON, - .firmware_name = "wcnss.mdt", + .q6_firmware_name = "wcnss.mdt", .version = WCSS_QCS404, .aon_reset_required = false, .wcss_q6_reset_required = false, -- 2.7.4