xref: /arm-trusted-firmware/drivers/renesas/rcar/board/board.c (revision 91f16700b400a8c0651d24a598fc48ee2997a0d7)
1*91f16700Schasinglulu /*
2*91f16700Schasinglulu  * Copyright (c) 2015-2021, Renesas Electronics Corporation. All rights
3*91f16700Schasinglulu  * reserved.
4*91f16700Schasinglulu  *
5*91f16700Schasinglulu  * SPDX-License-Identifier: BSD-3-Clause
6*91f16700Schasinglulu  */
7*91f16700Schasinglulu 
8*91f16700Schasinglulu #include <stdint.h>
9*91f16700Schasinglulu 
10*91f16700Schasinglulu #include <lib/utils_def.h>
11*91f16700Schasinglulu 
12*91f16700Schasinglulu #include <iic_dvfs.h>
13*91f16700Schasinglulu 
14*91f16700Schasinglulu #include "board.h"
15*91f16700Schasinglulu 
16*91f16700Schasinglulu #ifndef BOARD_DEFAULT
17*91f16700Schasinglulu #if (RCAR_LSI == RCAR_D3)
18*91f16700Schasinglulu #define BOARD_DEFAULT		(BOARD_DRAAK << BOARD_CODE_SHIFT)
19*91f16700Schasinglulu #elif (RCAR_LSI == RCAR_E3)
20*91f16700Schasinglulu #define BOARD_DEFAULT		(BOARD_EBISU << BOARD_CODE_SHIFT)
21*91f16700Schasinglulu #elif (RCAR_LSI == RCAR_V3M)
22*91f16700Schasinglulu #define BOARD_DEFAULT		(BOARD_EAGLE << BOARD_CODE_SHIFT)
23*91f16700Schasinglulu #else
24*91f16700Schasinglulu #define BOARD_DEFAULT		(BOARD_SALVATOR_X << BOARD_CODE_SHIFT)
25*91f16700Schasinglulu #endif
26*91f16700Schasinglulu #endif
27*91f16700Schasinglulu 
28*91f16700Schasinglulu #define BOARD_CODE_MASK		(0xF8)
29*91f16700Schasinglulu #define BOARD_REV_MASK		(0x07)
30*91f16700Schasinglulu #define BOARD_CODE_SHIFT	(0x03)
31*91f16700Schasinglulu #define BOARD_ID_UNKNOWN	(0xFF)
32*91f16700Schasinglulu 
33*91f16700Schasinglulu #define SXS_ID	{ 0x10U, 0x11U, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU }
34*91f16700Schasinglulu #define SX_ID	{ 0x10U, 0x11U, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU }
35*91f16700Schasinglulu #define SKP_ID	{ 0x10U, 0x10U, 0x20U, 0x21U, 0xFFU, 0xFFU, 0xFFU, 0xFFU }
36*91f16700Schasinglulu #define SK_ID	{ 0x10U, 0x30U, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU }
37*91f16700Schasinglulu #define EB4_ID	{ 0x10U, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU }
38*91f16700Schasinglulu #define EB_ID	{ 0x10U, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU }
39*91f16700Schasinglulu #define DR_ID	{ 0x10U, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU }
40*91f16700Schasinglulu #define EA_ID	{ 0x10U, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU }
41*91f16700Schasinglulu #define KK_ID	{ 0x10U, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU }
42*91f16700Schasinglulu 
43*91f16700Schasinglulu const char *g_board_tbl[] = {
44*91f16700Schasinglulu 	[BOARD_STARTER_KIT_PRE] = "Starter Kit Premier",
45*91f16700Schasinglulu 	[BOARD_STARTER_KIT] = "Starter Kit",
46*91f16700Schasinglulu 	[BOARD_SALVATOR_XS] = "Salvator-XS",
47*91f16700Schasinglulu 	[BOARD_SALVATOR_X] = "Salvator-X",
48*91f16700Schasinglulu 	[BOARD_EBISU_4D] = "Ebisu-4D",
49*91f16700Schasinglulu 	[BOARD_KRIEK] = "Kriek",
50*91f16700Schasinglulu 	[BOARD_EBISU] = "Ebisu",
51*91f16700Schasinglulu 	[BOARD_DRAAK] = "Draak",
52*91f16700Schasinglulu 	[BOARD_EAGLE] = "Eagle",
53*91f16700Schasinglulu 	[BOARD_UNKNOWN] = "unknown"
54*91f16700Schasinglulu };
55*91f16700Schasinglulu 
56*91f16700Schasinglulu int32_t rcar_get_board_type(uint32_t *type, uint32_t *rev)
57*91f16700Schasinglulu {
58*91f16700Schasinglulu 	int32_t ret = 0;
59*91f16700Schasinglulu 	const uint8_t board_tbl[][8] = {
60*91f16700Schasinglulu 		[BOARD_STARTER_KIT_PRE] = SKP_ID,
61*91f16700Schasinglulu 		[BOARD_SALVATOR_XS] = SXS_ID,
62*91f16700Schasinglulu 		[BOARD_STARTER_KIT] = SK_ID,
63*91f16700Schasinglulu 		[BOARD_SALVATOR_X] = SX_ID,
64*91f16700Schasinglulu 		[BOARD_EBISU_4D] = EB4_ID,
65*91f16700Schasinglulu 		[BOARD_EBISU] = EB_ID,
66*91f16700Schasinglulu 		[BOARD_DRAAK] = DR_ID,
67*91f16700Schasinglulu 		[BOARD_EAGLE] = EA_ID,
68*91f16700Schasinglulu 		[BOARD_KRIEK] = KK_ID,
69*91f16700Schasinglulu 	};
70*91f16700Schasinglulu 	static uint8_t board_id = BOARD_ID_UNKNOWN;
71*91f16700Schasinglulu 
72*91f16700Schasinglulu 	if (board_id != BOARD_ID_UNKNOWN)
73*91f16700Schasinglulu 		goto get_type;
74*91f16700Schasinglulu 
75*91f16700Schasinglulu #if PMIC_ROHM_BD9571
76*91f16700Schasinglulu 	/* Board ID detection from EEPROM */
77*91f16700Schasinglulu 	ret = rcar_iic_dvfs_receive(EEPROM, BOARD_ID, &board_id);
78*91f16700Schasinglulu 	if (ret) {
79*91f16700Schasinglulu 		board_id = BOARD_ID_UNKNOWN;
80*91f16700Schasinglulu 		goto get_type;
81*91f16700Schasinglulu 	}
82*91f16700Schasinglulu 
83*91f16700Schasinglulu 	if (board_id == BOARD_ID_UNKNOWN)
84*91f16700Schasinglulu 		board_id = BOARD_DEFAULT;
85*91f16700Schasinglulu #else
86*91f16700Schasinglulu 	board_id = BOARD_DEFAULT;
87*91f16700Schasinglulu #endif
88*91f16700Schasinglulu 
89*91f16700Schasinglulu get_type:
90*91f16700Schasinglulu 	*type = ((uint32_t) board_id & BOARD_CODE_MASK) >> BOARD_CODE_SHIFT;
91*91f16700Schasinglulu 
92*91f16700Schasinglulu 	if (*type >= ARRAY_SIZE(board_tbl)) {
93*91f16700Schasinglulu 		/* no revision information, set Rev0.0. */
94*91f16700Schasinglulu 		*rev = 0;
95*91f16700Schasinglulu 		return ret;
96*91f16700Schasinglulu 	}
97*91f16700Schasinglulu 
98*91f16700Schasinglulu 	*rev = board_tbl[*type][(uint8_t) (board_id & BOARD_REV_MASK)];
99*91f16700Schasinglulu 
100*91f16700Schasinglulu 	return ret;
101*91f16700Schasinglulu }
102