@@ -100,8 +100,9 @@ struct qcom_pas {
100100 phys_addr_t mem_reloc ;
101101 phys_addr_t dtb_mem_reloc ;
102102 phys_addr_t region_assign_phys [MAX_ASSIGN_COUNT ];
103+
103104 void * mem_region ;
104- void * dtb_mem_region ;
105+
105106 size_t mem_size ;
106107 size_t dtb_mem_size ;
107108 size_t region_assign_size [MAX_ASSIGN_COUNT ];
@@ -148,7 +149,16 @@ static void qcom_pas_minidump(struct rproc *rproc)
148149 if (rproc -> dump_conf == RPROC_COREDUMP_DISABLED )
149150 return ;
150151
152+ pas -> mem_region = ioremap_wc (pas -> mem_phys , pas -> mem_size );
153+ if (!pas -> mem_region ) {
154+ dev_err (pas -> dev , "unable to map memory region: %pa+%zx\n" ,
155+ & pas -> mem_phys , pas -> mem_size );
156+ return ;
157+ }
158+
151159 qcom_minidump (rproc , pas -> minidump_id , qcom_pas_segment_dump );
160+ iounmap (pas -> mem_region );
161+ pas -> mem_region = NULL ;
152162}
153163
154164static int qcom_pas_pds_enable (struct qcom_pas * pas , struct device * * pds ,
@@ -253,7 +263,7 @@ static int qcom_pas_load(struct rproc *rproc, const struct firmware *fw)
253263 }
254264
255265 ret = qcom_mdt_pas_load (pas -> dtb_pas_ctx , pas -> dtb_firmware ,
256- pas -> dtb_firmware_name , pas -> dtb_mem_region ,
266+ pas -> dtb_firmware_name ,
257267 & pas -> dtb_mem_reloc );
258268 if (ret )
259269 goto release_dtb_metadata ;
@@ -262,7 +272,9 @@ static int qcom_pas_load(struct rproc *rproc, const struct firmware *fw)
262272 return 0 ;
263273
264274release_dtb_metadata :
265- qcom_scm_pas_metadata_release (pas -> dtb_pas_ctx );
275+ if (pas -> dtb_pas_id )
276+ qcom_scm_pas_metadata_release (pas -> dtb_pas_ctx );
277+
266278 release_firmware (pas -> dtb_firmware );
267279
268280 return ret ;
@@ -331,7 +343,7 @@ static int qcom_pas_start(struct rproc *rproc)
331343 }
332344
333345 ret = qcom_mdt_pas_load (pas -> pas_ctx , pas -> firmware , rproc -> firmware ,
334- pas -> mem_region , & pas -> mem_reloc );
346+ & pas -> mem_reloc );
335347 if (ret )
336348 goto release_pas_metadata ;
337349
@@ -522,6 +534,22 @@ static unsigned long qcom_pas_panic(struct rproc *rproc)
522534 return qcom_q6v5_panic (& pas -> q6v5 );
523535}
524536
537+ static void qcom_pas_coredump (struct rproc * rproc )
538+ {
539+ struct qcom_pas * pas = rproc -> priv ;
540+
541+ pas -> mem_region = ioremap_wc (pas -> mem_phys , pas -> mem_size );
542+ if (!pas -> mem_region ) {
543+ dev_err (pas -> dev , "unable to map memory region: %pa+%zx\n" ,
544+ & pas -> mem_phys , pas -> mem_size );
545+ return ;
546+ }
547+
548+ rproc_coredump (rproc );
549+ iounmap (pas -> mem_region );
550+ pas -> mem_region = NULL ;
551+ }
552+
525553static const struct rproc_ops qcom_pas_ops = {
526554 .unprepare = qcom_pas_unprepare ,
527555 .start = qcom_pas_start ,
@@ -530,6 +558,7 @@ static const struct rproc_ops qcom_pas_ops = {
530558 .parse_fw = qcom_pas_parse_firmware ,
531559 .load = qcom_pas_load ,
532560 .panic = qcom_pas_panic ,
561+ .coredump = qcom_pas_coredump ,
533562};
534563
535564static const struct rproc_ops qcom_pas_minidump_ops = {
@@ -635,6 +664,7 @@ static void qcom_pas_pds_detach(struct qcom_pas *pas, struct device **pds, size_
635664
636665static int qcom_pas_alloc_memory_region (struct qcom_pas * pas )
637666{
667+ struct rproc * rproc = pas -> rproc ;
638668 struct reserved_mem * rmem ;
639669 struct device_node * node ;
640670
@@ -653,13 +683,12 @@ static int qcom_pas_alloc_memory_region(struct qcom_pas *pas)
653683
654684 pas -> mem_phys = pas -> mem_reloc = rmem -> base ;
655685 pas -> mem_size = rmem -> size ;
656- pas -> mem_region = devm_ioremap_wc (pas -> dev , pas -> mem_phys , pas -> mem_size );
657- if (!pas -> mem_region ) {
658- dev_err (pas -> dev , "unable to map memory region: %pa+%zx\n" ,
659- & rmem -> base , pas -> mem_size );
660- return - EBUSY ;
661- }
686+ pas -> pas_ctx = devm_qcom_scm_pas_context_alloc (pas -> dev , pas -> pas_id ,
687+ pas -> mem_phys , pas -> mem_size );
688+ if (IS_ERR (pas -> pas_ctx ))
689+ return PTR_ERR (pas -> pas_ctx );
662690
691+ pas -> pas_ctx -> use_tzmem = rproc -> has_iommu ;
663692 if (!pas -> dtb_pas_id )
664693 return 0 ;
665694
@@ -678,12 +707,13 @@ static int qcom_pas_alloc_memory_region(struct qcom_pas *pas)
678707
679708 pas -> dtb_mem_phys = pas -> dtb_mem_reloc = rmem -> base ;
680709 pas -> dtb_mem_size = rmem -> size ;
681- pas -> dtb_mem_region = devm_ioremap_wc (pas -> dev , pas -> dtb_mem_phys , pas -> dtb_mem_size );
682- if (!pas -> dtb_mem_region ) {
683- dev_err (pas -> dev , "unable to map dtb memory region: %pa+%zx\n" ,
684- & rmem -> base , pas -> dtb_mem_size );
685- return - EBUSY ;
686- }
710+ pas -> dtb_pas_ctx = devm_qcom_scm_pas_context_alloc (pas -> dev , pas -> dtb_pas_id ,
711+ pas -> dtb_mem_phys ,
712+ pas -> dtb_mem_size );
713+ if (IS_ERR (pas -> dtb_pas_ctx ))
714+ return PTR_ERR (pas -> dtb_pas_ctx );
715+
716+ pas -> dtb_pas_ctx -> use_tzmem = rproc -> has_iommu ;
687717
688718 return 0 ;
689719}
@@ -869,23 +899,6 @@ static int qcom_pas_probe(struct platform_device *pdev)
869899
870900 qcom_add_ssr_subdev (rproc , & pas -> ssr_subdev , desc -> ssr_name );
871901
872- pas -> pas_ctx = devm_qcom_scm_pas_context_alloc (pas -> dev , pas -> pas_id ,
873- pas -> mem_phys , pas -> mem_size );
874- if (IS_ERR (pas -> pas_ctx )) {
875- ret = PTR_ERR (pas -> pas_ctx );
876- goto remove_ssr_sysmon ;
877- }
878-
879- pas -> dtb_pas_ctx = devm_qcom_scm_pas_context_alloc (pas -> dev , pas -> dtb_pas_id ,
880- pas -> dtb_mem_phys ,
881- pas -> dtb_mem_size );
882- if (IS_ERR (pas -> dtb_pas_ctx )) {
883- ret = PTR_ERR (pas -> dtb_pas_ctx );
884- goto remove_ssr_sysmon ;
885- }
886-
887- pas -> pas_ctx -> use_tzmem = rproc -> has_iommu ;
888- pas -> dtb_pas_ctx -> use_tzmem = rproc -> has_iommu ;
889902 ret = rproc_add (rproc );
890903 if (ret )
891904 goto remove_ssr_sysmon ;
0 commit comments