+======================================================================
+Modifications for 1.1.5:
+======================================================================
+
+* Fix output of "iminfo" for script images
+
+* Include all the 8260 clocks in the "bdinfo" output
+ Patch by Jon Diekema, 19 Jan 2002
+
+* GTH Board: added logging of software watchdog reboot
+ Patch by Thomas Lange, 19 Jan 2002
+
======================================================================
Modifications for 1.1.4:
======================================================================
return (sdramsz << 20);
}
+#define POWER_OFFSET 0xF0000
+#define SW_WATCHDOG_REASON 13
+
#define BOOTDATA_OFFSET 0xF8000
#define MAX_ATTEMPTS 5
WRITE_FLASH16(addr, data);
}
+static void maybe_update_restart_reason(volatile u32 *addr32){
+ /* Update addr if sw wd restart */
+ volatile u16 *flash = (u16*)(CFG_FLASH_BASE);
+ volatile u16 *addr_16 = (u16*)addr32;
+ u32 rsr;
+
+ /* Dont reset register now */
+ rsr = ((volatile immap_t *)CFG_IMMR)->im_clkrst.car_rsr;
+
+ rsr >>=24;
+
+ if(rsr&0x10){
+ /* Was really a sw wd restart, update reason */
+
+ printf("Last restart by software watchdog\n");
+
+ /* AMD 16 bit */
+ WRITE_FLASH16(&flash[0x555], 0xAAAA);
+ WRITE_FLASH16(&flash[0x2AA], 0x5555);
+ WRITE_FLASH16(&flash[0x555], 0xA0A0);
+
+ WRITE_FLASH16(addr_16, 0);
+
+ udelay(1000);
+
+ WATCHDOG_RESET();
+
+ /* AMD 16 bit */
+ WRITE_FLASH16(&flash[0x555], 0xAAAA);
+ WRITE_FLASH16(&flash[0x2AA], 0x5555);
+ WRITE_FLASH16(&flash[0x555], 0xA0A0);
+
+ WRITE_FLASH16(addr_16+1, SW_WATCHDOG_REASON);
+
+ }
+}
+
+static void check_restart_reason(void){
+ /* Update restart reason if sw watchdog was
+ triggered */
+
+ int i;
+ volatile u32 *raddr;
+
+ raddr = (u32*)(CFG_FLASH_BASE+POWER_OFFSET);
+
+ if(*raddr==0xFFFFFFFF){
+ /* Nothing written */
+ maybe_update_restart_reason(raddr);
+ }
+ else{
+ /* Search for latest written reason */
+ i=0;
+ while((*(raddr+2)!=0xFFFFFFFF)&(i<2000)){
+ raddr+=2;
+ i++;
+ }
+ if(i>=2000){
+ /* Whoa, dont write any more */
+ printf("*** No free restart reason found ***\n");
+ }
+ else{
+ /* Check if written */
+ if(*raddr==0){
+ /* Erased by kernel, no new reason written */
+ maybe_update_restart_reason(raddr+2);
+ }
+ }
+ }
+}
+
static void check_boot_tries(void){
/* Count the number of boot attemps
switch system if too many */
i++;
}
if(i>=8000){
- // Whoa, dont write any more
+ /* Whoa, dont write any more */
printf("*** No bootdata found. Not updating flash***\n");
}
else{
case 2:
case 3:
case 4:
- // Try same system again if needed
+ /* Try same system again if needed */
count++;
break;
case 5:
- // Switch system and reset tries
+ /* Switch system and reset tries */
count=1;
system=3-system;
printf("***Too many boot attempts, switching system***\n");
break;
default:
- // Switch system, start over and hope it works
+ /* Switch system, start over and hope it works */
printf("***Unexpected data on addr 0x%x, %u***\n",(u32)addr,data);
count=1;
system=3-system;
/* Check if we need to boot failsafe system */
check_boot_tries();
+ /* Check if we need to update restart reason */
+ check_restart_reason();
+
if(ee_init_data()){
printf("EEPROM init failed\n");
return;
print_str ("pci_busfreq", strmhz(buf, bd->bi_pci_busfreq));
#endif
#else
+#if defined(CONFIG_8260)
+ print_str ("vco", strmhz(buf, bd->bi_vco));
+ print_str ("sccfreq", strmhz(buf, bd->bi_sccfreq));
+ print_str ("brgfreq", strmhz(buf, bd->bi_brgfreq));
+#endif
print_str ("intfreq", strmhz(buf, bd->bi_intfreq));
+#if defined(CONFIG_8260)
+ print_str ("cpmfreq", strmhz(buf, bd->bi_cpmfreq));
+#endif
print_str ("busfreq", strmhz(buf, bd->bi_busfreq));
#endif /* defined(CONFIG_405GP) || defined(CONFIG_405CR) */
printf ("ethaddr =");