15948f47fSBiju Das /* 2ec3e2f67SLad Prabhakar * Copyright (c) 2020-2021, Renesas Electronics Corporation. All rights reserved. 35948f47fSBiju Das * 45948f47fSBiju Das * SPDX-License-Identifier: BSD-3-Clause 55948f47fSBiju Das */ 65948f47fSBiju Das 75948f47fSBiju Das #include <stdint.h> 85948f47fSBiju Das 95948f47fSBiju Das #include <lib/mmio.h> 105948f47fSBiju Das #include <lib/utils_def.h> 115948f47fSBiju Das 125948f47fSBiju Das #include "board.h" 135948f47fSBiju Das #include "rcar_def.h" 145948f47fSBiju Das 155948f47fSBiju Das #ifndef BOARD_DEFAULT 16ec3e2f67SLad Prabhakar #if (RCAR_LSI == RZ_G2H) 17ec3e2f67SLad Prabhakar #define BOARD_DEFAULT (BOARD_HIHOPE_RZ_G2H << BOARD_CODE_SHIFT) 18a4d86f67SLad Prabhakar #elif (RCAR_LSI == RZ_G2N) 19a4d86f67SLad Prabhakar #define BOARD_DEFAULT (BOARD_HIHOPE_RZ_G2N << BOARD_CODE_SHIFT) 20*bcf43f04SLad Prabhakar #elif (RCAR_LSI == RZ_G2E) 21*bcf43f04SLad Prabhakar #define BOARD_DEFAULT (BOARD_EK874_RZ_G2E << BOARD_CODE_SHIFT) 22ec3e2f67SLad Prabhakar #else 235948f47fSBiju Das #define BOARD_DEFAULT (BOARD_HIHOPE_RZ_G2M << BOARD_CODE_SHIFT) 24ec3e2f67SLad Prabhakar #endif /* RCAR_LSI == RZ_G2H */ 255948f47fSBiju Das #endif /* BOARD_DEFAULT */ 265948f47fSBiju Das 275948f47fSBiju Das #define BOARD_CODE_MASK (0xF8U) 285948f47fSBiju Das #define BOARD_REV_MASK (0x07U) 295948f47fSBiju Das #define BOARD_CODE_SHIFT (0x03) 305948f47fSBiju Das #define BOARD_ID_UNKNOWN (0xFFU) 315948f47fSBiju Das 325948f47fSBiju Das #define GPIO_INDT5 0xE605500C 335948f47fSBiju Das #define GP5_19_BIT (0x01U << 19) 345948f47fSBiju Das #define GP5_21_BIT (0x01U << 21) 355948f47fSBiju Das #define GP5_25_BIT (0x01U << 25) 365948f47fSBiju Das 375948f47fSBiju Das #define HM_ID { 0x10U, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU } 38ec3e2f67SLad Prabhakar #define HH_ID HM_ID 39a4d86f67SLad Prabhakar #define HN_ID { 0x20U, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU } 40*bcf43f04SLad Prabhakar #define EK_ID HM_ID 415948f47fSBiju Das 425948f47fSBiju Das const char *g_board_tbl[] = { 435948f47fSBiju Das [BOARD_HIHOPE_RZ_G2M] = "HiHope RZ/G2M", 44ec3e2f67SLad Prabhakar [BOARD_HIHOPE_RZ_G2H] = "HiHope RZ/G2H", 45a4d86f67SLad Prabhakar [BOARD_HIHOPE_RZ_G2N] = "HiHope RZ/G2N", 46*bcf43f04SLad Prabhakar [BOARD_EK874_RZ_G2E] = "EK874 RZ/G2E", 475948f47fSBiju Das [BOARD_UNKNOWN] = "unknown" 485948f47fSBiju Das }; 495948f47fSBiju Das 505948f47fSBiju Das void rzg_get_board_type(uint32_t *type, uint32_t *rev) 515948f47fSBiju Das { 525948f47fSBiju Das static uint8_t board_id = BOARD_ID_UNKNOWN; 535948f47fSBiju Das const uint8_t board_tbl[][8] = { 545948f47fSBiju Das [BOARD_HIHOPE_RZ_G2M] = HM_ID, 55ec3e2f67SLad Prabhakar [BOARD_HIHOPE_RZ_G2H] = HH_ID, 56a4d86f67SLad Prabhakar [BOARD_HIHOPE_RZ_G2N] = HN_ID, 57*bcf43f04SLad Prabhakar [BOARD_EK874_RZ_G2E] = EK_ID, 585948f47fSBiju Das }; 59*bcf43f04SLad Prabhakar uint32_t reg; 60*bcf43f04SLad Prabhakar #if (RCAR_LSI != RZ_G2E) 61*bcf43f04SLad Prabhakar uint32_t boardInfo; 62*bcf43f04SLad Prabhakar #endif /* RCAR_LSI == RZ_G2E */ 635948f47fSBiju Das 645948f47fSBiju Das if (board_id == BOARD_ID_UNKNOWN) { 655948f47fSBiju Das board_id = BOARD_DEFAULT; 665948f47fSBiju Das } 675948f47fSBiju Das 685948f47fSBiju Das *type = ((uint32_t) board_id & BOARD_CODE_MASK) >> BOARD_CODE_SHIFT; 695948f47fSBiju Das 705948f47fSBiju Das if (*type >= ARRAY_SIZE(board_tbl)) { 715948f47fSBiju Das /* no revision information, set Rev0.0. */ 725948f47fSBiju Das *rev = 0; 73ec3e2f67SLad Prabhakar return; 74ec3e2f67SLad Prabhakar } 75ec3e2f67SLad Prabhakar 765948f47fSBiju Das reg = mmio_read_32(RCAR_PRR); 77*bcf43f04SLad Prabhakar #if (RCAR_LSI == RZ_G2E) 78*bcf43f04SLad Prabhakar if (reg & RCAR_MINOR_MASK) { 79*bcf43f04SLad Prabhakar *rev = 0x30U; 80*bcf43f04SLad Prabhakar } else { 81*bcf43f04SLad Prabhakar *rev = board_tbl[*type][(uint8_t)(board_id & BOARD_REV_MASK)]; 82*bcf43f04SLad Prabhakar } 83*bcf43f04SLad Prabhakar #else 845948f47fSBiju Das if ((reg & PRR_CUT_MASK) == RCAR_M3_CUT_VER11) { 855948f47fSBiju Das *rev = board_tbl[*type][(uint8_t)(board_id & BOARD_REV_MASK)]; 865948f47fSBiju Das } else { 87ec3e2f67SLad Prabhakar reg = mmio_read_32(GPIO_INDT5); 88a4d86f67SLad Prabhakar if (reg & GP5_25_BIT) { 89a4d86f67SLad Prabhakar *rev = board_tbl[*type][(uint8_t)(board_id & BOARD_REV_MASK)]; 90a4d86f67SLad Prabhakar } else { 91ec3e2f67SLad Prabhakar boardInfo = reg & (GP5_19_BIT | GP5_21_BIT); 925948f47fSBiju Das *rev = (((boardInfo & GP5_19_BIT) >> 14) | 935948f47fSBiju Das ((boardInfo & GP5_21_BIT) >> 17)) + 0x30U; 945948f47fSBiju Das } 955948f47fSBiju Das } 96*bcf43f04SLad Prabhakar #endif /* RCAR_LSI == RZ_G2E */ 97a4d86f67SLad Prabhakar } 98