]>
git.ipfire.org Git - people/ms/u-boot.git/blob - arch/arm/mach-uniphier/memconf/memconf.c
d490736fa43c04362a40567c362688b33f2280a2
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
);