Skip to content

Commit b13d8ba

Browse files
mukeshojha-linuxandersson
authored andcommitted
remoteproc: pas: Replace metadata context with PAS context structure
As a superset of the existing metadata context, the PAS context structure enables both remoteproc and non-remoteproc subsystems to better support scenarios where the SoC runs with or without the Gunyah hypervisor. To reflect this, relevant SCM and metadata functions are updated to incorporate PAS context awareness and remove metadata context data structure completely. Signed-off-by: Mukesh Ojha <mukesh.ojha@oss.qualcomm.com> Link: https://lore.kernel.org/r/20260105-kvmrprocv10-v10-5-022e96815380@oss.qualcomm.com Signed-off-by: Bjorn Andersson <andersson@kernel.org>
1 parent ccb7bde commit b13d8ba

5 files changed

Lines changed: 38 additions & 28 deletions

File tree

drivers/firmware/qcom/qcom_scm.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -601,7 +601,7 @@ EXPORT_SYMBOL_GPL(devm_qcom_scm_pas_context_alloc);
601601
* and optional blob of data used for authenticating the metadata
602602
* and the rest of the firmware
603603
* @size: size of the metadata
604-
* @ctx: optional metadata context
604+
* @ctx: optional pas context
605605
*
606606
* Return: 0 on success.
607607
*
@@ -610,7 +610,7 @@ EXPORT_SYMBOL_GPL(devm_qcom_scm_pas_context_alloc);
610610
* qcom_scm_pas_metadata_release() by the caller.
611611
*/
612612
int qcom_scm_pas_init_image(u32 pas_id, const void *metadata, size_t size,
613-
struct qcom_scm_pas_metadata *ctx)
613+
struct qcom_scm_pas_context *ctx)
614614
{
615615
dma_addr_t mdata_phys;
616616
void *mdata_buf;
@@ -674,9 +674,9 @@ EXPORT_SYMBOL_GPL(qcom_scm_pas_init_image);
674674

675675
/**
676676
* qcom_scm_pas_metadata_release() - release metadata context
677-
* @ctx: metadata context
677+
* @ctx: pas context
678678
*/
679-
void qcom_scm_pas_metadata_release(struct qcom_scm_pas_metadata *ctx)
679+
void qcom_scm_pas_metadata_release(struct qcom_scm_pas_context *ctx)
680680
{
681681
if (!ctx->ptr)
682682
return;

drivers/remoteproc/qcom_q6v5_pas.c

Lines changed: 27 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -117,8 +117,8 @@ struct qcom_pas {
117117
struct qcom_rproc_ssr ssr_subdev;
118118
struct qcom_sysmon *sysmon;
119119

120-
struct qcom_scm_pas_metadata pas_metadata;
121-
struct qcom_scm_pas_metadata dtb_pas_metadata;
120+
struct qcom_scm_pas_context *pas_ctx;
121+
struct qcom_scm_pas_context *dtb_pas_ctx;
122122
};
123123

124124
static void qcom_pas_segment_dump(struct rproc *rproc,
@@ -211,9 +211,9 @@ static int qcom_pas_unprepare(struct rproc *rproc)
211211
* auth_and_reset() was successful, but in other cases clean it up
212212
* here.
213213
*/
214-
qcom_scm_pas_metadata_release(&pas->pas_metadata);
214+
qcom_scm_pas_metadata_release(pas->pas_ctx);
215215
if (pas->dtb_pas_id)
216-
qcom_scm_pas_metadata_release(&pas->dtb_pas_metadata);
216+
qcom_scm_pas_metadata_release(pas->dtb_pas_ctx);
217217

218218
return 0;
219219
}
@@ -241,7 +241,7 @@ static int qcom_pas_load(struct rproc *rproc, const struct firmware *fw)
241241

242242
ret = qcom_mdt_pas_init(pas->dev, pas->dtb_firmware, pas->dtb_firmware_name,
243243
pas->dtb_pas_id, pas->dtb_mem_phys,
244-
&pas->dtb_pas_metadata);
244+
pas->dtb_pas_ctx);
245245
if (ret)
246246
goto release_dtb_firmware;
247247

@@ -255,7 +255,7 @@ static int qcom_pas_load(struct rproc *rproc, const struct firmware *fw)
255255
return 0;
256256

257257
release_dtb_metadata:
258-
qcom_scm_pas_metadata_release(&pas->dtb_pas_metadata);
258+
qcom_scm_pas_metadata_release(pas->dtb_pas_ctx);
259259

260260
release_dtb_firmware:
261261
release_firmware(pas->dtb_firmware);
@@ -306,7 +306,7 @@ static int qcom_pas_start(struct rproc *rproc)
306306
}
307307

308308
ret = qcom_mdt_pas_init(pas->dev, pas->firmware, rproc->firmware, pas->pas_id,
309-
pas->mem_phys, &pas->pas_metadata);
309+
pas->mem_phys, pas->pas_ctx);
310310
if (ret)
311311
goto disable_px_supply;
312312

@@ -332,19 +332,19 @@ static int qcom_pas_start(struct rproc *rproc)
332332
goto release_pas_metadata;
333333
}
334334

335-
qcom_scm_pas_metadata_release(&pas->pas_metadata);
335+
qcom_scm_pas_metadata_release(pas->pas_ctx);
336336
if (pas->dtb_pas_id)
337-
qcom_scm_pas_metadata_release(&pas->dtb_pas_metadata);
337+
qcom_scm_pas_metadata_release(pas->dtb_pas_ctx);
338338

339339
/* firmware is used to pass reference from qcom_pas_start(), drop it now */
340340
pas->firmware = NULL;
341341

342342
return 0;
343343

344344
release_pas_metadata:
345-
qcom_scm_pas_metadata_release(&pas->pas_metadata);
345+
qcom_scm_pas_metadata_release(pas->pas_ctx);
346346
if (pas->dtb_pas_id)
347-
qcom_scm_pas_metadata_release(&pas->dtb_pas_metadata);
347+
qcom_scm_pas_metadata_release(pas->dtb_pas_ctx);
348348
disable_px_supply:
349349
if (pas->px_supply)
350350
regulator_disable(pas->px_supply);
@@ -760,6 +760,22 @@ static int qcom_pas_probe(struct platform_device *pdev)
760760
}
761761

762762
qcom_add_ssr_subdev(rproc, &pas->ssr_subdev, desc->ssr_name);
763+
764+
pas->pas_ctx = devm_qcom_scm_pas_context_alloc(pas->dev, pas->pas_id,
765+
pas->mem_phys, pas->mem_size);
766+
if (IS_ERR(pas->pas_ctx)) {
767+
ret = PTR_ERR(pas->pas_ctx);
768+
goto remove_ssr_sysmon;
769+
}
770+
771+
pas->dtb_pas_ctx = devm_qcom_scm_pas_context_alloc(pas->dev, pas->dtb_pas_id,
772+
pas->dtb_mem_phys,
773+
pas->dtb_mem_size);
774+
if (IS_ERR(pas->dtb_pas_ctx)) {
775+
ret = PTR_ERR(pas->dtb_pas_ctx);
776+
goto remove_ssr_sysmon;
777+
}
778+
763779
ret = rproc_add(rproc);
764780
if (ret)
765781
goto remove_ssr_sysmon;

drivers/soc/qcom/mdt_loader.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -234,13 +234,13 @@ EXPORT_SYMBOL_GPL(qcom_mdt_read_metadata);
234234
* @fw_name: name of the firmware, for construction of segment file names
235235
* @pas_id: PAS identifier
236236
* @mem_phys: physical address of allocated memory region
237-
* @ctx: PAS metadata context, to be released by caller
237+
* @ctx: PAS context, ctx->metadata to be released by caller
238238
*
239239
* Returns 0 on success, negative errno otherwise.
240240
*/
241241
int qcom_mdt_pas_init(struct device *dev, const struct firmware *fw,
242242
const char *fw_name, int pas_id, phys_addr_t mem_phys,
243-
struct qcom_scm_pas_metadata *ctx)
243+
struct qcom_scm_pas_context *ctx)
244244
{
245245
const struct elf32_phdr *phdrs;
246246
const struct elf32_phdr *phdr;

include/linux/firmware/qcom/qcom_scm.h

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -66,12 +66,6 @@ int qcom_scm_set_warm_boot_addr(void *entry);
6666
void qcom_scm_cpu_power_down(u32 flags);
6767
int qcom_scm_set_remote_state(u32 state, u32 id);
6868

69-
struct qcom_scm_pas_metadata {
70-
void *ptr;
71-
dma_addr_t phys;
72-
ssize_t size;
73-
};
74-
7569
struct qcom_scm_pas_context {
7670
struct device *dev;
7771
u32 pas_id;
@@ -87,8 +81,8 @@ struct qcom_scm_pas_context *devm_qcom_scm_pas_context_alloc(struct device *dev,
8781
phys_addr_t mem_phys,
8882
size_t mem_size);
8983
int qcom_scm_pas_init_image(u32 pas_id, const void *metadata, size_t size,
90-
struct qcom_scm_pas_metadata *ctx);
91-
void qcom_scm_pas_metadata_release(struct qcom_scm_pas_metadata *ctx);
84+
struct qcom_scm_pas_context *ctx);
85+
void qcom_scm_pas_metadata_release(struct qcom_scm_pas_context *ctx);
9286
int qcom_scm_pas_mem_setup(u32 pas_id, phys_addr_t addr, phys_addr_t size);
9387
int qcom_scm_pas_auth_and_reset(u32 pas_id);
9488
int qcom_scm_pas_shutdown(u32 pas_id);

include/linux/soc/qcom/mdt_loader.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,14 +10,14 @@
1010

1111
struct device;
1212
struct firmware;
13-
struct qcom_scm_pas_metadata;
13+
struct qcom_scm_pas_context;
1414

1515
#if IS_ENABLED(CONFIG_QCOM_MDT_LOADER)
1616

1717
ssize_t qcom_mdt_get_size(const struct firmware *fw);
1818
int qcom_mdt_pas_init(struct device *dev, const struct firmware *fw,
1919
const char *fw_name, int pas_id, phys_addr_t mem_phys,
20-
struct qcom_scm_pas_metadata *pas_metadata_ctx);
20+
struct qcom_scm_pas_context *pas_ctx);
2121
int qcom_mdt_load(struct device *dev, const struct firmware *fw,
2222
const char *fw_name, int pas_id, void *mem_region,
2323
phys_addr_t mem_phys, size_t mem_size,
@@ -39,7 +39,7 @@ static inline ssize_t qcom_mdt_get_size(const struct firmware *fw)
3939

4040
static inline int qcom_mdt_pas_init(struct device *dev, const struct firmware *fw,
4141
const char *fw_name, int pas_id, phys_addr_t mem_phys,
42-
struct qcom_scm_pas_metadata *pas_metadata_ctx)
42+
struct qcom_scm_pas_context *pas_ctx)
4343
{
4444
return -ENODEV;
4545
}

0 commit comments

Comments
 (0)