1 // SPDX-License-Identifier: GPL-2.0+ OR BSD-3-Clause 2 /* 3 * Copyright (c) Thomas Gleixner <tglx (at) linutronix.de> 4 * 5 * The parts taken from the kernel implementation are: 6 * 7 * Copyright (c) International Business Machines Corp., 2006 8 */ 9 10 #include <common.h> 11 #include <errno.h> 12 #include <ubispl.h> 13 14 #include <linux/crc32.h> 15 16 #include "ubispl.h" 17 18 /** 19 * ubi_calc_fm_size - calculates the fastmap size in bytes for an UBI device. 20 * @ubi: UBI device description object 21 */ 22 static size_t ubi_calc_fm_size(struct ubi_scan_info *ubi) 23 { 24 size_t size; 25 26 size = sizeof(struct ubi_fm_sb) + 27 sizeof(struct ubi_fm_hdr) + 28 sizeof(struct ubi_fm_scan_pool) + 29 sizeof(struct ubi_fm_scan_pool) + 30 (ubi->peb_count * sizeof(struct ubi_fm_ec)) + 31 (sizeof(struct ubi_fm_eba) + 32 (ubi->peb_count * sizeof(__be32))) + 33 sizeof(struct ubi_fm_volhdr) * UBI_MAX_VOLUMES; 34 return roundup(size, ubi->leb_size); 35 } 36 37 static int ubi_io_read(struct ubi_scan_info *ubi, void *buf, int pnum, 38 unsigned long from, unsigned long len) 39 { 40 return ubi->read(pnum + ubi->peb_offset, from, len, buf); 41 } 42 43 static int ubi_io_is_bad(struct ubi_scan_info *ubi, int peb) 44 { 45 return peb >= ubi->peb_count || peb < 0; 46 } 47 48 static int ubi_io_read_vid_hdr(struct ubi_scan_info *ubi, int pnum, 49 struct ubi_vid_hdr *vh, int unused) 50 { 51 u32 magic; 52 int res; 53 54 /* No point in rescanning a corrupt block */ 55 if (test_bit(pnum, ubi->corrupt)) 56 return UBI_IO_BAD_HDR; 57 /* 58 * If the block has been scanned already, no need to rescan 59 */ 60 if (test_and_set_bit(pnum, ubi->scanned)) 61 return 0; 62 63 res = ubi_io_read(ubi, vh, pnum, ubi->vid_offset, sizeof(*vh)); 64 65 /* 66 * Bad block, unrecoverable ECC error, skip the block 67 */ 68 if (res) { 69 ubi_dbg("Skipping bad or unreadable block %d", pnum); 70 vh->magic = 0; 71 generic_set_bit(pnum, ubi->corrupt); 72 return res; 73 } 74 75 /* Magic number available ? */ 76 magic = be32_to_cpu(vh->magic); 77 if (magic != UBI_VID_HDR_MAGIC) { 78 generic_set_bit(pnum, ubi->corrupt); 79 if (magic == 0xffffffff) 80 return UBI_IO_FF; 81 ubi_msg("Bad magic in block 0%d %08x", pnum, magic); 82 return UBI_IO_BAD_HDR; 83 } 84 85 /* Header CRC correct ? */ 86 if (crc32(UBI_CRC32_INIT, vh, UBI_VID_HDR_SIZE_CRC) != 87 be32_to_cpu(vh->hdr_crc)) { 88 ubi_msg("Bad CRC in block 0%d", pnum); 89 generic_set_bit(pnum, ubi->corrupt); 90 return UBI_IO_BAD_HDR; 91 } 92 93 ubi_dbg("RV: pnum: %i sqnum %llu", pnum, be64_to_cpu(vh->sqnum)); 94 95 return 0; 96 } 97 98 static int ubi_rescan_fm_vid_hdr(struct ubi_scan_info *ubi, 99 struct ubi_vid_hdr *vh, 100 u32 fm_pnum, u32 fm_vol_id, u32 fm_lnum) 101 { 102 int res; 103 104 if (ubi_io_is_bad(ubi, fm_pnum)) 105 return -EINVAL; 106 107 res = ubi_io_read_vid_hdr(ubi, fm_pnum, vh, 0); 108 if (!res) { 109 /* Check volume id, volume type and lnum */ 110 if (be32_to_cpu(vh->vol_id) == fm_vol_id && 111 vh->vol_type == UBI_VID_STATIC && 112 be32_to_cpu(vh->lnum) == fm_lnum) 113 return 0; 114 ubi_dbg("RS: PEB %u vol: %u : %u typ %u lnum %u %u", 115 fm_pnum, fm_vol_id, vh->vol_type, 116 be32_to_cpu(vh->vol_id), 117 fm_lnum, be32_to_cpu(vh->lnum)); 118 } 119 return res; 120 } 121 122 /* Insert the logic block into the volume info */ 123 static int ubi_add_peb_to_vol(struct ubi_scan_info *ubi, 124 struct ubi_vid_hdr *vh, u32 vol_id, 125 u32 pnum, u32 lnum) 126 { 127 struct ubi_vol_info *vi = ubi->volinfo + vol_id; 128 u32 *ltp; 129 130 /* 131 * If the volume is larger than expected, yell and give up :( 132 */ 133 if (lnum >= UBI_MAX_VOL_LEBS) { 134 ubi_warn("Vol: %u LEB %d > %d", vol_id, lnum, UBI_MAX_VOL_LEBS); 135 return -EINVAL; 136 } 137 138 ubi_dbg("SC: Add PEB %u to Vol %u as LEB %u fnd %d sc %d", 139 pnum, vol_id, lnum, !!test_bit(lnum, vi->found), 140 !!test_bit(pnum, ubi->scanned)); 141 142 /* Points to the translation entry */ 143 ltp = vi->lebs_to_pebs + lnum; 144 145 /* If the block is already assigned, check sqnum */ 146 if (__test_and_set_bit(lnum, vi->found)) { 147 u32 cur_pnum = *ltp; 148 struct ubi_vid_hdr *cur = ubi->blockinfo + cur_pnum; 149 150 /* 151 * If the current block hase not yet been scanned, we 152 * need to do that. The other block might be stale or 153 * the current block corrupted and the FM not yet 154 * updated. 155 */ 156 if (!test_bit(cur_pnum, ubi->scanned)) { 157 /* 158 * If the scan fails, we use the valid block 159 */ 160 if (ubi_rescan_fm_vid_hdr(ubi, cur, cur_pnum, vol_id, 161 lnum)) { 162 *ltp = pnum; 163 return 0; 164 } 165 } 166 167 /* 168 * Should not happen .... 169 */ 170 if (test_bit(cur_pnum, ubi->corrupt)) { 171 *ltp = pnum; 172 return 0; 173 } 174 175 ubi_dbg("Vol %u LEB %u PEB %u->sqnum %llu NPEB %u->sqnum %llu", 176 vol_id, lnum, cur_pnum, be64_to_cpu(cur->sqnum), pnum, 177 be64_to_cpu(vh->sqnum)); 178 179 /* 180 * Compare sqnum and take the newer one 181 */ 182 if (be64_to_cpu(cur->sqnum) < be64_to_cpu(vh->sqnum)) 183 *ltp = pnum; 184 } else { 185 *ltp = pnum; 186 if (lnum > vi->last_block) 187 vi->last_block = lnum; 188 } 189 190 return 0; 191 } 192 193 static int ubi_scan_vid_hdr(struct ubi_scan_info *ubi, struct ubi_vid_hdr *vh, 194 u32 pnum) 195 { 196 u32 vol_id, lnum; 197 int res; 198 199 if (ubi_io_is_bad(ubi, pnum)) 200 return -EINVAL; 201 202 res = ubi_io_read_vid_hdr(ubi, pnum, vh, 0); 203 if (res) 204 return res; 205 206 /* Get volume id */ 207 vol_id = be32_to_cpu(vh->vol_id); 208 209 /* If this is the fastmap anchor, return right away */ 210 if (vol_id == UBI_FM_SB_VOLUME_ID) 211 return ubi->fm_enabled ? UBI_FASTMAP_ANCHOR : 0; 212 213 /* We only care about static volumes with an id < UBI_SPL_VOL_IDS */ 214 if (vol_id >= UBI_SPL_VOL_IDS || vh->vol_type != UBI_VID_STATIC) 215 return 0; 216 217 /* We are only interested in the volumes to load */ 218 if (!test_bit(vol_id, ubi->toload)) 219 return 0; 220 221 lnum = be32_to_cpu(vh->lnum); 222 return ubi_add_peb_to_vol(ubi, vh, vol_id, pnum, lnum); 223 } 224 225 static int assign_aeb_to_av(struct ubi_scan_info *ubi, u32 pnum, u32 lnum, 226 u32 vol_id, u32 vol_type, u32 used) 227 { 228 struct ubi_vid_hdr *vh; 229 230 if (ubi_io_is_bad(ubi, pnum)) 231 return -EINVAL; 232 233 ubi->fastmap_pebs++; 234 235 if (vol_id >= UBI_SPL_VOL_IDS || vol_type != UBI_STATIC_VOLUME) 236 return 0; 237 238 /* We are only interested in the volumes to load */ 239 if (!test_bit(vol_id, ubi->toload)) 240 return 0; 241 242 vh = ubi->blockinfo + pnum; 243 244 return ubi_scan_vid_hdr(ubi, vh, pnum); 245 } 246 247 static int scan_pool(struct ubi_scan_info *ubi, __be32 *pebs, int pool_size) 248 { 249 struct ubi_vid_hdr *vh; 250 u32 pnum; 251 int i; 252 253 ubi_dbg("Scanning pool size: %d", pool_size); 254 255 for (i = 0; i < pool_size; i++) { 256 pnum = be32_to_cpu(pebs[i]); 257 258 if (ubi_io_is_bad(ubi, pnum)) { 259 ubi_err("FM: Bad PEB in fastmap pool! %u", pnum); 260 return UBI_BAD_FASTMAP; 261 } 262 263 vh = ubi->blockinfo + pnum; 264 /* 265 * We allow the scan to fail here. The loader will notice 266 * and look for a replacement. 267 */ 268 ubi_scan_vid_hdr(ubi, vh, pnum); 269 } 270 return 0; 271 } 272 273 /* 274 * Fastmap code is stolen from Linux kernel and this stub structure is used 275 * to make it happy. 276 */ 277 struct ubi_attach_info { 278 int i; 279 }; 280 281 static int ubi_attach_fastmap(struct ubi_scan_info *ubi, 282 struct ubi_attach_info *ai, 283 struct ubi_fastmap_layout *fm) 284 { 285 struct ubi_fm_hdr *fmhdr; 286 struct ubi_fm_scan_pool *fmpl1, *fmpl2; 287 struct ubi_fm_ec *fmec; 288 struct ubi_fm_volhdr *fmvhdr; 289 struct ubi_fm_eba *fm_eba; 290 int ret, i, j, pool_size, wl_pool_size; 291 size_t fm_pos = 0, fm_size = ubi->fm_size; 292 void *fm_raw = ubi->fm_buf; 293 294 memset(ubi->fm_used, 0, sizeof(ubi->fm_used)); 295 296 fm_pos += sizeof(struct ubi_fm_sb); 297 if (fm_pos >= fm_size) 298 goto fail_bad; 299 300 fmhdr = (struct ubi_fm_hdr *)(fm_raw + fm_pos); 301 fm_pos += sizeof(*fmhdr); 302 if (fm_pos >= fm_size) 303 goto fail_bad; 304 305 if (be32_to_cpu(fmhdr->magic) != UBI_FM_HDR_MAGIC) { 306 ubi_err("bad fastmap header magic: 0x%x, expected: 0x%x", 307 be32_to_cpu(fmhdr->magic), UBI_FM_HDR_MAGIC); 308 goto fail_bad; 309 } 310 311 fmpl1 = (struct ubi_fm_scan_pool *)(fm_raw + fm_pos); 312 fm_pos += sizeof(*fmpl1); 313 if (fm_pos >= fm_size) 314 goto fail_bad; 315 if (be32_to_cpu(fmpl1->magic) != UBI_FM_POOL_MAGIC) { 316 ubi_err("bad fastmap pool magic: 0x%x, expected: 0x%x", 317 be32_to_cpu(fmpl1->magic), UBI_FM_POOL_MAGIC); 318 goto fail_bad; 319 } 320 321 fmpl2 = (struct ubi_fm_scan_pool *)(fm_raw + fm_pos); 322 fm_pos += sizeof(*fmpl2); 323 if (fm_pos >= fm_size) 324 goto fail_bad; 325 if (be32_to_cpu(fmpl2->magic) != UBI_FM_POOL_MAGIC) { 326 ubi_err("bad fastmap pool magic: 0x%x, expected: 0x%x", 327 be32_to_cpu(fmpl2->magic), UBI_FM_POOL_MAGIC); 328 goto fail_bad; 329 } 330 331 pool_size = be16_to_cpu(fmpl1->size); 332 wl_pool_size = be16_to_cpu(fmpl2->size); 333 fm->max_pool_size = be16_to_cpu(fmpl1->max_size); 334 fm->max_wl_pool_size = be16_to_cpu(fmpl2->max_size); 335 336 if (pool_size > UBI_FM_MAX_POOL_SIZE || pool_size < 0) { 337 ubi_err("bad pool size: %i", pool_size); 338 goto fail_bad; 339 } 340 341 if (wl_pool_size > UBI_FM_MAX_POOL_SIZE || wl_pool_size < 0) { 342 ubi_err("bad WL pool size: %i", wl_pool_size); 343 goto fail_bad; 344 } 345 346 if (fm->max_pool_size > UBI_FM_MAX_POOL_SIZE || 347 fm->max_pool_size < 0) { 348 ubi_err("bad maximal pool size: %i", fm->max_pool_size); 349 goto fail_bad; 350 } 351 352 if (fm->max_wl_pool_size > UBI_FM_MAX_POOL_SIZE || 353 fm->max_wl_pool_size < 0) { 354 ubi_err("bad maximal WL pool size: %i", fm->max_wl_pool_size); 355 goto fail_bad; 356 } 357 358 /* read EC values from free list */ 359 for (i = 0; i < be32_to_cpu(fmhdr->free_peb_count); i++) { 360 fmec = (struct ubi_fm_ec *)(fm_raw + fm_pos); 361 fm_pos += sizeof(*fmec); 362 if (fm_pos >= fm_size) 363 goto fail_bad; 364 } 365 366 /* read EC values from used list */ 367 for (i = 0; i < be32_to_cpu(fmhdr->used_peb_count); i++) { 368 fmec = (struct ubi_fm_ec *)(fm_raw + fm_pos); 369 fm_pos += sizeof(*fmec); 370 if (fm_pos >= fm_size) 371 goto fail_bad; 372 373 generic_set_bit(be32_to_cpu(fmec->pnum), ubi->fm_used); 374 } 375 376 /* read EC values from scrub list */ 377 for (i = 0; i < be32_to_cpu(fmhdr->scrub_peb_count); i++) { 378 fmec = (struct ubi_fm_ec *)(fm_raw + fm_pos); 379 fm_pos += sizeof(*fmec); 380 if (fm_pos >= fm_size) 381 goto fail_bad; 382 } 383 384 /* read EC values from erase list */ 385 for (i = 0; i < be32_to_cpu(fmhdr->erase_peb_count); i++) { 386 fmec = (struct ubi_fm_ec *)(fm_raw + fm_pos); 387 fm_pos += sizeof(*fmec); 388 if (fm_pos >= fm_size) 389 goto fail_bad; 390 } 391 392 /* Iterate over all volumes and read their EBA table */ 393 for (i = 0; i < be32_to_cpu(fmhdr->vol_count); i++) { 394 u32 vol_id, vol_type, used, reserved; 395 396 fmvhdr = (struct ubi_fm_volhdr *)(fm_raw + fm_pos); 397 fm_pos += sizeof(*fmvhdr); 398 if (fm_pos >= fm_size) 399 goto fail_bad; 400 401 if (be32_to_cpu(fmvhdr->magic) != UBI_FM_VHDR_MAGIC) { 402 ubi_err("bad fastmap vol header magic: 0x%x, " \ 403 "expected: 0x%x", 404 be32_to_cpu(fmvhdr->magic), UBI_FM_VHDR_MAGIC); 405 goto fail_bad; 406 } 407 408 vol_id = be32_to_cpu(fmvhdr->vol_id); 409 vol_type = fmvhdr->vol_type; 410 used = be32_to_cpu(fmvhdr->used_ebs); 411 412 fm_eba = (struct ubi_fm_eba *)(fm_raw + fm_pos); 413 fm_pos += sizeof(*fm_eba); 414 fm_pos += (sizeof(__be32) * be32_to_cpu(fm_eba->reserved_pebs)); 415 if (fm_pos >= fm_size) 416 goto fail_bad; 417 418 if (be32_to_cpu(fm_eba->magic) != UBI_FM_EBA_MAGIC) { 419 ubi_err("bad fastmap EBA header magic: 0x%x, " \ 420 "expected: 0x%x", 421 be32_to_cpu(fm_eba->magic), UBI_FM_EBA_MAGIC); 422 goto fail_bad; 423 } 424 425 reserved = be32_to_cpu(fm_eba->reserved_pebs); 426 ubi_dbg("FA: vol %u used %u res: %u", vol_id, used, reserved); 427 for (j = 0; j < reserved; j++) { 428 int pnum = be32_to_cpu(fm_eba->pnum[j]); 429 430 if ((int)be32_to_cpu(fm_eba->pnum[j]) < 0) 431 continue; 432 433 if (!__test_and_clear_bit(pnum, ubi->fm_used)) 434 continue; 435 436 /* 437 * We only handle static volumes so used_ebs 438 * needs to be handed in. And we do not assign 439 * the reserved blocks 440 */ 441 if (j >= used) 442 continue; 443 444 ret = assign_aeb_to_av(ubi, pnum, j, vol_id, 445 vol_type, used); 446 if (!ret) 447 continue; 448 449 /* 450 * Nasty: The fastmap claims that the volume 451 * has one block more than it, but that block 452 * is always empty and the other blocks have 453 * the correct number of total LEBs in the 454 * headers. Deal with it. 455 */ 456 if (ret != UBI_IO_FF && j != used - 1) 457 goto fail_bad; 458 ubi_dbg("FA: Vol: %u Ignoring empty LEB %d of %d", 459 vol_id, j, used); 460 } 461 } 462 463 ret = scan_pool(ubi, fmpl1->pebs, pool_size); 464 if (ret) 465 goto fail; 466 467 ret = scan_pool(ubi, fmpl2->pebs, wl_pool_size); 468 if (ret) 469 goto fail; 470 471 #ifdef CHECKME 472 /* 473 * If fastmap is leaking PEBs (must not happen), raise a 474 * fat warning and fall back to scanning mode. 475 * We do this here because in ubi_wl_init() it's too late 476 * and we cannot fall back to scanning. 477 */ 478 if (WARN_ON(count_fastmap_pebs(ai) != ubi->peb_count - 479 ai->bad_peb_count - fm->used_blocks)) 480 goto fail_bad; 481 #endif 482 483 return 0; 484 485 fail_bad: 486 ret = UBI_BAD_FASTMAP; 487 fail: 488 return ret; 489 } 490 491 static int ubi_scan_fastmap(struct ubi_scan_info *ubi, 492 struct ubi_attach_info *ai, 493 int fm_anchor) 494 { 495 struct ubi_fm_sb *fmsb, *fmsb2; 496 struct ubi_vid_hdr *vh; 497 struct ubi_fastmap_layout *fm; 498 int i, used_blocks, pnum, ret = 0; 499 size_t fm_size; 500 __be32 crc, tmp_crc; 501 unsigned long long sqnum = 0; 502 503 fmsb = &ubi->fm_sb; 504 fm = &ubi->fm_layout; 505 506 ret = ubi_io_read(ubi, fmsb, fm_anchor, ubi->leb_start, sizeof(*fmsb)); 507 if (ret && ret != UBI_IO_BITFLIPS) 508 goto free_fm_sb; 509 else if (ret == UBI_IO_BITFLIPS) 510 fm->to_be_tortured[0] = 1; 511 512 if (be32_to_cpu(fmsb->magic) != UBI_FM_SB_MAGIC) { 513 ubi_err("bad super block magic: 0x%x, expected: 0x%x", 514 be32_to_cpu(fmsb->magic), UBI_FM_SB_MAGIC); 515 ret = UBI_BAD_FASTMAP; 516 goto free_fm_sb; 517 } 518 519 if (fmsb->version != UBI_FM_FMT_VERSION) { 520 ubi_err("bad fastmap version: %i, expected: %i", 521 fmsb->version, UBI_FM_FMT_VERSION); 522 ret = UBI_BAD_FASTMAP; 523 goto free_fm_sb; 524 } 525 526 used_blocks = be32_to_cpu(fmsb->used_blocks); 527 if (used_blocks > UBI_FM_MAX_BLOCKS || used_blocks < 1) { 528 ubi_err("number of fastmap blocks is invalid: %i", used_blocks); 529 ret = UBI_BAD_FASTMAP; 530 goto free_fm_sb; 531 } 532 533 fm_size = ubi->leb_size * used_blocks; 534 if (fm_size != ubi->fm_size) { 535 ubi_err("bad fastmap size: %zi, expected: %zi", fm_size, 536 ubi->fm_size); 537 ret = UBI_BAD_FASTMAP; 538 goto free_fm_sb; 539 } 540 541 vh = &ubi->fm_vh; 542 543 for (i = 0; i < used_blocks; i++) { 544 pnum = be32_to_cpu(fmsb->block_loc[i]); 545 546 if (ubi_io_is_bad(ubi, pnum)) { 547 ret = UBI_BAD_FASTMAP; 548 goto free_hdr; 549 } 550 551 #ifdef LATER 552 int image_seq; 553 ret = ubi_io_read_ec_hdr(ubi, pnum, ech, 0); 554 if (ret && ret != UBI_IO_BITFLIPS) { 555 ubi_err("unable to read fastmap block# %i EC (PEB: %i)", 556 i, pnum); 557 if (ret > 0) 558 ret = UBI_BAD_FASTMAP; 559 goto free_hdr; 560 } else if (ret == UBI_IO_BITFLIPS) 561 fm->to_be_tortured[i] = 1; 562 563 image_seq = be32_to_cpu(ech->image_seq); 564 if (!ubi->image_seq) 565 ubi->image_seq = image_seq; 566 /* 567 * Older UBI implementations have image_seq set to zero, so 568 * we shouldn't fail if image_seq == 0. 569 */ 570 if (image_seq && (image_seq != ubi->image_seq)) { 571 ubi_err("wrong image seq:%d instead of %d", 572 be32_to_cpu(ech->image_seq), ubi->image_seq); 573 ret = UBI_BAD_FASTMAP; 574 goto free_hdr; 575 } 576 #endif 577 ret = ubi_io_read_vid_hdr(ubi, pnum, vh, 0); 578 if (ret && ret != UBI_IO_BITFLIPS) { 579 ubi_err("unable to read fastmap block# %i (PEB: %i)", 580 i, pnum); 581 goto free_hdr; 582 } 583 584 /* 585 * Mainline code rescans the anchor header. We've done 586 * that already so we merily copy it over. 587 */ 588 if (pnum == fm_anchor) 589 memcpy(vh, ubi->blockinfo + pnum, sizeof(*fm)); 590 591 if (i == 0) { 592 if (be32_to_cpu(vh->vol_id) != UBI_FM_SB_VOLUME_ID) { 593 ubi_err("bad fastmap anchor vol_id: 0x%x," \ 594 " expected: 0x%x", 595 be32_to_cpu(vh->vol_id), 596 UBI_FM_SB_VOLUME_ID); 597 ret = UBI_BAD_FASTMAP; 598 goto free_hdr; 599 } 600 } else { 601 if (be32_to_cpu(vh->vol_id) != UBI_FM_DATA_VOLUME_ID) { 602 ubi_err("bad fastmap data vol_id: 0x%x," \ 603 " expected: 0x%x", 604 be32_to_cpu(vh->vol_id), 605 UBI_FM_DATA_VOLUME_ID); 606 ret = UBI_BAD_FASTMAP; 607 goto free_hdr; 608 } 609 } 610 611 if (sqnum < be64_to_cpu(vh->sqnum)) 612 sqnum = be64_to_cpu(vh->sqnum); 613 614 ret = ubi_io_read(ubi, ubi->fm_buf + (ubi->leb_size * i), pnum, 615 ubi->leb_start, ubi->leb_size); 616 if (ret && ret != UBI_IO_BITFLIPS) { 617 ubi_err("unable to read fastmap block# %i (PEB: %i, " \ 618 "err: %i)", i, pnum, ret); 619 goto free_hdr; 620 } 621 } 622 623 fmsb2 = (struct ubi_fm_sb *)(ubi->fm_buf); 624 tmp_crc = be32_to_cpu(fmsb2->data_crc); 625 fmsb2->data_crc = 0; 626 crc = crc32(UBI_CRC32_INIT, ubi->fm_buf, fm_size); 627 if (crc != tmp_crc) { 628 ubi_err("fastmap data CRC is invalid"); 629 ubi_err("CRC should be: 0x%x, calc: 0x%x", tmp_crc, crc); 630 ret = UBI_BAD_FASTMAP; 631 goto free_hdr; 632 } 633 634 fmsb2->sqnum = sqnum; 635 636 fm->used_blocks = used_blocks; 637 638 ret = ubi_attach_fastmap(ubi, ai, fm); 639 if (ret) { 640 if (ret > 0) 641 ret = UBI_BAD_FASTMAP; 642 goto free_hdr; 643 } 644 645 ubi->fm = fm; 646 ubi->fm_pool.max_size = ubi->fm->max_pool_size; 647 ubi->fm_wl_pool.max_size = ubi->fm->max_wl_pool_size; 648 ubi_msg("attached by fastmap %uMB %u blocks", 649 ubi->fsize_mb, ubi->peb_count); 650 ubi_dbg("fastmap pool size: %d", ubi->fm_pool.max_size); 651 ubi_dbg("fastmap WL pool size: %d", ubi->fm_wl_pool.max_size); 652 653 out: 654 if (ret) 655 ubi_err("Attach by fastmap failed, doing a full scan!"); 656 return ret; 657 658 free_hdr: 659 free_fm_sb: 660 goto out; 661 } 662 663 /* 664 * Scan the flash and attempt to attach via fastmap 665 */ 666 static void ipl_scan(struct ubi_scan_info *ubi) 667 { 668 unsigned int pnum; 669 int res; 670 671 /* 672 * Scan first for the fastmap super block 673 */ 674 for (pnum = 0; pnum < UBI_FM_MAX_START; pnum++) { 675 res = ubi_scan_vid_hdr(ubi, ubi->blockinfo + pnum, pnum); 676 /* 677 * We ignore errors here as we are meriliy scanning 678 * the headers. 679 */ 680 if (res != UBI_FASTMAP_ANCHOR) 681 continue; 682 683 /* 684 * If fastmap is disabled, continue scanning. This 685 * might happen because the previous attempt failed or 686 * the caller disabled it right away. 687 */ 688 if (!ubi->fm_enabled) 689 continue; 690 691 /* 692 * Try to attach the fastmap, if that fails continue 693 * scanning. 694 */ 695 if (!ubi_scan_fastmap(ubi, NULL, pnum)) 696 return; 697 /* 698 * Fastmap failed. Clear everything we have and start 699 * over. We are paranoid and do not trust anything. 700 */ 701 memset(ubi->volinfo, 0, sizeof(ubi->volinfo)); 702 pnum = 0; 703 break; 704 } 705 706 /* 707 * Continue scanning, ignore errors, we might find what we are 708 * looking for, 709 */ 710 for (; pnum < ubi->peb_count; pnum++) 711 ubi_scan_vid_hdr(ubi, ubi->blockinfo + pnum, pnum); 712 } 713 714 /* 715 * Load a logical block of a volume into memory 716 */ 717 static int ubi_load_block(struct ubi_scan_info *ubi, uint8_t *laddr, 718 struct ubi_vol_info *vi, u32 vol_id, u32 lnum, 719 u32 last) 720 { 721 struct ubi_vid_hdr *vh, *vrepl; 722 u32 pnum, crc, dlen; 723 724 retry: 725 /* 726 * If this is a fastmap run, we try to rescan full, otherwise 727 * we simply give up. 728 */ 729 if (!test_bit(lnum, vi->found)) { 730 ubi_warn("LEB %d of %d is missing", lnum, last); 731 return -EINVAL; 732 } 733 734 pnum = vi->lebs_to_pebs[lnum]; 735 736 ubi_dbg("Load vol %u LEB %u PEB %u", vol_id, lnum, pnum); 737 738 if (ubi_io_is_bad(ubi, pnum)) { 739 ubi_warn("Corrupted mapping block %d PB %d\n", lnum, pnum); 740 return -EINVAL; 741 } 742 743 if (test_bit(pnum, ubi->corrupt)) 744 goto find_other; 745 746 /* 747 * Lets try to read that block 748 */ 749 vh = ubi->blockinfo + pnum; 750 751 if (!test_bit(pnum, ubi->scanned)) { 752 ubi_warn("Vol: %u LEB %u PEB %u not yet scanned", vol_id, 753 lnum, pnum); 754 if (ubi_rescan_fm_vid_hdr(ubi, vh, pnum, vol_id, lnum)) 755 goto find_other; 756 } 757 758 /* 759 * Check, if the total number of blocks is correct 760 */ 761 if (be32_to_cpu(vh->used_ebs) != last) { 762 ubi_dbg("Block count missmatch."); 763 ubi_dbg("vh->used_ebs: %d nrblocks: %d", 764 be32_to_cpu(vh->used_ebs), last); 765 generic_set_bit(pnum, ubi->corrupt); 766 goto find_other; 767 } 768 769 /* 770 * Get the data length of this block. 771 */ 772 dlen = be32_to_cpu(vh->data_size); 773 774 /* 775 * Read the data into RAM. We ignore the return value 776 * here as the only thing which might go wrong are 777 * bitflips. Try nevertheless. 778 */ 779 ubi_io_read(ubi, laddr, pnum, ubi->leb_start, dlen); 780 781 /* Calculate CRC over the data */ 782 crc = crc32(UBI_CRC32_INIT, laddr, dlen); 783 784 if (crc != be32_to_cpu(vh->data_crc)) { 785 ubi_warn("Vol: %u LEB %u PEB %u data CRC failure", vol_id, 786 lnum, pnum); 787 generic_set_bit(pnum, ubi->corrupt); 788 goto find_other; 789 } 790 791 /* We are good. Return the data length we read */ 792 return dlen; 793 794 find_other: 795 ubi_dbg("Find replacement for LEB %u PEB %u", lnum, pnum); 796 generic_clear_bit(lnum, vi->found); 797 vrepl = NULL; 798 799 for (pnum = 0; pnum < ubi->peb_count; pnum++) { 800 struct ubi_vid_hdr *tmp = ubi->blockinfo + pnum; 801 u32 t_vol_id = be32_to_cpu(tmp->vol_id); 802 u32 t_lnum = be32_to_cpu(tmp->lnum); 803 804 if (test_bit(pnum, ubi->corrupt)) 805 continue; 806 807 if (t_vol_id != vol_id || t_lnum != lnum) 808 continue; 809 810 if (!test_bit(pnum, ubi->scanned)) { 811 ubi_warn("Vol: %u LEB %u PEB %u not yet scanned", 812 vol_id, lnum, pnum); 813 if (ubi_rescan_fm_vid_hdr(ubi, tmp, pnum, vol_id, lnum)) 814 continue; 815 } 816 817 /* 818 * We found one. If its the first, assign it otherwise 819 * compare the sqnum 820 */ 821 generic_set_bit(lnum, vi->found); 822 823 if (!vrepl) { 824 vrepl = tmp; 825 continue; 826 } 827 828 if (be64_to_cpu(vrepl->sqnum) < be64_to_cpu(tmp->sqnum)) 829 vrepl = tmp; 830 } 831 832 if (vrepl) { 833 /* Update the vi table */ 834 pnum = vrepl - ubi->blockinfo; 835 vi->lebs_to_pebs[lnum] = pnum; 836 ubi_dbg("Trying PEB %u for LEB %u", pnum, lnum); 837 vh = vrepl; 838 } 839 goto retry; 840 } 841 842 /* 843 * Load a volume into RAM 844 */ 845 static int ipl_load(struct ubi_scan_info *ubi, const u32 vol_id, uint8_t *laddr) 846 { 847 struct ubi_vol_info *vi; 848 u32 lnum, last, len; 849 850 if (vol_id >= UBI_SPL_VOL_IDS) 851 return -EINVAL; 852 853 len = 0; 854 vi = ubi->volinfo + vol_id; 855 last = vi->last_block + 1; 856 857 /* Read the blocks to RAM, check CRC */ 858 for (lnum = 0 ; lnum < last; lnum++) { 859 int res = ubi_load_block(ubi, laddr, vi, vol_id, lnum, last); 860 861 if (res < 0) { 862 ubi_warn("Failed to load volume %u", vol_id); 863 return res; 864 } 865 /* res is the data length of the read block */ 866 laddr += res; 867 len += res; 868 } 869 return len; 870 } 871 872 int ubispl_load_volumes(struct ubispl_info *info, struct ubispl_load *lvols, 873 int nrvols) 874 { 875 struct ubi_scan_info *ubi = info->ubi; 876 int res, i, fastmap = info->fastmap; 877 u32 fsize; 878 879 retry: 880 /* 881 * We do a partial initializiation of @ubi. Cleaning fm_buf is 882 * not necessary. 883 */ 884 memset(ubi, 0, offsetof(struct ubi_scan_info, fm_buf)); 885 886 ubi->read = info->read; 887 888 /* Precalculate the offsets */ 889 ubi->vid_offset = info->vid_offset; 890 ubi->leb_start = info->leb_start; 891 ubi->leb_size = info->peb_size - ubi->leb_start; 892 ubi->peb_count = info->peb_count; 893 ubi->peb_offset = info->peb_offset; 894 895 fsize = info->peb_size * info->peb_count; 896 ubi->fsize_mb = fsize >> 20; 897 898 /* Fastmap init */ 899 ubi->fm_size = ubi_calc_fm_size(ubi); 900 ubi->fm_enabled = fastmap; 901 902 for (i = 0; i < nrvols; i++) { 903 struct ubispl_load *lv = lvols + i; 904 905 generic_set_bit(lv->vol_id, ubi->toload); 906 } 907 908 ipl_scan(ubi); 909 910 for (i = 0; i < nrvols; i++) { 911 struct ubispl_load *lv = lvols + i; 912 913 ubi_msg("Loading VolId #%d", lv->vol_id); 914 res = ipl_load(ubi, lv->vol_id, lv->load_addr); 915 if (res < 0) { 916 if (fastmap) { 917 fastmap = 0; 918 goto retry; 919 } 920 ubi_warn("Failed"); 921 return res; 922 } 923 } 924 return 0; 925 } 926