1 // SPDX-License-Identifier: GPL-2.0+
3 * Copyright (C) 2011-2015 Panasonic Corporation
4 * Copyright (C) 2016 Socionext Inc.
5 * Author: Masahiro Yamada <yamada.masahiro@socionext.com>
8 #include <linux/errno.h>
10 #include <linux/sizes.h>
15 static int __uniphier_memconf_init(const struct uniphier_board_data *bd,
19 unsigned long size_per_word;
22 switch (bd->dram_ch[0].width) {
24 val |= SG_MEMCONF_CH0_NUM_1;
25 size_per_word = bd->dram_ch[0].size;
28 val |= SG_MEMCONF_CH0_NUM_2;
29 size_per_word = bd->dram_ch[0].size >> 1;
32 pr_err("error: unsupported DRAM ch0 width\n");
36 switch (size_per_word) {
38 val |= SG_MEMCONF_CH0_SZ_64M;
41 val |= SG_MEMCONF_CH0_SZ_128M;
44 val |= SG_MEMCONF_CH0_SZ_256M;
47 val |= SG_MEMCONF_CH0_SZ_512M;
50 val |= SG_MEMCONF_CH0_SZ_1G;
53 pr_err("error: unsupported DRAM ch0 size\n");
58 switch (bd->dram_ch[1].width) {
60 val |= SG_MEMCONF_CH1_NUM_1;
61 size_per_word = bd->dram_ch[1].size;
64 val |= SG_MEMCONF_CH1_NUM_2;
65 size_per_word = bd->dram_ch[1].size >> 1;
68 pr_err("error: unsupported DRAM ch1 width\n");
72 switch (size_per_word) {
74 val |= SG_MEMCONF_CH1_SZ_64M;
77 val |= SG_MEMCONF_CH1_SZ_128M;
80 val |= SG_MEMCONF_CH1_SZ_256M;
83 val |= SG_MEMCONF_CH1_SZ_512M;
86 val |= SG_MEMCONF_CH1_SZ_1G;
89 pr_err("error: unsupported DRAM ch1 size\n");
94 if (bd->flags & UNIPHIER_BD_DRAM_SPARSE)
95 val |= SG_MEMCONF_SPARSEMEM;
100 if (!bd->dram_ch[2].size) {
101 val |= SG_MEMCONF_CH2_DISABLE;
106 switch (bd->dram_ch[2].width) {
108 val |= SG_MEMCONF_CH2_NUM_1;
109 size_per_word = bd->dram_ch[2].size;
112 val |= SG_MEMCONF_CH2_NUM_2;
113 size_per_word = bd->dram_ch[2].size >> 1;
116 pr_err("error: unsupported DRAM ch2 width\n");
120 switch (size_per_word) {
122 val |= SG_MEMCONF_CH2_SZ_64M;
125 val |= SG_MEMCONF_CH2_SZ_128M;
128 val |= SG_MEMCONF_CH2_SZ_256M;
131 val |= SG_MEMCONF_CH2_SZ_512M;
134 val |= SG_MEMCONF_CH2_SZ_1G;
137 pr_err("error: unsupported DRAM ch2 size\n");
142 writel(val, sg_base + SG_MEMCONF);
147 int uniphier_memconf_2ch_init(const struct uniphier_board_data *bd)
149 return __uniphier_memconf_init(bd, 0);
152 int uniphier_memconf_3ch_init(const struct uniphier_board_data *bd)
154 return __uniphier_memconf_init(bd, 1);