1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18#include <common.h>
19#include <asm/ppc4xx.h>
20#include <asm/processor.h>
21
22#undef DEBUG
23
24#ifdef DEBUG
25#define DEBUGF(x...) printf(x)
26#else
27#define DEBUGF(x...)
28#endif
29
30#define BOOT_SMALL_FLASH 0x40
31#define FLASH_ONBD_N 2
32#define FLASH_SRAM_SEL 1
33#define FLASH_ONBD_N 2
34#define FLASH_SRAM_SEL 1
35
36#define BOOT_SMALL_FLASH_VAL 4
37#define FLASH_ONBD_N_VAL 2
38#define FLASH_SRAM_SEL_VAL 1
39
40flash_info_t flash_info[CONFIG_SYS_MAX_FLASH_BANKS];
41
42static unsigned long flash_addr_table[8][CONFIG_SYS_MAX_FLASH_BANKS] = {
43 {0xFF800000, 0xFF880000, 0xFFC00000},
44 {0xFF900000, 0xFF980000, 0xFFC00000},
45 {0x00000000, 0x00000000, 0x00000000},
46 {0x00000000, 0x00000000, 0x00000000},
47 {0xFFE00000, 0xFFF00000, 0xFF800000},
48 {0xFFF00000, 0xFFF80000, 0xFF800000},
49 {0x00000000, 0x00000000, 0x00000000},
50 {0x00000000, 0x00000000, 0x00000000}
51};
52
53
54
55
56#include "../common/flash.c"
57
58
59
60
61static ulong flash_get_size(vu_long * addr, flash_info_t * info);
62static int write_word(flash_info_t * info, ulong dest, ulong data);
63
64
65
66
67unsigned long flash_init(void)
68{
69 unsigned long total_b = 0;
70 unsigned long size_b[CONFIG_SYS_MAX_FLASH_BANKS];
71 unsigned char *fpga_base = (unsigned char *)CONFIG_SYS_FPGA_BASE;
72 unsigned char switch_status;
73 unsigned short index = 0;
74 int i;
75
76
77 switch_status = *fpga_base;
78
79
80 if (switch_status & BOOT_SMALL_FLASH) {
81 index += BOOT_SMALL_FLASH_VAL;
82 }
83 if (switch_status & FLASH_ONBD_N) {
84 index += FLASH_ONBD_N_VAL;
85 }
86 if (switch_status & FLASH_SRAM_SEL) {
87 index += FLASH_SRAM_SEL_VAL;
88 }
89
90 DEBUGF("\n");
91 DEBUGF("FLASH: Index: %d\n", index);
92
93
94 for (i = 0; i < CONFIG_SYS_MAX_FLASH_BANKS; ++i) {
95 flash_info[i].flash_id = FLASH_UNKNOWN;
96 flash_info[i].sector_count = -1;
97 flash_info[i].size = 0;
98
99
100 if (flash_addr_table[index][i] == 0) {
101 continue;
102 }
103
104
105 size_b[i] =
106 flash_get_size((vu_long *) flash_addr_table[index][i],
107 &flash_info[i]);
108 flash_info[i].size = size_b[i];
109 if (flash_info[i].flash_id == FLASH_UNKNOWN) {
110 printf
111 ("## Unknown FLASH on Bank %d - Size = 0x%08lx = %ld MB\n",
112 i, size_b[i], size_b[i] << 20);
113 flash_info[i].sector_count = -1;
114 flash_info[i].size = 0;
115 }
116
117
118 (void)flash_protect(FLAG_PROTECT_SET, CONFIG_SYS_MONITOR_BASE,
119 CONFIG_SYS_MONITOR_BASE + CONFIG_SYS_MONITOR_LEN - 1,
120 &flash_info[i]);
121#ifdef CONFIG_ENV_IS_IN_FLASH
122 (void)flash_protect(FLAG_PROTECT_SET, CONFIG_ENV_ADDR,
123 CONFIG_ENV_ADDR + CONFIG_ENV_SECT_SIZE - 1,
124 &flash_info[i]);
125 (void)flash_protect(FLAG_PROTECT_SET, CONFIG_ENV_ADDR_REDUND,
126 CONFIG_ENV_ADDR_REDUND + CONFIG_ENV_SECT_SIZE - 1,
127 &flash_info[i]);
128#endif
129
130 total_b += flash_info[i].size;
131 }
132
133 return total_b;
134}
135