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