|
|
|
@ -93,13 +93,13 @@ |
|
|
|
|
DECLARE_GLOBAL_DATA_PTR; |
|
|
|
|
|
|
|
|
|
/* special size referring to all the remaining space in a partition */ |
|
|
|
|
#define SIZE_REMAINING 0xFFFFFFFF |
|
|
|
|
#define SIZE_REMAINING (~0llu) |
|
|
|
|
|
|
|
|
|
/* special offset value, it is used when not provided by user
|
|
|
|
|
* |
|
|
|
|
* this value is used temporarily during parsing, later such offests |
|
|
|
|
* are recalculated */ |
|
|
|
|
#define OFFSET_NOT_SPECIFIED 0xFFFFFFFF |
|
|
|
|
#define OFFSET_NOT_SPECIFIED (~0llu) |
|
|
|
|
|
|
|
|
|
/* minimum partition size */ |
|
|
|
|
#define MIN_PART_SIZE 4096 |
|
|
|
@ -160,9 +160,9 @@ static int device_del(struct mtd_device *dev); |
|
|
|
|
* @param retptr output pointer to next char after parse completes (output) |
|
|
|
|
* @return resulting unsigned int |
|
|
|
|
*/ |
|
|
|
|
static unsigned long memsize_parse (const char *const ptr, const char **retptr) |
|
|
|
|
static u64 memsize_parse (const char *const ptr, const char **retptr) |
|
|
|
|
{ |
|
|
|
|
unsigned long ret = simple_strtoul(ptr, (char **)retptr, 0); |
|
|
|
|
u64 ret = simple_strtoull(ptr, (char **)retptr, 0); |
|
|
|
|
|
|
|
|
|
switch (**retptr) { |
|
|
|
|
case 'G': |
|
|
|
@ -193,20 +193,20 @@ static unsigned long memsize_parse (const char *const ptr, const char **retptr) |
|
|
|
|
* @param buf output buffer |
|
|
|
|
* @param size size to be converted to string |
|
|
|
|
*/ |
|
|
|
|
static void memsize_format(char *buf, u32 size) |
|
|
|
|
static void memsize_format(char *buf, u64 size) |
|
|
|
|
{ |
|
|
|
|
#define SIZE_GB ((u32)1024*1024*1024) |
|
|
|
|
#define SIZE_MB ((u32)1024*1024) |
|
|
|
|
#define SIZE_KB ((u32)1024) |
|
|
|
|
|
|
|
|
|
if ((size % SIZE_GB) == 0) |
|
|
|
|
sprintf(buf, "%ug", size/SIZE_GB); |
|
|
|
|
sprintf(buf, "%llug", size/SIZE_GB); |
|
|
|
|
else if ((size % SIZE_MB) == 0) |
|
|
|
|
sprintf(buf, "%um", size/SIZE_MB); |
|
|
|
|
sprintf(buf, "%llum", size/SIZE_MB); |
|
|
|
|
else if (size % SIZE_KB == 0) |
|
|
|
|
sprintf(buf, "%uk", size/SIZE_KB); |
|
|
|
|
sprintf(buf, "%lluk", size/SIZE_KB); |
|
|
|
|
else |
|
|
|
|
sprintf(buf, "%u", size); |
|
|
|
|
sprintf(buf, "%llu", size); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
@ -310,6 +310,7 @@ static int part_validate_eraseblock(struct mtdids *id, struct part_info *part) |
|
|
|
|
struct mtd_info *mtd = NULL; |
|
|
|
|
int i, j; |
|
|
|
|
ulong start; |
|
|
|
|
u64 offset, size; |
|
|
|
|
|
|
|
|
|
if (get_mtd_info(id->type, id->num, &mtd)) |
|
|
|
|
return 1; |
|
|
|
@ -321,14 +322,16 @@ static int part_validate_eraseblock(struct mtdids *id, struct part_info *part) |
|
|
|
|
* Only one eraseregion (NAND, OneNAND or uniform NOR), |
|
|
|
|
* checking for alignment is easy here |
|
|
|
|
*/ |
|
|
|
|
if ((unsigned long)part->offset % mtd->erasesize) { |
|
|
|
|
offset = part->offset; |
|
|
|
|
if (do_div(offset, mtd->erasesize)) { |
|
|
|
|
printf("%s%d: partition (%s) start offset" |
|
|
|
|
"alignment incorrect\n", |
|
|
|
|
MTD_DEV_TYPE(id->type), id->num, part->name); |
|
|
|
|
return 1; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (part->size % mtd->erasesize) { |
|
|
|
|
size = part->size; |
|
|
|
|
if (do_div(size, mtd->erasesize)) { |
|
|
|
|
printf("%s%d: partition (%s) size alignment incorrect\n", |
|
|
|
|
MTD_DEV_TYPE(id->type), id->num, part->name); |
|
|
|
|
return 1; |
|
|
|
@ -395,7 +398,7 @@ static int part_validate(struct mtdids *id, struct part_info *part) |
|
|
|
|
part->size = id->size - part->offset; |
|
|
|
|
|
|
|
|
|
if (part->offset > id->size) { |
|
|
|
|
printf("%s: offset %08x beyond flash size %08x\n", |
|
|
|
|
printf("%s: offset %08llx beyond flash size %08llx\n", |
|
|
|
|
id->mtd_id, part->offset, id->size); |
|
|
|
|
return 1; |
|
|
|
|
} |
|
|
|
@ -578,8 +581,8 @@ static int part_add(struct mtd_device *dev, struct part_info *part) |
|
|
|
|
static int part_parse(const char *const partdef, const char **ret, struct part_info **retpart) |
|
|
|
|
{ |
|
|
|
|
struct part_info *part; |
|
|
|
|
unsigned long size; |
|
|
|
|
unsigned long offset; |
|
|
|
|
u64 size; |
|
|
|
|
u64 offset; |
|
|
|
|
const char *name; |
|
|
|
|
int name_len; |
|
|
|
|
unsigned int mask_flags; |
|
|
|
@ -598,7 +601,7 @@ static int part_parse(const char *const partdef, const char **ret, struct part_i |
|
|
|
|
} else { |
|
|
|
|
size = memsize_parse(p, &p); |
|
|
|
|
if (size < MIN_PART_SIZE) { |
|
|
|
|
printf("partition size too small (%lx)\n", size); |
|
|
|
|
printf("partition size too small (%llx)\n", size); |
|
|
|
|
return 1; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
@ -670,14 +673,14 @@ static int part_parse(const char *const partdef, const char **ret, struct part_i |
|
|
|
|
part->auto_name = 0; |
|
|
|
|
} else { |
|
|
|
|
/* auto generated name in form of size@offset */ |
|
|
|
|
sprintf(part->name, "0x%08lx@0x%08lx", size, offset); |
|
|
|
|
sprintf(part->name, "0x%08llx@0x%08llx", size, offset); |
|
|
|
|
part->auto_name = 1; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
part->name[name_len - 1] = '\0'; |
|
|
|
|
INIT_LIST_HEAD(&part->link); |
|
|
|
|
|
|
|
|
|
debug("+ partition: name %-22s size 0x%08x offset 0x%08x mask flags %d\n", |
|
|
|
|
debug("+ partition: name %-22s size 0x%08llx offset 0x%08llx mask flags %d\n", |
|
|
|
|
part->name, part->size, |
|
|
|
|
part->offset, part->mask_flags); |
|
|
|
|
|
|
|
|
@ -693,7 +696,7 @@ static int part_parse(const char *const partdef, const char **ret, struct part_i |
|
|
|
|
* @param size a pointer to the size of the mtd device (output) |
|
|
|
|
* @return 0 if device is valid, 1 otherwise |
|
|
|
|
*/ |
|
|
|
|
static int mtd_device_validate(u8 type, u8 num, u32 *size) |
|
|
|
|
static int mtd_device_validate(u8 type, u8 num, u64 *size) |
|
|
|
|
{ |
|
|
|
|
struct mtd_info *mtd = NULL; |
|
|
|
|
|
|
|
|
@ -826,7 +829,7 @@ static int device_parse(const char *const mtd_dev, const char **ret, struct mtd_ |
|
|
|
|
LIST_HEAD(tmp_list); |
|
|
|
|
struct list_head *entry, *n; |
|
|
|
|
u16 num_parts; |
|
|
|
|
u32 offset; |
|
|
|
|
u64 offset; |
|
|
|
|
int err = 1; |
|
|
|
|
|
|
|
|
|
debug("===device_parse===\n"); |
|
|
|
@ -1071,7 +1074,8 @@ static int generate_mtdparts(char *buf, u32 buflen) |
|
|
|
|
struct part_info *part, *prev_part; |
|
|
|
|
char *p = buf; |
|
|
|
|
char tmpbuf[32]; |
|
|
|
|
u32 size, offset, len, part_cnt; |
|
|
|
|
u64 size, offset; |
|
|
|
|
u32 len, part_cnt; |
|
|
|
|
u32 maxlen = buflen - 1; |
|
|
|
|
|
|
|
|
|
debug("--- generate_mtdparts ---\n"); |
|
|
|
@ -1270,7 +1274,7 @@ static void print_partition_table(void) |
|
|
|
|
|
|
|
|
|
list_for_each(pentry, &dev->parts) { |
|
|
|
|
part = list_entry(pentry, struct part_info, link); |
|
|
|
|
printf("%2d: %-20s0x%08x\t0x%08x\t%d\n", |
|
|
|
|
printf("%2d: %-20s0x%08llx\t0x%08llx\t%d\n", |
|
|
|
|
part_num, part->name, part->size, |
|
|
|
|
part->offset, part->mask_flags); |
|
|
|
|
#endif /* defined(CONFIG_CMD_MTDPARTS_SHOW_NET_SIZES) */ |
|
|
|
@ -1297,7 +1301,7 @@ static void list_partitions(void) |
|
|
|
|
if (current_mtd_dev) { |
|
|
|
|
part = mtd_part_info(current_mtd_dev, current_mtd_partnum); |
|
|
|
|
if (part) { |
|
|
|
|
printf("\nactive partition: %s%d,%d - (%s) 0x%08x @ 0x%08x\n", |
|
|
|
|
printf("\nactive partition: %s%d,%d - (%s) 0x%08llx @ 0x%08llx\n", |
|
|
|
|
MTD_DEV_TYPE(current_mtd_dev->id->type), |
|
|
|
|
current_mtd_dev->id->num, current_mtd_partnum, |
|
|
|
|
part->name, part->size, part->offset); |
|
|
|
@ -1397,7 +1401,7 @@ static int delete_partition(const char *id) |
|
|
|
|
|
|
|
|
|
if (find_dev_and_part(id, &dev, &pnum, &part) == 0) { |
|
|
|
|
|
|
|
|
|
debug("delete_partition: device = %s%d, partition %d = (%s) 0x%08x@0x%08x\n", |
|
|
|
|
debug("delete_partition: device = %s%d, partition %d = (%s) 0x%08llx@0x%08llx\n", |
|
|
|
|
MTD_DEV_TYPE(dev->id->type), dev->id->num, pnum, |
|
|
|
|
part->name, part->size, part->offset); |
|
|
|
|
|
|
|
|
@ -1589,7 +1593,7 @@ static int parse_mtdids(const char *const ids) |
|
|
|
|
struct list_head *entry, *n; |
|
|
|
|
struct mtdids *id_tmp; |
|
|
|
|
u8 type, num; |
|
|
|
|
u32 size; |
|
|
|
|
u64 size; |
|
|
|
|
int ret = 1; |
|
|
|
|
|
|
|
|
|
debug("\n---parse_mtdids---\nmtdids = %s\n\n", ids); |
|
|
|
@ -1663,7 +1667,7 @@ static int parse_mtdids(const char *const ids) |
|
|
|
|
id->mtd_id[mtd_id_len - 1] = '\0'; |
|
|
|
|
INIT_LIST_HEAD(&id->link); |
|
|
|
|
|
|
|
|
|
debug("+ id %s%d\t%16d bytes\t%s\n", |
|
|
|
|
debug("+ id %s%d\t%16lld bytes\t%s\n", |
|
|
|
|
MTD_DEV_TYPE(id->type), id->num, |
|
|
|
|
id->size, id->mtd_id); |
|
|
|
|
|
|
|
|
|