Created
February 19, 2025 08:04
Code Snippet when using two pointers for storing cores in a R5 cluster
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
static int k3_r5_lockstep_reset(struct k3_r5_cluster *cluster) | |
{ | |
- struct k3_r5_core *core; | |
- int ret; | |
+ struct k3_r5_rproc *core0 = cluster->core0; | |
+ struct k3_r5_rproc *core1 = cluster->core1; | |
+ int itr, ret; | |
/* assert local reset on all applicable cores */ | |
- list_for_each_entry(core, &cluster->cores, elem) { | |
- ret = reset_control_assert(core->reset); | |
- if (ret) { | |
- dev_err(core->dev, "local-reset assert failed, ret = %d\n", | |
- ret); | |
- core = list_prev_entry(core, elem); | |
- goto unroll_local_reset; | |
- } | |
+ ret = reset_control_assert(core0->reset); | |
+ if (ret) { | |
+ dev_err(core0->dev, "local-reset assert failed, ret = %d\n", ret); | |
+ return ret; | |
} | |
- /* disable PSC modules on all applicable cores */ | |
- list_for_each_entry(core, &cluster->cores, elem) { | |
- ret = core->ti_sci->ops.dev_ops.put_device(core->ti_sci, | |
- core->ti_sci_id); | |
- if (ret) { | |
- dev_err(core->dev, "module-reset assert failed, ret = %d\n", | |
- ret); | |
- goto unroll_module_reset; | |
- } | |
+ ret = reset_control_assert(core1->reset); | |
+ if (ret) { | |
+ dev_err(core1->dev, "local-reset assert failed, ret = %d\n", ret); | |
+ if (reset_control_deassert(core0->reset)) | |
+ dev_warn(core0->dev, "local-reset deassert back failed\n"); | |
+ return ret; | |
} | |
- return 0; | |
- | |
-unroll_module_reset: | |
- list_for_each_entry_continue_reverse(core, &cluster->cores, elem) { | |
- if (core->ti_sci->ops.dev_ops.put_device(core->ti_sci, | |
- core->ti_sci_id)) | |
- dev_warn(core->dev, "module-reset assert back failed\n"); | |
+ /* disable PSC modules on all applicable cores */ | |
+ ret = core0->ti_sci->ops.dev_ops.put_device(core0->ti_sci, | |
+ core0->ti_sci_id); | |
+ if (ret) { | |
+ dev_err(core0->dev, "module-reset assert failed, ret = %d\n", | |
+ ret); | |
+ if (reset_control_deassert(core1->reset)) | |
+ dev_warn(core1->dev, "local-reset deassert back failed\n"); | |
+ if (reset_control_deassert(core0->reset)) | |
+ dev_warn(core0->dev, "local-reset deassert back failed\n"); | |
+ return ret; | |
} | |
- core = list_last_entry(&cluster->cores, struct k3_r5_core, elem); | |
-unroll_local_reset: | |
- list_for_each_entry_from_reverse(core, &cluster->cores, elem) { | |
- if (reset_control_deassert(core->reset)) | |
- dev_warn(core->dev, "local-reset deassert back failed\n"); | |
+ | |
+ ret = core1->ti_sci->ops.dev_ops.put_device(core1->ti_sci, | |
+ core1->ti_sci_id); | |
+ if (ret) { | |
+ dev_err(core1->dev, "module-reset assert failed, ret = %d\n", | |
+ ret); | |
+ if (core0->ti_sci->ops.dev_ops.get_device(core0->ti_sci, core0->ti_sci_id)) | |
+ dev_warn(core0->dev, "module-reset deassert back failed\n"); | |
+ if (reset_control_deassert(core1->reset)) | |
+ dev_warn(core1->dev, "local-reset deassert back failed\n"); | |
+ if (reset_control_deassert(core0->reset)) | |
+ dev_warn(core0->dev, "local-reset deassert back failed\n"); | |
+ return ret; | |
} | |
- return ret; | |
+ return 0; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment