diff options
Diffstat (limited to 'disk')
-rw-r--r-- | disk/part.c | 230 | ||||
-rw-r--r-- | disk/part_amiga.c | 47 | ||||
-rw-r--r-- | disk/part_dos.c | 66 | ||||
-rw-r--r-- | disk/part_efi.c | 101 | ||||
-rw-r--r-- | disk/part_iso.c | 72 | ||||
-rw-r--r-- | disk/part_mac.c | 58 |
6 files changed, 276 insertions, 298 deletions
diff --git a/disk/part.c b/disk/part.c index 1935b28841..2a46050392 100644 --- a/disk/part.c +++ b/disk/part.c @@ -7,6 +7,7 @@ #include <common.h> #include <command.h> +#include <errno.h> #include <ide.h> #include <malloc.h> #include <part.h> @@ -22,7 +23,7 @@ struct block_drvr { char *name; - block_dev_desc_t* (*get_dev)(int dev); + struct blk_desc* (*get_dev)(int dev); int (*select_hwpart)(int dev_num, int hwpart); }; @@ -58,10 +59,26 @@ static const struct block_drvr block_drvr[] = { DECLARE_GLOBAL_DATA_PTR; #ifdef HAVE_BLOCK_DEVICE -static block_dev_desc_t *get_dev_hwpart(const char *ifname, int dev, int hwpart) +static struct part_driver *part_driver_lookup_type(int part_type) +{ + struct part_driver *drv = + ll_entry_start(struct part_driver, part_driver); + const int n_ents = ll_entry_count(struct part_driver, part_driver); + struct part_driver *entry; + + for (entry = drv; entry != drv + n_ents; entry++) { + if (part_type == entry->part_type) + return entry; + } + + /* Not found */ + return NULL; +} + +static struct blk_desc *get_dev_hwpart(const char *ifname, int dev, int hwpart) { const struct block_drvr *drvr = block_drvr; - block_dev_desc_t* (*reloc_get_dev)(int dev); + struct blk_desc* (*reloc_get_dev)(int dev); int (*select_hwpart)(int dev_num, int hwpart); char *name; int ret; @@ -84,14 +101,14 @@ static block_dev_desc_t *get_dev_hwpart(const char *ifname, int dev, int hwpart) select_hwpart += gd->reloc_off; #endif if (strncmp(ifname, name, strlen(name)) == 0) { - block_dev_desc_t *dev_desc = reloc_get_dev(dev); + struct blk_desc *dev_desc = reloc_get_dev(dev); if (!dev_desc) return NULL; if (hwpart == 0 && !select_hwpart) return dev_desc; if (!select_hwpart) return NULL; - ret = select_hwpart(dev_desc->dev, hwpart); + ret = select_hwpart(dev_desc->devnum, hwpart); if (ret < 0) return NULL; return dev_desc; @@ -101,17 +118,17 @@ static block_dev_desc_t *get_dev_hwpart(const char *ifname, int dev, int hwpart) return NULL; } -block_dev_desc_t *get_dev(const char *ifname, int dev) +struct blk_desc *blk_get_dev(const char *ifname, int dev) { return get_dev_hwpart(ifname, dev, 0); } #else -block_dev_desc_t *get_dev_hwpart(const char *ifname, int dev, int hwpart) +struct blk_desc *get_dev_hwpart(const char *ifname, int dev, int hwpart) { return NULL; } -block_dev_desc_t *get_dev(const char *ifname, int dev) +struct blk_desc *blk_get_dev(const char *ifname, int dev) { return NULL; } @@ -144,7 +161,7 @@ static lba512_t lba512_muldiv(lba512_t block_count, lba512_t mul_by, lba512_t di return bc_quot * mul_by + (bc_rem * mul_by) / div_by; } -void dev_print (block_dev_desc_t *dev_desc) +void dev_print (struct blk_desc *dev_desc) { lba512_t lba512; /* number of blocks if 512bytes block size */ @@ -250,55 +267,33 @@ void dev_print (block_dev_desc_t *dev_desc) #ifdef HAVE_BLOCK_DEVICE -void init_part(block_dev_desc_t *dev_desc) +void part_init(struct blk_desc *dev_desc) { -#ifdef CONFIG_ISO_PARTITION - if (test_part_iso(dev_desc) == 0) { - dev_desc->part_type = PART_TYPE_ISO; - return; - } -#endif + struct part_driver *drv = + ll_entry_start(struct part_driver, part_driver); + const int n_ents = ll_entry_count(struct part_driver, part_driver); + struct part_driver *entry; -#ifdef CONFIG_MAC_PARTITION - if (test_part_mac(dev_desc) == 0) { - dev_desc->part_type = PART_TYPE_MAC; - return; - } -#endif - -/* must be placed before DOS partition detection */ -#ifdef CONFIG_EFI_PARTITION - if (test_part_efi(dev_desc) == 0) { - dev_desc->part_type = PART_TYPE_EFI; - return; - } -#endif - -#ifdef CONFIG_DOS_PARTITION - if (test_part_dos(dev_desc) == 0) { - dev_desc->part_type = PART_TYPE_DOS; - return; - } -#endif - -#ifdef CONFIG_AMIGA_PARTITION - if (test_part_amiga(dev_desc) == 0) { - dev_desc->part_type = PART_TYPE_AMIGA; - return; - } -#endif dev_desc->part_type = PART_TYPE_UNKNOWN; + for (entry = drv; entry != drv + n_ents; entry++) { + int ret; + + ret = entry->test(dev_desc); + debug("%s: try '%s': ret=%d\n", __func__, entry->name, ret); + if (!ret) { + dev_desc->part_type = entry->part_type; + break; + } + } } - +static void print_part_header(const char *type, struct blk_desc *dev_desc) +{ #if defined(CONFIG_MAC_PARTITION) || \ defined(CONFIG_DOS_PARTITION) || \ defined(CONFIG_ISO_PARTITION) || \ defined(CONFIG_AMIGA_PARTITION) || \ defined(CONFIG_EFI_PARTITION) - -static void print_part_header(const char *type, block_dev_desc_t *dev_desc) -{ puts ("\nPartition Map for "); switch (dev_desc->if_type) { case IF_TYPE_IDE: @@ -330,63 +325,34 @@ static void print_part_header(const char *type, block_dev_desc_t *dev_desc) break; } printf (" device %d -- Partition Type: %s\n\n", - dev_desc->dev, type); -} - + dev_desc->devnum, type); #endif /* any CONFIG_..._PARTITION */ +} -void print_part(block_dev_desc_t * dev_desc) +void part_print(struct blk_desc *dev_desc) { + struct part_driver *drv; - switch (dev_desc->part_type) { -#ifdef CONFIG_MAC_PARTITION - case PART_TYPE_MAC: - PRINTF ("## Testing for valid MAC partition ##\n"); - print_part_header ("MAC", dev_desc); - print_part_mac (dev_desc); - return; -#endif -#ifdef CONFIG_DOS_PARTITION - case PART_TYPE_DOS: - PRINTF ("## Testing for valid DOS partition ##\n"); - print_part_header ("DOS", dev_desc); - print_part_dos (dev_desc); - return; -#endif - -#ifdef CONFIG_ISO_PARTITION - case PART_TYPE_ISO: - PRINTF ("## Testing for valid ISO Boot partition ##\n"); - print_part_header ("ISO", dev_desc); - print_part_iso (dev_desc); + drv = part_driver_lookup_type(dev_desc->part_type); + if (!drv) { + printf("## Unknown partition table type %x\n", + dev_desc->part_type); return; -#endif - -#ifdef CONFIG_AMIGA_PARTITION - case PART_TYPE_AMIGA: - PRINTF ("## Testing for a valid Amiga partition ##\n"); - print_part_header ("AMIGA", dev_desc); - print_part_amiga (dev_desc); - return; -#endif - -#ifdef CONFIG_EFI_PARTITION - case PART_TYPE_EFI: - PRINTF ("## Testing for valid EFI partition ##\n"); - print_part_header ("EFI", dev_desc); - print_part_efi (dev_desc); - return; -#endif } - puts ("## Unknown partition table\n"); + + PRINTF("## Testing for valid %s partition ##\n", drv->name); + print_part_header(drv->name, dev_desc); + if (drv->print) + drv->print(dev_desc); } #endif /* HAVE_BLOCK_DEVICE */ -int get_partition_info(block_dev_desc_t *dev_desc, int part, +int part_get_info(struct blk_desc *dev_desc, int part, disk_partition_t *info) { #ifdef HAVE_BLOCK_DEVICE + struct part_driver *drv; #ifdef CONFIG_PARTITION_UUIDS /* The common case is no UUID support */ @@ -396,61 +362,27 @@ int get_partition_info(block_dev_desc_t *dev_desc, int part, info->type_guid[0] = 0; #endif - switch (dev_desc->part_type) { -#ifdef CONFIG_MAC_PARTITION - case PART_TYPE_MAC: - if (get_partition_info_mac(dev_desc, part, info) == 0) { - PRINTF("## Valid MAC partition found ##\n"); - return 0; - } - break; -#endif - -#ifdef CONFIG_DOS_PARTITION - case PART_TYPE_DOS: - if (get_partition_info_dos(dev_desc, part, info) == 0) { - PRINTF("## Valid DOS partition found ##\n"); - return 0; - } - break; -#endif - -#ifdef CONFIG_ISO_PARTITION - case PART_TYPE_ISO: - if (get_partition_info_iso(dev_desc, part, info) == 0) { - PRINTF("## Valid ISO boot partition found ##\n"); - return 0; - } - break; -#endif - -#ifdef CONFIG_AMIGA_PARTITION - case PART_TYPE_AMIGA: - if (get_partition_info_amiga(dev_desc, part, info) == 0) { - PRINTF("## Valid Amiga partition found ##\n"); - return 0; - } - break; -#endif - -#ifdef CONFIG_EFI_PARTITION - case PART_TYPE_EFI: - if (get_partition_info_efi(dev_desc, part, info) == 0) { - PRINTF("## Valid EFI partition found ##\n"); - return 0; - } - break; -#endif - default: - break; + drv = part_driver_lookup_type(dev_desc->part_type); + if (!drv) { + debug("## Unknown partition table type %x\n", + dev_desc->part_type); + return -EPROTONOSUPPORT; + } + if (!drv->get_info) { + PRINTF("## Driver %s does not have the get_info() method\n"); + return -ENOSYS; + } + if (drv->get_info(dev_desc, part, info) == 0) { + PRINTF("## Valid %s partition found ##\n", drv->name); + return 0; } #endif /* HAVE_BLOCK_DEVICE */ return -1; } -int get_device(const char *ifname, const char *dev_hwpart_str, - block_dev_desc_t **dev_desc) +int blk_get_device_by_str(const char *ifname, const char *dev_hwpart_str, + struct blk_desc **dev_desc) { char *ep; char *dup_str = NULL; @@ -500,7 +432,7 @@ int get_device(const char *ifname, const char *dev_hwpart_str, * already loaded. */ if(hwpart != 0) - init_part(*dev_desc); + part_init(*dev_desc); #endif cleanup: @@ -511,8 +443,8 @@ cleanup: #define PART_UNSPECIFIED -2 #define PART_AUTO -1 #define MAX_SEARCH_PARTITIONS 16 -int get_device_and_partition(const char *ifname, const char *dev_part_str, - block_dev_desc_t **dev_desc, +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) { int ret = -1; @@ -525,10 +457,6 @@ int get_device_and_partition(const char *ifname, const char *dev_part_str, int part; disk_partition_t tmpinfo; -#if defined CONFIG_SANDBOX && defined CONFIG_CMD_UBIFS -#error Only one of CONFIG_SANDBOX and CONFIG_CMD_UBIFS may be selected -#endif - #ifdef CONFIG_SANDBOX /* * Special-case a pseudo block device "hostfs", to allow access to the @@ -598,7 +526,7 @@ int get_device_and_partition(const char *ifname, const char *dev_part_str, } /* Look up the device */ - dev = get_device(ifname, dev_str, dev_desc); + dev = blk_get_device_by_str(ifname, dev_str, dev_desc); if (dev < 0) goto cleanup; @@ -675,7 +603,7 @@ int get_device_and_partition(const char *ifname, const char *dev_part_str, * other than "auto", use that partition number directly. */ if (part != PART_AUTO) { - ret = get_partition_info(*dev_desc, part, info); + ret = part_get_info(*dev_desc, part, info); if (ret) { printf("** Invalid partition %d **\n", part); goto cleanup; @@ -687,7 +615,7 @@ int get_device_and_partition(const char *ifname, const char *dev_part_str, */ part = 0; for (p = 1; p <= MAX_SEARCH_PARTITIONS; p++) { - ret = get_partition_info(*dev_desc, p, info); + ret = part_get_info(*dev_desc, p, info); if (ret) continue; diff --git a/disk/part_amiga.c b/disk/part_amiga.c index 57c1b9d055..d4316b858c 100644 --- a/disk/part_amiga.c +++ b/disk/part_amiga.c @@ -126,7 +126,7 @@ static void print_part_info(struct partition_block *p) * the ID AMIGA_ID_RDISK ('RDSK') and needs to have a valid * sum-to-zero checksum */ -struct rigid_disk_block *get_rdisk(block_dev_desc_t *dev_desc) +struct rigid_disk_block *get_rdisk(struct blk_desc *dev_desc) { int i; int limit; @@ -140,7 +140,7 @@ struct rigid_disk_block *get_rdisk(block_dev_desc_t *dev_desc) for (i=0; i<limit; i++) { - ulong res = dev_desc->block_read(dev_desc, i, 1, (ulong *)block_buffer); + ulong res = blk_dread(dev_desc, i, 1, (ulong *)block_buffer); if (res == 1) { struct rigid_disk_block *trdb = (struct rigid_disk_block *)block_buffer; @@ -166,7 +166,7 @@ struct rigid_disk_block *get_rdisk(block_dev_desc_t *dev_desc) * Ridgid disk block */ -struct bootcode_block *get_bootcode(block_dev_desc_t *dev_desc) +struct bootcode_block *get_bootcode(struct blk_desc *dev_desc) { int i; int limit; @@ -182,7 +182,7 @@ struct bootcode_block *get_bootcode(block_dev_desc_t *dev_desc) for (i = 0; i < limit; i++) { - ulong res = dev_desc->block_read(dev_desc, i, 1, (ulong *)block_buffer); + ulong res = blk_dread(dev_desc, i, 1, (ulong *)block_buffer); if (res == 1) { struct bootcode_block *boot = (struct bootcode_block *)block_buffer; @@ -207,27 +207,27 @@ struct bootcode_block *get_bootcode(block_dev_desc_t *dev_desc) * Test if the given partition has an Amiga partition table/Rigid * Disk block */ -int test_part_amiga(block_dev_desc_t *dev_desc) +static int part_test_amiga(struct blk_desc *dev_desc) { struct rigid_disk_block *rdb; struct bootcode_block *bootcode; - PRINTF("test_part_amiga: Testing for an Amiga RDB partition\n"); + PRINTF("part_test_amiga: Testing for an Amiga RDB partition\n"); rdb = get_rdisk(dev_desc); if (rdb) { bootcode = get_bootcode(dev_desc); if (bootcode) - PRINTF("test_part_amiga: bootable Amiga disk\n"); + PRINTF("part_test_amiga: bootable Amiga disk\n"); else - PRINTF("test_part_amiga: non-bootable Amiga disk\n"); + PRINTF("part_test_amiga: non-bootable Amiga disk\n"); return 0; } else { - PRINTF("test_part_amiga: no RDB found\n"); + PRINTF("part_test_amiga: no RDB found\n"); return -1; } @@ -236,7 +236,8 @@ int test_part_amiga(block_dev_desc_t *dev_desc) /* * Find partition number partnum on the given drive. */ -static struct partition_block *find_partition(block_dev_desc_t *dev_desc, int partnum) +static struct partition_block *find_partition(struct blk_desc *dev_desc, + int partnum) { struct rigid_disk_block *rdb; struct partition_block *p; @@ -257,8 +258,7 @@ static struct partition_block *find_partition(block_dev_desc_t *dev_desc, int pa while (block != 0xFFFFFFFF) { - ulong res = dev_desc->block_read(dev_desc, block, 1, - (ulong *)block_buffer); + ulong res = blk_dread(dev_desc, block, 1, (ulong *)block_buffer); if (res == 1) { p = (struct partition_block *)block_buffer; @@ -290,7 +290,8 @@ static struct partition_block *find_partition(block_dev_desc_t *dev_desc, int pa /* * Get info about a partition */ -int get_partition_info_amiga (block_dev_desc_t *dev_desc, int part, disk_partition_t *info) +static int part_get_info_amiga(struct blk_desc *dev_desc, int part, + disk_partition_t *info) { struct partition_block *p = find_partition(dev_desc, part-1); struct amiga_part_geometry *g; @@ -302,7 +303,7 @@ int get_partition_info_amiga (block_dev_desc_t *dev_desc, int part, disk_partiti info->start = g->low_cyl * g->block_per_track * g->surfaces; info->size = (g->high_cyl - g->low_cyl + 1) * g->block_per_track * g->surfaces - 1; info->blksz = rdb.block_bytes; - bcpl_strcpy(info->name, p->drive_name); + bcpl_strcpy((char *)info->name, p->drive_name); disk_type = g->dos_type; @@ -317,7 +318,7 @@ int get_partition_info_amiga (block_dev_desc_t *dev_desc, int part, disk_partiti return 0; } -void print_part_amiga (block_dev_desc_t *dev_desc) +static void part_print_amiga(struct blk_desc *dev_desc) { struct rigid_disk_block *rdb; struct bootcode_block *boot; @@ -328,14 +329,14 @@ void print_part_amiga (block_dev_desc_t *dev_desc) rdb = get_rdisk(dev_desc); if (!rdb) { - PRINTF("print_part_amiga: no rdb found\n"); + PRINTF("part_print_amiga: no rdb found\n"); return; } - PRINTF("print_part_amiga: Scanning partition list\n"); + PRINTF("part_print_amiga: Scanning partition list\n"); block = rdb->partition_list; - PRINTF("print_part_amiga: partition list at 0x%x\n", block); + PRINTF("part_print_amiga: partition list at 0x%x\n", block); printf("Summary: DiskBlockSize: %d\n" " Cylinders : %d\n" @@ -353,7 +354,7 @@ void print_part_amiga (block_dev_desc_t *dev_desc) PRINTF("Trying to load block #0x%X\n", block); - res = dev_desc->block_read(dev_desc, block, 1, (ulong *)block_buffer); + res = blk_dread(dev_desc, block, 1, (ulong *)block_buffer); if (res == 1) { p = (struct partition_block *)block_buffer; @@ -377,4 +378,12 @@ void print_part_amiga (block_dev_desc_t *dev_desc) } } +U_BOOT_PART_TYPE(amiga) = { + .name = "AMIGA", + .part_type = PART_TYPE_AMIGA, + .get_info = part_get_info_amiga, + .print = part_print_amiga, + .test = part_test_amiga, +}; + #endif diff --git a/disk/part_dos.c b/disk/part_dos.c index 08872d6a03..511917a444 100644 --- a/disk/part_dos.c +++ b/disk/part_dos.c @@ -87,11 +87,11 @@ static int test_block_type(unsigned char *buffer) } -int test_part_dos (block_dev_desc_t *dev_desc) +static int part_test_dos(struct blk_desc *dev_desc) { ALLOC_CACHE_ALIGN_BUFFER(unsigned char, buffer, dev_desc->blksz); - if (dev_desc->block_read(dev_desc, 0, 1, (ulong *)buffer) != 1) + if (blk_dread(dev_desc, 0, 1, (ulong *)buffer) != 1) return -1; if (test_block_type(buffer) != DOS_MBR) @@ -102,7 +102,7 @@ int test_part_dos (block_dev_desc_t *dev_desc) /* Print a partition that is relative to its Extended partition table */ -static void print_partition_extended(block_dev_desc_t *dev_desc, +static void print_partition_extended(struct blk_desc *dev_desc, lbaint_t ext_part_sector, lbaint_t relative, int part_num, unsigned int disksig) @@ -111,10 +111,9 @@ static void print_partition_extended(block_dev_desc_t *dev_desc, dos_partition_t *pt; int i; - if (dev_desc->block_read(dev_desc, ext_part_sector, 1, - (ulong *)buffer) != 1) { + if (blk_dread(dev_desc, ext_part_sector, 1, (ulong *)buffer) != 1) { printf ("** Can't read partition table on %d:" LBAFU " **\n", - dev_desc->dev, ext_part_sector); + dev_desc->devnum, ext_part_sector); return; } i=test_block_type(buffer); @@ -167,21 +166,19 @@ static void print_partition_extended(block_dev_desc_t *dev_desc, /* Print a partition that is relative to its Extended partition table */ -static int get_partition_info_extended (block_dev_desc_t *dev_desc, - lbaint_t ext_part_sector, - lbaint_t relative, int part_num, - int which_part, disk_partition_t *info, - unsigned int disksig) +static int part_get_info_extended(struct blk_desc *dev_desc, + lbaint_t ext_part_sector, lbaint_t relative, + int part_num, int which_part, + disk_partition_t *info, unsigned int disksig) { ALLOC_CACHE_ALIGN_BUFFER(unsigned char, buffer, dev_desc->blksz); dos_partition_t *pt; int i; int dos_type; - if (dev_desc->block_read(dev_desc, ext_part_sector, 1, - (ulong *)buffer) != 1) { + if (blk_dread(dev_desc, ext_part_sector, 1, (ulong *)buffer) != 1) { printf ("** Can't read partition table on %d:" LBAFU " **\n", - dev_desc->dev, ext_part_sector); + dev_desc->devnum, ext_part_sector); return -1; } if (buffer[DOS_PART_MAGIC_OFFSET] != 0x55 || @@ -216,24 +213,29 @@ static int get_partition_info_extended (block_dev_desc_t *dev_desc, case IF_TYPE_IDE: case IF_TYPE_SATA: case IF_TYPE_ATAPI: - sprintf ((char *)info->name, "hd%c%d", - 'a' + dev_desc->dev, part_num); + sprintf((char *)info->name, "hd%c%d", + 'a' + dev_desc->devnum, + part_num); break; case IF_TYPE_SCSI: - sprintf ((char *)info->name, "sd%c%d", - 'a' + dev_desc->dev, part_num); + sprintf((char *)info->name, "sd%c%d", + 'a' + dev_desc->devnum, + part_num); break; case IF_TYPE_USB: - sprintf ((char *)info->name, "usbd%c%d", - 'a' + dev_desc->dev, part_num); + sprintf((char *)info->name, "usbd%c%d", + 'a' + dev_desc->devnum, + part_num); break; case IF_TYPE_DOC: - sprintf ((char *)info->name, "docd%c%d", - 'a' + dev_desc->dev, part_num); + sprintf((char *)info->name, "docd%c%d", + 'a' + dev_desc->devnum, + part_num); break; default: - sprintf ((char *)info->name, "xx%c%d", - 'a' + dev_desc->dev, part_num); + sprintf((char *)info->name, "xx%c%d", + 'a' + dev_desc->devnum, + part_num); break; } /* sprintf(info->type, "%d, pt->sys_ind); */ @@ -259,7 +261,7 @@ static int get_partition_info_extended (block_dev_desc_t *dev_desc, lbaint_t lba_start = le32_to_int (pt->start4) + relative; - return get_partition_info_extended (dev_desc, lba_start, + return part_get_info_extended(dev_desc, lba_start, ext_part_sector == 0 ? lba_start : relative, part_num, which_part, info, disksig); } @@ -283,16 +285,24 @@ static int get_partition_info_extended (block_dev_desc_t *dev_desc, return -1; } -void print_part_dos (block_dev_desc_t *dev_desc) +void part_print_dos(struct blk_desc *dev_desc) { 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) +int part_get_info_dos(struct blk_desc *dev_desc, int part, + disk_partition_t *info) { - return get_partition_info_extended(dev_desc, 0, 0, 1, part, info, 0); + return part_get_info_extended(dev_desc, 0, 0, 1, part, info, 0); } +U_BOOT_PART_TYPE(dos) = { + .name = "DOS", + .part_type = PART_TYPE_DOS, + .get_info = part_get_info_ptr(part_get_info_dos), + .print = part_print_ptr(part_print_dos), + .test = part_test_dos, +}; #endif diff --git a/disk/part_efi.c b/disk/part_efi.c index e1b58c54b4..77bdfcbce5 100644 --- a/disk/part_efi.c +++ b/disk/part_efi.c @@ -41,10 +41,10 @@ static inline u32 efi_crc32(const void *buf, u32 len) static int pmbr_part_valid(struct partition *part); static int is_pmbr_valid(legacy_mbr * mbr); -static int is_gpt_valid(block_dev_desc_t *dev_desc, u64 lba, +static int is_gpt_valid(struct blk_desc *dev_desc, u64 lba, gpt_header *pgpt_head, gpt_entry **pgpt_pte); -static gpt_entry *alloc_read_gpt_entries(block_dev_desc_t * dev_desc, - gpt_header * pgpt_head); +static gpt_entry *alloc_read_gpt_entries(struct blk_desc *dev_desc, + gpt_header *pgpt_head); static int is_pte_valid(gpt_entry * pte); static char *print_efiname(gpt_entry *pte) @@ -176,7 +176,7 @@ static void prepare_backup_gpt_header(gpt_header *gpt_h) * Public Functions (include/part.h) */ -void print_part_efi(block_dev_desc_t * dev_desc) +void part_print_efi(struct blk_desc *dev_desc) { ALLOC_CACHE_ALIGN_BUFFER_PAD(gpt_header, gpt_head, 1, dev_desc->blksz); gpt_entry *gpt_pte = NULL; @@ -237,8 +237,8 @@ void print_part_efi(block_dev_desc_t * dev_desc) return; } -int get_partition_info_efi(block_dev_desc_t * dev_desc, int part, - disk_partition_t * info) +int part_get_info_efi(struct blk_desc *dev_desc, int part, + disk_partition_t *info) { ALLOC_CACHE_ALIGN_BUFFER_PAD(gpt_header, gpt_head, 1, dev_desc->blksz); gpt_entry *gpt_pte = NULL; @@ -300,13 +300,13 @@ int get_partition_info_efi(block_dev_desc_t * dev_desc, int part, return 0; } -int get_partition_info_efi_by_name(block_dev_desc_t *dev_desc, +int part_get_info_efi_by_name(struct blk_desc *dev_desc, const char *name, disk_partition_t *info) { int ret; int i; for (i = 1; i < GPT_ENTRY_NUMBERS; i++) { - ret = get_partition_info_efi(dev_desc, i, info); + ret = part_get_info_efi(dev_desc, i, info); if (ret != 0) { /* no more entries in table */ return -1; @@ -319,12 +319,12 @@ int get_partition_info_efi_by_name(block_dev_desc_t *dev_desc, return -2; } -int test_part_efi(block_dev_desc_t * dev_desc) +static int part_test_efi(struct blk_desc *dev_desc) { ALLOC_CACHE_ALIGN_BUFFER_PAD(legacy_mbr, legacymbr, 1, dev_desc->blksz); /* Read legacy MBR from block 0 and validate it */ - if ((dev_desc->block_read(dev_desc, 0, 1, (ulong *)legacymbr) != 1) + if ((blk_dread(dev_desc, 0, 1, (ulong *)legacymbr) != 1) || (is_pmbr_valid(legacymbr) != 1)) { return -1; } @@ -337,7 +337,7 @@ int test_part_efi(block_dev_desc_t * dev_desc) * * @return - zero on success, otherwise error */ -static int set_protective_mbr(block_dev_desc_t *dev_desc) +static int set_protective_mbr(struct blk_desc *dev_desc) { /* Setup the Protective MBR */ ALLOC_CACHE_ALIGN_BUFFER(legacy_mbr, p_mbr, 1); @@ -354,16 +354,16 @@ static int set_protective_mbr(block_dev_desc_t *dev_desc) p_mbr->partition_record[0].nr_sects = (u32) dev_desc->lba - 1; /* Write MBR sector to the MMC device */ - if (dev_desc->block_write(dev_desc, 0, 1, p_mbr) != 1) { + if (blk_dwrite(dev_desc, 0, 1, p_mbr) != 1) { printf("** Can't write to device %d **\n", - dev_desc->dev); + dev_desc->devnum); return -1; } return 0; } -int write_gpt_table(block_dev_desc_t *dev_desc, +int write_gpt_table(struct blk_desc *dev_desc, gpt_header *gpt_h, gpt_entry *gpt_e) { const int pte_blk_cnt = BLOCK_CNT((gpt_h->num_partition_entries @@ -386,31 +386,28 @@ int write_gpt_table(block_dev_desc_t *dev_desc, gpt_h->header_crc32 = cpu_to_le32(calc_crc32); /* Write the First GPT to the block right after the Legacy MBR */ - if (dev_desc->block_write(dev_desc, 1, 1, gpt_h) != 1) + if (blk_dwrite(dev_desc, 1, 1, gpt_h) != 1) goto err; - if (dev_desc->block_write(dev_desc, 2, pte_blk_cnt, gpt_e) + if (blk_dwrite(dev_desc, 2, pte_blk_cnt, gpt_e) != pte_blk_cnt) goto err; prepare_backup_gpt_header(gpt_h); - if (dev_desc->block_write(dev_desc, - (lbaint_t)le64_to_cpu(gpt_h->last_usable_lba) - + 1, - pte_blk_cnt, gpt_e) != pte_blk_cnt) + if (blk_dwrite(dev_desc, (lbaint_t)le64_to_cpu(gpt_h->last_usable_lba) + + 1, pte_blk_cnt, gpt_e) != pte_blk_cnt) goto err; - if (dev_desc->block_write(dev_desc, - (lbaint_t)le64_to_cpu(gpt_h->my_lba), 1, - gpt_h) != 1) + if (blk_dwrite(dev_desc, (lbaint_t)le64_to_cpu(gpt_h->my_lba), 1, + gpt_h) != 1) goto err; debug("GPT successfully written to block device!\n"); return 0; err: - printf("** Can't write to device %d **\n", dev_desc->dev); + printf("** Can't write to device %d **\n", dev_desc->devnum); return -1; } @@ -517,7 +514,7 @@ int gpt_fill_pte(gpt_header *gpt_h, gpt_entry *gpt_e, return 0; } -int gpt_fill_header(block_dev_desc_t *dev_desc, gpt_header *gpt_h, +int gpt_fill_header(struct blk_desc *dev_desc, gpt_header *gpt_h, char *str_guid, int parts_count) { gpt_h->signature = cpu_to_le64(GPT_HEADER_SIGNATURE); @@ -539,7 +536,7 @@ int gpt_fill_header(block_dev_desc_t *dev_desc, gpt_header *gpt_h, return 0; } -int gpt_restore(block_dev_desc_t *dev_desc, char *str_disk_guid, +int gpt_restore(struct blk_desc *dev_desc, char *str_disk_guid, disk_partition_t *partitions, int parts_count) { int ret; @@ -595,7 +592,7 @@ static void gpt_convert_efi_name_to_char(char *s, efi_char16_t *es, int n) } } -int gpt_verify_headers(block_dev_desc_t *dev_desc, gpt_header *gpt_head, +int gpt_verify_headers(struct blk_desc *dev_desc, gpt_header *gpt_head, gpt_entry **gpt_pte) { /* @@ -619,7 +616,7 @@ int gpt_verify_headers(block_dev_desc_t *dev_desc, gpt_header *gpt_head, return 0; } -int gpt_verify_partitions(block_dev_desc_t *dev_desc, +int gpt_verify_partitions(struct blk_desc *dev_desc, disk_partition_t *partitions, int parts, gpt_header *gpt_head, gpt_entry **gpt_pte) { @@ -658,11 +655,13 @@ int gpt_verify_partitions(block_dev_desc_t *dev_desc, gpt_part_size = le64_to_cpu(gpt_e[i].ending_lba) - le64_to_cpu(gpt_e[i].starting_lba) + 1; debug("size(LBA) - GPT: %8llu, ENV: %8llu ", - gpt_part_size, (u64) partitions[i].size); + (unsigned long long)gpt_part_size, + (unsigned long long)partitions[i].size); if (le64_to_cpu(gpt_part_size) != partitions[i].size) { error("Partition %s size: %llu does not match %llu!\n", - efi_str, gpt_part_size, (u64) partitions[i].size); + efi_str, (unsigned long long)gpt_part_size, + (unsigned long long)partitions[i].size); return -1; } @@ -678,12 +677,12 @@ int gpt_verify_partitions(block_dev_desc_t *dev_desc, /* Check if GPT and ENV start LBAs match */ debug("start LBA - GPT: %8llu, ENV: %8llu\n", le64_to_cpu(gpt_e[i].starting_lba), - (u64) partitions[i].start); + (unsigned long long)partitions[i].start); if (le64_to_cpu(gpt_e[i].starting_lba) != partitions[i].start) { error("Partition %s start: %llu does not match %llu!\n", efi_str, le64_to_cpu(gpt_e[i].starting_lba), - (u64) partitions[i].start); + (unsigned long long)partitions[i].start); return -1; } } @@ -691,7 +690,7 @@ int gpt_verify_partitions(block_dev_desc_t *dev_desc, return 0; } -int is_valid_gpt_buf(block_dev_desc_t *dev_desc, void *buf) +int is_valid_gpt_buf(struct blk_desc *dev_desc, void *buf) { gpt_header *gpt_h; gpt_entry *gpt_e; @@ -712,7 +711,7 @@ int is_valid_gpt_buf(block_dev_desc_t *dev_desc, void *buf) return 0; } -int write_mbr_and_gpt_partitions(block_dev_desc_t *dev_desc, void *buf) +int write_mbr_and_gpt_partitions(struct blk_desc *dev_desc, void *buf) { gpt_header *gpt_h; gpt_entry *gpt_e; @@ -737,7 +736,7 @@ int write_mbr_and_gpt_partitions(block_dev_desc_t *dev_desc, void *buf) /* write MBR */ lba = 0; /* MBR is always at 0 */ cnt = 1; /* MBR (1 block) */ - if (dev_desc->block_write(dev_desc, lba, cnt, buf) != cnt) { + if (blk_dwrite(dev_desc, lba, cnt, buf) != cnt) { printf("%s: failed writing '%s' (%d blks at 0x" LBAF ")\n", __func__, "MBR", cnt, lba); return 1; @@ -746,7 +745,7 @@ int write_mbr_and_gpt_partitions(block_dev_desc_t *dev_desc, void *buf) /* write Primary GPT */ lba = GPT_PRIMARY_PARTITION_TABLE_LBA; cnt = 1; /* GPT Header (1 block) */ - if (dev_desc->block_write(dev_desc, lba, cnt, gpt_h) != cnt) { + if (blk_dwrite(dev_desc, lba, cnt, gpt_h) != cnt) { printf("%s: failed writing '%s' (%d blks at 0x" LBAF ")\n", __func__, "Primary GPT Header", cnt, lba); return 1; @@ -754,7 +753,7 @@ int write_mbr_and_gpt_partitions(block_dev_desc_t *dev_desc, void *buf) lba = le64_to_cpu(gpt_h->partition_entry_lba); cnt = gpt_e_blk_cnt; - if (dev_desc->block_write(dev_desc, lba, cnt, gpt_e) != cnt) { + if (blk_dwrite(dev_desc, lba, cnt, gpt_e) != cnt) { printf("%s: failed writing '%s' (%d blks at 0x" LBAF ")\n", __func__, "Primary GPT Entries", cnt, lba); return 1; @@ -765,7 +764,7 @@ int write_mbr_and_gpt_partitions(block_dev_desc_t *dev_desc, void *buf) /* write Backup GPT */ lba = le64_to_cpu(gpt_h->partition_entry_lba); cnt = gpt_e_blk_cnt; - if (dev_desc->block_write(dev_desc, lba, cnt, gpt_e) != cnt) { + if (blk_dwrite(dev_desc, lba, cnt, gpt_e) != cnt) { printf("%s: failed writing '%s' (%d blks at 0x" LBAF ")\n", __func__, "Backup GPT Entries", cnt, lba); return 1; @@ -773,7 +772,7 @@ int write_mbr_and_gpt_partitions(block_dev_desc_t *dev_desc, void *buf) lba = le64_to_cpu(gpt_h->my_lba); cnt = 1; /* GPT Header (1 block) */ - if (dev_desc->block_write(dev_desc, lba, cnt, gpt_h) != cnt) { + if (blk_dwrite(dev_desc, lba, cnt, gpt_h) != cnt) { printf("%s: failed writing '%s' (%d blks at 0x" LBAF ")\n", __func__, "Backup GPT Header", cnt, lba); return 1; @@ -834,7 +833,7 @@ static int is_pmbr_valid(legacy_mbr * mbr) * Description: returns 1 if valid, 0 on error. * If valid, returns pointers to PTEs. */ -static int is_gpt_valid(block_dev_desc_t *dev_desc, u64 lba, +static int is_gpt_valid(struct blk_desc *dev_desc, u64 lba, gpt_header *pgpt_head, gpt_entry **pgpt_pte) { if (!dev_desc || !pgpt_head) { @@ -843,7 +842,7 @@ static int is_gpt_valid(block_dev_desc_t *dev_desc, u64 lba, } /* Read GPT Header from device */ - if (dev_desc->block_read(dev_desc, (lbaint_t)lba, 1, pgpt_head) != 1) { + if (blk_dread(dev_desc, (lbaint_t)lba, 1, pgpt_head) != 1) { printf("*** ERROR: Can't read GPT header ***\n"); return 0; } @@ -876,8 +875,8 @@ static int is_gpt_valid(block_dev_desc_t *dev_desc, u64 lba, * Allocates space for PTEs based on information found in @gpt. * Notes: remember to free pte when you're done! */ -static gpt_entry *alloc_read_gpt_entries(block_dev_desc_t * dev_desc, - gpt_header * pgpt_head) +static gpt_entry *alloc_read_gpt_entries(struct blk_desc *dev_desc, + gpt_header *pgpt_head) { size_t count = 0, blk_cnt; lbaint_t blk; @@ -911,8 +910,7 @@ static gpt_entry *alloc_read_gpt_entries(block_dev_desc_t * dev_desc, /* Read GPT Entries from device */ blk = le64_to_cpu(pgpt_head->partition_entry_lba); blk_cnt = BLOCK_CNT(count, dev_desc); - if (dev_desc->block_read(dev_desc, blk, (lbaint_t)blk_cnt, pte) - != blk_cnt) { + if (blk_dread(dev_desc, blk, (lbaint_t)blk_cnt, pte) != blk_cnt) { printf("*** ERROR: Can't read GPT Entries ***\n"); free(pte); return NULL; @@ -951,4 +949,17 @@ static int is_pte_valid(gpt_entry * pte) return 1; } } + +/* + * Add an 'a_' prefix so it comes before 'dos' in the linker list. We need to + * check EFI first, since a DOS partition is often used as a 'protective MBR' + * with EFI. + */ +U_BOOT_PART_TYPE(a_efi) = { + .name = "EFI", + .part_type = PART_TYPE_EFI, + .get_info = part_get_info_ptr(part_get_info_efi), + .print = part_print_ptr(part_print_efi), + .test = part_test_efi, +}; #endif diff --git a/disk/part_iso.c b/disk/part_iso.c index 5f4bb182dd..b83983badf 100644 --- a/disk/part_iso.c +++ b/disk/part_iso.c @@ -46,7 +46,8 @@ static inline unsigned short le16_to_int(unsigned char *le16) /* only boot records will be listed as valid partitions */ -int get_partition_info_iso_verb(block_dev_desc_t * dev_desc, int part_num, disk_partition_t * info, int verb) +int part_get_info_iso_verb(struct blk_desc *dev_desc, int part_num, + disk_partition_t *info, int verb) { int i,offset,entry_num; unsigned short *chksumbuf; @@ -62,18 +63,18 @@ int get_partition_info_iso_verb(block_dev_desc_t * dev_desc, int part_num, disk_ /* the first sector (sector 0x10) must be a primary volume desc */ blkaddr=PVD_OFFSET; - if (dev_desc->block_read(dev_desc, PVD_OFFSET, 1, (ulong *)tmpbuf) != 1) + if (blk_dread(dev_desc, PVD_OFFSET, 1, (ulong *)tmpbuf) != 1) return -1; if(ppr->desctype!=0x01) { if(verb) printf ("** First descriptor is NOT a primary desc on %d:%d **\n", - dev_desc->dev, part_num); + dev_desc->devnum, part_num); return (-1); } if(strncmp((char *)ppr->stand_ident,"CD001",5)!=0) { if(verb) printf ("** Wrong ISO Ident: %s on %d:%d **\n", - ppr->stand_ident,dev_desc->dev, part_num); + ppr->stand_ident, dev_desc->devnum, part_num); return (-1); } lastsect= ((ppr->firstsek_LEpathtab1_LE & 0x000000ff)<<24) + @@ -84,14 +85,14 @@ int get_partition_info_iso_verb(block_dev_desc_t * dev_desc, int part_num, disk_ PRINTF(" Lastsect:%08lx\n",lastsect); for(i=blkaddr;i<lastsect;i++) { PRINTF("Reading block %d\n", i); - if (dev_desc->block_read(dev_desc, i, 1, (ulong *)tmpbuf) != 1) + if (blk_dread(dev_desc, i, 1, (ulong *)tmpbuf) != 1) return -1; if(ppr->desctype==0x00) break; /* boot entry found */ if(ppr->desctype==0xff) { if(verb) printf ("** No valid boot catalog found on %d:%d **\n", - dev_desc->dev, part_num); + dev_desc->devnum, part_num); return (-1); } } @@ -99,15 +100,15 @@ int get_partition_info_iso_verb(block_dev_desc_t * dev_desc, int part_num, disk_ if(strncmp(pbr->ident_str,"EL TORITO SPECIFICATION",23)!=0) { if(verb) printf ("** Wrong El Torito ident: %s on %d:%d **\n", - pbr->ident_str,dev_desc->dev, part_num); + pbr->ident_str, dev_desc->devnum, part_num); return (-1); } bootaddr=le32_to_int(pbr->pointer); PRINTF(" Boot Entry at: %08lX\n",bootaddr); - if (dev_desc->block_read(dev_desc, bootaddr, 1, (ulong *)tmpbuf) != 1) { + if (blk_dread(dev_desc, bootaddr, 1, (ulong *)tmpbuf) != 1) { if(verb) printf ("** Can't read Boot Entry at %lX on %d:%d **\n", - bootaddr,dev_desc->dev, part_num); + bootaddr, dev_desc->devnum, part_num); return (-1); } chksum=0; @@ -116,21 +117,21 @@ int get_partition_info_iso_verb(block_dev_desc_t * dev_desc, int part_num, disk_ chksum+=((chksumbuf[i] &0xff)<<8)+((chksumbuf[i] &0xff00)>>8); if(chksum!=0) { if(verb) - printf ("** Checksum Error in booting catalog validation entry on %d:%d **\n", - dev_desc->dev, part_num); + printf("** Checksum Error in booting catalog validation entry on %d:%d **\n", + dev_desc->devnum, part_num); return (-1); } if((pve->key[0]!=0x55)||(pve->key[1]!=0xAA)) { if(verb) printf ("** Key 0x55 0xAA error on %d:%d **\n", - dev_desc->dev, part_num); + dev_desc->devnum, part_num); return(-1); } #ifdef CHECK_FOR_POWERPC_PLATTFORM if(pve->platform!=0x01) { if(verb) printf ("** No PowerPC platform CD on %d:%d **\n", - dev_desc->dev, part_num); + dev_desc->devnum, part_num); return(-1); } #endif @@ -143,23 +144,23 @@ int get_partition_info_iso_verb(block_dev_desc_t * dev_desc, int part_num, disk_ case IF_TYPE_SATA: case IF_TYPE_ATAPI: sprintf ((char *)info->name, "hd%c%d", - 'a' + dev_desc->dev, part_num); + 'a' + dev_desc->devnum, part_num); break; case IF_TYPE_SCSI: sprintf ((char *)info->name, "sd%c%d", - 'a' + dev_desc->dev, part_num); + 'a' + dev_desc->devnum, part_num); break; case IF_TYPE_USB: sprintf ((char *)info->name, "usbd%c%d", - 'a' + dev_desc->dev, part_num); + 'a' + dev_desc->devnum, part_num); break; case IF_TYPE_DOC: sprintf ((char *)info->name, "docd%c%d", - 'a' + dev_desc->dev, part_num); + 'a' + dev_desc->devnum, part_num); break; default: sprintf ((char *)info->name, "xx%c%d", - 'a' + dev_desc->dev, part_num); + 'a' + dev_desc->devnum, part_num); break; } /* the bootcatalog (including validation Entry) is limited to 2048Bytes @@ -183,7 +184,7 @@ int get_partition_info_iso_verb(block_dev_desc_t * dev_desc, int part_num, disk_ else { if(verb) printf ("** Partition %d not found on device %d **\n", - part_num,dev_desc->dev); + part_num, dev_desc->devnum); return(-1); } } @@ -191,13 +192,13 @@ int get_partition_info_iso_verb(block_dev_desc_t * dev_desc, int part_num, disk_ * searched w/o succsess */ if(verb) printf ("** Partition %d not found on device %d **\n", - part_num,dev_desc->dev); + part_num, dev_desc->devnum); return(-1); found: if(pide->boot_ind!=0x88) { if(verb) - printf ("** Partition %d is not bootable on device %d **\n", - part_num,dev_desc->dev); + printf("** Partition %d is not bootable on device %d **\n", + part_num, dev_desc->devnum); return (-1); } switch(pide->boot_media) { @@ -216,18 +217,20 @@ found: return 0; } -int get_partition_info_iso(block_dev_desc_t * dev_desc, int part_num, disk_partition_t * info) +static int part_get_info_iso(struct blk_desc *dev_desc, int part_num, + disk_partition_t *info) { - return(get_partition_info_iso_verb(dev_desc, part_num, info, 1)); + return part_get_info_iso_verb(dev_desc, part_num, info, 1); } - -void print_part_iso(block_dev_desc_t * dev_desc) +static void part_print_iso(struct blk_desc *dev_desc) { disk_partition_t info; int i; - if(get_partition_info_iso_verb(dev_desc,0,&info,0)==-1) { - printf("** No boot partition found on device %d **\n",dev_desc->dev); + + if (part_get_info_iso_verb(dev_desc, 0, &info, 0) == -1) { + printf("** No boot partition found on device %d **\n", + dev_desc->devnum); return; } printf("Part Start Sect x Size Type\n"); @@ -236,14 +239,21 @@ void print_part_iso(block_dev_desc_t * dev_desc) printf(" %2d " LBAFU " " LBAFU " %6ld %.32s\n", i, info.start, info.size, info.blksz, info.type); i++; - } while (get_partition_info_iso_verb(dev_desc,i,&info,0)!=-1); + } while (part_get_info_iso_verb(dev_desc, i, &info, 0) != -1); } -int test_part_iso (block_dev_desc_t *dev_desc) +static int part_test_iso(struct blk_desc *dev_desc) { disk_partition_t info; - return(get_partition_info_iso_verb(dev_desc,0,&info,0)); + return part_get_info_iso_verb(dev_desc, 0, &info, 0); } +U_BOOT_PART_TYPE(iso) = { + .name = "ISO", + .part_type = PART_TYPE_ISO, + .get_info = part_get_info_iso, + .print = part_print_iso, + .test = part_test_iso, +}; #endif diff --git a/disk/part_mac.c b/disk/part_mac.c index f3bc8dd555..3952b8d379 100644 --- a/disk/part_mac.c +++ b/disk/part_mac.c @@ -32,13 +32,15 @@ extern ldiv_t ldiv (long int __numer, long int __denom); #endif -static int part_mac_read_ddb (block_dev_desc_t *dev_desc, mac_driver_desc_t *ddb_p); -static int part_mac_read_pdb (block_dev_desc_t *dev_desc, int part, mac_partition_t *pdb_p); +static int part_mac_read_ddb(struct blk_desc *dev_desc, + mac_driver_desc_t *ddb_p); +static int part_mac_read_pdb(struct blk_desc *dev_desc, int part, + mac_partition_t *pdb_p); /* * Test for a valid MAC partition */ -int test_part_mac (block_dev_desc_t *dev_desc) +static int part_test_mac(struct blk_desc *dev_desc) { ALLOC_CACHE_ALIGN_BUFFER(mac_driver_desc_t, ddesc, 1); ALLOC_CACHE_ALIGN_BUFFER(mac_partition_t, mpart, 1); @@ -51,8 +53,7 @@ int test_part_mac (block_dev_desc_t *dev_desc) n = 1; /* assuming at least one partition */ for (i=1; i<=n; ++i) { - if ((dev_desc->block_read(dev_desc, i, 1, - (ulong *)mpart) != 1) || + if ((blk_dread(dev_desc, i, 1, (ulong *)mpart) != 1) || (mpart->signature != MAC_PARTITION_MAGIC) ) { return (-1); } @@ -62,8 +63,7 @@ int test_part_mac (block_dev_desc_t *dev_desc) return (0); } - -void print_part_mac (block_dev_desc_t *dev_desc) +static void part_print_mac(struct blk_desc *dev_desc) { ulong i, n; ALLOC_CACHE_ALIGN_BUFFER(mac_driver_desc_t, ddesc, 1); @@ -105,16 +105,16 @@ void print_part_mac (block_dev_desc_t *dev_desc) char c; printf ("%4ld: ", i); - if (dev_desc->block_read(dev_desc, i, 1, (ulong *)mpart) != 1) { + if (blk_dread(dev_desc, i, 1, (ulong *)mpart) != 1) { printf ("** Can't read Partition Map on %d:%ld **\n", - dev_desc->dev, i); + dev_desc->devnum, i); return; } if (mpart->signature != MAC_PARTITION_MAGIC) { - printf ("** Bad Signature on %d:%ld - " - "expected 0x%04x, got 0x%04x\n", - dev_desc->dev, i, MAC_PARTITION_MAGIC, mpart->signature); + printf("** Bad Signature on %d:%ld - expected 0x%04x, got 0x%04x\n", + dev_desc->devnum, i, MAC_PARTITION_MAGIC, + mpart->signature); return; } @@ -149,9 +149,10 @@ void print_part_mac (block_dev_desc_t *dev_desc) /* * Read Device Descriptor Block */ -static int part_mac_read_ddb (block_dev_desc_t *dev_desc, mac_driver_desc_t *ddb_p) +static int part_mac_read_ddb(struct blk_desc *dev_desc, + mac_driver_desc_t *ddb_p) { - if (dev_desc->block_read(dev_desc, 0, 1, (ulong *)ddb_p) != 1) { + if (blk_dread(dev_desc, 0, 1, (ulong *)ddb_p) != 1) { printf ("** Can't read Driver Desriptor Block **\n"); return (-1); } @@ -169,7 +170,8 @@ static int part_mac_read_ddb (block_dev_desc_t *dev_desc, mac_driver_desc_t *ddb /* * Read Partition Descriptor Block */ -static int part_mac_read_pdb (block_dev_desc_t *dev_desc, int part, mac_partition_t *pdb_p) +static int part_mac_read_pdb(struct blk_desc *dev_desc, int part, + mac_partition_t *pdb_p) { int n = 1; @@ -179,16 +181,16 @@ static int part_mac_read_pdb (block_dev_desc_t *dev_desc, int part, mac_partitio * partition 1 first since this is the only way to * know how many partitions we have. */ - if (dev_desc->block_read(dev_desc, n, 1, (ulong *)pdb_p) != 1) { + if (blk_dread(dev_desc, n, 1, (ulong *)pdb_p) != 1) { printf ("** Can't read Partition Map on %d:%d **\n", - dev_desc->dev, n); + dev_desc->devnum, n); return (-1); } if (pdb_p->signature != MAC_PARTITION_MAGIC) { - printf ("** Bad Signature on %d:%d: " - "expected 0x%04x, got 0x%04x\n", - dev_desc->dev, n, MAC_PARTITION_MAGIC, pdb_p->signature); + printf("** Bad Signature on %d:%d: expected 0x%04x, got 0x%04x\n", + dev_desc->devnum, n, MAC_PARTITION_MAGIC, + pdb_p->signature); return (-1); } @@ -197,9 +199,9 @@ static int part_mac_read_pdb (block_dev_desc_t *dev_desc, int part, mac_partitio if ((part < 1) || (part > pdb_p->map_count)) { printf ("** Invalid partition %d:%d [%d:1...%d:%d only]\n", - dev_desc->dev, part, - dev_desc->dev, - dev_desc->dev, pdb_p->map_count); + dev_desc->devnum, part, + dev_desc->devnum, + dev_desc->devnum, pdb_p->map_count); return (-1); } @@ -210,7 +212,8 @@ static int part_mac_read_pdb (block_dev_desc_t *dev_desc, int part, mac_partitio /* NOTREACHED */ } -int get_partition_info_mac (block_dev_desc_t *dev_desc, int part, disk_partition_t *info) +static int part_get_info_mac(struct blk_desc *dev_desc, int part, + disk_partition_t *info) { ALLOC_CACHE_ALIGN_BUFFER(mac_driver_desc_t, ddesc, 1); ALLOC_CACHE_ALIGN_BUFFER(mac_partition_t, mpart, 1); @@ -233,4 +236,11 @@ int get_partition_info_mac (block_dev_desc_t *dev_desc, int part, disk_partition return (0); } +U_BOOT_PART_TYPE(mac) = { + .name = "MAC", + .part_type = PART_TYPE_MAC, + .get_info = part_get_info_mac, + .print = part_print_mac, + .test = part_test_mac, +}; #endif |