PageRenderTime 28ms CodeModel.GetById 20ms RepoModel.GetById 1ms app.codeStats 0ms

/include/part.h

https://bitbucket.org/hldspb/uboot-sbc8600
C Header | 449 lines | 147 code | 44 blank | 258 comment | 3 complexity | 8c85dbeac185f931058924d6552197c4 MD5 | raw file
  1. /*
  2. * (C) Copyright 2000-2004
  3. * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
  4. *
  5. * SPDX-License-Identifier: GPL-2.0+
  6. */
  7. #ifndef _PART_H
  8. #define _PART_H
  9. #include <blk.h>
  10. #include <ide.h>
  11. #include <uuid.h>
  12. #include <linux/list.h>
  13. struct block_drvr {
  14. char *name;
  15. int (*select_hwpart)(int dev_num, int hwpart);
  16. };
  17. #define LOG2(x) (((x & 0xaaaaaaaa) ? 1 : 0) + ((x & 0xcccccccc) ? 2 : 0) + \
  18. ((x & 0xf0f0f0f0) ? 4 : 0) + ((x & 0xff00ff00) ? 8 : 0) + \
  19. ((x & 0xffff0000) ? 16 : 0))
  20. #define LOG2_INVALID(type) ((type)((sizeof(type)<<3)-1))
  21. /* Part types */
  22. #define PART_TYPE_UNKNOWN 0x00
  23. #define PART_TYPE_MAC 0x01
  24. #define PART_TYPE_DOS 0x02
  25. #define PART_TYPE_ISO 0x03
  26. #define PART_TYPE_AMIGA 0x04
  27. #define PART_TYPE_EFI 0x05
  28. /* maximum number of partition entries supported by search */
  29. #define DOS_ENTRY_NUMBERS 8
  30. #define ISO_ENTRY_NUMBERS 64
  31. #define MAC_ENTRY_NUMBERS 64
  32. #define AMIGA_ENTRY_NUMBERS 8
  33. /*
  34. * Type string for U-Boot bootable partitions
  35. */
  36. #define BOOT_PART_TYPE "U-Boot" /* primary boot partition type */
  37. #define BOOT_PART_COMP "PPCBoot" /* PPCBoot compatibility type */
  38. /* device types */
  39. #define DEV_TYPE_UNKNOWN 0xff /* not connected */
  40. #define DEV_TYPE_HARDDISK 0x00 /* harddisk */
  41. #define DEV_TYPE_TAPE 0x01 /* Tape */
  42. #define DEV_TYPE_CDROM 0x05 /* CD-ROM */
  43. #define DEV_TYPE_OPDISK 0x07 /* optical disk */
  44. #define PART_NAME_LEN 32
  45. #define PART_TYPE_LEN 32
  46. #define MAX_SEARCH_PARTITIONS 64
  47. typedef struct disk_partition {
  48. lbaint_t start; /* # of first block in partition */
  49. lbaint_t size; /* number of blocks in partition */
  50. ulong blksz; /* block size in bytes */
  51. uchar name[PART_NAME_LEN]; /* partition name */
  52. uchar type[PART_TYPE_LEN]; /* string type description */
  53. int bootable; /* Active/Bootable flag is set */
  54. #if CONFIG_IS_ENABLED(PARTITION_UUIDS)
  55. char uuid[UUID_STR_LEN + 1]; /* filesystem UUID as string, if exists */
  56. #endif
  57. #ifdef CONFIG_PARTITION_TYPE_GUID
  58. char type_guid[UUID_STR_LEN + 1]; /* type GUID as string, if exists */
  59. #endif
  60. #ifdef CONFIG_DOS_PARTITION
  61. uchar sys_ind; /* partition type */
  62. #endif
  63. } disk_partition_t;
  64. struct disk_part {
  65. int partnum;
  66. disk_partition_t gpt_part_info;
  67. struct list_head list;
  68. };
  69. /* Misc _get_dev functions */
  70. #ifdef CONFIG_PARTITIONS
  71. /**
  72. * blk_get_dev() - get a pointer to a block device given its type and number
  73. *
  74. * Each interface allocates its own devices and typically struct blk_desc is
  75. * contained with the interface's data structure. There is no global
  76. * numbering for block devices, so the interface name must be provided.
  77. *
  78. * @ifname: Interface name (e.g. "ide", "scsi")
  79. * @dev: Device number (0 for first device on that interface, 1 for
  80. * second, etc.
  81. * @return pointer to the block device, or NULL if not available, or an
  82. * error occurred.
  83. */
  84. struct blk_desc *blk_get_dev(const char *ifname, int dev);
  85. struct blk_desc *mg_disk_get_dev(int dev);
  86. int host_get_dev_err(int dev, struct blk_desc **blk_devp);
  87. /* disk/part.c */
  88. int part_get_info(struct blk_desc *dev_desc, int part, disk_partition_t *info);
  89. /**
  90. * part_get_info_whole_disk() - get partition info for the special case of
  91. * a partition occupying the entire disk.
  92. */
  93. int part_get_info_whole_disk(struct blk_desc *dev_desc, disk_partition_t *info);
  94. void part_print(struct blk_desc *dev_desc);
  95. void part_init(struct blk_desc *dev_desc);
  96. void dev_print(struct blk_desc *dev_desc);
  97. /**
  98. * blk_get_device_by_str() - Get a block device given its interface/hw partition
  99. *
  100. * Each interface allocates its own devices and typically struct blk_desc is
  101. * contained with the interface's data structure. There is no global
  102. * numbering for block devices, so the interface name must be provided.
  103. *
  104. * The hardware parition is not related to the normal software partitioning
  105. * of a device - each hardware partition is effectively a separately
  106. * accessible block device. When a hardware parition is selected on MMC the
  107. * other hardware partitions become inaccessible. The same block device is
  108. * used to access all hardware partitions, but its capacity may change when a
  109. * different hardware partition is selected.
  110. *
  111. * When a hardware partition number is given, the block device switches to
  112. * that hardware partition.
  113. *
  114. * @ifname: Interface name (e.g. "ide", "scsi")
  115. * @dev_str: Device and optional hw partition. This can either be a string
  116. * containing the device number (e.g. "2") or the device number
  117. * and hardware partition number (e.g. "2.4") for devices that
  118. * support it (currently only MMC).
  119. * @dev_desc: Returns a pointer to the block device on success
  120. * @return block device number (local to the interface), or -1 on error
  121. */
  122. int blk_get_device_by_str(const char *ifname, const char *dev_str,
  123. struct blk_desc **dev_desc);
  124. /**
  125. * blk_get_device_part_str() - Get a block device and partition
  126. *
  127. * This calls blk_get_device_by_str() to look up a device. It also looks up
  128. * a partition and returns information about it.
  129. *
  130. * @dev_part_str is in the format:
  131. * <dev>.<hw_part>:<part> where <dev> is the device number,
  132. * <hw_part> is the optional hardware partition number and
  133. * <part> is the partition number
  134. *
  135. * If ifname is "hostfs" then this function returns the sandbox host block
  136. * device.
  137. *
  138. * If ifname is ubi, then this function returns 0, with @info set to a
  139. * special UBI device.
  140. *
  141. * If @dev_part_str is NULL or empty or "-", then this function looks up
  142. * the "bootdevice" environment variable and uses that string instead.
  143. *
  144. * If the partition string is empty then the first partition is used. If the
  145. * partition string is "auto" then the first bootable partition is used.
  146. *
  147. * @ifname: Interface name (e.g. "ide", "scsi")
  148. * @dev_part_str: Device and partition string
  149. * @dev_desc: Returns a pointer to the block device on success
  150. * @info: Returns partition information
  151. * @allow_whole_dev: true to allow the user to select partition 0
  152. * (which means the whole device), false to require a valid
  153. * partition number >= 1
  154. * @return partition number, or -1 on error
  155. *
  156. */
  157. int blk_get_device_part_str(const char *ifname, const char *dev_part_str,
  158. struct blk_desc **dev_desc,
  159. disk_partition_t *info, int allow_whole_dev);
  160. /**
  161. * part_get_info_by_name_type() - Search for a partition by name
  162. * for only specified partition type
  163. *
  164. * @param dev_desc - block device descriptor
  165. * @param gpt_name - the specified table entry name
  166. * @param info - returns the disk partition info
  167. * @param part_type - only search in partitions of this type
  168. *
  169. * @return - the partition number on match (starting on 1), -1 on no match,
  170. * otherwise error
  171. */
  172. int part_get_info_by_name_type(struct blk_desc *dev_desc, const char *name,
  173. disk_partition_t *info, int part_type);
  174. /**
  175. * part_get_info_by_name() - Search for a partition by name
  176. * among all available registered partitions
  177. *
  178. * @param dev_desc - block device descriptor
  179. * @param gpt_name - the specified table entry name
  180. * @param info - returns the disk partition info
  181. *
  182. * @return - the partition number on match (starting on 1), -1 on no match,
  183. * otherwise error
  184. */
  185. int part_get_info_by_name(struct blk_desc *dev_desc,
  186. const char *name, disk_partition_t *info);
  187. /**
  188. * part_set_generic_name() - create generic partition like hda1 or sdb2
  189. *
  190. * Helper function for partition tables, which don't hold partition names
  191. * (DOS, ISO). Generates partition name out of the device type and partition
  192. * number.
  193. *
  194. * @dev_desc: pointer to the block device
  195. * @part_num: partition number for which the name is generated
  196. * @name: buffer where the name is written
  197. */
  198. void part_set_generic_name(const struct blk_desc *dev_desc,
  199. int part_num, char *name);
  200. extern const struct block_drvr block_drvr[];
  201. #else
  202. static inline struct blk_desc *blk_get_dev(const char *ifname, int dev)
  203. { return NULL; }
  204. static inline struct blk_desc *mg_disk_get_dev(int dev) { return NULL; }
  205. static inline int part_get_info(struct blk_desc *dev_desc, int part,
  206. disk_partition_t *info) { return -1; }
  207. static inline int part_get_info_whole_disk(struct blk_desc *dev_desc,
  208. disk_partition_t *info)
  209. { return -1; }
  210. static inline void part_print(struct blk_desc *dev_desc) {}
  211. static inline void part_init(struct blk_desc *dev_desc) {}
  212. static inline void dev_print(struct blk_desc *dev_desc) {}
  213. static inline int blk_get_device_by_str(const char *ifname, const char *dev_str,
  214. struct blk_desc **dev_desc)
  215. { return -1; }
  216. static inline int blk_get_device_part_str(const char *ifname,
  217. const char *dev_part_str,
  218. struct blk_desc **dev_desc,
  219. disk_partition_t *info,
  220. int allow_whole_dev)
  221. { *dev_desc = NULL; return -1; }
  222. #endif
  223. /*
  224. * We don't support printing partition information in SPL and only support
  225. * getting partition information in a few cases.
  226. */
  227. #ifdef CONFIG_SPL_BUILD
  228. # define part_print_ptr(x) NULL
  229. # if defined(CONFIG_SPL_EXT_SUPPORT) || defined(CONFIG_SPL_FAT_SUPPORT) || \
  230. defined(CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_PARTITION)
  231. # define part_get_info_ptr(x) x
  232. # else
  233. # define part_get_info_ptr(x) NULL
  234. # endif
  235. #else
  236. #define part_print_ptr(x) x
  237. #define part_get_info_ptr(x) x
  238. #endif
  239. struct part_driver {
  240. const char *name;
  241. int part_type;
  242. const int max_entries; /* maximum number of entries to search */
  243. /**
  244. * get_info() - Get information about a partition
  245. *
  246. * @dev_desc: Block device descriptor
  247. * @part: Partition number (1 = first)
  248. * @info: Returns partition information
  249. */
  250. int (*get_info)(struct blk_desc *dev_desc, int part,
  251. disk_partition_t *info);
  252. /**
  253. * print() - Print partition information
  254. *
  255. * @dev_desc: Block device descriptor
  256. */
  257. void (*print)(struct blk_desc *dev_desc);
  258. /**
  259. * test() - Test if a device contains this partition type
  260. *
  261. * @dev_desc: Block device descriptor
  262. * @return 0 if the block device appears to contain this partition
  263. * type, -ve if not
  264. */
  265. int (*test)(struct blk_desc *dev_desc);
  266. };
  267. /* Declare a new U-Boot partition 'driver' */
  268. #define U_BOOT_PART_TYPE(__name) \
  269. ll_entry_declare(struct part_driver, __name, part_driver)
  270. #include <part_efi.h>
  271. #if CONFIG_IS_ENABLED(EFI_PARTITION)
  272. /* disk/part_efi.c */
  273. /**
  274. * write_gpt_table() - Write the GUID Partition Table to disk
  275. *
  276. * @param dev_desc - block device descriptor
  277. * @param gpt_h - pointer to GPT header representation
  278. * @param gpt_e - pointer to GPT partition table entries
  279. *
  280. * @return - zero on success, otherwise error
  281. */
  282. int write_gpt_table(struct blk_desc *dev_desc,
  283. gpt_header *gpt_h, gpt_entry *gpt_e);
  284. /**
  285. * gpt_fill_pte(): Fill the GPT partition table entry
  286. *
  287. * @param dev_desc - block device descriptor
  288. * @param gpt_h - GPT header representation
  289. * @param gpt_e - GPT partition table entries
  290. * @param partitions - list of partitions
  291. * @param parts - number of partitions
  292. *
  293. * @return zero on success
  294. */
  295. int gpt_fill_pte(struct blk_desc *dev_desc,
  296. gpt_header *gpt_h, gpt_entry *gpt_e,
  297. disk_partition_t *partitions, int parts);
  298. /**
  299. * gpt_fill_header(): Fill the GPT header
  300. *
  301. * @param dev_desc - block device descriptor
  302. * @param gpt_h - GPT header representation
  303. * @param str_guid - disk guid string representation
  304. * @param parts_count - number of partitions
  305. *
  306. * @return - error on str_guid conversion error
  307. */
  308. int gpt_fill_header(struct blk_desc *dev_desc, gpt_header *gpt_h,
  309. char *str_guid, int parts_count);
  310. /**
  311. * gpt_restore(): Restore GPT partition table
  312. *
  313. * @param dev_desc - block device descriptor
  314. * @param str_disk_guid - disk GUID
  315. * @param partitions - list of partitions
  316. * @param parts - number of partitions
  317. *
  318. * @return zero on success
  319. */
  320. int gpt_restore(struct blk_desc *dev_desc, char *str_disk_guid,
  321. disk_partition_t *partitions, const int parts_count);
  322. /**
  323. * is_valid_gpt_buf() - Ensure that the Primary GPT information is valid
  324. *
  325. * @param dev_desc - block device descriptor
  326. * @param buf - buffer which contains the MBR and Primary GPT info
  327. *
  328. * @return - '0' on success, otherwise error
  329. */
  330. int is_valid_gpt_buf(struct blk_desc *dev_desc, void *buf);
  331. /**
  332. * write_mbr_and_gpt_partitions() - write MBR, Primary GPT and Backup GPT
  333. *
  334. * @param dev_desc - block device descriptor
  335. * @param buf - buffer which contains the MBR and Primary GPT info
  336. *
  337. * @return - '0' on success, otherwise error
  338. */
  339. int write_mbr_and_gpt_partitions(struct blk_desc *dev_desc, void *buf);
  340. /**
  341. * gpt_verify_headers() - Function to read and CRC32 check of the GPT's header
  342. * and partition table entries (PTE)
  343. *
  344. * As a side effect if sets gpt_head and gpt_pte so they point to GPT data.
  345. *
  346. * @param dev_desc - block device descriptor
  347. * @param gpt_head - pointer to GPT header data read from medium
  348. * @param gpt_pte - pointer to GPT partition table enties read from medium
  349. *
  350. * @return - '0' on success, otherwise error
  351. */
  352. int gpt_verify_headers(struct blk_desc *dev_desc, gpt_header *gpt_head,
  353. gpt_entry **gpt_pte);
  354. /**
  355. * gpt_verify_partitions() - Function to check if partitions' name, start and
  356. * size correspond to '$partitions' env variable
  357. *
  358. * This function checks if on medium stored GPT data is in sync with information
  359. * provided in '$partitions' environment variable. Specificially, name, start
  360. * and size of the partition is checked.
  361. *
  362. * @param dev_desc - block device descriptor
  363. * @param partitions - partition data read from '$partitions' env variable
  364. * @param parts - number of partitions read from '$partitions' env variable
  365. * @param gpt_head - pointer to GPT header data read from medium
  366. * @param gpt_pte - pointer to GPT partition table enties read from medium
  367. *
  368. * @return - '0' on success, otherwise error
  369. */
  370. int gpt_verify_partitions(struct blk_desc *dev_desc,
  371. disk_partition_t *partitions, int parts,
  372. gpt_header *gpt_head, gpt_entry **gpt_pte);
  373. /**
  374. * get_disk_guid() - Function to read the GUID string from a device's GPT
  375. *
  376. * This function reads the GUID string from a block device whose descriptor
  377. * is provided.
  378. *
  379. * @param dev_desc - block device descriptor
  380. * @param guid - pre-allocated string in which to return the GUID
  381. *
  382. * @return - '0' on success, otherwise error
  383. */
  384. int get_disk_guid(struct blk_desc *dev_desc, char *guid);
  385. #endif
  386. #if CONFIG_IS_ENABLED(DOS_PARTITION)
  387. /**
  388. * is_valid_dos_buf() - Ensure that a DOS MBR image is valid
  389. *
  390. * @param buf - buffer which contains the MBR
  391. *
  392. * @return - '0' on success, otherwise error
  393. */
  394. int is_valid_dos_buf(void *buf);
  395. /**
  396. * write_mbr_partition() - write DOS MBR
  397. *
  398. * @param dev_desc - block device descriptor
  399. * @param buf - buffer which contains the MBR
  400. *
  401. * @return - '0' on success, otherwise error
  402. */
  403. int write_mbr_partition(struct blk_desc *dev_desc, void *buf);
  404. #endif
  405. #endif /* _PART_H */