]> git.karo-electronics.de Git - karo-tx-uboot.git/blobdiff - include/part.h
cmd: add command for accessing the RPM via SMD protocol
[karo-tx-uboot.git] / include / part.h
index 6ca87d0f6317ac250fb893f97a61e964192eefcb..226b5be9df26384818e0299fde0d5f0e9d782646 100644 (file)
 #include <blk.h>
 #include <ide.h>
 
+struct block_drvr {
+       char *name;
+       int (*select_hwpart)(int dev_num, int hwpart);
+};
+
 #define LOG2(x) (((x & 0xaaaaaaaa) ? 1 : 0) + ((x & 0xcccccccc) ? 2 : 0) + \
                 ((x & 0xf0f0f0f0) ? 4 : 0) + ((x & 0xff00ff00) ? 8 : 0) + \
                 ((x & 0xffff0000) ? 16 : 0))
@@ -67,39 +72,14 @@ typedef struct disk_partition {
  *        error occurred.
  */
 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);
-struct blk_desc *usb_stor_get_dev(int dev);
-struct blk_desc *mmc_get_dev(int dev);
 
-/**
- * mmc_select_hwpart() - Select the MMC hardware partiion on an MMC device
- *
- * MMC devices can support partitioning at the hardware level. This is quite
- * separate from the normal idea of software-based partitions. MMC hardware
- * partitions must be explicitly selected. Once selected only the region of
- * the device covered by that partition is accessible.
- *
- * The MMC standard provides for two boot partitions (numbered 1 and 2),
- * rpmb (3), and up to 4 addition general-purpose partitions (4-7).
- *
- * @dev_num:   Block device number (struct blk_desc->dev value)
- * @hwpart:    Hardware partition number to select. 0 means the raw device,
- *             1 is the first partition, 2 is the second, etc.
- * @return 0 if OK, other value for an error
- */
-int mmc_select_hwpart(int dev_num, int hwpart);
-struct blk_desc *systemace_get_dev(int dev);
 struct blk_desc *mg_disk_get_dev(int dev);
-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);
 
 /**
@@ -129,31 +109,58 @@ void dev_print(struct blk_desc *dev_desc);
  */
 int blk_get_device_by_str(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_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:
+ *     <dev>.<hw_part>:<part> where <dev> is the device number,
+ *     <hw_part> is the optional hardware partition number and
+ *     <part> 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);
+extern const struct block_drvr block_drvr[];
 #else
 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; }
-static inline struct blk_desc *scsi_get_dev(int dev) { return NULL; }
-static inline struct blk_desc *usb_stor_get_dev(int dev) { return NULL; }
-static inline struct blk_desc *mmc_get_dev(int dev) { return NULL; }
-static inline int mmc_select_hwpart(int dev_num, int hwpart) { return -1; }
-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 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,
@@ -161,45 +168,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_SPL_FAT_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 <part_efi.h>
 /* 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
@@ -207,10 +233,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