Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Cherry-pick in-kernel pd-mapper patches and enable it #28

Merged
merged 7 commits into from
Apr 27, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions arch/arm64/configs/sdm660_defconfig
Original file line number Diff line number Diff line change
Expand Up @@ -544,6 +544,7 @@ CONFIG_QCOM_GENI_SE=m
CONFIG_QCOM_GSBI=m
CONFIG_QCOM_LLCC=m
CONFIG_QCOM_OCMEM=m
CONFIG_QCOM_PD_MAPPER=m
CONFIG_QCOM_PMIC_GLINK=m
CONFIG_QCOM_RAMP_CTRL=m
CONFIG_QCOM_RMTFS_MEM=m
Expand Down
4 changes: 4 additions & 0 deletions drivers/remoteproc/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -201,6 +202,7 @@ config QCOM_Q6V5_MSS
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_MDT_LOADER
select QCOM_PIL_INFO
Expand All @@ -221,6 +223,7 @@ config QCOM_Q6V5_PAS
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
Expand All @@ -243,6 +246,7 @@ config QCOM_Q6V5_WCSS
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_MDT_LOADER
select QCOM_PIL_INFO
Expand Down
11 changes: 10 additions & 1 deletion drivers/remoteproc/qcom_q6v5_adsp.c
Original file line number Diff line number Diff line change
Expand Up @@ -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>

Expand Down Expand Up @@ -383,10 +384,14 @@ static int adsp_start(struct rproc *rproc)
int ret;
unsigned int val;

ret = qcom_q6v5_prepare(&adsp->q6v5);
ret = qcom_pdm_get();
if (ret)
return ret;

ret = qcom_q6v5_prepare(&adsp->q6v5);
if (ret)
goto put_pdm;

ret = adsp_map_carveout(rproc);
if (ret) {
dev_err(adsp->dev, "ADSP smmu mapping failed\n");
Expand Down Expand Up @@ -455,6 +460,8 @@ static int adsp_start(struct rproc *rproc)
adsp_unmap_carveout(rproc);
disable_irqs:
qcom_q6v5_unprepare(&adsp->q6v5);
put_pdm:
qcom_pdm_release();

return ret;
}
Expand Down Expand Up @@ -487,6 +494,8 @@ static int adsp_stop(struct rproc *rproc)
if (handover)
qcom_adsp_pil_handover(&adsp->q6v5);

qcom_pdm_release();

return ret;
}

Expand Down
10 changes: 9 additions & 1 deletion drivers/remoteproc/qcom_q6v5_mss.c
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,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/iopoll.h>
#include <linux/slab.h>

Expand Down Expand Up @@ -1581,10 +1582,14 @@ static int q6v5_start(struct rproc *rproc)
int xfermemop_ret;
int ret;

ret = q6v5_mba_load(qproc);
ret = qcom_pdm_get();
if (ret)
return ret;

ret = q6v5_mba_load(qproc);
if (ret)
goto put_pdm;

dev_info(qproc->dev, "MBA booted with%s debug policy, loading mpss\n",
qproc->dp_size ? "" : "out");

Expand Down Expand Up @@ -1613,6 +1618,8 @@ static int q6v5_start(struct rproc *rproc)
reclaim_mpss:
q6v5_mba_reclaim(qproc);
q6v5_dump_mba_logs(qproc);
put_pdm:
qcom_pdm_release();

return ret;
}
Expand All @@ -1627,6 +1634,7 @@ static int q6v5_stop(struct rproc *rproc)
dev_err(qproc->dev, "timed out on wait\n");

q6v5_mba_reclaim(qproc);
qcom_pdm_release();

return 0;
}
Expand Down
12 changes: 11 additions & 1 deletion drivers/remoteproc/qcom_q6v5_pas.c
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
#include <linux/regulator/consumer.h>
#include <linux/remoteproc.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>

Expand Down Expand Up @@ -248,10 +249,14 @@ static int adsp_start(struct rproc *rproc)
struct qcom_adsp *adsp = rproc->priv;
int ret;

ret = qcom_q6v5_prepare(&adsp->q6v5);
ret = qcom_pdm_get();
if (ret)
return ret;

ret = qcom_q6v5_prepare(&adsp->q6v5);
if (ret)
goto put_pdm;

ret = adsp_pds_enable(adsp, adsp->proxy_pds, adsp->proxy_pd_count);
if (ret < 0)
goto disable_irqs;
Expand Down Expand Up @@ -343,6 +348,9 @@ static int adsp_start(struct rproc *rproc)
/* Remove pointer to the loaded firmware, only valid in adsp_load() & adsp_start() */
adsp->firmware = NULL;

put_pdm:
qcom_pdm_release();

return ret;
}

Expand Down Expand Up @@ -386,6 +394,8 @@ static int adsp_stop(struct rproc *rproc)
if (handover)
qcom_pas_handover(&adsp->q6v5);

qcom_pdm_release();

return ret;
}

Expand Down
12 changes: 11 additions & 1 deletion drivers/remoteproc/qcom_q6v5_wcss.c
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
#include <linux/regulator/consumer.h>
#include <linux/reset.h>
#include <linux/soc/qcom/mdt_loader.h>
#include <linux/soc/qcom/pd_mapper.h>
#include "qcom_common.h"
#include "qcom_pil_info.h"
#include "qcom_q6v5.h"
Expand Down Expand Up @@ -240,13 +241,17 @@ static int q6v5_wcss_start(struct rproc *rproc)
struct q6v5_wcss *wcss = rproc->priv;
int ret;

ret = qcom_pdm_get();
if (ret)
return ret;

qcom_q6v5_prepare(&wcss->q6v5);

/* Release Q6 and WCSS reset */
ret = reset_control_deassert(wcss->wcss_reset);
if (ret) {
dev_err(wcss->dev, "wcss_reset failed\n");
return ret;
goto put_pdm;
}

ret = reset_control_deassert(wcss->wcss_q6_reset);
Expand Down Expand Up @@ -288,6 +293,9 @@ static int q6v5_wcss_start(struct rproc *rproc)
wcss_reset:
reset_control_assert(wcss->wcss_reset);

put_pdm:
qcom_pdm_release();

return ret;
}

Expand Down Expand Up @@ -735,6 +743,8 @@ static int q6v5_wcss_stop(struct rproc *rproc)

qcom_q6v5_unprepare(&wcss->q6v5);

qcom_pdm_release();

return 0;
}

Expand Down
14 changes: 14 additions & 0 deletions drivers/soc/qcom/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -72,11 +72,25 @@ config QCOM_OCMEM
requirements. This is typically used by the GPU, camera/video, and
audio components on some Snapdragon SoCs.

config QCOM_PD_MAPPER
tristate "Qualcomm Protection Domain Mapper"
select QCOM_QMI_HELPERS
depends on NET && QRTR
help
The Protection Domain Mapper maps registered services to the domains
and instances handled by the remote DSPs. This is a kernel-space
implementation of the service. It is a simpler alternative to the
userspace daemon.

config QCOM_PDR_HELPERS
tristate
select QCOM_QMI_HELPERS
select QCOM_PDR_MSG
depends on NET

config QCOM_PDR_MSG
tristate

config QCOM_PMIC_PDCHARGER_ULOG
tristate "Qualcomm PMIC PDCharger ULOG driver"
depends on RPMSG
Expand Down
2 changes: 2 additions & 0 deletions drivers/soc/qcom/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,9 @@ obj-$(CONFIG_QCOM_COMMAND_DB) += cmd-db.o
obj-$(CONFIG_QCOM_GSBI) += qcom_gsbi.o
obj-$(CONFIG_QCOM_MDT_LOADER) += mdt_loader.o
obj-$(CONFIG_QCOM_OCMEM) += ocmem.o
obj-$(CONFIG_QCOM_PD_MAPPER) += qcom_pd_mapper.o
obj-$(CONFIG_QCOM_PDR_HELPERS) += pdr_interface.o
obj-$(CONFIG_QCOM_PDR_MSG) += qcom_pdr_msg.o
obj-$(CONFIG_QCOM_PMIC_GLINK) += pmic_glink.o
obj-$(CONFIG_QCOM_PMIC_GLINK) += pmic_glink_altmode.o
obj-$(CONFIG_QCOM_PMIC_PDCHARGER_ULOG) += pmic_pdcharger_ulog.o
Expand Down
6 changes: 3 additions & 3 deletions drivers/soc/qcom/pdr_interface.c
Original file line number Diff line number Diff line change
Expand Up @@ -76,12 +76,12 @@ static int pdr_locator_new_server(struct qmi_handle *qmi,
locator_hdl);
struct pdr_service *pds;

mutex_lock(&pdr->lock);
/* Create a local client port for QMI communication */
pdr->locator_addr.sq_family = AF_QIPCRTR;
pdr->locator_addr.sq_node = svc->node;
pdr->locator_addr.sq_port = svc->port;

mutex_lock(&pdr->lock);
pdr->locator_init_complete = true;
mutex_unlock(&pdr->lock);

Expand All @@ -104,10 +104,10 @@ static void pdr_locator_del_server(struct qmi_handle *qmi,

mutex_lock(&pdr->lock);
pdr->locator_init_complete = false;
mutex_unlock(&pdr->lock);

pdr->locator_addr.sq_node = 0;
pdr->locator_addr.sq_port = 0;
mutex_unlock(&pdr->lock);
}

static const struct qmi_ops pdr_locator_ops = {
Expand Down Expand Up @@ -415,7 +415,7 @@ static int pdr_locate_service(struct pdr_handle *pdr, struct pdr_service *pds)
if (ret < 0)
goto out;

for (i = domains_read; i < resp->domain_list_len; i++) {
for (i = 0; i < resp->domain_list_len; i++) {
entry = &resp->domain_list[i];

if (strnlen(entry->name, sizeof(entry->name)) == sizeof(entry->name))
Expand Down
Loading