xref: /openbmc/linux/drivers/remoteproc/qcom_q6v5_pas.c (revision 9144f784f852f9a125cabe9927b986d909bfa439)
11802d0beSThomas Gleixner // SPDX-License-Identifier: GPL-2.0-only
29e004f97SBjorn Andersson /*
39e004f97SBjorn Andersson  * Qualcomm ADSP/SLPI Peripheral Image Loader for MSM8974 and MSM8996
49e004f97SBjorn Andersson  *
59e004f97SBjorn Andersson  * Copyright (C) 2016 Linaro Ltd
69e004f97SBjorn Andersson  * Copyright (C) 2014 Sony Mobile Communications AB
79e004f97SBjorn Andersson  * Copyright (c) 2012-2013, The Linux Foundation. All rights reserved.
89e004f97SBjorn Andersson  */
99e004f97SBjorn Andersson 
109e004f97SBjorn Andersson #include <linux/clk.h>
1186590c30SSibi Sankar #include <linux/delay.h>
129e004f97SBjorn Andersson #include <linux/firmware.h>
139e004f97SBjorn Andersson #include <linux/interrupt.h>
149e004f97SBjorn Andersson #include <linux/kernel.h>
159e004f97SBjorn Andersson #include <linux/module.h>
163440d8daSRob Herring #include <linux/of.h>
179e004f97SBjorn Andersson #include <linux/of_address.h>
180ee55c18SStephan Gerhold #include <linux/of_reserved_mem.h>
199e004f97SBjorn Andersson #include <linux/platform_device.h>
2017ee2fb4SSibi Sankar #include <linux/pm_domain.h>
2117ee2fb4SSibi Sankar #include <linux/pm_runtime.h>
223bf90ecaSElliot Berman #include <linux/firmware/qcom/qcom_scm.h>
239e004f97SBjorn Andersson #include <linux/regulator/consumer.h>
249e004f97SBjorn Andersson #include <linux/remoteproc.h>
259e004f97SBjorn Andersson #include <linux/soc/qcom/mdt_loader.h>
269e004f97SBjorn Andersson #include <linux/soc/qcom/smem.h>
279e004f97SBjorn Andersson #include <linux/soc/qcom/smem_state.h>
289e004f97SBjorn Andersson 
299e004f97SBjorn Andersson #include "qcom_common.h"
30d4c78d21SBjorn Andersson #include "qcom_pil_info.h"
319e004f97SBjorn Andersson #include "qcom_q6v5.h"
329e004f97SBjorn Andersson #include "remoteproc_internal.h"
339e004f97SBjorn Andersson 
3486590c30SSibi Sankar #define ADSP_DECRYPT_SHUTDOWN_DELAY_MS	100
3586590c30SSibi Sankar 
369e004f97SBjorn Andersson struct adsp_data {
379e004f97SBjorn Andersson 	int crash_reason_smem;
389e004f97SBjorn Andersson 	const char *firmware_name;
3929814986SNeil Armstrong 	const char *dtb_firmware_name;
409e004f97SBjorn Andersson 	int pas_id;
4129814986SNeil Armstrong 	int dtb_pas_id;
428ed8485cSSiddharth Gupta 	unsigned int minidump_id;
43b7ff96ccSSibi Sankar 	bool auto_boot;
4486590c30SSibi Sankar 	bool decrypt_shutdown;
459e004f97SBjorn Andersson 
4617ee2fb4SSibi Sankar 	char **proxy_pd_names;
4717ee2fb4SSibi Sankar 
48c1fe10d2SSibi Sankar 	const char *load_state;
499e004f97SBjorn Andersson 	const char *ssr_name;
509e004f97SBjorn Andersson 	const char *sysmon_name;
519e004f97SBjorn Andersson 	int ssctl_id;
52c63c0a7cSNeil Armstrong 
53c63c0a7cSNeil Armstrong 	int region_assign_idx;
549e004f97SBjorn Andersson };
559e004f97SBjorn Andersson 
569e004f97SBjorn Andersson struct qcom_adsp {
579e004f97SBjorn Andersson 	struct device *dev;
589e004f97SBjorn Andersson 	struct rproc *rproc;
599e004f97SBjorn Andersson 
609e004f97SBjorn Andersson 	struct qcom_q6v5 q6v5;
619e004f97SBjorn Andersson 
629e004f97SBjorn Andersson 	struct clk *xo;
639e004f97SBjorn Andersson 	struct clk *aggre2_clk;
649e004f97SBjorn Andersson 
659e004f97SBjorn Andersson 	struct regulator *cx_supply;
669e004f97SBjorn Andersson 	struct regulator *px_supply;
679e004f97SBjorn Andersson 
6817ee2fb4SSibi Sankar 	struct device *proxy_pds[3];
6917ee2fb4SSibi Sankar 
7017ee2fb4SSibi Sankar 	int proxy_pd_count;
7117ee2fb4SSibi Sankar 
7229814986SNeil Armstrong 	const char *dtb_firmware_name;
739e004f97SBjorn Andersson 	int pas_id;
7429814986SNeil Armstrong 	int dtb_pas_id;
758ed8485cSSiddharth Gupta 	unsigned int minidump_id;
769e004f97SBjorn Andersson 	int crash_reason_smem;
7786590c30SSibi Sankar 	bool decrypt_shutdown;
78d4c78d21SBjorn Andersson 	const char *info_name;
799e004f97SBjorn Andersson 
8029814986SNeil Armstrong 	const struct firmware *firmware;
8129814986SNeil Armstrong 	const struct firmware *dtb_firmware;
8229814986SNeil Armstrong 
839e004f97SBjorn Andersson 	struct completion start_done;
849e004f97SBjorn Andersson 	struct completion stop_done;
859e004f97SBjorn Andersson 
869e004f97SBjorn Andersson 	phys_addr_t mem_phys;
8729814986SNeil Armstrong 	phys_addr_t dtb_mem_phys;
889e004f97SBjorn Andersson 	phys_addr_t mem_reloc;
8929814986SNeil Armstrong 	phys_addr_t dtb_mem_reloc;
90c63c0a7cSNeil Armstrong 	phys_addr_t region_assign_phys;
919e004f97SBjorn Andersson 	void *mem_region;
9229814986SNeil Armstrong 	void *dtb_mem_region;
939e004f97SBjorn Andersson 	size_t mem_size;
9429814986SNeil Armstrong 	size_t dtb_mem_size;
95c63c0a7cSNeil Armstrong 	size_t region_assign_size;
96c63c0a7cSNeil Armstrong 
97c63c0a7cSNeil Armstrong 	int region_assign_idx;
98968a26a0SElliot Berman 	u64 region_assign_perms;
999e004f97SBjorn Andersson 
1009e004f97SBjorn Andersson 	struct qcom_rproc_glink glink_subdev;
1019e004f97SBjorn Andersson 	struct qcom_rproc_subdev smd_subdev;
1029e004f97SBjorn Andersson 	struct qcom_rproc_ssr ssr_subdev;
1039e004f97SBjorn Andersson 	struct qcom_sysmon *sysmon;
10494749156SBjorn Andersson 
10594749156SBjorn Andersson 	struct qcom_scm_pas_metadata pas_metadata;
10629814986SNeil Armstrong 	struct qcom_scm_pas_metadata dtb_pas_metadata;
1079e004f97SBjorn Andersson };
1089e004f97SBjorn Andersson 
adsp_segment_dump(struct rproc * rproc,struct rproc_dump_segment * segment,void * dest,size_t offset,size_t size)109181da4bcSKrzysztof Kozlowski static void adsp_segment_dump(struct rproc *rproc, struct rproc_dump_segment *segment,
110a376c10dSYogesh Lal 		       void *dest, size_t offset, size_t size)
111a376c10dSYogesh Lal {
112a376c10dSYogesh Lal 	struct qcom_adsp *adsp = rproc->priv;
113a376c10dSYogesh Lal 	int total_offset;
114a376c10dSYogesh Lal 
115a376c10dSYogesh Lal 	total_offset = segment->da + segment->offset + offset - adsp->mem_phys;
116a376c10dSYogesh Lal 	if (total_offset < 0 || total_offset + size > adsp->mem_size) {
117a376c10dSYogesh Lal 		dev_err(adsp->dev,
118a376c10dSYogesh Lal 			"invalid copy request for segment %pad with offset %zu and size %zu)\n",
119a376c10dSYogesh Lal 			&segment->da, offset, size);
120a376c10dSYogesh Lal 		memset(dest, 0xff, size);
121a376c10dSYogesh Lal 		return;
122a376c10dSYogesh Lal 	}
123a376c10dSYogesh Lal 
124a376c10dSYogesh Lal 	memcpy_fromio(dest, adsp->mem_region + total_offset, size);
125a376c10dSYogesh Lal }
126a376c10dSYogesh Lal 
adsp_minidump(struct rproc * rproc)1278ed8485cSSiddharth Gupta static void adsp_minidump(struct rproc *rproc)
1288ed8485cSSiddharth Gupta {
1298ed8485cSSiddharth Gupta 	struct qcom_adsp *adsp = rproc->priv;
1308ed8485cSSiddharth Gupta 
1317b6ece96SSiddharth Gupta 	if (rproc->dump_conf == RPROC_COREDUMP_DISABLED)
1327b6ece96SSiddharth Gupta 		return;
1337b6ece96SSiddharth Gupta 
134a376c10dSYogesh Lal 	qcom_minidump(rproc, adsp->minidump_id, adsp_segment_dump);
1358ed8485cSSiddharth Gupta }
1368ed8485cSSiddharth Gupta 
adsp_pds_enable(struct qcom_adsp * adsp,struct device ** pds,size_t pd_count)13717ee2fb4SSibi Sankar static int adsp_pds_enable(struct qcom_adsp *adsp, struct device **pds,
13817ee2fb4SSibi Sankar 			   size_t pd_count)
13917ee2fb4SSibi Sankar {
14017ee2fb4SSibi Sankar 	int ret;
14117ee2fb4SSibi Sankar 	int i;
14217ee2fb4SSibi Sankar 
14317ee2fb4SSibi Sankar 	for (i = 0; i < pd_count; i++) {
14417ee2fb4SSibi Sankar 		dev_pm_genpd_set_performance_state(pds[i], INT_MAX);
14517ee2fb4SSibi Sankar 		ret = pm_runtime_get_sync(pds[i]);
146c0a6e5eeSZhang Qilong 		if (ret < 0) {
147c0a6e5eeSZhang Qilong 			pm_runtime_put_noidle(pds[i]);
148c0a6e5eeSZhang Qilong 			dev_pm_genpd_set_performance_state(pds[i], 0);
14917ee2fb4SSibi Sankar 			goto unroll_pd_votes;
15017ee2fb4SSibi Sankar 		}
151c0a6e5eeSZhang Qilong 	}
15217ee2fb4SSibi Sankar 
15317ee2fb4SSibi Sankar 	return 0;
15417ee2fb4SSibi Sankar 
15517ee2fb4SSibi Sankar unroll_pd_votes:
15617ee2fb4SSibi Sankar 	for (i--; i >= 0; i--) {
15717ee2fb4SSibi Sankar 		dev_pm_genpd_set_performance_state(pds[i], 0);
15817ee2fb4SSibi Sankar 		pm_runtime_put(pds[i]);
15917ee2fb4SSibi Sankar 	}
16017ee2fb4SSibi Sankar 
16117ee2fb4SSibi Sankar 	return ret;
16217ee2fb4SSibi Sankar };
16317ee2fb4SSibi Sankar 
adsp_pds_disable(struct qcom_adsp * adsp,struct device ** pds,size_t pd_count)16417ee2fb4SSibi Sankar static void adsp_pds_disable(struct qcom_adsp *adsp, struct device **pds,
16517ee2fb4SSibi Sankar 			     size_t pd_count)
16617ee2fb4SSibi Sankar {
16717ee2fb4SSibi Sankar 	int i;
16817ee2fb4SSibi Sankar 
16917ee2fb4SSibi Sankar 	for (i = 0; i < pd_count; i++) {
17017ee2fb4SSibi Sankar 		dev_pm_genpd_set_performance_state(pds[i], 0);
17117ee2fb4SSibi Sankar 		pm_runtime_put(pds[i]);
17217ee2fb4SSibi Sankar 	}
17317ee2fb4SSibi Sankar }
17417ee2fb4SSibi Sankar 
adsp_shutdown_poll_decrypt(struct qcom_adsp * adsp)17586590c30SSibi Sankar static int adsp_shutdown_poll_decrypt(struct qcom_adsp *adsp)
17686590c30SSibi Sankar {
17786590c30SSibi Sankar 	unsigned int retry_num = 50;
17886590c30SSibi Sankar 	int ret;
17986590c30SSibi Sankar 
18086590c30SSibi Sankar 	do {
18186590c30SSibi Sankar 		msleep(ADSP_DECRYPT_SHUTDOWN_DELAY_MS);
18286590c30SSibi Sankar 		ret = qcom_scm_pas_shutdown(adsp->pas_id);
18386590c30SSibi Sankar 	} while (ret == -EINVAL && --retry_num);
18486590c30SSibi Sankar 
18586590c30SSibi Sankar 	return ret;
18686590c30SSibi Sankar }
18786590c30SSibi Sankar 
adsp_unprepare(struct rproc * rproc)18894749156SBjorn Andersson static int adsp_unprepare(struct rproc *rproc)
18994749156SBjorn Andersson {
19086660713SYu Zhe 	struct qcom_adsp *adsp = rproc->priv;
19194749156SBjorn Andersson 
19294749156SBjorn Andersson 	/*
19394749156SBjorn Andersson 	 * adsp_load() did pass pas_metadata to the SCM driver for storing
19494749156SBjorn Andersson 	 * metadata context. It might have been released already if
19594749156SBjorn Andersson 	 * auth_and_reset() was successful, but in other cases clean it up
19694749156SBjorn Andersson 	 * here.
19794749156SBjorn Andersson 	 */
19894749156SBjorn Andersson 	qcom_scm_pas_metadata_release(&adsp->pas_metadata);
19929814986SNeil Armstrong 	if (adsp->dtb_pas_id)
20029814986SNeil Armstrong 		qcom_scm_pas_metadata_release(&adsp->dtb_pas_metadata);
20194749156SBjorn Andersson 
20294749156SBjorn Andersson 	return 0;
20394749156SBjorn Andersson }
20494749156SBjorn Andersson 
adsp_load(struct rproc * rproc,const struct firmware * fw)2059e004f97SBjorn Andersson static int adsp_load(struct rproc *rproc, const struct firmware *fw)
2069e004f97SBjorn Andersson {
20786660713SYu Zhe 	struct qcom_adsp *adsp = rproc->priv;
208d4c78d21SBjorn Andersson 	int ret;
2099e004f97SBjorn Andersson 
21029814986SNeil Armstrong 	/* Store firmware handle to be used in adsp_start() */
21129814986SNeil Armstrong 	adsp->firmware = fw;
21294749156SBjorn Andersson 
21329814986SNeil Armstrong 	if (adsp->dtb_pas_id) {
21429814986SNeil Armstrong 		ret = request_firmware(&adsp->dtb_firmware, adsp->dtb_firmware_name, adsp->dev);
21529814986SNeil Armstrong 		if (ret) {
21629814986SNeil Armstrong 			dev_err(adsp->dev, "request_firmware failed for %s: %d\n",
21729814986SNeil Armstrong 				adsp->dtb_firmware_name, ret);
218d4c78d21SBjorn Andersson 			return ret;
21929814986SNeil Armstrong 		}
2209e004f97SBjorn Andersson 
22129814986SNeil Armstrong 		ret = qcom_mdt_pas_init(adsp->dev, adsp->dtb_firmware, adsp->dtb_firmware_name,
22229814986SNeil Armstrong 					adsp->dtb_pas_id, adsp->dtb_mem_phys,
22329814986SNeil Armstrong 					&adsp->dtb_pas_metadata);
22429814986SNeil Armstrong 		if (ret)
22529814986SNeil Armstrong 			goto release_dtb_firmware;
22629814986SNeil Armstrong 
22729814986SNeil Armstrong 		ret = qcom_mdt_load_no_init(adsp->dev, adsp->dtb_firmware, adsp->dtb_firmware_name,
22829814986SNeil Armstrong 					    adsp->dtb_pas_id, adsp->dtb_mem_region,
22929814986SNeil Armstrong 					    adsp->dtb_mem_phys, adsp->dtb_mem_size,
23029814986SNeil Armstrong 					    &adsp->dtb_mem_reloc);
23129814986SNeil Armstrong 		if (ret)
23229814986SNeil Armstrong 			goto release_dtb_metadata;
23329814986SNeil Armstrong 	}
234d4c78d21SBjorn Andersson 
235d4c78d21SBjorn Andersson 	return 0;
23629814986SNeil Armstrong 
23729814986SNeil Armstrong release_dtb_metadata:
23829814986SNeil Armstrong 	qcom_scm_pas_metadata_release(&adsp->dtb_pas_metadata);
23929814986SNeil Armstrong 
24029814986SNeil Armstrong release_dtb_firmware:
24129814986SNeil Armstrong 	release_firmware(adsp->dtb_firmware);
24229814986SNeil Armstrong 
24329814986SNeil Armstrong 	return ret;
2449e004f97SBjorn Andersson }
2459e004f97SBjorn Andersson 
adsp_start(struct rproc * rproc)2469e004f97SBjorn Andersson static int adsp_start(struct rproc *rproc)
2479e004f97SBjorn Andersson {
24886660713SYu Zhe 	struct qcom_adsp *adsp = rproc->priv;
2499e004f97SBjorn Andersson 	int ret;
2509e004f97SBjorn Andersson 
251c1fe10d2SSibi Sankar 	ret = qcom_q6v5_prepare(&adsp->q6v5);
252c1fe10d2SSibi Sankar 	if (ret)
253c1fe10d2SSibi Sankar 		return ret;
25417ee2fb4SSibi Sankar 
25517ee2fb4SSibi Sankar 	ret = adsp_pds_enable(adsp, adsp->proxy_pds, adsp->proxy_pd_count);
25617ee2fb4SSibi Sankar 	if (ret < 0)
257c1fe10d2SSibi Sankar 		goto disable_irqs;
25817ee2fb4SSibi Sankar 
2599e004f97SBjorn Andersson 	ret = clk_prepare_enable(adsp->xo);
2609e004f97SBjorn Andersson 	if (ret)
26117ee2fb4SSibi Sankar 		goto disable_proxy_pds;
2629e004f97SBjorn Andersson 
2639e004f97SBjorn Andersson 	ret = clk_prepare_enable(adsp->aggre2_clk);
2649e004f97SBjorn Andersson 	if (ret)
2659e004f97SBjorn Andersson 		goto disable_xo_clk;
2669e004f97SBjorn Andersson 
2673f52d118SAbel Vesa 	if (adsp->cx_supply) {
2689e004f97SBjorn Andersson 		ret = regulator_enable(adsp->cx_supply);
2699e004f97SBjorn Andersson 		if (ret)
2709e004f97SBjorn Andersson 			goto disable_aggre2_clk;
2713f52d118SAbel Vesa 	}
2729e004f97SBjorn Andersson 
2733f52d118SAbel Vesa 	if (adsp->px_supply) {
2749e004f97SBjorn Andersson 		ret = regulator_enable(adsp->px_supply);
2759e004f97SBjorn Andersson 		if (ret)
2769e004f97SBjorn Andersson 			goto disable_cx_supply;
2773f52d118SAbel Vesa 	}
2789e004f97SBjorn Andersson 
27929814986SNeil Armstrong 	if (adsp->dtb_pas_id) {
28029814986SNeil Armstrong 		ret = qcom_scm_pas_auth_and_reset(adsp->dtb_pas_id);
28129814986SNeil Armstrong 		if (ret) {
28229814986SNeil Armstrong 			dev_err(adsp->dev,
28329814986SNeil Armstrong 				"failed to authenticate dtb image and release reset\n");
28429814986SNeil Armstrong 			goto disable_px_supply;
28529814986SNeil Armstrong 		}
28629814986SNeil Armstrong 	}
28729814986SNeil Armstrong 
28829814986SNeil Armstrong 	ret = qcom_mdt_pas_init(adsp->dev, adsp->firmware, rproc->firmware, adsp->pas_id,
28929814986SNeil Armstrong 				adsp->mem_phys, &adsp->pas_metadata);
29029814986SNeil Armstrong 	if (ret)
29129814986SNeil Armstrong 		goto disable_px_supply;
29229814986SNeil Armstrong 
29329814986SNeil Armstrong 	ret = qcom_mdt_load_no_init(adsp->dev, adsp->firmware, rproc->firmware, adsp->pas_id,
29429814986SNeil Armstrong 				    adsp->mem_region, adsp->mem_phys, adsp->mem_size,
29529814986SNeil Armstrong 				    &adsp->mem_reloc);
29629814986SNeil Armstrong 	if (ret)
29729814986SNeil Armstrong 		goto release_pas_metadata;
29829814986SNeil Armstrong 
29929814986SNeil Armstrong 	qcom_pil_info_store(adsp->info_name, adsp->mem_phys, adsp->mem_size);
30029814986SNeil Armstrong 
3019e004f97SBjorn Andersson 	ret = qcom_scm_pas_auth_and_reset(adsp->pas_id);
3029e004f97SBjorn Andersson 	if (ret) {
3039e004f97SBjorn Andersson 		dev_err(adsp->dev,
3049e004f97SBjorn Andersson 			"failed to authenticate image and release reset\n");
30529814986SNeil Armstrong 		goto release_pas_metadata;
3069e004f97SBjorn Andersson 	}
3079e004f97SBjorn Andersson 
3089e004f97SBjorn Andersson 	ret = qcom_q6v5_wait_for_start(&adsp->q6v5, msecs_to_jiffies(5000));
3099e004f97SBjorn Andersson 	if (ret == -ETIMEDOUT) {
3109e004f97SBjorn Andersson 		dev_err(adsp->dev, "start timed out\n");
3119e004f97SBjorn Andersson 		qcom_scm_pas_shutdown(adsp->pas_id);
31229814986SNeil Armstrong 		goto release_pas_metadata;
3139e004f97SBjorn Andersson 	}
3149e004f97SBjorn Andersson 
31594749156SBjorn Andersson 	qcom_scm_pas_metadata_release(&adsp->pas_metadata);
31629814986SNeil Armstrong 	if (adsp->dtb_pas_id)
31729814986SNeil Armstrong 		qcom_scm_pas_metadata_release(&adsp->dtb_pas_metadata);
31829814986SNeil Armstrong 
31929814986SNeil Armstrong 	/* Remove pointer to the loaded firmware, only valid in adsp_load() & adsp_start() */
32029814986SNeil Armstrong 	adsp->firmware = NULL;
32194749156SBjorn Andersson 
3229e004f97SBjorn Andersson 	return 0;
3239e004f97SBjorn Andersson 
32429814986SNeil Armstrong release_pas_metadata:
32529814986SNeil Armstrong 	qcom_scm_pas_metadata_release(&adsp->pas_metadata);
32629814986SNeil Armstrong 	if (adsp->dtb_pas_id)
32729814986SNeil Armstrong 		qcom_scm_pas_metadata_release(&adsp->dtb_pas_metadata);
3289e004f97SBjorn Andersson disable_px_supply:
3293f52d118SAbel Vesa 	if (adsp->px_supply)
3309e004f97SBjorn Andersson 		regulator_disable(adsp->px_supply);
3319e004f97SBjorn Andersson disable_cx_supply:
3323f52d118SAbel Vesa 	if (adsp->cx_supply)
3339e004f97SBjorn Andersson 		regulator_disable(adsp->cx_supply);
3349e004f97SBjorn Andersson disable_aggre2_clk:
3359e004f97SBjorn Andersson 	clk_disable_unprepare(adsp->aggre2_clk);
3369e004f97SBjorn Andersson disable_xo_clk:
3379e004f97SBjorn Andersson 	clk_disable_unprepare(adsp->xo);
33817ee2fb4SSibi Sankar disable_proxy_pds:
33917ee2fb4SSibi Sankar 	adsp_pds_disable(adsp, adsp->proxy_pds, adsp->proxy_pd_count);
3402ac91aadSSibi Sankar disable_irqs:
3412ac91aadSSibi Sankar 	qcom_q6v5_unprepare(&adsp->q6v5);
3429e004f97SBjorn Andersson 
34329814986SNeil Armstrong 	/* Remove pointer to the loaded firmware, only valid in adsp_load() & adsp_start() */
34429814986SNeil Armstrong 	adsp->firmware = NULL;
34529814986SNeil Armstrong 
3469e004f97SBjorn Andersson 	return ret;
3479e004f97SBjorn Andersson }
3489e004f97SBjorn Andersson 
qcom_pas_handover(struct qcom_q6v5 * q6v5)3499e004f97SBjorn Andersson static void qcom_pas_handover(struct qcom_q6v5 *q6v5)
3509e004f97SBjorn Andersson {
3519e004f97SBjorn Andersson 	struct qcom_adsp *adsp = container_of(q6v5, struct qcom_adsp, q6v5);
3529e004f97SBjorn Andersson 
3533f52d118SAbel Vesa 	if (adsp->px_supply)
3549e004f97SBjorn Andersson 		regulator_disable(adsp->px_supply);
3553f52d118SAbel Vesa 	if (adsp->cx_supply)
3569e004f97SBjorn Andersson 		regulator_disable(adsp->cx_supply);
3579e004f97SBjorn Andersson 	clk_disable_unprepare(adsp->aggre2_clk);
3589e004f97SBjorn Andersson 	clk_disable_unprepare(adsp->xo);
35917ee2fb4SSibi Sankar 	adsp_pds_disable(adsp, adsp->proxy_pds, adsp->proxy_pd_count);
3609e004f97SBjorn Andersson }
3619e004f97SBjorn Andersson 
adsp_stop(struct rproc * rproc)3629e004f97SBjorn Andersson static int adsp_stop(struct rproc *rproc)
3639e004f97SBjorn Andersson {
36486660713SYu Zhe 	struct qcom_adsp *adsp = rproc->priv;
3659e004f97SBjorn Andersson 	int handover;
3669e004f97SBjorn Andersson 	int ret;
3679e004f97SBjorn Andersson 
368ed5da808SBjorn Andersson 	ret = qcom_q6v5_request_stop(&adsp->q6v5, adsp->sysmon);
3699e004f97SBjorn Andersson 	if (ret == -ETIMEDOUT)
3709e004f97SBjorn Andersson 		dev_err(adsp->dev, "timed out on wait\n");
3719e004f97SBjorn Andersson 
3729e004f97SBjorn Andersson 	ret = qcom_scm_pas_shutdown(adsp->pas_id);
37386590c30SSibi Sankar 	if (ret && adsp->decrypt_shutdown)
37486590c30SSibi Sankar 		ret = adsp_shutdown_poll_decrypt(adsp);
37586590c30SSibi Sankar 
3769e004f97SBjorn Andersson 	if (ret)
3779e004f97SBjorn Andersson 		dev_err(adsp->dev, "failed to shutdown: %d\n", ret);
3789e004f97SBjorn Andersson 
37929814986SNeil Armstrong 	if (adsp->dtb_pas_id) {
38029814986SNeil Armstrong 		ret = qcom_scm_pas_shutdown(adsp->dtb_pas_id);
38129814986SNeil Armstrong 		if (ret)
38229814986SNeil Armstrong 			dev_err(adsp->dev, "failed to shutdown dtb: %d\n", ret);
38329814986SNeil Armstrong 	}
38429814986SNeil Armstrong 
3859e004f97SBjorn Andersson 	handover = qcom_q6v5_unprepare(&adsp->q6v5);
3869e004f97SBjorn Andersson 	if (handover)
3879e004f97SBjorn Andersson 		qcom_pas_handover(&adsp->q6v5);
3889e004f97SBjorn Andersson 
3899e004f97SBjorn Andersson 	return ret;
3909e004f97SBjorn Andersson }
3919e004f97SBjorn Andersson 
adsp_da_to_va(struct rproc * rproc,u64 da,size_t len,bool * is_iomem)39240df0a91SPeng Fan static void *adsp_da_to_va(struct rproc *rproc, u64 da, size_t len, bool *is_iomem)
3939e004f97SBjorn Andersson {
39486660713SYu Zhe 	struct qcom_adsp *adsp = rproc->priv;
3959e004f97SBjorn Andersson 	int offset;
3969e004f97SBjorn Andersson 
3979e004f97SBjorn Andersson 	offset = da - adsp->mem_reloc;
3989e004f97SBjorn Andersson 	if (offset < 0 || offset + len > adsp->mem_size)
3999e004f97SBjorn Andersson 		return NULL;
4009e004f97SBjorn Andersson 
4015ddf5969SSiddharth Gupta 	if (is_iomem)
4025ddf5969SSiddharth Gupta 		*is_iomem = true;
4035ddf5969SSiddharth Gupta 
4049e004f97SBjorn Andersson 	return adsp->mem_region + offset;
4059e004f97SBjorn Andersson }
4069e004f97SBjorn Andersson 
adsp_panic(struct rproc * rproc)407717c21baSBjorn Andersson static unsigned long adsp_panic(struct rproc *rproc)
408717c21baSBjorn Andersson {
40986660713SYu Zhe 	struct qcom_adsp *adsp = rproc->priv;
410717c21baSBjorn Andersson 
411717c21baSBjorn Andersson 	return qcom_q6v5_panic(&adsp->q6v5);
412717c21baSBjorn Andersson }
413717c21baSBjorn Andersson 
4149e004f97SBjorn Andersson static const struct rproc_ops adsp_ops = {
41594749156SBjorn Andersson 	.unprepare = adsp_unprepare,
4169e004f97SBjorn Andersson 	.start = adsp_start,
4179e004f97SBjorn Andersson 	.stop = adsp_stop,
4189e004f97SBjorn Andersson 	.da_to_va = adsp_da_to_va,
4199e004f97SBjorn Andersson 	.parse_fw = qcom_register_dump_segments,
4209e004f97SBjorn Andersson 	.load = adsp_load,
421717c21baSBjorn Andersson 	.panic = adsp_panic,
4229e004f97SBjorn Andersson };
4239e004f97SBjorn Andersson 
4248ed8485cSSiddharth Gupta static const struct rproc_ops adsp_minidump_ops = {
42594749156SBjorn Andersson 	.unprepare = adsp_unprepare,
4268ed8485cSSiddharth Gupta 	.start = adsp_start,
4278ed8485cSSiddharth Gupta 	.stop = adsp_stop,
4288ed8485cSSiddharth Gupta 	.da_to_va = adsp_da_to_va,
4295c43ed8aSSiddharth Gupta 	.parse_fw = qcom_register_dump_segments,
4308ed8485cSSiddharth Gupta 	.load = adsp_load,
4318ed8485cSSiddharth Gupta 	.panic = adsp_panic,
4328ed8485cSSiddharth Gupta 	.coredump = adsp_minidump,
4338ed8485cSSiddharth Gupta };
4348ed8485cSSiddharth Gupta 
adsp_init_clock(struct qcom_adsp * adsp)4359e004f97SBjorn Andersson static int adsp_init_clock(struct qcom_adsp *adsp)
4369e004f97SBjorn Andersson {
4379e004f97SBjorn Andersson 	int ret;
4389e004f97SBjorn Andersson 
4399e004f97SBjorn Andersson 	adsp->xo = devm_clk_get(adsp->dev, "xo");
4409e004f97SBjorn Andersson 	if (IS_ERR(adsp->xo)) {
4419e004f97SBjorn Andersson 		ret = PTR_ERR(adsp->xo);
4429e004f97SBjorn Andersson 		if (ret != -EPROBE_DEFER)
4439e004f97SBjorn Andersson 			dev_err(adsp->dev, "failed to get xo clock");
4449e004f97SBjorn Andersson 		return ret;
4459e004f97SBjorn Andersson 	}
4469e004f97SBjorn Andersson 
4476d967a5aSAbel Vesa 	adsp->aggre2_clk = devm_clk_get_optional(adsp->dev, "aggre2");
4489e004f97SBjorn Andersson 	if (IS_ERR(adsp->aggre2_clk)) {
4499e004f97SBjorn Andersson 		ret = PTR_ERR(adsp->aggre2_clk);
4509e004f97SBjorn Andersson 		if (ret != -EPROBE_DEFER)
4519e004f97SBjorn Andersson 			dev_err(adsp->dev,
4529e004f97SBjorn Andersson 				"failed to get aggre2 clock");
4539e004f97SBjorn Andersson 		return ret;
4549e004f97SBjorn Andersson 	}
4559e004f97SBjorn Andersson 
4569e004f97SBjorn Andersson 	return 0;
4579e004f97SBjorn Andersson }
4589e004f97SBjorn Andersson 
adsp_init_regulator(struct qcom_adsp * adsp)4599e004f97SBjorn Andersson static int adsp_init_regulator(struct qcom_adsp *adsp)
4609e004f97SBjorn Andersson {
4613f52d118SAbel Vesa 	adsp->cx_supply = devm_regulator_get_optional(adsp->dev, "cx");
4628447d0e7SManivannan Sadhasivam 	if (IS_ERR(adsp->cx_supply)) {
4638447d0e7SManivannan Sadhasivam 		if (PTR_ERR(adsp->cx_supply) == -ENODEV)
4648447d0e7SManivannan Sadhasivam 			adsp->cx_supply = NULL;
4658447d0e7SManivannan Sadhasivam 		else
4669e004f97SBjorn Andersson 			return PTR_ERR(adsp->cx_supply);
4678447d0e7SManivannan Sadhasivam 	}
4689e004f97SBjorn Andersson 
4698447d0e7SManivannan Sadhasivam 	if (adsp->cx_supply)
4709e004f97SBjorn Andersson 		regulator_set_load(adsp->cx_supply, 100000);
4719e004f97SBjorn Andersson 
4723f52d118SAbel Vesa 	adsp->px_supply = devm_regulator_get_optional(adsp->dev, "px");
4738447d0e7SManivannan Sadhasivam 	if (IS_ERR(adsp->px_supply)) {
4748447d0e7SManivannan Sadhasivam 		if (PTR_ERR(adsp->px_supply) == -ENODEV)
4758447d0e7SManivannan Sadhasivam 			adsp->px_supply = NULL;
4768447d0e7SManivannan Sadhasivam 		else
4778447d0e7SManivannan Sadhasivam 			return PTR_ERR(adsp->px_supply);
4788447d0e7SManivannan Sadhasivam 	}
4798447d0e7SManivannan Sadhasivam 
4808447d0e7SManivannan Sadhasivam 	return 0;
4819e004f97SBjorn Andersson }
4829e004f97SBjorn Andersson 
adsp_pds_attach(struct device * dev,struct device ** devs,char ** pd_names)48317ee2fb4SSibi Sankar static int adsp_pds_attach(struct device *dev, struct device **devs,
48417ee2fb4SSibi Sankar 			   char **pd_names)
48517ee2fb4SSibi Sankar {
48617ee2fb4SSibi Sankar 	size_t num_pds = 0;
48717ee2fb4SSibi Sankar 	int ret;
48817ee2fb4SSibi Sankar 	int i;
48917ee2fb4SSibi Sankar 
49017ee2fb4SSibi Sankar 	if (!pd_names)
49117ee2fb4SSibi Sankar 		return 0;
49217ee2fb4SSibi Sankar 
49317ee2fb4SSibi Sankar 	/* Handle single power domain */
49417ee2fb4SSibi Sankar 	if (dev->pm_domain) {
49517ee2fb4SSibi Sankar 		devs[0] = dev;
49617ee2fb4SSibi Sankar 		pm_runtime_enable(dev);
49717ee2fb4SSibi Sankar 		return 1;
49817ee2fb4SSibi Sankar 	}
49917ee2fb4SSibi Sankar 
50017ee2fb4SSibi Sankar 	while (pd_names[num_pds])
50117ee2fb4SSibi Sankar 		num_pds++;
50217ee2fb4SSibi Sankar 
50317ee2fb4SSibi Sankar 	for (i = 0; i < num_pds; i++) {
50417ee2fb4SSibi Sankar 		devs[i] = dev_pm_domain_attach_by_name(dev, pd_names[i]);
50517ee2fb4SSibi Sankar 		if (IS_ERR_OR_NULL(devs[i])) {
50617ee2fb4SSibi Sankar 			ret = PTR_ERR(devs[i]) ? : -ENODATA;
50717ee2fb4SSibi Sankar 			goto unroll_attach;
50817ee2fb4SSibi Sankar 		}
50917ee2fb4SSibi Sankar 	}
51017ee2fb4SSibi Sankar 
51117ee2fb4SSibi Sankar 	return num_pds;
51217ee2fb4SSibi Sankar 
51317ee2fb4SSibi Sankar unroll_attach:
51417ee2fb4SSibi Sankar 	for (i--; i >= 0; i--)
51517ee2fb4SSibi Sankar 		dev_pm_domain_detach(devs[i], false);
51617ee2fb4SSibi Sankar 
51717ee2fb4SSibi Sankar 	return ret;
51817ee2fb4SSibi Sankar };
51917ee2fb4SSibi Sankar 
adsp_pds_detach(struct qcom_adsp * adsp,struct device ** pds,size_t pd_count)52017ee2fb4SSibi Sankar static void adsp_pds_detach(struct qcom_adsp *adsp, struct device **pds,
52117ee2fb4SSibi Sankar 			    size_t pd_count)
52217ee2fb4SSibi Sankar {
52317ee2fb4SSibi Sankar 	struct device *dev = adsp->dev;
52417ee2fb4SSibi Sankar 	int i;
52517ee2fb4SSibi Sankar 
52617ee2fb4SSibi Sankar 	/* Handle single power domain */
52717ee2fb4SSibi Sankar 	if (dev->pm_domain && pd_count) {
52817ee2fb4SSibi Sankar 		pm_runtime_disable(dev);
52917ee2fb4SSibi Sankar 		return;
53017ee2fb4SSibi Sankar 	}
53117ee2fb4SSibi Sankar 
53217ee2fb4SSibi Sankar 	for (i = 0; i < pd_count; i++)
53317ee2fb4SSibi Sankar 		dev_pm_domain_detach(pds[i], false);
53417ee2fb4SSibi Sankar }
53517ee2fb4SSibi Sankar 
adsp_alloc_memory_region(struct qcom_adsp * adsp)5369e004f97SBjorn Andersson static int adsp_alloc_memory_region(struct qcom_adsp *adsp)
5379e004f97SBjorn Andersson {
5380ee55c18SStephan Gerhold 	struct reserved_mem *rmem;
5399e004f97SBjorn Andersson 	struct device_node *node;
5409e004f97SBjorn Andersson 
5419e004f97SBjorn Andersson 	node = of_parse_phandle(adsp->dev->of_node, "memory-region", 0);
5429e004f97SBjorn Andersson 	if (!node) {
5439e004f97SBjorn Andersson 		dev_err(adsp->dev, "no memory-region specified\n");
5449e004f97SBjorn Andersson 		return -EINVAL;
5459e004f97SBjorn Andersson 	}
5469e004f97SBjorn Andersson 
5470ee55c18SStephan Gerhold 	rmem = of_reserved_mem_lookup(node);
54838e7d9c1SYuan Can 	of_node_put(node);
5490ee55c18SStephan Gerhold 	if (!rmem) {
5500ee55c18SStephan Gerhold 		dev_err(adsp->dev, "unable to resolve memory-region\n");
5510ee55c18SStephan Gerhold 		return -EINVAL;
5520ee55c18SStephan Gerhold 	}
5539e004f97SBjorn Andersson 
5540ee55c18SStephan Gerhold 	adsp->mem_phys = adsp->mem_reloc = rmem->base;
5550ee55c18SStephan Gerhold 	adsp->mem_size = rmem->size;
5569e004f97SBjorn Andersson 	adsp->mem_region = devm_ioremap_wc(adsp->dev, adsp->mem_phys, adsp->mem_size);
5579e004f97SBjorn Andersson 	if (!adsp->mem_region) {
5589e004f97SBjorn Andersson 		dev_err(adsp->dev, "unable to map memory region: %pa+%zx\n",
5590ee55c18SStephan Gerhold 			&rmem->base, adsp->mem_size);
5609e004f97SBjorn Andersson 		return -EBUSY;
5619e004f97SBjorn Andersson 	}
5629e004f97SBjorn Andersson 
56329814986SNeil Armstrong 	if (!adsp->dtb_pas_id)
56429814986SNeil Armstrong 		return 0;
56529814986SNeil Armstrong 
56629814986SNeil Armstrong 	node = of_parse_phandle(adsp->dev->of_node, "memory-region", 1);
56729814986SNeil Armstrong 	if (!node) {
56829814986SNeil Armstrong 		dev_err(adsp->dev, "no dtb memory-region specified\n");
56929814986SNeil Armstrong 		return -EINVAL;
57029814986SNeil Armstrong 	}
57129814986SNeil Armstrong 
5720ee55c18SStephan Gerhold 	rmem = of_reserved_mem_lookup(node);
5730ee55c18SStephan Gerhold 	of_node_put(node);
5740ee55c18SStephan Gerhold 	if (!rmem) {
5750ee55c18SStephan Gerhold 		dev_err(adsp->dev, "unable to resolve dtb memory-region\n");
5760ee55c18SStephan Gerhold 		return -EINVAL;
5770ee55c18SStephan Gerhold 	}
57829814986SNeil Armstrong 
5790ee55c18SStephan Gerhold 	adsp->dtb_mem_phys = adsp->dtb_mem_reloc = rmem->base;
5800ee55c18SStephan Gerhold 	adsp->dtb_mem_size = rmem->size;
58129814986SNeil Armstrong 	adsp->dtb_mem_region = devm_ioremap_wc(adsp->dev, adsp->dtb_mem_phys, adsp->dtb_mem_size);
58229814986SNeil Armstrong 	if (!adsp->dtb_mem_region) {
58329814986SNeil Armstrong 		dev_err(adsp->dev, "unable to map dtb memory region: %pa+%zx\n",
5840ee55c18SStephan Gerhold 			&rmem->base, adsp->dtb_mem_size);
58529814986SNeil Armstrong 		return -EBUSY;
58629814986SNeil Armstrong 	}
58729814986SNeil Armstrong 
5889e004f97SBjorn Andersson 	return 0;
5899e004f97SBjorn Andersson }
5909e004f97SBjorn Andersson 
adsp_assign_memory_region(struct qcom_adsp * adsp)591c63c0a7cSNeil Armstrong static int adsp_assign_memory_region(struct qcom_adsp *adsp)
592c63c0a7cSNeil Armstrong {
5930ee55c18SStephan Gerhold 	struct reserved_mem *rmem = NULL;
594c63c0a7cSNeil Armstrong 	struct qcom_scm_vmperm perm;
595c63c0a7cSNeil Armstrong 	struct device_node *node;
596c63c0a7cSNeil Armstrong 	int ret;
597c63c0a7cSNeil Armstrong 
598c63c0a7cSNeil Armstrong 	if (!adsp->region_assign_idx)
599c63c0a7cSNeil Armstrong 		return 0;
600c63c0a7cSNeil Armstrong 
601c63c0a7cSNeil Armstrong 	node = of_parse_phandle(adsp->dev->of_node, "memory-region", adsp->region_assign_idx);
6020ee55c18SStephan Gerhold 	if (node)
6030ee55c18SStephan Gerhold 		rmem = of_reserved_mem_lookup(node);
6040ee55c18SStephan Gerhold 	of_node_put(node);
6050ee55c18SStephan Gerhold 	if (!rmem) {
6060ee55c18SStephan Gerhold 		dev_err(adsp->dev, "unable to resolve shareable memory-region\n");
607c63c0a7cSNeil Armstrong 		return -EINVAL;
608c63c0a7cSNeil Armstrong 	}
609c63c0a7cSNeil Armstrong 
610c63c0a7cSNeil Armstrong 	perm.vmid = QCOM_SCM_VMID_MSS_MSA;
611c63c0a7cSNeil Armstrong 	perm.perm = QCOM_SCM_PERM_RW;
612c63c0a7cSNeil Armstrong 
6130ee55c18SStephan Gerhold 	adsp->region_assign_phys = rmem->base;
6140ee55c18SStephan Gerhold 	adsp->region_assign_size = rmem->size;
615c63c0a7cSNeil Armstrong 	adsp->region_assign_perms = BIT(QCOM_SCM_VMID_HLOS);
616c63c0a7cSNeil Armstrong 
617c63c0a7cSNeil Armstrong 	ret = qcom_scm_assign_mem(adsp->region_assign_phys,
618c63c0a7cSNeil Armstrong 				  adsp->region_assign_size,
619c63c0a7cSNeil Armstrong 				  &adsp->region_assign_perms,
620c63c0a7cSNeil Armstrong 				  &perm, 1);
621c63c0a7cSNeil Armstrong 	if (ret < 0) {
622c63c0a7cSNeil Armstrong 		dev_err(adsp->dev, "assign memory failed\n");
623c63c0a7cSNeil Armstrong 		return ret;
624c63c0a7cSNeil Armstrong 	}
625c63c0a7cSNeil Armstrong 
626c63c0a7cSNeil Armstrong 	return 0;
627c63c0a7cSNeil Armstrong }
628c63c0a7cSNeil Armstrong 
adsp_unassign_memory_region(struct qcom_adsp * adsp)629c63c0a7cSNeil Armstrong static void adsp_unassign_memory_region(struct qcom_adsp *adsp)
630c63c0a7cSNeil Armstrong {
631c63c0a7cSNeil Armstrong 	struct qcom_scm_vmperm perm;
632c63c0a7cSNeil Armstrong 	int ret;
633c63c0a7cSNeil Armstrong 
634c63c0a7cSNeil Armstrong 	if (!adsp->region_assign_idx)
635c63c0a7cSNeil Armstrong 		return;
636c63c0a7cSNeil Armstrong 
637c63c0a7cSNeil Armstrong 	perm.vmid = QCOM_SCM_VMID_HLOS;
638c63c0a7cSNeil Armstrong 	perm.perm = QCOM_SCM_PERM_RW;
639c63c0a7cSNeil Armstrong 
640c63c0a7cSNeil Armstrong 	ret = qcom_scm_assign_mem(adsp->region_assign_phys,
641c63c0a7cSNeil Armstrong 				  adsp->region_assign_size,
642c63c0a7cSNeil Armstrong 				  &adsp->region_assign_perms,
643c63c0a7cSNeil Armstrong 				  &perm, 1);
644c63c0a7cSNeil Armstrong 	if (ret < 0)
645c63c0a7cSNeil Armstrong 		dev_err(adsp->dev, "unassign memory failed\n");
646c63c0a7cSNeil Armstrong }
647c63c0a7cSNeil Armstrong 
adsp_probe(struct platform_device * pdev)6489e004f97SBjorn Andersson static int adsp_probe(struct platform_device *pdev)
6499e004f97SBjorn Andersson {
6509e004f97SBjorn Andersson 	const struct adsp_data *desc;
6519e004f97SBjorn Andersson 	struct qcom_adsp *adsp;
6529e004f97SBjorn Andersson 	struct rproc *rproc;
65329814986SNeil Armstrong 	const char *fw_name, *dtb_fw_name = NULL;
6548ed8485cSSiddharth Gupta 	const struct rproc_ops *ops = &adsp_ops;
6559e004f97SBjorn Andersson 	int ret;
6569e004f97SBjorn Andersson 
6579e004f97SBjorn Andersson 	desc = of_device_get_match_data(&pdev->dev);
6589e004f97SBjorn Andersson 	if (!desc)
6599e004f97SBjorn Andersson 		return -EINVAL;
6609e004f97SBjorn Andersson 
6619e004f97SBjorn Andersson 	if (!qcom_scm_is_available())
6629e004f97SBjorn Andersson 		return -EPROBE_DEFER;
6639e004f97SBjorn Andersson 
664a5a4e02dSSibi Sankar 	fw_name = desc->firmware_name;
665a5a4e02dSSibi Sankar 	ret = of_property_read_string(pdev->dev.of_node, "firmware-name",
666a5a4e02dSSibi Sankar 				      &fw_name);
667a5a4e02dSSibi Sankar 	if (ret < 0 && ret != -EINVAL)
668a5a4e02dSSibi Sankar 		return ret;
669a5a4e02dSSibi Sankar 
67029814986SNeil Armstrong 	if (desc->dtb_firmware_name) {
67129814986SNeil Armstrong 		dtb_fw_name = desc->dtb_firmware_name;
67229814986SNeil Armstrong 		ret = of_property_read_string_index(pdev->dev.of_node, "firmware-name", 1,
67329814986SNeil Armstrong 						    &dtb_fw_name);
67429814986SNeil Armstrong 		if (ret < 0 && ret != -EINVAL)
67529814986SNeil Armstrong 			return ret;
67629814986SNeil Armstrong 	}
67729814986SNeil Armstrong 
6788ed8485cSSiddharth Gupta 	if (desc->minidump_id)
6798ed8485cSSiddharth Gupta 		ops = &adsp_minidump_ops;
6808ed8485cSSiddharth Gupta 
6818ed8485cSSiddharth Gupta 	rproc = rproc_alloc(&pdev->dev, pdev->name, ops, fw_name, sizeof(*adsp));
6828ed8485cSSiddharth Gupta 
6839e004f97SBjorn Andersson 	if (!rproc) {
6849e004f97SBjorn Andersson 		dev_err(&pdev->dev, "unable to allocate remoteproc\n");
6859e004f97SBjorn Andersson 		return -ENOMEM;
6869e004f97SBjorn Andersson 	}
6879e004f97SBjorn Andersson 
688b7ff96ccSSibi Sankar 	rproc->auto_boot = desc->auto_boot;
6893898fc99SClement Leger 	rproc_coredump_set_elf_info(rproc, ELFCLASS32, EM_NONE);
690b7ff96ccSSibi Sankar 
69186660713SYu Zhe 	adsp = rproc->priv;
6929e004f97SBjorn Andersson 	adsp->dev = &pdev->dev;
6939e004f97SBjorn Andersson 	adsp->rproc = rproc;
6948ed8485cSSiddharth Gupta 	adsp->minidump_id = desc->minidump_id;
6959e004f97SBjorn Andersson 	adsp->pas_id = desc->pas_id;
696d4c78d21SBjorn Andersson 	adsp->info_name = desc->sysmon_name;
69786590c30SSibi Sankar 	adsp->decrypt_shutdown = desc->decrypt_shutdown;
698c63c0a7cSNeil Armstrong 	adsp->region_assign_idx = desc->region_assign_idx;
69929814986SNeil Armstrong 	if (dtb_fw_name) {
70029814986SNeil Armstrong 		adsp->dtb_firmware_name = dtb_fw_name;
70129814986SNeil Armstrong 		adsp->dtb_pas_id = desc->dtb_pas_id;
70229814986SNeil Armstrong 	}
7039e004f97SBjorn Andersson 	platform_set_drvdata(pdev, adsp);
7049e004f97SBjorn Andersson 
705dc86c129SSiddharth Gupta 	ret = device_init_wakeup(adsp->dev, true);
706dc86c129SSiddharth Gupta 	if (ret)
707dc86c129SSiddharth Gupta 		goto free_rproc;
708a781e5aaSRishabh Bhatnagar 
7099e004f97SBjorn Andersson 	ret = adsp_alloc_memory_region(adsp);
7109e004f97SBjorn Andersson 	if (ret)
7119e004f97SBjorn Andersson 		goto free_rproc;
7129e004f97SBjorn Andersson 
713c63c0a7cSNeil Armstrong 	ret = adsp_assign_memory_region(adsp);
714c63c0a7cSNeil Armstrong 	if (ret)
715c63c0a7cSNeil Armstrong 		goto free_rproc;
716c63c0a7cSNeil Armstrong 
7179e004f97SBjorn Andersson 	ret = adsp_init_clock(adsp);
7189e004f97SBjorn Andersson 	if (ret)
7199e004f97SBjorn Andersson 		goto free_rproc;
7209e004f97SBjorn Andersson 
7219e004f97SBjorn Andersson 	ret = adsp_init_regulator(adsp);
7229e004f97SBjorn Andersson 	if (ret)
7239e004f97SBjorn Andersson 		goto free_rproc;
7249e004f97SBjorn Andersson 
72517ee2fb4SSibi Sankar 	ret = adsp_pds_attach(&pdev->dev, adsp->proxy_pds,
72617ee2fb4SSibi Sankar 			      desc->proxy_pd_names);
72717ee2fb4SSibi Sankar 	if (ret < 0)
728c1fe10d2SSibi Sankar 		goto free_rproc;
72917ee2fb4SSibi Sankar 	adsp->proxy_pd_count = ret;
73017ee2fb4SSibi Sankar 
731c1fe10d2SSibi Sankar 	ret = qcom_q6v5_init(&adsp->q6v5, pdev, rproc, desc->crash_reason_smem, desc->load_state,
7329e004f97SBjorn Andersson 			     qcom_pas_handover);
7339e004f97SBjorn Andersson 	if (ret)
73417ee2fb4SSibi Sankar 		goto detach_proxy_pds;
7359e004f97SBjorn Andersson 
736cd9fc8f1SBjorn Andersson 	qcom_add_glink_subdev(rproc, &adsp->glink_subdev, desc->ssr_name);
7379e004f97SBjorn Andersson 	qcom_add_smd_subdev(rproc, &adsp->smd_subdev);
7389e004f97SBjorn Andersson 	adsp->sysmon = qcom_add_sysmon_subdev(rproc,
7399e004f97SBjorn Andersson 					      desc->sysmon_name,
7409e004f97SBjorn Andersson 					      desc->ssctl_id);
741027045a6SSibi Sankar 	if (IS_ERR(adsp->sysmon)) {
742027045a6SSibi Sankar 		ret = PTR_ERR(adsp->sysmon);
74317ee2fb4SSibi Sankar 		goto detach_proxy_pds;
744027045a6SSibi Sankar 	}
7459e004f97SBjorn Andersson 
746cf5865e7SMukesh Ojha 	qcom_add_ssr_subdev(rproc, &adsp->ssr_subdev, desc->ssr_name);
7479e004f97SBjorn Andersson 	ret = rproc_add(rproc);
7489e004f97SBjorn Andersson 	if (ret)
74917ee2fb4SSibi Sankar 		goto detach_proxy_pds;
7509e004f97SBjorn Andersson 
7519e004f97SBjorn Andersson 	return 0;
7529e004f97SBjorn Andersson 
75317ee2fb4SSibi Sankar detach_proxy_pds:
75417ee2fb4SSibi Sankar 	adsp_pds_detach(adsp, adsp->proxy_pds, adsp->proxy_pd_count);
7559e004f97SBjorn Andersson free_rproc:
7569a705519SLuca Weiss 	device_init_wakeup(adsp->dev, false);
7579e004f97SBjorn Andersson 	rproc_free(rproc);
7589e004f97SBjorn Andersson 
7599e004f97SBjorn Andersson 	return ret;
7609e004f97SBjorn Andersson }
7619e004f97SBjorn Andersson 
adsp_remove(struct platform_device * pdev)76257c05a6fSUwe Kleine-König static void adsp_remove(struct platform_device *pdev)
7639e004f97SBjorn Andersson {
7649e004f97SBjorn Andersson 	struct qcom_adsp *adsp = platform_get_drvdata(pdev);
7659e004f97SBjorn Andersson 
7669e004f97SBjorn Andersson 	rproc_del(adsp->rproc);
7679e004f97SBjorn Andersson 
768c1fe10d2SSibi Sankar 	qcom_q6v5_deinit(&adsp->q6v5);
769c63c0a7cSNeil Armstrong 	adsp_unassign_memory_region(adsp);
7709e004f97SBjorn Andersson 	qcom_remove_glink_subdev(adsp->rproc, &adsp->glink_subdev);
7719e004f97SBjorn Andersson 	qcom_remove_sysmon_subdev(adsp->sysmon);
7729e004f97SBjorn Andersson 	qcom_remove_smd_subdev(adsp->rproc, &adsp->smd_subdev);
7739e004f97SBjorn Andersson 	qcom_remove_ssr_subdev(adsp->rproc, &adsp->ssr_subdev);
77434d01df0SLuca Weiss 	adsp_pds_detach(adsp, adsp->proxy_pds, adsp->proxy_pd_count);
7759a705519SLuca Weiss 	device_init_wakeup(adsp->dev, false);
7769e004f97SBjorn Andersson 	rproc_free(adsp->rproc);
7779e004f97SBjorn Andersson }
7789e004f97SBjorn Andersson 
7799e004f97SBjorn Andersson static const struct adsp_data adsp_resource_init = {
7809e004f97SBjorn Andersson 		.crash_reason_smem = 423,
7819e004f97SBjorn Andersson 		.firmware_name = "adsp.mdt",
7829e004f97SBjorn Andersson 		.pas_id = 1,
783b7ff96ccSSibi Sankar 		.auto_boot = true,
7849e004f97SBjorn Andersson 		.ssr_name = "lpass",
7859e004f97SBjorn Andersson 		.sysmon_name = "adsp",
7869e004f97SBjorn Andersson 		.ssctl_id = 0x14,
7879e004f97SBjorn Andersson };
7889e004f97SBjorn Andersson 
789b506a0c4STengfei Fan static const struct adsp_data sa8775p_adsp_resource = {
790b506a0c4STengfei Fan 	.crash_reason_smem = 423,
791b506a0c4STengfei Fan 	.firmware_name = "adsp.mbn",
792b506a0c4STengfei Fan 	.pas_id = 1,
793b506a0c4STengfei Fan 	.minidump_id = 5,
794b506a0c4STengfei Fan 	.auto_boot = true,
795b506a0c4STengfei Fan 	.proxy_pd_names = (char*[]){
796b506a0c4STengfei Fan 		"lcx",
797b506a0c4STengfei Fan 		"lmx",
798b506a0c4STengfei Fan 		NULL
799b506a0c4STengfei Fan 	},
800b506a0c4STengfei Fan 	.load_state = "adsp",
801b506a0c4STengfei Fan 	.ssr_name = "lpass",
802b506a0c4STengfei Fan 	.sysmon_name = "adsp",
803b506a0c4STengfei Fan 	.ssctl_id = 0x14,
804b506a0c4STengfei Fan };
805b506a0c4STengfei Fan 
806c1fe10d2SSibi Sankar static const struct adsp_data sdm845_adsp_resource_init = {
807c1fe10d2SSibi Sankar 		.crash_reason_smem = 423,
808c1fe10d2SSibi Sankar 		.firmware_name = "adsp.mdt",
809c1fe10d2SSibi Sankar 		.pas_id = 1,
810c1fe10d2SSibi Sankar 		.auto_boot = true,
811c1fe10d2SSibi Sankar 		.load_state = "adsp",
812c1fe10d2SSibi Sankar 		.ssr_name = "lpass",
813c1fe10d2SSibi Sankar 		.sysmon_name = "adsp",
814c1fe10d2SSibi Sankar 		.ssctl_id = 0x14,
815c1fe10d2SSibi Sankar };
816c1fe10d2SSibi Sankar 
817bfd75aefSLuca Weiss static const struct adsp_data sm6350_adsp_resource = {
818bfd75aefSLuca Weiss 	.crash_reason_smem = 423,
819bfd75aefSLuca Weiss 	.firmware_name = "adsp.mdt",
820bfd75aefSLuca Weiss 	.pas_id = 1,
821bfd75aefSLuca Weiss 	.auto_boot = true,
822bfd75aefSLuca Weiss 	.proxy_pd_names = (char*[]){
823bfd75aefSLuca Weiss 		"lcx",
824bfd75aefSLuca Weiss 		"lmx",
825bfd75aefSLuca Weiss 		NULL
826bfd75aefSLuca Weiss 	},
827bfd75aefSLuca Weiss 	.load_state = "adsp",
828bfd75aefSLuca Weiss 	.ssr_name = "lpass",
829bfd75aefSLuca Weiss 	.sysmon_name = "adsp",
830bfd75aefSLuca Weiss 	.ssctl_id = 0x14,
831bfd75aefSLuca Weiss };
832bfd75aefSLuca Weiss 
83315f4ae1eSSibi Sankar static const struct adsp_data sm8150_adsp_resource = {
83415f4ae1eSSibi Sankar 		.crash_reason_smem = 423,
83515f4ae1eSSibi Sankar 		.firmware_name = "adsp.mdt",
83615f4ae1eSSibi Sankar 		.pas_id = 1,
837b7ff96ccSSibi Sankar 		.auto_boot = true,
83815f4ae1eSSibi Sankar 		.proxy_pd_names = (char*[]){
83915f4ae1eSSibi Sankar 			"cx",
84015f4ae1eSSibi Sankar 			NULL
84115f4ae1eSSibi Sankar 		},
842c1fe10d2SSibi Sankar 		.load_state = "adsp",
84315f4ae1eSSibi Sankar 		.ssr_name = "lpass",
84415f4ae1eSSibi Sankar 		.sysmon_name = "adsp",
84515f4ae1eSSibi Sankar 		.ssctl_id = 0x14,
84615f4ae1eSSibi Sankar };
84715f4ae1eSSibi Sankar 
848f6da4831SBjorn Andersson static const struct adsp_data sm8250_adsp_resource = {
849f6da4831SBjorn Andersson 	.crash_reason_smem = 423,
850f6da4831SBjorn Andersson 	.firmware_name = "adsp.mdt",
851f6da4831SBjorn Andersson 	.pas_id = 1,
852c437af60SDmitry Baryshkov 	.minidump_id = 5,
853f6da4831SBjorn Andersson 	.auto_boot = true,
854f6da4831SBjorn Andersson 	.proxy_pd_names = (char*[]){
855f6da4831SBjorn Andersson 		"lcx",
856f6da4831SBjorn Andersson 		"lmx",
857f6da4831SBjorn Andersson 		NULL
858f6da4831SBjorn Andersson 	},
859c1fe10d2SSibi Sankar 	.load_state = "adsp",
860f6da4831SBjorn Andersson 	.ssr_name = "lpass",
861f6da4831SBjorn Andersson 	.sysmon_name = "adsp",
862f6da4831SBjorn Andersson 	.ssctl_id = 0x14,
863f6da4831SBjorn Andersson };
864f6da4831SBjorn Andersson 
865e8b4e9a2SVinod Koul static const struct adsp_data sm8350_adsp_resource = {
866e8b4e9a2SVinod Koul 	.crash_reason_smem = 423,
867e8b4e9a2SVinod Koul 	.firmware_name = "adsp.mdt",
868e8b4e9a2SVinod Koul 	.pas_id = 1,
869e8b4e9a2SVinod Koul 	.auto_boot = true,
870e8b4e9a2SVinod Koul 	.proxy_pd_names = (char*[]){
871e8b4e9a2SVinod Koul 		"lcx",
872e8b4e9a2SVinod Koul 		"lmx",
873e8b4e9a2SVinod Koul 		NULL
874e8b4e9a2SVinod Koul 	},
875c1fe10d2SSibi Sankar 	.load_state = "adsp",
876e8b4e9a2SVinod Koul 	.ssr_name = "lpass",
877e8b4e9a2SVinod Koul 	.sysmon_name = "adsp",
878e8b4e9a2SVinod Koul 	.ssctl_id = 0x14,
879e8b4e9a2SVinod Koul };
880e8b4e9a2SVinod Koul 
8819ae45035SYassine Oudjana static const struct adsp_data msm8996_adsp_resource = {
8827c77e317SSibi Sankar 		.crash_reason_smem = 423,
8837c77e317SSibi Sankar 		.firmware_name = "adsp.mdt",
8847c77e317SSibi Sankar 		.pas_id = 1,
8857c77e317SSibi Sankar 		.auto_boot = true,
8867c77e317SSibi Sankar 		.proxy_pd_names = (char*[]){
8877c77e317SSibi Sankar 			"cx",
8887c77e317SSibi Sankar 			NULL
8897c77e317SSibi Sankar 		},
8907c77e317SSibi Sankar 		.ssr_name = "lpass",
8917c77e317SSibi Sankar 		.sysmon_name = "adsp",
8927c77e317SSibi Sankar 		.ssctl_id = 0x14,
8937c77e317SSibi Sankar };
8947c77e317SSibi Sankar 
8959e004f97SBjorn Andersson static const struct adsp_data cdsp_resource_init = {
8969e004f97SBjorn Andersson 	.crash_reason_smem = 601,
8979e004f97SBjorn Andersson 	.firmware_name = "cdsp.mdt",
8989e004f97SBjorn Andersson 	.pas_id = 18,
899b7ff96ccSSibi Sankar 	.auto_boot = true,
9009e004f97SBjorn Andersson 	.ssr_name = "cdsp",
9019e004f97SBjorn Andersson 	.sysmon_name = "cdsp",
9029e004f97SBjorn Andersson 	.ssctl_id = 0x17,
9039e004f97SBjorn Andersson };
9049e004f97SBjorn Andersson 
905b506a0c4STengfei Fan static const struct adsp_data sa8775p_cdsp0_resource = {
906b506a0c4STengfei Fan 	.crash_reason_smem = 601,
907b506a0c4STengfei Fan 	.firmware_name = "cdsp0.mbn",
908b506a0c4STengfei Fan 	.pas_id = 18,
909b506a0c4STengfei Fan 	.minidump_id = 7,
910b506a0c4STengfei Fan 	.auto_boot = true,
911b506a0c4STengfei Fan 	.proxy_pd_names = (char*[]){
912b506a0c4STengfei Fan 		"cx",
913b506a0c4STengfei Fan 		"mxc",
914b506a0c4STengfei Fan 		"nsp",
915b506a0c4STengfei Fan 		NULL
916b506a0c4STengfei Fan 	},
917b506a0c4STengfei Fan 	.load_state = "cdsp",
918b506a0c4STengfei Fan 	.ssr_name = "cdsp",
919b506a0c4STengfei Fan 	.sysmon_name = "cdsp",
920b506a0c4STengfei Fan 	.ssctl_id = 0x17,
921b506a0c4STengfei Fan };
922b506a0c4STengfei Fan 
923b506a0c4STengfei Fan static const struct adsp_data sa8775p_cdsp1_resource = {
924b506a0c4STengfei Fan 	.crash_reason_smem = 633,
925b506a0c4STengfei Fan 	.firmware_name = "cdsp1.mbn",
926b506a0c4STengfei Fan 	.pas_id = 30,
927b506a0c4STengfei Fan 	.minidump_id = 20,
928b506a0c4STengfei Fan 	.auto_boot = true,
929b506a0c4STengfei Fan 	.proxy_pd_names = (char*[]){
930b506a0c4STengfei Fan 		"cx",
931b506a0c4STengfei Fan 		"mxc",
932b506a0c4STengfei Fan 		"nsp",
933b506a0c4STengfei Fan 		NULL
934b506a0c4STengfei Fan 	},
935b506a0c4STengfei Fan 	.load_state = "nsp",
936b506a0c4STengfei Fan 	.ssr_name = "cdsp1",
937b506a0c4STengfei Fan 	.sysmon_name = "cdsp1",
938b506a0c4STengfei Fan 	.ssctl_id = 0x20,
939b506a0c4STengfei Fan };
940b506a0c4STengfei Fan 
941c1fe10d2SSibi Sankar static const struct adsp_data sdm845_cdsp_resource_init = {
942c1fe10d2SSibi Sankar 	.crash_reason_smem = 601,
943c1fe10d2SSibi Sankar 	.firmware_name = "cdsp.mdt",
944c1fe10d2SSibi Sankar 	.pas_id = 18,
945c1fe10d2SSibi Sankar 	.auto_boot = true,
946c1fe10d2SSibi Sankar 	.load_state = "cdsp",
947c1fe10d2SSibi Sankar 	.ssr_name = "cdsp",
948c1fe10d2SSibi Sankar 	.sysmon_name = "cdsp",
949c1fe10d2SSibi Sankar 	.ssctl_id = 0x17,
950c1fe10d2SSibi Sankar };
951c1fe10d2SSibi Sankar 
9523bc0d1f9SLuca Weiss static const struct adsp_data sm6350_cdsp_resource = {
9533bc0d1f9SLuca Weiss 	.crash_reason_smem = 601,
9543bc0d1f9SLuca Weiss 	.firmware_name = "cdsp.mdt",
9553bc0d1f9SLuca Weiss 	.pas_id = 18,
9563bc0d1f9SLuca Weiss 	.auto_boot = true,
9573bc0d1f9SLuca Weiss 	.proxy_pd_names = (char*[]){
9583bc0d1f9SLuca Weiss 		"cx",
9593bc0d1f9SLuca Weiss 		"mx",
9603bc0d1f9SLuca Weiss 		NULL
9613bc0d1f9SLuca Weiss 	},
9623bc0d1f9SLuca Weiss 	.load_state = "cdsp",
9633bc0d1f9SLuca Weiss 	.ssr_name = "cdsp",
9643bc0d1f9SLuca Weiss 	.sysmon_name = "cdsp",
9653bc0d1f9SLuca Weiss 	.ssctl_id = 0x17,
9663bc0d1f9SLuca Weiss };
9673bc0d1f9SLuca Weiss 
96815f4ae1eSSibi Sankar static const struct adsp_data sm8150_cdsp_resource = {
96915f4ae1eSSibi Sankar 	.crash_reason_smem = 601,
97015f4ae1eSSibi Sankar 	.firmware_name = "cdsp.mdt",
97115f4ae1eSSibi Sankar 	.pas_id = 18,
972b7ff96ccSSibi Sankar 	.auto_boot = true,
97315f4ae1eSSibi Sankar 	.proxy_pd_names = (char*[]){
97415f4ae1eSSibi Sankar 		"cx",
97515f4ae1eSSibi Sankar 		NULL
97615f4ae1eSSibi Sankar 	},
977c1fe10d2SSibi Sankar 	.load_state = "cdsp",
97815f4ae1eSSibi Sankar 	.ssr_name = "cdsp",
97915f4ae1eSSibi Sankar 	.sysmon_name = "cdsp",
98015f4ae1eSSibi Sankar 	.ssctl_id = 0x17,
98115f4ae1eSSibi Sankar };
98215f4ae1eSSibi Sankar 
983f6da4831SBjorn Andersson static const struct adsp_data sm8250_cdsp_resource = {
984f6da4831SBjorn Andersson 	.crash_reason_smem = 601,
985f6da4831SBjorn Andersson 	.firmware_name = "cdsp.mdt",
986f6da4831SBjorn Andersson 	.pas_id = 18,
987f6da4831SBjorn Andersson 	.auto_boot = true,
988f6da4831SBjorn Andersson 	.proxy_pd_names = (char*[]){
989f6da4831SBjorn Andersson 		"cx",
990f6da4831SBjorn Andersson 		NULL
991f6da4831SBjorn Andersson 	},
992c1fe10d2SSibi Sankar 	.load_state = "cdsp",
993f6da4831SBjorn Andersson 	.ssr_name = "cdsp",
994f6da4831SBjorn Andersson 	.sysmon_name = "cdsp",
995f6da4831SBjorn Andersson 	.ssctl_id = 0x17,
996f6da4831SBjorn Andersson };
997f6da4831SBjorn Andersson 
9984e55a6cfSBjorn Andersson static const struct adsp_data sc8280xp_nsp0_resource = {
9994e55a6cfSBjorn Andersson 	.crash_reason_smem = 601,
10004e55a6cfSBjorn Andersson 	.firmware_name = "cdsp.mdt",
10014e55a6cfSBjorn Andersson 	.pas_id = 18,
10024e55a6cfSBjorn Andersson 	.auto_boot = true,
10034e55a6cfSBjorn Andersson 	.proxy_pd_names = (char*[]){
10044e55a6cfSBjorn Andersson 		"nsp",
10054e55a6cfSBjorn Andersson 		NULL
10064e55a6cfSBjorn Andersson 	},
10074e55a6cfSBjorn Andersson 	.ssr_name = "cdsp0",
10084e55a6cfSBjorn Andersson 	.sysmon_name = "cdsp",
10094e55a6cfSBjorn Andersson 	.ssctl_id = 0x17,
10104e55a6cfSBjorn Andersson };
10114e55a6cfSBjorn Andersson 
10124e55a6cfSBjorn Andersson static const struct adsp_data sc8280xp_nsp1_resource = {
10134e55a6cfSBjorn Andersson 	.crash_reason_smem = 633,
10144e55a6cfSBjorn Andersson 	.firmware_name = "cdsp.mdt",
10154e55a6cfSBjorn Andersson 	.pas_id = 30,
10164e55a6cfSBjorn Andersson 	.auto_boot = true,
10174e55a6cfSBjorn Andersson 	.proxy_pd_names = (char*[]){
10184e55a6cfSBjorn Andersson 		"nsp",
10194e55a6cfSBjorn Andersson 		NULL
10204e55a6cfSBjorn Andersson 	},
10214e55a6cfSBjorn Andersson 	.ssr_name = "cdsp1",
10224e55a6cfSBjorn Andersson 	.sysmon_name = "cdsp1",
10234e55a6cfSBjorn Andersson 	.ssctl_id = 0x20,
10244e55a6cfSBjorn Andersson };
10254e55a6cfSBjorn Andersson 
1026e8b4e9a2SVinod Koul static const struct adsp_data sm8350_cdsp_resource = {
1027e8b4e9a2SVinod Koul 	.crash_reason_smem = 601,
1028e8b4e9a2SVinod Koul 	.firmware_name = "cdsp.mdt",
1029e8b4e9a2SVinod Koul 	.pas_id = 18,
1030c437af60SDmitry Baryshkov 	.minidump_id = 7,
1031e8b4e9a2SVinod Koul 	.auto_boot = true,
1032e8b4e9a2SVinod Koul 	.proxy_pd_names = (char*[]){
1033e8b4e9a2SVinod Koul 		"cx",
1034dd585d9bSSibi Sankar 		"mxc",
1035e8b4e9a2SVinod Koul 		NULL
1036e8b4e9a2SVinod Koul 	},
1037c1fe10d2SSibi Sankar 	.load_state = "cdsp",
1038e8b4e9a2SVinod Koul 	.ssr_name = "cdsp",
1039e8b4e9a2SVinod Koul 	.sysmon_name = "cdsp",
1040e8b4e9a2SVinod Koul 	.ssctl_id = 0x17,
1041e8b4e9a2SVinod Koul };
1042e8b4e9a2SVinod Koul 
1043b506a0c4STengfei Fan static const struct adsp_data sa8775p_gpdsp0_resource = {
1044b506a0c4STengfei Fan 	.crash_reason_smem = 640,
1045b506a0c4STengfei Fan 	.firmware_name = "gpdsp0.mbn",
1046b506a0c4STengfei Fan 	.pas_id = 39,
1047b506a0c4STengfei Fan 	.minidump_id = 21,
1048b506a0c4STengfei Fan 	.auto_boot = true,
1049b506a0c4STengfei Fan 	.proxy_pd_names = (char*[]){
1050b506a0c4STengfei Fan 		"cx",
1051b506a0c4STengfei Fan 		"mxc",
1052b506a0c4STengfei Fan 		NULL
1053b506a0c4STengfei Fan 	},
1054b506a0c4STengfei Fan 	.load_state = "gpdsp0",
1055b506a0c4STengfei Fan 	.ssr_name = "gpdsp0",
1056b506a0c4STengfei Fan 	.sysmon_name = "gpdsp0",
1057b506a0c4STengfei Fan 	.ssctl_id = 0x21,
1058b506a0c4STengfei Fan };
1059b506a0c4STengfei Fan 
1060b506a0c4STengfei Fan static const struct adsp_data sa8775p_gpdsp1_resource = {
1061b506a0c4STengfei Fan 	.crash_reason_smem = 641,
1062b506a0c4STengfei Fan 	.firmware_name = "gpdsp1.mbn",
1063b506a0c4STengfei Fan 	.pas_id = 40,
1064b506a0c4STengfei Fan 	.minidump_id = 22,
1065b506a0c4STengfei Fan 	.auto_boot = true,
1066b506a0c4STengfei Fan 	.proxy_pd_names = (char*[]){
1067b506a0c4STengfei Fan 		"cx",
1068b506a0c4STengfei Fan 		"mxc",
1069b506a0c4STengfei Fan 		NULL
1070b506a0c4STengfei Fan 	},
1071b506a0c4STengfei Fan 	.load_state = "gpdsp1",
1072b506a0c4STengfei Fan 	.ssr_name = "gpdsp1",
1073b506a0c4STengfei Fan 	.sysmon_name = "gpdsp1",
1074b506a0c4STengfei Fan 	.ssctl_id = 0x22,
1075b506a0c4STengfei Fan };
1076b506a0c4STengfei Fan 
107715f4ae1eSSibi Sankar static const struct adsp_data mpss_resource_init = {
107815f4ae1eSSibi Sankar 	.crash_reason_smem = 421,
107915f4ae1eSSibi Sankar 	.firmware_name = "modem.mdt",
108015f4ae1eSSibi Sankar 	.pas_id = 4,
1081d2debca4SSiddharth Gupta 	.minidump_id = 3,
1082b7ff96ccSSibi Sankar 	.auto_boot = false,
108315f4ae1eSSibi Sankar 	.proxy_pd_names = (char*[]){
108415f4ae1eSSibi Sankar 		"cx",
108515f4ae1eSSibi Sankar 		"mss",
108615f4ae1eSSibi Sankar 		NULL
108715f4ae1eSSibi Sankar 	},
1088c1fe10d2SSibi Sankar 	.load_state = "modem",
108915f4ae1eSSibi Sankar 	.ssr_name = "mpss",
109015f4ae1eSSibi Sankar 	.sysmon_name = "modem",
109115f4ae1eSSibi Sankar 	.ssctl_id = 0x12,
109215f4ae1eSSibi Sankar };
109315f4ae1eSSibi Sankar 
1094aef6a521SBjorn Andersson static const struct adsp_data sc8180x_mpss_resource = {
1095aef6a521SBjorn Andersson 	.crash_reason_smem = 421,
1096aef6a521SBjorn Andersson 	.firmware_name = "modem.mdt",
1097aef6a521SBjorn Andersson 	.pas_id = 4,
1098aef6a521SBjorn Andersson 	.auto_boot = false,
1099aef6a521SBjorn Andersson 	.proxy_pd_names = (char*[]){
1100aef6a521SBjorn Andersson 		"cx",
1101aef6a521SBjorn Andersson 		NULL
1102aef6a521SBjorn Andersson 	},
1103c1fe10d2SSibi Sankar 	.load_state = "modem",
1104aef6a521SBjorn Andersson 	.ssr_name = "mpss",
1105aef6a521SBjorn Andersson 	.sysmon_name = "modem",
1106aef6a521SBjorn Andersson 	.ssctl_id = 0x12,
1107aef6a521SBjorn Andersson };
1108aef6a521SBjorn Andersson 
1109637e98bfSDylan Van Assche static const struct adsp_data msm8996_slpi_resource_init = {
11109e004f97SBjorn Andersson 		.crash_reason_smem = 424,
11119e004f97SBjorn Andersson 		.firmware_name = "slpi.mdt",
11129e004f97SBjorn Andersson 		.pas_id = 12,
1113b7ff96ccSSibi Sankar 		.auto_boot = true,
11149ae45035SYassine Oudjana 		.proxy_pd_names = (char*[]){
11159ae45035SYassine Oudjana 			"ssc_cx",
11169ae45035SYassine Oudjana 			NULL
11179ae45035SYassine Oudjana 		},
11189e004f97SBjorn Andersson 		.ssr_name = "dsps",
11199e004f97SBjorn Andersson 		.sysmon_name = "slpi",
11209e004f97SBjorn Andersson 		.ssctl_id = 0x16,
11219e004f97SBjorn Andersson };
11229e004f97SBjorn Andersson 
1123637e98bfSDylan Van Assche static const struct adsp_data sdm845_slpi_resource_init = {
1124e8b4e9a2SVinod Koul 		.crash_reason_smem = 424,
1125e8b4e9a2SVinod Koul 		.firmware_name = "slpi.mdt",
1126e8b4e9a2SVinod Koul 		.pas_id = 12,
1127e8b4e9a2SVinod Koul 		.auto_boot = true,
1128e8b4e9a2SVinod Koul 		.proxy_pd_names = (char*[]){
1129e8b4e9a2SVinod Koul 			"lcx",
1130e8b4e9a2SVinod Koul 			"lmx",
1131e8b4e9a2SVinod Koul 			NULL
1132e8b4e9a2SVinod Koul 		},
1133c1fe10d2SSibi Sankar 		.load_state = "slpi",
1134e8b4e9a2SVinod Koul 		.ssr_name = "dsps",
1135e8b4e9a2SVinod Koul 		.sysmon_name = "slpi",
1136e8b4e9a2SVinod Koul 		.ssctl_id = 0x16,
1137e8b4e9a2SVinod Koul };
1138e8b4e9a2SVinod Koul 
11390af93682SBjorn Andersson static const struct adsp_data wcss_resource_init = {
11400af93682SBjorn Andersson 	.crash_reason_smem = 421,
11410af93682SBjorn Andersson 	.firmware_name = "wcnss.mdt",
11420af93682SBjorn Andersson 	.pas_id = 6,
1143b7ff96ccSSibi Sankar 	.auto_boot = true,
11440af93682SBjorn Andersson 	.ssr_name = "mpss",
11450af93682SBjorn Andersson 	.sysmon_name = "wcnss",
11460af93682SBjorn Andersson 	.ssctl_id = 0x12,
11470af93682SBjorn Andersson };
11480af93682SBjorn Andersson 
11493fdba9d2SManivannan Sadhasivam static const struct adsp_data sdx55_mpss_resource = {
11503fdba9d2SManivannan Sadhasivam 	.crash_reason_smem = 421,
11513fdba9d2SManivannan Sadhasivam 	.firmware_name = "modem.mdt",
11523fdba9d2SManivannan Sadhasivam 	.pas_id = 4,
11533fdba9d2SManivannan Sadhasivam 	.auto_boot = true,
11543fdba9d2SManivannan Sadhasivam 	.proxy_pd_names = (char*[]){
11553fdba9d2SManivannan Sadhasivam 		"cx",
11563fdba9d2SManivannan Sadhasivam 		"mss",
11573fdba9d2SManivannan Sadhasivam 		NULL
11583fdba9d2SManivannan Sadhasivam 	},
11593fdba9d2SManivannan Sadhasivam 	.ssr_name = "mpss",
11603fdba9d2SManivannan Sadhasivam 	.sysmon_name = "modem",
11613fdba9d2SManivannan Sadhasivam 	.ssctl_id = 0x22,
11623fdba9d2SManivannan Sadhasivam };
11633fdba9d2SManivannan Sadhasivam 
116486590c30SSibi Sankar static const struct adsp_data sm8450_mpss_resource = {
116586590c30SSibi Sankar 	.crash_reason_smem = 421,
116686590c30SSibi Sankar 	.firmware_name = "modem.mdt",
116786590c30SSibi Sankar 	.pas_id = 4,
116886590c30SSibi Sankar 	.minidump_id = 3,
116986590c30SSibi Sankar 	.auto_boot = false,
117086590c30SSibi Sankar 	.decrypt_shutdown = true,
117186590c30SSibi Sankar 	.proxy_pd_names = (char*[]){
117286590c30SSibi Sankar 		"cx",
117386590c30SSibi Sankar 		"mss",
117486590c30SSibi Sankar 		NULL
117586590c30SSibi Sankar 	},
117686590c30SSibi Sankar 	.load_state = "modem",
117786590c30SSibi Sankar 	.ssr_name = "mpss",
117886590c30SSibi Sankar 	.sysmon_name = "modem",
117986590c30SSibi Sankar 	.ssctl_id = 0x12,
118086590c30SSibi Sankar };
118186590c30SSibi Sankar 
11827eddedc9SNeil Armstrong static const struct adsp_data sm8550_adsp_resource = {
11837eddedc9SNeil Armstrong 	.crash_reason_smem = 423,
11847eddedc9SNeil Armstrong 	.firmware_name = "adsp.mdt",
11857eddedc9SNeil Armstrong 	.dtb_firmware_name = "adsp_dtb.mdt",
11867eddedc9SNeil Armstrong 	.pas_id = 1,
11877eddedc9SNeil Armstrong 	.dtb_pas_id = 0x24,
11887eddedc9SNeil Armstrong 	.minidump_id = 5,
1189a8086bd9SNeil Armstrong 	.auto_boot = true,
11907eddedc9SNeil Armstrong 	.proxy_pd_names = (char*[]){
11917eddedc9SNeil Armstrong 		"lcx",
11927eddedc9SNeil Armstrong 		"lmx",
11937eddedc9SNeil Armstrong 		NULL
11947eddedc9SNeil Armstrong 	},
11957eddedc9SNeil Armstrong 	.load_state = "adsp",
11967eddedc9SNeil Armstrong 	.ssr_name = "lpass",
11977eddedc9SNeil Armstrong 	.sysmon_name = "adsp",
11987eddedc9SNeil Armstrong 	.ssctl_id = 0x14,
11997eddedc9SNeil Armstrong };
12007eddedc9SNeil Armstrong 
12017eddedc9SNeil Armstrong static const struct adsp_data sm8550_cdsp_resource = {
12027eddedc9SNeil Armstrong 	.crash_reason_smem = 601,
12037eddedc9SNeil Armstrong 	.firmware_name = "cdsp.mdt",
12047eddedc9SNeil Armstrong 	.dtb_firmware_name = "cdsp_dtb.mdt",
12057eddedc9SNeil Armstrong 	.pas_id = 18,
12067eddedc9SNeil Armstrong 	.dtb_pas_id = 0x25,
12077eddedc9SNeil Armstrong 	.minidump_id = 7,
1208a8086bd9SNeil Armstrong 	.auto_boot = true,
12097eddedc9SNeil Armstrong 	.proxy_pd_names = (char*[]){
12107eddedc9SNeil Armstrong 		"cx",
12117eddedc9SNeil Armstrong 		"mxc",
12127eddedc9SNeil Armstrong 		"nsp",
12137eddedc9SNeil Armstrong 		NULL
12147eddedc9SNeil Armstrong 	},
12157eddedc9SNeil Armstrong 	.load_state = "cdsp",
12167eddedc9SNeil Armstrong 	.ssr_name = "cdsp",
12177eddedc9SNeil Armstrong 	.sysmon_name = "cdsp",
12187eddedc9SNeil Armstrong 	.ssctl_id = 0x17,
12197eddedc9SNeil Armstrong };
12207eddedc9SNeil Armstrong 
12217eddedc9SNeil Armstrong static const struct adsp_data sm8550_mpss_resource = {
12227eddedc9SNeil Armstrong 	.crash_reason_smem = 421,
12237eddedc9SNeil Armstrong 	.firmware_name = "modem.mdt",
12247eddedc9SNeil Armstrong 	.dtb_firmware_name = "modem_dtb.mdt",
12257eddedc9SNeil Armstrong 	.pas_id = 4,
12267eddedc9SNeil Armstrong 	.dtb_pas_id = 0x26,
12277eddedc9SNeil Armstrong 	.minidump_id = 3,
12287eddedc9SNeil Armstrong 	.auto_boot = false,
12297eddedc9SNeil Armstrong 	.decrypt_shutdown = true,
12307eddedc9SNeil Armstrong 	.proxy_pd_names = (char*[]){
12317eddedc9SNeil Armstrong 		"cx",
12327eddedc9SNeil Armstrong 		"mss",
12337eddedc9SNeil Armstrong 		NULL
12347eddedc9SNeil Armstrong 	},
12357eddedc9SNeil Armstrong 	.load_state = "modem",
12367eddedc9SNeil Armstrong 	.ssr_name = "mpss",
12377eddedc9SNeil Armstrong 	.sysmon_name = "modem",
12387eddedc9SNeil Armstrong 	.ssctl_id = 0x12,
12397eddedc9SNeil Armstrong 	.region_assign_idx = 2,
12407eddedc9SNeil Armstrong };
12417eddedc9SNeil Armstrong 
12429e004f97SBjorn Andersson static const struct of_device_id adsp_of_match[] = {
1243fb4f07ccSLuca Weiss 	{ .compatible = "qcom,msm8226-adsp-pil", .data = &adsp_resource_init},
12441cfaa13bSSireesh Kodali 	{ .compatible = "qcom,msm8953-adsp-pil", .data = &msm8996_adsp_resource},
12459e004f97SBjorn Andersson 	{ .compatible = "qcom,msm8974-adsp-pil", .data = &adsp_resource_init},
12469ae45035SYassine Oudjana 	{ .compatible = "qcom,msm8996-adsp-pil", .data = &msm8996_adsp_resource},
1247637e98bfSDylan Van Assche 	{ .compatible = "qcom,msm8996-slpi-pil", .data = &msm8996_slpi_resource_init},
12489ae45035SYassine Oudjana 	{ .compatible = "qcom,msm8998-adsp-pas", .data = &msm8996_adsp_resource},
1249637e98bfSDylan Van Assche 	{ .compatible = "qcom,msm8998-slpi-pas", .data = &msm8996_slpi_resource_init},
12500af93682SBjorn Andersson 	{ .compatible = "qcom,qcs404-adsp-pas", .data = &adsp_resource_init },
12510af93682SBjorn Andersson 	{ .compatible = "qcom,qcs404-cdsp-pas", .data = &cdsp_resource_init },
12520af93682SBjorn Andersson 	{ .compatible = "qcom,qcs404-wcss-pas", .data = &wcss_resource_init },
1253b506a0c4STengfei Fan 	{ .compatible = "qcom,sa8775p-adsp-pas", .data = &sa8775p_adsp_resource},
1254b506a0c4STengfei Fan 	{ .compatible = "qcom,sa8775p-cdsp0-pas", .data = &sa8775p_cdsp0_resource},
1255b506a0c4STengfei Fan 	{ .compatible = "qcom,sa8775p-cdsp1-pas", .data = &sa8775p_cdsp1_resource},
1256b506a0c4STengfei Fan 	{ .compatible = "qcom,sa8775p-gpdsp0-pas", .data = &sa8775p_gpdsp0_resource},
1257b506a0c4STengfei Fan 	{ .compatible = "qcom,sa8775p-gpdsp1-pas", .data = &sa8775p_gpdsp1_resource},
1258*171c4053SDmitry Baryshkov 	{ .compatible = "qcom,sar2130p-adsp-pas", .data = &sm8350_adsp_resource},
125925804f9bSNikita Travkin 	{ .compatible = "qcom,sc7180-adsp-pas", .data = &sm8250_adsp_resource},
1260620d70b0SSibi Sankar 	{ .compatible = "qcom,sc7180-mpss-pas", .data = &mpss_resource_init},
126158c8db93SSibi Sankar 	{ .compatible = "qcom,sc7280-mpss-pas", .data = &mpss_resource_init},
1262aef6a521SBjorn Andersson 	{ .compatible = "qcom,sc8180x-adsp-pas", .data = &sm8150_adsp_resource},
1263aef6a521SBjorn Andersson 	{ .compatible = "qcom,sc8180x-cdsp-pas", .data = &sm8150_cdsp_resource},
1264aef6a521SBjorn Andersson 	{ .compatible = "qcom,sc8180x-mpss-pas", .data = &sc8180x_mpss_resource},
12654e55a6cfSBjorn Andersson 	{ .compatible = "qcom,sc8280xp-adsp-pas", .data = &sm8250_adsp_resource},
12664e55a6cfSBjorn Andersson 	{ .compatible = "qcom,sc8280xp-nsp0-pas", .data = &sc8280xp_nsp0_resource},
12674e55a6cfSBjorn Andersson 	{ .compatible = "qcom,sc8280xp-nsp1-pas", .data = &sc8280xp_nsp1_resource},
1268a0a77028SKonrad Dybcio 	{ .compatible = "qcom,sdm660-adsp-pas", .data = &adsp_resource_init},
1269c1fe10d2SSibi Sankar 	{ .compatible = "qcom,sdm845-adsp-pas", .data = &sdm845_adsp_resource_init},
1270c1fe10d2SSibi Sankar 	{ .compatible = "qcom,sdm845-cdsp-pas", .data = &sdm845_cdsp_resource_init},
1271ba3125b4SDylan Van Assche 	{ .compatible = "qcom,sdm845-slpi-pas", .data = &sdm845_slpi_resource_init},
12723fdba9d2SManivannan Sadhasivam 	{ .compatible = "qcom,sdx55-mpss-pas", .data = &sdx55_mpss_resource},
12733c730658SBhupesh Sharma 	{ .compatible = "qcom,sm6115-adsp-pas", .data = &adsp_resource_init},
12743c730658SBhupesh Sharma 	{ .compatible = "qcom,sm6115-cdsp-pas", .data = &cdsp_resource_init},
12753c730658SBhupesh Sharma 	{ .compatible = "qcom,sm6115-mpss-pas", .data = &sc8180x_mpss_resource},
1276bfd75aefSLuca Weiss 	{ .compatible = "qcom,sm6350-adsp-pas", .data = &sm6350_adsp_resource},
12773bc0d1f9SLuca Weiss 	{ .compatible = "qcom,sm6350-cdsp-pas", .data = &sm6350_cdsp_resource},
127842a3f554SLuca Weiss 	{ .compatible = "qcom,sm6350-mpss-pas", .data = &mpss_resource_init},
127915f4ae1eSSibi Sankar 	{ .compatible = "qcom,sm8150-adsp-pas", .data = &sm8150_adsp_resource},
128015f4ae1eSSibi Sankar 	{ .compatible = "qcom,sm8150-cdsp-pas", .data = &sm8150_cdsp_resource},
128115f4ae1eSSibi Sankar 	{ .compatible = "qcom,sm8150-mpss-pas", .data = &mpss_resource_init},
1282637e98bfSDylan Van Assche 	{ .compatible = "qcom,sm8150-slpi-pas", .data = &sdm845_slpi_resource_init},
1283f6da4831SBjorn Andersson 	{ .compatible = "qcom,sm8250-adsp-pas", .data = &sm8250_adsp_resource},
1284f6da4831SBjorn Andersson 	{ .compatible = "qcom,sm8250-cdsp-pas", .data = &sm8250_cdsp_resource},
1285637e98bfSDylan Van Assche 	{ .compatible = "qcom,sm8250-slpi-pas", .data = &sdm845_slpi_resource_init},
1286e8b4e9a2SVinod Koul 	{ .compatible = "qcom,sm8350-adsp-pas", .data = &sm8350_adsp_resource},
1287e8b4e9a2SVinod Koul 	{ .compatible = "qcom,sm8350-cdsp-pas", .data = &sm8350_cdsp_resource},
1288637e98bfSDylan Van Assche 	{ .compatible = "qcom,sm8350-slpi-pas", .data = &sdm845_slpi_resource_init},
1289e8b4e9a2SVinod Koul 	{ .compatible = "qcom,sm8350-mpss-pas", .data = &mpss_resource_init},
12905cef9b48SBjorn Andersson 	{ .compatible = "qcom,sm8450-adsp-pas", .data = &sm8350_adsp_resource},
12915cef9b48SBjorn Andersson 	{ .compatible = "qcom,sm8450-cdsp-pas", .data = &sm8350_cdsp_resource},
1292637e98bfSDylan Van Assche 	{ .compatible = "qcom,sm8450-slpi-pas", .data = &sdm845_slpi_resource_init},
129386590c30SSibi Sankar 	{ .compatible = "qcom,sm8450-mpss-pas", .data = &sm8450_mpss_resource},
12947eddedc9SNeil Armstrong 	{ .compatible = "qcom,sm8550-adsp-pas", .data = &sm8550_adsp_resource},
12957eddedc9SNeil Armstrong 	{ .compatible = "qcom,sm8550-cdsp-pas", .data = &sm8550_cdsp_resource},
12967eddedc9SNeil Armstrong 	{ .compatible = "qcom,sm8550-mpss-pas", .data = &sm8550_mpss_resource},
12979e004f97SBjorn Andersson 	{ },
12989e004f97SBjorn Andersson };
12999e004f97SBjorn Andersson MODULE_DEVICE_TABLE(of, adsp_of_match);
13009e004f97SBjorn Andersson 
13019e004f97SBjorn Andersson static struct platform_driver adsp_driver = {
13029e004f97SBjorn Andersson 	.probe = adsp_probe,
130357c05a6fSUwe Kleine-König 	.remove_new = adsp_remove,
13049e004f97SBjorn Andersson 	.driver = {
13059e004f97SBjorn Andersson 		.name = "qcom_q6v5_pas",
13069e004f97SBjorn Andersson 		.of_match_table = adsp_of_match,
13079e004f97SBjorn Andersson 	},
13089e004f97SBjorn Andersson };
13099e004f97SBjorn Andersson 
13109e004f97SBjorn Andersson module_platform_driver(adsp_driver);
13119e004f97SBjorn Andersson MODULE_DESCRIPTION("Qualcomm Hexagon v5 Peripheral Authentication Service driver");
13129e004f97SBjorn Andersson MODULE_LICENSE("GPL v2");
1313