@ -7,6 +7,7 @@
# include <common.h>
# include <command.h>
# include <errno.h>
# include <ide.h>
# include <malloc.h>
# include <part.h>
@ -58,6 +59,22 @@ static const struct block_drvr block_drvr[] = {
DECLARE_GLOBAL_DATA_PTR ;
# ifdef HAVE_BLOCK_DEVICE
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 ;
@ -252,53 +269,31 @@ void dev_print (struct blk_desc *dev_desc)
void init_part ( 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 , struct blk_desc * dev_desc )
{
puts ( " \n Partition Map for " ) ;
switch ( dev_desc - > if_type ) {
case IF_TYPE_IDE :
@ -331,54 +326,24 @@ static void print_part_header(const char *type, struct blk_desc *dev_desc)
}
printf ( " device %d -- Partition Type: %s \n \n " ,
dev_desc - > dev , type ) ;
}
# endif /* any CONFIG_..._PARTITION */
}
void print_part ( 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 ) ;
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 ) ;
drv = part_driver_lookup_type ( dev_desc - > part_type ) ;
if ( ! drv ) {
printf ( " ## Unknown partition table type %x \n " ,
dev_desc - > part_type ) ;
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 */
@ -387,6 +352,7 @@ int get_partition_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,53 +362,19 @@ int get_partition_info(struct blk_desc *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 */