15948f47fSBiju Das /* 2*ec3e2f67SLad 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 16*ec3e2f67SLad Prabhakar #if (RCAR_LSI == RZ_G2H) 17*ec3e2f67SLad Prabhakar #define BOARD_DEFAULT (BOARD_HIHOPE_RZ_G2H << BOARD_CODE_SHIFT) 18*ec3e2f67SLad Prabhakar #else 195948f47fSBiju Das #define BOARD_DEFAULT (BOARD_HIHOPE_RZ_G2M << BOARD_CODE_SHIFT) 20*ec3e2f67SLad Prabhakar #endif /* RCAR_LSI == RZ_G2H */ 215948f47fSBiju Das #endif /* BOARD_DEFAULT */ 225948f47fSBiju Das 235948f47fSBiju Das #define BOARD_CODE_MASK (0xF8U) 245948f47fSBiju Das #define BOARD_REV_MASK (0x07U) 255948f47fSBiju Das #define BOARD_CODE_SHIFT (0x03) 265948f47fSBiju Das #define BOARD_ID_UNKNOWN (0xFFU) 275948f47fSBiju Das 285948f47fSBiju Das #define GPIO_INDT5 0xE605500C 295948f47fSBiju Das #define GP5_19_BIT (0x01U << 19) 305948f47fSBiju Das #define GP5_21_BIT (0x01U << 21) 315948f47fSBiju Das #define GP5_25_BIT (0x01U << 25) 325948f47fSBiju Das 335948f47fSBiju Das #define HM_ID { 0x10U, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU } 34*ec3e2f67SLad Prabhakar #define HH_ID HM_ID 355948f47fSBiju Das 365948f47fSBiju Das const char *g_board_tbl[] = { 375948f47fSBiju Das [BOARD_HIHOPE_RZ_G2M] = "HiHope RZ/G2M", 38*ec3e2f67SLad Prabhakar [BOARD_HIHOPE_RZ_G2H] = "HiHope RZ/G2H", 395948f47fSBiju Das [BOARD_UNKNOWN] = "unknown" 405948f47fSBiju Das }; 415948f47fSBiju Das 425948f47fSBiju Das void rzg_get_board_type(uint32_t *type, uint32_t *rev) 435948f47fSBiju Das { 445948f47fSBiju Das static uint8_t board_id = BOARD_ID_UNKNOWN; 455948f47fSBiju Das const uint8_t board_tbl[][8] = { 465948f47fSBiju Das [BOARD_HIHOPE_RZ_G2M] = HM_ID, 47*ec3e2f67SLad Prabhakar [BOARD_HIHOPE_RZ_G2H] = HH_ID, 485948f47fSBiju Das }; 495948f47fSBiju Das uint32_t reg, boardInfo; 505948f47fSBiju Das 515948f47fSBiju Das if (board_id == BOARD_ID_UNKNOWN) { 525948f47fSBiju Das board_id = BOARD_DEFAULT; 535948f47fSBiju Das } 545948f47fSBiju Das 555948f47fSBiju Das *type = ((uint32_t) board_id & BOARD_CODE_MASK) >> BOARD_CODE_SHIFT; 565948f47fSBiju Das 575948f47fSBiju Das if (*type >= ARRAY_SIZE(board_tbl)) { 585948f47fSBiju Das /* no revision information, set Rev0.0. */ 595948f47fSBiju Das *rev = 0; 60*ec3e2f67SLad Prabhakar return; 61*ec3e2f67SLad Prabhakar } 62*ec3e2f67SLad Prabhakar 635948f47fSBiju Das reg = mmio_read_32(RCAR_PRR); 645948f47fSBiju Das if ((reg & PRR_CUT_MASK) == RCAR_M3_CUT_VER11) { 655948f47fSBiju Das *rev = board_tbl[*type][(uint8_t)(board_id & BOARD_REV_MASK)]; 665948f47fSBiju Das } else { 67*ec3e2f67SLad Prabhakar reg = mmio_read_32(GPIO_INDT5); 68*ec3e2f67SLad Prabhakar boardInfo = reg & (GP5_19_BIT | GP5_21_BIT); 695948f47fSBiju Das *rev = (((boardInfo & GP5_19_BIT) >> 14) | 705948f47fSBiju Das ((boardInfo & GP5_21_BIT) >> 17)) + 0x30U; 715948f47fSBiju Das } 725948f47fSBiju Das } 73