/* * (C) Copyright 2014 CompuLab, Ltd. * * Authors: Igor Grinberg * * SPDX-License-Identifier: GPL-2.0+ */ #include #include #include #include #include "common.h" DECLARE_GLOBAL_DATA_PTR; #ifdef CONFIG_CMD_NAND static int splash_nand_read(u32 bmp_load_addr, int offset, size_t read_size) { return nand_read_skip_bad(&nand_info[nand_curr_device], offset, &read_size, NULL, nand_info[nand_curr_device].size, (u_char *)bmp_load_addr); } #else static int splash_nand_read(u32 bmp_load_addr, int offset, size_t read_size) { debug("%s: nand support not available\n", __func__); return -ENOSYS; } #endif static int splash_storage_read(u32 bmp_load_addr, int offset, size_t read_size) { return splash_nand_read(bmp_load_addr, offset, read_size); } static int splash_load_raw(u32 bmp_load_addr, int offset) { struct bmp_header *bmp_hdr; int res; size_t bmp_size, bmp_header_size = sizeof(struct bmp_header); if (bmp_load_addr + bmp_header_size >= gd->start_addr_sp) goto splash_address_too_high; res = splash_storage_read(bmp_load_addr, offset, bmp_header_size); if (res < 0) return res; bmp_hdr = (struct bmp_header *)bmp_load_addr; bmp_size = le32_to_cpu(bmp_hdr->file_size); if (bmp_load_addr + bmp_size >= gd->start_addr_sp) goto splash_address_too_high; return splash_storage_read(bmp_load_addr, offset, bmp_size); splash_address_too_high: printf("Error: splashimage address too high. Data overwrites U-Boot " "and/or placed beyond DRAM boundaries.\n"); return -EFAULT; } int cl_splash_screen_prepare(int offset) { char *env_splashimage_value; u32 bmp_load_addr; env_splashimage_value = getenv("splashimage"); if (env_splashimage_value == NULL) return -ENOENT; bmp_load_addr = simple_strtoul(env_splashimage_value, 0, 16); if (bmp_load_addr == 0) { printf("Error: bad splashimage address specified\n"); return -EFAULT; } return splash_load_raw(bmp_load_addr, offset); }