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>
9 #include <linux/errno.h>
11 #include <linux/sizes.h>
16 static int __uniphier_memconf_init(const struct uniphier_board_data *bd,
20 unsigned long size_per_word;
23 switch (bd->dram_ch[0].width) {
25 val |= SG_MEMCONF_CH0_NUM_1;
26 size_per_word = bd->dram_ch[0].size;
29 val |= SG_MEMCONF_CH0_NUM_2;
30 size_per_word = bd->dram_ch[0].size >> 1;
33 pr_err("error: unsupported DRAM ch0 width\n");
37 switch (size_per_word) {
39 val |= SG_MEMCONF_CH0_SZ_64M;
42 val |= SG_MEMCONF_CH0_SZ_128M;
45 val |= SG_MEMCONF_CH0_SZ_256M;
48 val |= SG_MEMCONF_CH0_SZ_512M;
51 val |= SG_MEMCONF_CH0_SZ_1G;
54 pr_err("error: unsupported DRAM ch0 size\n");
59 switch (bd->dram_ch[1].width) {
61 val |= SG_MEMCONF_CH1_NUM_1;
62 size_per_word = bd->dram_ch[1].size;
65 val |= SG_MEMCONF_CH1_NUM_2;
66 size_per_word = bd->dram_ch[1].size >> 1;
69 pr_err("error: unsupported DRAM ch1 width\n");
73 switch (size_per_word) {
75 val |= SG_MEMCONF_CH1_SZ_64M;
78 val |= SG_MEMCONF_CH1_SZ_128M;
81 val |= SG_MEMCONF_CH1_SZ_256M;
84 val |= SG_MEMCONF_CH1_SZ_512M;
87 val |= SG_MEMCONF_CH1_SZ_1G;
90 pr_err("error: unsupported DRAM ch1 size\n");
95 if (bd->flags & UNIPHIER_BD_DRAM_SPARSE)
96 val |= SG_MEMCONF_SPARSEMEM;
101 if (!bd->dram_ch[2].size) {
102 val |= SG_MEMCONF_CH2_DISABLE;
107 switch (bd->dram_ch[2].width) {
109 val |= SG_MEMCONF_CH2_NUM_1;
110 size_per_word = bd->dram_ch[2].size;
113 val |= SG_MEMCONF_CH2_NUM_2;
114 size_per_word = bd->dram_ch[2].size >> 1;
117 pr_err("error: unsupported DRAM ch2 width\n");
121 switch (size_per_word) {
123 val |= SG_MEMCONF_CH2_SZ_64M;
126 val |= SG_MEMCONF_CH2_SZ_128M;
129 val |= SG_MEMCONF_CH2_SZ_256M;
132 val |= SG_MEMCONF_CH2_SZ_512M;
135 val |= SG_MEMCONF_CH2_SZ_1G;
138 pr_err("error: unsupported DRAM ch2 size\n");
143 writel(val, SG_MEMCONF);
148 int uniphier_memconf_2ch_init(const struct uniphier_board_data *bd)
150 return __uniphier_memconf_init(bd, 0);
153 int uniphier_memconf_3ch_init(const struct uniphier_board_data *bd)
155 return __uniphier_memconf_init(bd, 1);