hpm_misc.h 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. /*
  2. * Copyright (c) 2021 HPMicro
  3. *
  4. * SPDX-License-Identifier: BSD-3-Clause
  5. *
  6. */
  7. #ifndef HPM_MISC_H
  8. #define HPM_MISC_H
  9. #define ILM_LOCAL_BASE (0x0U)
  10. #define ILM_SIZE_IN_BYTE (0x40000U)
  11. #define DLM_LOCAL_BASE (0x80000U)
  12. #define DLM_SIZE_IN_BYTE (0x40000U)
  13. #define CORE0_ILM_SYSTEM_BASE (0x1000000U)
  14. #define CORE0_DLM_SYSTEM_BASE (0x1040000U)
  15. #define CORE1_ILM_SYSTEM_BASE (0x1180000U)
  16. #define CORE1_DLM_SYSTEM_BASE (0x11C0000U)
  17. #define ADDRESS_IN_ILM(address) \
  18. ((ILM_LOCAL_BASE + ILM_SIZE_IN_BYTE) > (address))
  19. #define ADDRESS_IN_DLM(address) \
  20. (((DLM_LOCAL_BASE) <= (address)) && \
  21. ((DLM_LOCAL_BASE + DLM_SIZE_IN_BYTE) > (address)))
  22. #define ADDRESS_IN_CORE0_ILM_SYSTEM(address) \
  23. (((CORE0_ILM_SYSTEM_BASE) <= (address)) && \
  24. ((CORE0_ILM_SYSTEM_BASE + ILM_SIZE_IN_BYTE) > (address)))
  25. #define ADDRESS_IN_CORE0_DLM_SYSTEM(address) \
  26. (((CORE0_DLM_SYSTEM_BASE) <= (address)) && \
  27. ((CORE0_DLM_SYSTEM_BASE + DLM_SIZE_IN_BYTE) > (address)))
  28. #define ADDRESS_IN_CORE1_ILM_SYSTEM(address) \
  29. (((CORE1_ILM_SYSTEM_BASE) <= (address)) && \
  30. ((CORE1_ILM_SYSTEM_BASE + ILM_SIZE_IN_BYTE) > (address)))
  31. #define ADDRESS_IN_CORE1_DLM_SYSTEM(address) \
  32. (((CORE1_DLM_SYSTEM_BASE) <= (address)) && \
  33. ((CORE1_DLM_SYSTEM_BASE + DLM_SIZE_IN_BYTE) > (address)))
  34. #define DLM_TO_SYSTEM(address) \
  35. (CORE0_DLM_SYSTEM_BASE + (address) - (DLM_LOCAL_BASE))
  36. #define ILM_TO_SYSTEM(address) \
  37. (CORE0_ILM_SYSTEM_BASE + (address) - (ILM_LOCAL_BASE))
  38. #define SYSTEM_TO_DLM(address) \
  39. ((address) - CORE0_DLM_SYSTEM_BASE + (DLM_LOCAL_BASE))
  40. #define HPM_CORE0 (0U)
  41. #define HPM_CORE1 (1U)
  42. /* map core local memory(DLM/ILM) to system address */
  43. static inline uint32_t core_local_mem_to_sys_address(uint8_t core_id, uint32_t addr)
  44. {
  45. uint32_t sys_addr;
  46. if (ADDRESS_IN_ILM(addr)) {
  47. sys_addr = ILM_TO_SYSTEM(addr);
  48. } else if (ADDRESS_IN_DLM(addr)) {
  49. sys_addr = DLM_TO_SYSTEM(addr);
  50. } else {
  51. return addr;
  52. }
  53. if (core_id == HPM_CORE1) {
  54. sys_addr += CORE1_ILM_SYSTEM_BASE - CORE0_ILM_SYSTEM_BASE;
  55. }
  56. return sys_addr;
  57. }
  58. /* map system address to core local memory(DLM/ILM) */
  59. static inline uint32_t sys_address_to_core_local_mem(uint8_t core_id, uint32_t addr)
  60. {
  61. if (core_id == HPM_CORE1) {
  62. if (ADDRESS_IN_CORE1_DLM_SYSTEM(addr)) {
  63. addr = (addr - CORE1_DLM_SYSTEM_BASE) + DLM_LOCAL_BASE;
  64. } else if (ADDRESS_IN_CORE1_ILM_SYSTEM(addr)) {
  65. addr = (addr - CORE1_ILM_SYSTEM_BASE) + ILM_LOCAL_BASE;
  66. }
  67. } else {
  68. if (ADDRESS_IN_CORE0_DLM_SYSTEM(addr)) {
  69. addr = (addr - CORE0_DLM_SYSTEM_BASE) + DLM_LOCAL_BASE;
  70. } else if (ADDRESS_IN_CORE0_ILM_SYSTEM(addr)) {
  71. addr = (addr - CORE0_ILM_SYSTEM_BASE) + ILM_LOCAL_BASE;
  72. }
  73. }
  74. return addr;
  75. }
  76. #endif /* HPM_MISC_H */