• Home
  • Raw
  • Download

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);
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 printk(KERN_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()
178 } else if (buf[i].size < master->erasesize) { in parse_redboot_partitions()
179 /* Update numslots based on actual FIS directory size */ in parse_redboot_partitions()
188 master->name); in parse_redboot_partitions()
209 ret = -ENOMEM; in parse_redboot_partitions()
212 new_fl->img = &buf[i]; in parse_redboot_partitions()
213 if (data && data->origin) in parse_redboot_partitions()
214 buf[i].flash_base -= data->origin; in parse_redboot_partitions()
216 buf[i].flash_base &= master->size-1; in parse_redboot_partitions()
222 while(*prev && (*prev)->img->flash_base < new_fl->img->flash_base) in parse_redboot_partitions()
223 prev = &(*prev)->next; in parse_redboot_partitions()
224 new_fl->next = *prev; in parse_redboot_partitions()
230 if (fl->img->flash_base) { in parse_redboot_partitions()
235 for (tmp_fl = fl; tmp_fl->next; tmp_fl = tmp_fl->next) { in parse_redboot_partitions()
236 …if (tmp_fl->img->flash_base + tmp_fl->img->size + master->erasesize <= tmp_fl->next->img->flash_ba… in parse_redboot_partitions()
245 ret = -ENOMEM; in parse_redboot_partitions()
260 if (fl->img->flash_base) { in parse_redboot_partitions()
262 parts[0].size = fl->img->flash_base; in parse_redboot_partitions()
268 parts[i].size = fl->img->size; in parse_redboot_partitions()
269 parts[i].offset = fl->img->flash_base; in parse_redboot_partitions()
272 strcpy(names, fl->img->name); in parse_redboot_partitions()
276 !memcmp(names, "FIS directory", 14)) { in parse_redboot_partitions()
283 …if(fl->next && fl->img->flash_base + fl->img->size + master->erasesize <= fl->next->img->flash_bas… in parse_redboot_partitions()
285 parts[i].offset = parts[i-1].size + parts[i-1].offset; in parse_redboot_partitions()
286 parts[i].size = fl->next->img->flash_base - parts[i].offset; in parse_redboot_partitions()
291 fl = fl->next; in parse_redboot_partitions()
299 fl = fl->next; in parse_redboot_partitions()
307 { .compatible = "redboot-fis" },