123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100 |
- /*
- * (C) Copyright 2014
- * Heiko Schocher, DENX Software Engineering, hs@denx.de.
- *
- * SPDX-License-Identifier: GPL-2.0+
- */
- #include <common.h>
- #include <linux/mtd/mtd.h>
- #include <jffs2/jffs2.h>
- static int get_part(const char *partname, int *idx, loff_t *off, loff_t *size,
- loff_t *maxsize, int devtype)
- {
- #ifdef CONFIG_CMD_MTDPARTS
- struct mtd_device *dev;
- struct part_info *part;
- u8 pnum;
- int ret;
- ret = mtdparts_init();
- if (ret)
- return ret;
- ret = find_dev_and_part(partname, &dev, &pnum, &part);
- if (ret)
- return ret;
- if (dev->id->type != devtype) {
- printf("not same typ %d != %d\n", dev->id->type, devtype);
- return -1;
- }
- *off = part->offset;
- *size = part->size;
- *maxsize = part->size;
- *idx = dev->id->num;
- return 0;
- #else
- puts("mtdparts support missing.\n");
- return -1;
- #endif
- }
- int mtd_arg_off(const char *arg, int *idx, loff_t *off, loff_t *size,
- loff_t *maxsize, int devtype, uint64_t chipsize)
- {
- if (!str2off(arg, off))
- return get_part(arg, idx, off, size, maxsize, devtype);
- if (*off >= chipsize) {
- puts("Offset exceeds device limit\n");
- return -1;
- }
- *maxsize = chipsize - *off;
- *size = *maxsize;
- return 0;
- }
- int mtd_arg_off_size(int argc, char *const argv[], int *idx, loff_t *off,
- loff_t *size, loff_t *maxsize, int devtype,
- uint64_t chipsize)
- {
- int ret;
- if (argc == 0) {
- *off = 0;
- *size = chipsize;
- *maxsize = *size;
- goto print;
- }
- ret = mtd_arg_off(argv[0], idx, off, size, maxsize, devtype,
- chipsize);
- if (ret)
- return ret;
- if (argc == 1)
- goto print;
- if (!str2off(argv[1], size)) {
- printf("'%s' is not a number\n", argv[1]);
- return -1;
- }
- if (*size > *maxsize) {
- puts("Size exceeds partition or device limit\n");
- return -1;
- }
- print:
- printf("device %d ", *idx);
- if (*size == chipsize)
- puts("whole chip\n");
- else
- printf("offset 0x%llx, size 0x%llx\n",
- (unsigned long long)*off, (unsigned long long)*size);
- return 0;
- }
|