Guest User

Untitled

a guest
Jul 1st, 2024
99
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.73 KB | None | 0 0
  1. static int k3_r5_rproc_stop(struct rproc *rproc)
  2. {
  3. struct k3_r5_rproc *kproc = rproc->priv;
  4. struct k3_r5_cluster *cluster = kproc->cluster;
  5. struct device *dev = kproc->dev;
  6. struct k3_r5_core *core1, *core = kproc->core;
  7. int ret;
  8.  
  9.  
  10. if (cluster->mode != CLUSTER_MODE_LOCKSTEP) {
  11. /* do not allow core 0 to stop before core 1 */
  12. core1 = list_last_entry(&cluster->cores, struct k3_r5_core,
  13. elem);
  14. if (core != core1 && core1->rproc->state != RPROC_OFFLINE &&
  15. core1->rproc->state != RPROC_SUSPENDED) {
  16. dev_err(dev, "%s: can not stop core 0 before core 1\n",
  17. __func__);
  18. ret = -EPERM;
  19. goto out;
  20. }
  21. }
  22.  
  23. /* halt all applicable cores */
  24. if (cluster->mode == CLUSTER_MODE_LOCKSTEP) {
  25. list_for_each_entry(core, &cluster->cores, elem) {
  26. ret = k3_r5_core_halt(core);
  27. if (ret) {
  28. core = list_prev_entry(core, elem);
  29. goto unroll_core_halt;
  30. }
  31. }
  32. } else {
  33.  
  34. ret = k3_r5_core_halt(core);
  35. if (ret)
  36. goto out;
  37. }
  38.  
  39. mbox_free_channel(kproc->mbox);
  40.  
  41. return 0;
  42.  
  43. unroll_core_halt:
  44. list_for_each_entry_from_reverse(core, &cluster->cores, elem) {
  45. if (k3_r5_core_run(core))
  46. dev_warn(core->dev, "core run back failed\n");
  47. }
  48. out:
  49. return ret;
  50. }
  51.  
Advertisement
Add Comment
Please, Sign In to add comment