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
47
48 for (i=0; i<CONFIG_SYS_MAX_FLASH_BANKS; ++i) {
49 flash_info[i].flash_id = FLASH_UNKNOWN;
50 }
51
52 size_b0 = flash_get_size((vu_long *)FLASH_BASE0_PRELIM, &flash_info[0]);
53
54 if (flash_info[0].flash_id == FLASH_UNKNOWN) {
55 printf ("## Unknown FLASH on Bank 0 - Size = 0x%08lx = %ld MB\n",
56 size_b0, size_b0<<20);
57 }
58
59 size_b1 = flash_get_size((vu_long *)FLASH_BASE1_PRELIM, &flash_info[1]);
60
61 if (size_b1 > size_b0) {
62 printf ("## ERROR: "
63 "Bank 1 (0x%08lx = %ld MB) > Bank 0 (0x%08lx = %ld MB)\n",
64 size_b1, size_b1<<20,
65 size_b0, size_b0<<20
66 );
67 flash_info[0].flash_id = FLASH_UNKNOWN;
68 flash_info[1].flash_id = FLASH_UNKNOWN;
69 flash_info[0].sector_count = -1;
70 flash_info[1].sector_count = -1;
71 flash_info[0].size = 0;
72 flash_info[1].size = 0;
73 return (0);
74 }
75
76
77 size_b0 = flash_get_size((vu_long *)FLASH_BASE0_PRELIM, &flash_info[0]);
78
79 flash_get_offsets (FLASH_BASE0_PRELIM, &flash_info[0]);
80
81
82 flash_protect(FLAG_PROTECT_SET,
83 FLASH_BASE0_PRELIM+size_b0-monitor_flash_len,
84 FLASH_BASE0_PRELIM+size_b0-1,
85 &flash_info[0]);
86
87 if (size_b1) {
88
89 size_b1 = flash_get_size((vu_long *)(FLASH_BASE0_PRELIM + size_b0),
90 &flash_info[1]);
91
92 flash_get_offsets (FLASH_BASE0_PRELIM + size_b0, &flash_info[1]);
93
94
95 flash_protect(FLAG_PROTECT_SET,
96 FLASH_BASE0_PRELIM+size_b0+size_b1-monitor_flash_len,
97 FLASH_BASE0_PRELIM+size_b0+size_b1-1,
98 &flash_info[1]);
99
100 flash_protect(FLAG_PROTECT_CLEAR,
101 FLASH_BASE0_PRELIM+size_b0-monitor_flash_len,
102 FLASH_BASE0_PRELIM+size_b0-1,
103 &flash_info[0]);
104 } else {
105 flash_info[1].flash_id = FLASH_UNKNOWN;
106 flash_info[1].sector_count = -1;
107 }
108
109 flash_info[0].size = size_b0;
110 flash_info[1].size = size_b1;
111
112 return (size_b0 + size_b1);
113}
114