3 Copyright 2004 Broadcom Corp. All Rights Reserved.
5 This program is free software; you can distribute it and/or modify it
6 under the terms of the GNU General Public License (Version 2) as
7 published by the Free Software Foundation.
9 This program is distributed in the hope it will be useful, but WITHOUT
10 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 You should have received a copy of the GNU General Public License along
15 with this program; if not, write to the Free Software Foundation, Inc.,
16 59 Temple Place - Suite 330, Boston MA 02111-1307, USA.
20 * prom.c: PROM library initialization code.
23 #include <linux/init.h>
25 #include <linux/sched.h>
26 #include <linux/bootmem.h>
27 #include <linux/blkdev.h>
28 #include <asm/addrspace.h>
29 #include <asm/bootinfo.h>
33 #include <bcm_map_part.h>
35 #include "boardparms.h"
36 #include "softdsl/AdslCoreDefs.h"
39 extern int do_syslog(int, char *, int);
40 extern void serial_init(void);
41 extern void __init InitNvramInfo( void );
42 extern void kerSysFlashInit( void );
43 extern unsigned long get_nvram_start_addr(void);
44 void __init create_root_nfs_cmdline( char *cmdline );
46 #if defined(CONFIG_BCM96338)
47 #define CPU_CLOCK 240000000
48 #define MACH_BCM MACH_BCM96338
50 #if defined(CONFIG_BCM96348)
51 void __init calculateCpuSpeed(void);
52 static unsigned long cpu_speed;
53 #define CPU_CLOCK cpu_speed
54 #define MACH_BCM MACH_BCM96348
56 #if defined(CONFIG_BCM96358)
57 void __init calculateCpuSpeed(void);
58 static unsigned long cpu_speed;
59 #define CPU_CLOCK cpu_speed
60 #define MACH_BCM MACH_BCM96358
63 const char *get_system_type(void)
65 PNVRAM_DATA pNvramData = (PNVRAM_DATA) get_nvram_start_addr();
67 return( pNvramData->szBoardId );
70 unsigned long getMemorySize(void)
72 unsigned long ulSdramType = BOARD_SDRAM_TYPE;
74 unsigned long ulSdramSize;
78 case BP_MEMORY_16MB_1_CHIP:
79 case BP_MEMORY_16MB_2_CHIP:
80 ulSdramSize = 16 * 1024 * 1024;
82 case BP_MEMORY_32MB_1_CHIP:
83 case BP_MEMORY_32MB_2_CHIP:
84 ulSdramSize = 32 * 1024 * 1024;
86 case BP_MEMORY_64MB_2_CHIP:
87 ulSdramSize = 64 * 1024 * 1024;
90 ulSdramSize = 8 * 1024 * 1024;
97 /* --------------------------------------------------------------------------
99 -------------------------------------------------------------------------- */
100 void __init prom_init(void)
102 extern ulong r4k_interval;
108 do_syslog(8, NULL, 8);
110 printk( "%s prom init\n", get_system_type() );
114 arcs_cmdline[0] = '\0';
116 #if defined(CONFIG_ROOT_NFS)
117 create_root_nfs_cmdline( arcs_cmdline );
118 #elif defined(CONFIG_ROOT_FLASHFS)
119 strcpy(arcs_cmdline, CONFIG_ROOT_FLASHFS);
122 #if defined(CONFIG_BCM96358) && defined(CONFIG_BCM_ENDPOINT_MODULE)
123 add_memory_region(0, (getMemorySize() - 1024*1024), BOOT_MEM_RAM);
125 add_memory_region(0, (getMemorySize() - ADSL_SDRAM_IMAGE_SIZE), BOOT_MEM_RAM);
128 #if defined(CONFIG_BCM96348) || defined(CONFIG_BCM96358)
131 /* Count register increments every other clock */
132 r4k_interval = CPU_CLOCK / HZ / 2;
133 mips_hpt_frequency = CPU_CLOCK / 2;
135 mips_machgroup = MACH_GROUP_BRCM;
136 mips_machtype = MACH_BCM;
139 /* --------------------------------------------------------------------------
140 Name: prom_free_prom_memory
142 -------------------------------------------------------------------------- */
143 void __init prom_free_prom_memory(void)
149 #if defined(CONFIG_ROOT_NFS)
150 /* This function reads in a line that looks something like this:
153 * CFE bootline=bcmEnet(0,0)host:vmlinux e=192.169.0.100:ffffff00 h=192.169.0.1
156 * and retuns in the cmdline parameter some that looks like this:
158 * CONFIG_CMDLINE="root=/dev/nfs nfsroot=192.168.0.1:/opt/targets/96345R/fs
159 * ip=192.168.0.100:192.168.0.1::255.255.255.0::eth0:off rw"
161 #define BOOT_LINE_ADDR 0x0
162 #define HEXDIGIT(d) ((d >= '0' && d <= '9') ? (d - '0') : ((d | 0x20) - 'W'))
163 #define HEXBYTE(b) (HEXDIGIT((b)[0]) << 4) + HEXDIGIT((b)[1])
164 extern unsigned long get_nvram_start_addr(void);
166 void __init create_root_nfs_cmdline( char *cmdline )
168 char root_nfs_cl[] = "root=/dev/nfs nfsroot=%s:" CONFIG_ROOT_NFS_DIR
169 " ip=%s:%s::%s::eth0:off rw";
171 char *localip = NULL;
174 PNVRAM_DATA pNvramData = (PNVRAM_DATA) get_nvram_start_addr();
175 char bootline[128] = "";
178 memcpy(bootline, pNvramData->szBootline, sizeof(bootline));
181 if( p[0] == 'e' && p[1] == '=' )
183 /* Found local ip address */
186 while( *p && *p != ' ' && *p != ':' )
190 /* Found network mask (eg FFFFFF00 */
192 sprintf( mask, "%u.%u.%u.%u", HEXBYTE(p), HEXBYTE(p + 2),
193 HEXBYTE(p + 4), HEXBYTE(p + 6) );
199 else if( p[0] == 'h' && p[1] == '=' )
201 /* Found host ip address */
204 while( *p && *p != ' ' )
213 if( localip && hostip )
214 sprintf( cmdline, root_nfs_cl, hostip, localip, hostip, mask );
218 #if defined(CONFIG_BCM96348)
219 /* *********************************************************************
220 * calculateCpuSpeed()
221 * Calculate the BCM6348 CPU speed by reading the PLL strap register
222 * and applying the following formula:
223 * cpu_clk = (.25 * 64MHz freq) * (N1 + 1) * (N2 + 2) / (M1_CPU + 1)
228 ********************************************************************* */
229 void __init calculateCpuSpeed(void)
231 UINT32 pllStrap = PERF->PllStrap;
232 int n1 = (pllStrap & PLL_N1_MASK) >> PLL_N1_SHFT;
233 int n2 = (pllStrap & PLL_N2_MASK) >> PLL_N2_SHFT;
234 int m1cpu = (pllStrap & PLL_M1_CPU_MASK) >> PLL_M1_CPU_SHFT;
236 cpu_speed = (16 * (n1 + 1) * (n2 + 2) / (m1cpu + 1)) * 1000000;
240 #if defined(CONFIG_BCM96358)
241 /* *********************************************************************
242 * calculateCpuSpeed()
243 * Calculate the BCM6358 CPU speed by reading the PLL Config register
244 * and applying the following formula:
245 * Fcpu_clk = (25 * MIPSDDR_NDIV) / MIPS_MDIV
250 ********************************************************************* */
251 void __init calculateCpuSpeed(void)
253 UINT32 pllConfig = DDR->MIPSDDRPLLConfig;
256 cpu_speed = 64000000 / ((pllConfig & MIPS_MDIV_MASK) >> MIPS_MDIV_SHFT);
257 numerator = (((pllConfig & MIPSDDR_N2_MASK) >> MIPSDDR_N2_SHFT) * ((pllConfig & MIPSDDR_N1_MASK) >> MIPSDDR_N1_SHFT));
258 cpu_speed = (cpu_speed * numerator) / 4;