summary | shortlog | log | commit | commitdiff | tree
raw | patch | inline | side by side (parent: 2428228)
raw | patch | inline | side by side (parent: 2428228)
author | Suman Anna <s-anna@ti.com> | |
Mon, 29 Oct 2018 21:48:47 +0000 (16:48 -0500) | ||
committer | Suman 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>
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 | patch | blob | history |
index 75190192a308e7bd9260aed4d99aada9f0b1696c..ed7cf6d32a41ea793434343c2b7b004639c944e4 100644 (file)
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;
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);
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;
}