atcsmu.h 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. /*
  2. * SPDX-License-Identifier: BSD-3-Clause
  3. *
  4. * Copyright (c) 2023 Andes Technology Corporation
  5. */
  6. #ifndef _SYS_ATCSMU_H
  7. #define _SYS_ATCSMU_H
  8. #include <sbi/sbi_types.h>
  9. /* clang-format off */
  10. #define PCS0_WE_OFFSET 0x90
  11. #define PCSm_WE_OFFSET(i) ((i + 3) * 0x20 + PCS0_WE_OFFSET)
  12. #define PCS0_CTL_OFFSET 0x94
  13. #define PCSm_CTL_OFFSET(i) ((i + 3) * 0x20 + PCS0_CTL_OFFSET)
  14. #define PCS_CTL_CMD_SHIFT 0
  15. #define PCS_CTL_PARAM_SHIFT 3
  16. #define SLEEP_CMD 0x3
  17. #define WAKEUP_CMD (0x0 | (1 << PCS_CTL_PARAM_SHIFT))
  18. #define LIGHTSLEEP_MODE 0
  19. #define DEEPSLEEP_MODE 1
  20. #define LIGHT_SLEEP_CMD (SLEEP_CMD | (LIGHTSLEEP_MODE << PCS_CTL_PARAM_SHIFT))
  21. #define DEEP_SLEEP_CMD (SLEEP_CMD | (DEEPSLEEP_MODE << PCS_CTL_PARAM_SHIFT))
  22. #define PCS0_CFG_OFFSET 0x80
  23. #define PCSm_CFG_OFFSET(i) ((i + 3) * 0x20 + PCS0_CFG_OFFSET)
  24. #define PCS_CFG_LIGHT_SLEEP_SHIFT 2
  25. #define PCS_CFG_LIGHT_SLEEP (1 << PCS_CFG_LIGHT_SLEEP_SHIFT)
  26. #define PCS_CFG_DEEP_SLEEP_SHIFT 3
  27. #define PCS_CFG_DEEP_SLEEP (1 << PCS_CFG_DEEP_SLEEP_SHIFT)
  28. #define RESET_VEC_LO_OFFSET 0x50
  29. #define RESET_VEC_HI_OFFSET 0x60
  30. #define RESET_VEC_8CORE_OFFSET 0x1a0
  31. #define HARTn_RESET_VEC_LO(n) (RESET_VEC_LO_OFFSET + \
  32. ((n) < 4 ? 0 : RESET_VEC_8CORE_OFFSET) + \
  33. ((n) * 0x4))
  34. #define HARTn_RESET_VEC_HI(n) (RESET_VEC_HI_OFFSET + \
  35. ((n) < 4 ? 0 : RESET_VEC_8CORE_OFFSET) + \
  36. ((n) * 0x4))
  37. #define PCS_MAX_NR 8
  38. #define FLASH_BASE 0x80000000ULL
  39. /* clang-format on */
  40. struct smu_data {
  41. unsigned long addr;
  42. };
  43. int smu_set_wakeup_events(struct smu_data *smu, u32 events, u32 hartid);
  44. bool smu_support_sleep_mode(struct smu_data *smu, u32 sleep_mode, u32 hartid);
  45. int smu_set_command(struct smu_data *smu, u32 pcs_ctl, u32 hartid);
  46. int smu_set_reset_vector(struct smu_data *smu, ulong wakeup_addr, u32 hartid);
  47. #endif /* _SYS_ATCSMU_H */