octeon-feature.h 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444
  1. /* SPDX-License-Identifier: GPL-2.0 */
  2. /*
  3. * Copyright (C) 2020 Marvell International Ltd.
  4. */
  5. #ifndef __OCTEON_FEATURE_H__
  6. #define __OCTEON_FEATURE_H__
  7. #include "cvmx-fuse.h"
  8. /*
  9. * Octeon models are declared after the macros in octeon-model.h with the
  10. * suffix _FEATURE. The individual features are declared with the
  11. * _FEATURE_ infix.
  12. */
  13. enum octeon_feature {
  14. /*
  15. * Checks on the critical path are moved to the top (8 positions)
  16. * so that the compiler generates one less insn than for the rest
  17. * of the checks.
  18. */
  19. OCTEON_FEATURE_PKND, /* CN68XX uses port kinds for packet interface */
  20. /* CN68XX has different fields in word0 - word2 */
  21. OCTEON_FEATURE_CN68XX_WQE,
  22. /*
  23. * Features
  24. */
  25. /*
  26. * Octeon models in the CN5XXX family and higher support atomic
  27. * add instructions to memory (saa/saad)
  28. */
  29. OCTEON_FEATURE_SAAD,
  30. /* Does this Octeon support the ZIP offload engine? */
  31. OCTEON_FEATURE_ZIP,
  32. /* Does this Octeon support crypto acceleration using COP2? */
  33. OCTEON_FEATURE_CRYPTO,
  34. /* Can crypto be enabled by calling cvmx_crypto_dormant_enable()? */
  35. OCTEON_FEATURE_DORM_CRYPTO,
  36. OCTEON_FEATURE_PCIE, /* Does this Octeon support PCI express? */
  37. OCTEON_FEATURE_SRIO, /* Does this Octeon support SRIO */
  38. OCTEON_FEATURE_ILK, /* Does this Octeon support Interlaken */
  39. /*
  40. * Some Octeon models support internal memory for storing
  41. * cryptographic keys
  42. */
  43. OCTEON_FEATURE_KEY_MEMORY,
  44. /* Octeon has a LED controller for banks of external LEDs */
  45. OCTEON_FEATURE_LED_CONTROLLER,
  46. OCTEON_FEATURE_TRA, /* Octeon has a trace buffer */
  47. OCTEON_FEATURE_MGMT_PORT, /* Octeon has a management port */
  48. OCTEON_FEATURE_RAID, /* Octeon has a raid unit */
  49. OCTEON_FEATURE_USB, /* Octeon has a builtin USB */
  50. /* Octeon IPD can run without using work queue entries */
  51. OCTEON_FEATURE_NO_WPTR,
  52. OCTEON_FEATURE_DFA, /* Octeon has DFA state machines */
  53. /*
  54. * Octeon MDIO block supports clause 45 transactions for
  55. * 10 Gig support
  56. */
  57. OCTEON_FEATURE_MDIO_CLAUSE_45,
  58. /*
  59. * CN52XX and CN56XX used a block named NPEI for PCIe access.
  60. * Newer chips replaced this with SLI+DPI
  61. */
  62. OCTEON_FEATURE_NPEI,
  63. OCTEON_FEATURE_HFA, /* Octeon has DFA/HFA */
  64. OCTEON_FEATURE_DFM, /* Octeon has DFM */
  65. OCTEON_FEATURE_CIU2, /* Octeon has CIU2 */
  66. /* Octeon has DMA Instruction Completion Interrupt mode */
  67. OCTEON_FEATURE_DICI_MODE,
  68. /* Octeon has Bit Select Extractor schedulor */
  69. OCTEON_FEATURE_BIT_EXTRACTOR,
  70. OCTEON_FEATURE_NAND, /* Octeon has NAND */
  71. OCTEON_FEATURE_MMC, /* Octeon has built-in MMC support */
  72. OCTEON_FEATURE_ROM, /* Octeon has built-in ROM support */
  73. OCTEON_FEATURE_AUTHENTIK, /* Octeon has Authentik ROM support */
  74. OCTEON_FEATURE_MULTICAST_TIMER, /* Octeon has multi_cast timer */
  75. OCTEON_FEATURE_MULTINODE, /* Octeon has node support */
  76. OCTEON_FEATURE_CIU3, /* Octeon has CIU3 */
  77. OCTEON_FEATURE_FPA3, /* Octeon has FPA first seen on 78XX */
  78. /* CN78XX has different fields in word0 - word2 */
  79. OCTEON_FEATURE_CN78XX_WQE,
  80. OCTEON_FEATURE_PKO3, /* Octeon has enhanced PKO block */
  81. OCTEON_FEATURE_SPI, /* Octeon supports SPI interfaces */
  82. OCTEON_FEATURE_ZIP3, /* Octeon has zip first seen on 78XX */
  83. OCTEON_FEATURE_BCH, /* Octeon supports BCH ECC */
  84. OCTEON_FEATURE_PKI, /* Octeon has PKI block */
  85. OCTEON_FEATURE_OCLA, /* Octeon has OCLA */
  86. OCTEON_FEATURE_FAU, /* Octeon has FAU */
  87. OCTEON_FEATURE_BGX, /* Octeon has BGX */
  88. OCTEON_FEATURE_BGX_MIX, /* On of the BGX is used for MIX */
  89. OCTEON_FEATURE_HNA, /* Octeon has HNA */
  90. OCTEON_FEATURE_BGX_XCV, /* Octeon has BGX XCV RGMII support */
  91. OCTEON_FEATURE_TSO, /* Octeon has tcp segmentation offload */
  92. OCTEON_FEATURE_TDM, /* Octeon has PCM/TDM support */
  93. OCTEON_FEATURE_PTP, /* Octeon has PTP support */
  94. OCTEON_MAX_FEATURE
  95. };
  96. static inline int octeon_has_feature_OCTEON_FEATURE_SAAD(void)
  97. {
  98. return true;
  99. }
  100. static inline int octeon_has_feature_OCTEON_FEATURE_ZIP(void)
  101. {
  102. if (OCTEON_IS_MODEL(OCTEON_CNF71XX) ||
  103. OCTEON_IS_MODEL(OCTEON_CN70XX) || OCTEON_IS_MODEL(OCTEON_CNF75XX))
  104. return 0;
  105. else
  106. return !cvmx_fuse_read(121);
  107. }
  108. static inline int octeon_has_feature_OCTEON_FEATURE_ZIP3(void)
  109. {
  110. return (OCTEON_IS_MODEL(OCTEON_CN78XX) ||
  111. OCTEON_IS_MODEL(OCTEON_CN73XX));
  112. }
  113. static inline int octeon_has_feature_OCTEON_FEATURE_BCH(void)
  114. {
  115. return (OCTEON_IS_MODEL(OCTEON_CN70XX) ||
  116. OCTEON_IS_MODEL(OCTEON_CNF75XX) ||
  117. OCTEON_IS_MODEL(OCTEON_CN73XX));
  118. }
  119. static inline int octeon_has_feature_OCTEON_FEATURE_CRYPTO(void)
  120. {
  121. /* OCTEON II and later */
  122. u64 val;
  123. val = csr_rd(CVMX_MIO_FUS_DAT2);
  124. if (val & MIO_FUS_DAT2_NOCRYPTO || val & MIO_FUS_DAT2_NOMUL)
  125. return 0;
  126. else if (!(val & MIO_FUS_DAT2_DORM_CRYPTO))
  127. return 1;
  128. val = csr_rd(CVMX_RNM_CTL_STATUS);
  129. return val & RNM_CTL_STATUS_EER_VAL;
  130. }
  131. static inline int octeon_has_feature_OCTEON_FEATURE_DORM_CRYPTO(void)
  132. {
  133. /* OCTEON II and later */
  134. u64 val;
  135. val = csr_rd(CVMX_MIO_FUS_DAT2);
  136. return !(val & MIO_FUS_DAT2_NOCRYPTO) && !(val & MIO_FUS_DAT2_NOMUL) &&
  137. (val & MIO_FUS_DAT2_DORM_CRYPTO);
  138. }
  139. static inline int octeon_has_feature_OCTEON_FEATURE_PCIE(void)
  140. {
  141. /* OCTEON II and later have PCIe */
  142. return true;
  143. }
  144. static inline int octeon_has_feature_OCTEON_FEATURE_SRIO(void)
  145. {
  146. if (OCTEON_IS_MODEL(OCTEON_CNF75XX)) {
  147. if (cvmx_fuse_read(1601) == 0)
  148. return 0;
  149. else
  150. return 1;
  151. } else {
  152. return (OCTEON_IS_MODEL(OCTEON_CN63XX) ||
  153. OCTEON_IS_MODEL(OCTEON_CN66XX));
  154. }
  155. }
  156. static inline int octeon_has_feature_OCTEON_FEATURE_ILK(void)
  157. {
  158. return (OCTEON_IS_MODEL(OCTEON_CN68XX) ||
  159. OCTEON_IS_MODEL(OCTEON_CN78XX));
  160. }
  161. static inline int octeon_has_feature_OCTEON_FEATURE_KEY_MEMORY(void)
  162. {
  163. /* OCTEON II or later */
  164. return true;
  165. }
  166. static inline int octeon_has_feature_OCTEON_FEATURE_LED_CONTROLLER(void)
  167. {
  168. return false;
  169. }
  170. static inline int octeon_has_feature_OCTEON_FEATURE_TRA(void)
  171. {
  172. return !OCTEON_IS_OCTEON3();
  173. }
  174. static inline int octeon_has_feature_OCTEON_FEATURE_MGMT_PORT(void)
  175. {
  176. /* OCTEON II or later */
  177. return true;
  178. }
  179. static inline int octeon_has_feature_OCTEON_FEATURE_RAID(void)
  180. {
  181. return !OCTEON_IS_MODEL(OCTEON_CNF75XX);
  182. }
  183. static inline int octeon_has_feature_OCTEON_FEATURE_USB(void)
  184. {
  185. return true;
  186. }
  187. static inline int octeon_has_feature_OCTEON_FEATURE_NO_WPTR(void)
  188. {
  189. return true;
  190. }
  191. static inline int octeon_has_feature_OCTEON_FEATURE_DFA(void)
  192. {
  193. return 0;
  194. }
  195. static inline int octeon_has_feature_OCTEON_FEATURE_HFA(void)
  196. {
  197. if (OCTEON_IS_MODEL(OCTEON_CNF75XX))
  198. return 0;
  199. else
  200. return !cvmx_fuse_read(90);
  201. }
  202. static inline int octeon_has_feature_OCTEON_FEATURE_HNA(void)
  203. {
  204. if (OCTEON_IS_MODEL(OCTEON_CN78XX) || OCTEON_IS_MODEL(OCTEON_CN73XX))
  205. return !cvmx_fuse_read(134);
  206. else
  207. return 0;
  208. }
  209. static inline int octeon_has_feature_OCTEON_FEATURE_DFM(void)
  210. {
  211. if (!(OCTEON_IS_MODEL(OCTEON_CN63XX) || OCTEON_IS_MODEL(OCTEON_CN66XX)))
  212. return 0;
  213. else
  214. return !cvmx_fuse_read(90);
  215. }
  216. static inline int octeon_has_feature_OCTEON_FEATURE_MDIO_CLAUSE_45(void)
  217. {
  218. return true;
  219. }
  220. static inline int octeon_has_feature_OCTEON_FEATURE_NPEI(void)
  221. {
  222. return false;
  223. }
  224. static inline int octeon_has_feature_OCTEON_FEATURE_PKND(void)
  225. {
  226. return OCTEON_IS_MODEL(OCTEON_CN68XX) ||
  227. OCTEON_IS_MODEL(OCTEON_CNF75XX) ||
  228. OCTEON_IS_MODEL(OCTEON_CN73XX) ||
  229. OCTEON_IS_MODEL(OCTEON_CN78XX);
  230. }
  231. static inline int octeon_has_feature_OCTEON_FEATURE_CN68XX_WQE(void)
  232. {
  233. return OCTEON_IS_MODEL(OCTEON_CN68XX);
  234. }
  235. static inline int octeon_has_feature_OCTEON_FEATURE_CIU2(void)
  236. {
  237. return OCTEON_IS_MODEL(OCTEON_CN68XX);
  238. }
  239. static inline int octeon_has_feature_OCTEON_FEATURE_CIU3(void)
  240. {
  241. return (OCTEON_IS_MODEL(OCTEON_CN78XX) ||
  242. OCTEON_IS_MODEL(OCTEON_CNF75XX) ||
  243. OCTEON_IS_MODEL(OCTEON_CN73XX));
  244. }
  245. static inline int octeon_has_feature_OCTEON_FEATURE_FPA3(void)
  246. {
  247. return (OCTEON_IS_MODEL(OCTEON_CN78XX) ||
  248. OCTEON_IS_MODEL(OCTEON_CNF75XX) ||
  249. OCTEON_IS_MODEL(OCTEON_CN73XX));
  250. }
  251. static inline int octeon_has_feature_OCTEON_FEATURE_NAND(void)
  252. {
  253. return (OCTEON_IS_MODEL(OCTEON_CN63XX) ||
  254. OCTEON_IS_MODEL(OCTEON_CN66XX) ||
  255. OCTEON_IS_MODEL(OCTEON_CN68XX) ||
  256. OCTEON_IS_MODEL(OCTEON_CN73XX) ||
  257. OCTEON_IS_MODEL(OCTEON_CNF75XX) ||
  258. OCTEON_IS_MODEL(OCTEON_CN70XX));
  259. }
  260. static inline int octeon_has_feature_OCTEON_FEATURE_DICI_MODE(void)
  261. {
  262. return (OCTEON_IS_MODEL(OCTEON_CN68XX_PASS2_X) ||
  263. OCTEON_IS_MODEL(OCTEON_CN61XX) ||
  264. OCTEON_IS_MODEL(OCTEON_CNF71XX) ||
  265. OCTEON_IS_MODEL(OCTEON_CN70XX));
  266. }
  267. static inline int octeon_has_feature_OCTEON_FEATURE_BIT_EXTRACTOR(void)
  268. {
  269. return (OCTEON_IS_MODEL(OCTEON_CN68XX_PASS2_X) ||
  270. OCTEON_IS_MODEL(OCTEON_CN61XX) ||
  271. OCTEON_IS_MODEL(OCTEON_CNF71XX) ||
  272. OCTEON_IS_MODEL(OCTEON_CN70XX));
  273. }
  274. static inline int octeon_has_feature_OCTEON_FEATURE_MMC(void)
  275. {
  276. return (OCTEON_IS_MODEL(OCTEON_CN61XX) ||
  277. OCTEON_IS_MODEL(OCTEON_CNF71XX) || OCTEON_IS_OCTEON3());
  278. }
  279. static inline int octeon_has_feature_OCTEON_FEATURE_ROM(void)
  280. {
  281. return OCTEON_IS_MODEL(OCTEON_CN66XX) ||
  282. OCTEON_IS_MODEL(OCTEON_CN61XX) ||
  283. OCTEON_IS_MODEL(OCTEON_CNF71XX);
  284. }
  285. static inline int octeon_has_feature_OCTEON_FEATURE_AUTHENTIK(void)
  286. {
  287. if (OCTEON_IS_MODEL(OCTEON_CN66XX) ||
  288. OCTEON_IS_MODEL(OCTEON_CN61XX) ||
  289. OCTEON_IS_MODEL(OCTEON_CNF71XX) ||
  290. OCTEON_IS_MODEL(OCTEON_CN70XX)) {
  291. u64 val;
  292. val = csr_rd(CVMX_MIO_FUS_DAT2);
  293. return (val & MIO_FUS_DAT2_NOCRYPTO) &&
  294. (val & MIO_FUS_DAT2_DORM_CRYPTO);
  295. }
  296. return 0;
  297. }
  298. static inline int octeon_has_feature_OCTEON_FEATURE_MULTICAST_TIMER(void)
  299. {
  300. return (OCTEON_IS_MODEL(OCTEON_CN66XX_PASS1_2) ||
  301. OCTEON_IS_MODEL(OCTEON_CN61XX) ||
  302. OCTEON_IS_MODEL(OCTEON_CNF71XX) ||
  303. OCTEON_IS_MODEL(OCTEON_CN70XX));
  304. }
  305. static inline int octeon_has_feature_OCTEON_FEATURE_MULTINODE(void)
  306. {
  307. return (!OCTEON_IS_MODEL(OCTEON_CN76XX) &&
  308. OCTEON_IS_MODEL(OCTEON_CN78XX));
  309. }
  310. static inline int octeon_has_feature_OCTEON_FEATURE_CN78XX_WQE(void)
  311. {
  312. return (OCTEON_IS_MODEL(OCTEON_CN78XX) ||
  313. OCTEON_IS_MODEL(OCTEON_CNF75XX) ||
  314. OCTEON_IS_MODEL(OCTEON_CN73XX));
  315. }
  316. static inline int octeon_has_feature_OCTEON_FEATURE_SPI(void)
  317. {
  318. return (OCTEON_IS_MODEL(OCTEON_CN66XX) ||
  319. OCTEON_IS_MODEL(OCTEON_CN61XX) ||
  320. OCTEON_IS_MODEL(OCTEON_CNF71XX) || OCTEON_IS_OCTEON3());
  321. }
  322. static inline int octeon_has_feature_OCTEON_FEATURE_PKI(void)
  323. {
  324. return (OCTEON_IS_MODEL(OCTEON_CN78XX) ||
  325. OCTEON_IS_MODEL(OCTEON_CNF75XX) ||
  326. OCTEON_IS_MODEL(OCTEON_CN73XX));
  327. }
  328. static inline int octeon_has_feature_OCTEON_FEATURE_PKO3(void)
  329. {
  330. return (OCTEON_IS_MODEL(OCTEON_CN78XX) ||
  331. OCTEON_IS_MODEL(OCTEON_CNF75XX) ||
  332. OCTEON_IS_MODEL(OCTEON_CN73XX));
  333. }
  334. static inline int octeon_has_feature_OCTEON_FEATURE_OCLA(void)
  335. {
  336. return OCTEON_IS_OCTEON3();
  337. }
  338. static inline int octeon_has_feature_OCTEON_FEATURE_FAU(void)
  339. {
  340. return (!OCTEON_IS_MODEL(OCTEON_CN78XX) &&
  341. !OCTEON_IS_MODEL(OCTEON_CNF75XX) &&
  342. !OCTEON_IS_MODEL(OCTEON_CN73XX));
  343. }
  344. static inline int octeon_has_feature_OCTEON_FEATURE_BGX(void)
  345. {
  346. return (OCTEON_IS_MODEL(OCTEON_CN78XX) ||
  347. OCTEON_IS_MODEL(OCTEON_CNF75XX) ||
  348. OCTEON_IS_MODEL(OCTEON_CN73XX));
  349. }
  350. static inline int octeon_has_feature_OCTEON_FEATURE_BGX_MIX(void)
  351. {
  352. return (OCTEON_IS_MODEL(OCTEON_CN78XX) ||
  353. OCTEON_IS_MODEL(OCTEON_CNF75XX) ||
  354. OCTEON_IS_MODEL(OCTEON_CN73XX));
  355. }
  356. static inline int octeon_has_feature_OCTEON_FEATURE_BGX_XCV(void)
  357. {
  358. return OCTEON_IS_MODEL(OCTEON_CN73XX);
  359. }
  360. static inline int octeon_has_feature_OCTEON_FEATURE_TSO(void)
  361. {
  362. return (OCTEON_IS_MODEL(OCTEON_CN73XX) ||
  363. OCTEON_IS_MODEL(OCTEON_CNF75XX) ||
  364. OCTEON_IS_MODEL(OCTEON_CN78XX_PASS2_X));
  365. }
  366. static inline int octeon_has_feature_OCTEON_FEATURE_TDM(void)
  367. {
  368. return OCTEON_IS_MODEL(OCTEON_CN61XX) ||
  369. OCTEON_IS_MODEL(OCTEON_CNF71XX) ||
  370. OCTEON_IS_MODEL(OCTEON_CN70XX);
  371. }
  372. static inline int octeon_has_feature_OCTEON_FEATURE_PTP(void)
  373. {
  374. return OCTEON_IS_MODEL(OCTEON_CN6XXX) ||
  375. OCTEON_IS_MODEL(OCTEON_CNF7XXX) ||
  376. OCTEON_IS_MODEL(OCTEON_CN73XX) ||
  377. OCTEON_IS_MODEL(OCTEON_CNF75XX) ||
  378. OCTEON_IS_MODEL(OCTEON_CN78XX_PASS2_X);
  379. }
  380. /*
  381. * Answer ``Is the bit for feature set in the bitmap?''
  382. * @param feature
  383. * Return: 1 when the feature is present and 0 otherwise, -1 in case of error.
  384. */
  385. #define octeon_has_feature(feature_x) octeon_has_feature_##feature_x()
  386. #endif /* __OCTEON_FEATURE_H__ */