Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

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>

authored by

Mukesh Ojha and committed by
Bjorn Andersson
b13d8baf ccb7bde5

+38 -28
+4 -4
drivers/firmware/qcom/qcom_scm.c
··· 601 601 * and optional blob of data used for authenticating the metadata 602 602 * and the rest of the firmware 603 603 * @size: size of the metadata 604 - * @ctx: optional metadata context 604 + * @ctx: optional pas context 605 605 * 606 606 * Return: 0 on success. 607 607 * ··· 610 610 * qcom_scm_pas_metadata_release() by the caller. 611 611 */ 612 612 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) 614 614 { 615 615 dma_addr_t mdata_phys; 616 616 void *mdata_buf; ··· 674 674 675 675 /** 676 676 * qcom_scm_pas_metadata_release() - release metadata context 677 - * @ctx: metadata context 677 + * @ctx: pas context 678 678 */ 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) 680 680 { 681 681 if (!ctx->ptr) 682 682 return;
+27 -11
drivers/remoteproc/qcom_q6v5_pas.c
··· 117 117 struct qcom_rproc_ssr ssr_subdev; 118 118 struct qcom_sysmon *sysmon; 119 119 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; 122 122 }; 123 123 124 124 static void qcom_pas_segment_dump(struct rproc *rproc, ··· 211 211 * auth_and_reset() was successful, but in other cases clean it up 212 212 * here. 213 213 */ 214 - qcom_scm_pas_metadata_release(&pas->pas_metadata); 214 + qcom_scm_pas_metadata_release(pas->pas_ctx); 215 215 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); 217 217 218 218 return 0; 219 219 } ··· 241 241 242 242 ret = qcom_mdt_pas_init(pas->dev, pas->dtb_firmware, pas->dtb_firmware_name, 243 243 pas->dtb_pas_id, pas->dtb_mem_phys, 244 - &pas->dtb_pas_metadata); 244 + pas->dtb_pas_ctx); 245 245 if (ret) 246 246 goto release_dtb_firmware; 247 247 ··· 255 255 return 0; 256 256 257 257 release_dtb_metadata: 258 - qcom_scm_pas_metadata_release(&pas->dtb_pas_metadata); 258 + qcom_scm_pas_metadata_release(pas->dtb_pas_ctx); 259 259 260 260 release_dtb_firmware: 261 261 release_firmware(pas->dtb_firmware); ··· 306 306 } 307 307 308 308 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); 310 310 if (ret) 311 311 goto disable_px_supply; 312 312 ··· 332 332 goto release_pas_metadata; 333 333 } 334 334 335 - qcom_scm_pas_metadata_release(&pas->pas_metadata); 335 + qcom_scm_pas_metadata_release(pas->pas_ctx); 336 336 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); 338 338 339 339 /* firmware is used to pass reference from qcom_pas_start(), drop it now */ 340 340 pas->firmware = NULL; ··· 342 342 return 0; 343 343 344 344 release_pas_metadata: 345 - qcom_scm_pas_metadata_release(&pas->pas_metadata); 345 + qcom_scm_pas_metadata_release(pas->pas_ctx); 346 346 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); 348 348 disable_px_supply: 349 349 if (pas->px_supply) 350 350 regulator_disable(pas->px_supply); ··· 760 760 } 761 761 762 762 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 + 763 779 ret = rproc_add(rproc); 764 780 if (ret) 765 781 goto remove_ssr_sysmon;
+2 -2
drivers/soc/qcom/mdt_loader.c
··· 234 234 * @fw_name: name of the firmware, for construction of segment file names 235 235 * @pas_id: PAS identifier 236 236 * @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 238 238 * 239 239 * Returns 0 on success, negative errno otherwise. 240 240 */ 241 241 int qcom_mdt_pas_init(struct device *dev, const struct firmware *fw, 242 242 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) 244 244 { 245 245 const struct elf32_phdr *phdrs; 246 246 const struct elf32_phdr *phdr;
+2 -8
include/linux/firmware/qcom/qcom_scm.h
··· 66 66 void qcom_scm_cpu_power_down(u32 flags); 67 67 int qcom_scm_set_remote_state(u32 state, u32 id); 68 68 69 - struct qcom_scm_pas_metadata { 70 - void *ptr; 71 - dma_addr_t phys; 72 - ssize_t size; 73 - }; 74 - 75 69 struct qcom_scm_pas_context { 76 70 struct device *dev; 77 71 u32 pas_id; ··· 81 87 phys_addr_t mem_phys, 82 88 size_t mem_size); 83 89 int qcom_scm_pas_init_image(u32 pas_id, const void *metadata, size_t size, 84 - struct qcom_scm_pas_metadata *ctx); 85 - void qcom_scm_pas_metadata_release(struct qcom_scm_pas_metadata *ctx); 90 + struct qcom_scm_pas_context *ctx); 91 + void qcom_scm_pas_metadata_release(struct qcom_scm_pas_context *ctx); 86 92 int qcom_scm_pas_mem_setup(u32 pas_id, phys_addr_t addr, phys_addr_t size); 87 93 int qcom_scm_pas_auth_and_reset(u32 pas_id); 88 94 int qcom_scm_pas_shutdown(u32 pas_id);
+3 -3
include/linux/soc/qcom/mdt_loader.h
··· 10 10 11 11 struct device; 12 12 struct firmware; 13 - struct qcom_scm_pas_metadata; 13 + struct qcom_scm_pas_context; 14 14 15 15 #if IS_ENABLED(CONFIG_QCOM_MDT_LOADER) 16 16 17 17 ssize_t qcom_mdt_get_size(const struct firmware *fw); 18 18 int qcom_mdt_pas_init(struct device *dev, const struct firmware *fw, 19 19 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); 21 21 int qcom_mdt_load(struct device *dev, const struct firmware *fw, 22 22 const char *fw_name, int pas_id, void *mem_region, 23 23 phys_addr_t mem_phys, size_t mem_size, ··· 39 39 40 40 static inline int qcom_mdt_pas_init(struct device *dev, const struct firmware *fw, 41 41 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) 43 43 { 44 44 return -ENODEV; 45 45 }