123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444 |
- /* SPDX-License-Identifier: GPL-2.0 */
- /*
- * Copyright (C) 2020 Marvell International Ltd.
- */
- #ifndef __OCTEON_FEATURE_H__
- #define __OCTEON_FEATURE_H__
- #include "cvmx-fuse.h"
- /*
- * Octeon models are declared after the macros in octeon-model.h with the
- * suffix _FEATURE. The individual features are declared with the
- * _FEATURE_ infix.
- */
- enum octeon_feature {
- /*
- * Checks on the critical path are moved to the top (8 positions)
- * so that the compiler generates one less insn than for the rest
- * of the checks.
- */
- OCTEON_FEATURE_PKND, /* CN68XX uses port kinds for packet interface */
- /* CN68XX has different fields in word0 - word2 */
- OCTEON_FEATURE_CN68XX_WQE,
- /*
- * Features
- */
- /*
- * Octeon models in the CN5XXX family and higher support atomic
- * add instructions to memory (saa/saad)
- */
- OCTEON_FEATURE_SAAD,
- /* Does this Octeon support the ZIP offload engine? */
- OCTEON_FEATURE_ZIP,
- /* Does this Octeon support crypto acceleration using COP2? */
- OCTEON_FEATURE_CRYPTO,
- /* Can crypto be enabled by calling cvmx_crypto_dormant_enable()? */
- OCTEON_FEATURE_DORM_CRYPTO,
- OCTEON_FEATURE_PCIE, /* Does this Octeon support PCI express? */
- OCTEON_FEATURE_SRIO, /* Does this Octeon support SRIO */
- OCTEON_FEATURE_ILK, /* Does this Octeon support Interlaken */
- /*
- * Some Octeon models support internal memory for storing
- * cryptographic keys
- */
- OCTEON_FEATURE_KEY_MEMORY,
- /* Octeon has a LED controller for banks of external LEDs */
- OCTEON_FEATURE_LED_CONTROLLER,
- OCTEON_FEATURE_TRA, /* Octeon has a trace buffer */
- OCTEON_FEATURE_MGMT_PORT, /* Octeon has a management port */
- OCTEON_FEATURE_RAID, /* Octeon has a raid unit */
- OCTEON_FEATURE_USB, /* Octeon has a builtin USB */
- /* Octeon IPD can run without using work queue entries */
- OCTEON_FEATURE_NO_WPTR,
- OCTEON_FEATURE_DFA, /* Octeon has DFA state machines */
- /*
- * Octeon MDIO block supports clause 45 transactions for
- * 10 Gig support
- */
- OCTEON_FEATURE_MDIO_CLAUSE_45,
- /*
- * CN52XX and CN56XX used a block named NPEI for PCIe access.
- * Newer chips replaced this with SLI+DPI
- */
- OCTEON_FEATURE_NPEI,
- OCTEON_FEATURE_HFA, /* Octeon has DFA/HFA */
- OCTEON_FEATURE_DFM, /* Octeon has DFM */
- OCTEON_FEATURE_CIU2, /* Octeon has CIU2 */
- /* Octeon has DMA Instruction Completion Interrupt mode */
- OCTEON_FEATURE_DICI_MODE,
- /* Octeon has Bit Select Extractor schedulor */
- OCTEON_FEATURE_BIT_EXTRACTOR,
- OCTEON_FEATURE_NAND, /* Octeon has NAND */
- OCTEON_FEATURE_MMC, /* Octeon has built-in MMC support */
- OCTEON_FEATURE_ROM, /* Octeon has built-in ROM support */
- OCTEON_FEATURE_AUTHENTIK, /* Octeon has Authentik ROM support */
- OCTEON_FEATURE_MULTICAST_TIMER, /* Octeon has multi_cast timer */
- OCTEON_FEATURE_MULTINODE, /* Octeon has node support */
- OCTEON_FEATURE_CIU3, /* Octeon has CIU3 */
- OCTEON_FEATURE_FPA3, /* Octeon has FPA first seen on 78XX */
- /* CN78XX has different fields in word0 - word2 */
- OCTEON_FEATURE_CN78XX_WQE,
- OCTEON_FEATURE_PKO3, /* Octeon has enhanced PKO block */
- OCTEON_FEATURE_SPI, /* Octeon supports SPI interfaces */
- OCTEON_FEATURE_ZIP3, /* Octeon has zip first seen on 78XX */
- OCTEON_FEATURE_BCH, /* Octeon supports BCH ECC */
- OCTEON_FEATURE_PKI, /* Octeon has PKI block */
- OCTEON_FEATURE_OCLA, /* Octeon has OCLA */
- OCTEON_FEATURE_FAU, /* Octeon has FAU */
- OCTEON_FEATURE_BGX, /* Octeon has BGX */
- OCTEON_FEATURE_BGX_MIX, /* On of the BGX is used for MIX */
- OCTEON_FEATURE_HNA, /* Octeon has HNA */
- OCTEON_FEATURE_BGX_XCV, /* Octeon has BGX XCV RGMII support */
- OCTEON_FEATURE_TSO, /* Octeon has tcp segmentation offload */
- OCTEON_FEATURE_TDM, /* Octeon has PCM/TDM support */
- OCTEON_FEATURE_PTP, /* Octeon has PTP support */
- OCTEON_MAX_FEATURE
- };
- static inline int octeon_has_feature_OCTEON_FEATURE_SAAD(void)
- {
- return true;
- }
- static inline int octeon_has_feature_OCTEON_FEATURE_ZIP(void)
- {
- if (OCTEON_IS_MODEL(OCTEON_CNF71XX) ||
- OCTEON_IS_MODEL(OCTEON_CN70XX) || OCTEON_IS_MODEL(OCTEON_CNF75XX))
- return 0;
- else
- return !cvmx_fuse_read(121);
- }
- static inline int octeon_has_feature_OCTEON_FEATURE_ZIP3(void)
- {
- return (OCTEON_IS_MODEL(OCTEON_CN78XX) ||
- OCTEON_IS_MODEL(OCTEON_CN73XX));
- }
- static inline int octeon_has_feature_OCTEON_FEATURE_BCH(void)
- {
- return (OCTEON_IS_MODEL(OCTEON_CN70XX) ||
- OCTEON_IS_MODEL(OCTEON_CNF75XX) ||
- OCTEON_IS_MODEL(OCTEON_CN73XX));
- }
- static inline int octeon_has_feature_OCTEON_FEATURE_CRYPTO(void)
- {
- /* OCTEON II and later */
- u64 val;
- val = csr_rd(CVMX_MIO_FUS_DAT2);
- if (val & MIO_FUS_DAT2_NOCRYPTO || val & MIO_FUS_DAT2_NOMUL)
- return 0;
- else if (!(val & MIO_FUS_DAT2_DORM_CRYPTO))
- return 1;
- val = csr_rd(CVMX_RNM_CTL_STATUS);
- return val & RNM_CTL_STATUS_EER_VAL;
- }
- static inline int octeon_has_feature_OCTEON_FEATURE_DORM_CRYPTO(void)
- {
- /* OCTEON II and later */
- u64 val;
- val = csr_rd(CVMX_MIO_FUS_DAT2);
- return !(val & MIO_FUS_DAT2_NOCRYPTO) && !(val & MIO_FUS_DAT2_NOMUL) &&
- (val & MIO_FUS_DAT2_DORM_CRYPTO);
- }
- static inline int octeon_has_feature_OCTEON_FEATURE_PCIE(void)
- {
- /* OCTEON II and later have PCIe */
- return true;
- }
- static inline int octeon_has_feature_OCTEON_FEATURE_SRIO(void)
- {
- if (OCTEON_IS_MODEL(OCTEON_CNF75XX)) {
- if (cvmx_fuse_read(1601) == 0)
- return 0;
- else
- return 1;
- } else {
- return (OCTEON_IS_MODEL(OCTEON_CN63XX) ||
- OCTEON_IS_MODEL(OCTEON_CN66XX));
- }
- }
- static inline int octeon_has_feature_OCTEON_FEATURE_ILK(void)
- {
- return (OCTEON_IS_MODEL(OCTEON_CN68XX) ||
- OCTEON_IS_MODEL(OCTEON_CN78XX));
- }
- static inline int octeon_has_feature_OCTEON_FEATURE_KEY_MEMORY(void)
- {
- /* OCTEON II or later */
- return true;
- }
- static inline int octeon_has_feature_OCTEON_FEATURE_LED_CONTROLLER(void)
- {
- return false;
- }
- static inline int octeon_has_feature_OCTEON_FEATURE_TRA(void)
- {
- return !OCTEON_IS_OCTEON3();
- }
- static inline int octeon_has_feature_OCTEON_FEATURE_MGMT_PORT(void)
- {
- /* OCTEON II or later */
- return true;
- }
- static inline int octeon_has_feature_OCTEON_FEATURE_RAID(void)
- {
- return !OCTEON_IS_MODEL(OCTEON_CNF75XX);
- }
- static inline int octeon_has_feature_OCTEON_FEATURE_USB(void)
- {
- return true;
- }
- static inline int octeon_has_feature_OCTEON_FEATURE_NO_WPTR(void)
- {
- return true;
- }
- static inline int octeon_has_feature_OCTEON_FEATURE_DFA(void)
- {
- return 0;
- }
- static inline int octeon_has_feature_OCTEON_FEATURE_HFA(void)
- {
- if (OCTEON_IS_MODEL(OCTEON_CNF75XX))
- return 0;
- else
- return !cvmx_fuse_read(90);
- }
- static inline int octeon_has_feature_OCTEON_FEATURE_HNA(void)
- {
- if (OCTEON_IS_MODEL(OCTEON_CN78XX) || OCTEON_IS_MODEL(OCTEON_CN73XX))
- return !cvmx_fuse_read(134);
- else
- return 0;
- }
- static inline int octeon_has_feature_OCTEON_FEATURE_DFM(void)
- {
- if (!(OCTEON_IS_MODEL(OCTEON_CN63XX) || OCTEON_IS_MODEL(OCTEON_CN66XX)))
- return 0;
- else
- return !cvmx_fuse_read(90);
- }
- static inline int octeon_has_feature_OCTEON_FEATURE_MDIO_CLAUSE_45(void)
- {
- return true;
- }
- static inline int octeon_has_feature_OCTEON_FEATURE_NPEI(void)
- {
- return false;
- }
- static inline int octeon_has_feature_OCTEON_FEATURE_PKND(void)
- {
- return OCTEON_IS_MODEL(OCTEON_CN68XX) ||
- OCTEON_IS_MODEL(OCTEON_CNF75XX) ||
- OCTEON_IS_MODEL(OCTEON_CN73XX) ||
- OCTEON_IS_MODEL(OCTEON_CN78XX);
- }
- static inline int octeon_has_feature_OCTEON_FEATURE_CN68XX_WQE(void)
- {
- return OCTEON_IS_MODEL(OCTEON_CN68XX);
- }
- static inline int octeon_has_feature_OCTEON_FEATURE_CIU2(void)
- {
- return OCTEON_IS_MODEL(OCTEON_CN68XX);
- }
- static inline int octeon_has_feature_OCTEON_FEATURE_CIU3(void)
- {
- return (OCTEON_IS_MODEL(OCTEON_CN78XX) ||
- OCTEON_IS_MODEL(OCTEON_CNF75XX) ||
- OCTEON_IS_MODEL(OCTEON_CN73XX));
- }
- static inline int octeon_has_feature_OCTEON_FEATURE_FPA3(void)
- {
- return (OCTEON_IS_MODEL(OCTEON_CN78XX) ||
- OCTEON_IS_MODEL(OCTEON_CNF75XX) ||
- OCTEON_IS_MODEL(OCTEON_CN73XX));
- }
- static inline int octeon_has_feature_OCTEON_FEATURE_NAND(void)
- {
- return (OCTEON_IS_MODEL(OCTEON_CN63XX) ||
- OCTEON_IS_MODEL(OCTEON_CN66XX) ||
- OCTEON_IS_MODEL(OCTEON_CN68XX) ||
- OCTEON_IS_MODEL(OCTEON_CN73XX) ||
- OCTEON_IS_MODEL(OCTEON_CNF75XX) ||
- OCTEON_IS_MODEL(OCTEON_CN70XX));
- }
- static inline int octeon_has_feature_OCTEON_FEATURE_DICI_MODE(void)
- {
- return (OCTEON_IS_MODEL(OCTEON_CN68XX_PASS2_X) ||
- OCTEON_IS_MODEL(OCTEON_CN61XX) ||
- OCTEON_IS_MODEL(OCTEON_CNF71XX) ||
- OCTEON_IS_MODEL(OCTEON_CN70XX));
- }
- static inline int octeon_has_feature_OCTEON_FEATURE_BIT_EXTRACTOR(void)
- {
- return (OCTEON_IS_MODEL(OCTEON_CN68XX_PASS2_X) ||
- OCTEON_IS_MODEL(OCTEON_CN61XX) ||
- OCTEON_IS_MODEL(OCTEON_CNF71XX) ||
- OCTEON_IS_MODEL(OCTEON_CN70XX));
- }
- static inline int octeon_has_feature_OCTEON_FEATURE_MMC(void)
- {
- return (OCTEON_IS_MODEL(OCTEON_CN61XX) ||
- OCTEON_IS_MODEL(OCTEON_CNF71XX) || OCTEON_IS_OCTEON3());
- }
- static inline int octeon_has_feature_OCTEON_FEATURE_ROM(void)
- {
- return OCTEON_IS_MODEL(OCTEON_CN66XX) ||
- OCTEON_IS_MODEL(OCTEON_CN61XX) ||
- OCTEON_IS_MODEL(OCTEON_CNF71XX);
- }
- static inline int octeon_has_feature_OCTEON_FEATURE_AUTHENTIK(void)
- {
- if (OCTEON_IS_MODEL(OCTEON_CN66XX) ||
- OCTEON_IS_MODEL(OCTEON_CN61XX) ||
- OCTEON_IS_MODEL(OCTEON_CNF71XX) ||
- OCTEON_IS_MODEL(OCTEON_CN70XX)) {
- u64 val;
- val = csr_rd(CVMX_MIO_FUS_DAT2);
- return (val & MIO_FUS_DAT2_NOCRYPTO) &&
- (val & MIO_FUS_DAT2_DORM_CRYPTO);
- }
- return 0;
- }
- static inline int octeon_has_feature_OCTEON_FEATURE_MULTICAST_TIMER(void)
- {
- return (OCTEON_IS_MODEL(OCTEON_CN66XX_PASS1_2) ||
- OCTEON_IS_MODEL(OCTEON_CN61XX) ||
- OCTEON_IS_MODEL(OCTEON_CNF71XX) ||
- OCTEON_IS_MODEL(OCTEON_CN70XX));
- }
- static inline int octeon_has_feature_OCTEON_FEATURE_MULTINODE(void)
- {
- return (!OCTEON_IS_MODEL(OCTEON_CN76XX) &&
- OCTEON_IS_MODEL(OCTEON_CN78XX));
- }
- static inline int octeon_has_feature_OCTEON_FEATURE_CN78XX_WQE(void)
- {
- return (OCTEON_IS_MODEL(OCTEON_CN78XX) ||
- OCTEON_IS_MODEL(OCTEON_CNF75XX) ||
- OCTEON_IS_MODEL(OCTEON_CN73XX));
- }
- static inline int octeon_has_feature_OCTEON_FEATURE_SPI(void)
- {
- return (OCTEON_IS_MODEL(OCTEON_CN66XX) ||
- OCTEON_IS_MODEL(OCTEON_CN61XX) ||
- OCTEON_IS_MODEL(OCTEON_CNF71XX) || OCTEON_IS_OCTEON3());
- }
- static inline int octeon_has_feature_OCTEON_FEATURE_PKI(void)
- {
- return (OCTEON_IS_MODEL(OCTEON_CN78XX) ||
- OCTEON_IS_MODEL(OCTEON_CNF75XX) ||
- OCTEON_IS_MODEL(OCTEON_CN73XX));
- }
- static inline int octeon_has_feature_OCTEON_FEATURE_PKO3(void)
- {
- return (OCTEON_IS_MODEL(OCTEON_CN78XX) ||
- OCTEON_IS_MODEL(OCTEON_CNF75XX) ||
- OCTEON_IS_MODEL(OCTEON_CN73XX));
- }
- static inline int octeon_has_feature_OCTEON_FEATURE_OCLA(void)
- {
- return OCTEON_IS_OCTEON3();
- }
- static inline int octeon_has_feature_OCTEON_FEATURE_FAU(void)
- {
- return (!OCTEON_IS_MODEL(OCTEON_CN78XX) &&
- !OCTEON_IS_MODEL(OCTEON_CNF75XX) &&
- !OCTEON_IS_MODEL(OCTEON_CN73XX));
- }
- static inline int octeon_has_feature_OCTEON_FEATURE_BGX(void)
- {
- return (OCTEON_IS_MODEL(OCTEON_CN78XX) ||
- OCTEON_IS_MODEL(OCTEON_CNF75XX) ||
- OCTEON_IS_MODEL(OCTEON_CN73XX));
- }
- static inline int octeon_has_feature_OCTEON_FEATURE_BGX_MIX(void)
- {
- return (OCTEON_IS_MODEL(OCTEON_CN78XX) ||
- OCTEON_IS_MODEL(OCTEON_CNF75XX) ||
- OCTEON_IS_MODEL(OCTEON_CN73XX));
- }
- static inline int octeon_has_feature_OCTEON_FEATURE_BGX_XCV(void)
- {
- return OCTEON_IS_MODEL(OCTEON_CN73XX);
- }
- static inline int octeon_has_feature_OCTEON_FEATURE_TSO(void)
- {
- return (OCTEON_IS_MODEL(OCTEON_CN73XX) ||
- OCTEON_IS_MODEL(OCTEON_CNF75XX) ||
- OCTEON_IS_MODEL(OCTEON_CN78XX_PASS2_X));
- }
- static inline int octeon_has_feature_OCTEON_FEATURE_TDM(void)
- {
- return OCTEON_IS_MODEL(OCTEON_CN61XX) ||
- OCTEON_IS_MODEL(OCTEON_CNF71XX) ||
- OCTEON_IS_MODEL(OCTEON_CN70XX);
- }
- static inline int octeon_has_feature_OCTEON_FEATURE_PTP(void)
- {
- return OCTEON_IS_MODEL(OCTEON_CN6XXX) ||
- OCTEON_IS_MODEL(OCTEON_CNF7XXX) ||
- OCTEON_IS_MODEL(OCTEON_CN73XX) ||
- OCTEON_IS_MODEL(OCTEON_CNF75XX) ||
- OCTEON_IS_MODEL(OCTEON_CN78XX_PASS2_X);
- }
- /*
- * Answer ``Is the bit for feature set in the bitmap?''
- * @param feature
- * Return: 1 when the feature is present and 0 otherwise, -1 in case of error.
- */
- #define octeon_has_feature(feature_x) octeon_has_feature_##feature_x()
- #endif /* __OCTEON_FEATURE_H__ */
|