mips-cpc.h 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  1. /* SPDX-License-Identifier: GPL-2.0-or-later */
  2. /*
  3. * Copyright (C) 2013 Imagination Technologies
  4. * Author: Paul Burton <[email protected]>
  5. */
  6. #ifndef __MIPS_ASM_MIPS_CPS_H__
  7. # error Please include asm/mips-cps.h rather than asm/mips-cpc.h
  8. #endif
  9. #ifndef __MIPS_ASM_MIPS_CPC_H__
  10. #define __MIPS_ASM_MIPS_CPC_H__
  11. #include <linux/bitops.h>
  12. #include <linux/errno.h>
  13. /* The base address of the CPC registers */
  14. extern void __iomem *mips_cpc_base;
  15. /**
  16. * mips_cpc_default_phys_base - retrieve the default physical base address of
  17. * the CPC
  18. *
  19. * Returns the default physical base address of the Cluster Power Controller
  20. * memory mapped registers. This is platform dependant & must therefore be
  21. * implemented per-platform.
  22. */
  23. extern phys_addr_t mips_cpc_default_phys_base(void);
  24. /**
  25. * mips_cpc_probe - probe for a Cluster Power Controller
  26. *
  27. * Attempt to detect the presence of a Cluster Power Controller. Returns 0 if
  28. * a CPC is successfully detected, else -errno.
  29. */
  30. #ifdef CONFIG_MIPS_CPC
  31. extern int mips_cpc_probe(void);
  32. #else
  33. static inline int mips_cpc_probe(void)
  34. {
  35. return -ENODEV;
  36. }
  37. #endif
  38. /**
  39. * mips_cpc_present - determine whether a Cluster Power Controller is present
  40. *
  41. * Returns true if a CPC is present in the system, else false.
  42. */
  43. static inline bool mips_cpc_present(void)
  44. {
  45. #ifdef CONFIG_MIPS_CPC
  46. return mips_cpc_base != NULL;
  47. #else
  48. return false;
  49. #endif
  50. }
  51. /* Offsets from the CPC base address to various control blocks */
  52. #define MIPS_CPC_GCB_OFS 0x0000
  53. #define MIPS_CPC_CLCB_OFS 0x2000
  54. #define MIPS_CPC_COCB_OFS 0x4000
  55. #define CPC_ACCESSOR_RO(sz, off, name) \
  56. CPS_ACCESSOR_RO(cpc, sz, MIPS_CPC_GCB_OFS + off, name) \
  57. CPS_ACCESSOR_RO(cpc, sz, MIPS_CPC_COCB_OFS + off, redir_##name)
  58. #define CPC_ACCESSOR_RW(sz, off, name) \
  59. CPS_ACCESSOR_RW(cpc, sz, MIPS_CPC_GCB_OFS + off, name) \
  60. CPS_ACCESSOR_RW(cpc, sz, MIPS_CPC_COCB_OFS + off, redir_##name)
  61. #define CPC_CX_ACCESSOR_RO(sz, off, name) \
  62. CPS_ACCESSOR_RO(cpc, sz, MIPS_CPC_CLCB_OFS + off, cl_##name) \
  63. CPS_ACCESSOR_RO(cpc, sz, MIPS_CPC_COCB_OFS + off, co_##name)
  64. #define CPC_CX_ACCESSOR_RW(sz, off, name) \
  65. CPS_ACCESSOR_RW(cpc, sz, MIPS_CPC_CLCB_OFS + off, cl_##name) \
  66. CPS_ACCESSOR_RW(cpc, sz, MIPS_CPC_COCB_OFS + off, co_##name)
  67. /* CPC_ACCESS - Control core/IOCU access to CPC registers prior to CM 3 */
  68. CPC_ACCESSOR_RW(32, 0x000, access)
  69. /* CPC_SEQDEL - Configure delays between command sequencer steps */
  70. CPC_ACCESSOR_RW(32, 0x008, seqdel)
  71. /* CPC_RAIL - Configure the delay from rail power-up to stability */
  72. CPC_ACCESSOR_RW(32, 0x010, rail)
  73. /* CPC_RESETLEN - Configure the length of reset sequences */
  74. CPC_ACCESSOR_RW(32, 0x018, resetlen)
  75. /* CPC_REVISION - Indicates the revisison of the CPC */
  76. CPC_ACCESSOR_RO(32, 0x020, revision)
  77. /* CPC_PWRUP_CTL - Control power to the Coherence Manager (CM) */
  78. CPC_ACCESSOR_RW(32, 0x030, pwrup_ctl)
  79. #define CPC_PWRUP_CTL_CM_PWRUP BIT(0)
  80. /* CPC_CONFIG - Mirrors GCR_CONFIG */
  81. CPC_ACCESSOR_RW(64, 0x138, config)
  82. /* CPC_SYS_CONFIG - Control cluster endianness */
  83. CPC_ACCESSOR_RW(32, 0x140, sys_config)
  84. #define CPC_SYS_CONFIG_BE_IMMEDIATE BIT(2)
  85. #define CPC_SYS_CONFIG_BE_STATUS BIT(1)
  86. #define CPC_SYS_CONFIG_BE BIT(0)
  87. /* CPC_Cx_CMD - Instruct the CPC to take action on a core */
  88. CPC_CX_ACCESSOR_RW(32, 0x000, cmd)
  89. #define CPC_Cx_CMD GENMASK(3, 0)
  90. #define CPC_Cx_CMD_CLOCKOFF 0x1
  91. #define CPC_Cx_CMD_PWRDOWN 0x2
  92. #define CPC_Cx_CMD_PWRUP 0x3
  93. #define CPC_Cx_CMD_RESET 0x4
  94. /* CPC_Cx_STAT_CONF - Indicates core configuration & state */
  95. CPC_CX_ACCESSOR_RW(32, 0x008, stat_conf)
  96. #define CPC_Cx_STAT_CONF_PWRUPE BIT(23)
  97. #define CPC_Cx_STAT_CONF_SEQSTATE GENMASK(22, 19)
  98. #define CPC_Cx_STAT_CONF_SEQSTATE_D0 0x0
  99. #define CPC_Cx_STAT_CONF_SEQSTATE_U0 0x1
  100. #define CPC_Cx_STAT_CONF_SEQSTATE_U1 0x2
  101. #define CPC_Cx_STAT_CONF_SEQSTATE_U2 0x3
  102. #define CPC_Cx_STAT_CONF_SEQSTATE_U3 0x4
  103. #define CPC_Cx_STAT_CONF_SEQSTATE_U4 0x5
  104. #define CPC_Cx_STAT_CONF_SEQSTATE_U5 0x6
  105. #define CPC_Cx_STAT_CONF_SEQSTATE_U6 0x7
  106. #define CPC_Cx_STAT_CONF_SEQSTATE_D1 0x8
  107. #define CPC_Cx_STAT_CONF_SEQSTATE_D3 0x9
  108. #define CPC_Cx_STAT_CONF_SEQSTATE_D2 0xa
  109. #define CPC_Cx_STAT_CONF_CLKGAT_IMPL BIT(17)
  110. #define CPC_Cx_STAT_CONF_PWRDN_IMPL BIT(16)
  111. #define CPC_Cx_STAT_CONF_EJTAG_PROBE BIT(15)
  112. /* CPC_Cx_OTHER - Configure the core-other register block prior to CM 3 */
  113. CPC_CX_ACCESSOR_RW(32, 0x010, other)
  114. #define CPC_Cx_OTHER_CORENUM GENMASK(23, 16)
  115. /* CPC_Cx_VP_STOP - Stop Virtual Processors (VPs) within a core from running */
  116. CPC_CX_ACCESSOR_RW(32, 0x020, vp_stop)
  117. /* CPC_Cx_VP_START - Start Virtual Processors (VPs) within a core running */
  118. CPC_CX_ACCESSOR_RW(32, 0x028, vp_run)
  119. /* CPC_Cx_VP_RUNNING - Indicate which Virtual Processors (VPs) are running */
  120. CPC_CX_ACCESSOR_RW(32, 0x030, vp_running)
  121. /* CPC_Cx_CONFIG - Mirrors GCR_Cx_CONFIG */
  122. CPC_CX_ACCESSOR_RW(32, 0x090, config)
  123. #ifdef CONFIG_MIPS_CPC
  124. /**
  125. * mips_cpc_lock_other - lock access to another core
  126. * core: the other core to be accessed
  127. *
  128. * Call before operating upon a core via the 'other' register region in
  129. * order to prevent the region being moved during access. Must be called
  130. * within the bounds of a mips_cm_{lock,unlock}_other pair, and followed
  131. * by a call to mips_cpc_unlock_other.
  132. */
  133. extern void mips_cpc_lock_other(unsigned int core);
  134. /**
  135. * mips_cpc_unlock_other - unlock access to another core
  136. *
  137. * Call after operating upon another core via the 'other' register region.
  138. * Must be called after mips_cpc_lock_other.
  139. */
  140. extern void mips_cpc_unlock_other(void);
  141. #else /* !CONFIG_MIPS_CPC */
  142. static inline void mips_cpc_lock_other(unsigned int core) { }
  143. static inline void mips_cpc_unlock_other(void) { }
  144. #endif /* !CONFIG_MIPS_CPC */
  145. #endif /* __MIPS_ASM_MIPS_CPC_H__ */