CV_CAL1Cache.c 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  1. /*-----------------------------------------------------------------------------
  2. * Name: CV_CAL1Cache.c
  3. * Purpose: CMSIS CORE validation tests implementation
  4. *-----------------------------------------------------------------------------
  5. * Copyright (c) 2017 ARM Limited. All rights reserved.
  6. *----------------------------------------------------------------------------*/
  7. #include "CV_Framework.h"
  8. #include "cmsis_cv.h"
  9. /*-----------------------------------------------------------------------------
  10. * Test implementation
  11. *----------------------------------------------------------------------------*/
  12. /*-----------------------------------------------------------------------------
  13. * Test cases
  14. *----------------------------------------------------------------------------*/
  15. /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
  16. void TC_CAL1Cache_EnDisable(void) {
  17. uint32_t orig = __get_SCTLR();
  18. L1C_EnableCaches();
  19. uint32_t sctlr = __get_SCTLR();
  20. ASSERT_TRUE((sctlr & SCTLR_I_Msk) == SCTLR_I_Msk);
  21. ASSERT_TRUE((sctlr & SCTLR_C_Msk) == SCTLR_C_Msk);
  22. L1C_CleanDCacheAll();
  23. L1C_DisableCaches();
  24. sctlr = __get_SCTLR();
  25. ASSERT_TRUE((sctlr & SCTLR_I_Msk) == 0U);
  26. ASSERT_TRUE((sctlr & SCTLR_C_Msk) == 0U);
  27. __set_SCTLR(orig);
  28. __ISB();
  29. }
  30. /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
  31. void TC_CAL1Cache_EnDisableBTAC(void) {
  32. uint32_t orig = __get_SCTLR();
  33. L1C_EnableBTAC();
  34. uint32_t sctlr = __get_SCTLR();
  35. ASSERT_TRUE((sctlr & SCTLR_Z_Msk) == SCTLR_Z_Msk);
  36. L1C_DisableBTAC();
  37. sctlr = __get_SCTLR();
  38. #if __CORTEX_A == 7
  39. // On Cortex-A7 SCTLR_Z is RAO/WI.
  40. ASSERT_TRUE((sctlr & SCTLR_Z_Msk) == SCTLR_Z_Msk);
  41. #else
  42. ASSERT_TRUE((sctlr & SCTLR_Z_Msk) == 0U);
  43. #endif
  44. __set_SCTLR(orig);
  45. __ISB();
  46. }
  47. /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
  48. void TC_CAL1Cache_log2_up(void) {
  49. uint8_t log2 = __log2_up(0U);
  50. ASSERT_TRUE(log2 == 0U);
  51. log2 = __log2_up(1U);
  52. ASSERT_TRUE(log2 == 0U);
  53. log2 = __log2_up(2U);
  54. ASSERT_TRUE(log2 == 1U);
  55. log2 = __log2_up(3U);
  56. ASSERT_TRUE(log2 == 2U);
  57. log2 = __log2_up(4U);
  58. ASSERT_TRUE(log2 == 2U);
  59. log2 = __log2_up(0x80000000U);
  60. ASSERT_TRUE(log2 == 31U);
  61. log2 = __log2_up(0x80000001U);
  62. ASSERT_TRUE(log2 == 32U);
  63. log2 = __log2_up(0xFFFFFFFFU);
  64. ASSERT_TRUE(log2 == 32U);
  65. }
  66. /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
  67. void TC_CAL1Cache_InvalidateDCacheAll(void) {
  68. /* setup */
  69. uint32_t orig = __get_SCTLR();
  70. volatile uint32_t value = 0x0815U;
  71. L1C_EnableCaches();
  72. L1C_CleanDCacheAll();
  73. /* test cached value gets lost */
  74. // WHEN a value is written
  75. value = 0x4711U;
  76. // ... and the cache is invalidated
  77. L1C_InvalidateDCacheAll();
  78. // ... and the cache is disabled
  79. L1C_DisableCaches();
  80. // THEN the new value has been lost
  81. ASSERT_TRUE(value == 0x0815U);
  82. /* tear down */
  83. L1C_InvalidateDCacheAll();
  84. __set_SCTLR(orig);
  85. __ISB();
  86. }
  87. /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
  88. void TC_CAL1Cache_CleanDCacheAll(void) {
  89. /* setup */
  90. uint32_t orig = __get_SCTLR();
  91. uint32_t value = 0x0815U;
  92. L1C_EnableCaches();
  93. L1C_CleanDCacheAll();
  94. /* test cached value is preserved */
  95. // WHEN a value is written
  96. value = 0x4711U;
  97. // ... and the cache is cleaned
  98. L1C_CleanDCacheAll();
  99. // ... and the cache is disabled
  100. L1C_DisableCaches();
  101. // THEN the new value is preserved
  102. ASSERT_TRUE(value == 0x4711U);
  103. /* tear down */
  104. L1C_InvalidateDCacheAll();
  105. __set_SCTLR(orig);
  106. __ISB();
  107. }
  108. /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
  109. void TC_CAL1Cache_CleanInvalidateDCacheAll(void) {
  110. /* setup */
  111. uint32_t orig = __get_SCTLR();
  112. uint32_t value = 0x0815U;
  113. L1C_EnableCaches();
  114. L1C_CleanDCacheAll();
  115. /* test cached value is preserved */
  116. // WHEN a value is written
  117. value = 0x4711U;
  118. // ... and the cache is cleaned/invalidated
  119. L1C_CleanInvalidateDCacheAll();
  120. // ... and the cache is disabled
  121. L1C_DisableCaches();
  122. // THEN the new value is preserved
  123. ASSERT_TRUE(value == 0x4711U);
  124. /* tear down */
  125. L1C_InvalidateDCacheAll();
  126. __set_SCTLR(orig);
  127. __ISB();
  128. }