|
@@ -32,9 +32,11 @@
|
|
|
#include "qcom_mdt_loader.h"
|
|
|
#include "remoteproc_internal.h"
|
|
|
|
|
|
-#define ADSP_CRASH_REASON_SMEM 423
|
|
|
-#define ADSP_FIRMWARE_NAME "adsp.mdt"
|
|
|
-#define ADSP_PAS_ID 1
|
|
|
+struct adsp_data {
|
|
|
+ int crash_reason_smem;
|
|
|
+ const char *firmware_name;
|
|
|
+ int pas_id;
|
|
|
+};
|
|
|
|
|
|
struct qcom_adsp {
|
|
|
struct device *dev;
|
|
@@ -53,6 +55,9 @@ struct qcom_adsp {
|
|
|
|
|
|
struct regulator *cx_supply;
|
|
|
|
|
|
+ int pas_id;
|
|
|
+ int crash_reason_smem;
|
|
|
+
|
|
|
struct completion start_done;
|
|
|
struct completion stop_done;
|
|
|
|
|
@@ -70,7 +75,7 @@ static int adsp_load(struct rproc *rproc, const struct firmware *fw)
|
|
|
bool relocate;
|
|
|
int ret;
|
|
|
|
|
|
- ret = qcom_scm_pas_init_image(ADSP_PAS_ID, fw->data, fw->size);
|
|
|
+ ret = qcom_scm_pas_init_image(adsp->pas_id, fw->data, fw->size);
|
|
|
if (ret) {
|
|
|
dev_err(&rproc->dev, "invalid firmware metadata\n");
|
|
|
return ret;
|
|
@@ -85,7 +90,8 @@ static int adsp_load(struct rproc *rproc, const struct firmware *fw)
|
|
|
if (relocate) {
|
|
|
adsp->mem_reloc = fw_addr;
|
|
|
|
|
|
- ret = qcom_scm_pas_mem_setup(ADSP_PAS_ID, adsp->mem_phys, fw_size);
|
|
|
+ ret = qcom_scm_pas_mem_setup(adsp->pas_id,
|
|
|
+ adsp->mem_phys, fw_size);
|
|
|
if (ret) {
|
|
|
dev_err(&rproc->dev, "unable to setup memory for image\n");
|
|
|
return ret;
|
|
@@ -113,7 +119,7 @@ static int adsp_start(struct rproc *rproc)
|
|
|
if (ret)
|
|
|
goto disable_clocks;
|
|
|
|
|
|
- ret = qcom_scm_pas_auth_and_reset(ADSP_PAS_ID);
|
|
|
+ ret = qcom_scm_pas_auth_and_reset(adsp->pas_id);
|
|
|
if (ret) {
|
|
|
dev_err(adsp->dev,
|
|
|
"failed to authenticate image and release reset\n");
|
|
@@ -124,7 +130,7 @@ static int adsp_start(struct rproc *rproc)
|
|
|
msecs_to_jiffies(5000));
|
|
|
if (!ret) {
|
|
|
dev_err(adsp->dev, "start timed out\n");
|
|
|
- qcom_scm_pas_shutdown(ADSP_PAS_ID);
|
|
|
+ qcom_scm_pas_shutdown(adsp->pas_id);
|
|
|
ret = -ETIMEDOUT;
|
|
|
goto disable_regulators;
|
|
|
}
|
|
@@ -157,7 +163,7 @@ static int adsp_stop(struct rproc *rproc)
|
|
|
BIT(adsp->stop_bit),
|
|
|
0);
|
|
|
|
|
|
- ret = qcom_scm_pas_shutdown(ADSP_PAS_ID);
|
|
|
+ ret = qcom_scm_pas_shutdown(adsp->pas_id);
|
|
|
if (ret)
|
|
|
dev_err(adsp->dev, "failed to shutdown: %d\n", ret);
|
|
|
|
|
@@ -197,7 +203,7 @@ static irqreturn_t adsp_fatal_interrupt(int irq, void *dev)
|
|
|
size_t len;
|
|
|
char *msg;
|
|
|
|
|
|
- msg = qcom_smem_get(QCOM_SMEM_HOST_ANY, ADSP_CRASH_REASON_SMEM, &len);
|
|
|
+ msg = qcom_smem_get(QCOM_SMEM_HOST_ANY, adsp->crash_reason_smem, &len);
|
|
|
if (!IS_ERR(msg) && len > 0 && msg[0])
|
|
|
dev_err(adsp->dev, "fatal error received: %s\n", msg);
|
|
|
|
|
@@ -311,20 +317,25 @@ static int adsp_alloc_memory_region(struct qcom_adsp *adsp)
|
|
|
|
|
|
static int adsp_probe(struct platform_device *pdev)
|
|
|
{
|
|
|
+ const struct adsp_data *desc;
|
|
|
struct qcom_adsp *adsp;
|
|
|
struct rproc *rproc;
|
|
|
int ret;
|
|
|
|
|
|
+ desc = of_device_get_match_data(&pdev->dev);
|
|
|
+ if (!desc)
|
|
|
+ return -EINVAL;
|
|
|
+
|
|
|
if (!qcom_scm_is_available())
|
|
|
return -EPROBE_DEFER;
|
|
|
|
|
|
- if (!qcom_scm_pas_supported(ADSP_PAS_ID)) {
|
|
|
- dev_err(&pdev->dev, "PAS is not available for ADSP\n");
|
|
|
+ if (!qcom_scm_pas_supported(desc->pas_id)) {
|
|
|
+ dev_err(&pdev->dev, "PAS is not available for subsystem\n");
|
|
|
return -ENXIO;
|
|
|
}
|
|
|
|
|
|
rproc = rproc_alloc(&pdev->dev, pdev->name, &adsp_ops,
|
|
|
- ADSP_FIRMWARE_NAME, sizeof(*adsp));
|
|
|
+ desc->firmware_name, sizeof(*adsp));
|
|
|
if (!rproc) {
|
|
|
dev_err(&pdev->dev, "unable to allocate remoteproc\n");
|
|
|
return -ENOMEM;
|
|
@@ -335,6 +346,8 @@ static int adsp_probe(struct platform_device *pdev)
|
|
|
adsp = (struct qcom_adsp *)rproc->priv;
|
|
|
adsp->dev = &pdev->dev;
|
|
|
adsp->rproc = rproc;
|
|
|
+ adsp->pas_id = desc->pas_id;
|
|
|
+ adsp->crash_reason_smem = desc->crash_reason_smem;
|
|
|
platform_set_drvdata(pdev, adsp);
|
|
|
|
|
|
init_completion(&adsp->start_done);
|
|
@@ -407,9 +420,15 @@ static int adsp_remove(struct platform_device *pdev)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+static const struct adsp_data adsp_resource_init = {
|
|
|
+ .crash_reason_smem = 423,
|
|
|
+ .firmware_name = "adsp.mdt",
|
|
|
+ .pas_id = 1,
|
|
|
+};
|
|
|
+
|
|
|
static const struct of_device_id adsp_of_match[] = {
|
|
|
- { .compatible = "qcom,msm8974-adsp-pil" },
|
|
|
- { .compatible = "qcom,msm8996-adsp-pil" },
|
|
|
+ { .compatible = "qcom,msm8974-adsp-pil", .data = &adsp_resource_init},
|
|
|
+ { .compatible = "qcom,msm8996-adsp-pil", .data = &adsp_resource_init},
|
|
|
{ },
|
|
|
};
|
|
|
MODULE_DEVICE_TABLE(of, adsp_of_match);
|