|
9 | 9 |
|
10 | 10 | #include <linux/clk.h>
|
11 | 11 | #include <linux/delay.h>
|
| 12 | +#include <linux/devcoredump.h> |
12 | 13 | #include <linux/dma-mapping.h>
|
13 | 14 | #include <linux/interrupt.h>
|
14 | 15 | #include <linux/kernel.h>
|
|
36 | 37 |
|
37 | 38 | #define MPSS_CRASH_REASON_SMEM 421
|
38 | 39 |
|
| 40 | +#define MBA_LOG_SIZE SZ_4K |
| 41 | + |
39 | 42 | /* RMB Status Register Values */
|
40 | 43 | #define RMB_PBL_SUCCESS 0x1
|
41 | 44 |
|
@@ -138,6 +141,7 @@ struct rproc_hexagon_res {
|
138 | 141 | int version;
|
139 | 142 | bool need_mem_protection;
|
140 | 143 | bool has_alt_reset;
|
| 144 | + bool has_mba_logs; |
141 | 145 | bool has_spare_reg;
|
142 | 146 | };
|
143 | 147 |
|
@@ -198,6 +202,7 @@ struct q6v5 {
|
198 | 202 | struct qcom_sysmon *sysmon;
|
199 | 203 | bool need_mem_protection;
|
200 | 204 | bool has_alt_reset;
|
| 205 | + bool has_mba_logs; |
201 | 206 | bool has_spare_reg;
|
202 | 207 | int mpss_perm;
|
203 | 208 | int mba_perm;
|
@@ -509,6 +514,26 @@ static int q6v5_rmb_mba_wait(struct q6v5 *qproc, u32 status, int ms)
|
509 | 514 | return val;
|
510 | 515 | }
|
511 | 516 |
|
| 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 | + |
512 | 537 | static int q6v5proc_reset(struct q6v5 *qproc)
|
513 | 538 | {
|
514 | 539 | u32 val;
|
@@ -829,6 +854,7 @@ static int q6v5_mba_load(struct q6v5 *qproc)
|
829 | 854 | {
|
830 | 855 | int ret;
|
831 | 856 | int xfermemop_ret;
|
| 857 | + bool mba_load_err = false; |
832 | 858 |
|
833 | 859 | qcom_q6v5_prepare(&qproc->q6v5);
|
834 | 860 |
|
@@ -918,14 +944,16 @@ static int q6v5_mba_load(struct q6v5 *qproc)
|
918 | 944 | q6v5proc_halt_axi_port(qproc, qproc->halt_map, qproc->halt_q6);
|
919 | 945 | q6v5proc_halt_axi_port(qproc, qproc->halt_map, qproc->halt_modem);
|
920 | 946 | q6v5proc_halt_axi_port(qproc, qproc->halt_map, qproc->halt_nc);
|
921 |
| - |
| 947 | + mba_load_err = true; |
922 | 948 | reclaim_mba:
|
923 | 949 | xfermemop_ret = q6v5_xfer_mem_ownership(qproc, &qproc->mba_perm, true,
|
924 | 950 | false, qproc->mba_phys,
|
925 | 951 | qproc->mba_size);
|
926 | 952 | if (xfermemop_ret) {
|
927 | 953 | dev_err(qproc->dev,
|
928 | 954 | "Failed to reclaim mba buffer, system may become unstable\n");
|
| 955 | + } else if (mba_load_err) { |
| 956 | + q6v5_dump_mba_logs(qproc); |
929 | 957 | }
|
930 | 958 |
|
931 | 959 | disable_active_clks:
|
@@ -1283,6 +1311,7 @@ static int q6v5_start(struct rproc *rproc)
|
1283 | 1311 |
|
1284 | 1312 | reclaim_mpss:
|
1285 | 1313 | q6v5_mba_reclaim(qproc);
|
| 1314 | + q6v5_dump_mba_logs(qproc); |
1286 | 1315 |
|
1287 | 1316 | return ret;
|
1288 | 1317 | }
|
@@ -1702,6 +1731,7 @@ static int q6v5_probe(struct platform_device *pdev)
|
1702 | 1731 |
|
1703 | 1732 | qproc->version = desc->version;
|
1704 | 1733 | qproc->need_mem_protection = desc->need_mem_protection;
|
| 1734 | + qproc->has_mba_logs = desc->has_mba_logs; |
1705 | 1735 |
|
1706 | 1736 | ret = qcom_q6v5_init(&qproc->q6v5, pdev, rproc, MPSS_CRASH_REASON_SMEM,
|
1707 | 1737 | qcom_msa_handover);
|
@@ -1793,6 +1823,7 @@ static const struct rproc_hexagon_res sc7180_mss = {
|
1793 | 1823 | },
|
1794 | 1824 | .need_mem_protection = true,
|
1795 | 1825 | .has_alt_reset = false,
|
| 1826 | + .has_mba_logs = true, |
1796 | 1827 | .has_spare_reg = true,
|
1797 | 1828 | .version = MSS_SC7180,
|
1798 | 1829 | };
|
@@ -1828,6 +1859,7 @@ static const struct rproc_hexagon_res sdm845_mss = {
|
1828 | 1859 | },
|
1829 | 1860 | .need_mem_protection = true,
|
1830 | 1861 | .has_alt_reset = true,
|
| 1862 | + .has_mba_logs = false, |
1831 | 1863 | .has_spare_reg = false,
|
1832 | 1864 | .version = MSS_SDM845,
|
1833 | 1865 | };
|
@@ -1855,6 +1887,7 @@ static const struct rproc_hexagon_res msm8998_mss = {
|
1855 | 1887 | },
|
1856 | 1888 | .need_mem_protection = true,
|
1857 | 1889 | .has_alt_reset = false,
|
| 1890 | + .has_mba_logs = false, |
1858 | 1891 | .has_spare_reg = false,
|
1859 | 1892 | .version = MSS_MSM8998,
|
1860 | 1893 | };
|
@@ -1885,6 +1918,7 @@ static const struct rproc_hexagon_res msm8996_mss = {
|
1885 | 1918 | },
|
1886 | 1919 | .need_mem_protection = true,
|
1887 | 1920 | .has_alt_reset = false,
|
| 1921 | + .has_mba_logs = false, |
1888 | 1922 | .has_spare_reg = false,
|
1889 | 1923 | .version = MSS_MSM8996,
|
1890 | 1924 | };
|
@@ -1918,6 +1952,7 @@ static const struct rproc_hexagon_res msm8916_mss = {
|
1918 | 1952 | },
|
1919 | 1953 | .need_mem_protection = false,
|
1920 | 1954 | .has_alt_reset = false,
|
| 1955 | + .has_mba_logs = false, |
1921 | 1956 | .has_spare_reg = false,
|
1922 | 1957 | .version = MSS_MSM8916,
|
1923 | 1958 | };
|
@@ -1959,6 +1994,7 @@ static const struct rproc_hexagon_res msm8974_mss = {
|
1959 | 1994 | },
|
1960 | 1995 | .need_mem_protection = false,
|
1961 | 1996 | .has_alt_reset = false,
|
| 1997 | + .has_mba_logs = false, |
1962 | 1998 | .has_spare_reg = false,
|
1963 | 1999 | .version = MSS_MSM8974,
|
1964 | 2000 | };
|
|
0 commit comments