xref: /rk3399_ARM-atf/plat/nvidia/tegra/common/tegra_platform.c (revision e954ab8f7686cdf84859b940d7b54b5e64cf8ebc)
1*e954ab8fSVarun Wadekar /*
2*e954ab8fSVarun Wadekar  * Copyright (c) 2017, ARM Limited and Contributors. All rights reserved.
3*e954ab8fSVarun Wadekar  *
4*e954ab8fSVarun Wadekar  * Redistribution and use in source and binary forms, with or without
5*e954ab8fSVarun Wadekar  * modification, are permitted provided that the following conditions are met:
6*e954ab8fSVarun Wadekar  *
7*e954ab8fSVarun Wadekar  * Redistributions of source code must retain the above copyright notice, this
8*e954ab8fSVarun Wadekar  * list of conditions and the following disclaimer.
9*e954ab8fSVarun Wadekar  *
10*e954ab8fSVarun Wadekar  * Redistributions in binary form must reproduce the above copyright notice,
11*e954ab8fSVarun Wadekar  * this list of conditions and the following disclaimer in the documentation
12*e954ab8fSVarun Wadekar  * and/or other materials provided with the distribution.
13*e954ab8fSVarun Wadekar  *
14*e954ab8fSVarun Wadekar  * Neither the name of ARM nor the names of its contributors may be used
15*e954ab8fSVarun Wadekar  * to endorse or promote products derived from this software without specific
16*e954ab8fSVarun Wadekar  * prior written permission.
17*e954ab8fSVarun Wadekar  *
18*e954ab8fSVarun Wadekar  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
19*e954ab8fSVarun Wadekar  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20*e954ab8fSVarun Wadekar  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21*e954ab8fSVarun Wadekar  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
22*e954ab8fSVarun Wadekar  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
23*e954ab8fSVarun Wadekar  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
24*e954ab8fSVarun Wadekar  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
25*e954ab8fSVarun Wadekar  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
26*e954ab8fSVarun Wadekar  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
27*e954ab8fSVarun Wadekar  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
28*e954ab8fSVarun Wadekar  * POSSIBILITY OF SUCH DAMAGE.
29*e954ab8fSVarun Wadekar  */
30*e954ab8fSVarun Wadekar 
31*e954ab8fSVarun Wadekar #include <arch_helpers.h>
32*e954ab8fSVarun Wadekar #include <mmio.h>
33*e954ab8fSVarun Wadekar #include <tegra_def.h>
34*e954ab8fSVarun Wadekar #include <tegra_platform.h>
35*e954ab8fSVarun Wadekar #include <tegra_private.h>
36*e954ab8fSVarun Wadekar 
37*e954ab8fSVarun Wadekar /*******************************************************************************
38*e954ab8fSVarun Wadekar  * Tegra platforms
39*e954ab8fSVarun Wadekar  ******************************************************************************/
40*e954ab8fSVarun Wadekar typedef enum tegra_platform {
41*e954ab8fSVarun Wadekar 	TEGRA_PLATFORM_SILICON = 0,
42*e954ab8fSVarun Wadekar 	TEGRA_PLATFORM_QT,
43*e954ab8fSVarun Wadekar 	TEGRA_PLATFORM_FPGA,
44*e954ab8fSVarun Wadekar 	TEGRA_PLATFORM_EMULATION,
45*e954ab8fSVarun Wadekar 	TEGRA_PLATFORM_MAX,
46*e954ab8fSVarun Wadekar } tegra_platform_t;
47*e954ab8fSVarun Wadekar 
48*e954ab8fSVarun Wadekar /*******************************************************************************
49*e954ab8fSVarun Wadekar  * Tegra macros defining all the SoC minor versions
50*e954ab8fSVarun Wadekar  ******************************************************************************/
51*e954ab8fSVarun Wadekar #define TEGRA_MINOR_QT			0
52*e954ab8fSVarun Wadekar #define TEGRA_MINOR_FPGA		1
53*e954ab8fSVarun Wadekar #define TEGRA_MINOR_EMULATION_MIN	2
54*e954ab8fSVarun Wadekar #define TEGRA_MINOR_EMULATION_MAX	10
55*e954ab8fSVarun Wadekar 
56*e954ab8fSVarun Wadekar /*******************************************************************************
57*e954ab8fSVarun Wadekar  * Tegra major, minor version helper macros
58*e954ab8fSVarun Wadekar  ******************************************************************************/
59*e954ab8fSVarun Wadekar #define MAJOR_VERSION_SHIFT		0x4
60*e954ab8fSVarun Wadekar #define MAJOR_VERSION_MASK		0xF
61*e954ab8fSVarun Wadekar #define MINOR_VERSION_SHIFT		0x10
62*e954ab8fSVarun Wadekar #define MINOR_VERSION_MASK		0xF
63*e954ab8fSVarun Wadekar #define CHIP_ID_SHIFT			8
64*e954ab8fSVarun Wadekar #define CHIP_ID_MASK			0xFF
65*e954ab8fSVarun Wadekar 
66*e954ab8fSVarun Wadekar /*******************************************************************************
67*e954ab8fSVarun Wadekar  * Tegra chip ID values
68*e954ab8fSVarun Wadekar  ******************************************************************************/
69*e954ab8fSVarun Wadekar typedef enum tegra_chipid {
70*e954ab8fSVarun Wadekar 	TEGRA_CHIPID_TEGRA13 = 0x13,
71*e954ab8fSVarun Wadekar 	TEGRA_CHIPID_TEGRA21 = 0x21,
72*e954ab8fSVarun Wadekar } tegra_chipid_t;
73*e954ab8fSVarun Wadekar 
74*e954ab8fSVarun Wadekar /*
75*e954ab8fSVarun Wadekar  * Read the chip ID value
76*e954ab8fSVarun Wadekar  */
77*e954ab8fSVarun Wadekar static uint32_t tegra_get_chipid(void)
78*e954ab8fSVarun Wadekar {
79*e954ab8fSVarun Wadekar 	return mmio_read_32(TEGRA_MISC_BASE + HARDWARE_REVISION_OFFSET);
80*e954ab8fSVarun Wadekar }
81*e954ab8fSVarun Wadekar 
82*e954ab8fSVarun Wadekar /*
83*e954ab8fSVarun Wadekar  * Read the chip's major version from chip ID value
84*e954ab8fSVarun Wadekar  */
85*e954ab8fSVarun Wadekar static uint32_t tegra_get_chipid_major(void)
86*e954ab8fSVarun Wadekar {
87*e954ab8fSVarun Wadekar 	return (tegra_get_chipid() >> MAJOR_VERSION_SHIFT) & MAJOR_VERSION_MASK;
88*e954ab8fSVarun Wadekar }
89*e954ab8fSVarun Wadekar 
90*e954ab8fSVarun Wadekar /*
91*e954ab8fSVarun Wadekar  * Read the chip's minor version from the chip ID value
92*e954ab8fSVarun Wadekar  */
93*e954ab8fSVarun Wadekar static uint32_t tegra_get_chipid_minor(void)
94*e954ab8fSVarun Wadekar {
95*e954ab8fSVarun Wadekar 	return (tegra_get_chipid() >> MINOR_VERSION_SHIFT) & MINOR_VERSION_MASK;
96*e954ab8fSVarun Wadekar }
97*e954ab8fSVarun Wadekar 
98*e954ab8fSVarun Wadekar uint8_t tegra_chipid_is_t132(void)
99*e954ab8fSVarun Wadekar {
100*e954ab8fSVarun Wadekar 	uint32_t chip_id = (tegra_get_chipid() >> CHIP_ID_SHIFT) & CHIP_ID_MASK;
101*e954ab8fSVarun Wadekar 
102*e954ab8fSVarun Wadekar 	return (chip_id == TEGRA_CHIPID_TEGRA13);
103*e954ab8fSVarun Wadekar }
104*e954ab8fSVarun Wadekar 
105*e954ab8fSVarun Wadekar uint8_t tegra_chipid_is_t210(void)
106*e954ab8fSVarun Wadekar {
107*e954ab8fSVarun Wadekar 	uint32_t chip_id = (tegra_get_chipid() >> CHIP_ID_SHIFT) & CHIP_ID_MASK;
108*e954ab8fSVarun Wadekar 
109*e954ab8fSVarun Wadekar 	return (chip_id == TEGRA_CHIPID_TEGRA21);
110*e954ab8fSVarun Wadekar }
111*e954ab8fSVarun Wadekar 
112*e954ab8fSVarun Wadekar /*
113*e954ab8fSVarun Wadekar  * Read the chip ID value and derive the platform
114*e954ab8fSVarun Wadekar  */
115*e954ab8fSVarun Wadekar static tegra_platform_t tegra_get_platform(void)
116*e954ab8fSVarun Wadekar {
117*e954ab8fSVarun Wadekar 	uint32_t major = tegra_get_chipid_major();
118*e954ab8fSVarun Wadekar 	uint32_t minor = tegra_get_chipid_minor();
119*e954ab8fSVarun Wadekar 
120*e954ab8fSVarun Wadekar 	/* Actual silicon platforms have a non-zero major version */
121*e954ab8fSVarun Wadekar 	if (major > 0)
122*e954ab8fSVarun Wadekar 		return TEGRA_PLATFORM_SILICON;
123*e954ab8fSVarun Wadekar 
124*e954ab8fSVarun Wadekar 	/*
125*e954ab8fSVarun Wadekar 	 * The minor version number is used by simulation platforms
126*e954ab8fSVarun Wadekar 	 */
127*e954ab8fSVarun Wadekar 
128*e954ab8fSVarun Wadekar 	/*
129*e954ab8fSVarun Wadekar 	 * Cadence's QuickTurn emulation system is a Solaris-based
130*e954ab8fSVarun Wadekar 	 * chip emulation system
131*e954ab8fSVarun Wadekar 	 */
132*e954ab8fSVarun Wadekar 	if (minor == TEGRA_MINOR_QT)
133*e954ab8fSVarun Wadekar 		return TEGRA_PLATFORM_QT;
134*e954ab8fSVarun Wadekar 
135*e954ab8fSVarun Wadekar 	/*
136*e954ab8fSVarun Wadekar 	 * FPGAs are used during early software/hardware development
137*e954ab8fSVarun Wadekar 	 */
138*e954ab8fSVarun Wadekar 	if (minor == TEGRA_MINOR_FPGA)
139*e954ab8fSVarun Wadekar 		return TEGRA_PLATFORM_FPGA;
140*e954ab8fSVarun Wadekar 
141*e954ab8fSVarun Wadekar 	/* Minor version reserved for other emulation platforms */
142*e954ab8fSVarun Wadekar 	if ((minor > TEGRA_MINOR_FPGA) && (minor <= TEGRA_MINOR_EMULATION_MAX))
143*e954ab8fSVarun Wadekar 		return TEGRA_PLATFORM_EMULATION;
144*e954ab8fSVarun Wadekar 
145*e954ab8fSVarun Wadekar 	/* unsupported platform */
146*e954ab8fSVarun Wadekar 	return TEGRA_PLATFORM_MAX;
147*e954ab8fSVarun Wadekar }
148*e954ab8fSVarun Wadekar 
149*e954ab8fSVarun Wadekar uint8_t tegra_platform_is_silicon(void)
150*e954ab8fSVarun Wadekar {
151*e954ab8fSVarun Wadekar 	return (tegra_get_platform() == TEGRA_PLATFORM_SILICON);
152*e954ab8fSVarun Wadekar }
153*e954ab8fSVarun Wadekar 
154*e954ab8fSVarun Wadekar uint8_t tegra_platform_is_qt(void)
155*e954ab8fSVarun Wadekar {
156*e954ab8fSVarun Wadekar 	return (tegra_get_platform() == TEGRA_PLATFORM_QT);
157*e954ab8fSVarun Wadekar }
158*e954ab8fSVarun Wadekar 
159*e954ab8fSVarun Wadekar uint8_t tegra_platform_is_fpga(void)
160*e954ab8fSVarun Wadekar {
161*e954ab8fSVarun Wadekar 	return (tegra_get_platform() == TEGRA_PLATFORM_FPGA);
162*e954ab8fSVarun Wadekar }
163*e954ab8fSVarun Wadekar 
164*e954ab8fSVarun Wadekar uint8_t tegra_platform_is_emulation(void)
165*e954ab8fSVarun Wadekar {
166*e954ab8fSVarun Wadekar 	return (tegra_get_platform() == TEGRA_PLATFORM_EMULATION);
167*e954ab8fSVarun Wadekar }
168