Skip to content

Commit 318130c

Browse files
Sibi Sankarandersson
Sibi Sankar
authored andcommitted
remoteproc: qcom_q6v5_mss: Add MBA log extraction support
On SC7180 the MBA firmware stores the bootup text logs in a 4K segment at the beginning of the MBA region. Add support to extract the logs which will be useful to debug mba boot/authentication issues. Reviewed-by: Bjorn Andersson <[email protected]> Signed-off-by: Sibi Sankar <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Bjorn Andersson <[email protected]>
1 parent 3afdc59 commit 318130c

File tree

1 file changed

+37
-1
lines changed

1 file changed

+37
-1
lines changed

drivers/remoteproc/qcom_q6v5_mss.c

+37-1
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99

1010
#include <linux/clk.h>
1111
#include <linux/delay.h>
12+
#include <linux/devcoredump.h>
1213
#include <linux/dma-mapping.h>
1314
#include <linux/interrupt.h>
1415
#include <linux/kernel.h>
@@ -36,6 +37,8 @@
3637

3738
#define MPSS_CRASH_REASON_SMEM 421
3839

40+
#define MBA_LOG_SIZE SZ_4K
41+
3942
/* RMB Status Register Values */
4043
#define RMB_PBL_SUCCESS 0x1
4144

@@ -138,6 +141,7 @@ struct rproc_hexagon_res {
138141
int version;
139142
bool need_mem_protection;
140143
bool has_alt_reset;
144+
bool has_mba_logs;
141145
bool has_spare_reg;
142146
};
143147

@@ -198,6 +202,7 @@ struct q6v5 {
198202
struct qcom_sysmon *sysmon;
199203
bool need_mem_protection;
200204
bool has_alt_reset;
205+
bool has_mba_logs;
201206
bool has_spare_reg;
202207
int mpss_perm;
203208
int mba_perm;
@@ -509,6 +514,26 @@ static int q6v5_rmb_mba_wait(struct q6v5 *qproc, u32 status, int ms)
509514
return val;
510515
}
511516

517+
static void q6v5_dump_mba_logs(struct q6v5 *qproc)
518+
{
519+
struct rproc *rproc = qproc->rproc;
520+
void *data;
521+
522+
if (!qproc->has_mba_logs)
523+
return;
524+
525+
if (q6v5_xfer_mem_ownership(qproc, &qproc->mba_perm, true, false, qproc->mba_phys,
526+
qproc->mba_size))
527+
return;
528+
529+
data = vmalloc(MBA_LOG_SIZE);
530+
if (!data)
531+
return;
532+
533+
memcpy(data, qproc->mba_region, MBA_LOG_SIZE);
534+
dev_coredumpv(&rproc->dev, data, MBA_LOG_SIZE, GFP_KERNEL);
535+
}
536+
512537
static int q6v5proc_reset(struct q6v5 *qproc)
513538
{
514539
u32 val;
@@ -829,6 +854,7 @@ static int q6v5_mba_load(struct q6v5 *qproc)
829854
{
830855
int ret;
831856
int xfermemop_ret;
857+
bool mba_load_err = false;
832858

833859
qcom_q6v5_prepare(&qproc->q6v5);
834860

@@ -918,14 +944,16 @@ static int q6v5_mba_load(struct q6v5 *qproc)
918944
q6v5proc_halt_axi_port(qproc, qproc->halt_map, qproc->halt_q6);
919945
q6v5proc_halt_axi_port(qproc, qproc->halt_map, qproc->halt_modem);
920946
q6v5proc_halt_axi_port(qproc, qproc->halt_map, qproc->halt_nc);
921-
947+
mba_load_err = true;
922948
reclaim_mba:
923949
xfermemop_ret = q6v5_xfer_mem_ownership(qproc, &qproc->mba_perm, true,
924950
false, qproc->mba_phys,
925951
qproc->mba_size);
926952
if (xfermemop_ret) {
927953
dev_err(qproc->dev,
928954
"Failed to reclaim mba buffer, system may become unstable\n");
955+
} else if (mba_load_err) {
956+
q6v5_dump_mba_logs(qproc);
929957
}
930958

931959
disable_active_clks:
@@ -1283,6 +1311,7 @@ static int q6v5_start(struct rproc *rproc)
12831311

12841312
reclaim_mpss:
12851313
q6v5_mba_reclaim(qproc);
1314+
q6v5_dump_mba_logs(qproc);
12861315

12871316
return ret;
12881317
}
@@ -1702,6 +1731,7 @@ static int q6v5_probe(struct platform_device *pdev)
17021731

17031732
qproc->version = desc->version;
17041733
qproc->need_mem_protection = desc->need_mem_protection;
1734+
qproc->has_mba_logs = desc->has_mba_logs;
17051735

17061736
ret = qcom_q6v5_init(&qproc->q6v5, pdev, rproc, MPSS_CRASH_REASON_SMEM,
17071737
qcom_msa_handover);
@@ -1793,6 +1823,7 @@ static const struct rproc_hexagon_res sc7180_mss = {
17931823
},
17941824
.need_mem_protection = true,
17951825
.has_alt_reset = false,
1826+
.has_mba_logs = true,
17961827
.has_spare_reg = true,
17971828
.version = MSS_SC7180,
17981829
};
@@ -1828,6 +1859,7 @@ static const struct rproc_hexagon_res sdm845_mss = {
18281859
},
18291860
.need_mem_protection = true,
18301861
.has_alt_reset = true,
1862+
.has_mba_logs = false,
18311863
.has_spare_reg = false,
18321864
.version = MSS_SDM845,
18331865
};
@@ -1855,6 +1887,7 @@ static const struct rproc_hexagon_res msm8998_mss = {
18551887
},
18561888
.need_mem_protection = true,
18571889
.has_alt_reset = false,
1890+
.has_mba_logs = false,
18581891
.has_spare_reg = false,
18591892
.version = MSS_MSM8998,
18601893
};
@@ -1885,6 +1918,7 @@ static const struct rproc_hexagon_res msm8996_mss = {
18851918
},
18861919
.need_mem_protection = true,
18871920
.has_alt_reset = false,
1921+
.has_mba_logs = false,
18881922
.has_spare_reg = false,
18891923
.version = MSS_MSM8996,
18901924
};
@@ -1918,6 +1952,7 @@ static const struct rproc_hexagon_res msm8916_mss = {
19181952
},
19191953
.need_mem_protection = false,
19201954
.has_alt_reset = false,
1955+
.has_mba_logs = false,
19211956
.has_spare_reg = false,
19221957
.version = MSS_MSM8916,
19231958
};
@@ -1959,6 +1994,7 @@ static const struct rproc_hexagon_res msm8974_mss = {
19591994
},
19601995
.need_mem_protection = false,
19611996
.has_alt_reset = false,
1997+
.has_mba_logs = false,
19621998
.has_spare_reg = false,
19631999
.version = MSS_MSM8974,
19642000
};

0 commit comments

Comments
 (0)