/* * Load an uImage to a dynamically allocated sdram resource. * the resource must be freed afterwards with release_sdram_region */ struct resource *uimage_load_to_sdram(struct uimage_handle *handle, int image_no, unsigned long load_address) { int ret; ssize_t size; resource_size_t start = (resource_size_t)load_address; uimage_buf = (void *)load_address; uimage_size = 0; size = uimage_get_size(handle, image_no); if (size < 0) return NULL; uimage_resource = request_sdram_region("uimage", start, size); if (!uimage_resource) { printf("unable to request SDRAM 0x%08llx-0x%08llx\n", (unsigned long long)start, (unsigned long long)start + size - 1); return NULL; } ret = uimage_load(handle, image_no, uimage_sdram_flush); if (ret) { release_sdram_region(uimage_resource); return NULL; } return uimage_resource; }
struct resource *file_to_sdram(const char *filename, unsigned long adr) { struct resource *res; size_t size = BUFSIZ; size_t ofs = 0; int fd; fd = open(filename, O_RDONLY); if (fd < 0) return NULL; while (1) { size_t now; res = request_sdram_region("image", adr, size); if (!res) { printf("unable to request SDRAM 0x%08lx-0x%08lx\n", adr, adr + size - 1); goto out; } now = read_full(fd, (void *)(res->start + ofs), BUFSIZ); if (now < 0) { release_sdram_region(res); res = NULL; goto out; } if (now < BUFSIZ) { release_sdram_region(res); res = request_sdram_region("image", adr, ofs + now); goto out; } release_sdram_region(res); ofs += BUFSIZ; size += BUFSIZ; } out: close(fd); return res; }
static int uimage_sdram_flush(void *buf, unsigned int len) { if (uimage_size + len > resource_size(uimage_resource)) { resource_size_t start = uimage_resource->start; resource_size_t size = resource_size(uimage_resource) + len; release_sdram_region(uimage_resource); uimage_resource = request_sdram_region("uimage", start, size); if (!uimage_resource) { printf("unable to request SDRAM 0x%08x-0x%08x\n", start, start + size - 1); return -ENOMEM; } } memcpy(uimage_buf + uimage_size, buf, len); uimage_size += len; return len; }