fsl_sec_mon.c 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. /*
  2. * Copyright 2015 Freescale Semiconductor, Inc.
  3. *
  4. * SPDX-License-Identifier: GPL-2.0+
  5. */
  6. #include <common.h>
  7. #include <fsl_sec_mon.h>
  8. int change_sec_mon_state(u32 initial_state, u32 final_state)
  9. {
  10. struct ccsr_sec_mon_regs *sec_mon_regs = (void *)
  11. (CONFIG_SYS_SEC_MON_ADDR);
  12. u32 sts = sec_mon_in32(&sec_mon_regs->hp_stat);
  13. int timeout = 10;
  14. if ((sts & HPSR_SSM_ST_MASK) != initial_state)
  15. return -1;
  16. if (initial_state == HPSR_SSM_ST_TRUST) {
  17. switch (final_state) {
  18. case HPSR_SSM_ST_NON_SECURE:
  19. printf("SEC_MON state transitioning to Soft Fail.\n");
  20. sec_mon_setbits32(&sec_mon_regs->hp_com, HPCOMR_SW_SV);
  21. /*
  22. * poll till SEC_MON is in
  23. * Soft Fail state
  24. */
  25. while (((sts & HPSR_SSM_ST_MASK) !=
  26. HPSR_SSM_ST_SOFT_FAIL)) {
  27. while (timeout) {
  28. sts = sec_mon_in32
  29. (&sec_mon_regs->hp_stat);
  30. if ((sts & HPSR_SSM_ST_MASK) ==
  31. HPSR_SSM_ST_SOFT_FAIL)
  32. break;
  33. udelay(10);
  34. timeout--;
  35. }
  36. }
  37. if (timeout == 0) {
  38. printf("SEC_MON state transition timeout.\n");
  39. return -1;
  40. }
  41. timeout = 10;
  42. printf("SEC_MON state transitioning to Non Secure.\n");
  43. sec_mon_setbits32(&sec_mon_regs->hp_com, HPCOMR_SSM_ST);
  44. /*
  45. * poll till SEC_MON is in
  46. * Non Secure state
  47. */
  48. while (((sts & HPSR_SSM_ST_MASK) !=
  49. HPSR_SSM_ST_NON_SECURE)) {
  50. while (timeout) {
  51. sts = sec_mon_in32
  52. (&sec_mon_regs->hp_stat);
  53. if ((sts & HPSR_SSM_ST_MASK) ==
  54. HPSR_SSM_ST_NON_SECURE)
  55. break;
  56. udelay(10);
  57. timeout--;
  58. }
  59. }
  60. if (timeout == 0) {
  61. printf("SEC_MON state transition timeout.\n");
  62. return -1;
  63. }
  64. break;
  65. case HPSR_SSM_ST_SOFT_FAIL:
  66. printf("SEC_MON state transitioning to Soft Fail.\n");
  67. sec_mon_setbits32(&sec_mon_regs->hp_com, HPCOMR_SW_FSV);
  68. /*
  69. * polling loop till SEC_MON is in
  70. * Soft Fail state
  71. */
  72. while (((sts & HPSR_SSM_ST_MASK) !=
  73. HPSR_SSM_ST_SOFT_FAIL)) {
  74. while (timeout) {
  75. sts = sec_mon_in32
  76. (&sec_mon_regs->hp_stat);
  77. if ((sts & HPSR_SSM_ST_MASK) ==
  78. HPSR_SSM_ST_SOFT_FAIL)
  79. break;
  80. udelay(10);
  81. timeout--;
  82. }
  83. }
  84. if (timeout == 0) {
  85. printf("SEC_MON state transition timeout.\n");
  86. return -1;
  87. }
  88. break;
  89. default:
  90. return -1;
  91. }
  92. } else if (initial_state == HPSR_SSM_ST_NON_SECURE) {
  93. switch (final_state) {
  94. case HPSR_SSM_ST_SOFT_FAIL:
  95. printf("SEC_MON state transitioning to Soft Fail.\n");
  96. sec_mon_setbits32(&sec_mon_regs->hp_com, HPCOMR_SW_FSV);
  97. /*
  98. * polling loop till SEC_MON is in
  99. * Soft Fail state
  100. */
  101. while (((sts & HPSR_SSM_ST_MASK) !=
  102. HPSR_SSM_ST_SOFT_FAIL)) {
  103. while (timeout) {
  104. sts = sec_mon_in32
  105. (&sec_mon_regs->hp_stat);
  106. if ((sts & HPSR_SSM_ST_MASK) ==
  107. HPSR_SSM_ST_SOFT_FAIL)
  108. break;
  109. udelay(10);
  110. timeout--;
  111. }
  112. }
  113. if (timeout == 0) {
  114. printf("SEC_MON state transition timeout.\n");
  115. return -1;
  116. }
  117. break;
  118. default:
  119. return -1;
  120. }
  121. }
  122. return 0;
  123. }