X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;ds=sidebyside;f=include%2Fpart.h;h=6d8f52049db556b240ae0a9a14011df73f582182;hb=bd55eedc07a7f3811cbbd4e934081b9a915af758;hp=4e70d8dba25bd4e7a03a25350f01593f9e23e341;hpb=fb1b7be9538dab7ce69208045cc3b80c6eb57f3b;p=u-boot diff --git a/include/part.h b/include/part.h index 4e70d8dba2..6d8f52049d 100644 --- a/include/part.h +++ b/include/part.h @@ -54,7 +54,7 @@ typedef struct disk_partition { /* Misc _get_dev functions */ #ifdef CONFIG_PARTITIONS /** - * get_dev() - get a pointer to a block device given its type and number + * blk_get_dev() - get a pointer to a block device given its type and number * * Each interface allocates its own devices and typically struct blk_desc is * contained with the interface's data structure. There is no global @@ -66,7 +66,7 @@ typedef struct disk_partition { * @return pointer to the block device, or NULL if not available, or an * error occurred. */ -struct blk_desc *get_dev(const char *ifname, int dev); +struct blk_desc *blk_get_dev(const char *ifname, int dev); struct blk_desc *ide_get_dev(int dev); struct blk_desc *sata_get_dev(int dev); struct blk_desc *scsi_get_dev(int dev); @@ -96,18 +96,77 @@ struct blk_desc *host_get_dev(int dev); int host_get_dev_err(int dev, struct blk_desc **blk_devp); /* disk/part.c */ -int get_partition_info(struct blk_desc *dev_desc, int part, - disk_partition_t *info); -void print_part(struct blk_desc *dev_desc); -void init_part(struct blk_desc *dev_desc); +int part_get_info(struct blk_desc *dev_desc, int part, disk_partition_t *info); +void part_print(struct blk_desc *dev_desc); +void part_init(struct blk_desc *dev_desc); void dev_print(struct blk_desc *dev_desc); -int get_device(const char *ifname, const char *dev_str, - struct blk_desc **dev_desc); -int get_device_and_partition(const char *ifname, const char *dev_part_str, - struct blk_desc **dev_desc, - disk_partition_t *info, int allow_whole_dev); + +/** + * blk_get_device_by_str() - Get a block device given its interface/hw partition + * + * Each interface allocates its own devices and typically struct blk_desc is + * contained with the interface's data structure. There is no global + * numbering for block devices, so the interface name must be provided. + * + * The hardware parition is not related to the normal software partitioning + * of a device - each hardware partition is effectively a separately + * accessible block device. When a hardware parition is selected on MMC the + * other hardware partitions become inaccessible. The same block device is + * used to access all hardware partitions, but its capacity may change when a + * different hardware partition is selected. + * + * When a hardware partition number is given, the block device switches to + * that hardware partition. + * + * @ifname: Interface name (e.g. "ide", "scsi") + * @dev_str: Device and optional hw partition. This can either be a string + * containing the device number (e.g. "2") or the device number + * and hardware partition number (e.g. "2.4") for devices that + * support it (currently only MMC). + * @dev_desc: Returns a pointer to the block device on success + * @return block device number (local to the interface), or -1 on error + */ +int blk_get_device_by_str(const char *ifname, const char *dev_str, + struct blk_desc **dev_desc); + +/** + * blk_get_device_part_str() - Get a block device and partition + * + * This calls blk_get_device_by_str() to look up a device. It also looks up + * a partition and returns information about it. + * + * @dev_part_str is in the format: + * .: where is the device number, + * is the optional hardware partition number and + * is the partition number + * + * If ifname is "hostfs" then this function returns the sandbox host block + * device. + * + * If ifname is ubi, then this function returns 0, with @info set to a + * special UBI device. + * + * If @dev_part_str is NULL or empty or "-", then this function looks up + * the "bootdevice" environment variable and uses that string instead. + * + * If the partition string is empty then the first partition is used. If the + * partition string is "auto" then the first bootable partition is used. + * + * @ifname: Interface name (e.g. "ide", "scsi") + * @dev_part_str: Device and partition string + * @dev_desc: Returns a pointer to the block device on success + * @info: Returns partition information + * @allow_whole_dev: true to allow the user to select partition 0 + * (which means the whole device), false to require a valid + * partition number >= 1 + * @return partition number, or -1 on error + * + */ +int blk_get_device_part_str(const char *ifname, const char *dev_part_str, + struct blk_desc **dev_desc, + disk_partition_t *info, int allow_whole_dev); #else -static inline struct blk_desc *get_dev(const char *ifname, int dev) +static inline struct blk_desc *blk_get_dev(const char *ifname, int dev) { return NULL; } static inline struct blk_desc *ide_get_dev(int dev) { return NULL; } static inline struct blk_desc *sata_get_dev(int dev) { return NULL; } @@ -119,15 +178,15 @@ static inline struct blk_desc *systemace_get_dev(int dev) { return NULL; } static inline struct blk_desc *mg_disk_get_dev(int dev) { return NULL; } static inline struct blk_desc *host_get_dev(int dev) { return NULL; } -static inline int get_partition_info(struct blk_desc *dev_desc, int part, - disk_partition_t *info) { return -1; } -static inline void print_part(struct blk_desc *dev_desc) {} -static inline void init_part(struct blk_desc *dev_desc) {} +static inline int part_get_info(struct blk_desc *dev_desc, int part, + disk_partition_t *info) { return -1; } +static inline void part_print(struct blk_desc *dev_desc) {} +static inline void part_init(struct blk_desc *dev_desc) {} static inline void dev_print(struct blk_desc *dev_desc) {} -static inline int get_device(const char *ifname, const char *dev_str, - struct blk_desc **dev_desc) +static inline int blk_get_device_by_str(const char *ifname, const char *dev_str, + struct blk_desc **dev_desc) { return -1; } -static inline int get_device_and_partition(const char *ifname, +static inline int blk_get_device_part_str(const char *ifname, const char *dev_part_str, struct blk_desc **dev_desc, disk_partition_t *info, @@ -135,45 +194,64 @@ static inline int get_device_and_partition(const char *ifname, { *dev_desc = NULL; return -1; } #endif -#ifdef CONFIG_MAC_PARTITION -/* disk/part_mac.c */ -int get_partition_info_mac(struct blk_desc *dev_desc, int part, - disk_partition_t *info); -void print_part_mac(struct blk_desc *dev_desc); -int test_part_mac(struct blk_desc *dev_desc); +/* + * We don't support printing partition information in SPL and only support + * getting partition information in a few cases. + */ +#ifdef CONFIG_SPL_BUILD +# define part_print_ptr(x) NULL +# if defined(CONFIG_SPL_EXT_SUPPORT) || \ + defined(CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_PARTITION) +# define part_get_info_ptr(x) x +# else +# define part_get_info_ptr(x) NULL +# endif +#else +#define part_print_ptr(x) x +#define part_get_info_ptr(x) x #endif -#ifdef CONFIG_DOS_PARTITION -/* disk/part_dos.c */ -int get_partition_info_dos(struct blk_desc *dev_desc, int part, - disk_partition_t *info); -void print_part_dos(struct blk_desc *dev_desc); -int test_part_dos(struct blk_desc *dev_desc); -#endif -#ifdef CONFIG_ISO_PARTITION -/* disk/part_iso.c */ -int get_partition_info_iso(struct blk_desc *dev_desc, int part, - disk_partition_t *info); -void print_part_iso(struct blk_desc *dev_desc); -int test_part_iso(struct blk_desc *dev_desc); -#endif +struct part_driver { + const char *name; + int part_type; -#ifdef CONFIG_AMIGA_PARTITION -/* disk/part_amiga.c */ -int get_partition_info_amiga(struct blk_desc *dev_desc, int part, - disk_partition_t *info); -void print_part_amiga(struct blk_desc *dev_desc); -int test_part_amiga(struct blk_desc *dev_desc); -#endif + /** + * get_info() - Get information about a partition + * + * @dev_desc: Block device descriptor + * @part: Partition number (1 = first) + * @info: Returns partition information + */ + int (*get_info)(struct blk_desc *dev_desc, int part, + disk_partition_t *info); + + /** + * print() - Print partition information + * + * @dev_desc: Block device descriptor + */ + void (*print)(struct blk_desc *dev_desc); + + /** + * test() - Test if a device contains this partition type + * + * @dev_desc: Block device descriptor + * @return 0 if the block device appears to contain this partition + * type, -ve if not + */ + int (*test)(struct blk_desc *dev_desc); +}; + +/* Declare a new U-Boot partition 'driver' */ +#define U_BOOT_PART_TYPE(__name) \ + ll_entry_declare(struct part_driver, __name, part_driver) #ifdef CONFIG_EFI_PARTITION #include /* disk/part_efi.c */ -int get_partition_info_efi(struct blk_desc *dev_desc, int part, - disk_partition_t *info); /** - * get_partition_info_efi_by_name() - Find the specified GPT partition table entry + * part_get_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 @@ -181,10 +259,8 @@ int get_partition_info_efi(struct blk_desc *dev_desc, int part, * * @return - '0' on match, '-1' on no match, otherwise error */ -int get_partition_info_efi_by_name(struct blk_desc *dev_desc, - const char *name, disk_partition_t *info); -void print_part_efi(struct blk_desc *dev_desc); -int test_part_efi(struct blk_desc *dev_desc); +int part_get_info_efi_by_name(struct blk_desc *dev_desc, + const char *name, disk_partition_t *info); /** * write_gpt_table() - Write the GUID Partition Table to disk