int board_late_init(void) { int ret = 0; setup_ups(); if (!power_init()) setup_clocks(); ret = read_eeprom(); if (ret) printf("Error %d reading EEPROM content!\n", ret); eth_phy_reset(); show_eeprom(); read_board_id(); return ret; }
/***************************************** * Routine: board_init * Description: Early hardware init. *****************************************/ int board_init(void) { DECLARE_GLOBAL_DATA_PTR; enum hw_board_id bid; gpmc_init(); /* in SRAM or SDRAM, finish GPMC */ #if defined(CONFIG_3621EVT1A) gd->bd->bi_arch_number = MACH_TYPE_OMAP3621_EVT1A; /* Linux mach id */ bid = read_board_id(); switch(bid) { case NONE: gd->bd->bi_board_revision = BOARD_ENCORE_REV_EVT1A; break; case EVT1B: gd->bd->bi_board_revision = BOARD_ENCORE_REV_EVT1B; break; case EVT2: gd->bd->bi_board_revision = BOARD_ENCORE_REV_EVT2; break; case DVT: gd->bd->bi_board_revision = BOARD_ENCORE_REV_DVT; break; case PVT: gd->bd->bi_board_revision = BOARD_ENCORE_REV_PVT; break; default: gd->bd->bi_arch_number = BOARD_ENCORE_REV_UNKNOWN; } #else gd->bd->bi_arch_number = MACH_TYPE_OMAP3621_BOXER; /* Linux mach id*/ #endif gd->bd->bi_boot_params = (OMAP34XX_SDRC_CS0 + 0x100); /* boot param addr */ return 0; }
/* * Do all the stuff that locore normally does before calling main(). */ void mach_init(int32_t memsize32, u_int bim, int32_t bip32) { intptr_t memsize = (int32_t)memsize32; char *kernend; char *bip = (char *)(intptr_t)(int32_t)bip32; u_long first, last; extern char edata[], end[]; const char *bi_msg; #if NKSYMS || defined(DDB) || defined(MODULAR) char *ssym = 0; struct btinfo_symtab *bi_syms; #endif struct btinfo_howto *bi_howto; /* * Clear the BSS segment (if needed). */ if (memcmp(((Elf_Ehdr *)end)->e_ident, ELFMAG, SELFMAG) == 0 && ((Elf_Ehdr *)end)->e_ident[EI_CLASS] == ELFCLASS) { esym = end; #if NKSYMS || defined(DDB) || defined(MODULAR) esym += ((Elf_Ehdr *)end)->e_entry; #endif kernend = (char *)mips_round_page(esym); /* * We don't have to clear BSS here * since our bootloader already does it. */ #if 0 memset(edata, 0, end - edata); #endif } else { kernend = (void *)mips_round_page(end); /* * No symbol table, so assume we are loaded by * the firmware directly with "bfd" command. * The firmware loader doesn't clear BSS of * a loaded kernel, so do it here. */ memset(edata, 0, kernend - edata); } /* * Copy exception-dispatch code down to exception vector. * Initialize locore-function vector. * Clear out the I and D caches. */ mips_vector_init(NULL, false); /* Check for valid bootinfo passed from bootstrap */ if (bim == BOOTINFO_MAGIC) { struct btinfo_magic *bi_magic; bootinfo = bip; bi_magic = lookup_bootinfo(BTINFO_MAGIC); if (bi_magic == NULL) { bi_msg = "missing bootinfo structure"; bim = (uintptr_t)bip; } else if (bi_magic->magic != BOOTINFO_MAGIC) { bi_msg = "invalid bootinfo structure"; bim = bi_magic->magic; } else bi_msg = NULL; } else { bi_msg = "invalid bootinfo (standalone boot?)"; } #if NKSYMS || defined(DDB) || defined(MODULAR) bi_syms = lookup_bootinfo(BTINFO_SYMTAB); /* Load symbol table if present */ if (bi_syms != NULL) { ssym = (void *)(intptr_t)bi_syms->ssym; esym = (void *)(intptr_t)bi_syms->esym; kernend = (void *)mips_round_page(esym); } #endif bi_howto = lookup_bootinfo(BTINFO_HOWTO); if (bi_howto != NULL) boothowto = bi_howto->bi_howto; cobalt_id = read_board_id(); if (cobalt_id >= COBALT_MODELS || cobalt_model[cobalt_id] == NULL) cpu_setmodel("Cobalt unknown model (board ID %u)", cobalt_id); else cpu_setmodel("%s", cobalt_model[cobalt_id]); switch (cobalt_id) { case COBALT_ID_QUBE2700: case COBALT_ID_RAQ: cpuspeed = 150; /* MHz */ break; case COBALT_ID_QUBE2: case COBALT_ID_RAQ2: cpuspeed = 250; /* MHz */ break; default: /* assume the fastest, so that delay(9) works */ cpuspeed = 250; break; } curcpu()->ci_cpu_freq = cpuspeed * 1000 * 1000; curcpu()->ci_cycles_per_hz = (curcpu()->ci_cpu_freq + hz / 2) / hz; curcpu()->ci_divisor_delay = ((curcpu()->ci_cpu_freq + (1000000 / 2)) / 1000000); /* all models have Rm5200, which is CPU_MIPS_DOUBLE_COUNT */ curcpu()->ci_cycles_per_hz /= 2; curcpu()->ci_divisor_delay /= 2; physmem = btoc(memsize - MIPS_KSEG0_START); consinit(); KASSERT(&lwp0 == curlwp); if (bi_msg != NULL) printf("%s: magic=%#x bip=%p\n", bi_msg, bim, bip); uvm_setpagesize(); /* * The boot command is passed in the top 512 bytes, * so don't clobber that. */ mem_clusters[0].start = 0; mem_clusters[0].size = ctob(physmem) - 512; mem_cluster_cnt = 1; memcpy(bootstring, (char *)(memsize - 512), 512); memset((char *)(memsize - 512), 0, 512); bootstring[511] = '\0'; decode_bootstring(); #if NKSYMS || defined(DDB) || defined(MODULAR) /* init symbols if present */ if ((bi_syms != NULL) && (esym != NULL)) ksyms_addsyms_elf(esym - ssym, ssym, esym); #endif KASSERT(&lwp0 == curlwp); #ifdef DDB if (boothowto & RB_KDB) Debugger(); #endif #ifdef KGDB if (boothowto & RB_KDB) kgdb_connect(0); #endif /* * Load the rest of the available pages into the VM system. */ first = round_page(MIPS_KSEG0_TO_PHYS(kernend)); last = mem_clusters[0].start + mem_clusters[0].size; uvm_page_physload(atop(first), atop(last), atop(first), atop(last), VM_FREELIST_DEFAULT); /* * Initialize error message buffer (at end of core). */ mips_init_msgbuf(); pmap_bootstrap(); /* * Allocate space for proc0's USPACE. */ mips_init_lwp0_uarea(); }
/* * Entry point. * Parse PROM boot string, load the kernel and jump into it */ int main(unsigned int memsize) { char **namep, *dev, *kernel, *bi_addr; char bootpath[PATH_MAX]; int win; u_long marks[MARK_MAX]; void (*entry)(unsigned int, u_int, char *); struct btinfo_flags bi_flags; struct btinfo_symtab bi_syms; struct btinfo_bootpath bi_bpath; struct btinfo_howto bi_howto; int addr, speed, howto; try_bootp = 1; /* Initialize boot info early */ dev = NULL; kernel = NULL; howto = 0x0; bi_flags.bi_flags = 0x0; bi_addr = bi_init(); lcd_init(); cobalt_id = read_board_id(); prominit(memsize); if (cninit(&addr, &speed) != NULL) bi_flags.bi_flags |= BI_SERIAL_CONSOLE; print_banner(memsize); memset(marks, 0, sizeof marks); get_bsdbootname(&dev, &kernel, &howto); if (kernel != NULL) { DPRINTF(("kernel: %s\n", kernel)); kernelnames[0] = kernel; kernelnames[1] = NULL; } else { DPRINTF(("kernel: NULL\n")); } win = 0; DPRINTF(("Kernel names: %p\n", kernelnames)); for (namep = kernelnames, win = 0; (*namep != NULL) && !win; namep++) { kernel = *namep; bootpath[0] = '\0'; strcpy(bootpath, dev ? dev : DEFBOOTDEV); strcat(bootpath, ":"); strcat(bootpath, kernel); lcd_loadfile(bootpath); printf("Loading: %s", bootpath); if (howto) printf(" (howto 0x%x)", howto); printf("\n"); patch_bootstring(bootpath); win = (loadfile(bootpath, marks, LOAD_ALL) != -1); } if (win) { strncpy(bi_bpath.bootpath, kernel, BTINFO_BOOTPATH_LEN); bi_add(&bi_bpath, BTINFO_BOOTPATH, sizeof(bi_bpath)); entry = (void *)marks[MARK_ENTRY]; bi_syms.nsym = marks[MARK_NSYM]; bi_syms.ssym = marks[MARK_SYM]; bi_syms.esym = marks[MARK_END]; bi_add(&bi_syms, BTINFO_SYMTAB, sizeof(bi_syms)); bi_add(&bi_flags, BTINFO_FLAGS, sizeof(bi_flags)); bi_howto.bi_howto = howto; bi_add(&bi_howto, BTINFO_HOWTO, sizeof(bi_howto)); entry = (void *)marks[MARK_ENTRY]; DPRINTF(("Bootinfo @ 0x%lx\n", (u_long)bi_addr)); printf("Starting at 0x%lx\n\n", (u_long)entry); (*entry)(memsize, BOOTINFO_MAGIC, bi_addr); } delay(20000); lcd_failed(); (void)printf("Boot failed! Rebooting...\n"); return 0; }