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