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) 18*a4d86f67SLad Prabhakar #elif (RCAR_LSI == RZ_G2N) 19*a4d86f67SLad Prabhakar #define BOARD_DEFAULT (BOARD_HIHOPE_RZ_G2N << BOARD_CODE_SHIFT) 20ec3e2f67SLad Prabhakar #else 215948f47fSBiju Das #define BOARD_DEFAULT (BOARD_HIHOPE_RZ_G2M << BOARD_CODE_SHIFT) 22ec3e2f67SLad Prabhakar #endif /* RCAR_LSI == RZ_G2H */ 235948f47fSBiju Das #endif /* BOARD_DEFAULT */ 245948f47fSBiju Das 255948f47fSBiju Das #define BOARD_CODE_MASK (0xF8U) 265948f47fSBiju Das #define BOARD_REV_MASK (0x07U) 275948f47fSBiju Das #define BOARD_CODE_SHIFT (0x03) 285948f47fSBiju Das #define BOARD_ID_UNKNOWN (0xFFU) 295948f47fSBiju Das 305948f47fSBiju Das #define GPIO_INDT5 0xE605500C 315948f47fSBiju Das #define GP5_19_BIT (0x01U << 19) 325948f47fSBiju Das #define GP5_21_BIT (0x01U << 21) 335948f47fSBiju Das #define GP5_25_BIT (0x01U << 25) 345948f47fSBiju Das 355948f47fSBiju Das #define HM_ID { 0x10U, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU } 36ec3e2f67SLad Prabhakar #define HH_ID HM_ID 37*a4d86f67SLad Prabhakar #define HN_ID { 0x20U, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU } 385948f47fSBiju Das 395948f47fSBiju Das const char *g_board_tbl[] = { 405948f47fSBiju Das [BOARD_HIHOPE_RZ_G2M] = "HiHope RZ/G2M", 41ec3e2f67SLad Prabhakar [BOARD_HIHOPE_RZ_G2H] = "HiHope RZ/G2H", 42*a4d86f67SLad Prabhakar [BOARD_HIHOPE_RZ_G2N] = "HiHope RZ/G2N", 435948f47fSBiju Das [BOARD_UNKNOWN] = "unknown" 445948f47fSBiju Das }; 455948f47fSBiju Das 465948f47fSBiju Das void rzg_get_board_type(uint32_t *type, uint32_t *rev) 475948f47fSBiju Das { 485948f47fSBiju Das static uint8_t board_id = BOARD_ID_UNKNOWN; 495948f47fSBiju Das const uint8_t board_tbl[][8] = { 505948f47fSBiju Das [BOARD_HIHOPE_RZ_G2M] = HM_ID, 51ec3e2f67SLad Prabhakar [BOARD_HIHOPE_RZ_G2H] = HH_ID, 52*a4d86f67SLad Prabhakar [BOARD_HIHOPE_RZ_G2N] = HN_ID, 535948f47fSBiju Das }; 545948f47fSBiju Das uint32_t reg, boardInfo; 555948f47fSBiju Das 565948f47fSBiju Das if (board_id == BOARD_ID_UNKNOWN) { 575948f47fSBiju Das board_id = BOARD_DEFAULT; 585948f47fSBiju Das } 595948f47fSBiju Das 605948f47fSBiju Das *type = ((uint32_t) board_id & BOARD_CODE_MASK) >> BOARD_CODE_SHIFT; 615948f47fSBiju Das 625948f47fSBiju Das if (*type >= ARRAY_SIZE(board_tbl)) { 635948f47fSBiju Das /* no revision information, set Rev0.0. */ 645948f47fSBiju Das *rev = 0; 65ec3e2f67SLad Prabhakar return; 66ec3e2f67SLad Prabhakar } 67ec3e2f67SLad Prabhakar 685948f47fSBiju Das reg = mmio_read_32(RCAR_PRR); 695948f47fSBiju Das if ((reg & PRR_CUT_MASK) == RCAR_M3_CUT_VER11) { 705948f47fSBiju Das *rev = board_tbl[*type][(uint8_t)(board_id & BOARD_REV_MASK)]; 715948f47fSBiju Das } else { 72ec3e2f67SLad Prabhakar reg = mmio_read_32(GPIO_INDT5); 73*a4d86f67SLad Prabhakar if (reg & GP5_25_BIT) { 74*a4d86f67SLad Prabhakar *rev = board_tbl[*type][(uint8_t)(board_id & BOARD_REV_MASK)]; 75*a4d86f67SLad Prabhakar } else { 76ec3e2f67SLad Prabhakar boardInfo = reg & (GP5_19_BIT | GP5_21_BIT); 775948f47fSBiju Das *rev = (((boardInfo & GP5_19_BIT) >> 14) | 785948f47fSBiju Das ((boardInfo & GP5_21_BIT) >> 17)) + 0x30U; 795948f47fSBiju Das } 805948f47fSBiju Das } 81*a4d86f67SLad Prabhakar } 82