/***********************license start*********************************** * Copyright (c) 2003-2017 Cavium Inc. (support@cavium.com). All rights * reserved. * * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * * Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * * * Neither the name of Cavium Inc. nor the names of * its contributors may be used to endorse or promote products * derived from this software without specific prior written * permission. * * This Software, including technical data, may be subject to U.S. export * control laws, including the U.S. Export Administration Act and its * associated regulations, and may be subject to export or import * regulations in other countries. * * TO THE MAXIMUM EXTENT PERMITTED BY LAW, THE SOFTWARE IS PROVIDED "AS IS" * AND WITH ALL FAULTS AND CAVIUM INC. MAKES NO PROMISES, REPRESENTATIONS OR * WARRANTIES, EITHER EXPRESS, IMPLIED, STATUTORY, OR OTHERWISE, WITH RESPECT * TO THE SOFTWARE, INCLUDING ITS CONDITION, ITS CONFORMITY TO ANY * REPRESENTATION OR DESCRIPTION, OR THE EXISTENCE OF ANY LATENT OR PATENT * DEFECTS, AND CAVIUM SPECIFICALLY DISCLAIMS ALL IMPLIED (IF ANY) WARRANTIES * OF TITLE, MERCHANTABILITY, NONINFRINGEMENT, FITNESS FOR A PARTICULAR * PURPOSE, LACK OF VIRUSES, ACCURACY OR COMPLETENESS, QUIET ENJOYMENT, * QUIET POSSESSION OR CORRESPONDENCE TO DESCRIPTION. THE ENTIRE RISK * ARISING OUT OF USE OR PERFORMANCE OF THE SOFTWARE LIES WITH YOU. ***********************license end**************************************/ #include #include "libbdk-arch/bdk-csrs-ap.h" #include "libbdk-arch/bdk-csrs-mio_fus.h" #include "libbdk-arch/bdk-csrs-fus.h" #include "libbdk-arch/bdk-csrs-fusf.h" #include #include /* Format of a SKU CN8890-2000BG2601-AAP-G CN8890-2000BG2601-AAP-PR-Y-G CN XX XX X - XXX BG XXX - XX (- XX) (- X) - G | | | | | | | | | | ^ RoHS Option, G=RoHS 6/6 | | | | | | | | | ^ Product Revision, blank for pass 1, Y=pass 2, W=pass 3, V=pass 4 | | | | | | | | ^ Product Phase, blank=production, PR=Prototype, ES=Engineering Sample | | | | | | | ^ Marketing Segment Option (SC, SNT, etc) | | | | | | ^ Number of balls on the package | | | | | ^ Ball Grid Array | | | | ^ Frequency in Mhz, 3 or 4 digits (300 - 2000) | | | ^ Optional Customer Code, blank or A-Z | | ^ Number of cores, see table below | ^ Processor family, plus or minus for L2 sizes and such (88, 86, 83, 81, 80) ^ Cavium Prefix, sometimes changed for customer specific parts Table of Core to Model encoding >= 48 shows xx90 >= 44 shows xx88 >= 42 shows xx85 >= 32 shows xx80 >= 24 shows xx70 >= 20 shows xx65 >= 16 shows xx60 = 15 shows xx58 = 14 shows xx55 = 13 shows xx52 = 12 shows xx50 = 11 shows xx48 = 10 shows xx45 = 9 shows xx42 = 8 shows xx40 = 7 shows xx38 = 6 shows xx34 = 5 shows xx32 = 4 shows xx30 = 3 shows xx25 = 2 shows xx20 = 1 shows xx10 */ /* Definition of each SKU table entry for the different dies */ typedef struct { uint8_t fuse_index; /* Index programmed into PNAME fuses to match this entry. Must never change once fused parts ship */ const char prefix[4]; /* Prefix before model number, usually "CN". Third letter is customer code shown after the model */ uint8_t model_base; /* First two digits of the model number */ uint16_t num_balls; /* Number of balls on package, included in SKU */ const char segment[4]; /* Market segment SKU is for, 2-3 character string */ uint16_t fuses[12]; /* List of fuses required for operation of this SKU */ } model_sku_info_t; /* In the model_sku_info_t.fuses[] array, we use a special value FUSES_CHECK_FUSF to represent that we need to check FUSF_CTL bit 6, checking for trusted boot */ #define FUSES_CHECK_FUSF 0xffff /** * Return non-zero if the die is in an alternate package. The * normal is_model() checks will treat alternate package parts * as all the same, where this function can be used to detect * them. The return value is the upper two bits of * MIO_FUS_DAT2[chip_id]. Most alternate packages use bit 6, * which will return 1 here. Parts with a second alternative * will use bit 7, which will return 2. * * @param arg_model One of the CAVIUM_* constants for chip models and passes * * @return Non-zero if an alternate package * 0 = Normal package * 1 = Alternate package 1 (CN86XX, CN80XX with 555 balls) * 2 = Alternate package 2 (CN80XX with 676 balls) * 3 = Alternate package 3 (Currently unused) */ int cavium_is_altpkg(uint32_t arg_model) { if (CAVIUM_IS_MODEL(arg_model)) { BDK_CSR_INIT(mio_fus_dat2, bdk_numa_local(), BDK_MIO_FUS_DAT2); /* Bits 7:6 are used for alternate packages. Return the exact number so multiple alternate packages can be detected (CN80XX is an example) */ int altpkg = mio_fus_dat2.s.chip_id >> 6; if (altpkg) return altpkg; /* Due to a documentation mixup, some CN80XX parts do not have chip_id bit 7 set. As a backup, use lmc_mode32 to find these parts. Both bits are suppose to be fused, but some parts only have lmc_mode32 */ if (CAVIUM_IS_MODEL(CAVIUM_CN81XX) && mio_fus_dat2.s.lmc_mode32) return 2; return 0; } else return 0; }