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 <common.h> 8 #include <linux/libfdt.h> 9 #include <linux/kernel.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 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