]> git.kernelconcepts.de Git - karo-tx-uboot.git/blobdiff - disk/part_dos.c
arm: mx5: clock: fix PLL_FREQ_MIN() calculation
[karo-tx-uboot.git] / disk / part_dos.c
index 513a54a0944cf5d0953d69d0d83e83b4418f92bd..05c3933c322ea4e9ae15e6a08d8b4922f84d5a94 100644 (file)
@@ -3,23 +3,7 @@
  * Raymond Lo, lo@routefree.com
  * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
  *
- * See file CREDITS for list of people who contributed to this
- * project.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License as
- * published by the Free Software Foundation; either version 2 of
- * the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
- * MA 02111-1307 USA
+ * SPDX-License-Identifier:    GPL-2.0+
  */
 
 /*
 #include <ide.h>
 #include "part_dos.h"
 
-#if defined(CONFIG_CMD_IDE) || \
-    defined(CONFIG_CMD_SATA) || \
-    defined(CONFIG_CMD_SCSI) || \
-    defined(CONFIG_CMD_USB) || \
-    defined(CONFIG_MMC) || \
-    defined(CONFIG_SYSTEMACE)
+#ifdef HAVE_BLOCK_DEVICE
 
 /* Convert char[4] in little endian format to the host format integer
  */
@@ -66,26 +45,39 @@ static inline int is_bootable(dos_partition_t *p)
 }
 
 static void print_one_part(dos_partition_t *p, int ext_part_sector,
-                          int part_num)
+                          int part_num, unsigned int disksig)
 {
        int lba_start = ext_part_sector + le32_to_int (p->start4);
        int lba_size  = le32_to_int (p->size4);
 
-       printf("%5d\t\t%10d\t%10d\t%2x%s%s\n",
-               part_num, lba_start, lba_size, p->sys_ind,
+       printf("%3d\t%-10d\t%-10d\t%08x-%02x\t%02x%s%s\n",
+               part_num, lba_start, lba_size, disksig, part_num, p->sys_ind,
                (is_extended(p->sys_ind) ? " Extd" : ""),
                (is_bootable(p) ? " Boot" : ""));
 }
 
 static int test_block_type(unsigned char *buffer)
 {
+       int slot;
+       struct dos_partition *p;
+
        if((buffer[DOS_PART_MAGIC_OFFSET + 0] != 0x55) ||
            (buffer[DOS_PART_MAGIC_OFFSET + 1] != 0xaa) ) {
                return (-1);
        } /* no DOS Signature at all */
-       if (strncmp((char *)&buffer[DOS_PBR_FSTYPE_OFFSET],"FAT",3)==0 ||
-           strncmp((char *)&buffer[DOS_PBR32_FSTYPE_OFFSET],"FAT32",5)==0) {
-               return DOS_PBR; /* is PBR */
+       p = (struct dos_partition *)&buffer[DOS_PART_TBL_OFFSET];
+       for (slot = 0; slot < 3; slot++) {
+               if (p->boot_ind != 0 && p->boot_ind != 0x80) {
+                       if (!slot &&
+                           (strncmp((char *)&buffer[DOS_PBR_FSTYPE_OFFSET],
+                                    "FAT", 3) == 0 ||
+                            strncmp((char *)&buffer[DOS_PBR32_FSTYPE_OFFSET],
+                                    "FAT32", 5) == 0)) {
+                               return DOS_PBR; /* is PBR */
+                       } else {
+                               return -1;
+                       }
+               }
        }
        return DOS_MBR;     /* Is MBR */
 }
@@ -108,7 +100,7 @@ int test_part_dos (block_dev_desc_t *dev_desc)
  */
 static void print_partition_extended(block_dev_desc_t *dev_desc,
                                     int ext_part_sector, int relative,
-                                    int part_num)
+                                    int part_num, unsigned int disksig)
 {
        ALLOC_CACHE_ALIGN_BUFFER(unsigned char, buffer, dev_desc->blksz);
        dos_partition_t *pt;
@@ -127,6 +119,9 @@ static void print_partition_extended(block_dev_desc_t *dev_desc,
                return;
        }
 
+       if (!ext_part_sector)
+               disksig = le32_to_int(&buffer[DOS_PART_DISKSIG_OFFSET]);
+
        /* Print all primary/logical partitions */
        pt = (dos_partition_t *) (buffer + DOS_PART_TBL_OFFSET);
        for (i = 0; i < 4; i++, pt++) {
@@ -137,7 +132,7 @@ static void print_partition_extended(block_dev_desc_t *dev_desc,
 
                if ((pt->sys_ind != 0) &&
                    (ext_part_sector == 0 || !is_extended (pt->sys_ind)) ) {
-                       print_one_part(pt, ext_part_sector, part_num);
+                       print_one_part(pt, ext_part_sector, part_num, disksig);
                }
 
                /* Reverse engr the fdisk part# assignment rule! */
@@ -155,7 +150,7 @@ static void print_partition_extended(block_dev_desc_t *dev_desc,
 
                        print_partition_extended(dev_desc, lba_start,
                                ext_part_sector == 0  ? lba_start : relative,
-                               part_num);
+                               part_num, disksig);
                }
        }
 
@@ -262,8 +257,8 @@ static int get_partition_info_extended (block_dev_desc_t *dev_desc, int ext_part
 
 void print_part_dos (block_dev_desc_t *dev_desc)
 {
-       printf("Partition     Start Sector     Num Sectors     Type\n");
-       print_partition_extended(dev_desc, 0, 0, 1);
+       printf("Part\tStart Sector\tNum Sectors\tUUID\t\tType\n");
+       print_partition_extended(dev_desc, 0, 0, 1, 0);
 }
 
 int get_partition_info_dos (block_dev_desc_t *dev_desc, int part, disk_partition_t * info)