@@ -1213,45 +1213,136 @@ bool Lattice::wr_rd(uint8_t cmd,
12131213 return true ;
12141214}
12151215
1216- typedef struct {
1217- std::string description;
1218- uint8_t offset;
1219- uint8_t size;
1220- std::map<int , std::string> reg_cnt;
1221- } reg_struct_t ;
1222-
12231216#define REG_ENTRY (_description, _offset, _size, ...) \
12241217 {_description, _offset, _size, {__VA_ARGS__}}
12251218
1226- static const std::map<std::string, std::list<reg_struct_t >> reg_content = {
1227- {" StatusRegister" , std::list<reg_struct_t >{
1228- REG_ENTRY (" CRC Error" , 0 , 1 , {0 , " OK" }, {1 , " KO" }),
1229- REG_ENTRY (" ID Verify failed" , 1 , 1 , {0 , " No" }, {1 , " Yes" }),
1230- REG_ENTRY (" Invalid Command" , 2 , 1 , {0 , " No" }, {1 , " Yes" }),
1231- REG_ENTRY (" SPIm Mode Error" , 3 , 1 , {0 , " No" }, {1 , " Yes" }),
1232- REG_ENTRY (" Device locked" , 4 , 1 , {0 , " No" }, {1 , " Yes" }),
1233- REG_ENTRY (" Key Fire" , 5 , 1 , {0 , " No" }, {1 , " Yes" }),
1234- REG_ENTRY (" Alignement Preamble" , 6 , 1 , {0 , " No" }, {1 , " Yes" }),
1235- REG_ENTRY (" Encryption Preamble" , 7 , 1 , {0 , " No" }, {1 , " Yes" }),
1236- REG_ENTRY (" Std Preamble" , 8 , 1 , {0 , " No" }, {1 , " Yes" }),
1237- REG_ENTRY (" HFC" , 9 , 1 , {0 , " No" }, {1 , " Yes" }),
1238- REG_ENTRY (" Memory Cleared" , 15 , 1 , {0 , " No" }, {1 , " Yes" }),
1239- REG_ENTRY (" Device Secured" , 16 , 1 , {0 , " No" }, {1 , " Yes" }),
1240- REG_ENTRY (" Device Configured" , 17 , 1 , {0 , " No" }, {1 , " Yes" }),
1241- REG_ENTRY (" Non-JTAG Mode" , 18 , 1 , {0 , " No" }, {1 , " Yes" }),
1242- REG_ENTRY (" ReadBack Mode" , 19 , 1 , {0 , " No" }, {1 , " Yes" }),
1243- REG_ENTRY (" Bypass Mode" , 20 , 1 , {0 , " No" }, {1 , " Yes" }),
1244- REG_ENTRY (" Flow Trough" , 21 , 1 , {0 , " No" }, {1 , " Yes" }),
1245- REG_ENTRY (" Configuration Mode" , 22 , 1 , {0 , " No" }, {1 , " Yes" }),
1246- REG_ENTRY (" Transparent Mode" , 23 , 1 , {0 , " No" }, {1 , " Yes" }),
1219+ const std::map<int , std::map<std::string, std::list<Lattice::reg_struct_t >>> Lattice::reg_content = {
1220+ {ECP3_FAMILY, {
1221+ {" StatusRegister" , std::list<reg_struct_t >{
1222+ REG_ENTRY (" CRC Error" , 0 , 1 , {0 , " OK" }, {1 , " KO" }),
1223+ REG_ENTRY (" ID Verify failed" , 1 , 1 , {0 , " No" }, {1 , " Yes" }),
1224+ REG_ENTRY (" Invalid Command" , 2 , 1 , {0 , " No" }, {1 , " Yes" }),
1225+ REG_ENTRY (" SPIm Mode Error" , 3 , 1 , {0 , " No" }, {1 , " Yes" }),
1226+ REG_ENTRY (" Device locked" , 4 , 1 , {0 , " No" }, {1 , " Yes" }),
1227+ REG_ENTRY (" Key Fire" , 5 , 1 , {0 , " No" }, {1 , " Yes" }),
1228+ REG_ENTRY (" Alignement Preamble" , 6 , 1 , {0 , " No" }, {1 , " Yes" }),
1229+ REG_ENTRY (" Encryption Preamble" , 7 , 1 , {0 , " No" }, {1 , " Yes" }),
1230+ REG_ENTRY (" Std Preamble" , 8 , 1 , {0 , " No" }, {1 , " Yes" }),
1231+ REG_ENTRY (" HFC" , 9 , 1 , {0 , " No" }, {1 , " Yes" }),
1232+ REG_ENTRY (" Memory Cleared" , 15 , 1 , {0 , " No" }, {1 , " Yes" }),
1233+ REG_ENTRY (" Device Secured" , 16 , 1 , {0 , " No" }, {1 , " Yes" }),
1234+ REG_ENTRY (" Device Configured" , 17 , 1 , {0 , " No" }, {1 , " Yes" }),
1235+ REG_ENTRY (" Non-JTAG Mode" , 18 , 1 , {0 , " No" }, {1 , " Yes" }),
1236+ REG_ENTRY (" ReadBack Mode" , 19 , 1 , {0 , " No" }, {1 , " Yes" }),
1237+ REG_ENTRY (" Bypass Mode" , 20 , 1 , {0 , " No" }, {1 , " Yes" }),
1238+ REG_ENTRY (" Flow Trough" , 21 , 1 , {0 , " No" }, {1 , " Yes" }),
1239+ REG_ENTRY (" Configuration Mode" , 22 , 1 , {0 , " No" }, {1 , " Yes" }),
1240+ REG_ENTRY (" Transparent Mode" , 23 , 1 , {0 , " No" }, {1 , " Yes" }),
1241+ }},
1242+ }},
1243+ {NEXUS_FAMILY, {
1244+ {" StatusRegister" , std::list<reg_struct_t >{
1245+ REG_ENTRY (" Transparent Mode" , 0 , 1 , {0 , " No" }, {1 , " Yes" }),
1246+ REG_ENTRY (" Cfg Target Select" , 1 , 3 ,
1247+ {0 , " SRAM array" },
1248+ {1 , " EFUSE Normal" },
1249+ {2 , " EFUSE Pseudo;" },
1250+ {3 , " EFUSE Safe" }),
1251+ REG_ENTRY (" JTAG Active" , 4 , 1 , {0 , " No" }, {1 , " Yes" }),
1252+ REG_ENTRY (" PWD Protection" , 5 , 1 , {0 , " No" }, {1 , " Yes" }),
1253+ REG_ENTRY (" OTP" , 6 , 1 , {0 , " No" }, {1 , " Yes" }),
1254+ /* [7] Reserved */
1255+ REG_ENTRY (" DONE" , 8 , 1 , {0 , " No" }, {1 , " Yes" }),
1256+ REG_ENTRY (" ISC Enable" , 9 , 1 , {0 , " No" }, {1 , " Yes" }),
1257+ REG_ENTRY (" Write Enable" , 10 , 1 ,
1258+ {0 , " Not Writable" }, {1 , " Writable" }),
1259+ REG_ENTRY (" Read Enable" , 11 , 1 ,
1260+ {0 , " Not Readable" }, {1 , " Readable" }),
1261+ REG_ENTRY (" Busy Flag" , 12 , 1 , {0 , " No" }, {1 , " Yes" }),
1262+ REG_ENTRY (" Fail Flag" , 13 , 1 , {0 , " No" }, {1 , " Yes" }),
1263+ /* [14] Reserved */
1264+ REG_ENTRY (" Decrypt Only" , 15 , 1 , {0 , " No" }, {1 , " Yes" }),
1265+ REG_ENTRY (" PWD Enable" , 16 , 1 , {0 , " No" }, {1 , " Yes" }),
1266+ REG_ENTRY (" PWD All" , 17 , 1 , {0 , " No" }, {1 , " Yes" }),
1267+ REG_ENTRY (" CID EN" , 18 , 1 , {0 , " No" }, {1 , " Yes" }),
1268+ /* [19] Unused */
1269+ /* [20] Reserved */
1270+ REG_ENTRY (" Encrypt Preamble" , 21 , 1 , {0 , " No" }, {1 , " Yes" }),
1271+ REG_ENTRY (" STD Preamble" , 22 , 1 , {0 , " No" }, {1 , " Yes" }),
1272+ REG_ENTRY (" SPIm Fail 1" , 23 , 1 , {0 , " No" }, {1 , " Yes" }),
1273+ REG_ENTRY (" BSE Error Code" , 24 , 4 ,
1274+ { 0 , " No error" },
1275+ { 1 , " ID error" },
1276+ { 2 , " CMD error - illegal command detected" },
1277+ { 3 , " CRC error" },
1278+ { 4 , " PRMB error - preamble error. " },
1279+ { 5 , " ABRT error - configuration is aborted" },
1280+ { 6 , " OVFL error - data overflow error. " },
1281+ { 7 , " SDM error - bitstream pass the size of the SRAM array" },
1282+ { 8 , " Authentication Error1" },
1283+ { 9 , " Authentication Setup Error1" },
1284+ {10 , " Bitstream Engine Timeout Error" }),
1285+ REG_ENTRY (" Execution Error" , 28 , 1 , {0 , " No" }, {1 , " Yes" }),
1286+ REG_ENTRY (" ID Error" , 29 , 1 , {0 , " No" }, {1 , " Yes" }),
1287+ REG_ENTRY (" Invalid Command" , 30 , 1 , {0 , " No" }, {1 , " Yes" }),
1288+ REG_ENTRY (" WDT Busy" , 31 , 1 , {0 , " No" }, {1 , " Yes" }),
1289+ /* [32] Reserved */
1290+ REG_ENTRY (" Dry Run DONE" , 33 , 1 , {0 , " No" }, {1 , " Yes" }),
1291+ REG_ENTRY (" BSE Error 1 Code" , 34 , 4 ,
1292+ { 0 , " No error" },
1293+ { 1 , " ID error" },
1294+ { 2 , " CMD error - illegal command detected" },
1295+ { 3 , " CRC error" },
1296+ { 4 , " PRMB error - preamble error" },
1297+ { 5 , " ABRT error - configuration is aborted" },
1298+ { 6 , " OVFL error - data overflow error" },
1299+ { 7 , " SDM error - bitstream pass the size of the SRAM array" },
1300+ { 8 , " Authentication Error1" },
1301+ { 9 , " Authentication Setup Error1" },
1302+ {10 , " Bitstream Engine Timeout Error" }),
1303+ REG_ENTRY (" Bypass Mode" , 38 , 1 , {0 , " No" }, {1 , " Yes" }),
1304+ REG_ENTRY (" Flow Through Mode" , 39 , 1 , {0 , " No" }, {1 , " Yes" }),
1305+ /* [40-41] Reserved */
1306+ REG_ENTRY (" SFDP Timeout" , 42 , 1 , {0 , " No" }, {1 , " Yes" }),
1307+ REG_ENTRY (" Key Destroy Pass" , 43 , 1 , {0 , " No" }, {1 , " Yes" }),
1308+ REG_ENTRY (" INITN" , 44 , 1 , {0 , " Low" }, {1 , " High" }),
1309+ REG_ENTRY (" I3C Parity Error 2" , 45 , 1 , {0 , " No" }, {1 , " Yes" }),
1310+ REG_ENTRY (" INIT Bus ID Error" , 46 , 1 , {0 , " No" }, {1 , " Yes" }),
1311+ REG_ENTRY (" I3C Parity Error 1" , 47 , 1 , {0 , " No" }, {1 , " Yes" }),
1312+
1313+ REG_ENTRY (" Authentication Mode" , 48 , 2 ,
1314+ {0 , " No Auth" },
1315+ {1 , " ECDSA" },
1316+ {2 , " HMAC" },
1317+ {3 , " No Auth" }),
1318+ REG_ENTRY (" Authentication Done" , 50 , 1 , {0 , " No" }, {1 , " Yes" }),
1319+ REG_ENTRY (" Dry Run Auth Done" , 51 , 1 , {0 , " No" }, {1 , " Yes" }),
1320+ REG_ENTRY (" JTAG Locked" , 52 , 1 , {0 , " No" }, {1 , " Yes" }),
1321+ REG_ENTRY (" SSPI Locked" , 53 , 1 , {0 , " No" }, {1 , " Yes" }),
1322+ REG_ENTRY (" I2C/I3C Locked" , 54 , 1 , {0 , " No" }, {1 , " Yes" }),
1323+ REG_ENTRY (" PUB Read Lock" , 55 , 1 , {0 , " No" }, {1 , " Yes" }),
1324+ REG_ENTRY (" PUB Write Lock" , 56 , 1 , {0 , " No" }, {1 , " Yes" }),
1325+ REG_ENTRY (" FEA Read Lock" , 57 , 1 , {0 , " No" }, {1 , " Yes" }),
1326+ REG_ENTRY (" FEA Write Lock" , 58 , 1 , {0 , " No" }, {1 , " Yes" }),
1327+ REG_ENTRY (" AES Read Lock" , 59 , 1 , {0 , " No" }, {1 , " Yes" }),
1328+ REG_ENTRY (" AES Write Lock" , 60 , 1 , {0 , " No" }, {1 , " Yes" }),
1329+ REG_ENTRY (" PWD Read Lock" , 61 , 1 , {0 , " No" }, {1 , " Yes" }),
1330+ REG_ENTRY (" PWD Write Lock" , 62 , 1 , {0 , " No" }, {1 , " Yes" }),
1331+ REG_ENTRY (" Global Lock" , 63 , 1 , {0 , " No" }, {1 , " Yes" }),
1332+ }},
12471333 }},
12481334};
12491335
12501336void Lattice::displayReadReg (uint64_t dev)
12511337{
1252- if (_fpga_family == ECP3_FAMILY) {
1253- auto reg = reg_content.find (" StatusRegister" );
1254- if (reg == reg_content.end ()) {
1338+ if (_fpga_family == ECP3_FAMILY || _fpga_family == NEXUS_FAMILY) {
1339+ auto rc = reg_content.find (_fpga_family);
1340+ if (rc == reg_content.end ()) {
1341+ printError (" Unknown family" );
1342+ return ;
1343+ }
1344+ auto reg = rc->second .find (" StatusRegister" );
1345+ if (reg == rc->second .end ()) {
12551346 printError (" Unknown register StatusRegister" );
12561347 return ;
12571348 }
@@ -1260,7 +1351,7 @@ void Lattice::displayReadReg(uint64_t dev)
12601351 raw_val << " 0x" << std::hex << dev;
12611352 printSuccess (" Register raw value: " + raw_val.str ());
12621353
1263- const std::list<reg_struct_t > regs = reg->second ;
1354+ const std::list<reg_struct_t > & regs = reg->second ;
12641355 for (reg_struct_t r: regs) {
12651356 uint8_t offset = r.offset ;
12661357 uint8_t size = r.size ;
@@ -1299,23 +1390,13 @@ void Lattice::displayReadReg(uint64_t dev)
12991390 if (dev & 1 << 14 ) printf (" \t FFEA OTP\n " );
13001391 if (dev & 1 << 15 ) printf (" \t Decrypt Only\n " );
13011392 if (dev & 1 << 16 ) printf (" \t PWD Enable\n " );
1302- if (_fpga_family == NEXUS_FAMILY) {
1303- if (dev & 1 << 17 ) printf (" \t PWD All\n " );
1304- if (dev & 1 << 18 ) printf (" \t CID En\n " );
1305- if (dev & 1 << 19 ) printf (" \t internal use\n " );
1306- if (dev & 1 << 21 ) printf (" \t Encryption PreAmble\n " );
1307- if (dev & 1 << 22 ) printf (" \t Std PreAmble\n " );
1308- if (dev & 1 << 23 ) printf (" \t SPIm Fail1\n " );
1309- err = (dev >> 24 )&0x0f ;
1310- } else {
1311- if (dev & 1 << 17 ) printf (" \t UFM OTP\n " );
1312- if (dev & 1 << 18 ) printf (" \t ASSP\n " );
1313- if (dev & 1 << 19 ) printf (" \t SDM Enable\n " );
1314- if (dev & 1 << 20 ) printf (" \t Encryption PreAmble\n " );
1315- if (dev & 1 << 21 ) printf (" \t Std PreAmble\n " );
1316- if (dev & 1 << 22 ) printf (" \t SPIm Fail1\n " );
1317- err = (dev >> 23 )&0x07 ;
1318- }
1393+ if (dev & 1 << 17 ) printf (" \t UFM OTP\n " );
1394+ if (dev & 1 << 18 ) printf (" \t ASSP\n " );
1395+ if (dev & 1 << 19 ) printf (" \t SDM Enable\n " );
1396+ if (dev & 1 << 20 ) printf (" \t Encryption PreAmble\n " );
1397+ if (dev & 1 << 21 ) printf (" \t Std PreAmble\n " );
1398+ if (dev & 1 << 22 ) printf (" \t SPIm Fail1\n " );
1399+ err = (dev >> 23 )&0x07 ;
13191400
13201401 printf (" \t BSE Error Code\n " );
13211402 printf (" \t\t " );
@@ -1357,88 +1438,12 @@ void Lattice::displayReadReg(uint64_t dev)
13571438 printf (" unknown error: %x\n " , err);
13581439 }
13591440
1360- if (_fpga_family == NEXUS_FAMILY) {
1361- if ((dev >> 28 ) & 0x01 ) printf (" \t EXEC Error\n " );
1362- if ((dev >> 29 ) & 0x01 ) printf (" \t ID Error\n " );
1363- if ((dev >> 30 ) & 0x01 ) printf (" \t Invalid Command\n " );
1364- if ((dev >> 31 ) & 0x01 ) printf (" \t WDT Busy\n " );
1365- } else {
1366- if (dev & REG_STATUS_EXEC_ERR) printf (" \t EXEC Error\n " );
1367- if ((dev >> 27 ) & 0x01 ) printf (" \t Device failed to verify\n " );
1368- if ((dev >> 28 ) & 0x01 ) printf (" \t Invalid Command\n " );
1369- if ((dev >> 29 ) & 0x01 ) printf (" \t SED Error\n " );
1370- if ((dev >> 30 ) & 0x01 ) printf (" \t Bypass Mode\n " );
1371- if ((dev >> 31 ) & 0x01 ) printf (" \t FT Mode\n " );
1372- }
1373-
1374- if (_fpga_family == NEXUS_FAMILY) {
1375- if ((dev >> 33 ) & 0x01 ) printf (" \t Dry Run Done\n " );
1376- err = (dev >> 34 )&0x0f ;
1377- printf (" \t BSE Error 1 Code for previous bitstream execution\n " );
1378- printf (" \t\t " );
1379- switch (err) {
1380- case 0 :
1381- printf (" No err\n " );
1382- break ;
1383- case 1 :
1384- printf (" ID ERR\n " );
1385- break ;
1386- case 2 :
1387- printf (" CMD ERR\n " );
1388- break ;
1389- case 3 :
1390- printf (" CRC ERR\n " );
1391- break ;
1392- case 4 :
1393- printf (" Preamble ERR\n " );
1394- break ;
1395- case 5 :
1396- printf (" Abort ERR\n " );
1397- break ;
1398- case 6 :
1399- printf (" Overflow ERR\n " );
1400- break ;
1401- case 7 :
1402- printf (" SDM EOF\n " );
1403- break ;
1404- case 8 :
1405- printf (" Authentication ERR\n " );
1406- break ;
1407- case 9 :
1408- printf (" Authentication Setup ERR\n " );
1409- break ;
1410- case 10 :
1411- printf (" Bitstream Engine Timeout ERR\n " );
1412- break ;
1413- default :
1414- printf (" unknown error: %x\n " , err);
1415- }
1416- if ((dev >> 38 ) & 0x01 ) printf (" \t Bypass Mode\n " );
1417- if ((dev >> 39 ) & 0x01 ) printf (" \t Flow Through Mode\n " );
1418- if ((dev >> 42 ) & 0x01 ) printf (" \t SFDP Timeout\n " );
1419- if ((dev >> 43 ) & 0x01 ) printf (" \t Key Destroy pass\n " );
1420- if ((dev >> 44 ) & 0x01 ) printf (" \t INITN\n " );
1421- if ((dev >> 45 ) & 0x01 ) printf (" \t I3C Parity Error2\n " );
1422- if ((dev >> 46 ) & 0x01 ) printf (" \t INIT Bus ID Error\n " );
1423- if ((dev >> 47 ) & 0x01 ) printf (" \t I3C Parity Error1\n " );
1424- err = (dev >> 48 ) & 0x03 ;
1425- printf (" \t Authentication mode:\n " );
1426- printf (" \t\t " );
1427- switch (err) {
1428- case 3 :
1429- case 0 :
1430- printf (" No Auth\n " );
1431- break ;
1432- case 1 :
1433- printf (" ECDSA\n " );
1434- break ;
1435- case 2 :
1436- printf (" HMAC\n " );
1437- break ;
1438- }
1439- if ((dev >> 50 ) & 0x01 ) printf (" \t Authentication Done\n " );
1440- if ((dev >> 51 ) & 0x01 ) printf (" \t Dry Run Authentication Done\n " );
1441- }
1441+ if (dev & REG_STATUS_EXEC_ERR) printf (" \t EXEC Error\n " );
1442+ if ((dev >> 27 ) & 0x01 ) printf (" \t Device failed to verify\n " );
1443+ if ((dev >> 28 ) & 0x01 ) printf (" \t Invalid Command\n " );
1444+ if ((dev >> 29 ) & 0x01 ) printf (" \t SED Error\n " );
1445+ if ((dev >> 30 ) & 0x01 ) printf (" \t Bypass Mode\n " );
1446+ if ((dev >> 31 ) & 0x01 ) printf (" \t FT Mode\n " );
14421447}
14431448
14441449bool Lattice::pollBusyFlag (bool verbose)
0 commit comments