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