Skip to content

Commit 84a45dc

Browse files
authored
remoteproc: qcom: pas: Map/unmap subsystem region before auth_and_reset (#386)
remoteproc: qcom: pas: Map/unmap subsystem region before auth_and_reset
2 parents ab915d0 + 8eb620d commit 84a45dc

File tree

4 files changed

+63
-40
lines changed

4 files changed

+63
-40
lines changed

drivers/media/platform/qcom/iris/iris_firmware.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ static int iris_load_fw_to_memory(struct iris_core *core, const char *fw_name)
7272
goto err_release_fw;
7373
}
7474

75-
ret = qcom_mdt_pas_load(ctx, firmware, fw_name, mem_virt, NULL);
75+
ret = qcom_mdt_pas_load(ctx, firmware, fw_name, NULL);
7676
qcom_scm_pas_metadata_release(ctx);
7777
if (ret)
7878
goto err_mem_unmap;

drivers/remoteproc/qcom_q6v5_pas.c

Lines changed: 46 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -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

154164
static 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

264274
release_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+
525553
static 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

535564
static 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

636665
static 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;

drivers/soc/qcom/mdt_loader.c

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
#include <linux/device.h>
1212
#include <linux/elf.h>
1313
#include <linux/firmware.h>
14+
#include <linux/io.h>
1415
#include <linux/kernel.h>
1516
#include <linux/module.h>
1617
#include <linux/firmware/qcom/qcom_scm.h>
@@ -486,22 +487,31 @@ EXPORT_SYMBOL_GPL(qcom_mdt_load_no_init);
486487
* @ctx: Pointer to the PAS (Peripheral Authentication Service) context
487488
* @fw: Firmware object representing the .mdt file
488489
* @firmware: Name of the firmware used to construct segment file names
489-
* @mem_region: Memory region allocated for loading the firmware
490490
* @reloc_base: Physical address adjusted after relocation
491491
*
492492
* Return: 0 on success or a negative error code on failure.
493493
*/
494494
int qcom_mdt_pas_load(struct qcom_scm_pas_context *ctx, const struct firmware *fw,
495-
const char *firmware, void *mem_region, phys_addr_t *reloc_base)
495+
const char *firmware, phys_addr_t *reloc_base)
496496
{
497+
void *mem_region;
497498
int ret;
498499

499500
ret = __qcom_mdt_pas_init(ctx->dev, fw, firmware, ctx->pas_id, ctx->mem_phys, ctx);
500501
if (ret)
501502
return ret;
502503

503-
return qcom_mdt_load_no_init(ctx->dev, fw, firmware, mem_region, ctx->mem_phys,
504-
ctx->mem_size, reloc_base);
504+
mem_region = ioremap_wc(ctx->mem_phys, ctx->mem_size);
505+
if (!mem_region) {
506+
dev_err(ctx->dev, "unable to map memory region: %pa+%zx\n", &ctx->mem_phys,
507+
ctx->mem_size);
508+
return -EINVAL;
509+
}
510+
511+
ret = qcom_mdt_load_no_init(ctx->dev, fw, firmware, mem_region, ctx->mem_phys,
512+
ctx->mem_size, reloc_base);
513+
iounmap(mem_region);
514+
return ret;
505515
}
506516
EXPORT_SYMBOL_GPL(qcom_mdt_pas_load);
507517

include/linux/soc/qcom/mdt_loader.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ int qcom_mdt_load(struct device *dev, const struct firmware *fw,
2121
phys_addr_t *reloc_base);
2222

2323
int qcom_mdt_pas_load(struct qcom_scm_pas_context *ctx, const struct firmware *fw,
24-
const char *firmware, void *mem_region, phys_addr_t *reloc_base);
24+
const char *firmware, phys_addr_t *reloc_base);
2525

2626
int qcom_mdt_load_no_init(struct device *dev, const struct firmware *fw,
2727
const char *fw_name, void *mem_region,
@@ -47,7 +47,7 @@ static inline int qcom_mdt_load(struct device *dev, const struct firmware *fw,
4747

4848
static inline int qcom_mdt_pas_load(struct qcom_scm_pas_context *ctx,
4949
const struct firmware *fw, const char *firmware,
50-
void *mem_region, phys_addr_t *reloc_base)
50+
phys_addr_t *reloc_base)
5151
{
5252
return -ENODEV;
5353
}

0 commit comments

Comments
 (0)