1 /***********************license start*************** 2 * Author: Cavium Networks 3 * 4 * Contact: support@caviumnetworks.com 5 * This file is part of the OCTEON SDK 6 * 7 * Copyright (c) 2003-2008 Cavium Networks 8 * 9 * This file is free software; you can redistribute it and/or modify 10 * it under the terms of the GNU General Public License, Version 2, as 11 * published by the Free Software Foundation. 12 * 13 * This file is distributed in the hope that it will be useful, but 14 * AS-IS and WITHOUT ANY WARRANTY; without even the implied warranty 15 * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, TITLE, or 16 * NONINFRINGEMENT. See the GNU General Public License for more 17 * details. 18 * 19 * You should have received a copy of the GNU General Public License 20 * along with this file; if not, write to the Free Software 21 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA 22 * or visit http://www.gnu.org/licenses/. 23 * 24 * This file may also be available under a different license from Cavium. 25 * Contact Cavium Networks for more information 26 ***********************license end**************************************/ 27 28 /* 29 * File defining checks for different Octeon features. 30 */ 31 32 #ifndef __OCTEON_FEATURE_H__ 33 #define __OCTEON_FEATURE_H__ 34 35 enum octeon_feature { 36 /* 37 * Octeon models in the CN5XXX family and higher support 38 * atomic add instructions to memory (saa/saad). 39 */ 40 OCTEON_FEATURE_SAAD, 41 /* Does this Octeon support the ZIP offload engine? */ 42 OCTEON_FEATURE_ZIP, 43 /* Does this Octeon support crypto acceleration using COP2? */ 44 OCTEON_FEATURE_CRYPTO, 45 /* Does this Octeon support PCI express? */ 46 OCTEON_FEATURE_PCIE, 47 /* Some Octeon models support internal memory for storing 48 * cryptographic keys */ 49 OCTEON_FEATURE_KEY_MEMORY, 50 /* Octeon has a LED controller for banks of external LEDs */ 51 OCTEON_FEATURE_LED_CONTROLLER, 52 /* Octeon has a trace buffer */ 53 OCTEON_FEATURE_TRA, 54 /* Octeon has a management port */ 55 OCTEON_FEATURE_MGMT_PORT, 56 /* Octeon has a raid unit */ 57 OCTEON_FEATURE_RAID, 58 /* Octeon has a builtin USB */ 59 OCTEON_FEATURE_USB, 60 }; 61 62 static inline int cvmx_fuse_read(int fuse); 63 64 /** 65 * Determine if the current Octeon supports a specific feature. These 66 * checks have been optimized to be fairly quick, but they should still 67 * be kept out of fast path code. 68 * 69 * @feature: Feature to check for. This should always be a constant so the 70 * compiler can remove the switch statement through optimization. 71 * 72 * Returns Non zero if the feature exists. Zero if the feature does not 73 * exist. 74 */ 75 static inline int octeon_has_feature(enum octeon_feature feature) 76 { 77 switch (feature) { 78 case OCTEON_FEATURE_SAAD: 79 return !OCTEON_IS_MODEL(OCTEON_CN3XXX); 80 81 case OCTEON_FEATURE_ZIP: 82 if (OCTEON_IS_MODEL(OCTEON_CN30XX) 83 || OCTEON_IS_MODEL(OCTEON_CN50XX) 84 || OCTEON_IS_MODEL(OCTEON_CN52XX)) 85 return 0; 86 else if (OCTEON_IS_MODEL(OCTEON_CN38XX_PASS1)) 87 return 1; 88 else 89 return !cvmx_fuse_read(121); 90 91 case OCTEON_FEATURE_CRYPTO: 92 return !cvmx_fuse_read(90); 93 94 case OCTEON_FEATURE_PCIE: 95 return OCTEON_IS_MODEL(OCTEON_CN56XX) 96 || OCTEON_IS_MODEL(OCTEON_CN52XX); 97 98 case OCTEON_FEATURE_KEY_MEMORY: 99 case OCTEON_FEATURE_LED_CONTROLLER: 100 return OCTEON_IS_MODEL(OCTEON_CN38XX) 101 || OCTEON_IS_MODEL(OCTEON_CN58XX) 102 || OCTEON_IS_MODEL(OCTEON_CN56XX); 103 case OCTEON_FEATURE_TRA: 104 return !(OCTEON_IS_MODEL(OCTEON_CN30XX) 105 || OCTEON_IS_MODEL(OCTEON_CN50XX)); 106 case OCTEON_FEATURE_MGMT_PORT: 107 return OCTEON_IS_MODEL(OCTEON_CN56XX) 108 || OCTEON_IS_MODEL(OCTEON_CN52XX); 109 case OCTEON_FEATURE_RAID: 110 return OCTEON_IS_MODEL(OCTEON_CN56XX) 111 || OCTEON_IS_MODEL(OCTEON_CN52XX); 112 case OCTEON_FEATURE_USB: 113 return !(OCTEON_IS_MODEL(OCTEON_CN38XX) 114 || OCTEON_IS_MODEL(OCTEON_CN58XX)); 115 } 116 return 0; 117 } 118 119 #endif /* __OCTEON_FEATURE_H__ */ 120