@@ -176,7 +176,7 @@ int sfdp_parse_headers(Callback<int(bd_addr_t, void *, bd_size_t)> sfdp_reader,
176176 return 0 ;
177177}
178178
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 )
180180{
181181 uint8_t sector_map_table[SFDP_BASIC_PARAMS_TBL_SIZE]; /* Up To 20 DWORDS = 80 Bytes */
182182 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
185185 // Default set to all type bits 1-4 are common
186186 int min_common_erase_type_bits = SFDP_ERASE_BITMASK_ALL;
187187
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 );
189201 if (status < 0 ) {
190202 tr_error (" Sector Map: Table retrieval failed" );
191203 return -1 ;
@@ -197,38 +209,42 @@ int sfdp_parse_sector_map_table(Callback<int(bd_addr_t, void *, bd_size_t)> sfdp
197209 return -1 ;
198210 }
199211
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) {
202214 tr_error (" Sector Map: Supporting up to %d regions, current setup to %d regions - fail" ,
203215 SFDP_SECTOR_MAP_MAX_REGIONS,
204- smptbl.region_cnt );
216+ sfdp_info. smptbl .region_cnt );
205217 return -1 ;
206218 }
207219
208220 // Loop through Regions and set for each one: size, supported erase types, high boundary offset
209221 // 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++) {
211223 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 ;
217233 }
218234
219235 // Calc minimum Common Erase Size from min_common_erase_type_bits
220236 uint8_t type_mask = SFDP_ERASE_BITMASK_TYPE1;
221237 for (i_ind = 0 ; i_ind < 4 ; i_ind++) {
222238 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];
224240 break ;
225241 }
226242 type_mask = type_mask << 1 ;
227243 }
228244
229245 if (i_ind == 4 ) {
230246 // 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 ;
232248 }
233249
234250 return 0 ;
0 commit comments