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