phytium_cpu.c 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. /*
  2. * Copyright (c) 2006-2021, RT-Thread Development Team
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Email: opensource_embedded@phytium.com.cn
  7. *
  8. * Change Logs:
  9. * Date Author Notes
  10. * 2022-10-26 huanghe first commit
  11. *
  12. */
  13. #include "rtconfig.h"
  14. #include <rtthread.h>
  15. #include "gicv3.h"
  16. #include "fparameters.h"
  17. #include "fcpu_info.h"
  18. #include "phytium_cpu.h"
  19. int phytium_cpu_id_mapping(int cpu_id)
  20. {
  21. #if defined(TARGET_E2000Q)
  22. switch (cpu_id)
  23. {
  24. case 0:
  25. return 2;
  26. case 1:
  27. return 3;
  28. case 2:
  29. return 0;
  30. case 3:
  31. return 1;
  32. default:
  33. RT_ASSERT(0);
  34. return 0;
  35. break;
  36. }
  37. #else
  38. return (int)cpu_id;
  39. #endif
  40. }
  41. #if defined(TARGET_ARMV8_AARCH64)
  42. int phytium_cpu_id(void)
  43. {
  44. FError ret;
  45. u32 cpu_id;
  46. ret = GetCpuId(&cpu_id);
  47. if (ret != ERR_SUCCESS)
  48. {
  49. RT_ASSERT(0);
  50. }
  51. return phytium_cpu_id_mapping(cpu_id);
  52. };
  53. #else
  54. int rt_hw_cpu_id(void)
  55. {
  56. FError ret;
  57. u32 cpu_id;
  58. ret = GetCpuId(&cpu_id);
  59. if (ret != ERR_SUCCESS)
  60. {
  61. RT_ASSERT(0);
  62. }
  63. return phytium_cpu_id_mapping(cpu_id);
  64. };
  65. rt_uint64_t get_main_cpu_affval(void)
  66. {
  67. #if defined(TARGET_E2000Q)
  68. return CORE2_AFF;
  69. #else
  70. return CORE0_AFF;
  71. #endif
  72. }
  73. extern u32 GetCpuMaskToAffval(u32 *cpu_mask, u32 *cluster_id, u32 *target_list);
  74. rt_uint32_t arm_gic_cpumask_to_affval(rt_uint32_t *cpu_mask, rt_uint32_t *cluster_id, rt_uint32_t *target_list)
  75. {
  76. return GetCpuMaskToAffval(cpu_mask, cluster_id, target_list);
  77. }
  78. #ifdef RT_USING_SMP
  79. void send_core_isg(void)
  80. {
  81. for (rt_size_t i = 0; i <= 0xf; i++)
  82. {
  83. /* code */
  84. rt_kprintf("i %x \r\n", i);
  85. arm_gic_send_affinity_sgi(0, 0, i, 0);
  86. rt_thread_mdelay(100);
  87. }
  88. }
  89. MSH_CMD_EXPORT(send_core_isg, send_core_isg);
  90. #endif
  91. #endif