octeon-model.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 different Octeon model IDs and macros to 47 * compare them. 48 * 49 * <hr>$Revision: 41586 $<hr> 50 */ 51 52#ifndef __OCTEON_MODEL_H__ 53#define __OCTEON_MODEL_H__ 54 55#ifdef __cplusplus 56extern "C" { 57#endif 58 59 60/* NOTE: These must match what is checked in common-config.mk */ 61/* Defines to represent the different versions of Octeon. */ 62 63 64/* IMPORTANT: When the default pass is updated for an Octeon Model, 65** the corresponding change must also be made in the oct-sim script. */ 66 67 68/* The defines below should be used with the OCTEON_IS_MODEL() macro to 69** determine what model of chip the software is running on. Models ending 70** in 'XX' match multiple models (families), while specific models match only 71** that model. If a pass (revision) is specified, then only that revision 72** will be matched. Care should be taken when checking for both specific 73** models and families that the specific models are checked for first. 74** While these defines are similar to the processor ID, they are not intended 75** to be used by anything other that the OCTEON_IS_MODEL framework, and 76** the values are subject to change at anytime without notice. 77** 78** NOTE: only the OCTEON_IS_MODEL() macro/function and the OCTEON_CN* macros 79** should be used outside of this file. All other macros are for internal 80** use only, and may change without notice. 81*/ 82 83 84/* Flag bits in top byte */ 85#define OM_IGNORE_REVISION 0x01000000 /* Ignores revision in model checks */ 86#define OM_CHECK_SUBMODEL 0x02000000 /* Check submodels */ 87#define OM_MATCH_PREVIOUS_MODELS 0x04000000 /* Match all models previous than the one specified */ 88#define OM_IGNORE_MINOR_REVISION 0x08000000 /* Ignores the minor revison on newer parts */ 89#define OM_FLAG_MASK 0xff000000 90 91/* 92 * CN5XXX models with new revision encoding 93 */ 94#define OCTEON_CN58XX_PASS1_0 0x000d0300 95#define OCTEON_CN58XX_PASS1_1 0x000d0301 96#define OCTEON_CN58XX_PASS1_2 0x000d0303 97#define OCTEON_CN58XX_PASS2_0 0x000d0308 98#define OCTEON_CN58XX_PASS2_1 0x000d0309 99#define OCTEON_CN58XX_PASS2_2 0x000d030a 100#define OCTEON_CN58XX_PASS2_3 0x000d030b 101 102#define OCTEON_CN58XX (OCTEON_CN58XX_PASS1_0 | OM_IGNORE_REVISION) 103#define OCTEON_CN58XX_PASS1_X (OCTEON_CN58XX_PASS1_0 | OM_IGNORE_MINOR_REVISION) 104#define OCTEON_CN58XX_PASS2_X (OCTEON_CN58XX_PASS2_0 | OM_IGNORE_MINOR_REVISION) 105#define OCTEON_CN58XX_PASS1 OCTEON_CN58XX_PASS1_X 106#define OCTEON_CN58XX_PASS2 OCTEON_CN58XX_PASS2_X 107 108#define OCTEON_CN56XX_PASS1_0 0x000d0400 109#define OCTEON_CN56XX_PASS1_1 0x000d0401 110#define OCTEON_CN56XX_PASS2_0 0x000d0408 111#define OCTEON_CN56XX_PASS2_1 0x000d0409 112 113#define OCTEON_CN56XX (OCTEON_CN56XX_PASS2_0 | OM_IGNORE_REVISION) 114#define OCTEON_CN56XX_PASS1_X (OCTEON_CN56XX_PASS1_0 | OM_IGNORE_MINOR_REVISION) 115#define OCTEON_CN56XX_PASS2_X (OCTEON_CN56XX_PASS2_0 | OM_IGNORE_MINOR_REVISION) 116#define OCTEON_CN56XX_PASS1 OCTEON_CN56XX_PASS1_X 117#define OCTEON_CN56XX_PASS2 OCTEON_CN56XX_PASS2_X 118 119#define OCTEON_CN57XX OCTEON_CN56XX 120#define OCTEON_CN57XX_PASS1 OCTEON_CN56XX_PASS1 121#define OCTEON_CN57XX_PASS2 OCTEON_CN56XX_PASS2 122 123#define OCTEON_CN55XX OCTEON_CN56XX 124#define OCTEON_CN55XX_PASS1 OCTEON_CN56XX_PASS1 125#define OCTEON_CN55XX_PASS2 OCTEON_CN56XX_PASS2 126 127#define OCTEON_CN54XX OCTEON_CN56XX 128#define OCTEON_CN54XX_PASS1 OCTEON_CN56XX_PASS1 129#define OCTEON_CN54XX_PASS2 OCTEON_CN56XX_PASS2 130 131#define OCTEON_CN50XX_PASS1_0 0x000d0600 132 133#define OCTEON_CN50XX (OCTEON_CN50XX_PASS1_0 | OM_IGNORE_REVISION) 134#define OCTEON_CN50XX_PASS1_X (OCTEON_CN50XX_PASS1_0 | OM_IGNORE_MINOR_REVISION) 135#define OCTEON_CN50XX_PASS1 OCTEON_CN50XX_PASS1_X 136 137/* NOTE: Octeon CN5000F model is not identifiable using the OCTEON_IS_MODEL() 138 functions, but are treated as CN50XX */ 139 140#define OCTEON_CN52XX_PASS1_0 0x000d0700 141#define OCTEON_CN52XX_PASS2_0 0x000d0708 142 143#define OCTEON_CN52XX (OCTEON_CN52XX_PASS2_0 | OM_IGNORE_REVISION) 144#define OCTEON_CN52XX_PASS1_X (OCTEON_CN52XX_PASS1_0 | OM_IGNORE_MINOR_REVISION) 145#define OCTEON_CN52XX_PASS2_X (OCTEON_CN52XX_PASS2_0 | OM_IGNORE_MINOR_REVISION) 146#define OCTEON_CN52XX_PASS1 OCTEON_CN52XX_PASS1_X 147#define OCTEON_CN52XX_PASS2 OCTEON_CN52XX_PASS2_X 148 149/* 150 * CN3XXX models with old revision enconding 151 */ 152#define OCTEON_CN38XX_PASS1 0x000d0000 153#define OCTEON_CN38XX_PASS2 0x000d0001 154#define OCTEON_CN38XX_PASS3 0x000d0003 155#define OCTEON_CN38XX (OCTEON_CN38XX_PASS3 | OM_IGNORE_REVISION) 156 157#define OCTEON_CN36XX OCTEON_CN38XX 158#define OCTEON_CN36XX_PASS2 OCTEON_CN38XX_PASS2 159#define OCTEON_CN36XX_PASS3 OCTEON_CN38XX_PASS3 160 161/* The OCTEON_CN31XX matches CN31XX models and the CN3020 */ 162#define OCTEON_CN31XX_PASS1 0x000d0100 163#define OCTEON_CN31XX_PASS1_1 0x000d0102 164#define OCTEON_CN31XX (OCTEON_CN31XX_PASS1 | OM_IGNORE_REVISION) 165 166/* This model is only used for internal checks, it 167** is not a valid model for the OCTEON_MODEL environment variable. 168** This matches the CN3010 and CN3005 but NOT the CN3020*/ 169#define OCTEON_CN30XX_PASS1 0x000d0200 170#define OCTEON_CN30XX_PASS1_1 0x000d0202 171#define OCTEON_CN30XX (OCTEON_CN30XX_PASS1 | OM_IGNORE_REVISION) 172 173#define OCTEON_CN3005_PASS1 (0x000d0210 | OM_CHECK_SUBMODEL) 174#define OCTEON_CN3005_PASS1_0 (0x000d0210 | OM_CHECK_SUBMODEL) 175#define OCTEON_CN3005_PASS1_1 (0x000d0212 | OM_CHECK_SUBMODEL) 176#define OCTEON_CN3005 (OCTEON_CN3005_PASS1 | OM_IGNORE_REVISION | OM_CHECK_SUBMODEL) 177 178#define OCTEON_CN3010_PASS1 (0x000d0200 | OM_CHECK_SUBMODEL) 179#define OCTEON_CN3010_PASS1_0 (0x000d0200 | OM_CHECK_SUBMODEL) 180#define OCTEON_CN3010_PASS1_1 (0x000d0202 | OM_CHECK_SUBMODEL) 181#define OCTEON_CN3010 (OCTEON_CN3010_PASS1 | OM_IGNORE_REVISION | OM_CHECK_SUBMODEL) 182 183#define OCTEON_CN3020_PASS1 (0x000d0110 | OM_CHECK_SUBMODEL) 184#define OCTEON_CN3020_PASS1_0 (0x000d0110 | OM_CHECK_SUBMODEL) 185#define OCTEON_CN3020_PASS1_1 (0x000d0112 | OM_CHECK_SUBMODEL) 186#define OCTEON_CN3020 (OCTEON_CN3020_PASS1 | OM_IGNORE_REVISION | OM_CHECK_SUBMODEL) 187 188 189 190/* This matches the complete family of CN3xxx CPUs, and not subsequent models */ 191#define OCTEON_CN3XXX (OCTEON_CN58XX_PASS1_0 | OM_MATCH_PREVIOUS_MODELS | OM_IGNORE_REVISION) 192 193/* The revision byte (low byte) has two different encodings. 194** CN3XXX: 195** 196** bits 197** <7:5>: reserved (0) 198** <4>: alternate package 199** <3:0>: revision 200** 201** CN5XXX: 202** 203** bits 204** <7>: reserved (0) 205** <6>: alternate package 206** <5:3>: major revision 207** <2:0>: minor revision 208** 209*/ 210 211/* Masks used for the various types of model/family/revision matching */ 212#define OCTEON_38XX_FAMILY_MASK 0x00ffff00 213#define OCTEON_38XX_FAMILY_REV_MASK 0x00ffff0f 214#define OCTEON_38XX_MODEL_MASK 0x00ffff10 215#define OCTEON_38XX_MODEL_REV_MASK (OCTEON_38XX_FAMILY_REV_MASK | OCTEON_38XX_MODEL_MASK) 216 217/* CN5XXX and later use different layout of bits in the revision ID field */ 218#define OCTEON_58XX_FAMILY_MASK OCTEON_38XX_FAMILY_MASK 219#define OCTEON_58XX_FAMILY_REV_MASK 0x00ffff3f 220#define OCTEON_58XX_MODEL_MASK 0x00ffffc0 221#define OCTEON_58XX_MODEL_REV_MASK (OCTEON_58XX_FAMILY_REV_MASK | OCTEON_58XX_MODEL_MASK) 222#define OCTEON_58XX_MODEL_MINOR_REV_MASK (OCTEON_58XX_MODEL_REV_MASK & 0x00fffff8) 223 224 225#define __OCTEON_MATCH_MASK__(x,y,z) (((x) & (z)) == ((y) & (z))) 226 227 228/* NOTE: This for internal use only!!!!! */ 229#define __OCTEON_IS_MODEL_COMPILE__(arg_model, chip_model) \ 230 ((((arg_model & OCTEON_38XX_FAMILY_MASK) < OCTEON_CN58XX_PASS1_0) && (\ 231 ((((arg_model) & (OM_FLAG_MASK)) == (OM_IGNORE_REVISION | OM_CHECK_SUBMODEL)) \ 232 && __OCTEON_MATCH_MASK__((chip_model), (arg_model), OCTEON_38XX_MODEL_MASK)) || \ 233 ((((arg_model) & (OM_FLAG_MASK)) == 0) \ 234 && __OCTEON_MATCH_MASK__((chip_model), (arg_model), OCTEON_38XX_FAMILY_REV_MASK)) || \ 235 ((((arg_model) & (OM_FLAG_MASK)) == OM_IGNORE_REVISION) \ 236 && __OCTEON_MATCH_MASK__((chip_model), (arg_model), OCTEON_38XX_FAMILY_MASK)) || \ 237 ((((arg_model) & (OM_FLAG_MASK)) == OM_CHECK_SUBMODEL) \ 238 && __OCTEON_MATCH_MASK__((chip_model), (arg_model), OCTEON_38XX_MODEL_REV_MASK)) || \ 239 ((((arg_model) & (OM_MATCH_PREVIOUS_MODELS)) == OM_MATCH_PREVIOUS_MODELS) \ 240 && (((chip_model) & OCTEON_38XX_MODEL_MASK) < ((arg_model) & OCTEON_38XX_MODEL_MASK))) \ 241 )) || \ 242 (((arg_model & OCTEON_38XX_FAMILY_MASK) >= OCTEON_CN58XX_PASS1_0) && (\ 243 ((((arg_model) & (OM_FLAG_MASK)) == (OM_IGNORE_REVISION | OM_CHECK_SUBMODEL)) \ 244 && __OCTEON_MATCH_MASK__((chip_model), (arg_model), OCTEON_58XX_MODEL_MASK)) || \ 245 ((((arg_model) & (OM_FLAG_MASK)) == 0) \ 246 && __OCTEON_MATCH_MASK__((chip_model), (arg_model), OCTEON_58XX_FAMILY_REV_MASK)) || \ 247 ((((arg_model) & (OM_FLAG_MASK)) == OM_IGNORE_MINOR_REVISION) \ 248 && __OCTEON_MATCH_MASK__((chip_model), (arg_model), OCTEON_58XX_MODEL_MINOR_REV_MASK)) || \ 249 ((((arg_model) & (OM_FLAG_MASK)) == OM_IGNORE_REVISION) \ 250 && __OCTEON_MATCH_MASK__((chip_model), (arg_model), OCTEON_58XX_FAMILY_MASK)) || \ 251 ((((arg_model) & (OM_FLAG_MASK)) == OM_CHECK_SUBMODEL) \ 252 && __OCTEON_MATCH_MASK__((chip_model), (arg_model), OCTEON_58XX_MODEL_REV_MASK)) || \ 253 ((((arg_model) & (OM_MATCH_PREVIOUS_MODELS)) == OM_MATCH_PREVIOUS_MODELS) \ 254 && (((chip_model) & OCTEON_58XX_MODEL_MASK) < ((arg_model) & OCTEON_58XX_MODEL_MASK))) \ 255 ))) 256 257#if defined(USE_RUNTIME_MODEL_CHECKS) || defined(__U_BOOT__) || (defined(__linux__) && defined(__KERNEL__)) 258 259/* NOTE: This for internal use only!!!!! */ 260static inline int __octeon_is_model_runtime__(uint32_t model) 261{ 262 uint32_t cpuid = cvmx_get_proc_id(); 263 264 /* Check for special case of mismarked 3005 samples. We only need to check 265 if the sub model isn't being ignored */ 266 if ((model & OM_CHECK_SUBMODEL) == OM_CHECK_SUBMODEL) 267 { 268 if (cpuid == OCTEON_CN3010_PASS1 && (cvmx_read_csr(0x80011800800007B8ull) & (1ull << 34))) 269 cpuid |= 0x10; 270 } 271 return(__OCTEON_IS_MODEL_COMPILE__(model, cpuid)); 272} 273 274/* The OCTEON_IS_MODEL macro should be used for all Octeon model checking done 275** in a program. 276** This should be kept runtime if at all possible and must be conditionalized 277** with OCTEON_IS_COMMON_BINARY() if runtime checking support is required. 278** 279** Use of the macro in preprocessor directives ( #if OCTEON_IS_MODEL(...) ) 280** is NOT SUPPORTED, and should be replaced with CVMX_COMPILED_FOR() 281** I.e.: 282** #if OCTEON_IS_MODEL(OCTEON_CN56XX) -> #if CVMX_COMPILED_FOR(OCTEON_CN56XX) 283*/ 284#define OCTEON_IS_MODEL(x) __octeon_is_model_runtime__(x) 285#define OCTEON_IS_COMMON_BINARY() 1 286#undef OCTEON_MODEL 287#else 288#define CVMX_COMPILED_FOR(x) __OCTEON_IS_MODEL_COMPILE__(x, OCTEON_MODEL) 289 290#define OCTEON_IS_MODEL(x) \ 291 (((x & (OM_IGNORE_REVISION | OM_IGNORE_MINOR_REVISION)) != 0) \ 292 ? __OCTEON_IS_MODEL_COMPILE__(x, OCTEON_MODEL) \ 293 : __OCTEON_IS_MODEL_COMPILE__(x, cvmx_get_proc_id())) 294 295#define OCTEON_IS_COMMON_BINARY() 0 296#endif 297 298const char *octeon_model_get_string(uint32_t chip_id); 299const char *octeon_model_get_string_buffer(uint32_t chip_id, char * buffer); 300 301#include "octeon-feature.h" 302 303#ifdef __cplusplus 304} 305#endif 306 307#endif /* __OCTEON_MODEL_H__ */ 308