]> Gitweb @ Texas Instruments - Open Source Git Repositories - git.TI.com/gitweb - rpmsg/rpmsg.git/commitdiff
remoteproc/k3-r5: cleanup failure paths in k3_r5_cluster_rproc_init()
authorSuman Anna <s-anna@ti.com>
Mon, 29 Oct 2018 21:48:47 +0000 (16:48 -0500)
committerSuman Anna <s-anna@ti.com>
Tue, 30 Oct 2018 20:47:25 +0000 (15:47 -0500)
The k3_r5_cluster_rproc_init() function is not performing all the
required cleanup for failure paths if the MCU R5F cluster is configured
for Split-mode. Clean up the function so that all prior successful
operation on any of Core0 and/or Core1 are addressed upon any failure
on any core in both LockStep and Split modes. The changes also fixes
a minor cleanup bug introduced in commit 2419f21396b9 ("remoteproc/k3-r5:
fix the R5 boot state machine for multiple combinations").

Signed-off-by: Suman Anna <s-anna@ti.com>
drivers/remoteproc/ti_k3_r5_remoteproc.c

index 75190192a308e7bd9260aed4d99aada9f0b1696c..ed7cf6d32a41ea793434343c2b7b004639c944e4 100644 (file)
@@ -831,22 +831,27 @@ static int k3_r5_cluster_rproc_init(struct platform_device *pdev)
        struct k3_r5_cluster *cluster = platform_get_drvdata(pdev);
        struct device *dev = &pdev->dev;
        struct k3_r5_rproc *kproc;
-       struct k3_r5_core *core;
+       struct k3_r5_core *core, *core1;
        struct device *cdev;
        const char *fw_name;
        struct rproc *rproc;
        int ret;
 
+       core1 = list_last_entry(&cluster->cores, struct k3_r5_core, elem);
        list_for_each_entry(core, &cluster->cores, elem) {
                cdev = core->dev;
                fw_name = k3_r5_rproc_get_firmware(cdev);
-               if (IS_ERR(fw_name))
-                       return PTR_ERR(fw_name);
+               if (IS_ERR(fw_name)) {
+                       ret = PTR_ERR(fw_name);
+                       goto out;
+               }
 
                rproc = rproc_alloc(cdev, dev_name(cdev), &k3_r5_rproc_ops,
                                    fw_name, sizeof(*kproc));
-               if (!rproc)
-                       return -ENOMEM;
+               if (!rproc) {
+                       ret = -ENOMEM;
+                       goto out;
+               }
 
                /* K3 R5s have a Region Address Translator (RAT) but no MMU */
                rproc->has_iommu = false;
@@ -864,14 +869,14 @@ static int k3_r5_cluster_rproc_init(struct platform_device *pdev)
                if (ret) {
                        dev_err(dev, "initial configure failed, ret = %d\n",
                                ret);
-                       return ret;
+                       goto err_config;
                }
 
                ret = k3_r5_reserved_mem_init(kproc);
                if (ret) {
                        dev_err(dev, "reserved memory init failed, ret = %d\n",
                                ret);
-                       goto err_mem;
+                       goto err_config;
                }
 
                ret = rproc_add(rproc);
@@ -887,11 +892,21 @@ static int k3_r5_cluster_rproc_init(struct platform_device *pdev)
 
        return 0;
 
+err_split:
+       rproc_del(rproc);
 err_add:
        k3_r5_reserved_mem_exit(kproc);
-err_mem:
+err_config:
        rproc_free(rproc);
        core->rproc = NULL;
+out:
+       /* undo core0 upon any failures on core1 in split-mode */
+       if (!cluster->mode && core == core1) {
+               core = list_prev_entry(core, elem);
+               rproc = core->rproc;
+               kproc = rproc->priv;
+               goto err_split;
+       }
        return ret;
 }