1 /* 2 * Copyright (C) 2015-2016 Socionext Inc. 3 * Author: Masahiro Yamada <yamada.masahiro@socionext.com> 4 * 5 * SPDX-License-Identifier: GPL-2.0+ 6 */ 7 8 #include <common.h> 9 #include <libfdt.h> 10 #include <linux/kernel.h> 11 12 #include "init.h" 13 14 DECLARE_GLOBAL_DATA_PTR; 15 16 #if defined(CONFIG_ARCH_UNIPHIER_SLD3) 17 static const struct uniphier_board_data uniphier_sld3_data = { 18 .dram_freq = 1600, 19 .dram_nr_ch = 3, 20 .dram_ch[0] = { 21 .base = 0x80000000, 22 .size = 0x20000000, 23 .width = 32, 24 }, 25 .dram_ch[1] = { 26 .base = 0xc0000000, 27 .size = 0x20000000, 28 .width = 16, 29 }, 30 .dram_ch[2] = { 31 .base = 0xc0000000, 32 .size = 0x10000000, 33 .width = 16, 34 }, 35 }; 36 #endif 37 38 #if defined(CONFIG_ARCH_UNIPHIER_LD4) 39 static const struct uniphier_board_data uniphier_ld4_data = { 40 .dram_freq = 1600, 41 .dram_nr_ch = 2, 42 .dram_ch[0] = { 43 .base = 0x80000000, 44 .size = 0x10000000, 45 .width = 16, 46 }, 47 .dram_ch[1] = { 48 .base = 0x90000000, 49 .size = 0x10000000, 50 .width = 16, 51 }, 52 .flags = UNIPHIER_BD_DDR3PLUS, 53 }; 54 #endif 55 56 #if defined(CONFIG_ARCH_UNIPHIER_PRO4) 57 /* 1GB RAM board */ 58 static const struct uniphier_board_data uniphier_pro4_data = { 59 .dram_freq = 1600, 60 .dram_nr_ch = 2, 61 .dram_ch[0] = { 62 .base = 0x80000000, 63 .size = 0x20000000, 64 .width = 32, 65 }, 66 .dram_ch[1] = { 67 .base = 0xa0000000, 68 .size = 0x20000000, 69 .width = 32, 70 }, 71 }; 72 73 /* 2GB RAM board */ 74 static const struct uniphier_board_data uniphier_pro4_2g_data = { 75 .dram_freq = 1600, 76 .dram_nr_ch = 2, 77 .dram_ch[0] = { 78 .base = 0x80000000, 79 .size = 0x40000000, 80 .width = 32, 81 }, 82 .dram_ch[1] = { 83 .base = 0xc0000000, 84 .size = 0x40000000, 85 .width = 32, 86 }, 87 }; 88 #endif 89 90 #if defined(CONFIG_ARCH_UNIPHIER_SLD8) 91 static const struct uniphier_board_data uniphier_sld8_data = { 92 .dram_freq = 1333, 93 .dram_nr_ch = 2, 94 .dram_ch[0] = { 95 .base = 0x80000000, 96 .size = 0x10000000, 97 .width = 16, 98 }, 99 .dram_ch[1] = { 100 .base = 0x90000000, 101 .size = 0x10000000, 102 .width = 16, 103 }, 104 .flags = UNIPHIER_BD_DDR3PLUS, 105 }; 106 #endif 107 108 #if defined(CONFIG_ARCH_UNIPHIER_PRO5) 109 static const struct uniphier_board_data uniphier_pro5_data = { 110 .dram_freq = 1866, 111 .dram_nr_ch = 2, 112 .dram_ch[0] = { 113 .base = 0x80000000, 114 .size = 0x20000000, 115 .width = 32, 116 }, 117 .dram_ch[1] = { 118 .base = 0xa0000000, 119 .size = 0x20000000, 120 .width = 32, 121 }, 122 }; 123 #endif 124 125 #if defined(CONFIG_ARCH_UNIPHIER_PXS2) 126 static const struct uniphier_board_data uniphier_pxs2_data = { 127 .dram_freq = 2133, 128 .dram_nr_ch = 3, 129 .dram_ch[0] = { 130 .base = 0x80000000, 131 .size = 0x40000000, 132 .width = 32, 133 }, 134 .dram_ch[1] = { 135 .base = 0xc0000000, 136 .size = 0x20000000, 137 .width = 32, 138 }, 139 .dram_ch[2] = { 140 .base = 0xe0000000, 141 .size = 0x20000000, 142 .width = 16, 143 }, 144 }; 145 #endif 146 147 #if defined(CONFIG_ARCH_UNIPHIER_LD6B) 148 static const struct uniphier_board_data uniphier_ld6b_data = { 149 .dram_freq = 1866, 150 .dram_nr_ch = 3, 151 .dram_ch[0] = { 152 .base = 0x80000000, 153 .size = 0x40000000, 154 .width = 32, 155 }, 156 .dram_ch[1] = { 157 .base = 0xc0000000, 158 .size = 0x20000000, 159 .width = 32, 160 }, 161 .dram_ch[2] = { 162 .base = 0xe0000000, 163 .size = 0x20000000, 164 .width = 16, 165 }, 166 }; 167 #endif 168 169 #if defined(CONFIG_ARCH_UNIPHIER_LD11) 170 static const struct uniphier_board_data uniphier_ld11_data = { 171 .dram_freq = 1600, 172 .dram_nr_ch = 2, 173 .dram_ch[0] = { 174 .base = 0x80000000, 175 .size = 0x20000000, 176 .width = 16, 177 }, 178 .dram_ch[1] = { 179 .base = 0xa0000000, 180 .size = 0x20000000, 181 .width = 16, 182 }, 183 }; 184 #endif 185 186 #if defined(CONFIG_ARCH_UNIPHIER_LD20) 187 static const struct uniphier_board_data uniphier_ld20_ref_data = { 188 .dram_freq = 1866, 189 .dram_nr_ch = 3, 190 .dram_ch[0] = { 191 .base = 0x80000000, 192 .size = 0x40000000, 193 .width = 32, 194 }, 195 .dram_ch[1] = { 196 .base = 0xc0000000, 197 .size = 0x40000000, 198 .width = 32, 199 }, 200 .dram_ch[2] = { 201 .base = 0x100000000UL, 202 .size = 0x40000000, 203 .width = 32, 204 }, 205 .flags = UNIPHIER_BD_BOARD_LD20_REF, 206 }; 207 208 static const struct uniphier_board_data uniphier_ld20_data = { 209 .dram_freq = 1866, 210 .dram_nr_ch = 3, 211 .dram_ch[0] = { 212 .base = 0x80000000, 213 .size = 0x40000000, 214 .width = 32, 215 }, 216 .dram_ch[1] = { 217 .base = 0xc0000000, 218 .size = 0x40000000, 219 .width = 32, 220 }, 221 .dram_ch[2] = { 222 .base = 0x100000000UL, 223 .size = 0x40000000, 224 .width = 32, 225 }, 226 .flags = UNIPHIER_BD_BOARD_LD20_GLOBAL, 227 }; 228 229 static const struct uniphier_board_data uniphier_ld21_data = { 230 .dram_freq = 1866, 231 .dram_nr_ch = 2, 232 .dram_ch[0] = { 233 .base = 0x80000000, 234 .size = 0x20000000, 235 .width = 32, 236 }, 237 .dram_ch[1] = { 238 .base = 0xc0000000, 239 .size = 0x40000000, 240 .width = 32, 241 }, 242 .flags = UNIPHIER_BD_BOARD_LD21_GLOBAL, 243 }; 244 #endif 245 246 struct uniphier_board_id { 247 const char *compatible; 248 const struct uniphier_board_data *param; 249 }; 250 251 static const struct uniphier_board_id uniphier_boards[] = { 252 #if defined(CONFIG_ARCH_UNIPHIER_SLD3) 253 { "socionext,uniphier-sld3", &uniphier_sld3_data, }, 254 #endif 255 #if defined(CONFIG_ARCH_UNIPHIER_LD4) 256 { "socionext,uniphier-ld4", &uniphier_ld4_data, }, 257 #endif 258 #if defined(CONFIG_ARCH_UNIPHIER_PRO4) 259 { "socionext,uniphier-pro4-ace", &uniphier_pro4_2g_data, }, 260 { "socionext,uniphier-pro4-sanji", &uniphier_pro4_2g_data, }, 261 { "socionext,uniphier-pro4", &uniphier_pro4_data, }, 262 #endif 263 #if defined(CONFIG_ARCH_UNIPHIER_SLD8) 264 { "socionext,uniphier-sld8", &uniphier_sld8_data, }, 265 #endif 266 #if defined(CONFIG_ARCH_UNIPHIER_PRO5) 267 { "socionext,uniphier-pro5", &uniphier_pro5_data, }, 268 #endif 269 #if defined(CONFIG_ARCH_UNIPHIER_PXS2) 270 { "socionext,uniphier-pxs2", &uniphier_pxs2_data, }, 271 #endif 272 #if defined(CONFIG_ARCH_UNIPHIER_LD6B) 273 { "socionext,uniphier-ld6b", &uniphier_ld6b_data, }, 274 #endif 275 #if defined(CONFIG_ARCH_UNIPHIER_LD11) 276 { "socionext,uniphier-ld11", &uniphier_ld11_data, }, 277 #endif 278 #if defined(CONFIG_ARCH_UNIPHIER_LD20) 279 { "socionext,uniphier-ld21", &uniphier_ld21_data, }, 280 { "socionext,uniphier-ld20-ref", &uniphier_ld20_ref_data, }, 281 { "socionext,uniphier-ld20", &uniphier_ld20_data, }, 282 #endif 283 }; 284 285 const struct uniphier_board_data *uniphier_get_board_param(void) 286 { 287 int i; 288 289 for (i = 0; i < ARRAY_SIZE(uniphier_boards); i++) { 290 if (!fdt_node_check_compatible(gd->fdt_blob, 0, 291 uniphier_boards[i].compatible)) 292 return uniphier_boards[i].param; 293 } 294 295 return NULL; 296 } 297