blob: 62ded54a7b099ffd954684e961b0df7f0b604322 [file] [log] [blame]
b.liue9582032025-04-17 19:18:16 +08001/*
2 * (C) Copyright 2011
3 * Marvell Semiconductor <www.marvell.com>
4 *
5 * SPDX-License-Identifier: GPL-2.0+
6 */
7
8#include <common.h>
9#include <asm/arch/cpu.h>
10#include <pxa_amp.h>
11
12DECLARE_GLOBAL_DATA_PTR;
13
14#if defined (CONFIG_PXA1U88) || defined (CONFIG_PXA182X)
15#define MCK5_ADDR_BASE 0xC0100000
16#else
17#define MCK5_ADDR_BASE 0xD0000000
18#endif
19
20/* PXA1928 and PXA1826 only use CH0. So ignore CH1 here */
21#define MCK5_CH0_MMAP0 (MCK5_ADDR_BASE + 0x200)
22#define MCK5_CH0_MMAP1 (MCK5_ADDR_BASE + 0x204)
23#define MCK5_CH0_PMAP0 (MCK5_ADDR_BASE + 0x210)
24#define MCK5_CH0_PMAP1 (MCK5_ADDR_BASE + 0x214)
25#define MCK5_CH0_DRAM_CFG_1 (MCK5_ADDR_BASE + 0x300)
26
27int MCK5_sdram_base(int cs, ulong *base)
28{
29 u32 mmap;
30
31 switch (cs) {
32 case 0:
33 mmap = readl(MCK5_CH0_MMAP0);
34 break;
35 case 1:
36 mmap = readl(MCK5_CH0_MMAP1);
37 break;
38 default:
39 return -1;
40 }
41
42 if (!(0x1 & mmap))
43 return -1;
44 else
45 *base = 0xFF800000 & mmap;
46 return 0;
47}
48
49int MCK5_sdram_size(int cs, ulong *size)
50{
51 u32 mmap, _size, pmap, dram_cfg_1;
52 u32 bank_bits, row_bits, col_bits, width_bits;
53
54 switch (cs) {
55 case 0:
56 mmap = readl(MCK5_CH0_MMAP0);
57 pmap = readl(MCK5_CH0_PMAP0);
58 break;
59 case 1:
60 mmap = readl(MCK5_CH0_MMAP1);
61 pmap = readl(MCK5_CH0_PMAP1);
62 break;
63 default:
64 return -1;
65 }
66
67 if (!(0x1 & mmap))
68 return -1;
69
70 dram_cfg_1 = readl(MCK5_CH0_DRAM_CFG_1);
71
72 _size = (mmap >> 16) & 0x1F;
73 if (_size < 0x7) {
74 printf("Unknown dram size!\n");
75 return -1;
76 } else {
77 /* *size = (0x8 << (_size - 0x7)) * 1024 * 1024; */
78 width_bits = (dram_cfg_1 & 0x7) - 1;
79 bank_bits = (pmap & 0x3) + 1;
80 /* row is 1~6, column is 1~5 */
81 row_bits = ((pmap >> 8) & 0x7) + 10;
82 col_bits = ((pmap >> 4) & 0x7) + 7;
83 *size = 0x1 << (width_bits + bank_bits + row_bits + col_bits);
84 }
85 return 0;
86}
87
88#ifndef CONFIG_SYS_BOARD_DRAM_INIT
89/* dram init when bd not avaliable */
90int dram_init(void)
91{
92 int i;
93 unsigned int reloc_end;
94 ulong start, size, ddr_st_offset = 0x0;
95
96 gd->ram_size = 0;
97
98 /* find ddr map start address */
99 for (i = 0; i < CONFIG_NR_DRAM_BANKS; i++) {
100 if (!MCK5_sdram_base(i, &ddr_st_offset))
101 break;
102 }
103
104 for (i = 0; i < CONFIG_NR_DRAM_BANKS; i++) {
105 if (MCK5_sdram_base(i, &start))
106 continue;
107 if (start != (gd->ram_size + ddr_st_offset)) {
108 printf("error: unspported not-continous ram\n");
109 hang();
110 }
111 if (MCK5_sdram_size(i, &size)) {
112 printf("Read dram size error for chip %d.\n", i);
113 hang();
114 }
115 gd->ram_size += size;
116 }
117
118 /*
119 * limit the uboot ddr usage between CONFIG_SYS_TEXT_BASE and
120 * CONFIG_SYS_RELOC_END, which reside in ion range
121 * and won't impact emmddump.
122 */
123 debug("gd->ram_size = 0x%lx\n\n",gd->ram_size);
124 reloc_end = pxa_amp_reloc_end();
125 if ((gd->ram_size + ddr_st_offset) < reloc_end)
126 hang();
127 else
128 gd->ram_size = (reloc_end - ddr_st_offset);
129
130 return 0;
131}
132
133/*
134 * If this function is not defined here,
135 * board.c alters dram bank zero configuration defined above.
136 * read from mck register again and skip error as already
137 * checked before
138 */
139void dram_init_banksize(void)
140{
141 int i, b = 0;
142
143 for (i = 0; i < CONFIG_NR_DRAM_BANKS; i++) {
144 if (!MCK5_sdram_base(i, &gd->bd->bi_dram[b].start))
145 MCK5_sdram_size(i, &gd->bd->bi_dram[b++].size);
146 }
147
148 /*
149 * If there are banks that are not valid, we need to set
150 * their start address and size to 0. Otherwise other
151 * u-boot functions and Linux kernel gets wrong values which
152 * could result in crash.
153 */
154 for (; b < CONFIG_NR_DRAM_BANKS; b++) {
155 gd->bd->bi_dram[b].start = 0;
156 gd->bd->bi_dram[b].size = 0;
157 }
158
159 if (gd->bd->bi_dram[0].size < CONFIG_TZ_HYPERVISOR_SIZE) {
160 printf("Cannot meet requirement for TrustZone!\n");
161 } else {
162 gd->bd->bi_dram[0].start += CONFIG_TZ_HYPERVISOR_SIZE;
163 gd->bd->bi_dram[0].size -= CONFIG_TZ_HYPERVISOR_SIZE;
164 gd->ram_size -= CONFIG_TZ_HYPERVISOR_SIZE;
165 }
166}
167#endif /* CONFIG_SYS_BOARD_DRAM_INIT */