mirror of https://github.com/ARMmbed/mbed-os.git
sfdp_iterate_next_largest_erase_type: return -1 if no erase type is applicable
parent
ac86aff928
commit
e0bd9a1c6a
|
@ -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,
|
||||||
|
|
|
@ -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)
|
||||||
|
|
Loading…
Reference in New Issue