1 /* 2 * Unsorted Block Image commands 3 * 4 * Copyright (C) 2008 Samsung Electronics 5 * Kyungmin Park <kyungmin.park@samsung.com> 6 * 7 * Copyright 2008-2009 Stefan Roese <sr@denx.de>, DENX Software Engineering 8 * 9 * This program is free software; you can redistribute it and/or modify 10 * it under the terms of the GNU General Public License version 2 as 11 * published by the Free Software Foundation. 12 */ 13 14 #include <common.h> 15 #include <command.h> 16 #include <exports.h> 17 #include <memalign.h> 18 #include <nand.h> 19 #include <onenand_uboot.h> 20 #include <linux/mtd/mtd.h> 21 #include <linux/mtd/partitions.h> 22 #include <linux/err.h> 23 #include <ubi_uboot.h> 24 #include <asm/errno.h> 25 #include <jffs2/load_kernel.h> 26 27 #undef ubi_msg 28 #define ubi_msg(fmt, ...) printf("UBI: " fmt "\n", ##__VA_ARGS__) 29 30 #define DEV_TYPE_NONE 0 31 #define DEV_TYPE_NAND 1 32 #define DEV_TYPE_ONENAND 2 33 #define DEV_TYPE_NOR 3 34 35 /* Private own data */ 36 static struct ubi_device *ubi; 37 static char buffer[80]; 38 static int ubi_initialized; 39 40 struct selected_dev { 41 char part_name[80]; 42 int selected; 43 int nr; 44 struct mtd_info *mtd_info; 45 }; 46 47 static struct selected_dev ubi_dev; 48 49 #ifdef CONFIG_CMD_UBIFS 50 int ubifs_is_mounted(void); 51 void cmd_ubifs_umount(void); 52 #endif 53 54 static void display_volume_info(struct ubi_device *ubi) 55 { 56 int i; 57 58 for (i = 0; i < (ubi->vtbl_slots + 1); i++) { 59 if (!ubi->volumes[i]) 60 continue; /* Empty record */ 61 ubi_dump_vol_info(ubi->volumes[i]); 62 } 63 } 64 65 static void display_ubi_info(struct ubi_device *ubi) 66 { 67 ubi_msg("MTD device name: \"%s\"", ubi->mtd->name); 68 ubi_msg("MTD device size: %llu MiB", ubi->flash_size >> 20); 69 ubi_msg("physical eraseblock size: %d bytes (%d KiB)", 70 ubi->peb_size, ubi->peb_size >> 10); 71 ubi_msg("logical eraseblock size: %d bytes", ubi->leb_size); 72 ubi_msg("number of good PEBs: %d", ubi->good_peb_count); 73 ubi_msg("number of bad PEBs: %d", ubi->bad_peb_count); 74 ubi_msg("smallest flash I/O unit: %d", ubi->min_io_size); 75 ubi_msg("VID header offset: %d (aligned %d)", 76 ubi->vid_hdr_offset, ubi->vid_hdr_aloffset); 77 ubi_msg("data offset: %d", ubi->leb_start); 78 ubi_msg("max. allowed volumes: %d", ubi->vtbl_slots); 79 ubi_msg("wear-leveling threshold: %d", CONFIG_MTD_UBI_WL_THRESHOLD); 80 ubi_msg("number of internal volumes: %d", UBI_INT_VOL_COUNT); 81 ubi_msg("number of user volumes: %d", 82 ubi->vol_count - UBI_INT_VOL_COUNT); 83 ubi_msg("available PEBs: %d", ubi->avail_pebs); 84 ubi_msg("total number of reserved PEBs: %d", ubi->rsvd_pebs); 85 ubi_msg("number of PEBs reserved for bad PEB handling: %d", 86 ubi->beb_rsvd_pebs); 87 ubi_msg("max/mean erase counter: %d/%d", ubi->max_ec, ubi->mean_ec); 88 } 89 90 static int ubi_info(int layout) 91 { 92 if (layout) 93 display_volume_info(ubi); 94 else 95 display_ubi_info(ubi); 96 97 return 0; 98 } 99 100 static int ubi_check_volumename(const struct ubi_volume *vol, char *name) 101 { 102 return strcmp(vol->name, name); 103 } 104 105 static int ubi_check(char *name) 106 { 107 int i; 108 109 for (i = 0; i < (ubi->vtbl_slots + 1); i++) { 110 if (!ubi->volumes[i]) 111 continue; /* Empty record */ 112 113 if (!ubi_check_volumename(ubi->volumes[i], name)) 114 return 0; 115 } 116 117 return 1; 118 } 119 120 121 static int verify_mkvol_req(const struct ubi_device *ubi, 122 const struct ubi_mkvol_req *req) 123 { 124 int n, err = EINVAL; 125 126 if (req->bytes < 0 || req->alignment < 0 || req->vol_type < 0 || 127 req->name_len < 0) 128 goto bad; 129 130 if ((req->vol_id < 0 || req->vol_id >= ubi->vtbl_slots) && 131 req->vol_id != UBI_VOL_NUM_AUTO) 132 goto bad; 133 134 if (req->alignment == 0) 135 goto bad; 136 137 if (req->bytes == 0) { 138 printf("No space left in UBI device!\n"); 139 err = ENOMEM; 140 goto bad; 141 } 142 143 if (req->vol_type != UBI_DYNAMIC_VOLUME && 144 req->vol_type != UBI_STATIC_VOLUME) 145 goto bad; 146 147 if (req->alignment > ubi->leb_size) 148 goto bad; 149 150 n = req->alignment % ubi->min_io_size; 151 if (req->alignment != 1 && n) 152 goto bad; 153 154 if (req->name_len > UBI_VOL_NAME_MAX) { 155 printf("Name too long!\n"); 156 err = ENAMETOOLONG; 157 goto bad; 158 } 159 160 return 0; 161 bad: 162 return err; 163 } 164 165 static int ubi_create_vol(char *volume, int64_t size, int dynamic) 166 { 167 struct ubi_mkvol_req req; 168 int err; 169 170 if (dynamic) 171 req.vol_type = UBI_DYNAMIC_VOLUME; 172 else 173 req.vol_type = UBI_STATIC_VOLUME; 174 175 req.vol_id = UBI_VOL_NUM_AUTO; 176 req.alignment = 1; 177 req.bytes = size; 178 179 strcpy(req.name, volume); 180 req.name_len = strlen(volume); 181 req.name[req.name_len] = '\0'; 182 req.padding1 = 0; 183 /* It's duplicated at drivers/mtd/ubi/cdev.c */ 184 err = verify_mkvol_req(ubi, &req); 185 if (err) { 186 printf("verify_mkvol_req failed %d\n", err); 187 return err; 188 } 189 printf("Creating %s volume %s of size %lld\n", 190 dynamic ? "dynamic" : "static", volume, size); 191 /* Call real ubi create volume */ 192 return ubi_create_volume(ubi, &req); 193 } 194 195 static struct ubi_volume *ubi_find_volume(char *volume) 196 { 197 struct ubi_volume *vol = NULL; 198 int i; 199 200 for (i = 0; i < ubi->vtbl_slots; i++) { 201 vol = ubi->volumes[i]; 202 if (vol && !strcmp(vol->name, volume)) 203 return vol; 204 } 205 206 printf("Volume %s not found!\n", volume); 207 return NULL; 208 } 209 210 static int ubi_remove_vol(char *volume) 211 { 212 int err, reserved_pebs, i; 213 struct ubi_volume *vol; 214 215 vol = ubi_find_volume(volume); 216 if (vol == NULL) 217 return ENODEV; 218 219 printf("Remove UBI volume %s (id %d)\n", vol->name, vol->vol_id); 220 221 if (ubi->ro_mode) { 222 printf("It's read-only mode\n"); 223 err = EROFS; 224 goto out_err; 225 } 226 227 err = ubi_change_vtbl_record(ubi, vol->vol_id, NULL); 228 if (err) { 229 printf("Error changing Vol tabel record err=%x\n", err); 230 goto out_err; 231 } 232 reserved_pebs = vol->reserved_pebs; 233 for (i = 0; i < vol->reserved_pebs; i++) { 234 err = ubi_eba_unmap_leb(ubi, vol, i); 235 if (err) 236 goto out_err; 237 } 238 239 kfree(vol->eba_tbl); 240 ubi->volumes[vol->vol_id]->eba_tbl = NULL; 241 ubi->volumes[vol->vol_id] = NULL; 242 243 ubi->rsvd_pebs -= reserved_pebs; 244 ubi->avail_pebs += reserved_pebs; 245 i = ubi->beb_rsvd_level - ubi->beb_rsvd_pebs; 246 if (i > 0) { 247 i = ubi->avail_pebs >= i ? i : ubi->avail_pebs; 248 ubi->avail_pebs -= i; 249 ubi->rsvd_pebs += i; 250 ubi->beb_rsvd_pebs += i; 251 if (i > 0) 252 ubi_msg("reserve more %d PEBs", i); 253 } 254 ubi->vol_count -= 1; 255 256 return 0; 257 out_err: 258 ubi_err(ubi, "cannot remove volume %s, error %d", volume, err); 259 if (err < 0) 260 err = -err; 261 return err; 262 } 263 264 static int ubi_volume_continue_write(char *volume, void *buf, size_t size) 265 { 266 int err = 1; 267 struct ubi_volume *vol; 268 269 vol = ubi_find_volume(volume); 270 if (vol == NULL) 271 return ENODEV; 272 273 err = ubi_more_update_data(ubi, vol, buf, size); 274 if (err < 0) { 275 printf("Couldnt or partially wrote data\n"); 276 return -err; 277 } 278 279 if (err) { 280 size = err; 281 282 err = ubi_check_volume(ubi, vol->vol_id); 283 if (err < 0) 284 return -err; 285 286 if (err) { 287 ubi_warn(ubi, "volume %d on UBI device %d is corrupt", 288 vol->vol_id, ubi->ubi_num); 289 vol->corrupted = 1; 290 } 291 292 vol->checked = 1; 293 ubi_gluebi_updated(vol); 294 } 295 296 return 0; 297 } 298 299 int ubi_volume_begin_write(char *volume, void *buf, size_t size, 300 size_t full_size) 301 { 302 int err = 1; 303 int rsvd_bytes = 0; 304 struct ubi_volume *vol; 305 306 vol = ubi_find_volume(volume); 307 if (vol == NULL) 308 return ENODEV; 309 310 rsvd_bytes = vol->reserved_pebs * (ubi->leb_size - vol->data_pad); 311 if (size < 0 || size > rsvd_bytes) { 312 printf("size > volume size! Aborting!\n"); 313 return EINVAL; 314 } 315 316 err = ubi_start_update(ubi, vol, full_size); 317 if (err < 0) { 318 printf("Cannot start volume update\n"); 319 return -err; 320 } 321 322 return ubi_volume_continue_write(volume, buf, size); 323 } 324 325 int ubi_volume_write(char *volume, void *buf, size_t size) 326 { 327 return ubi_volume_begin_write(volume, buf, size, size); 328 } 329 330 int ubi_volume_read(char *volume, char *buf, size_t size) 331 { 332 int err, lnum, off, len, tbuf_size; 333 void *tbuf; 334 unsigned long long tmp; 335 struct ubi_volume *vol; 336 loff_t offp = 0; 337 338 vol = ubi_find_volume(volume); 339 if (vol == NULL) 340 return ENODEV; 341 342 if (vol->updating) { 343 printf("updating"); 344 return EBUSY; 345 } 346 if (vol->upd_marker) { 347 printf("damaged volume, update marker is set"); 348 return EBADF; 349 } 350 if (offp == vol->used_bytes) 351 return 0; 352 353 if (size == 0) { 354 printf("No size specified -> Using max size (%lld)\n", vol->used_bytes); 355 size = vol->used_bytes; 356 } 357 358 if (vol->corrupted) 359 printf("read from corrupted volume %d", vol->vol_id); 360 if (offp + size > vol->used_bytes) 361 size = vol->used_bytes - offp; 362 363 tbuf_size = vol->usable_leb_size; 364 if (size < tbuf_size) 365 tbuf_size = ALIGN(size, ubi->min_io_size); 366 tbuf = malloc_cache_aligned(tbuf_size); 367 if (!tbuf) { 368 printf("NO MEM\n"); 369 return ENOMEM; 370 } 371 len = size > tbuf_size ? tbuf_size : size; 372 373 tmp = offp; 374 off = do_div(tmp, vol->usable_leb_size); 375 lnum = tmp; 376 do { 377 if (off + len >= vol->usable_leb_size) 378 len = vol->usable_leb_size - off; 379 380 err = ubi_eba_read_leb(ubi, vol, lnum, tbuf, off, len, 0); 381 if (err) { 382 printf("read err %x\n", err); 383 err = -err; 384 break; 385 } 386 off += len; 387 if (off == vol->usable_leb_size) { 388 lnum += 1; 389 off -= vol->usable_leb_size; 390 } 391 392 size -= len; 393 offp += len; 394 395 memcpy(buf, tbuf, len); 396 397 buf += len; 398 len = size > tbuf_size ? tbuf_size : size; 399 } while (size); 400 401 free(tbuf); 402 return err; 403 } 404 405 static int ubi_dev_scan(struct mtd_info *info, char *ubidev, 406 const char *vid_header_offset) 407 { 408 struct mtd_device *dev; 409 struct part_info *part; 410 struct mtd_partition mtd_part; 411 char ubi_mtd_param_buffer[80]; 412 u8 pnum; 413 int err; 414 415 if (find_dev_and_part(ubidev, &dev, &pnum, &part) != 0) 416 return 1; 417 418 sprintf(buffer, "mtd=%d", pnum); 419 memset(&mtd_part, 0, sizeof(mtd_part)); 420 mtd_part.name = buffer; 421 mtd_part.size = part->size; 422 mtd_part.offset = part->offset; 423 add_mtd_partitions(info, &mtd_part, 1); 424 425 strcpy(ubi_mtd_param_buffer, buffer); 426 if (vid_header_offset) 427 sprintf(ubi_mtd_param_buffer, "mtd=%d,%s", pnum, 428 vid_header_offset); 429 err = ubi_mtd_param_parse(ubi_mtd_param_buffer, NULL); 430 if (err) { 431 del_mtd_partitions(info); 432 return -err; 433 } 434 435 err = ubi_init(); 436 if (err) { 437 del_mtd_partitions(info); 438 return -err; 439 } 440 441 ubi_initialized = 1; 442 443 return 0; 444 } 445 446 int ubi_part(char *part_name, const char *vid_header_offset) 447 { 448 int err = 0; 449 char mtd_dev[16]; 450 struct mtd_device *dev; 451 struct part_info *part; 452 u8 pnum; 453 454 if (mtdparts_init() != 0) { 455 printf("Error initializing mtdparts!\n"); 456 return 1; 457 } 458 459 #ifdef CONFIG_CMD_UBIFS 460 /* 461 * Automatically unmount UBIFS partition when user 462 * changes the UBI device. Otherwise the following 463 * UBIFS commands will crash. 464 */ 465 if (ubifs_is_mounted()) 466 cmd_ubifs_umount(); 467 #endif 468 469 /* todo: get dev number for NAND... */ 470 ubi_dev.nr = 0; 471 472 /* 473 * Call ubi_exit() before re-initializing the UBI subsystem 474 */ 475 if (ubi_initialized) { 476 ubi_exit(); 477 del_mtd_partitions(ubi_dev.mtd_info); 478 } 479 480 /* 481 * Search the mtd device number where this partition 482 * is located 483 */ 484 if (find_dev_and_part(part_name, &dev, &pnum, &part)) { 485 printf("Partition %s not found!\n", part_name); 486 return 1; 487 } 488 sprintf(mtd_dev, "%s%d", MTD_DEV_TYPE(dev->id->type), dev->id->num); 489 ubi_dev.mtd_info = get_mtd_device_nm(mtd_dev); 490 if (IS_ERR(ubi_dev.mtd_info)) { 491 printf("Partition %s not found on device %s!\n", part_name, 492 mtd_dev); 493 return 1; 494 } 495 496 ubi_dev.selected = 1; 497 498 strcpy(ubi_dev.part_name, part_name); 499 err = ubi_dev_scan(ubi_dev.mtd_info, ubi_dev.part_name, 500 vid_header_offset); 501 if (err) { 502 printf("UBI init error %d\n", err); 503 ubi_dev.selected = 0; 504 return err; 505 } 506 507 ubi = ubi_devices[0]; 508 509 return 0; 510 } 511 512 static int do_ubi(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) 513 { 514 int64_t size = 0; 515 ulong addr = 0; 516 517 if (argc < 2) 518 return CMD_RET_USAGE; 519 520 if (strcmp(argv[1], "part") == 0) { 521 const char *vid_header_offset = NULL; 522 523 /* Print current partition */ 524 if (argc == 2) { 525 if (!ubi_dev.selected) { 526 printf("Error, no UBI device/partition selected!\n"); 527 return 1; 528 } 529 530 printf("Device %d: %s, partition %s\n", 531 ubi_dev.nr, ubi_dev.mtd_info->name, ubi_dev.part_name); 532 return 0; 533 } 534 535 if (argc < 3) 536 return CMD_RET_USAGE; 537 538 if (argc > 3) 539 vid_header_offset = argv[3]; 540 541 return ubi_part(argv[2], vid_header_offset); 542 } 543 544 if ((strcmp(argv[1], "part") != 0) && (!ubi_dev.selected)) { 545 printf("Error, no UBI device/partition selected!\n"); 546 return 1; 547 } 548 549 if (strcmp(argv[1], "info") == 0) { 550 int layout = 0; 551 if (argc > 2 && !strncmp(argv[2], "l", 1)) 552 layout = 1; 553 return ubi_info(layout); 554 } 555 556 if (strcmp(argv[1], "check") == 0) { 557 if (argc > 2) 558 return ubi_check(argv[2]); 559 560 printf("Error, no volume name passed\n"); 561 return 1; 562 } 563 564 if (strncmp(argv[1], "create", 6) == 0) { 565 int dynamic = 1; /* default: dynamic volume */ 566 567 /* Use maximum available size */ 568 size = 0; 569 570 /* E.g., create volume size type */ 571 if (argc == 5) { 572 if (strncmp(argv[4], "s", 1) == 0) 573 dynamic = 0; 574 else if (strncmp(argv[4], "d", 1) != 0) { 575 printf("Incorrect type\n"); 576 return 1; 577 } 578 argc--; 579 } 580 /* E.g., create volume size */ 581 if (argc == 4) { 582 size = simple_strtoull(argv[3], NULL, 16); 583 argc--; 584 } 585 /* Use maximum available size */ 586 if (!size) { 587 size = (int64_t)ubi->avail_pebs * ubi->leb_size; 588 printf("No size specified -> Using max size (%lld)\n", size); 589 } 590 /* E.g., create volume */ 591 if (argc == 3) 592 return ubi_create_vol(argv[2], size, dynamic); 593 } 594 595 if (strncmp(argv[1], "remove", 6) == 0) { 596 /* E.g., remove volume */ 597 if (argc == 3) 598 return ubi_remove_vol(argv[2]); 599 } 600 601 if (strncmp(argv[1], "write", 5) == 0) { 602 int ret; 603 604 if (argc < 5) { 605 printf("Please see usage\n"); 606 return 1; 607 } 608 609 addr = simple_strtoul(argv[2], NULL, 16); 610 size = simple_strtoul(argv[4], NULL, 16); 611 612 if (strlen(argv[1]) == 10 && 613 strncmp(argv[1] + 5, ".part", 5) == 0) { 614 if (argc < 6) { 615 ret = ubi_volume_continue_write(argv[3], 616 (void *)addr, size); 617 } else { 618 size_t full_size; 619 full_size = simple_strtoul(argv[5], NULL, 16); 620 ret = ubi_volume_begin_write(argv[3], 621 (void *)addr, size, full_size); 622 } 623 } else { 624 ret = ubi_volume_write(argv[3], (void *)addr, size); 625 } 626 if (!ret) { 627 printf("%lld bytes written to volume %s\n", size, 628 argv[3]); 629 } 630 631 return ret; 632 } 633 634 if (strncmp(argv[1], "read", 4) == 0) { 635 size = 0; 636 637 /* E.g., read volume size */ 638 if (argc == 5) { 639 size = simple_strtoul(argv[4], NULL, 16); 640 argc--; 641 } 642 643 /* E.g., read volume */ 644 if (argc == 4) { 645 addr = simple_strtoul(argv[2], NULL, 16); 646 argc--; 647 } 648 649 if (argc == 3) { 650 printf("Read %lld bytes from volume %s to %lx\n", size, 651 argv[3], addr); 652 653 return ubi_volume_read(argv[3], (char *)addr, size); 654 } 655 } 656 657 printf("Please see usage\n"); 658 return 1; 659 } 660 661 U_BOOT_CMD( 662 ubi, 6, 1, do_ubi, 663 "ubi commands", 664 "part [part] [offset]\n" 665 " - Show or set current partition (with optional VID" 666 " header offset)\n" 667 "ubi info [l[ayout]]" 668 " - Display volume and ubi layout information\n" 669 "ubi check volumename" 670 " - check if volumename exists\n" 671 "ubi create[vol] volume [size] [type]" 672 " - create volume name with size\n" 673 "ubi write[vol] address volume size" 674 " - Write volume from address with size\n" 675 "ubi write.part address volume size [fullsize]\n" 676 " - Write part of a volume from address\n" 677 "ubi read[vol] address volume [size]" 678 " - Read volume to address with size\n" 679 "ubi remove[vol] volume" 680 " - Remove volume\n" 681 "[Legends]\n" 682 " volume: character name\n" 683 " size: specified in bytes\n" 684 " type: s[tatic] or d[ynamic] (default=dynamic)" 685 ); 686