mips-cm.h 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322
  1. /*
  2. * Copyright (C) 2013 Imagination Technologies
  3. * Author: Paul Burton <paul.burton@imgtec.com>
  4. *
  5. * This program is free software; you can redistribute it and/or modify it
  6. * under the terms of the GNU General Public License as published by the
  7. * Free Software Foundation; either version 2 of the License, or (at your
  8. * option) any later version.
  9. */
  10. #ifndef __MIPS_ASM_MIPS_CM_H__
  11. #define __MIPS_ASM_MIPS_CM_H__
  12. #include <linux/io.h>
  13. #include <linux/types.h>
  14. /* The base address of the CM GCR block */
  15. extern void __iomem *mips_cm_base;
  16. /* The base address of the CM L2-only sync region */
  17. extern void __iomem *mips_cm_l2sync_base;
  18. /**
  19. * __mips_cm_phys_base - retrieve the physical base address of the CM
  20. *
  21. * This function returns the physical base address of the Coherence Manager
  22. * global control block, or 0 if no Coherence Manager is present. It provides
  23. * a default implementation which reads the CMGCRBase register where available,
  24. * and may be overriden by platforms which determine this address in a
  25. * different way by defining a function with the same prototype except for the
  26. * name mips_cm_phys_base (without underscores).
  27. */
  28. extern phys_t __mips_cm_phys_base(void);
  29. /**
  30. * mips_cm_probe - probe for a Coherence Manager
  31. *
  32. * Attempt to detect the presence of a Coherence Manager. Returns 0 if a CM
  33. * is successfully detected, else -errno.
  34. */
  35. #ifdef CONFIG_MIPS_CM
  36. extern int mips_cm_probe(void);
  37. #else
  38. static inline int mips_cm_probe(void)
  39. {
  40. return -ENODEV;
  41. }
  42. #endif
  43. /**
  44. * mips_cm_present - determine whether a Coherence Manager is present
  45. *
  46. * Returns true if a CM is present in the system, else false.
  47. */
  48. static inline bool mips_cm_present(void)
  49. {
  50. #ifdef CONFIG_MIPS_CM
  51. return mips_cm_base != NULL;
  52. #else
  53. return false;
  54. #endif
  55. }
  56. /**
  57. * mips_cm_has_l2sync - determine whether an L2-only sync region is present
  58. *
  59. * Returns true if the system implements an L2-only sync region, else false.
  60. */
  61. static inline bool mips_cm_has_l2sync(void)
  62. {
  63. #ifdef CONFIG_MIPS_CM
  64. return mips_cm_l2sync_base != NULL;
  65. #else
  66. return false;
  67. #endif
  68. }
  69. /* Offsets to register blocks from the CM base address */
  70. #define MIPS_CM_GCB_OFS 0x0000 /* Global Control Block */
  71. #define MIPS_CM_CLCB_OFS 0x2000 /* Core Local Control Block */
  72. #define MIPS_CM_COCB_OFS 0x4000 /* Core Other Control Block */
  73. #define MIPS_CM_GDB_OFS 0x6000 /* Global Debug Block */
  74. /* Total size of the CM memory mapped registers */
  75. #define MIPS_CM_GCR_SIZE 0x8000
  76. /* Size of the L2-only sync region */
  77. #define MIPS_CM_L2SYNC_SIZE 0x1000
  78. /* Macros to ease the creation of register access functions */
  79. #define BUILD_CM_R_(name, off) \
  80. static inline u32 *addr_gcr_##name(void) \
  81. { \
  82. return (u32 *)(mips_cm_base + (off)); \
  83. } \
  84. \
  85. static inline u32 read_gcr_##name(void) \
  86. { \
  87. return __raw_readl(addr_gcr_##name()); \
  88. }
  89. #define BUILD_CM__W(name, off) \
  90. static inline void write_gcr_##name(u32 value) \
  91. { \
  92. __raw_writel(value, addr_gcr_##name()); \
  93. }
  94. #define BUILD_CM_RW(name, off) \
  95. BUILD_CM_R_(name, off) \
  96. BUILD_CM__W(name, off)
  97. #define BUILD_CM_Cx_R_(name, off) \
  98. BUILD_CM_R_(cl_##name, MIPS_CM_CLCB_OFS + (off)) \
  99. BUILD_CM_R_(co_##name, MIPS_CM_COCB_OFS + (off))
  100. #define BUILD_CM_Cx__W(name, off) \
  101. BUILD_CM__W(cl_##name, MIPS_CM_CLCB_OFS + (off)) \
  102. BUILD_CM__W(co_##name, MIPS_CM_COCB_OFS + (off))
  103. #define BUILD_CM_Cx_RW(name, off) \
  104. BUILD_CM_Cx_R_(name, off) \
  105. BUILD_CM_Cx__W(name, off)
  106. /* GCB register accessor functions */
  107. BUILD_CM_R_(config, MIPS_CM_GCB_OFS + 0x00)
  108. BUILD_CM_RW(base, MIPS_CM_GCB_OFS + 0x08)
  109. BUILD_CM_RW(access, MIPS_CM_GCB_OFS + 0x20)
  110. BUILD_CM_R_(rev, MIPS_CM_GCB_OFS + 0x30)
  111. BUILD_CM_RW(error_mask, MIPS_CM_GCB_OFS + 0x40)
  112. BUILD_CM_RW(error_cause, MIPS_CM_GCB_OFS + 0x48)
  113. BUILD_CM_RW(error_addr, MIPS_CM_GCB_OFS + 0x50)
  114. BUILD_CM_RW(error_mult, MIPS_CM_GCB_OFS + 0x58)
  115. BUILD_CM_RW(l2_only_sync_base, MIPS_CM_GCB_OFS + 0x70)
  116. BUILD_CM_RW(gic_base, MIPS_CM_GCB_OFS + 0x80)
  117. BUILD_CM_RW(cpc_base, MIPS_CM_GCB_OFS + 0x88)
  118. BUILD_CM_RW(reg0_base, MIPS_CM_GCB_OFS + 0x90)
  119. BUILD_CM_RW(reg0_mask, MIPS_CM_GCB_OFS + 0x98)
  120. BUILD_CM_RW(reg1_base, MIPS_CM_GCB_OFS + 0xa0)
  121. BUILD_CM_RW(reg1_mask, MIPS_CM_GCB_OFS + 0xa8)
  122. BUILD_CM_RW(reg2_base, MIPS_CM_GCB_OFS + 0xb0)
  123. BUILD_CM_RW(reg2_mask, MIPS_CM_GCB_OFS + 0xb8)
  124. BUILD_CM_RW(reg3_base, MIPS_CM_GCB_OFS + 0xc0)
  125. BUILD_CM_RW(reg3_mask, MIPS_CM_GCB_OFS + 0xc8)
  126. BUILD_CM_R_(gic_status, MIPS_CM_GCB_OFS + 0xd0)
  127. BUILD_CM_R_(cpc_status, MIPS_CM_GCB_OFS + 0xf0)
  128. /* Core Local & Core Other register accessor functions */
  129. BUILD_CM_Cx_RW(reset_release, 0x00)
  130. BUILD_CM_Cx_RW(coherence, 0x08)
  131. BUILD_CM_Cx_R_(config, 0x10)
  132. BUILD_CM_Cx_RW(other, 0x18)
  133. BUILD_CM_Cx_RW(reset_base, 0x20)
  134. BUILD_CM_Cx_R_(id, 0x28)
  135. BUILD_CM_Cx_RW(reset_ext_base, 0x30)
  136. BUILD_CM_Cx_R_(tcid_0_priority, 0x40)
  137. BUILD_CM_Cx_R_(tcid_1_priority, 0x48)
  138. BUILD_CM_Cx_R_(tcid_2_priority, 0x50)
  139. BUILD_CM_Cx_R_(tcid_3_priority, 0x58)
  140. BUILD_CM_Cx_R_(tcid_4_priority, 0x60)
  141. BUILD_CM_Cx_R_(tcid_5_priority, 0x68)
  142. BUILD_CM_Cx_R_(tcid_6_priority, 0x70)
  143. BUILD_CM_Cx_R_(tcid_7_priority, 0x78)
  144. BUILD_CM_Cx_R_(tcid_8_priority, 0x80)
  145. /* GCR_CONFIG register fields */
  146. #define CM_GCR_CONFIG_NUMIOCU_SHF 8
  147. #define CM_GCR_CONFIG_NUMIOCU_MSK (_ULCAST_(0xf) << 8)
  148. #define CM_GCR_CONFIG_PCORES_SHF 0
  149. #define CM_GCR_CONFIG_PCORES_MSK (_ULCAST_(0xff) << 0)
  150. /* GCR_BASE register fields */
  151. #define CM_GCR_BASE_GCRBASE_SHF 15
  152. #define CM_GCR_BASE_GCRBASE_MSK (_ULCAST_(0x1ffff) << 15)
  153. #define CM_GCR_BASE_CMDEFTGT_SHF 0
  154. #define CM_GCR_BASE_CMDEFTGT_MSK (_ULCAST_(0x3) << 0)
  155. #define CM_GCR_BASE_CMDEFTGT_DISABLED 0
  156. #define CM_GCR_BASE_CMDEFTGT_MEM 1
  157. #define CM_GCR_BASE_CMDEFTGT_IOCU0 2
  158. #define CM_GCR_BASE_CMDEFTGT_IOCU1 3
  159. /* GCR_ACCESS register fields */
  160. #define CM_GCR_ACCESS_ACCESSEN_SHF 0
  161. #define CM_GCR_ACCESS_ACCESSEN_MSK (_ULCAST_(0xff) << 0)
  162. /* GCR_REV register fields */
  163. #define CM_GCR_REV_MAJOR_SHF 8
  164. #define CM_GCR_REV_MAJOR_MSK (_ULCAST_(0xff) << 8)
  165. #define CM_GCR_REV_MINOR_SHF 0
  166. #define CM_GCR_REV_MINOR_MSK (_ULCAST_(0xff) << 0)
  167. /* GCR_ERROR_CAUSE register fields */
  168. #define CM_GCR_ERROR_CAUSE_ERRTYPE_SHF 27
  169. #define CM_GCR_ERROR_CAUSE_ERRTYPE_MSK (_ULCAST_(0x1f) << 27)
  170. #define CM_GCR_ERROR_CAUSE_ERRINFO_SHF 0
  171. #define CM_GCR_ERROR_CAUSE_ERRINGO_MSK (_ULCAST_(0x7ffffff) << 0)
  172. /* GCR_ERROR_MULT register fields */
  173. #define CM_GCR_ERROR_MULT_ERR2ND_SHF 0
  174. #define CM_GCR_ERROR_MULT_ERR2ND_MSK (_ULCAST_(0x1f) << 0)
  175. /* GCR_L2_ONLY_SYNC_BASE register fields */
  176. #define CM_GCR_L2_ONLY_SYNC_BASE_SYNCBASE_SHF 12
  177. #define CM_GCR_L2_ONLY_SYNC_BASE_SYNCBASE_MSK (_ULCAST_(0xfffff) << 12)
  178. #define CM_GCR_L2_ONLY_SYNC_BASE_SYNCEN_SHF 0
  179. #define CM_GCR_L2_ONLY_SYNC_BASE_SYNCEN_MSK (_ULCAST_(0x1) << 0)
  180. /* GCR_GIC_BASE register fields */
  181. #define CM_GCR_GIC_BASE_GICBASE_SHF 17
  182. #define CM_GCR_GIC_BASE_GICBASE_MSK (_ULCAST_(0x7fff) << 17)
  183. #define CM_GCR_GIC_BASE_GICEN_SHF 0
  184. #define CM_GCR_GIC_BASE_GICEN_MSK (_ULCAST_(0x1) << 0)
  185. /* GCR_CPC_BASE register fields */
  186. #define CM_GCR_CPC_BASE_CPCBASE_SHF 17
  187. #define CM_GCR_CPC_BASE_CPCBASE_MSK (_ULCAST_(0x7fff) << 17)
  188. #define CM_GCR_CPC_BASE_CPCEN_SHF 0
  189. #define CM_GCR_CPC_BASE_CPCEN_MSK (_ULCAST_(0x1) << 0)
  190. /* GCR_REGn_BASE register fields */
  191. #define CM_GCR_REGn_BASE_BASEADDR_SHF 16
  192. #define CM_GCR_REGn_BASE_BASEADDR_MSK (_ULCAST_(0xffff) << 16)
  193. /* GCR_REGn_MASK register fields */
  194. #define CM_GCR_REGn_MASK_ADDRMASK_SHF 16
  195. #define CM_GCR_REGn_MASK_ADDRMASK_MSK (_ULCAST_(0xffff) << 16)
  196. #define CM_GCR_REGn_MASK_CCAOVR_SHF 5
  197. #define CM_GCR_REGn_MASK_CCAOVR_MSK (_ULCAST_(0x3) << 5)
  198. #define CM_GCR_REGn_MASK_CCAOVREN_SHF 4
  199. #define CM_GCR_REGn_MASK_CCAOVREN_MSK (_ULCAST_(0x1) << 4)
  200. #define CM_GCR_REGn_MASK_DROPL2_SHF 2
  201. #define CM_GCR_REGn_MASK_DROPL2_MSK (_ULCAST_(0x1) << 2)
  202. #define CM_GCR_REGn_MASK_CMTGT_SHF 0
  203. #define CM_GCR_REGn_MASK_CMTGT_MSK (_ULCAST_(0x3) << 0)
  204. #define CM_GCR_REGn_MASK_CMTGT_DISABLED (_ULCAST_(0x0) << 0)
  205. #define CM_GCR_REGn_MASK_CMTGT_MEM (_ULCAST_(0x1) << 0)
  206. #define CM_GCR_REGn_MASK_CMTGT_IOCU0 (_ULCAST_(0x2) << 0)
  207. #define CM_GCR_REGn_MASK_CMTGT_IOCU1 (_ULCAST_(0x3) << 0)
  208. /* GCR_GIC_STATUS register fields */
  209. #define CM_GCR_GIC_STATUS_EX_SHF 0
  210. #define CM_GCR_GIC_STATUS_EX_MSK (_ULCAST_(0x1) << 0)
  211. /* GCR_CPC_STATUS register fields */
  212. #define CM_GCR_CPC_STATUS_EX_SHF 0
  213. #define CM_GCR_CPC_STATUS_EX_MSK (_ULCAST_(0x1) << 0)
  214. /* GCR_Cx_COHERENCE register fields */
  215. #define CM_GCR_Cx_COHERENCE_COHDOMAINEN_SHF 0
  216. #define CM_GCR_Cx_COHERENCE_COHDOMAINEN_MSK (_ULCAST_(0xff) << 0)
  217. /* GCR_Cx_CONFIG register fields */
  218. #define CM_GCR_Cx_CONFIG_IOCUTYPE_SHF 10
  219. #define CM_GCR_Cx_CONFIG_IOCUTYPE_MSK (_ULCAST_(0x3) << 10)
  220. #define CM_GCR_Cx_CONFIG_PVPE_SHF 0
  221. #define CM_GCR_Cx_CONFIG_PVPE_MSK (_ULCAST_(0x1ff) << 0)
  222. /* GCR_Cx_OTHER register fields */
  223. #define CM_GCR_Cx_OTHER_CORENUM_SHF 16
  224. #define CM_GCR_Cx_OTHER_CORENUM_MSK (_ULCAST_(0xffff) << 16)
  225. /* GCR_Cx_RESET_BASE register fields */
  226. #define CM_GCR_Cx_RESET_BASE_BEVEXCBASE_SHF 12
  227. #define CM_GCR_Cx_RESET_BASE_BEVEXCBASE_MSK (_ULCAST_(0xfffff) << 12)
  228. /* GCR_Cx_RESET_EXT_BASE register fields */
  229. #define CM_GCR_Cx_RESET_EXT_BASE_EVARESET_SHF 31
  230. #define CM_GCR_Cx_RESET_EXT_BASE_EVARESET_MSK (_ULCAST_(0x1) << 31)
  231. #define CM_GCR_Cx_RESET_EXT_BASE_UEB_SHF 30
  232. #define CM_GCR_Cx_RESET_EXT_BASE_UEB_MSK (_ULCAST_(0x1) << 30)
  233. #define CM_GCR_Cx_RESET_EXT_BASE_BEVEXCMASK_SHF 20
  234. #define CM_GCR_Cx_RESET_EXT_BASE_BEVEXCMASK_MSK (_ULCAST_(0xff) << 20)
  235. #define CM_GCR_Cx_RESET_EXT_BASE_BEVEXCPA_SHF 1
  236. #define CM_GCR_Cx_RESET_EXT_BASE_BEVEXCPA_MSK (_ULCAST_(0x7f) << 1)
  237. #define CM_GCR_Cx_RESET_EXT_BASE_PRESENT_SHF 0
  238. #define CM_GCR_Cx_RESET_EXT_BASE_PRESENT_MSK (_ULCAST_(0x1) << 0)
  239. /**
  240. * mips_cm_numcores - return the number of cores present in the system
  241. *
  242. * Returns the value of the PCORES field of the GCR_CONFIG register plus 1, or
  243. * zero if no Coherence Manager is present.
  244. */
  245. static inline unsigned mips_cm_numcores(void)
  246. {
  247. if (!mips_cm_present())
  248. return 0;
  249. return ((read_gcr_config() & CM_GCR_CONFIG_PCORES_MSK)
  250. >> CM_GCR_CONFIG_PCORES_SHF) + 1;
  251. }
  252. /**
  253. * mips_cm_numiocu - return the number of IOCUs present in the system
  254. *
  255. * Returns the value of the NUMIOCU field of the GCR_CONFIG register, or zero
  256. * if no Coherence Manager is present.
  257. */
  258. static inline unsigned mips_cm_numiocu(void)
  259. {
  260. if (!mips_cm_present())
  261. return 0;
  262. return (read_gcr_config() & CM_GCR_CONFIG_NUMIOCU_MSK)
  263. >> CM_GCR_CONFIG_NUMIOCU_SHF;
  264. }
  265. /**
  266. * mips_cm_l2sync - perform an L2-only sync operation
  267. *
  268. * If an L2-only sync region is present in the system then this function
  269. * performs and L2-only sync and returns zero. Otherwise it returns -ENODEV.
  270. */
  271. static inline int mips_cm_l2sync(void)
  272. {
  273. if (!mips_cm_has_l2sync())
  274. return -ENODEV;
  275. writel(0, mips_cm_l2sync_base);
  276. return 0;
  277. }
  278. #endif /* __MIPS_ASM_MIPS_CM_H__ */