1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24#include <common.h>
25#include <ppc4xx.h>
26#include <asm/processor.h>
27
28
29
30
31#include "../common/flash.c"
32
33
34
35
36static ulong flash_get_size (vu_long * addr, flash_info_t * info);
37static void flash_get_offsets (ulong base, flash_info_t * info);
38
39
40
41
42unsigned long flash_init (void)
43{
44 unsigned long size_b0, size_b1;
45 int i;
46 uint pbcr;
47 unsigned long base_b0, base_b1;
48
49
50 for (i = 0; i < CONFIG_SYS_MAX_FLASH_BANKS; ++i) {
51 flash_info[i].flash_id = FLASH_UNKNOWN;
52 }
53
54
55
56 base_b0 = FLASH_BASE0_PRELIM;
57 size_b0 = flash_get_size ((vu_long *) base_b0, &flash_info[0]);
58
59 if (flash_info[0].flash_id == FLASH_UNKNOWN) {
60 printf ("## Unknown FLASH on Bank 0 - Size = 0x%08lx = %ld MB\n",
61 size_b0, size_b0 << 20);
62 }
63
64 base_b1 = FLASH_BASE1_PRELIM;
65 size_b1 = flash_get_size ((vu_long *) base_b1, &flash_info[1]);
66
67
68
69 if (size_b1) {
70 mtdcr (EBC0_CFGADDR, PB0CR);
71 pbcr = mfdcr (EBC0_CFGDATA);
72 mtdcr (EBC0_CFGADDR, PB0CR);
73 base_b1 = -size_b1;
74 pbcr = (pbcr & 0x0001ffff) | base_b1 |
75 (((size_b1 / 1024 / 1024) - 1) << 17);
76 mtdcr (EBC0_CFGDATA, pbcr);
77
78 }
79
80 if (size_b0) {
81 mtdcr (EBC0_CFGADDR, PB1CR);
82 pbcr = mfdcr (EBC0_CFGDATA);
83 mtdcr (EBC0_CFGADDR, PB1CR);
84 base_b0 = base_b1 - size_b0;
85 pbcr = (pbcr & 0x0001ffff) | base_b0 |
86 (((size_b0 / 1024 / 1024) - 1) << 17);
87 mtdcr (EBC0_CFGDATA, pbcr);
88
89 }
90
91 size_b0 = flash_get_size ((vu_long *) base_b0, &flash_info[0]);
92
93 flash_get_offsets (base_b0, &flash_info[0]);
94
95
96 flash_protect (FLAG_PROTECT_SET,
97 base_b0 + size_b0 - monitor_flash_len,
98 base_b0 + size_b0 - 1, &flash_info[0]);
99
100 if (size_b1) {
101
102 size_b1 = flash_get_size ((vu_long *) base_b1, &flash_info[1]);
103
104 flash_get_offsets (base_b1, &flash_info[1]);
105
106
107 flash_protect (FLAG_PROTECT_SET,
108 base_b1 + size_b1 - monitor_flash_len,
109 base_b1 + size_b1 - 1, &flash_info[1]);
110
111 flash_protect (FLAG_PROTECT_CLEAR,
112 base_b0 + size_b0 - monitor_flash_len,
113 base_b0 + size_b0 - 1, &flash_info[0]);
114 } else {
115 flash_info[1].flash_id = FLASH_UNKNOWN;
116 flash_info[1].sector_count = -1;
117 }
118
119 flash_info[0].size = size_b0;
120 flash_info[1].size = size_b1;
121
122 return (size_b0 + size_b1);
123}
124