sfdp_iterate_next_largest_erase_type: return -1 if no erase type is applicable

pull/13947/head
Lingkai Dong 2020-11-25 13:28:13 +00:00
parent ac86aff928
commit e0bd9a1c6a
2 changed files with 6 additions and 12 deletions

View File

@ -141,7 +141,7 @@ int sfdp_find_addr_region(bd_addr_t offset, const sfdp_hdr_info &sfdp_info);
* @param region Region number * @param region Region number
* @param smptbl Information about different erase types * @param smptbl Information about different erase types
* *
* @return Largest erase type * @return Largest erase type, or -1 if none matches the given address and size
*/ */
int sfdp_iterate_next_largest_erase_type(uint8_t bitfield, int sfdp_iterate_next_largest_erase_type(uint8_t bitfield,
int size, int size,

View File

@ -400,30 +400,24 @@ int sfdp_iterate_next_largest_erase_type(uint8_t bitfield,
const sfdp_smptbl_info &smptbl) const sfdp_smptbl_info &smptbl)
{ {
uint8_t type_mask = SFDP_ERASE_BITMASK_TYPE4; uint8_t type_mask = SFDP_ERASE_BITMASK_TYPE4;
int largest_erase_type = 0;
int idx;
unsigned int erase_size; unsigned int erase_size;
for (idx = 3; idx >= 0; idx--) { for (int idx = 3; idx >= 0; idx--) {
if (bitfield & type_mask) { if (bitfield & type_mask) {
largest_erase_type = idx; erase_size = smptbl.erase_type_size_arr[idx];
erase_size = smptbl.erase_type_size_arr[largest_erase_type];
// Criteria: // Criteria:
// * offset is aligned to the type's erase size // * offset is aligned to the type's erase size
// * erase size is no larger than the requested size, // * erase size is no larger than the requested size,
// * erase range does not exceed the region boundary // * erase range does not exceed the region boundary
if ((offset % erase_size == 0) && (size >= erase_size) && if ((offset % erase_size == 0) && (size >= erase_size) &&
(offset + erase_size - 1 <= smptbl.region_high_boundary[region])) { (offset + erase_size - 1 <= smptbl.region_high_boundary[region])) {
break; return idx;
} }
} }
type_mask = type_mask >> 1; type_mask = type_mask >> 1;
} }
if (idx == -1) { tr_error("No erase type was found for current region addr");
tr_error("No erase type was found for current region addr"); return -1;
}
return largest_erase_type;
} }
int sfdp_detect_device_density(uint8_t *bptbl_ptr, sfdp_bptbl_info &bptbl_info) int sfdp_detect_device_density(uint8_t *bptbl_ptr, sfdp_bptbl_info &bptbl_info)