/* * Copyright (c) LOTUS. All rights reserved. */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #ifndef CONFIG_SYS_DCACHE_OFF void enable_caches(void) { /* Enable D-cache. I-cache is already enabled in start.S */ dcache_enable(); } #endif static int boot_media __section(.data) = BOOT_MEDIA_UNKNOWN; int get_boot_media(void) { unsigned int reg_val, boot_mode, spi_device_mode; if (boot_media != BOOT_MEDIA_UNKNOWN) return boot_media; reg_val = readl(SYS_CTRL_REG_BASE + REG_SYSSTAT); boot_mode = get_sys_boot_mode(reg_val); switch (boot_mode) { case BOOT_FROM_SPI: spi_device_mode = get_spi_device_type(reg_val); if (spi_device_mode) boot_media = BOOT_MEDIA_NAND; else boot_media = BOOT_MEDIA_SPIFLASH; break; case BOOT_FROM_EMMC: boot_media = BOOT_MEDIA_EMMC; break; default: boot_media = BOOT_MEDIA_UNKNOWN; break; } return boot_media; } void show_boot_media(void) { puts("Boot Media: "); switch (boot_media) { case BOOT_MEDIA_SPIFLASH: puts("SPI Nor"); break; case BOOT_MEDIA_NAND: puts("SPI Nand"); break; case BOOT_MEDIA_EMMC: puts("eMMC"); break; default: puts("Unknown"); break; } puts("\r\n"); } #if defined(CONFIG_SHOW_BOOT_PROGRESS) void show_boot_progress(int progress) { printf("Boot reached stage %d\n", progress); } #endif int board_early_init_f(void) { return 0; } int misc_init_r(void) { #ifdef CONFIG_RANDOM_ETHADDR random_init_r(); #endif env_set("verify", "n"); return 0; } void show_chip_info(void) { u32 chip_id = get_chipid(); printf("Chip ID: 0x%X\n", chip_id); } int board_init(void) { DECLARE_GLOBAL_DATA_PTR; gd->bd->bi_arch_number = MACH_TYPE_LOTUS; gd->bd->bi_boot_params = CFG_BOOT_PARAMS; get_boot_media(); show_boot_media(); show_chip_info(); return 0; } u64 get_ddr_size(void) { return readl(REG_BASE_SCTL + REG_SC_DDRT12); } int dram_init(void) { DECLARE_GLOBAL_DATA_PTR; gd->ram_size = get_ddr_size(); return 0; } void board_add_ram_info(int use_default) { #ifdef CONFIG_SYS_MEM_TOP_HIDE putc('('); print_size(CONFIG_SYS_MEM_TOP_HIDE, ""); puts(" Reserved)"); #endif } void reset_cpu(ulong addr) { /* 0x12345678:writing any value will cause a reset. */ writel(0x12345678, SYS_CTRL_REG_BASE + REG_SC_SYSRES); while (1); } int timer_init(void) { /* * Under uboot, 0xffffffff is set to load register, * timer_clk equals BUSCLK/2/256. * e.g. BUSCLK equals 50M, it will roll back after 0xffffffff/timer_clk * 43980s equals 12hours */ __raw_writel(0, TIMER0_REG_BASE + REG_TIMER_CONTROL); __raw_writel(~0, TIMER0_REG_BASE + REG_TIMER_RELOAD); /* 32 bit, periodic */ __raw_writel(CFG_TIMER_CTRL, TIMER0_REG_BASE + REG_TIMER_CONTROL); return 0; } int board_eth_init(bd_t *bis) { int rc = 0; #ifdef CONFIG_NET_FEMAC rc = bspeth_initialize(bis); #endif #ifdef CONFIG_FTGMAC030 rc = ftgmac030_initialize(bis); #endif return rc; } #ifdef CONFIG_GENERIC_MMC int board_mmc_init(bd_t *bis) { int ret = 0; #ifdef CONFIG_LOTUS_SDHCI int dev_num = 0; if (get_boot_media() == BOOT_MEDIA_EMMC) { ret = sdhci_add_port(dev_num, EMMC_BASE_REG, MMC_TYPE_MMC); if (!ret) { ret = lotus_mmc_init(dev_num); if (ret) printf("No EMMC device found !\n"); } dev_num++; } #ifdef CONFIG_AUTO_SD_UPDATE ret = sdhci_add_port(dev_num, SDIO0_BASE_REG, MMC_TYPE_SD); if (ret) return ret; ret = lotus_mmc_init(dev_num); if (ret) printf("No SD device found !\n"); #endif #endif return ret; } #endif enum env_location env_get_location(enum env_operation op, int prio) { int boot_media = get_boot_media(); enum env_location loc; if (prio) return ENVL_UNKNOWN; switch (boot_media) { case BOOT_MEDIA_SPIFLASH: loc = ENVL_SPI_FLASH; break; case BOOT_MEDIA_NAND: loc = ENVL_NAND; break; case BOOT_MEDIA_EMMC: loc = ENVL_MMC; break; default: loc = ENVL_UNKNOWN; break; } return loc; }