@@ -176,7 +176,7 @@ int sfdp_parse_headers(Callback<int(bd_addr_t, void *, bd_size_t)> sfdp_reader,
176
176
return 0 ;
177
177
}
178
178
179
- int sfdp_parse_sector_map_table (Callback<int (bd_addr_t , void *, bd_size_t )> sfdp_reader, sfdp_smptbl_info &smptbl )
179
+ int sfdp_parse_sector_map_table (Callback<int (bd_addr_t , void *, bd_size_t )> sfdp_reader, sfdp_hdr_info &sfdp_info )
180
180
{
181
181
uint8_t sector_map_table[SFDP_BASIC_PARAMS_TBL_SIZE]; /* Up To 20 DWORDS = 80 Bytes */
182
182
uint32_t tmp_region_size = 0 ;
@@ -185,7 +185,19 @@ int sfdp_parse_sector_map_table(Callback<int(bd_addr_t, void *, bd_size_t)> sfdp
185
185
// Default set to all type bits 1-4 are common
186
186
int min_common_erase_type_bits = SFDP_ERASE_BITMASK_ALL;
187
187
188
- int status = sfdp_reader (smptbl.addr , sector_map_table, smptbl.size );
188
+ // If there's no region map, we have a single region sized the entire device size
189
+ sfdp_info.smptbl .region_size [0 ] = sfdp_info.bptbl .device_size_bytes ;
190
+ sfdp_info.smptbl .region_high_boundary [0 ] = sfdp_info.bptbl .device_size_bytes - 1 ;
191
+
192
+ if (!sfdp_info.smptbl .addr || !sfdp_info.smptbl .size ) {
193
+ tr_debug (" No Sector Map Table" );
194
+ return 0 ;
195
+ }
196
+
197
+ tr_debug (" Parsing Sector Map Table - addr: 0x%" PRIx32 " , Size: %d" , sfdp_info.smptbl .addr , sfdp_info.smptbl .size );
198
+
199
+
200
+ int status = sfdp_reader (sfdp_info.smptbl .addr , sector_map_table, sfdp_info.smptbl .size );
189
201
if (status < 0 ) {
190
202
tr_error (" Sector Map: Table retrieval failed" );
191
203
return -1 ;
@@ -197,38 +209,42 @@ int sfdp_parse_sector_map_table(Callback<int(bd_addr_t, void *, bd_size_t)> sfdp
197
209
return -1 ;
198
210
}
199
211
200
- smptbl.region_cnt = sector_map_table[2 ] + 1 ;
201
- if (smptbl.region_cnt > SFDP_SECTOR_MAP_MAX_REGIONS) {
212
+ sfdp_info. smptbl .region_cnt = sector_map_table[2 ] + 1 ;
213
+ if (sfdp_info. smptbl .region_cnt > SFDP_SECTOR_MAP_MAX_REGIONS) {
202
214
tr_error (" Sector Map: Supporting up to %d regions, current setup to %d regions - fail" ,
203
215
SFDP_SECTOR_MAP_MAX_REGIONS,
204
- smptbl.region_cnt );
216
+ sfdp_info. smptbl .region_cnt );
205
217
return -1 ;
206
218
}
207
219
208
220
// Loop through Regions and set for each one: size, supported erase types, high boundary offset
209
221
// Calculate minimum Common Erase Type for all Regions
210
- for (i_ind = 0 ; i_ind < smptbl.region_cnt ; i_ind++) {
222
+ for (i_ind = 0 ; i_ind < sfdp_info. smptbl .region_cnt ; i_ind++) {
211
223
tmp_region_size = ((*((uint32_t *)§or_map_table[(i_ind + 1 ) * 4 ])) >> 8 ) & 0x00FFFFFF ; // bits 9-32
212
- smptbl.region_size [i_ind] = (tmp_region_size + 1 ) * 256 ; // Region size is 0 based multiple of 256 bytes;
213
- smptbl.region_erase_types_bitfld [i_ind] = sector_map_table[(i_ind + 1 ) * 4 ] & 0x0F ; // bits 1-4
214
- min_common_erase_type_bits &= smptbl.region_erase_types_bitfld [i_ind];
215
- smptbl.region_high_boundary [i_ind] = (smptbl.region_size [i_ind] - 1 ) + prev_boundary;
216
- prev_boundary = smptbl.region_high_boundary [i_ind] + 1 ;
224
+ sfdp_info.smptbl .region_size [i_ind] = (tmp_region_size + 1 ) * 256 ; // Region size is 0 based multiple of 256 bytes;
225
+
226
+ sfdp_info.smptbl .region_erase_types_bitfld [i_ind] = sector_map_table[(i_ind + 1 ) * 4 ] & 0x0F ; // bits 1-4
227
+
228
+ min_common_erase_type_bits &= sfdp_info.smptbl .region_erase_types_bitfld [i_ind];
229
+
230
+ sfdp_info.smptbl .region_high_boundary [i_ind] = (sfdp_info.smptbl .region_size [i_ind] - 1 ) + prev_boundary;
231
+
232
+ prev_boundary = sfdp_info.smptbl .region_high_boundary [i_ind] + 1 ;
217
233
}
218
234
219
235
// Calc minimum Common Erase Size from min_common_erase_type_bits
220
236
uint8_t type_mask = SFDP_ERASE_BITMASK_TYPE1;
221
237
for (i_ind = 0 ; i_ind < 4 ; i_ind++) {
222
238
if (min_common_erase_type_bits & type_mask) {
223
- smptbl.regions_min_common_erase_size = smptbl.erase_type_size_arr [i_ind];
239
+ sfdp_info. smptbl .regions_min_common_erase_size = sfdp_info. smptbl .erase_type_size_arr [i_ind];
224
240
break ;
225
241
}
226
242
type_mask = type_mask << 1 ;
227
243
}
228
244
229
245
if (i_ind == 4 ) {
230
246
// No common erase type was found between regions
231
- smptbl.regions_min_common_erase_size = 0 ;
247
+ sfdp_info. smptbl .regions_min_common_erase_size = 0 ;
232
248
}
233
249
234
250
return 0 ;
0 commit comments