On Fri, 1 Mar 2024 at 01:00, Dmitry Baryshkov <dmitry.baryshkov@xxxxxxxxxx> wrote: > > Add domain / service configuration for the in-kernel protection domain > mapper service. > > Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@xxxxxxxxxx> > --- > drivers/remoteproc/Kconfig | 1 + > drivers/remoteproc/qcom_q6v5_adsp.c | 87 +++++++++++++++++++++++++++++++++++-- > 2 files changed, 84 insertions(+), 4 deletions(-) > > diff --git a/drivers/remoteproc/Kconfig b/drivers/remoteproc/Kconfig > index 48845dc8fa85..f1698d4c302e 100644 > --- a/drivers/remoteproc/Kconfig > +++ b/drivers/remoteproc/Kconfig > @@ -181,6 +181,7 @@ config QCOM_Q6V5_ADSP > depends on QCOM_SYSMON || QCOM_SYSMON=n > depends on RPMSG_QCOM_GLINK || RPMSG_QCOM_GLINK=n > depends on QCOM_AOSS_QMP || QCOM_AOSS_QMP=n > + depends on QCOM_PD_MAPPER || QCOM_PD_MAPPER=n > select MFD_SYSCON > select QCOM_PIL_INFO > select QCOM_MDT_LOADER > diff --git a/drivers/remoteproc/qcom_q6v5_adsp.c b/drivers/remoteproc/qcom_q6v5_adsp.c > index 93f9a1537ec6..5751bcb0c285 100644 > --- a/drivers/remoteproc/qcom_q6v5_adsp.c > +++ b/drivers/remoteproc/qcom_q6v5_adsp.c > @@ -23,6 +23,7 @@ > #include <linux/remoteproc.h> > #include <linux/reset.h> > #include <linux/soc/qcom/mdt_loader.h> > +#include <linux/soc/qcom/pd_mapper.h> > #include <linux/soc/qcom/smem.h> > #include <linux/soc/qcom/smem_state.h> > > @@ -75,6 +76,9 @@ struct adsp_pil_data { > const char **pd_names; > unsigned int num_pds; > const char *load_state; > + > + const struct qcom_pdm_domain_data * const *domains; > + size_t num_domains; > }; > > struct qcom_adsp { > @@ -116,6 +120,9 @@ struct qcom_adsp { > struct qcom_sysmon *sysmon; > > int (*shutdown)(struct qcom_adsp *adsp); > + > + const struct qcom_pdm_domain_data * const *domains; > + size_t num_domains; > }; > > static int qcom_rproc_pds_attach(struct qcom_adsp *adsp, const char **pd_names, > @@ -374,6 +381,7 @@ static int adsp_start(struct rproc *rproc) > struct qcom_adsp *adsp = rproc->priv; > int ret; > unsigned int val; > + int i; > > ret = qcom_q6v5_prepare(&adsp->q6v5); > if (ret) > @@ -434,8 +442,18 @@ static int adsp_start(struct rproc *rproc) > goto disable_adsp_clks; > } > > + for (i = 0; i < adsp->num_domains; i++) { > + ret = qcom_pdm_add_domain(adsp->domains[i]); > + if (ret) > + goto err_domains; > + } > + > return 0; > > +err_domains: > + while (--i >= 0) > + qcom_pdm_del_domain(adsp->domains[i]); > + > disable_adsp_clks: > clk_bulk_disable_unprepare(adsp->num_clks, adsp->clks); > disable_power_domain: > @@ -463,6 +481,10 @@ static int adsp_stop(struct rproc *rproc) > struct qcom_adsp *adsp = rproc->priv; > int handover; > int ret; > + int i; > + > + for (i = 0; i < adsp->num_domains; i++) > + qcom_pdm_del_domain(adsp->domains[i]); > > ret = qcom_q6v5_request_stop(&adsp->q6v5, adsp->sysmon); > if (ret == -ETIMEDOUT) > @@ -690,6 +712,8 @@ static int adsp_probe(struct platform_device *pdev) > adsp->rproc = rproc; > adsp->info_name = desc->sysmon_name; > adsp->has_iommu = desc->has_iommu; > + adsp->domains = desc->domains; > + adsp->num_domains = desc->num_domains; > > platform_set_drvdata(pdev, adsp); > > @@ -764,7 +788,56 @@ static void adsp_remove(struct platform_device *pdev) > rproc_free(adsp->rproc); > } > > -static const struct adsp_pil_data adsp_resource_init = { > +static const struct qcom_pdm_domain_data adsp_audio_pd = { > + .domain = "msm/adsp/audio_pd", > + .instance_id = 74, > + .services = { > + "avs/audio", > + NULL, > + }, > +}; > + > +static const struct qcom_pdm_domain_data adsp_charger_pd = { > + .domain = "msm/adsp/charger_pd", > + .instance_id = 74, > + .services = { NULL }, > +}; > + > +static const struct qcom_pdm_domain_data adsp_root_pd = { > + .domain = "msm/adsp/root_pd", > + .instance_id = 74, > + .services = { NULL }, > +}; > + > +static const struct qcom_pdm_domain_data adsp_sensor_pd = { > + .domain = "msm/adsp/sensor_pd", > + .instance_id = 74, > + .services = { NULL }, > +}; > + > +static const struct qcom_pdm_domain_data *sc7280_adsp_domains[] = { > + &adsp_audio_pd, > + &adsp_root_pd, > + &adsp_charger_pd, > + &adsp_sensor_pd > +}; > + > +static const struct qcom_pdm_domain_data cdsp_root_pd = { > + .domain = "msm/cdsp/root_pd", > + .instance_id = 76, > + .services = { NULL }, > +}; > + > +static const struct qcom_pdm_domain_data *qcs404_cdsp_domains[] = { > + &cdsp_root_pd, > +}; > + > +static const struct qcom_pdm_domain_data *sdm845_adsp_domains[] = { > + &adsp_audio_pd, > + &adsp_root_pd, > +}; > + > +static const struct adsp_pil_data adsp_sdm845_resource_init = { > .crash_reason_smem = 423, > .firmware_name = "adsp.mdt", > .ssr_name = "lpass", > @@ -779,6 +852,8 @@ static const struct adsp_pil_data adsp_resource_init = { > .num_clks = 7, > .pd_names = (const char*[]) { "cx" }, > .num_pds = 1, > + .domains = sdm845_adsp_domains, > + .num_domains = ARRAY_SIZE(sdm845_adsp_domains), > }; > > static const struct adsp_pil_data adsp_sc7280_resource_init = { > @@ -794,9 +869,11 @@ static const struct adsp_pil_data adsp_sc7280_resource_init = { > "gcc_cfg_noc_lpass", NULL > }, > .num_clks = 1, > + .domains = sc7280_adsp_domains, > + .num_domains = ARRAY_SIZE(sc7280_adsp_domains), > }; > > -static const struct adsp_pil_data cdsp_resource_init = { > +static const struct adsp_pil_data cdsp_qcs404_resource_init = { > .crash_reason_smem = 601, > .firmware_name = "cdsp.mdt", > .ssr_name = "cdsp", > @@ -831,10 +908,10 @@ static const struct adsp_pil_data wpss_resource_init = { > }; > > static const struct of_device_id adsp_of_match[] = { > - { .compatible = "qcom,qcs404-cdsp-pil", .data = &cdsp_resource_init }, > + { .compatible = "qcom,qcs404-cdsp-pil", .data = &cdsp_qcs404_resource_init }, > { .compatible = "qcom,sc7280-adsp-pil", .data = &adsp_sc7280_resource_init }, > { .compatible = "qcom,sc7280-wpss-pil", .data = &wpss_resource_init }, > - { .compatible = "qcom,sdm845-adsp-pil", .data = &adsp_resource_init }, > + { .compatible = "qcom,sdm845-adsp-pil", .data = &adsp_sdm845_resource_init }, > { }, > }; > MODULE_DEVICE_TABLE(of, adsp_of_match); > @@ -846,6 +923,8 @@ static struct platform_driver adsp_pil_driver = { > .name = "qcom_q6v5_adsp", > .of_match_table = adsp_of_match, > }, > + .domains = qcs404_cdsp_domains, > + .num_domains = ARRAY_SIZE(qcs404_cdsp_domains), This is a rogue chunk, please drop it if you were to test the series. I'll drop it for v3. > }; > > module_platform_driver(adsp_pil_driver); > > -- > 2.39.2 > -- With best wishes Dmitry