1232809Sjmallett/***********************license start*************** 2232809Sjmallett * Copyright (c) 2003-2010 Cavium Inc. (support@cavium.com). All rights 3232809Sjmallett * reserved. 4232809Sjmallett * 5232809Sjmallett * 6232809Sjmallett * Redistribution and use in source and binary forms, with or without 7232809Sjmallett * modification, are permitted provided that the following conditions are 8232809Sjmallett * met: 9232809Sjmallett * 10232809Sjmallett * * Redistributions of source code must retain the above copyright 11232809Sjmallett * notice, this list of conditions and the following disclaimer. 12232809Sjmallett * 13232809Sjmallett * * Redistributions in binary form must reproduce the above 14232809Sjmallett * copyright notice, this list of conditions and the following 15232809Sjmallett * disclaimer in the documentation and/or other materials provided 16232809Sjmallett * with the distribution. 17232809Sjmallett 18232809Sjmallett * * Neither the name of Cavium Inc. nor the names of 19232809Sjmallett * its contributors may be used to endorse or promote products 20232809Sjmallett * derived from this software without specific prior written 21232809Sjmallett * permission. 22232809Sjmallett 23232809Sjmallett * This Software, including technical data, may be subject to U.S. export control 24232809Sjmallett * laws, including the U.S. Export Administration Act and its associated 25232809Sjmallett * regulations, and may be subject to export or import regulations in other 26232809Sjmallett * countries. 27232809Sjmallett 28232809Sjmallett * TO THE MAXIMUM EXTENT PERMITTED BY LAW, THE SOFTWARE IS PROVIDED "AS IS" 29232809Sjmallett * AND WITH ALL FAULTS AND CAVIUM INC. MAKES NO PROMISES, REPRESENTATIONS OR 30232809Sjmallett * WARRANTIES, EITHER EXPRESS, IMPLIED, STATUTORY, OR OTHERWISE, WITH RESPECT TO 31232809Sjmallett * THE SOFTWARE, INCLUDING ITS CONDITION, ITS CONFORMITY TO ANY REPRESENTATION OR 32232809Sjmallett * DESCRIPTION, OR THE EXISTENCE OF ANY LATENT OR PATENT DEFECTS, AND CAVIUM 33232809Sjmallett * SPECIFICALLY DISCLAIMS ALL IMPLIED (IF ANY) WARRANTIES OF TITLE, 34232809Sjmallett * MERCHANTABILITY, NONINFRINGEMENT, FITNESS FOR A PARTICULAR PURPOSE, LACK OF 35232809Sjmallett * VIRUSES, ACCURACY OR COMPLETENESS, QUIET ENJOYMENT, QUIET POSSESSION OR 36232809Sjmallett * CORRESPONDENCE TO DESCRIPTION. THE ENTIRE RISK ARISING OUT OF USE OR 37232809Sjmallett * PERFORMANCE OF THE SOFTWARE LIES WITH YOU. 38232809Sjmallett ***********************license end**************************************/ 39232809Sjmallett 40232809Sjmallett/** 41232809Sjmallett * @file 42232809Sjmallett * 43232809Sjmallett * File defining checks for different Octeon features. 44232809Sjmallett * 45232809Sjmallett * <hr>$Revision: 1 $<hr> 46232809Sjmallett */ 47232809Sjmallett#ifdef CVMX_BUILD_FOR_LINUX_KERNEL 48232809Sjmallett#include <linux/init.h> 49232809Sjmallett 50232809Sjmallett#include <asm/octeon/octeon.h> 51232809Sjmallett#else 52232809Sjmallett#include "cvmx.h" 53232809Sjmallett#endif 54232809Sjmallett 55232809SjmallettCVMX_SHARED uint8_t octeon_feature_map[FEATURE_MAP_SIZE] __attribute__((aligned(128))); 56232809Sjmallett#ifdef CVMX_BUILD_FOR_LINUX_KERNEL 57232809SjmallettEXPORT_SYMBOL(octeon_feature_map); 58232809Sjmallett#else 59232809Sjmallett#define __init 60232809Sjmallett#endif 61232809Sjmallett 62232809Sjmallett/* 63232809Sjmallett * Set the bit in octeon_feature_map for feature. 64232809Sjmallett * 65232809Sjmallett * @param feature 66232809Sjmallett * @return 0 for success and nonzero for error. 67232809Sjmallett */ 68232809Sjmallettstatic int __init octeon_feature_set(octeon_feature_t feature) 69232809Sjmallett{ 70232809Sjmallett int bit, byte; 71232809Sjmallett 72232809Sjmallett byte = feature >> 3; 73232809Sjmallett bit = feature & 0x7; 74232809Sjmallett octeon_feature_map[byte] |= (((uint8_t)1) << bit); 75232809Sjmallett 76232809Sjmallett return 0; 77232809Sjmallett} 78232809Sjmallett 79232809Sjmallettvoid __init octeon_feature_init(void) 80232809Sjmallett{ 81232809Sjmallett octeon_feature_result_t val; 82232809Sjmallett 83232809Sjmallett /* 84232809Sjmallett * Check feature map size 85232809Sjmallett */ 86232809Sjmallett if (OCTEON_MAX_FEATURE > (FEATURE_MAP_SIZE * 8 - 1)) 87232809Sjmallett { 88232809Sjmallett val = OCTEON_FEATURE_MAP_OVERFLOW; 89232809Sjmallett goto feature_check; 90232809Sjmallett } 91232809Sjmallett 92232809Sjmallett /* 93232809Sjmallett * Feature settings 94232809Sjmallett */ 95232809Sjmallett#define OCTEON_FEATURE_SET(feature_x) \ 96232809Sjmallett if (old_octeon_has_feature(feature_x)) \ 97232809Sjmallett octeon_feature_set(feature_x) 98232809Sjmallett 99232809Sjmallett OCTEON_FEATURE_SET(OCTEON_FEATURE_SAAD); 100232809Sjmallett OCTEON_FEATURE_SET(OCTEON_FEATURE_ZIP); 101232809Sjmallett OCTEON_FEATURE_SET(OCTEON_FEATURE_CRYPTO); 102232809Sjmallett OCTEON_FEATURE_SET(OCTEON_FEATURE_DORM_CRYPTO); 103232809Sjmallett OCTEON_FEATURE_SET(OCTEON_FEATURE_PCIE); 104232809Sjmallett OCTEON_FEATURE_SET(OCTEON_FEATURE_SRIO); 105232809Sjmallett OCTEON_FEATURE_SET(OCTEON_FEATURE_ILK); 106232809Sjmallett OCTEON_FEATURE_SET(OCTEON_FEATURE_KEY_MEMORY); 107232809Sjmallett OCTEON_FEATURE_SET(OCTEON_FEATURE_LED_CONTROLLER); 108232809Sjmallett OCTEON_FEATURE_SET(OCTEON_FEATURE_TRA); 109232809Sjmallett OCTEON_FEATURE_SET(OCTEON_FEATURE_MGMT_PORT); 110232809Sjmallett OCTEON_FEATURE_SET(OCTEON_FEATURE_RAID); 111232809Sjmallett OCTEON_FEATURE_SET(OCTEON_FEATURE_USB); 112232809Sjmallett OCTEON_FEATURE_SET(OCTEON_FEATURE_NO_WPTR); 113232809Sjmallett OCTEON_FEATURE_SET(OCTEON_FEATURE_DFA); 114232809Sjmallett OCTEON_FEATURE_SET(OCTEON_FEATURE_MDIO_CLAUSE_45); 115232809Sjmallett OCTEON_FEATURE_SET(OCTEON_FEATURE_NPEI); 116232809Sjmallett OCTEON_FEATURE_SET(OCTEON_FEATURE_PKND); 117232809Sjmallett OCTEON_FEATURE_SET(OCTEON_FEATURE_CN68XX_WQE); 118232809Sjmallett OCTEON_FEATURE_SET(OCTEON_FEATURE_HFA); 119232809Sjmallett OCTEON_FEATURE_SET(OCTEON_FEATURE_DFM); 120232809Sjmallett OCTEON_FEATURE_SET(OCTEON_FEATURE_CIU2); 121232809Sjmallett OCTEON_FEATURE_SET(OCTEON_FEATURE_DICI_MODE); 122232809Sjmallett OCTEON_FEATURE_SET(OCTEON_FEATURE_BIT_EXTRACTOR); 123232809Sjmallett OCTEON_FEATURE_SET(OCTEON_FEATURE_NAND); 124232809Sjmallett OCTEON_FEATURE_SET(OCTEON_FEATURE_MMC); 125232809Sjmallett 126232809Sjmallett val = OCTEON_FEATURE_SUCCESS; 127232809Sjmallett 128232809Sjmallettfeature_check: 129232809Sjmallett 130232809Sjmallett if (val != OCTEON_FEATURE_SUCCESS) 131232809Sjmallett { 132232809Sjmallett cvmx_dprintf("octeon_feature_init(): "); 133232809Sjmallett switch (val) 134232809Sjmallett { 135232809Sjmallett case OCTEON_FEATURE_MAP_OVERFLOW: 136232809Sjmallett cvmx_dprintf("feature map overflow.\n"); 137232809Sjmallett break; 138232809Sjmallett default: 139232809Sjmallett cvmx_dprintf("unknown error %d.\n", val); 140232809Sjmallett break; 141232809Sjmallett } 142242342Sjmallett#if !defined(CVMX_BUILD_FOR_LINUX_KERNEL) && !defined(__U_BOOT__) && !defined(CVMX_BUILD_FOR_TOOLCHAIN) && !defined(CVMX_BUILD_FOR_FREEBSD_KERNEL) 143232809Sjmallett exit (1); 144232809Sjmallett#endif 145232809Sjmallett } 146232809Sjmallett} 147