4 * Copyright (C) 2007 OpenWrt.org
5 * Copyright (C) 2007 Gabor Juhos <juhosg@freemail.hu>
7 * This program is free software; you can redistribute it and/or modify it
8 * under the terms of the GNU General Public License as published by the
9 * Free Software Foundation; either version 2 of the License, or (at your
10 * option) any later version.
13 #include <linux/types.h>
14 #include <linux/autoconf.h>
15 #include <linux/kernel.h>
16 #include <linux/init.h>
17 #include <linux/string.h>
19 #include <asm/bootinfo.h>
20 #include <asm/addrspace.h>
22 #include <asm/mach-adm5120/adm5120_defs.h>
23 #include <asm/mach-adm5120/adm5120_switch.h>
24 #include <asm/mach-adm5120/adm5120_info.h>
25 #include <asm/mach-adm5120/myloader.h>
26 #include <asm/mach-adm5120/routerboot.h>
27 #include <asm/mach-adm5120/zynos.h>
32 struct adm5120_board adm5120_board
;
33 unsigned int adm5120_boot_loader
;
35 unsigned int adm5120_product_code
;
36 unsigned int adm5120_revision
;
37 unsigned int adm5120_package
;
38 unsigned int adm5120_nand_boot
;
39 unsigned long adm5120_speed
;
40 unsigned long adm5120_memsize
;
45 static char *boot_loader_names
[BOOT_LOADER_LAST
+1] = {
46 [BOOT_LOADER_UNKNOWN
] = "Unknown",
47 [BOOT_LOADER_CFE
] = "CFE",
48 [BOOT_LOADER_UBOOT
] = "U-Boot",
49 [BOOT_LOADER_MYLOADER
] = "MyLoader",
50 [BOOT_LOADER_ROUTERBOOT
]= "RouterBOOT",
51 [BOOT_LOADER_BOOTBASE
] = "Bootbase"
54 static struct adm5120_board __initdata adm5120_boards
[] = {
56 .name
= "Compex NetPassage 27G",
57 .mach_type
= MACH_ADM5120_NP27G
,
60 .flash0_size
= 4*1024*1024,
63 .name
= "Compex NetPassage 28G",
64 .mach_type
= MACH_ADM5120_NP28G
,
67 .flash0_size
= 4*1024*1024,
70 .name
= "Compex NP28G (HotSpot)",
71 .mach_type
= MACH_ADM5120_NP28GHS
,
74 .flash0_size
= 4*1024*1024,
77 .name
= "Compex WP54AG",
78 .mach_type
= MACH_ADM5120_WP54AG
,
81 .flash0_size
= 4*1024*1024,
84 .name
= "Compex WP54G",
85 .mach_type
= MACH_ADM5120_WP54G
,
88 .flash0_size
= 4*1024*1024,
91 .name
= "Compex WP54G-WRT",
92 .mach_type
= MACH_ADM5120_WP54G_WRT
,
95 .flash0_size
= 4*1024*1024,
98 .name
= "Compex WP54G v1C",
99 .mach_type
= MACH_ADM5120_WP54Gv1C
,
102 .flash0_size
= 2*1024*1024,
105 .name
= "Compex WPP54AG",
106 .mach_type
= MACH_ADM5120_WPP54AG
,
109 .flash0_size
= 4*1024*1024,
112 .name
= "Compex WPP54G",
113 .mach_type
= MACH_ADM5120_WPP54G
,
116 .flash0_size
= 4*1024*1024,
119 .name
= "RouterBOARD 111",
120 .mach_type
= MACH_ADM5120_RB_111
,
123 .flash0_size
= 128*1024,
126 .name
= "RouterBOARD 112",
127 .mach_type
= MACH_ADM5120_RB_112
,
130 .flash0_size
= 128*1024,
133 .name
= "RouterBOARD 133",
134 .mach_type
= MACH_ADM5120_RB_133
,
137 .flash0_size
= 128*1024,
140 .name
= "RouterBOARD 133C",
141 .mach_type
= MACH_ADM5120_RB_133C
,
144 .flash0_size
= 128*1024,
147 .name
= "RouterBOARD 150",
148 .mach_type
= MACH_ADM5120_RB_150
,
151 .flash0_size
= 128*1024,
154 .name
= "RouterBOARD 153",
155 .mach_type
= MACH_ADM5120_RB_153
,
158 .flash0_size
= 128*1024,
161 .name
= "ZyXEL ES-2108",
162 .mach_type
= MACH_ADM5120_ES2108
,
165 .flash0_size
= 4*1024*1024,
168 .name
= "ZyXEL ES-2108-F",
169 .mach_type
= MACH_ADM5120_ES2108F
,
172 .flash0_size
= 4*1024*1024,
175 .name
= "ZyXEL ES-2108-G",
176 .mach_type
= MACH_ADM5120_ES2108G
,
179 .flash0_size
= 4*1024*1024,
182 .name
= "ZyXEL ES-2108-LC",
183 .mach_type
= MACH_ADM5120_ES2108LC
,
186 .flash0_size
= 4*1024*1024,
189 .name
= "ZyXEL ES-2108PWR",
190 .mach_type
= MACH_ADM5120_ES2108PWR
,
193 .flash0_size
= 4*1024*1024,
196 .name
= "ZyXEL HomeSafe 100/100W",
197 .mach_type
= MACH_ADM5120_HS100
,
200 .flash0_size
= 4*1024*1024,
203 .name
= "ZyXEL Prestige 334",
204 .mach_type
= MACH_ADM5120_P334
,
207 .flash0_size
= 2*1024*1024,
210 .name
= "ZyXEL Prestige 334U",
211 .mach_type
= MACH_ADM5120_P334U
,
214 .flash0_size
= 4*1024*1024,
217 .name
= "ZyXEL Prestige 334W",
218 .mach_type
= MACH_ADM5120_P334W
,
221 .flash0_size
= 2*1024*1024,
224 .name
= "ZyXEL Prestige 334WH",
225 .mach_type
= MACH_ADM5120_P334WH
,
228 .flash0_size
= 4*1024*1024,
231 .name
= "ZyXEL Prestige 334WHD",
232 .mach_type
= MACH_ADM5120_P334WHD
,
235 .flash0_size
= 4*1024*1024,
238 .name
= "ZyXEL Prestige 334WT",
239 .mach_type
= MACH_ADM5120_P334WT
,
242 .flash0_size
= 4*1024*1024,
245 .name
= "ZyXEL Prestige 335/335WT",
246 .mach_type
= MACH_ADM5120_P335
,
249 .flash0_size
= 4*1024*1024,
252 .name
= "ZyXEL Prestige 335Plus",
253 .mach_type
= MACH_ADM5120_P335PLUS
,
256 .flash0_size
= 4*1024*1024,
259 .name
= "ZyXEL Prestige 335U",
260 .mach_type
= MACH_ADM5120_P335U
,
263 .flash0_size
= 4*1024*1024,
266 .name
= "Unknown ADM5120 board",
267 .mach_type
= MACH_ADM5120_UNKNOWN
,
270 .flash0_size
= 4*1024*1024,
274 #define DUMMY_BOARD() {.mach_type = MACH_ADM5120_UNKNOWN}
281 unsigned long mach_type
;
285 #define MYLO_BOARD(v,d,sv,sd,mt) { .vid = (v), .did = (d), .svid = (sv), \
286 .sdid = (sd), .mach_type = (mt) }
288 #define COMPEX_BOARD(d,mt) MYLO_BOARD(VENID_COMPEX,(d),VENID_COMPEX,(d),(mt))
290 static struct mylo_board __initdata mylo_boards
[] = {
291 COMPEX_BOARD(DEVID_COMPEX_NP27G
, MACH_ADM5120_NP27G
),
292 COMPEX_BOARD(DEVID_COMPEX_NP28G
, MACH_ADM5120_NP28G
),
293 COMPEX_BOARD(DEVID_COMPEX_NP28GHS
, MACH_ADM5120_NP28GHS
),
294 COMPEX_BOARD(DEVID_COMPEX_WP54G
, MACH_ADM5120_WP54G
),
295 COMPEX_BOARD(DEVID_COMPEX_WP54Gv1C
, MACH_ADM5120_WP54Gv1C
),
296 COMPEX_BOARD(DEVID_COMPEX_WP54AG
, MACH_ADM5120_WP54AG
),
297 COMPEX_BOARD(DEVID_COMPEX_WPP54G
, MACH_ADM5120_WPP54G
),
298 COMPEX_BOARD(DEVID_COMPEX_WPP54AG
, MACH_ADM5120_WPP54AG
),
302 #define ROUTERBOARD_NAME_LEN 16
305 unsigned long mach_type
;
306 char name
[ROUTERBOARD_NAME_LEN
];
309 #define ROUTERBOARD(n, mt) { .name = (n), .mach_type = (mt) }
310 static struct routerboard __initdata routerboards
[] = {
311 ROUTERBOARD("111", MACH_ADM5120_RB_111
),
312 ROUTERBOARD("112", MACH_ADM5120_RB_112
),
313 ROUTERBOARD("133", MACH_ADM5120_RB_133
),
314 ROUTERBOARD("133C", MACH_ADM5120_RB_133C
),
315 ROUTERBOARD("miniROUTER", MACH_ADM5120_RB_150
),
316 ROUTERBOARD("153", MACH_ADM5120_RB_150
),
321 unsigned long mach_type
;
322 unsigned int vendor_id
;
326 #define ZYNOS_BOARD(vi, bi, mt) { .vendor_id = (vi), .board_id = (bi), \
329 #define ZYXEL_BOARD(bi, mt) ZYNOS_BOARD(ZYNOS_VENDOR_ID_ZYXEL, bi, mt)
330 #define DLINK_BOARD(bi, mt) ZYNOS_BOARD(ZYNOS_VENDOR_ID_DLINK, bi, mt)
331 #define LUCENT_BOARD(bi, mt) ZYNOS_BOARD(ZYNOS_VENDOR_ID_LUCENT, bi, mt)
333 static struct zynos_board __initdata zynos_boards
[] = {
334 ZYXEL_BOARD(ZYNOS_BOARD_HS100
, MACH_ADM5120_HS100
),
335 ZYXEL_BOARD(ZYNOS_BOARD_P334
, MACH_ADM5120_P334
),
336 ZYXEL_BOARD(ZYNOS_BOARD_P334U
, MACH_ADM5120_P334U
),
337 ZYXEL_BOARD(ZYNOS_BOARD_P334W
, MACH_ADM5120_P334W
),
338 ZYXEL_BOARD(ZYNOS_BOARD_P334WH
, MACH_ADM5120_P334WH
),
339 ZYXEL_BOARD(ZYNOS_BOARD_P334WHD
, MACH_ADM5120_P334WHD
),
340 ZYXEL_BOARD(ZYNOS_BOARD_P334WT
, MACH_ADM5120_P334WT
),
341 ZYXEL_BOARD(ZYNOS_BOARD_P335
, MACH_ADM5120_P335
),
342 ZYXEL_BOARD(ZYNOS_BOARD_P335PLUS
, MACH_ADM5120_P335PLUS
),
343 ZYXEL_BOARD(ZYNOS_BOARD_P335U
, MACH_ADM5120_P335U
),
350 static inline u16
read_le16(void *buf
)
355 return ((u16
)p
[0] + ((u16
)p
[1] << 8));
358 static inline u32
read_le32(void *buf
)
363 return ((u32
)p
[0] + ((u32
)p
[1] << 8) + ((u32
)p
[2] << 16) +
367 static inline u16
read_be16(void *buf
)
372 return (((u16
)p
[0] << 8) + (u16
)p
[1]);
375 static inline u32
read_be32(void *buf
)
380 return (((u32
)p
[0] << 24) + ((u32
)p
[1] << 16) + ((u32
)p
[2] << 8) +
387 #define CFE_EPTSEAL 0x43464531 /* CFE1 is the magic number to recognize CFE
388 from other bootloaders */
390 static int __init
cfe_present(void)
393 * This method only works, when we are booted directly from the CFE.
395 u32 cfe_handle
= (u32
) fw_arg0
;
396 u32 cfe_a1_val
= (u32
) fw_arg1
;
397 u32 cfe_entry
= (u32
) fw_arg2
;
398 u32 cfe_seal
= (u32
) fw_arg3
;
400 /* Check for CFE by finding the CFE magic number */
401 if (cfe_seal
!= CFE_EPTSEAL
) {
402 /* We are not booted from CFE */
406 /* cfe_a1_val must be 0, because only one CPU present in the ADM5120 */
407 if (cfe_a1_val
!= 0) {
411 /* The cfe_handle, and the cfe_entry must be kernel mode addresses */
412 if ((cfe_handle
< KSEG0
) || (cfe_entry
< KSEG0
)) {
419 static unsigned long __init
cfe_detect_board(void)
421 return MACH_ADM5120_WP54G_WRT
;
425 * MyLoader based boards
427 #define SYS_PARAMS_ADDR KSEG1ADDR(ADM5120_SRAM0_BASE+0x0F000)
428 #define BOARD_PARAMS_ADDR KSEG1ADDR(ADM5120_SRAM0_BASE+0x0F800)
429 #define PART_TABLE_ADDR KSEG1ADDR(ADM5120_SRAM0_BASE+0x10000)
431 static unsigned long __init
myloader_detect_board(void)
433 struct mylo_system_params
*sysp
;
434 struct mylo_board_params
*boardp
;
435 struct mylo_partition_table
*parts
;
436 struct mylo_board
*board
;
439 ret
= MACH_ADM5120_UNKNOWN
;
441 sysp
= (struct mylo_system_params
*)(SYS_PARAMS_ADDR
);
442 boardp
= (struct mylo_board_params
*)(BOARD_PARAMS_ADDR
);
443 parts
= (struct mylo_partition_table
*)(PART_TABLE_ADDR
);
445 /* Check for some magic numbers */
446 if ((le32_to_cpu(sysp
->magic
) != MYLO_MAGIC_SYS_PARAMS
) ||
447 (le32_to_cpu(boardp
->magic
) != MYLO_MAGIC_BOARD_PARAMS
) ||
448 (le32_to_cpu(parts
->magic
) != MYLO_MAGIC_PARTITIONS
))
451 for (board
= mylo_boards
; board
->mach_type
!= MACH_ADM5120_UNKNOWN
;
453 if ((le16_to_cpu(sysp
->vid
) == board
->vid
) &&
454 (le16_to_cpu(sysp
->did
) == board
->did
) &&
455 (le16_to_cpu(sysp
->svid
) == board
->svid
) &&
456 (le16_to_cpu(sysp
->sdid
) == board
->sdid
)) {
457 ret
= board
->mach_type
;
462 /* assume MyLoader as the boot-loader */
463 adm5120_boot_loader
= BOOT_LOADER_MYLOADER
;
470 * RouterBOOT based boards
472 static int __init
routerboot_load_hs(u8
*buf
, u16 buflen
,
473 struct rb_hard_settings
*hs
)
482 if (read_le32(buf
) != RB_MAGIC_HARD
)
485 /* skip magic value */
493 if (id
== RB_ID_TERMINATOR
|| buflen
< 2)
496 len
= read_le16(buf
);
504 case RB_ID_BIOS_VERSION
:
505 hs
->bios_ver
= (char *)buf
;
507 case RB_ID_BOARD_NAME
:
508 hs
->name
= (char *)buf
;
510 case RB_ID_MEMORY_SIZE
:
511 hs
->mem_size
= read_le32(buf
);
513 case RB_ID_MAC_ADDRESS_COUNT
:
514 hs
->mac_count
= read_le32(buf
);
516 case RB_ID_MAC_ADDRESS_PACK
:
517 hs
->mac_count
= len
/RB_MAC_SIZE
;
518 if (hs
->mac_count
> RB_MAX_MAC_COUNT
)
519 hs
->mac_count
= RB_MAX_MAC_COUNT
;
521 for (i
=0; i
< hs
->mac_count
; i
++) {
522 for (j
=0; j
< RB_MAC_SIZE
; j
++)
523 hs
->macs
[i
][j
] = mac
[j
];
537 #define RB_BS_OFFS 0x14
538 #define RB_OFFS_MAX (128*1024)
540 static unsigned long __init
routerboot_detect_board(void)
542 struct routerboard
*board
;
543 struct rb_hard_settings hs
;
544 struct rb_bios_settings
*bs
;
549 ret
= MACH_ADM5120_UNKNOWN
;
551 base
= (u8
*)KSEG1ADDR(ADM5120_SRAM0_BASE
);
552 bs
= (struct rb_bios_settings
*)(base
+ RB_BS_OFFS
);
554 off
= read_le32(&bs
->hs_offs
);
555 len
= read_le32(&bs
->hs_size
);
556 if (off
> RB_OFFS_MAX
)
559 memset(&hs
, 0, sizeof(hs
));
560 if (routerboot_load_hs(base
+off
, len
, &hs
) != 0)
563 /* assume RouterBOOT as the boot-loader */
564 adm5120_boot_loader
= BOOT_LOADER_ROUTERBOOT
;
569 for (board
= routerboards
; board
->mach_type
!= MACH_ADM5120_UNKNOWN
;
571 if (strncmp(board
->name
, hs
.name
, strlen(board
->name
)) == 0) {
572 ret
= board
->mach_type
;
583 static inline u32
zynos_dbgarea_present(u8
*data
)
587 t
= read_be32(data
+5);
588 if (t
!= ZYNOS_MAGIC_DBGAREA1
)
591 t
= read_be32(data
+9);
592 if (t
!= ZYNOS_MAGIC_DBGAREA2
)
598 #define CHECK_VENDOR(n) (strnicmp(vendor,(n),strlen(n)) == 0)
600 static inline unsigned int zynos_get_vendor_id(struct zynos_board_info
*info
)
602 unsigned char vendor
[ZYNOS_NAME_LEN
];
605 for (i
=0; i
<ZYNOS_NAME_LEN
; i
++)
606 vendor
[i
]=info
->vendor
[i
];
608 if CHECK_VENDOR(ZYNOS_VENDOR_ZYXEL
)
609 return ZYNOS_VENDOR_ID_ZYXEL
;
611 /* TODO: there are no known ADM5120 based boards from other vendors */
612 if CHECK_VENDOR(ZYNOS_VENDOR_DLINK
)
613 return ZYNOS_VENDOR_ID_DLINK
;
615 if CHECK_VENDOR(ZYNOS_VENDOR_LUCENT
)
616 return ZYNOS_VENDOR_ID_LUCENT
;
618 if CHECK_VENDOR(ZYNOS_VENDOR_NETGEAR
)
619 return ZYNOS_VENDOR_ID_NETGEAR
;
622 return ZYNOS_VENDOR_ID_OTHER
;
625 static inline u16
zynos_get_board_id(struct zynos_board_info
*info
)
627 return read_be16(&info
->board_id
);
630 static inline u32
zynos_get_bootext_addr(struct zynos_board_info
*info
)
632 return read_be32(&info
->bootext_addr
);
636 #define ZYNOS_INFO_ADDR KSEG1ADDR(ADM5120_SRAM0_BASE+0x3F90)
637 #define ZYNOS_HDBG_ADDR KSEG1ADDR(ADM5120_SRAM0_BASE+0x4000)
638 #define BOOTEXT_ADDR_MIN KSEG1ADDR(ADM5120_SRAM0_BASE)
639 #define BOOTEXT_ADDR_MAX (BOOTEXT_ADDR_MIN + (2*1024*1024))
641 static unsigned long __init
zynos_detect_board(void)
643 struct zynos_board_info
*info
;
644 struct zynos_board
*board
;
645 unsigned int vendor_id
;
650 ret
= MACH_ADM5120_UNKNOWN
;
651 /* check presence of the dbgarea */
652 if (zynos_dbgarea_present((u8
*)ZYNOS_HDBG_ADDR
) == 0)
655 info
= (struct zynos_board_info
*)(ZYNOS_INFO_ADDR
);
657 /* check for a valid BootExt address */
658 t
= zynos_get_bootext_addr(info
);
659 if ((t
< BOOTEXT_ADDR_MIN
) || (t
> BOOTEXT_ADDR_MAX
))
662 vendor_id
= zynos_get_vendor_id(info
);
663 board_id
= zynos_get_board_id(info
);
665 for (board
= zynos_boards
; board
->mach_type
!= MACH_ADM5120_UNKNOWN
;
667 if ((board
->vendor_id
== vendor_id
) &&
668 (board
->board_id
== board_id
)) {
669 ret
= board
->mach_type
;
674 /* assume Bootbase as the boot-loader */
675 adm5120_boot_loader
= BOOT_LOADER_BOOTBASE
;
682 * U-Boot based boards
684 static int __init
uboot_present(void)
686 /* FIXME: not yet implemented */
690 static unsigned long __init
uboot_detect_board(void)
692 /* FIXME: not yet implemented */
693 return MACH_ADM5120_UNKNOWN
;
696 static void __init
adm5120_detect_board(void)
698 struct adm5120_board
*board
;
701 adm5120_boot_loader
= BOOT_LOADER_UNKNOWN
;
703 /* Try to detect board type without bootloader */
704 t
= routerboot_detect_board();
706 if (t
== MACH_ADM5120_UNKNOWN
)
707 t
= zynos_detect_board();
709 if (t
== MACH_ADM5120_UNKNOWN
)
710 t
= myloader_detect_board();
712 /* Try to detect bootloader type */
714 adm5120_boot_loader
= BOOT_LOADER_CFE
;
715 if (t
== MACH_ADM5120_UNKNOWN
)
716 t
= cfe_detect_board();
717 } else if (uboot_present()) {
718 adm5120_boot_loader
= BOOT_LOADER_UBOOT
;
719 if (t
== MACH_ADM5120_UNKNOWN
)
720 t
= uboot_detect_board();
723 for (board
= adm5120_boards
; board
->mach_type
!= MACH_ADM5120_UNKNOWN
;
725 if (board
->mach_type
== t
)
729 memcpy(&adm5120_board
, board
, sizeof(adm5120_board
));
732 #define SWITCH_READ(r) *(u32 *)(KSEG1ADDR(ADM5120_SWITCH_BASE)+(r))
733 #define SWITCH_WRITE(r,v) *(u32 *)(KSEG1ADDR(ADM5120_SWITCH_BASE)+(r))=(v)
736 * CPU settings detection
738 #define CODE_GET_PC(c) ((c) & CODE_PC_MASK)
739 #define CODE_GET_REV(c) (((c) >> CODE_REV_SHIFT) & CODE_REV_MASK)
740 #define CODE_GET_PK(c) (((c) >> CODE_PK_SHIFT) & CODE_PK_MASK)
741 #define CODE_GET_CLKS(c) (((c) >> CODE_CLKS_SHIFT) & CODE_CLKS_MASK)
742 #define CODE_GET_NAB(c) (((c) & CODE_NAB) != 0)
744 static void __init
adm5120_detect_cpuinfo(void)
749 code
= SWITCH_READ(SWITCH_REG_CODE
);
751 adm5120_product_code
= CODE_GET_PC(code
);
752 adm5120_revision
= CODE_GET_REV(code
);
753 adm5120_package
= (CODE_GET_PK(code
) == CODE_PK_BGA
) ?
754 ADM5120_PACKAGE_BGA
: ADM5120_PACKAGE_PQFP
;
755 adm5120_nand_boot
= CODE_GET_NAB(code
);
757 clks
= CODE_GET_CLKS(code
);
758 adm5120_speed
= ADM5120_SPEED_175
;
760 adm5120_speed
+= 25000000;
762 adm5120_speed
+= 50000000;
766 # define mem_dbg(f, ...) prom_printf("mem_detect: " f, ## __VA_ARGS__)
767 extern void prom_printf(char *, ...);
769 # define mem_dbg(f, ...)
772 static void __init
adm5120_detect_memsize(void)
779 memctrl
= SWITCH_READ(SWITCH_REG_MEMCTRL
);
780 switch (memctrl
& MEMCTRL_SDRS_MASK
) {
781 case MEMCTRL_SDRS_4M
:
784 case MEMCTRL_SDRS_8M
:
787 case MEMCTRL_SDRS_16M
:
795 /* FIXME: need to disable buffers for both SDRAM bank? */
797 mem_dbg("checking for %ldMB chip\n",maxsize
>> 20);
799 /* detect size of the 1st SDRAM bank */
800 p
= (volatile u8
*)KSEG1ADDR(0);
802 for (size
= 2<<20; size
<= (maxsize
>> 1); size
<<= 1) {
806 mem_dbg("1st pattern at 0x%lx is 0x%02x\n", size
, *r
);
809 mem_dbg("2nd pattern at 0x%lx is 0x%02x\n", size
, *r
);
811 /* mirrored address */
812 mem_dbg("mirrored data found at 0x%lx\n", size
);
818 mem_dbg("1st pattern at 0x%lx is 0x%02x\n", size
, p
[size
]);
823 mem_dbg("2nd pattern at 0x%lx is 0x%02x\n", size
, p
[size
]);
827 /* mirrored address */
828 mem_dbg("mirrored data found at 0x%lx\n", size
);
834 mem_dbg("%ldMB chip found\n", size
>> 20);
836 if (size
== (32 << 20))
837 /* if bank size is 32MB, 2nd bank is not supported */
840 if ((memctrl
& MEMCTRL_SDR1_ENABLE
) == 0)
841 /* if 2nd bank is not enabled, we are done */
845 * some bootloaders enable 2nd bank, even if the 2nd SDRAM chip
848 mem_dbg("checking second bank\n");
849 p
+= (maxsize
+size
)-1;
860 if (maxsize
!= size
) {
861 /* adjusting MECTRL register */
862 memctrl
&= ~(MEMCTRL_SDRS_MASK
);
865 memctrl
|= MEMCTRL_SDRS_4M
;
868 memctrl
|= MEMCTRL_SDRS_8M
;
871 memctrl
|= MEMCTRL_SDRS_16M
;
874 memctrl
|= MEMCTRL_SDRS_64M
;
877 SWITCH_WRITE(SWITCH_REG_MEMCTRL
, memctrl
);
882 adm5120_memsize
= size
;
883 mem_dbg("%ldMB memory found\n",size
>>20);
886 void __init
adm5120_info_show(void)
888 /* FIXME: move this somewhere else */
889 printk("ADM%04X%s revision %d, running at %ldMHz\n",
890 adm5120_product_code
,
891 (adm5120_package
== ADM5120_PACKAGE_BGA
) ? "" : "P",
892 adm5120_revision
, (adm5120_speed
/ 1000000)
894 printk("Boot loader is: %s\n", boot_loader_names
[adm5120_boot_loader
]);
895 printk("Booted from : %s flash\n", adm5120_nand_boot
? "NAND":"NOR");
896 printk("Board is : %s\n", adm5120_board_name());
897 printk("Memory size : %ldMB\n", adm5120_memsize
>> 20);
900 void __init
adm5120_info_init(void)
902 adm5120_detect_cpuinfo();
903 adm5120_detect_memsize();
904 adm5120_detect_board();