Lines Matching +full:directory +full:- +full:based
1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * Parse RedBoot-style Flash Image System (FIS) tables and
7 * Copyright © 2001-2010 David Woodhouse <dwmw2@infradead.org>
26 unsigned char _pad[256-(16+7*sizeof(uint32_t))];
36 static int directory = CONFIG_MTD_REDBOOT_DIRECTORY_BLOCK; variable
37 module_param(directory, int, 0);
55 ret = of_property_read_u32(np, "fis-index-block", &dirblock); in parse_redboot_of()
61 * directory block pointer. in parse_redboot_of()
63 directory = dirblock; in parse_redboot_of()
88 if ( directory < 0 ) { in parse_redboot_partitions()
89 offset = master->size + directory * master->erasesize; in parse_redboot_partitions()
93 printk(KERN_NOTICE "Failed to find a non-bad block to check for RedBoot partition table\n"); in parse_redboot_partitions()
94 return -EIO; in parse_redboot_partitions()
96 offset -= master->erasesize; in parse_redboot_partitions()
99 offset = directory * master->erasesize; in parse_redboot_partitions()
101 offset += master->erasesize; in parse_redboot_partitions()
102 if (offset == master->size) in parse_redboot_partitions()
106 buf = vmalloc(master->erasesize); in parse_redboot_partitions()
109 return -ENOMEM; in parse_redboot_partitions()
112 master->name, offset); in parse_redboot_partitions()
114 ret = mtd_read(master, offset, master->erasesize, &retlen, in parse_redboot_partitions()
120 if (retlen != master->erasesize) { in parse_redboot_partitions()
121 ret = -EIO; in parse_redboot_partitions()
125 numslots = (master->erasesize / sizeof(struct fis_image_desc)); in parse_redboot_partitions()
127 if (!memcmp(buf[i].name, "FIS directory", 14)) { in parse_redboot_partitions()
128 /* This is apparently the FIS directory entry for the in parse_redboot_partitions()
129 * FIS directory itself. The FIS directory size is in parse_redboot_partitions()
132 * a byte swapped FIS directory - swap all the entries! in parse_redboot_partitions()
137 /* RedBoot can combine the FIS directory and in parse_redboot_partitions()
139 we assume wrong-endian if either the swapped in parse_redboot_partitions()
143 if (swab32(buf[i].size) == master->erasesize || in parse_redboot_partitions()
144 (buf[i].size > master->erasesize in parse_redboot_partitions()
145 && swab32(buf[i].size) < master->erasesize)) { in parse_redboot_partitions()
147 /* Update numslots based on actual FIS directory size */ in parse_redboot_partitions()
173 } else if (buf[i].size < master->erasesize) { in parse_redboot_partitions()
174 /* Update numslots based on actual FIS directory size */ in parse_redboot_partitions()
183 master->name); in parse_redboot_partitions()
204 ret = -ENOMEM; in parse_redboot_partitions()
207 new_fl->img = &buf[i]; in parse_redboot_partitions()
208 if (data && data->origin) in parse_redboot_partitions()
209 buf[i].flash_base -= data->origin; in parse_redboot_partitions()
211 buf[i].flash_base &= master->size-1; in parse_redboot_partitions()
217 while(*prev && (*prev)->img->flash_base < new_fl->img->flash_base) in parse_redboot_partitions()
218 prev = &(*prev)->next; in parse_redboot_partitions()
219 new_fl->next = *prev; in parse_redboot_partitions()
225 if (fl->img->flash_base) { in parse_redboot_partitions()
230 for (tmp_fl = fl; tmp_fl->next; tmp_fl = tmp_fl->next) { in parse_redboot_partitions()
231 …if (tmp_fl->img->flash_base + tmp_fl->img->size + master->erasesize <= tmp_fl->next->img->flash_ba… in parse_redboot_partitions()
240 ret = -ENOMEM; in parse_redboot_partitions()
255 if (fl->img->flash_base) { in parse_redboot_partitions()
257 parts[0].size = fl->img->flash_base; in parse_redboot_partitions()
263 parts[i].size = fl->img->size; in parse_redboot_partitions()
264 parts[i].offset = fl->img->flash_base; in parse_redboot_partitions()
267 strcpy(names, fl->img->name); in parse_redboot_partitions()
271 !memcmp(names, "FIS directory", 14)) { in parse_redboot_partitions()
278 …if(fl->next && fl->img->flash_base + fl->img->size + master->erasesize <= fl->next->img->flash_bas… in parse_redboot_partitions()
280 parts[i].offset = parts[i-1].size + parts[i-1].offset; in parse_redboot_partitions()
281 parts[i].size = fl->next->img->flash_base - parts[i].offset; in parse_redboot_partitions()
286 fl = fl->next; in parse_redboot_partitions()
294 fl = fl->next; in parse_redboot_partitions()
302 { .compatible = "redboot-fis" },