@ -6,13 +6,9 @@
*/
/*
* Problems with CONFIG_SYS_64BIT_LBA :
*
* struct disk_partition . start in include / part . h is sized as ulong .
* When CONFIG_SYS_64BIT_LBA is activated , lbaint_t changes from ulong to uint64_t .
* For now , it is cast back to ulong at assignment .
*
* This limits the maximum size of addressable storage to < 2 Terra Bytes
* NOTE :
* when CONFIG_SYS_64BIT_LBA is not defined , lbaint_t is 32 bits ; this
* limits the maximum size of addressable storage to < 2 Terra Bytes
*/
# include <asm/unaligned.h>
# include <common.h>
@ -43,8 +39,8 @@ 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 , unsigned long long lba ,
gpt_header * pgpt_head , gpt_entry * * pgpt_pte ) ;
static int is_gpt_valid ( block_dev_desc_t * 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 int is_pte_valid ( gpt_entry * pte ) ;
@ -169,10 +165,10 @@ int get_partition_info_efi(block_dev_desc_t * dev_desc, int part,
return - 1 ;
}
/* The ulong casting limits the maximum disk size to 2 TB */
info - > start = ( u64 ) le64_to_cpu ( gpt_pte [ part - 1 ] . starting_lba ) ;
/* The 'lbaint_t' casting may limit the maximum disk size to 2 TB */
info - > start = ( lbaint_t ) le64_to_cpu ( gpt_pte [ part - 1 ] . starting_lba ) ;
/* The ending LBA is inclusive, to calculate size, add 1 to it */
info - > size = ( ( u64 ) le64_to_cpu ( gpt_pte [ part - 1 ] . ending_lba ) + 1 )
info - > size = ( lbaint_t ) le64_to_cpu ( gpt_pte [ part - 1 ] . ending_lba ) + 1
- info - > start ;
info - > blksz = dev_desc - > blksz ;
@ -279,12 +275,14 @@ int write_gpt_table(block_dev_desc_t *dev_desc,
gpt_h - > header_crc32 = cpu_to_le32 ( calc_crc32 ) ;
if ( dev_desc - > block_write ( dev_desc - > dev ,
le32_to_cpu ( gpt_h - > last_usable_lba ) + 1 ,
( 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 - > dev ,
le32_to_cpu ( gpt_h - > my_lba ) , 1 , gpt_h ) ! = 1 )
( lbaint_t ) le64_to_cpu ( gpt_h - > my_lba ) , 1 ,
gpt_h ) ! = 1 )
goto err ;
debug ( " GPT successfully written to block device! \n " ) ;
@ -298,9 +296,10 @@ int write_gpt_table(block_dev_desc_t *dev_desc,
int gpt_fill_pte ( gpt_header * gpt_h , gpt_entry * gpt_e ,
disk_partition_t * partitions , int parts )
{
u32 offset = ( u32 ) le32_to_cpu ( gpt_h - > first_usable_lba ) ;
ulong start ;
u32 last_usable_lba = ( u32 ) le32_to_cpu ( gpt_h - > last_usable_lba ) ;
lbaint_t offset = ( lbaint_t ) le64_to_cpu ( gpt_h - > first_usable_lba ) ;
lbaint_t start ;
lbaint_t last_usable_lba = ( lbaint_t )
le64_to_cpu ( gpt_h - > last_usable_lba ) ;
int i , k ;
size_t efiname_len , dosname_len ;
# ifdef CONFIG_PARTITION_UUIDS
@ -364,7 +363,8 @@ int gpt_fill_pte(gpt_header *gpt_h, gpt_entry *gpt_e,
gpt_e [ i ] . partition_name [ k ] =
( efi_char16_t ) ( partitions [ i ] . name [ k ] ) ;
debug ( " %s: name: %s offset[%d]: 0x%x size[%d]: 0x " LBAF " \n " ,
debug ( " %s: name: %s offset[%d]: 0x " LBAF
" size[%d]: 0x " LBAF " \n " ,
__func__ , partitions [ i ] . name , i ,
offset , i , partitions [ i ] . size ) ;
}
@ -488,12 +488,12 @@ 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 , unsigned long long lba ,
gpt_header * pgpt_head , gpt_entry * * pgpt_pte )
static int is_gpt_valid ( block_dev_desc_t * dev_desc , u64 lba ,
gpt_header * pgpt_head , gpt_entry * * pgpt_pte )
{
u32 crc32_backup = 0 ;
u32 calc_crc32 ;
unsigned long long lastlba ;
u64 lastlba ;
if ( ! dev_desc | | ! pgpt_head ) {
printf ( " %s: Invalid Argument(s) \n " , __func__ ) ;
@ -501,7 +501,8 @@ static int is_gpt_valid(block_dev_desc_t * dev_desc, unsigned long long lba,
}
/* Read GPT Header from device */
if ( dev_desc - > block_read ( dev_desc - > dev , lba , 1 , pgpt_head ) ! = 1 ) {
if ( dev_desc - > block_read ( dev_desc - > dev , ( lbaint_t ) lba , 1 , pgpt_head )
! = 1 ) {
printf ( " *** ERROR: Can't read GPT header *** \n " ) ;
return 0 ;
}
@ -540,7 +541,7 @@ static int is_gpt_valid(block_dev_desc_t * dev_desc, unsigned long long lba,
}
/* Check the first_usable_lba and last_usable_lba are within the disk. */
lastlba = ( unsigned long long ) dev_desc - > lba ;
lastlba = ( u64 ) dev_desc - > lba ;
if ( le64_to_cpu ( pgpt_head - > first_usable_lba ) > lastlba ) {
printf ( " GPT: first_usable_lba incorrect: %llX > %llX \n " ,
le64_to_cpu ( pgpt_head - > first_usable_lba ) , lastlba ) ;
@ -548,7 +549,7 @@ static int is_gpt_valid(block_dev_desc_t * dev_desc, unsigned long long lba,
}
if ( le64_to_cpu ( pgpt_head - > last_usable_lba ) > lastlba ) {
printf ( " GPT: last_usable_lba incorrect: %llX > %llX \n " ,
( u64 ) le64_to_cpu ( pgpt_head - > last_usable_lba ) , lastlba ) ;
le64_to_cpu ( pgpt_head - > last_usable_lba ) , lastlba ) ;
return 0 ;
}
@ -625,7 +626,7 @@ static gpt_entry *alloc_read_gpt_entries(block_dev_desc_t * dev_desc,
/* Read GPT Entries from device */
blk_cnt = BLOCK_CNT ( count , dev_desc ) ;
if ( dev_desc - > block_read ( dev_desc - > dev ,
le64_to_cpu ( pgpt_head - > partition_entry_lba ) ,
( lbaint_t ) le64_to_cpu ( pgpt_head - > partition_entry_lba ) ,
( lbaint_t ) ( blk_cnt ) , pte )
! = blk_cnt ) {