Blame view

cmd/legacy-mtd-utils.c 1.9 KB
eb446ef62   Miquel Raynal   cmd: nand/sf: iso...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
  // SPDX-License-Identifier: GPL-2.0+
  
  #include <common.h>
  #include <jffs2/jffs2.h>
  #include <linux/mtd/mtd.h>
  #include <linux/mtd/partitions.h>
  #include <linux/string.h>
  #include <mtd.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
  ", 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.
  ");
  	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
  ");
  		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
  ", argv[1]);
  		return -1;
  	}
  
  	if (*size > *maxsize) {
  		puts("Size exceeds partition or device limit
  ");
  		return -1;
  	}
  
  print:
  	printf("device %d ", *idx);
  	if (*size == chipsize)
  		puts("whole chip
  ");
  	else
  		printf("offset 0x%llx, size 0x%llx
  ",
  		       (unsigned long long)*off, (unsigned long long)*size);
  	return 0;
  }