mpi_hal.c 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. /*
  2. * SPDX-FileCopyrightText: 2023 Espressif Systems (Shanghai) CO LTD
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. */
  6. #include "hal/mpi_hal.h"
  7. #include "hal/mpi_ll.h"
  8. #include "sdkconfig.h"
  9. size_t mpi_hal_calc_hardware_words(size_t words)
  10. {
  11. return mpi_ll_calculate_hardware_words(words);
  12. }
  13. void mpi_hal_enable_hardware_hw_op(void)
  14. {
  15. mpi_ll_clear_power_control_bit();
  16. while (mpi_ll_check_memory_init_complete()) {
  17. }
  18. // Note: from enabling RSA clock to here takes about 1.3us
  19. #if !CONFIG_IDF_TARGET_ESP32
  20. mpi_ll_disable_interrupt();
  21. #endif
  22. }
  23. void mpi_hal_disable_hardware_hw_op(void)
  24. {
  25. mpi_ll_set_power_control_bit();
  26. }
  27. void mpi_hal_interrupt_enable(bool enable)
  28. {
  29. if (enable){
  30. mpi_ll_enable_interrupt();
  31. }
  32. else {
  33. mpi_ll_disable_interrupt();
  34. }
  35. }
  36. void mpi_hal_clear_interrupt(void)
  37. {
  38. mpi_ll_clear_interrupt();
  39. }
  40. void mpi_hal_set_mode(size_t num_words)
  41. {
  42. mpi_ll_set_mode(num_words);
  43. }
  44. void mpi_hal_write_to_mem_block(mpi_param_t param, size_t offset, const uint32_t* p, size_t n, size_t num_words)
  45. {
  46. mpi_ll_write_to_mem_block(param, offset, p, n, num_words);
  47. }
  48. void mpi_hal_write_at_offset(mpi_param_t param, int offset, uint32_t value)
  49. {
  50. mpi_ll_write_at_offset(param, offset, value);
  51. }
  52. void mpi_hal_write_m_prime(uint32_t Mprime)
  53. {
  54. mpi_ll_write_m_prime(Mprime);
  55. }
  56. void mpi_hal_write_rinv(uint32_t rinv)
  57. {
  58. mpi_ll_write_rinv(rinv);
  59. }
  60. // Acceleration options
  61. #if !CONFIG_IDF_TARGET_ESP32
  62. void mpi_hal_enable_constant_time(bool enable)
  63. {
  64. if (enable){
  65. mpi_ll_enable_constant_time();
  66. }
  67. else {
  68. mpi_ll_disable_constant_time();
  69. }
  70. }
  71. void mpi_hal_enable_search(bool enable)
  72. {
  73. if (enable){
  74. mpi_ll_enable_search();
  75. }
  76. else {
  77. mpi_ll_disable_search();
  78. }
  79. }
  80. void mpi_hal_set_search_position(size_t position)
  81. {
  82. mpi_ll_set_search_position(position);
  83. }
  84. #endif /* !CONFIG_IDF_TARGET_ESP32 */
  85. /* Begin an RSA operation.
  86. */
  87. void mpi_hal_start_op(mpi_op_t op)
  88. {
  89. /* Clear interrupt status */
  90. mpi_hal_clear_interrupt();
  91. mpi_ll_start_op(op);
  92. }
  93. /* Wait for an RSA operation to complete.
  94. */
  95. void mpi_hal_wait_op_complete(void)
  96. {
  97. while (mpi_ll_get_int_status())
  98. { }
  99. /* Clear interrupt status */
  100. mpi_hal_clear_interrupt();
  101. }
  102. void mpi_hal_read_result_hw_op(uint32_t* p, size_t n, size_t z_words)
  103. {
  104. /* Wait for an RSA operation to complete. */
  105. mpi_hal_wait_op_complete();
  106. mpi_ll_read_from_mem_block(p, n, z_words);
  107. }