Skip to content

Commit dd7b74d

Browse files
committed
lattice: uses reg_content to defines status registers bits for Nexus family
1 parent 667f8de commit dd7b74d

File tree

2 files changed

+146
-131
lines changed

2 files changed

+146
-131
lines changed

src/lattice.cpp

Lines changed: 136 additions & 131 deletions
Original file line numberDiff line numberDiff line change
@@ -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

12501336
void 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("\tFFEA OTP\n");
13001391
if (dev & 1 << 15) printf("\tDecrypt Only\n");
13011392
if (dev & 1 << 16) printf("\tPWD Enable\n");
1302-
if (_fpga_family == NEXUS_FAMILY) {
1303-
if (dev & 1 << 17) printf("\tPWD All\n");
1304-
if (dev & 1 << 18) printf("\tCID En\n");
1305-
if (dev & 1 << 19) printf("\tinternal use\n");
1306-
if (dev & 1 << 21) printf("\tEncryption PreAmble\n");
1307-
if (dev & 1 << 22) printf("\tStd PreAmble\n");
1308-
if (dev & 1 << 23) printf("\tSPIm Fail1\n");
1309-
err = (dev >> 24)&0x0f;
1310-
} else {
1311-
if (dev & 1 << 17) printf("\tUFM OTP\n");
1312-
if (dev & 1 << 18) printf("\tASSP\n");
1313-
if (dev & 1 << 19) printf("\tSDM Enable\n");
1314-
if (dev & 1 << 20) printf("\tEncryption PreAmble\n");
1315-
if (dev & 1 << 21) printf("\tStd PreAmble\n");
1316-
if (dev & 1 << 22) printf("\tSPIm Fail1\n");
1317-
err = (dev >> 23)&0x07;
1318-
}
1393+
if (dev & 1 << 17) printf("\tUFM OTP\n");
1394+
if (dev & 1 << 18) printf("\tASSP\n");
1395+
if (dev & 1 << 19) printf("\tSDM Enable\n");
1396+
if (dev & 1 << 20) printf("\tEncryption PreAmble\n");
1397+
if (dev & 1 << 21) printf("\tStd PreAmble\n");
1398+
if (dev & 1 << 22) printf("\tSPIm Fail1\n");
1399+
err = (dev >> 23)&0x07;
13191400

13201401
printf("\tBSE 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("\tEXEC Error\n");
1362-
if ((dev >> 29) & 0x01) printf("\tID Error\n");
1363-
if ((dev >> 30) & 0x01) printf("\tInvalid Command\n");
1364-
if ((dev >> 31) & 0x01) printf("\tWDT Busy\n");
1365-
} else {
1366-
if (dev & REG_STATUS_EXEC_ERR) printf("\tEXEC Error\n");
1367-
if ((dev >> 27) & 0x01) printf("\tDevice failed to verify\n");
1368-
if ((dev >> 28) & 0x01) printf("\tInvalid Command\n");
1369-
if ((dev >> 29) & 0x01) printf("\tSED Error\n");
1370-
if ((dev >> 30) & 0x01) printf("\tBypass Mode\n");
1371-
if ((dev >> 31) & 0x01) printf("\tFT Mode\n");
1372-
}
1373-
1374-
if (_fpga_family == NEXUS_FAMILY) {
1375-
if ((dev >> 33) & 0x01) printf("\tDry Run Done\n");
1376-
err = (dev >> 34)&0x0f;
1377-
printf("\tBSE 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("\tBypass Mode\n");
1417-
if ((dev >> 39) & 0x01) printf("\tFlow Through Mode\n");
1418-
if ((dev >> 42) & 0x01) printf("\tSFDP Timeout\n");
1419-
if ((dev >> 43) & 0x01) printf("\tKey Destroy pass\n");
1420-
if ((dev >> 44) & 0x01) printf("\tINITN\n");
1421-
if ((dev >> 45) & 0x01) printf("\tI3C Parity Error2\n");
1422-
if ((dev >> 46) & 0x01) printf("\tINIT Bus ID Error\n");
1423-
if ((dev >> 47) & 0x01) printf("\tI3C Parity Error1\n");
1424-
err = (dev >> 48) & 0x03;
1425-
printf("\tAuthentication 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("\tAuthentication Done\n");
1440-
if ((dev >> 51) & 0x01) printf("\tDry Run Authentication Done\n");
1441-
}
1441+
if (dev & REG_STATUS_EXEC_ERR) printf("\tEXEC Error\n");
1442+
if ((dev >> 27) & 0x01) printf("\tDevice failed to verify\n");
1443+
if ((dev >> 28) & 0x01) printf("\tInvalid Command\n");
1444+
if ((dev >> 29) & 0x01) printf("\tSED Error\n");
1445+
if ((dev >> 30) & 0x01) printf("\tBypass Mode\n");
1446+
if ((dev >> 31) & 0x01) printf("\tFT Mode\n");
14421447
}
14431448

14441449
bool Lattice::pollBusyFlag(bool verbose)

src/lattice.hpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88

99
#include <stdint.h>
1010
#include <iostream>
11+
#include <list>
1112
#include <string>
1213
#include <vector>
1314

@@ -81,6 +82,15 @@ class Lattice: public Device, SPIInterface {
8182

8283
lattice_family_t _fpga_family;
8384

85+
/* Internal Registers structure */
86+
typedef struct {
87+
std::string description;
88+
uint8_t offset;
89+
uint8_t size;
90+
std::map<int, std::string> reg_cnt;
91+
} reg_struct_t;
92+
static const std::map<int, std::map<std::string, std::list<reg_struct_t>>> reg_content;
93+
8494
int get_statusreg_size();
8595

8696
bool program_intFlash(ConfigBitstreamParser *_cbp);

0 commit comments

Comments
 (0)