Fix off-by-one errors in calculating UFM start page.

This commit is contained in:
William D. Jones 2023-05-05 02:00:35 -04:00
parent d8bc361e7f
commit 5e98333a8d
1 changed files with 11 additions and 7 deletions

View File

@ -1294,9 +1294,13 @@ uint16_t Lattice::getUFMStartPageFromJEDEC(JedParser *_jed, int id)
/* In general, Lattice tools try to fill UFM from the highest /* In general, Lattice tools try to fill UFM from the highest
page to lowest. JEDEC files will give a starting bit offset. */ page to lowest. JEDEC files will give a starting bit offset. */
uint32_t bit_offset = _jed->offset_for_section(id); uint32_t bit_offset = _jed->offset_for_section(id);
/* Convert to starting page, which seems to be one more than the number /* Convert to starting page, relative to Configuration Flash's page 0.
of Configuration Flash pages, based on looking at Diamond-generated For 7000 parts only, first UFM page starts 16 bytes (1 page) after
JEDECs. */ the last Configuration Flash page, based on looking at
Diamond-generated JEDECs.
For all other parts, the first UFM page immediately follows the last
Configuration Flash page. */
uint16_t raw_page_offset = bit_offset / 128; uint16_t raw_page_offset = bit_offset / 128;
/* Raw page offsets won't overlap- see Lattice TN-02155, page 49. So we /* Raw page offsets won't overlap- see Lattice TN-02155, page 49. So we
@ -1308,13 +1312,13 @@ uint16_t Lattice::getUFMStartPageFromJEDEC(JedParser *_jed, int id)
if(raw_page_offset > 9211) { if(raw_page_offset > 9211) {
return raw_page_offset - 9211 - 1; // 7000 return raw_page_offset - 9211 - 1; // 7000
} else if(raw_page_offset > 5758) { } else if(raw_page_offset > 5758) {
return raw_page_offset - 5758 - 1; // 4000, 2000U return raw_page_offset - 5758; // 4000, 2000U
} else if(raw_page_offset > 3198) { } else if(raw_page_offset > 3198) {
return raw_page_offset - 3198 - 1; // 2000, 1200U return raw_page_offset - 3198; // 2000, 1200U
} else if(raw_page_offset > 2175) { } else if(raw_page_offset > 2175) {
return raw_page_offset - 2175 - 1; // 1200, 640U return raw_page_offset - 2175; // 1200, 640U
} else if(raw_page_offset > 1151) { } else if(raw_page_offset > 1151) {
return raw_page_offset - 1151 - 1; // 640 return raw_page_offset - 1151; // 640
} else { } else {
// 256- We should bail if we get here! No UFM! // 256- We should bail if we get here! No UFM!
return 0xffff; return 0xffff;