1 // SPDX-License-Identifier: GPL-2.0+
2 /*
3  * Copyright (C) 2015-2016 Socionext Inc.
4  *   Author: Masahiro Yamada <yamada.masahiro@socionext.com>
5  */
6 
7 #include <linux/libfdt.h>
8 #include <linux/kernel.h>
9 #include <asm/global_data.h>
10 
11 #include "init.h"
12 
13 DECLARE_GLOBAL_DATA_PTR;
14 
15 #if defined(CONFIG_ARCH_UNIPHIER_LD4)
16 static const struct uniphier_board_data uniphier_ld4_data = {
17 	.dram_freq = 1600,
18 	.dram_ch[0] = {
19 		.size = 0x10000000,
20 		.width = 16,
21 	},
22 	.dram_ch[1] = {
23 		.size = 0x10000000,
24 		.width = 16,
25 	},
26 	.flags = UNIPHIER_BD_DDR3PLUS,
27 };
28 #endif
29 
30 #if defined(CONFIG_ARCH_UNIPHIER_PRO4)
31 /* 1GB RAM board */
32 static const struct uniphier_board_data uniphier_pro4_data = {
33 	.dram_freq = 1600,
34 	.dram_ch[0] = {
35 		.size = 0x20000000,
36 		.width = 32,
37 	},
38 	.dram_ch[1] = {
39 		.size = 0x20000000,
40 		.width = 32,
41 	},
42 };
43 
44 /* 2GB RAM board */
45 static const struct uniphier_board_data uniphier_pro4_2g_data = {
46 	.dram_freq = 1600,
47 	.dram_ch[0] = {
48 		.size = 0x40000000,
49 		.width = 32,
50 	},
51 	.dram_ch[1] = {
52 		.size = 0x40000000,
53 		.width = 32,
54 	},
55 };
56 #endif
57 
58 #if defined(CONFIG_ARCH_UNIPHIER_SLD8)
59 static const struct uniphier_board_data uniphier_sld8_data = {
60 	.dram_freq = 1333,
61 	.dram_ch[0] = {
62 		.size = 0x10000000,
63 		.width = 16,
64 	},
65 	.dram_ch[1] = {
66 		.size = 0x10000000,
67 		.width = 16,
68 	},
69 	.flags = UNIPHIER_BD_DDR3PLUS,
70 };
71 #endif
72 
73 #if defined(CONFIG_ARCH_UNIPHIER_PRO5)
74 static const struct uniphier_board_data uniphier_pro5_data = {
75 	.dram_freq = 1866,
76 	.dram_ch[0] = {
77 		.size = 0x20000000,
78 		.width = 32,
79 	},
80 	.dram_ch[1] = {
81 		.size = 0x20000000,
82 		.width = 32,
83 	},
84 };
85 #endif
86 
87 #if defined(CONFIG_ARCH_UNIPHIER_PXS2)
88 static const struct uniphier_board_data uniphier_pxs2_data = {
89 	.dram_freq = 2133,
90 	.dram_ch[0] = {
91 		.size = 0x40000000,
92 		.width = 32,
93 	},
94 	.dram_ch[1] = {
95 		.size = 0x20000000,
96 		.width = 32,
97 	},
98 	.dram_ch[2] = {
99 		.size = 0x20000000,
100 		.width = 16,
101 	},
102 };
103 #endif
104 
105 #if defined(CONFIG_ARCH_UNIPHIER_LD6B)
106 static const struct uniphier_board_data uniphier_ld6b_data = {
107 	.dram_freq = 1866,
108 	.dram_ch[0] = {
109 		.size = 0x40000000,
110 		.width = 32,
111 	},
112 	.dram_ch[1] = {
113 		.size = 0x20000000,
114 		.width = 32,
115 	},
116 	.dram_ch[2] = {
117 		.size = 0x20000000,
118 		.width = 16,
119 	},
120 };
121 #endif
122 
123 struct uniphier_board_id {
124 	const char *compatible;
125 	const struct uniphier_board_data *param;
126 };
127 
128 static const struct uniphier_board_id uniphier_boards[] = {
129 #if defined(CONFIG_ARCH_UNIPHIER_LD4)
130 	{ "socionext,uniphier-ld4", &uniphier_ld4_data, },
131 #endif
132 #if defined(CONFIG_ARCH_UNIPHIER_PRO4)
133 	{ "socionext,uniphier-pro4-ace", &uniphier_pro4_2g_data, },
134 	{ "socionext,uniphier-pro4-sanji", &uniphier_pro4_2g_data, },
135 	{ "socionext,uniphier-pro4", &uniphier_pro4_data, },
136 #endif
137 #if defined(CONFIG_ARCH_UNIPHIER_SLD8)
138 	{ "socionext,uniphier-sld8", &uniphier_sld8_data, },
139 #endif
140 #if defined(CONFIG_ARCH_UNIPHIER_PRO5)
141 	{ "socionext,uniphier-pro5", &uniphier_pro5_data, },
142 #endif
143 #if defined(CONFIG_ARCH_UNIPHIER_PXS2)
144 	{ "socionext,uniphier-pxs2", &uniphier_pxs2_data, },
145 #endif
146 #if defined(CONFIG_ARCH_UNIPHIER_LD6B)
147 	{ "socionext,uniphier-ld6b", &uniphier_ld6b_data, },
148 #endif
149 };
150 
uniphier_get_board_param(void)151 const struct uniphier_board_data *uniphier_get_board_param(void)
152 {
153 	int i;
154 
155 	for (i = 0; i < ARRAY_SIZE(uniphier_boards); i++) {
156 		if (!fdt_node_check_compatible(gd->fdt_blob, 0,
157 					       uniphier_boards[i].compatible))
158 			return uniphier_boards[i].param;
159 	}
160 
161 	return NULL;
162 }
163