2 * Copyright (C) 2011-2015 Masahiro Yamada <yamada.masahiro@socionext.com>
4 * SPDX-License-Identifier: GPL-2.0+
10 #include <linux/sizes.h>
13 #include "../sg-regs.h"
15 int memconf_init(const struct uniphier_board_data *bd)
18 unsigned long size_per_word;
20 tmp = readl(SG_MEMCONF);
22 tmp &= ~(SG_MEMCONF_CH0_SZ_MASK | SG_MEMCONF_CH0_NUM_MASK);
24 switch (bd->dram_ch[0].width) {
26 tmp |= SG_MEMCONF_CH0_NUM_1;
27 size_per_word = bd->dram_ch[0].size;
30 tmp |= SG_MEMCONF_CH0_NUM_2;
31 size_per_word = bd->dram_ch[0].size >> 1;
34 pr_err("error: unsupported DRAM Ch0 width\n");
39 switch (size_per_word) {
41 tmp |= SG_MEMCONF_CH0_SZ_64M;
44 tmp |= SG_MEMCONF_CH0_SZ_128M;
47 tmp |= SG_MEMCONF_CH0_SZ_256M;
50 tmp |= SG_MEMCONF_CH0_SZ_512M;
53 tmp |= SG_MEMCONF_CH0_SZ_1G;
56 pr_err("error: unsupported DRAM Ch0 size\n");
60 tmp &= ~(SG_MEMCONF_CH1_SZ_MASK | SG_MEMCONF_CH1_NUM_MASK);
62 switch (bd->dram_ch[1].width) {
64 tmp |= SG_MEMCONF_CH1_NUM_1;
65 size_per_word = bd->dram_ch[1].size;
68 tmp |= SG_MEMCONF_CH1_NUM_2;
69 size_per_word = bd->dram_ch[1].size >> 1;
72 pr_err("error: unsupported DRAM Ch1 width\n");
76 switch (size_per_word) {
78 tmp |= SG_MEMCONF_CH1_SZ_64M;
81 tmp |= SG_MEMCONF_CH1_SZ_128M;
84 tmp |= SG_MEMCONF_CH1_SZ_256M;
87 tmp |= SG_MEMCONF_CH1_SZ_512M;
90 tmp |= SG_MEMCONF_CH1_SZ_1G;
93 pr_err("error: unsupported DRAM Ch1 size\n");
97 if (bd->dram_ch[0].base + bd->dram_ch[0].size < bd->dram_ch[1].base)
98 tmp |= SG_MEMCONF_SPARSEMEM;
100 tmp &= ~SG_MEMCONF_SPARSEMEM;
102 writel(tmp, SG_MEMCONF);