On 06-07-2025 4:47 p.m., Dmitry Baryshkov wrote:
From: Dmitry Baryshkov <[email protected]>
On MSM8974 / APQ8074, MSM8226 and MSM8926 the MSS requires loading raw
MBA image instead of the ELF file. Skip the ELF headers if mba.mbn was
specified as the firmware image.
Appears to work on my msm8974pro-fairphone-fp2!
Tested-by: Luca Weiss <[email protected]> # msm8974pro-fairphone-fp2
[ 175.530764] remoteproc remoteproc1: powering up fc880000.remoteproc
[ 175.544439] remoteproc remoteproc1: Booting fw image mba.mbn, size 299792
[ 177.707706] qcom-q6v5-mss fc880000.remoteproc: MBA booted without
debug policy, loading mpss
[ 180.375633] remoteproc remoteproc1: remote processor
fc880000.remoteproc is now up
[ 180.841751] wwan wwan0: port wwan0at0 attached
[ 180.846972] wwan wwan0: port wwan0at1 attached
[ 181.004199] wwan wwan0: port wwan0qmi0 attached
(this is with 'firmware-name = "mba.mbn", "modem.mbn";')
I can also test on other MSM8974 devices and MSM8926 if you think that's
useful.
Regards
Luca
Fixes: a5a4e02d083d ("remoteproc: qcom: Add support for parsing fw dt bindings")
Signed-off-by: Dmitry Baryshkov <[email protected]>
Signed-off-by: Dmitry Baryshkov <[email protected]>
---
Changes in v4:
- Expanded to cover MSM8226 and MSM8926.
- Link to v3:
https://lore.kernel.org/r/[email protected]
Changes in v3:
- Reverted back to the simple patch from v1
- Added define for 0x1000 (Konrad)
- Added MBA firmware size check
- Corrected the Fixes tag to point to the commit adding firmware-name
support
- Link to v2:
https://lore.kernel.org/r/[email protected]
Changes in v2:
- Replace fixed offset 0x1000 with the value obtained from ELF headers
- Implement ELF validity checks
- Link to v1:
https://lore.kernel.org/r/[email protected]
---
drivers/remoteproc/qcom_q6v5_mss.c | 13 ++++++++++++-
1 file changed, 12 insertions(+), 1 deletion(-)
diff --git a/drivers/remoteproc/qcom_q6v5_mss.c
b/drivers/remoteproc/qcom_q6v5_mss.c
index
0c0199fb0e68d6286f1e238d110539554d1d5f14..636f00d481ea80508fc9db28d8e2e225ea52372c
100644
--- a/drivers/remoteproc/qcom_q6v5_mss.c
+++ b/drivers/remoteproc/qcom_q6v5_mss.c
@@ -498,6 +498,8 @@ static void q6v5_debug_policy_load(struct q6v5 *qproc, void
*mba_region)
release_firmware(dp_fw);
}
+#define MSM8974_B00_OFFSET 0x1000
+
static int q6v5_load(struct rproc *rproc, const struct firmware *fw)
{
struct q6v5 *qproc = rproc->priv;
@@ -516,7 +518,16 @@ static int q6v5_load(struct rproc *rproc, const struct
firmware *fw)
return -EBUSY;
}
- memcpy(mba_region, fw->data, fw->size);
+ if ((qproc->version == MSS_MSM8974 ||
+ qproc->version == MSS_MSM8226 ||
+ qproc->version == MSS_MSM8926) &&
+ fw->size > MSM8974_B00_OFFSET &&
+ !memcmp(fw->data, ELFMAG, SELFMAG))
+ memcpy(mba_region,
+ fw->data + MSM8974_B00_OFFSET,
+ fw->size - MSM8974_B00_OFFSET);
+ else
+ memcpy(mba_region, fw->data, fw->size);
q6v5_debug_policy_load(qproc, mba_region);
memunmap(mba_region);
---
base-commit: b12a9fa1c88a441daa33f15edfa3ded8cd6d3556
change-id: 20250706-msm8974-fix-mss-e1b8e114b7e0
Best regards,