Blame view

include/part.h 10.7 KB
012771d88   wdenk   Initial revision
1
  /*
42dfe7a18   wdenk   Code cleanup; mak...
2
   * (C) Copyright 2000-2004
012771d88   wdenk   Initial revision
3
4
   * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
   *
3765b3e7b   Wolfgang Denk   Coding Style clea...
5
   * SPDX-License-Identifier:	GPL-2.0+
012771d88   wdenk   Initial revision
6
7
8
   */
  #ifndef _PART_H
  #define _PART_H
735dd97b1   Grant Likely   [PATCH 1_4] Merge...
9

6e5923851   wdenk   * Cleanup, minor ...
10
  #include <ide.h>
6b423b752   Mateusz Zalega   part: header fix
11
  #include <common.h>
012771d88   wdenk   Initial revision
12
13
  
  typedef struct block_dev_desc {
42dfe7a18   wdenk   Code cleanup; mak...
14
  	int		if_type;	/* type of the interface */
d049cc7f7   Wolfgang Denk   Coding style clea...
15
16
  	int		dev;		/* device number */
  	unsigned char	part_type;	/* partition type */
42dfe7a18   wdenk   Code cleanup; mak...
17
18
19
20
21
22
23
  	unsigned char	target;		/* target SCSI ID */
  	unsigned char	lun;		/* target LUN */
  	unsigned char	type;		/* device type */
  	unsigned char	removable;	/* removable device */
  #ifdef CONFIG_LBA48
  	unsigned char	lba48;		/* device can use 48bit addr (ATA/ATAPI v7) */
  #endif
985889b11   Anatolij Gustschin   include/part.h: f...
24
  	lbaint_t	lba;		/* number of blocks */
42dfe7a18   wdenk   Code cleanup; mak...
25
  	unsigned long	blksz;		/* block size */
0472fbfd3   Egbert Eich   part/dev_desc: Ad...
26
  	int		log2blksz;	/* for convenience: log2(blksz) */
d049cc7f7   Wolfgang Denk   Coding style clea...
27
  	char		vendor [40+1];	/* IDE model, SCSI Vendor */
2a4741d9a   Marcel Ziswiler   fix pxa255_idp board
28
29
  	char		product[20+1];	/* IDE Serial no, SCSI product */
  	char		revision[8+1];	/* firmware revision */
42dfe7a18   wdenk   Code cleanup; mak...
30
  	unsigned long	(*block_read)(int dev,
ff8fef566   Sascha Silbe   Fix block device ...
31
  				      lbaint_t start,
6e5923851   wdenk   * Cleanup, minor ...
32
  				      lbaint_t blkcnt,
eb867a762   Grant Likely   [PATCH 9_9] Use "...
33
  				      void *buffer);
53758fa20   Grant Likely   [PATCH 8_9] Add b...
34
  	unsigned long	(*block_write)(int dev,
ff8fef566   Sascha Silbe   Fix block device ...
35
  				       lbaint_t start,
53758fa20   Grant Likely   [PATCH 8_9] Add b...
36
37
  				       lbaint_t blkcnt,
  				       const void *buffer);
e6f99a561   Lei Wen   MMC: add erase fu...
38
  	unsigned long   (*block_erase)(int dev,
ff8fef566   Sascha Silbe   Fix block device ...
39
  				       lbaint_t start,
e6f99a561   Lei Wen   MMC: add erase fu...
40
  				       lbaint_t blkcnt);
c7057b529   Dave Liu   ata: add the supp...
41
  	void		*priv;		/* driver private struct pointer */
012771d88   wdenk   Initial revision
42
  }block_dev_desc_t;
b0fce99bf   wdenk   Fix some missing ...
43

ae1768a72   Egbert Eich   disk/gpt: Fix GPT...
44
45
46
  #define BLOCK_CNT(size, block_dev_desc) (PAD_COUNT(size, block_dev_desc->blksz))
  #define PAD_TO_BLOCKSIZE(size, block_dev_desc) \
  	(PAD_SIZE(size, block_dev_desc->blksz))
0472fbfd3   Egbert Eich   part/dev_desc: Ad...
47
48
49
50
  #define LOG2(x) (((x & 0xaaaaaaaa) ? 1 : 0) + ((x & 0xcccccccc) ? 2 : 0) + \
  		 ((x & 0xf0f0f0f0) ? 4 : 0) + ((x & 0xff00ff00) ? 8 : 0) + \
  		 ((x & 0xffff0000) ? 16 : 0))
  #define LOG2_INVALID(type) ((type)((sizeof(type)<<3)-1))
ae1768a72   Egbert Eich   disk/gpt: Fix GPT...
51

012771d88   wdenk   Initial revision
52
  /* Interface types: */
b0fce99bf   wdenk   Fix some missing ...
53
54
  #define IF_TYPE_UNKNOWN		0
  #define IF_TYPE_IDE		1
012771d88   wdenk   Initial revision
55
56
  #define IF_TYPE_SCSI		2
  #define IF_TYPE_ATAPI		3
b0fce99bf   wdenk   Fix some missing ...
57
58
  #define IF_TYPE_USB		4
  #define IF_TYPE_DOC		5
7205e4075   wdenk   * Patches by Deni...
59
  #define IF_TYPE_MMC		6
c95219fae   stefano babic   MMC for PXA 27X (...
60
  #define IF_TYPE_SD		7
c7057b529   Dave Liu   ata: add the supp...
61
  #define IF_TYPE_SATA		8
f4d8de48f   Henrik Nordström   sandbox: block dr...
62
63
  #define IF_TYPE_HOST		9
  #define IF_TYPE_MAX		10	/* Max number of IF_TYPE_* supported */
b0fce99bf   wdenk   Fix some missing ...
64

012771d88   wdenk   Initial revision
65
  /* Part types */
42dfe7a18   wdenk   Code cleanup; mak...
66
  #define PART_TYPE_UNKNOWN	0x00
012771d88   wdenk   Initial revision
67
68
69
  #define PART_TYPE_MAC		0x01
  #define PART_TYPE_DOS		0x02
  #define PART_TYPE_ISO		0x03
42dfe7a18   wdenk   Code cleanup; mak...
70
  #define PART_TYPE_AMIGA		0x04
07f3d789b   richardretanubun   Add support for C...
71
  #define PART_TYPE_EFI		0x05
c7de829c7   wdenk   * Patch by Thomas...
72

b0fce99bf   wdenk   Fix some missing ...
73
74
75
76
77
  /*
   * Type string for U-Boot bootable partitions
   */
  #define BOOT_PART_TYPE	"U-Boot"	/* primary boot partition type	*/
  #define BOOT_PART_COMP	"PPCBoot"	/* PPCBoot compatibility type	*/
012771d88   wdenk   Initial revision
78
  /* device types */
b0fce99bf   wdenk   Fix some missing ...
79
80
  #define DEV_TYPE_UNKNOWN	0xff	/* not connected */
  #define DEV_TYPE_HARDDISK	0x00	/* harddisk */
42dfe7a18   wdenk   Code cleanup; mak...
81
82
83
  #define DEV_TYPE_TAPE		0x01	/* Tape */
  #define DEV_TYPE_CDROM		0x05	/* CD-ROM */
  #define DEV_TYPE_OPDISK		0x07	/* optical disk */
012771d88   wdenk   Initial revision
84

42dfe7a18   wdenk   Code cleanup; mak...
85
  typedef struct disk_partition {
04735e9c5   Frederic Leroy   Fix ext2/ext4 fil...
86
87
  	lbaint_t	start;	/* # of first block in partition	*/
  	lbaint_t	size;	/* number of blocks in partition	*/
012771d88   wdenk   Initial revision
88
89
90
  	ulong	blksz;		/* block size in bytes			*/
  	uchar	name[32];	/* partition name			*/
  	uchar	type[32];	/* string type description		*/
40e0e5686   Rob Herring   disk/part: check ...
91
  	int	bootable;	/* Active/Bootable flag is set		*/
894bfbbfb   Stephen Warren   disk: part_efi: p...
92
93
94
  #ifdef CONFIG_PARTITION_UUIDS
  	char	uuid[37];	/* filesystem UUID as string, if exists	*/
  #endif
7561b258a   Patrick Delaunay   gpt: add optional...
95
96
97
  #ifdef CONFIG_PARTITION_TYPE_GUID
  	char	type_guid[37];	/* type GUID as string, if exists	*/
  #endif
012771d88   wdenk   Initial revision
98
  } disk_partition_t;
735dd97b1   Grant Likely   [PATCH 1_4] Merge...
99
  /* Misc _get_dev functions */
df3fc5260   Matthew McClintock   disk/part.c: Make...
100
  #ifdef CONFIG_PARTITIONS
99d2c205d   Rob Herring   disk/part: introd...
101
  block_dev_desc_t *get_dev(const char *ifname, int dev);
735dd97b1   Grant Likely   [PATCH 1_4] Merge...
102
  block_dev_desc_t* ide_get_dev(int dev);
c7057b529   Dave Liu   ata: add the supp...
103
  block_dev_desc_t* sata_get_dev(int dev);
735dd97b1   Grant Likely   [PATCH 1_4] Merge...
104
105
106
  block_dev_desc_t* scsi_get_dev(int dev);
  block_dev_desc_t* usb_stor_get_dev(int dev);
  block_dev_desc_t* mmc_get_dev(int dev);
d23562843   Stephen Warren   mmc: provide a se...
107
  int mmc_select_hwpart(int dev_num, int hwpart);
735dd97b1   Grant Likely   [PATCH 1_4] Merge...
108
  block_dev_desc_t* systemace_get_dev(int dev);
75eb82ec7   unsik Kim   mflash: Initial m...
109
  block_dev_desc_t* mg_disk_get_dev(int dev);
f4d8de48f   Henrik Nordström   sandbox: block dr...
110
111
  block_dev_desc_t *host_get_dev(int dev);
  int host_get_dev_err(int dev, block_dev_desc_t **blk_devp);
735dd97b1   Grant Likely   [PATCH 1_4] Merge...
112

012771d88   wdenk   Initial revision
113
114
115
116
117
  /* disk/part.c */
  int get_partition_info (block_dev_desc_t * dev_desc, int part, disk_partition_t *info);
  void print_part (block_dev_desc_t *dev_desc);
  void  init_part (block_dev_desc_t *dev_desc);
  void dev_print(block_dev_desc_t *dev_desc);
2023e6086   Stephen Warren   disk: introduce g...
118
119
  int get_device(const char *ifname, const char *dev_str,
  	       block_dev_desc_t **dev_desc);
10a37fd7a   Stephen Warren   disk: get_device_...
120
  int get_device_and_partition(const char *ifname, const char *dev_part_str,
99d2c205d   Rob Herring   disk/part: introd...
121
  			     block_dev_desc_t **dev_desc,
10a37fd7a   Stephen Warren   disk: get_device_...
122
  			     disk_partition_t *info, int allow_whole_dev);
df3fc5260   Matthew McClintock   disk/part.c: Make...
123
  #else
99d2c205d   Rob Herring   disk/part: introd...
124
125
  static inline block_dev_desc_t *get_dev(const char *ifname, int dev)
  { return NULL; }
df3fc5260   Matthew McClintock   disk/part.c: Make...
126
127
128
129
130
  static inline block_dev_desc_t* ide_get_dev(int dev) { return NULL; }
  static inline block_dev_desc_t* sata_get_dev(int dev) { return NULL; }
  static inline block_dev_desc_t* scsi_get_dev(int dev) { return NULL; }
  static inline block_dev_desc_t* usb_stor_get_dev(int dev) { return NULL; }
  static inline block_dev_desc_t* mmc_get_dev(int dev) { return NULL; }
d23562843   Stephen Warren   mmc: provide a se...
131
  static inline int mmc_select_hwpart(int dev_num, int hwpart) { return -1; }
df3fc5260   Matthew McClintock   disk/part.c: Make...
132
133
  static inline block_dev_desc_t* systemace_get_dev(int dev) { return NULL; }
  static inline block_dev_desc_t* mg_disk_get_dev(int dev) { return NULL; }
f4d8de48f   Henrik Nordström   sandbox: block dr...
134
  static inline block_dev_desc_t *host_get_dev(int dev) { return NULL; }
012771d88   wdenk   Initial revision
135

df3fc5260   Matthew McClintock   disk/part.c: Make...
136
137
138
139
140
  static inline int get_partition_info (block_dev_desc_t * dev_desc, int part,
  	disk_partition_t *info) { return -1; }
  static inline void print_part (block_dev_desc_t *dev_desc) {}
  static inline void  init_part (block_dev_desc_t *dev_desc) {}
  static inline void dev_print(block_dev_desc_t *dev_desc) {}
2023e6086   Stephen Warren   disk: introduce g...
141
142
143
  static inline int get_device(const char *ifname, const char *dev_str,
  	       block_dev_desc_t **dev_desc)
  { return -1; }
99d2c205d   Rob Herring   disk/part: introd...
144
  static inline int get_device_and_partition(const char *ifname,
10a37fd7a   Stephen Warren   disk: get_device_...
145
  					   const char *dev_part_str,
99d2c205d   Rob Herring   disk/part: introd...
146
  					   block_dev_desc_t **dev_desc,
10a37fd7a   Stephen Warren   disk: get_device_...
147
148
  					   disk_partition_t *info,
  					   int allow_whole_dev)
99d2c205d   Rob Herring   disk/part: introd...
149
  { *dev_desc = NULL; return -1; }
df3fc5260   Matthew McClintock   disk/part.c: Make...
150
  #endif
012771d88   wdenk   Initial revision
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
  
  #ifdef CONFIG_MAC_PARTITION
  /* disk/part_mac.c */
  int get_partition_info_mac (block_dev_desc_t * dev_desc, int part, disk_partition_t *info);
  void print_part_mac (block_dev_desc_t *dev_desc);
  int   test_part_mac (block_dev_desc_t *dev_desc);
  #endif
  
  #ifdef CONFIG_DOS_PARTITION
  /* disk/part_dos.c */
  int get_partition_info_dos (block_dev_desc_t * dev_desc, int part, disk_partition_t *info);
  void print_part_dos (block_dev_desc_t *dev_desc);
  int   test_part_dos (block_dev_desc_t *dev_desc);
  #endif
  
  #ifdef CONFIG_ISO_PARTITION
  /* disk/part_iso.c */
  int get_partition_info_iso (block_dev_desc_t * dev_desc, int part, disk_partition_t *info);
  void print_part_iso (block_dev_desc_t *dev_desc);
  int   test_part_iso (block_dev_desc_t *dev_desc);
  #endif
c7de829c7   wdenk   * Patch by Thomas...
172
173
174
175
176
177
  #ifdef CONFIG_AMIGA_PARTITION
  /* disk/part_amiga.c */
  int get_partition_info_amiga (block_dev_desc_t * dev_desc, int part, disk_partition_t *info);
  void print_part_amiga (block_dev_desc_t *dev_desc);
  int   test_part_amiga (block_dev_desc_t *dev_desc);
  #endif
07f3d789b   richardretanubun   Add support for C...
178
  #ifdef CONFIG_EFI_PARTITION
40684ddb8   Lukasz Majewski   gpt: Support for ...
179
  #include <part_efi.h>
07f3d789b   richardretanubun   Add support for C...
180
181
  /* disk/part_efi.c */
  int get_partition_info_efi (block_dev_desc_t * dev_desc, int part, disk_partition_t *info);
60bf94169   Steve Rae   disk: part_efi: a...
182
183
184
185
186
187
188
189
190
191
192
  /**
   * get_partition_info_efi_by_name() - Find the specified GPT partition table entry
   *
   * @param dev_desc - block device descriptor
   * @param gpt_name - the specified table entry name
   * @param info - returns the disk partition info
   *
   * @return - '0' on match, '-1' on no match, otherwise error
   */
  int get_partition_info_efi_by_name(block_dev_desc_t *dev_desc,
  	const char *name, disk_partition_t *info);
07f3d789b   richardretanubun   Add support for C...
193
194
  void print_part_efi (block_dev_desc_t *dev_desc);
  int   test_part_efi (block_dev_desc_t *dev_desc);
40684ddb8   Lukasz Majewski   gpt: Support for ...
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
  
  /**
   * write_gpt_table() - Write the GUID Partition Table to disk
   *
   * @param dev_desc - block device descriptor
   * @param gpt_h - pointer to GPT header representation
   * @param gpt_e - pointer to GPT partition table entries
   *
   * @return - zero on success, otherwise error
   */
  int write_gpt_table(block_dev_desc_t *dev_desc,
  		  gpt_header *gpt_h, gpt_entry *gpt_e);
  
  /**
   * gpt_fill_pte(): Fill the GPT partition table entry
   *
   * @param gpt_h - GPT header representation
   * @param gpt_e - GPT partition table entries
   * @param partitions - list of partitions
   * @param parts - number of partitions
   *
   * @return zero on success
   */
  int gpt_fill_pte(gpt_header *gpt_h, gpt_entry *gpt_e,
  		disk_partition_t *partitions, int parts);
  
  /**
   * gpt_fill_header(): Fill the GPT header
   *
   * @param dev_desc - block device descriptor
   * @param gpt_h - GPT header representation
   * @param str_guid - disk guid string representation
   * @param parts_count - number of partitions
   *
   * @return - error on str_guid conversion error
   */
  int gpt_fill_header(block_dev_desc_t *dev_desc, gpt_header *gpt_h,
  		char *str_guid, int parts_count);
  
  /**
   * gpt_restore(): Restore GPT partition table
   *
   * @param dev_desc - block device descriptor
   * @param str_disk_guid - disk GUID
   * @param partitions - list of partitions
   * @param parts - number of partitions
   *
   * @return zero on success
   */
  int gpt_restore(block_dev_desc_t *dev_desc, char *str_disk_guid,
  		disk_partition_t *partitions, const int parts_count);
0ff7e585d   Steve Rae   fastboot: handle ...
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
  
  /**
   * is_valid_gpt_buf() - Ensure that the Primary GPT information is valid
   *
   * @param dev_desc - block device descriptor
   * @param buf - buffer which contains the MBR and Primary GPT info
   *
   * @return - '0' on success, otherwise error
   */
  int is_valid_gpt_buf(block_dev_desc_t *dev_desc, void *buf);
  
  /**
   * write_mbr_and_gpt_partitions() - write MBR, Primary GPT and Backup GPT
   *
   * @param dev_desc - block device descriptor
   * @param buf - buffer which contains the MBR and Primary GPT info
   *
   * @return - '0' on success, otherwise error
   */
  int write_mbr_and_gpt_partitions(block_dev_desc_t *dev_desc, void *buf);
cef68bf90   Lukasz Majewski   gpt: part: Defini...
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
  
  /**
   * gpt_verify_headers() - Function to read and CRC32 check of the GPT's header
   *                        and partition table entries (PTE)
   *
   * As a side effect if sets gpt_head and gpt_pte so they point to GPT data.
   *
   * @param dev_desc - block device descriptor
   * @param gpt_head - pointer to GPT header data read from medium
   * @param gpt_pte - pointer to GPT partition table enties read from medium
   *
   * @return - '0' on success, otherwise error
   */
  int gpt_verify_headers(block_dev_desc_t *dev_desc, gpt_header *gpt_head,
  		       gpt_entry **gpt_pte);
  
  /**
   * gpt_verify_partitions() - Function to check if partitions' name, start and
   *                           size correspond to '$partitions' env variable
   *
   * This function checks if on medium stored GPT data is in sync with information
   * provided in '$partitions' environment variable. Specificially, name, start
   * and size of the partition is checked.
   *
   * @param dev_desc - block device descriptor
   * @param partitions - partition data read from '$partitions' env variable
   * @param parts - number of partitions read from '$partitions' env variable
   * @param gpt_head - pointer to GPT header data read from medium
   * @param gpt_pte - pointer to GPT partition table enties read from medium
   *
   * @return - '0' on success, otherwise error
   */
  int gpt_verify_partitions(block_dev_desc_t *dev_desc,
  			  disk_partition_t *partitions, int parts,
  			  gpt_header *gpt_head, gpt_entry **gpt_pte);
07f3d789b   richardretanubun   Add support for C...
301
  #endif
012771d88   wdenk   Initial revision
302
  #endif /* _PART_H */