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(u32))];
36 static int directory = CONFIG_MTD_REDBOOT_DIRECTORY_BLOCK; variable
37 module_param(directory, int, 0);
60 ret = of_property_read_u32(npart, "fis-index-block", &dirblock); in parse_redboot_of()
66 * directory block pointer. in parse_redboot_of()
68 directory = dirblock; in parse_redboot_of()
93 if (directory < 0) { in parse_redboot_partitions()
94 offset = master->size + directory * master->erasesize; in parse_redboot_partitions()
98 pr_notice("Failed to find a non-bad block to check for RedBoot partition table\n"); in parse_redboot_partitions()
99 return -EIO; in parse_redboot_partitions()
101 offset -= master->erasesize; in parse_redboot_partitions()
104 offset = directory * master->erasesize; in parse_redboot_partitions()
106 offset += master->erasesize; in parse_redboot_partitions()
107 if (offset == master->size) in parse_redboot_partitions()
111 buf = vmalloc(master->erasesize); in parse_redboot_partitions()
114 return -ENOMEM; in parse_redboot_partitions()
117 master->name, offset); in parse_redboot_partitions()
119 ret = mtd_read(master, offset, master->erasesize, &retlen, in parse_redboot_partitions()
125 if (retlen != master->erasesize) { in parse_redboot_partitions()
126 ret = -EIO; in parse_redboot_partitions()
130 numslots = (master->erasesize / sizeof(struct fis_image_desc)); in parse_redboot_partitions()
132 if (!memcmp(buf[i].name, "FIS directory", 14)) { in parse_redboot_partitions()
133 /* This is apparently the FIS directory entry for the in parse_redboot_partitions()
134 * FIS directory itself. The FIS directory size is in parse_redboot_partitions()
137 * a byte swapped FIS directory - swap all the entries! in parse_redboot_partitions()
142 /* RedBoot can combine the FIS directory and in parse_redboot_partitions()
144 we assume wrong-endian if either the swapped in parse_redboot_partitions()
148 if (swab32(buf[i].size) == master->erasesize || in parse_redboot_partitions()
149 (buf[i].size > master->erasesize in parse_redboot_partitions()
150 && swab32(buf[i].size) < master->erasesize)) { in parse_redboot_partitions()
152 /* Update numslots based on actual FIS directory size */ in parse_redboot_partitions()
177 } else if (buf[i].size < master->erasesize) { in parse_redboot_partitions()
178 /* Update numslots based on actual FIS directory size */ in parse_redboot_partitions()
187 master->name); in parse_redboot_partitions()
208 ret = -ENOMEM; in parse_redboot_partitions()
211 new_fl->img = &buf[i]; in parse_redboot_partitions()
212 if (data && data->origin) in parse_redboot_partitions()
213 buf[i].flash_base -= data->origin; in parse_redboot_partitions()
215 buf[i].flash_base &= master->size - 1; in parse_redboot_partitions()
221 while (*prev && (*prev)->img->flash_base < new_fl->img->flash_base) in parse_redboot_partitions()
222 prev = &(*prev)->next; in parse_redboot_partitions()
223 new_fl->next = *prev; in parse_redboot_partitions()
229 if (fl->img->flash_base) { in parse_redboot_partitions()
234 for (tmp_fl = fl; tmp_fl->next; tmp_fl = tmp_fl->next) { in parse_redboot_partitions()
235 …if (tmp_fl->img->flash_base + tmp_fl->img->size + master->erasesize <= tmp_fl->next->img->flash_ba… in parse_redboot_partitions()
244 ret = -ENOMEM; in parse_redboot_partitions()
258 if (fl->img->flash_base) { in parse_redboot_partitions()
260 parts[0].size = fl->img->flash_base; in parse_redboot_partitions()
266 parts[i].size = fl->img->size; in parse_redboot_partitions()
267 parts[i].offset = fl->img->flash_base; in parse_redboot_partitions()
270 strcpy(names, fl->img->name); in parse_redboot_partitions()
274 !memcmp(names, "FIS directory", 14)) { in parse_redboot_partitions()
281 …if (fl->next && fl->img->flash_base + fl->img->size + master->erasesize <= fl->next->img->flash_ba… in parse_redboot_partitions()
283 parts[i].offset = parts[i - 1].size + parts[i - 1].offset; in parse_redboot_partitions()
284 parts[i].size = fl->next->img->flash_base - parts[i].offset; in parse_redboot_partitions()
289 fl = fl->next; in parse_redboot_partitions()
298 fl = fl->next; in parse_redboot_partitions()
306 { .compatible = "redboot-fis" },