2 * Copyright (C) 2011-2015 Masahiro Yamada <yamada.masahiro@socionext.com>
4 * SPDX-License-Identifier: GPL-2.0+
10 #include <linux/sizes.h>
11 #include <mach/init.h>
12 #include <mach/sg-regs.h>
14 int memconf_init(const struct uniphier_board_data *bd)
17 unsigned long size_per_word;
19 tmp = readl(SG_MEMCONF);
21 tmp &= ~(SG_MEMCONF_CH0_SZ_MASK | SG_MEMCONF_CH0_NUM_MASK);
23 switch (bd->dram_ch0_width) {
25 tmp |= SG_MEMCONF_CH0_NUM_1;
26 size_per_word = bd->dram_ch0_size;
29 tmp |= SG_MEMCONF_CH0_NUM_2;
30 size_per_word = bd->dram_ch0_size >> 1;
33 pr_err("error: unsupported DRAM Ch0 width\n");
38 switch (size_per_word) {
40 tmp |= SG_MEMCONF_CH0_SZ_64M;
43 tmp |= SG_MEMCONF_CH0_SZ_128M;
46 tmp |= SG_MEMCONF_CH0_SZ_256M;
49 tmp |= SG_MEMCONF_CH0_SZ_512M;
52 tmp |= SG_MEMCONF_CH0_SZ_1G;
55 pr_err("error: unsupported DRAM Ch0 size\n");
59 tmp &= ~(SG_MEMCONF_CH1_SZ_MASK | SG_MEMCONF_CH1_NUM_MASK);
61 switch (bd->dram_ch1_width) {
63 tmp |= SG_MEMCONF_CH1_NUM_1;
64 size_per_word = bd->dram_ch1_size;
67 tmp |= SG_MEMCONF_CH1_NUM_2;
68 size_per_word = bd->dram_ch1_size >> 1;
71 pr_err("error: unsupported DRAM Ch1 width\n");
75 switch (size_per_word) {
77 tmp |= SG_MEMCONF_CH1_SZ_64M;
80 tmp |= SG_MEMCONF_CH1_SZ_128M;
83 tmp |= SG_MEMCONF_CH1_SZ_256M;
86 tmp |= SG_MEMCONF_CH1_SZ_512M;
89 tmp |= SG_MEMCONF_CH1_SZ_1G;
92 pr_err("error: unsupported DRAM Ch1 size\n");
96 if (bd->dram_ch0_base + bd->dram_ch0_size < bd->dram_ch1_base)
97 tmp |= SG_MEMCONF_SPARSEMEM;
99 tmp &= ~SG_MEMCONF_SPARSEMEM;
101 writel(tmp, SG_MEMCONF);