Received: by 2002:a05:6a10:8c0a:0:0:0:0 with SMTP id go10csp2438741pxb; Sat, 30 Jan 2021 02:38:43 -0800 (PST) X-Google-Smtp-Source: ABdhPJyG0YJTFPWrokbOOtBywJhjaxFTk5jSb3W6zb/d7nsg+NxZQxI7gPSjtYptni+0fw5jlx7t X-Received: by 2002:a05:6402:3582:: with SMTP id y2mr9524487edc.345.1612003123601; Sat, 30 Jan 2021 02:38:43 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1612003123; cv=none; d=google.com; s=arc-20160816; b=nCO5FGoXlOGQ9NYDfp/5YRCqWM/Rr8tK+nbh7428xHCmuh6/hWLx9ddxqxwHuLYStO GIUFLK/oPJUBzMisBYFQBk0VnYlo+c72oHAK5JY+3kEjSXxG9B3OegGfJxUDoWdHDlSF IXwD3r4zYF8RH99IUwjehek3tK4uC4JXUqtTyXJtoShF08ezxMby0PFL2nx4qoIysW8I Wk/BJBiOqmuZZfEPrhBV+m4HTWqFw/D1gTR9LrNomQn6S89KM2mtyFCI3dlent4HzJO2 ExiV+SK+1gUelvS0oYbYy7LOt+b4QEot5UgBJK4hopNcXMJmItrbEBYjKjN0uMjUce+W ToYQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:references:in-reply-to:message-id:date:subject :to:from; bh=xKu0JZw2FserUZTrKNk1lLe2trDwa3AISkzI3RZ7gF8=; b=Cr//Dv5eoazbjy7JwSNX94QTyOv3LF3zccP7fgbt8BHJcq244xemhidwzc3sfPWM9i aCwUFZWdEnlwoqBFDFEgnbekbzFbxHBaYcvvf2fxDCk+k+QDeawSMAzarZukzKbxWDaM qEWM8Vas2/MLsmsrQktR/2iY4Kv0TZDdq4ooeX9pdIBHgwxOdIlawZ8IUcTlKnyq4in6 y2EVwsVWzXeudqYzb7+/SPIP//BUVa+TdkHREqqrwpXeczcnN5M1sQ/TJxzl53plmQ06 3ObBBahQPfUSPkxRBz6mwSM+KS4s9zefwwRptHxnpg49quUZvQF81KbIUY41YEMyQFTU OHDg== 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 g27si397209edf.244.2021.01.30.02.38.15; Sat, 30 Jan 2021 02:38:43 -0800 (PST) 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 S233935AbhA3Hgn (ORCPT + 99 others); Sat, 30 Jan 2021 02:36:43 -0500 Received: from alexa-out.qualcomm.com ([129.46.98.28]:18831 "EHLO alexa-out.qualcomm.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233821AbhA3Fb7 (ORCPT ); Sat, 30 Jan 2021 00:31:59 -0500 Received: from ironmsg07-lv.qualcomm.com (HELO ironmsg07-lv.qulacomm.com) ([10.47.202.151]) by alexa-out.qualcomm.com with ESMTP; 29 Jan 2021 21:20:36 -0800 X-QCInternal: smtphost Received: from ironmsg02-blr.qualcomm.com ([10.86.208.131]) by ironmsg07-lv.qulacomm.com with ESMTP/TLS/AES256-SHA; 29 Jan 2021 21:20:34 -0800 X-QCInternal: smtphost Received: from gokulsri-linux.qualcomm.com ([10.201.2.207]) by ironmsg02-blr.qualcomm.com with ESMTP; 30 Jan 2021 10:50:13 +0530 Received: by gokulsri-linux.qualcomm.com (Postfix, from userid 432570) id C708B21A03; Sat, 30 Jan 2021 10:50:13 +0530 (IST) From: Gokul Sriram Palanisamy To: sboyd@kernel.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, ohad@wizery.com, robh+dt@kernel.org, sricharan@codeaurora.org, gokulsri@codeaurora.org Subject: [PATCH v8 3/9] remoteproc: qcom: Add support for split q6 + m3 wlan firmware Date: Sat, 30 Jan 2021 10:50:07 +0530 Message-Id: <1611984013-10201-4-git-send-email-gokulsri@codeaurora.org> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1611984013-10201-1-git-send-email-gokulsri@codeaurora.org> References: <1611984013-10201-1-git-send-email-gokulsri@codeaurora.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 4e35e5c..2ecbd73 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) @@ -1145,7 +1169,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, @@ -1158,7 +1183,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