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>
21 #include <asm/byteorder.h>
23 #include <asm/mach-adm5120/adm5120_defs.h>
24 #include <asm/mach-adm5120/adm5120_switch.h>
25 #include <asm/mach-adm5120/adm5120_info.h>
26 #include <asm/mach-adm5120/myloader.h>
27 #include <asm/mach-adm5120/routerboot.h>
28 #include <asm/mach-adm5120/zynos.h>
33 struct adm5120_board adm5120_board
;
34 unsigned int adm5120_boot_loader
;
36 unsigned int adm5120_product_code
;
37 unsigned int adm5120_revision
;
38 unsigned int adm5120_package
;
39 unsigned int adm5120_nand_boot
;
40 unsigned long adm5120_speed
;
41 unsigned long adm5120_memsize
;
46 static char *boot_loader_names
[BOOT_LOADER_LAST
+1] = {
47 [BOOT_LOADER_UNKNOWN
] = "Unknown",
48 [BOOT_LOADER_CFE
] = "CFE",
49 [BOOT_LOADER_UBOOT
] = "U-Boot",
50 [BOOT_LOADER_MYLOADER
] = "MyLoader",
51 [BOOT_LOADER_ROUTERBOOT
]= "RouterBOOT",
52 [BOOT_LOADER_BOOTBASE
] = "Bootbase"
55 static struct adm5120_board __initdata adm5120_boards
[] = {
57 .name
= "Compex NetPassage 27G",
58 .mach_type
= MACH_ADM5120_NP27G
,
61 .flash0_size
= 4*1024*1024,
64 .name
= "Compex NetPassage 28G",
65 .mach_type
= MACH_ADM5120_NP28G
,
68 .flash0_size
= 4*1024*1024,
71 .name
= "Compex NP28G (HotSpot)",
72 .mach_type
= MACH_ADM5120_NP28GHS
,
75 .flash0_size
= 4*1024*1024,
78 .name
= "Compex WP54AG",
79 .mach_type
= MACH_ADM5120_WP54AG
,
82 .flash0_size
= 4*1024*1024,
85 .name
= "Compex WP54G",
86 .mach_type
= MACH_ADM5120_WP54G
,
89 .flash0_size
= 4*1024*1024,
92 .name
= "Compex WP54G-WRT",
93 .mach_type
= MACH_ADM5120_WP54G_WRT
,
96 .flash0_size
= 4*1024*1024,
99 .name
= "Compex WP54G v1C",
100 .mach_type
= MACH_ADM5120_WP54Gv1C
,
103 .flash0_size
= 2*1024*1024,
106 .name
= "Compex WPP54AG",
107 .mach_type
= MACH_ADM5120_WPP54AG
,
110 .flash0_size
= 4*1024*1024,
113 .name
= "Compex WPP54G",
114 .mach_type
= MACH_ADM5120_WPP54G
,
117 .flash0_size
= 4*1024*1024,
120 .name
= "RouterBOARD 111",
121 .mach_type
= MACH_ADM5120_RB_111
,
124 .flash0_size
= 128*1024,
127 .name
= "RouterBOARD 112",
128 .mach_type
= MACH_ADM5120_RB_112
,
131 .flash0_size
= 128*1024,
134 .name
= "RouterBOARD 133",
135 .mach_type
= MACH_ADM5120_RB_133
,
138 .flash0_size
= 128*1024,
141 .name
= "RouterBOARD 133C",
142 .mach_type
= MACH_ADM5120_RB_133C
,
145 .flash0_size
= 128*1024,
148 .name
= "RouterBOARD 150",
149 .mach_type
= MACH_ADM5120_RB_150
,
152 .flash0_size
= 128*1024,
155 .name
= "RouterBOARD 153",
156 .mach_type
= MACH_ADM5120_RB_153
,
159 .flash0_size
= 128*1024,
162 .name
= "ZyXEL ES-2108",
163 .mach_type
= MACH_ADM5120_ES2108
,
166 .flash0_size
= 4*1024*1024,
169 .name
= "ZyXEL ES-2108-F",
170 .mach_type
= MACH_ADM5120_ES2108F
,
173 .flash0_size
= 4*1024*1024,
176 .name
= "ZyXEL ES-2108-G",
177 .mach_type
= MACH_ADM5120_ES2108G
,
180 .flash0_size
= 4*1024*1024,
183 .name
= "ZyXEL ES-2108-LC",
184 .mach_type
= MACH_ADM5120_ES2108LC
,
187 .flash0_size
= 4*1024*1024,
190 .name
= "ZyXEL ES-2108PWR",
191 .mach_type
= MACH_ADM5120_ES2108PWR
,
194 .flash0_size
= 4*1024*1024,
197 .name
= "ZyXEL HomeSafe 100/100W",
198 .mach_type
= MACH_ADM5120_HS100
,
201 .flash0_size
= 4*1024*1024,
204 .name
= "ZyXEL Prestige 334",
205 .mach_type
= MACH_ADM5120_P334
,
208 .flash0_size
= 2*1024*1024,
211 .name
= "ZyXEL Prestige 334U",
212 .mach_type
= MACH_ADM5120_P334U
,
215 .flash0_size
= 4*1024*1024,
218 .name
= "ZyXEL Prestige 334W",
219 .mach_type
= MACH_ADM5120_P334W
,
222 .flash0_size
= 2*1024*1024,
225 .name
= "ZyXEL Prestige 334WH",
226 .mach_type
= MACH_ADM5120_P334WH
,
229 .flash0_size
= 4*1024*1024,
232 .name
= "ZyXEL Prestige 334WHD",
233 .mach_type
= MACH_ADM5120_P334WHD
,
236 .flash0_size
= 4*1024*1024,
239 .name
= "ZyXEL Prestige 334WT",
240 .mach_type
= MACH_ADM5120_P334WT
,
243 .flash0_size
= 4*1024*1024,
246 .name
= "ZyXEL Prestige 335/335WT",
247 .mach_type
= MACH_ADM5120_P335
,
250 .flash0_size
= 4*1024*1024,
253 .name
= "ZyXEL Prestige 335Plus",
254 .mach_type
= MACH_ADM5120_P335PLUS
,
257 .flash0_size
= 4*1024*1024,
260 .name
= "ZyXEL Prestige 335U",
261 .mach_type
= MACH_ADM5120_P335U
,
264 .flash0_size
= 4*1024*1024,
267 .name
= "Unknown ADM5120 board",
268 .mach_type
= MACH_ADM5120_UNKNOWN
,
271 .flash0_size
= 4*1024*1024,
275 #define DUMMY_BOARD() {.mach_type = MACH_ADM5120_UNKNOWN}
282 unsigned long mach_type
;
286 #define MYLO_BOARD(v,d,sv,sd,mt) { .vid = (v), .did = (d), .svid = (sv), \
287 .sdid = (sd), .mach_type = (mt) }
289 #define COMPEX_BOARD(d,mt) MYLO_BOARD(VENID_COMPEX,(d),VENID_COMPEX,(d),(mt))
291 static struct mylo_board __initdata mylo_boards
[] = {
292 COMPEX_BOARD(DEVID_COMPEX_NP27G
, MACH_ADM5120_NP27G
),
293 COMPEX_BOARD(DEVID_COMPEX_NP28G
, MACH_ADM5120_NP28G
),
294 COMPEX_BOARD(DEVID_COMPEX_NP28GHS
, MACH_ADM5120_NP28GHS
),
295 COMPEX_BOARD(DEVID_COMPEX_WP54G
, MACH_ADM5120_WP54G
),
296 COMPEX_BOARD(DEVID_COMPEX_WP54Gv1C
, MACH_ADM5120_WP54Gv1C
),
297 COMPEX_BOARD(DEVID_COMPEX_WP54AG
, MACH_ADM5120_WP54AG
),
298 COMPEX_BOARD(DEVID_COMPEX_WPP54G
, MACH_ADM5120_WPP54G
),
299 COMPEX_BOARD(DEVID_COMPEX_WPP54AG
, MACH_ADM5120_WPP54AG
),
303 #define ROUTERBOARD_NAME_LEN 16
306 unsigned long mach_type
;
307 char name
[ROUTERBOARD_NAME_LEN
];
310 #define ROUTERBOARD(n, mt) { .name = (n), .mach_type = (mt) }
311 static struct routerboard __initdata routerboards
[] = {
312 ROUTERBOARD("111", MACH_ADM5120_RB_111
),
313 ROUTERBOARD("112", MACH_ADM5120_RB_112
),
314 ROUTERBOARD("133", MACH_ADM5120_RB_133
),
315 ROUTERBOARD("133C", MACH_ADM5120_RB_133C
),
316 ROUTERBOARD("miniROUTER", MACH_ADM5120_RB_150
),
317 ROUTERBOARD("153", MACH_ADM5120_RB_150
),
322 unsigned long mach_type
;
323 unsigned int vendor_id
;
327 #define ZYNOS_BOARD(vi, bi, mt) { .vendor_id = (vi), .board_id = (bi), \
330 #define ZYXEL_BOARD(bi, mt) ZYNOS_BOARD(ZYNOS_VENDOR_ID_ZYXEL, bi, mt)
331 #define DLINK_BOARD(bi, mt) ZYNOS_BOARD(ZYNOS_VENDOR_ID_DLINK, bi, mt)
332 #define LUCENT_BOARD(bi, mt) ZYNOS_BOARD(ZYNOS_VENDOR_ID_LUCENT, bi, mt)
334 static struct zynos_board __initdata zynos_boards
[] = {
335 ZYXEL_BOARD(ZYNOS_BOARD_HS100
, MACH_ADM5120_HS100
),
336 ZYXEL_BOARD(ZYNOS_BOARD_P334
, MACH_ADM5120_P334
),
337 ZYXEL_BOARD(ZYNOS_BOARD_P334U
, MACH_ADM5120_P334U
),
338 ZYXEL_BOARD(ZYNOS_BOARD_P334W
, MACH_ADM5120_P334W
),
339 ZYXEL_BOARD(ZYNOS_BOARD_P334WH
, MACH_ADM5120_P334WH
),
340 ZYXEL_BOARD(ZYNOS_BOARD_P334WHD
, MACH_ADM5120_P334WHD
),
341 ZYXEL_BOARD(ZYNOS_BOARD_P334WT
, MACH_ADM5120_P334WT
),
342 ZYXEL_BOARD(ZYNOS_BOARD_P335
, MACH_ADM5120_P335
),
343 ZYXEL_BOARD(ZYNOS_BOARD_P335PLUS
, MACH_ADM5120_P335PLUS
),
344 ZYXEL_BOARD(ZYNOS_BOARD_P335U
, MACH_ADM5120_P335U
),
351 static inline u16
read_le16(void *buf
)
356 return ((u16
)p
[0] + ((u16
)p
[1] << 8));
359 static inline u32
read_le32(void *buf
)
364 return ((u32
)p
[0] + ((u32
)p
[1] << 8) + ((u32
)p
[2] << 16) +
368 static inline u16
read_be16(void *buf
)
373 return (((u16
)p
[0] << 8) + (u16
)p
[1]);
376 static inline u32
read_be32(void *buf
)
381 return (((u32
)p
[0] << 24) + ((u32
)p
[1] << 16) + ((u32
)p
[2] << 8) +
388 #define CFE_EPTSEAL 0x43464531 /* CFE1 is the magic number to recognize CFE
389 from other bootloaders */
391 static int __init
cfe_present(void)
394 * This method only works, when we are booted directly from the CFE.
396 u32 cfe_handle
= (u32
) fw_arg0
;
397 u32 cfe_a1_val
= (u32
) fw_arg1
;
398 u32 cfe_entry
= (u32
) fw_arg2
;
399 u32 cfe_seal
= (u32
) fw_arg3
;
401 /* Check for CFE by finding the CFE magic number */
402 if (cfe_seal
!= CFE_EPTSEAL
) {
403 /* We are not booted from CFE */
407 /* cfe_a1_val must be 0, because only one CPU present in the ADM5120 */
408 if (cfe_a1_val
!= 0) {
412 /* The cfe_handle, and the cfe_entry must be kernel mode addresses */
413 if ((cfe_handle
< KSEG0
) || (cfe_entry
< KSEG0
)) {
420 static unsigned long __init
cfe_detect_board(void)
422 return MACH_ADM5120_WP54G_WRT
;
426 * MyLoader based boards
428 #define SYS_PARAMS_ADDR KSEG1ADDR(ADM5120_SRAM0_BASE+0x0F000)
429 #define BOARD_PARAMS_ADDR KSEG1ADDR(ADM5120_SRAM0_BASE+0x0F800)
430 #define PART_TABLE_ADDR KSEG1ADDR(ADM5120_SRAM0_BASE+0x10000)
432 static unsigned long __init
myloader_detect_board(void)
434 struct mylo_system_params
*sysp
;
435 struct mylo_board_params
*boardp
;
436 struct mylo_partition_table
*parts
;
437 struct mylo_board
*board
;
440 ret
= MACH_ADM5120_UNKNOWN
;
442 sysp
= (struct mylo_system_params
*)(SYS_PARAMS_ADDR
);
443 boardp
= (struct mylo_board_params
*)(BOARD_PARAMS_ADDR
);
444 parts
= (struct mylo_partition_table
*)(PART_TABLE_ADDR
);
446 /* Check for some magic numbers */
447 if ((le32_to_cpu(sysp
->magic
) != MYLO_MAGIC_SYS_PARAMS
) ||
448 (le32_to_cpu(boardp
->magic
) != MYLO_MAGIC_BOARD_PARAMS
) ||
449 (le32_to_cpu(parts
->magic
) != MYLO_MAGIC_PARTITIONS
))
452 for (board
= mylo_boards
; board
->mach_type
!= MACH_ADM5120_UNKNOWN
;
454 if ((le16_to_cpu(sysp
->vid
) == board
->vid
) &&
455 (le16_to_cpu(sysp
->did
) == board
->did
) &&
456 (le16_to_cpu(sysp
->svid
) == board
->svid
) &&
457 (le16_to_cpu(sysp
->sdid
) == board
->sdid
)) {
458 ret
= board
->mach_type
;
463 /* assume MyLoader as the boot-loader */
464 adm5120_boot_loader
= BOOT_LOADER_MYLOADER
;
471 * RouterBOOT based boards
473 static int __init
routerboot_load_hs(u8
*buf
, u16 buflen
,
474 struct rb_hard_settings
*hs
)
483 if (read_le32(buf
) != RB_MAGIC_HARD
)
486 /* skip magic value */
494 if (id
== RB_ID_TERMINATOR
|| buflen
< 2)
497 len
= read_le16(buf
);
505 case RB_ID_BIOS_VERSION
:
506 hs
->bios_ver
= (char *)buf
;
508 case RB_ID_BOARD_NAME
:
509 hs
->name
= (char *)buf
;
511 case RB_ID_MEMORY_SIZE
:
512 hs
->mem_size
= read_le32(buf
);
514 case RB_ID_MAC_ADDRESS_COUNT
:
515 hs
->mac_count
= read_le32(buf
);
517 case RB_ID_MAC_ADDRESS_PACK
:
518 hs
->mac_count
= len
/RB_MAC_SIZE
;
519 if (hs
->mac_count
> RB_MAX_MAC_COUNT
)
520 hs
->mac_count
= RB_MAX_MAC_COUNT
;
522 for (i
=0; i
< hs
->mac_count
; i
++) {
523 for (j
=0; j
< RB_MAC_SIZE
; j
++)
524 hs
->macs
[i
][j
] = mac
[j
];
538 #define RB_BS_OFFS 0x14
539 #define RB_OFFS_MAX (128*1024)
541 static unsigned long __init
routerboot_detect_board(void)
543 struct routerboard
*board
;
544 struct rb_hard_settings hs
;
545 struct rb_bios_settings
*bs
;
550 ret
= MACH_ADM5120_UNKNOWN
;
552 base
= (u8
*)KSEG1ADDR(ADM5120_SRAM0_BASE
);
553 bs
= (struct rb_bios_settings
*)(base
+ RB_BS_OFFS
);
555 off
= read_le32(&bs
->hs_offs
);
556 len
= read_le32(&bs
->hs_size
);
557 if (off
> RB_OFFS_MAX
)
560 memset(&hs
, 0, sizeof(hs
));
561 if (routerboot_load_hs(base
+off
, len
, &hs
) != 0)
564 /* assume RouterBOOT as the boot-loader */
565 adm5120_boot_loader
= BOOT_LOADER_ROUTERBOOT
;
570 for (board
= routerboards
; board
->mach_type
!= MACH_ADM5120_UNKNOWN
;
572 if (strncmp(board
->name
, hs
.name
, strlen(board
->name
)) == 0) {
573 ret
= board
->mach_type
;
584 static inline u32
zynos_dbgarea_present(u8
*data
)
588 t
= read_be32(data
+5);
589 if (t
!= ZYNOS_MAGIC_DBGAREA1
)
592 t
= read_be32(data
+9);
593 if (t
!= ZYNOS_MAGIC_DBGAREA2
)
599 #define CHECK_VENDOR(n) (strnicmp(vendor,(n),strlen(n)) == 0)
601 static inline unsigned int zynos_get_vendor_id(struct zynos_board_info
*info
)
603 unsigned char vendor
[ZYNOS_NAME_LEN
];
606 for (i
=0; i
<ZYNOS_NAME_LEN
; i
++)
607 vendor
[i
]=info
->vendor
[i
];
609 if CHECK_VENDOR(ZYNOS_VENDOR_ZYXEL
)
610 return ZYNOS_VENDOR_ID_ZYXEL
;
612 /* TODO: there are no known ADM5120 based boards from other vendors */
613 if CHECK_VENDOR(ZYNOS_VENDOR_DLINK
)
614 return ZYNOS_VENDOR_ID_DLINK
;
616 if CHECK_VENDOR(ZYNOS_VENDOR_LUCENT
)
617 return ZYNOS_VENDOR_ID_LUCENT
;
619 if CHECK_VENDOR(ZYNOS_VENDOR_NETGEAR
)
620 return ZYNOS_VENDOR_ID_NETGEAR
;
623 return ZYNOS_VENDOR_ID_OTHER
;
626 static inline u16
zynos_get_board_id(struct zynos_board_info
*info
)
628 return read_be16(&info
->board_id
);
631 static inline u32
zynos_get_bootext_addr(struct zynos_board_info
*info
)
633 return read_be32(&info
->bootext_addr
);
637 #define ZYNOS_INFO_ADDR KSEG1ADDR(ADM5120_SRAM0_BASE+0x3F90)
638 #define ZYNOS_HDBG_ADDR KSEG1ADDR(ADM5120_SRAM0_BASE+0x4000)
639 #define BOOTEXT_ADDR_MIN KSEG1ADDR(ADM5120_SRAM0_BASE)
640 #define BOOTEXT_ADDR_MAX (BOOTEXT_ADDR_MIN + (2*1024*1024))
642 static unsigned long __init
zynos_detect_board(void)
644 struct zynos_board_info
*info
;
645 struct zynos_board
*board
;
646 unsigned int vendor_id
;
651 ret
= MACH_ADM5120_UNKNOWN
;
652 /* check presence of the dbgarea */
653 if (zynos_dbgarea_present((u8
*)ZYNOS_HDBG_ADDR
) == 0)
656 info
= (struct zynos_board_info
*)(ZYNOS_INFO_ADDR
);
658 /* check for a valid BootExt address */
659 t
= zynos_get_bootext_addr(info
);
660 if ((t
< BOOTEXT_ADDR_MIN
) || (t
> BOOTEXT_ADDR_MAX
))
663 vendor_id
= zynos_get_vendor_id(info
);
664 board_id
= zynos_get_board_id(info
);
666 for (board
= zynos_boards
; board
->mach_type
!= MACH_ADM5120_UNKNOWN
;
668 if ((board
->vendor_id
== vendor_id
) &&
669 (board
->board_id
== board_id
)) {
670 ret
= board
->mach_type
;
675 /* assume Bootbase as the boot-loader */
676 adm5120_boot_loader
= BOOT_LOADER_BOOTBASE
;
683 * U-Boot based boards
685 static int __init
uboot_present(void)
687 /* FIXME: not yet implemented */
691 static unsigned long __init
uboot_detect_board(void)
693 /* FIXME: not yet implemented */
694 return MACH_ADM5120_UNKNOWN
;
697 static void __init
adm5120_detect_board(void)
699 struct adm5120_board
*board
;
702 adm5120_boot_loader
= BOOT_LOADER_UNKNOWN
;
704 /* Try to detect board type without bootloader */
705 t
= routerboot_detect_board();
707 if (t
== MACH_ADM5120_UNKNOWN
)
708 t
= zynos_detect_board();
710 if (t
== MACH_ADM5120_UNKNOWN
)
711 t
= myloader_detect_board();
713 /* Try to detect bootloader type */
715 adm5120_boot_loader
= BOOT_LOADER_CFE
;
716 if (t
== MACH_ADM5120_UNKNOWN
)
717 t
= cfe_detect_board();
718 } else if (uboot_present()) {
719 adm5120_boot_loader
= BOOT_LOADER_UBOOT
;
720 if (t
== MACH_ADM5120_UNKNOWN
)
721 t
= uboot_detect_board();
724 for (board
= adm5120_boards
; board
->mach_type
!= MACH_ADM5120_UNKNOWN
;
726 if (board
->mach_type
== t
)
730 memcpy(&adm5120_board
, board
, sizeof(adm5120_board
));
733 #define SWITCH_READ(r) *(u32 *)(KSEG1ADDR(ADM5120_SWITCH_BASE)+(r))
734 #define SWITCH_WRITE(r,v) *(u32 *)(KSEG1ADDR(ADM5120_SWITCH_BASE)+(r))=(v)
737 * CPU settings detection
739 #define CODE_GET_PC(c) ((c) & CODE_PC_MASK)
740 #define CODE_GET_REV(c) (((c) >> CODE_REV_SHIFT) & CODE_REV_MASK)
741 #define CODE_GET_PK(c) (((c) >> CODE_PK_SHIFT) & CODE_PK_MASK)
742 #define CODE_GET_CLKS(c) (((c) >> CODE_CLKS_SHIFT) & CODE_CLKS_MASK)
743 #define CODE_GET_NAB(c) (((c) & CODE_NAB) != 0)
745 static void __init
adm5120_detect_cpuinfo(void)
750 code
= SWITCH_READ(SWITCH_REG_CODE
);
752 adm5120_product_code
= CODE_GET_PC(code
);
753 adm5120_revision
= CODE_GET_REV(code
);
754 adm5120_package
= (CODE_GET_PK(code
) == CODE_PK_BGA
) ?
755 ADM5120_PACKAGE_BGA
: ADM5120_PACKAGE_PQFP
;
756 adm5120_nand_boot
= CODE_GET_NAB(code
);
758 clks
= CODE_GET_CLKS(code
);
759 adm5120_speed
= ADM5120_SPEED_175
;
761 adm5120_speed
+= 25000000;
763 adm5120_speed
+= 50000000;
767 # define mem_dbg(f, ...) prom_printf("mem_detect: " f, ## __VA_ARGS__)
768 extern void prom_printf(char *, ...);
770 # define mem_dbg(f, ...)
773 static void __init
adm5120_detect_memsize(void)
780 memctrl
= SWITCH_READ(SWITCH_REG_MEMCTRL
);
781 switch (memctrl
& MEMCTRL_SDRS_MASK
) {
782 case MEMCTRL_SDRS_4M
:
785 case MEMCTRL_SDRS_8M
:
788 case MEMCTRL_SDRS_16M
:
796 /* FIXME: need to disable buffers for both SDRAM bank? */
798 mem_dbg("checking for %ldMB chip\n",maxsize
>> 20);
800 /* detect size of the 1st SDRAM bank */
801 p
= (volatile u8
*)KSEG1ADDR(0);
803 for (size
= 2<<20; size
<= (maxsize
>> 1); size
<<= 1) {
807 mem_dbg("1st pattern at 0x%lx is 0x%02x\n", size
, *r
);
810 mem_dbg("2nd pattern at 0x%lx is 0x%02x\n", size
, *r
);
812 /* mirrored address */
813 mem_dbg("mirrored data found at 0x%lx\n", size
);
819 mem_dbg("1st pattern at 0x%lx is 0x%02x\n", size
, p
[size
]);
824 mem_dbg("2nd pattern at 0x%lx is 0x%02x\n", size
, p
[size
]);
828 /* mirrored address */
829 mem_dbg("mirrored data found at 0x%lx\n", size
);
835 mem_dbg("%ldMB chip found\n", size
>> 20);
837 if (size
== (32 << 20))
838 /* if bank size is 32MB, 2nd bank is not supported */
841 if ((memctrl
& MEMCTRL_SDR1_ENABLE
) == 0)
842 /* if 2nd bank is not enabled, we are done */
846 * some bootloaders enable 2nd bank, even if the 2nd SDRAM chip
849 mem_dbg("checking second bank\n");
850 p
+= (maxsize
+size
)-1;
861 if (maxsize
!= size
) {
862 /* adjusting MECTRL register */
863 memctrl
&= ~(MEMCTRL_SDRS_MASK
);
866 memctrl
|= MEMCTRL_SDRS_4M
;
869 memctrl
|= MEMCTRL_SDRS_8M
;
872 memctrl
|= MEMCTRL_SDRS_16M
;
875 memctrl
|= MEMCTRL_SDRS_64M
;
878 SWITCH_WRITE(SWITCH_REG_MEMCTRL
, memctrl
);
883 adm5120_memsize
= size
;
884 mem_dbg("%ldMB memory found\n",size
>>20);
887 void __init
adm5120_info_show(void)
889 /* FIXME: move this somewhere else */
890 printk("ADM%04X%s revision %d, running at %ldMHz\n",
891 adm5120_product_code
,
892 (adm5120_package
== ADM5120_PACKAGE_BGA
) ? "" : "P",
893 adm5120_revision
, (adm5120_speed
/ 1000000)
895 printk("Boot loader is: %s\n", boot_loader_names
[adm5120_boot_loader
]);
896 printk("Booted from : %s flash\n", adm5120_nand_boot
? "NAND":"NOR");
897 printk("Board is : %s\n", adm5120_board_name());
898 printk("Memory size : %ldMB\n", adm5120_memsize
>> 20);
901 void __init
adm5120_swab_test(void)
903 #if CONFIG_ADM5120_HARDWARE_SWAB
907 t2
= __arch__swab16(t1
);
908 printk("hardware swab16 test %s, data:0x%04X, result:0x%04X\n",
909 (t2
== 0x3412) ? "passed" :"failed", t1
, t2
);
912 t2
= __arch__swab32(t1
);
913 printk("hardware swab32 test %s, data:0x%08X, result:0x%08X\n",
914 (t2
== 0x78563412) ? "passed" :"failed", t1
, t2
);
916 #endif /* CONFIG_ADM5120_HARDWARE_SWAB */
919 void __init
adm5120_info_init(void)
922 adm5120_detect_cpuinfo();
923 adm5120_detect_memsize();
924 adm5120_detect_board();