From nobody Sun Feb 8 20:29:11 2026 Received: from mail-oa1-f50.google.com (mail-oa1-f50.google.com [209.85.160.50]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id CE3192D8377 for ; Fri, 9 Jan 2026 04:34:24 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.160.50 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1767933268; cv=none; b=cuuRgaKftFl3u18YaSFuk7NewOjFAFliJSPdYo909X/hhcPm7vA53/D2QxpuR24OXdohbHRHk5sWyeDVN3tnU+qiR/0JMfg3mWHR2QF5BDAU2CDmWfQKkSYRfbzVEdaA3ILm0aPAZzjFLG5T+s/JGCFIMGEH6QBG74Sap2aEzmA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1767933268; c=relaxed/simple; bh=ZwYTrMAmnkdh8YdhuMQNkEVxOPy2CIPYNXYMB5yEdew=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=KZDJCBo1tY43/t8lKa0D7K3Vymij4h/eZi/Vc6P4P9bmFmRkeqyeccB4GOiYLvjICIv8SQ6+ThrIr/+4GoV7NFsLcUhyMiDw2dPoClVM4Ksa+r08fke2P/m4Fmhiq90PD/LetS+clixOeCzRYHRi4nDYaB46grCQH0+5cQ8YVI0= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=R1oKh+oI; arc=none smtp.client-ip=209.85.160.50 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="R1oKh+oI" Received: by mail-oa1-f50.google.com with SMTP id 586e51a60fabf-3e80c483a13so2449919fac.2 for ; Thu, 08 Jan 2026 20:34:24 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1767933261; x=1768538061; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=05mvMiaCezgmzJYXVgjf/BCnZKgTJFkAHEvjQAEJ4/8=; b=R1oKh+oIOl3xPugr78RVmyt3j3lHMhsNrHM6F3CRSvKw0CoPjlcnHiL7buzNk4sP06 sIsiDdWgVpeKPnYwwEbxyFjXjzcKvUBiF2lo1gxMp9XDBRP7z2aK5E0lDQCbfiT2Ipq1 bLcG7tom6FeEKym8/b07ipWFV1dHQD7toqRVYiu3dLtwEX5s4RSRVpCSkEIOC3m3ItlQ fOyu+0J9NkahMSgRjJ+9tMOhoacuNO0k8vEiw3dXXkomg5KOIl0IeYhvmK2ArGDUuR05 +Wfsez95HOzJerqVjdVdGjqo/3LyV61D+km0GcYCgsaE8JoYmQ9OjIi7Nft4fmYTgKzK 51+g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1767933261; x=1768538061; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=05mvMiaCezgmzJYXVgjf/BCnZKgTJFkAHEvjQAEJ4/8=; b=vVDd35/jV3/2PPq03qvKg2pjfb1pqBWj7ZDxUCaB2nkagmne/VB7YxgKsggw5vjTCM CwWcgSGuJr80c15237Fa+e3RMofY1bxgx5Srw91DDgabN7atwra39xn0PG3AJNWBBE6r oEW0lnsScUl8sYllN9170lDW1D5eut8gNZLpk8IkU/UCsAsHVIbvNVXCveuFy6PDyqlT aegsjncbThyoecR6QXfk/sS44d0cVuJAUEe58Wnf05GxOix+06TdIGlcRPb/t3iUvcgh IcdYGtZ5TSi7gsqpMAr7QSLNYrMhjL/lbRdLaq8W+eYHZKmNapz5a4eRvZDqakhDwQQX nj5g== X-Forwarded-Encrypted: i=1; AJvYcCX2c4bCp9mkXUmriNVcAIPC1T0pcWEtlTFziXjFQIWqYRVyWecCfDm16D9TZ6BeVl16R8jlG312c9wqESY=@vger.kernel.org X-Gm-Message-State: AOJu0YykhHtgDU7hzNzr4h0otuwL9CYeCAYj1xmIATKVNmhoQ2V6656y tZirlQIz+1HkTC0ZSjTNd9YOTLZGOrs86bIACnzw9IHPkjaykIdqAX/9 X-Gm-Gg: AY/fxX6N/8LJI06vi+QftriSn6MXEmPavOXefsjpxCMUb8rWHiMW/adK6laqK4nfjmf KMM9f9DAf3Ih+YZ0vTShrvTYCqIKWsis+DVDHj9Sl5EQvL9asINPZk/xW2qou1oRRl1EM20fK1x A31UXzLZ6eqM5G4PxYeI3L76UFPtRSKr+6Z9TFUEEfLwnQ3XVi7ceGSIOukUZrespoRyePr0dGy qOfkMJ0OZ1Z0cSLRIpZ1tr9BmHio4H003EVk7InayvtPrSngFhamnMZUdIgxmoi4g/thoSY6WAX 3bTjBb/kS7C/45ZMkxWvyB3JEHytPY0IYoZ/UIb3UV145HC+LBXLi9BIHT8AuksVytAjbUIRIoY cmbE+tCWeTB8xE1sSE439cA0wtt3f06XzTF+X7x3QCjyU9aQL3q2oxLxd5ypNFr6ffAXS5CmlX+ AF8loz5Q5qM2jaU5EBmTGym6vgSWiZufls4HGrJWa59wjf+OIbxXv7An/nhmWel8Yvhu6mhCt66 P/DzLQWjGTLpLaMdFv2cvnlM20PmQRb+7DEonk= X-Google-Smtp-Source: AGHT+IFQMfD5BmYuMz67fv5qpmxGsSYuw3YF8lZjbLInnepHp8t3ZgfenUtKZ4QOFw08dY90b93PXw== X-Received: by 2002:a05:6870:3353:b0:3f5:b004:314e with SMTP id 586e51a60fabf-3ffc0b5e85bmr4715058fac.46.1767933261550; Thu, 08 Jan 2026 20:34:21 -0800 (PST) Received: from nukework.lan (c-98-57-15-22.hsd1.tx.comcast.net. [98.57.15.22]) by smtp.gmail.com with ESMTPSA id 586e51a60fabf-3ffa515f4dasm6274421fac.21.2026.01.08.20.34.19 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 08 Jan 2026 20:34:20 -0800 (PST) From: Alexandru Gagniuc To: andersson@kernel.org, krzk+dt@kernel.org, mturquette@baylibre.com, linux-remoteproc@vger.kernel.org, Mathieu Poirier Cc: robh@kernel.org, conor+dt@kernel.org, konradybcio@kernel.org, sboyd@kernel.org, p.zabel@pengutronix.de, linux-arm-msm@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-clk@vger.kernel.org, Alexandru Gagniuc Subject: [PATCH v2 8/9] remoteproc: qcom_q6v5_wcss: support m3 firmware Date: Thu, 8 Jan 2026 22:33:43 -0600 Message-ID: <20260109043352.3072933-9-mr.nuke.me@gmail.com> X-Mailer: git-send-email 2.45.1 In-Reply-To: <20260109043352.3072933-1-mr.nuke.me@gmail.com> References: <20260109043352.3072933-1-mr.nuke.me@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" IPQ8074, IPQ6018, and IPQ9574 support an m3 firmware image in addtion to the q6 firmware. The firmware releases from qcom provide both q6 and m3 firmware for these SoCs. Support loading the m3 firmware image. Signed-off-by: Alexandru Gagniuc --- Changes since v1: - Check for -ENOENT from q6v5_wcss_load_aux() --- drivers/remoteproc/qcom_q6v5_wcss.c | 45 +++++++++++++++++++++++++---- 1 file changed, 40 insertions(+), 5 deletions(-) diff --git a/drivers/remoteproc/qcom_q6v5_wcss.c b/drivers/remoteproc/qcom_= q6v5_wcss.c index ccf5fbc5be66..2bb83e6afb6b 100644 --- a/drivers/remoteproc/qcom_q6v5_wcss.c +++ b/drivers/remoteproc/qcom_q6v5_wcss.c @@ -103,7 +103,8 @@ enum { }; =20 struct wcss_data { - 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; @@ -160,6 +161,7 @@ struct q6v5_wcss { unsigned int crash_reason_smem; u32 version; bool requires_force_stop; + const char *m3_firmware_name; =20 struct qcom_rproc_glink glink_subdev; struct qcom_rproc_pdm pdm_subdev; @@ -931,11 +933,41 @@ static void *q6v5_wcss_da_to_va(struct rproc *rproc, = u64 da, size_t len, bool *i return wcss->mem_region + offset; } =20 +static int q6v5_wcss_load_aux(struct q6v5_wcss *wcss, const char *fw_name) +{ + const struct firmware *extra_fw; + int ret; + + dev_info(wcss->dev, "loading additional firmware image %s\n", fw_name); + + ret =3D request_firmware(&extra_fw, fw_name, wcss->dev); + if (ret) + return ret; + + ret =3D qcom_mdt_load_no_init(wcss->dev, extra_fw, fw_name, + wcss->mem_region, wcss->mem_phys, + wcss->mem_size, &wcss->mem_reloc); + + release_firmware(extra_fw); + + if (ret) + dev_err(wcss->dev, "can't load %s\n", fw_name); + + return ret; +} + static int q6v5_wcss_load(struct rproc *rproc, const struct firmware *fw) { struct q6v5_wcss *wcss =3D rproc->priv; int ret; =20 + if (wcss->m3_firmware_name) { + ret =3D q6v5_wcss_load_aux(wcss, wcss->m3_firmware_name); + /* Continue if M3 firmware does not exist */ + if (ret && (ret !=3D -ENOENT)) + return ret; + } + ret =3D qcom_mdt_load_no_init(wcss->dev, fw, rproc->firmware, wcss->mem_region, wcss->mem_phys, wcss->mem_size, &wcss->mem_reloc); @@ -1196,7 +1228,7 @@ static int q6v5_wcss_probe(struct platform_device *pd= ev) return -EINVAL; =20 rproc =3D devm_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; @@ -1207,6 +1239,7 @@ static int q6v5_wcss_probe(struct platform_device *pd= ev) =20 wcss->version =3D desc->version; wcss->requires_force_stop =3D desc->requires_force_stop; + wcss->m3_firmware_name =3D desc->m3_firmware_name; =20 ret =3D q6v5_wcss_init_mmio(wcss, pdev); if (ret) @@ -1284,7 +1317,8 @@ static void q6v5_wcss_remove(struct platform_device *= pdev) } =20 static const struct wcss_data wcss_ipq8074_res_init =3D { - .firmware_name =3D "IPQ8074/q6_fw.mdt", + .q6_firmware_name =3D "IPQ8074/q6_fw.mdt", + .m3_firmware_name =3D "IPQ8074/m3_fw.mdt", .crash_reason_smem =3D WCSS_CRASH_REASON, .aon_reset_required =3D true, .wcss_q6_reset_required =3D true, @@ -1293,7 +1327,8 @@ static const struct wcss_data wcss_ipq8074_res_init = =3D { }; =20 static const struct wcss_data wcss_ipq9574_res_init =3D { - .firmware_name =3D "IPQ9574/q6_fw.mdt", + .q6_firmware_name =3D "IPQ9574/q6_fw.mdt", + .m3_firmware_name =3D "IPQ9574/m3_fw.mdt", .version =3D WCSS_IPQ9574, .crash_reason_smem =3D WCSS_CRASH_REASON, .aon_reset_required =3D true, @@ -1304,7 +1339,7 @@ static const struct wcss_data wcss_ipq9574_res_init = =3D { =20 static const struct wcss_data wcss_qcs404_res_init =3D { .crash_reason_smem =3D WCSS_CRASH_REASON, - .firmware_name =3D "wcnss.mdt", + .q6_firmware_name =3D "wcnss.mdt", .version =3D WCSS_QCS404, .aon_reset_required =3D false, .wcss_q6_reset_required =3D false, --=20 2.45.1