1*4b8b8d74SJaiprakash Singh /***********************license start***********************************
2*4b8b8d74SJaiprakash Singh * Copyright (C) 2021-2026 Marvell.
3*4b8b8d74SJaiprakash Singh * SPDX-License-Identifier: BSD-3-Clause
4*4b8b8d74SJaiprakash Singh * https://spdx.org/licenses
5*4b8b8d74SJaiprakash Singh ***********************license end**************************************/
6*4b8b8d74SJaiprakash Singh
7*4b8b8d74SJaiprakash Singh /**
8*4b8b8d74SJaiprakash Singh * @file
9*4b8b8d74SJaiprakash Singh *
10*4b8b8d74SJaiprakash Singh * Functions for determining which chip you are running on.
11*4b8b8d74SJaiprakash Singh *
12*4b8b8d74SJaiprakash Singh * <hr>$Revision: 49448 $<hr>
13*4b8b8d74SJaiprakash Singh * @addtogroup chips
14*4b8b8d74SJaiprakash Singh * @{
15*4b8b8d74SJaiprakash Singh */
16*4b8b8d74SJaiprakash Singh
17*4b8b8d74SJaiprakash Singh
18*4b8b8d74SJaiprakash Singh /* Flag bits in top byte. The top byte of MIDR_EL1 is defined
19*4b8b8d74SJaiprakash Singh as ox43, the Cavium implementer code. In this number, bits
20*4b8b8d74SJaiprakash Singh 7,5,4 are defined as zero. We use these bits to signal
21*4b8b8d74SJaiprakash Singh that revision numbers should be ignored. It isn't ideal
22*4b8b8d74SJaiprakash Singh that these are in the middle of an already defined field,
23*4b8b8d74SJaiprakash Singh but this keeps the model numbers as 32 bits */
24*4b8b8d74SJaiprakash Singh #define __OM_IGNORE_REVISION 0x80000000
25*4b8b8d74SJaiprakash Singh #define __OM_IGNORE_MINOR_REVISION 0x20000000
26*4b8b8d74SJaiprakash Singh #define __OM_IGNORE_MODEL 0x10000000
27*4b8b8d74SJaiprakash Singh
28*4b8b8d74SJaiprakash Singh /* Variant, or major pass numbers are stored in bits [23:20] */
29*4b8b8d74SJaiprakash Singh #define __OM_PASS_SHIFT 8
30*4b8b8d74SJaiprakash Singh #define __OM_PASS_MASK (0x7 << __OM_PASS_SHIFT)
31*4b8b8d74SJaiprakash Singh
32*4b8b8d74SJaiprakash Singh /*
33*4b8b8d74SJaiprakash Singh * Partnum is divied into two fields for our chips. Bits [7:4] are the
34*4b8b8d74SJaiprakash Singh * processor family. Bits [3:0] are the processor ID
35*4b8b8d74SJaiprakash Singh */
36*4b8b8d74SJaiprakash Singh #define __OM_PARTNUM_MASK 0xff
37*4b8b8d74SJaiprakash Singh #define __OM_FAMILY_MASK 0xf0
38*4b8b8d74SJaiprakash Singh
39*4b8b8d74SJaiprakash Singh /* Minor pass numbers are stored in bits [13:11] */
40*4b8b8d74SJaiprakash Singh #define __OM_MINOR_SHIFT 11
41*4b8b8d74SJaiprakash Singh #define __OM_MINOR_MASK (0x7 << __OM_MINOR_SHIFT)
42*4b8b8d74SJaiprakash Singh
43*4b8b8d74SJaiprakash Singh #define __OM_BUILD(partnum, major, minor) \
44*4b8b8d74SJaiprakash Singh ((partnum) | \
45*4b8b8d74SJaiprakash Singh (((major) - 1) << __OM_PASS_SHIFT) | \
46*4b8b8d74SJaiprakash Singh ((minor) << __OM_MINOR_SHIFT))
47*4b8b8d74SJaiprakash Singh
48*4b8b8d74SJaiprakash Singh
49*4b8b8d74SJaiprakash Singh /* Per chip definitions */
50*4b8b8d74SJaiprakash Singh #define ODYSSEY_PASS1_0 __OM_BUILD(0xBF, 1, 0)
51*4b8b8d74SJaiprakash Singh #define ODYSSEY_PASS1_1 __OM_BUILD(0xBF, 1, 1)
52*4b8b8d74SJaiprakash Singh #define ODYSSEY (ODYSSEY_CN10KA_PASS1_0 | __OM_IGNORE_REVISION)
53*4b8b8d74SJaiprakash Singh #define ODYSSEY_PASS1_X (ODYSSEY_CN10KA_PASS1_0 | __OM_IGNORE_MINOR_REVISION)
54*4b8b8d74SJaiprakash Singh
55*4b8b8d74SJaiprakash Singh #define FUS_CACHE0_ADDRESS 0x87e003001000ll
56*4b8b8d74SJaiprakash Singh
57*4b8b8d74SJaiprakash Singh /**
58*4b8b8d74SJaiprakash Singh * Return non-zero if the chip matech the passed model.
59*4b8b8d74SJaiprakash Singh *
60*4b8b8d74SJaiprakash Singh * @param arg_model One of the ODYSSEY_* constants for chip models and
61*4b8b8d74SJaiprakash Singh * passes
62*4b8b8d74SJaiprakash Singh *
63*4b8b8d74SJaiprakash Singh * @return Non-zero if match
64*4b8b8d74SJaiprakash Singh */
65*4b8b8d74SJaiprakash Singh static inline int ody_is_model(uint32_t arg_model) __attribute__ ((pure, always_inline));
ody_is_model(uint32_t arg_model)66*4b8b8d74SJaiprakash Singh static inline int ody_is_model(uint32_t arg_model)
67*4b8b8d74SJaiprakash Singh {
68*4b8b8d74SJaiprakash Singh uint64_t fuse_val = *(volatile uint64_t *)FUS_CACHE0_ADDRESS;
69*4b8b8d74SJaiprakash Singh uint64_t mask;
70*4b8b8d74SJaiprakash Singh uint32_t my_model = fuse_val & 0xffffffff;
71*4b8b8d74SJaiprakash Singh
72*4b8b8d74SJaiprakash Singh if (arg_model & __OM_IGNORE_REVISION)
73*4b8b8d74SJaiprakash Singh mask = __OM_PARTNUM_MASK;
74*4b8b8d74SJaiprakash Singh else if (arg_model & __OM_IGNORE_MINOR_REVISION)
75*4b8b8d74SJaiprakash Singh mask = __OM_PARTNUM_MASK | __OM_PASS_MASK;
76*4b8b8d74SJaiprakash Singh else
77*4b8b8d74SJaiprakash Singh mask = __OM_PARTNUM_MASK | __OM_PASS_MASK | __OM_MINOR_MASK;
78*4b8b8d74SJaiprakash Singh
79*4b8b8d74SJaiprakash Singh return ((arg_model) & mask) == (my_model & mask);
80*4b8b8d74SJaiprakash Singh }
81*4b8b8d74SJaiprakash Singh
82*4b8b8d74SJaiprakash Singh /**
83*4b8b8d74SJaiprakash Singh * Return non-zero if the die is in an alternate package. The
84*4b8b8d74SJaiprakash Singh * normal is_model() checks will treat alternate package parts
85*4b8b8d74SJaiprakash Singh * as all the same, where this function can be used to detect
86*4b8b8d74SJaiprakash Singh * them. The return value is the upper two bits of
87*4b8b8d74SJaiprakash Singh * MIO_FUS_DAT2[chip_id]. Most alternate packages use bit 6,
88*4b8b8d74SJaiprakash Singh * which will return 1 here. Parts with a second alternative
89*4b8b8d74SJaiprakash Singh * will use bit 7, which will return 2.
90*4b8b8d74SJaiprakash Singh *
91*4b8b8d74SJaiprakash Singh * @param arg_model One of the constants for chip models and
92*4b8b8d74SJaiprakash Singh * passes
93*4b8b8d74SJaiprakash Singh *
94*4b8b8d74SJaiprakash Singh * @return Non-zero if an alternate package
95*4b8b8d74SJaiprakash Singh * 0 = Normal package
96*4b8b8d74SJaiprakash Singh */
97*4b8b8d74SJaiprakash Singh extern int ody_is_altpkg(uint32_t arg_model);
98*4b8b8d74SJaiprakash Singh
99*4b8b8d74SJaiprakash Singh #define ODY_MODEL_MAX_SKU 32 /* Maximum length of SKU is 31 plus zero terminator */
100*4b8b8d74SJaiprakash Singh
101*4b8b8d74SJaiprakash Singh /**
102*4b8b8d74SJaiprakash Singh * Return the SKU string for a chip
103*4b8b8d74SJaiprakash Singh *
104*4b8b8d74SJaiprakash Singh * @return Chip's SKU
105*4b8b8d74SJaiprakash Singh */
106*4b8b8d74SJaiprakash Singh extern const char *ody_model_get_sku(void);
107*4b8b8d74SJaiprakash Singh
108*4b8b8d74SJaiprakash Singh /** @} */
109