octeon-feature.h revision 210286
1/***********************license start***************
2 *  Copyright (c) 2003-2008 Cavium Networks (support@cavium.com). All rights
3 *  reserved.
4 *
5 *
6 *  Redistribution and use in source and binary forms, with or without
7 *  modification, are permitted provided that the following conditions are
8 *  met:
9 *
10 *      * Redistributions of source code must retain the above copyright
11 *        notice, this list of conditions and the following disclaimer.
12 *
13 *      * Redistributions in binary form must reproduce the above
14 *        copyright notice, this list of conditions and the following
15 *        disclaimer in the documentation and/or other materials provided
16 *        with the distribution.
17 *
18 *      * Neither the name of Cavium Networks nor the names of
19 *        its contributors may be used to endorse or promote products
20 *        derived from this software without specific prior written
21 *        permission.
22 *
23 *  TO THE MAXIMUM EXTENT PERMITTED BY LAW, THE SOFTWARE IS PROVIDED "AS IS"
24 *  AND WITH ALL FAULTS AND CAVIUM NETWORKS MAKES NO PROMISES, REPRESENTATIONS
25 *  OR WARRANTIES, EITHER EXPRESS, IMPLIED, STATUTORY, OR OTHERWISE, WITH
26 *  RESPECT TO THE SOFTWARE, INCLUDING ITS CONDITION, ITS CONFORMITY TO ANY
27 *  REPRESENTATION OR DESCRIPTION, OR THE EXISTENCE OF ANY LATENT OR PATENT
28 *  DEFECTS, AND CAVIUM SPECIFICALLY DISCLAIMS ALL IMPLIED (IF ANY) WARRANTIES
29 *  OF TITLE, MERCHANTABILITY, NONINFRINGEMENT, FITNESS FOR A PARTICULAR
30 *  PURPOSE, LACK OF VIRUSES, ACCURACY OR COMPLETENESS, QUIET ENJOYMENT, QUIET
31 *  POSSESSION OR CORRESPONDENCE TO DESCRIPTION.  THE ENTIRE RISK ARISING OUT
32 *  OF USE OR PERFORMANCE OF THE SOFTWARE LIES WITH YOU.
33 *
34 *
35 *  For any questions regarding licensing please contact marketing@caviumnetworks.com
36 *
37 ***********************license end**************************************/
38
39
40
41
42
43/**
44 * @file
45 *
46 * File defining checks for different Octeon features.
47 *
48 * <hr>$Revision: 30468 $<hr>
49 */
50
51#ifndef __OCTEON_FEATURE_H__
52#define __OCTEON_FEATURE_H__
53
54#ifdef	__cplusplus
55extern "C" {
56#endif
57
58typedef enum
59{
60    OCTEON_FEATURE_SAAD,        /* Octeon models in the CN5XXX family and higher support atomic add instructions to memory (saa/saad) */
61    OCTEON_FEATURE_ZIP,         /* Does this Octeon support the ZIP offload engine? */
62    OCTEON_FEATURE_CRYPTO,      /* Does this Octeon support crypto acceleration using COP2? */
63    OCTEON_FEATURE_PCIE,        /* Does this Octeon support PCI express? */
64    OCTEON_FEATURE_KEY_MEMORY,  /* Some Octeon models support internal memory for storing cryptographic keys */
65    OCTEON_FEATURE_LED_CONTROLLER, /* Octeon has a LED controller for banks of external LEDs */
66    OCTEON_FEATURE_TRA,         /* Octeon has a trace buffer */
67    OCTEON_FEATURE_MGMT_PORT,   /* Octeon has a management port */
68    OCTEON_FEATURE_RAID,        /* Octeon has a raid unit */
69    OCTEON_FEATURE_USB,         /* Octeon has a builtin USB */
70    OCTEON_FEATURE_NO_WPTR,     /* Octeon IPD can run without using work queue entries */
71    OCTEON_FEATURE_DFA,         /* Octeon has DFA state machines */
72    OCTEON_FEATURE_MDIO_CLAUSE_45,     /* Octeon MDIO block supports clause 45 transactions for 10 Gig support */
73} octeon_feature_t;
74
75/**
76 * Determine if the current Octeon supports a specific feature. These
77 * checks have been optimized to be fairly quick, but they should still
78 * be kept out of fast path code.
79 *
80 * @param feature Feature to check for. This should always be a constant so the
81 *                compiler can remove the switch statement through optimization.
82 *
83 * @return Non zero if the feature exists. Zero if the feature does not
84 *         exist.
85 */
86static inline int octeon_has_feature(octeon_feature_t feature)
87{
88    switch (feature)
89    {
90        case OCTEON_FEATURE_SAAD:
91            return !OCTEON_IS_MODEL(OCTEON_CN3XXX);
92
93        case OCTEON_FEATURE_ZIP:
94            if (OCTEON_IS_MODEL(OCTEON_CN30XX) || OCTEON_IS_MODEL(OCTEON_CN50XX) || OCTEON_IS_MODEL(OCTEON_CN52XX))
95                return 0;
96            else if (OCTEON_IS_MODEL(OCTEON_CN38XX_PASS1))
97                return 1;
98            else
99                return (!cvmx_fuse_read(121));
100
101        case OCTEON_FEATURE_CRYPTO:
102            return (!cvmx_fuse_read(90));
103
104        case OCTEON_FEATURE_PCIE:
105            return (OCTEON_IS_MODEL(OCTEON_CN56XX) || OCTEON_IS_MODEL(OCTEON_CN52XX));
106
107        case OCTEON_FEATURE_KEY_MEMORY:
108        case OCTEON_FEATURE_LED_CONTROLLER:
109            return (OCTEON_IS_MODEL(OCTEON_CN38XX) || OCTEON_IS_MODEL(OCTEON_CN58XX) || OCTEON_IS_MODEL(OCTEON_CN56XX));
110        case OCTEON_FEATURE_TRA:
111            return !(OCTEON_IS_MODEL(OCTEON_CN30XX) || OCTEON_IS_MODEL(OCTEON_CN50XX));
112        case OCTEON_FEATURE_MGMT_PORT:
113            return (OCTEON_IS_MODEL(OCTEON_CN56XX) || OCTEON_IS_MODEL(OCTEON_CN52XX));
114        case OCTEON_FEATURE_RAID:
115            return (OCTEON_IS_MODEL(OCTEON_CN56XX) || OCTEON_IS_MODEL(OCTEON_CN52XX));
116        case OCTEON_FEATURE_USB:
117            return !(OCTEON_IS_MODEL(OCTEON_CN38XX) || OCTEON_IS_MODEL(OCTEON_CN58XX));
118        case OCTEON_FEATURE_NO_WPTR:
119            return ((OCTEON_IS_MODEL(OCTEON_CN56XX) || OCTEON_IS_MODEL(OCTEON_CN52XX)) &&
120                    !OCTEON_IS_MODEL(OCTEON_CN56XX_PASS1_X) && !OCTEON_IS_MODEL(OCTEON_CN52XX_PASS1_X));
121        case OCTEON_FEATURE_DFA:
122            if (!OCTEON_IS_MODEL(OCTEON_CN38XX) && !OCTEON_IS_MODEL(OCTEON_CN31XX) && !OCTEON_IS_MODEL(OCTEON_CN58XX))
123                return 0;
124            else if (OCTEON_IS_MODEL(OCTEON_CN3020))
125                return 0;
126            else if (OCTEON_IS_MODEL(OCTEON_CN38XX_PASS1))
127                return 1;
128            else
129                return(!cvmx_fuse_read(120));
130        case OCTEON_FEATURE_MDIO_CLAUSE_45:
131            return (!(OCTEON_IS_MODEL(OCTEON_CN3XXX) || OCTEON_IS_MODEL(OCTEON_CN58XX) || OCTEON_IS_MODEL(OCTEON_CN50XX)));
132    }
133    return 0;
134}
135
136#ifdef	__cplusplus
137}
138#endif
139
140#endif    /* __OCTEON_FEATURE_H__ */
141