Skip to content

Instantly share code, notes, and snippets.

@3V3RYONE
Created February 19, 2025 08:04
Code Snippet when using two pointers for storing cores in a R5 cluster
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