Skip to content

Commit 7b3c693

Browse files
hechaoyongferruhy
authored andcommitted
net/nfp: support load firmware from flash
Add the logic to support load firmware from flash, also do some refactor to the related logic at the same time. Signed-off-by: Chaoyong He <[email protected]> Reviewed-by: Long Wu <[email protected]> Reviewed-by: Peng Zhang <[email protected]>
1 parent c5ba43d commit 7b3c693

File tree

1 file changed

+202
-31
lines changed

1 file changed

+202
-31
lines changed

drivers/net/nfp/nfp_ethdev.c

Lines changed: 202 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1324,16 +1324,30 @@ nfp_fw_check_change(struct nfp_cpp *cpp,
13241324

13251325
static int
13261326
nfp_fw_reload(struct nfp_nsp *nsp,
1327-
char *fw_name)
1327+
char *fw_name,
1328+
int reset)
13281329
{
13291330
int err;
1331+
bool reset_flag;
1332+
1333+
reset_flag = (reset == NFP_NSP_DRV_RESET_ALWAYS) ||
1334+
(reset == NFP_NSP_DRV_RESET_DISK);
1335+
1336+
if (reset_flag) {
1337+
err = nfp_nsp_device_soft_reset(nsp);
1338+
if (err != 0) {
1339+
PMD_DRV_LOG(ERR, "NFP firmware soft reset failed");
1340+
return err;
1341+
}
1342+
}
13301343

1331-
nfp_nsp_device_soft_reset(nsp);
13321344
err = nfp_fw_upload(nsp, fw_name);
1333-
if (err != 0)
1345+
if (err != 0) {
13341346
PMD_DRV_LOG(ERR, "NFP firmware load failed");
1347+
return err;
1348+
}
13351349

1336-
return err;
1350+
return 0;
13371351
}
13381352

13391353
static bool
@@ -1399,11 +1413,27 @@ nfp_fw_skip_load(const struct nfp_dev_info *dev_info,
13991413

14001414
return false;
14011415
}
1416+
14021417
static int
1403-
nfp_fw_reload_for_single_pf(struct nfp_nsp *nsp,
1418+
nfp_fw_reload_from_flash(struct nfp_nsp *nsp)
1419+
{
1420+
int ret;
1421+
1422+
ret = nfp_nsp_load_stored_fw(nsp);
1423+
if (ret != 0) {
1424+
PMD_DRV_LOG(ERR, "Load firmware from flash failed.");
1425+
return -EACCES;
1426+
}
1427+
1428+
return 0;
1429+
}
1430+
1431+
static int
1432+
nfp_fw_reload_for_single_pf_from_disk(struct nfp_nsp *nsp,
14041433
char *fw_name,
14051434
struct nfp_cpp *cpp,
1406-
bool force_reload_fw)
1435+
bool force_reload_fw,
1436+
int reset)
14071437
{
14081438
int ret;
14091439
bool fw_changed = true;
@@ -1417,26 +1447,89 @@ nfp_fw_reload_for_single_pf(struct nfp_nsp *nsp,
14171447
if (!fw_changed)
14181448
return 0;
14191449

1420-
ret = nfp_fw_reload(nsp, fw_name);
1450+
ret = nfp_fw_reload(nsp, fw_name, reset);
14211451
if (ret != 0)
14221452
return ret;
14231453

14241454
return 0;
14251455
}
14261456

14271457
static int
1428-
nfp_fw_reload_for_multi_pf(struct nfp_nsp *nsp,
1458+
nfp_fw_reload_for_single_pf(struct nfp_nsp *nsp,
1459+
char *fw_name,
1460+
struct nfp_cpp *cpp,
1461+
bool force_reload_fw,
1462+
int reset,
1463+
int policy)
1464+
{
1465+
int ret;
1466+
1467+
if (policy == NFP_NSP_APP_FW_LOAD_FLASH && nfp_nsp_has_stored_fw_load(nsp)) {
1468+
ret = nfp_fw_reload_from_flash(nsp);
1469+
if (ret != 0) {
1470+
PMD_DRV_LOG(ERR, "Load single PF firmware from flash failed.");
1471+
return ret;
1472+
}
1473+
} else if (fw_name[0] != 0) {
1474+
ret = nfp_fw_reload_for_single_pf_from_disk(nsp, fw_name, cpp,
1475+
force_reload_fw, reset);
1476+
if (ret != 0) {
1477+
PMD_DRV_LOG(ERR, "Load single PF firmware from disk failed.");
1478+
return ret;
1479+
}
1480+
} else {
1481+
PMD_DRV_LOG(ERR, "Not load firmware, please update flash or recofigure card.");
1482+
return -ENODATA;
1483+
}
1484+
1485+
return 0;
1486+
}
1487+
1488+
static int
1489+
nfp_fw_reload_for_multi_pf_from_disk(struct nfp_nsp *nsp,
14291490
char *fw_name,
14301491
struct nfp_cpp *cpp,
14311492
const struct nfp_dev_info *dev_info,
14321493
struct nfp_multi_pf *multi_pf,
1433-
bool force_reload_fw)
1494+
bool force_reload_fw,
1495+
int reset)
14341496
{
14351497
int err;
14361498
bool fw_changed = true;
14371499
bool skip_load_fw = false;
14381500
bool reload_fw = force_reload_fw;
14391501

1502+
if (nfp_nsp_has_fw_loaded(nsp) && nfp_nsp_fw_loaded(nsp) && !reload_fw) {
1503+
err = nfp_fw_check_change(cpp, fw_name, &fw_changed);
1504+
if (err != 0)
1505+
return err;
1506+
}
1507+
1508+
if (!fw_changed || reload_fw)
1509+
skip_load_fw = nfp_fw_skip_load(dev_info, multi_pf, &reload_fw);
1510+
1511+
if (skip_load_fw && !reload_fw)
1512+
return 0;
1513+
1514+
err = nfp_fw_reload(nsp, fw_name, reset);
1515+
if (err != 0)
1516+
return err;
1517+
1518+
return 0;
1519+
}
1520+
1521+
static int
1522+
nfp_fw_reload_for_multi_pf(struct nfp_nsp *nsp,
1523+
char *fw_name,
1524+
struct nfp_cpp *cpp,
1525+
const struct nfp_dev_info *dev_info,
1526+
struct nfp_multi_pf *multi_pf,
1527+
bool force_reload_fw,
1528+
int reset,
1529+
int policy)
1530+
{
1531+
int err;
1532+
14401533
err = nfp_net_keepalive_init(cpp, multi_pf);
14411534
if (err != 0) {
14421535
PMD_DRV_LOG(ERR, "NFP init beat failed");
@@ -1449,21 +1542,24 @@ nfp_fw_reload_for_multi_pf(struct nfp_nsp *nsp,
14491542
goto keepalive_uninit;
14501543
}
14511544

1452-
if (nfp_nsp_has_fw_loaded(nsp) && nfp_nsp_fw_loaded(nsp) && !reload_fw) {
1453-
err = nfp_fw_check_change(cpp, fw_name, &fw_changed);
1454-
if (err != 0)
1545+
if (policy == NFP_NSP_APP_FW_LOAD_FLASH && nfp_nsp_has_stored_fw_load(nsp)) {
1546+
err = nfp_fw_reload_from_flash(nsp);
1547+
if (err != 0) {
1548+
PMD_DRV_LOG(ERR, "Load multi PF firmware from flash failed.");
14551549
goto keepalive_stop;
1456-
}
1457-
1458-
if (!fw_changed || reload_fw)
1459-
skip_load_fw = nfp_fw_skip_load(dev_info, multi_pf, &reload_fw);
1460-
1461-
if (skip_load_fw && !reload_fw)
1462-
return 0;
1463-
1464-
err = nfp_fw_reload(nsp, fw_name);
1465-
if (err != 0)
1550+
}
1551+
} else if (fw_name[0] != 0) {
1552+
err = nfp_fw_reload_for_multi_pf_from_disk(nsp, fw_name, cpp,
1553+
dev_info, multi_pf, force_reload_fw, reset);
1554+
if (err != 0) {
1555+
PMD_DRV_LOG(ERR, "Load multi PF firmware from disk failed.");
1556+
goto keepalive_stop;
1557+
}
1558+
} else {
1559+
PMD_DRV_LOG(ERR, "Not load firmware, please update flash or recofigure card.");
1560+
err = -ENODATA;
14661561
goto keepalive_stop;
1562+
}
14671563

14681564
nfp_net_keepalive_clear_others(dev_info, multi_pf);
14691565

@@ -1477,6 +1573,57 @@ nfp_fw_reload_for_multi_pf(struct nfp_nsp *nsp,
14771573
return err;
14781574
}
14791575

1576+
static int
1577+
nfp_strtol(const char *buf,
1578+
int base,
1579+
long *value)
1580+
{
1581+
long val;
1582+
char *tmp;
1583+
1584+
if (value == NULL)
1585+
return -EINVAL;
1586+
1587+
val = strtol(buf, &tmp, base);
1588+
if (tmp == NULL || *tmp != 0)
1589+
return -EINVAL;
1590+
1591+
*value = val;
1592+
1593+
return 0;
1594+
}
1595+
1596+
static int
1597+
nfp_fw_policy_value_get(struct nfp_nsp *nsp,
1598+
const char *key,
1599+
const char *default_val,
1600+
int max_val,
1601+
int *value)
1602+
{
1603+
int ret;
1604+
int64_t val;
1605+
char buf[64];
1606+
1607+
snprintf(buf, sizeof(buf), "%s", key);
1608+
ret = nfp_nsp_hwinfo_lookup_optional(nsp, buf, sizeof(buf), default_val);
1609+
if (ret != 0)
1610+
return ret;
1611+
1612+
ret = nfp_strtol(buf, 0, &val);
1613+
if (ret != 0 || val < 0 || val > max_val) {
1614+
PMD_DRV_LOG(WARNING, "Invalid value '%s' from '%s', ignoring",
1615+
buf, key);
1616+
/* Fall back to the default value */
1617+
ret = nfp_strtol(default_val, 0, &val);
1618+
if (ret != 0)
1619+
return ret;
1620+
}
1621+
1622+
*value = val;
1623+
1624+
return 0;
1625+
}
1626+
14801627
static int
14811628
nfp_fw_setup(struct rte_pci_device *dev,
14821629
struct nfp_cpp *cpp,
@@ -1487,27 +1634,51 @@ nfp_fw_setup(struct rte_pci_device *dev,
14871634
bool force_reload_fw)
14881635
{
14891636
int err;
1637+
int reset;
1638+
int policy;
14901639
char fw_name[125];
14911640
struct nfp_nsp *nsp;
14921641

1493-
err = nfp_fw_get_name(dev, cpp, nfp_eth_table, hwinfo, fw_name, sizeof(fw_name));
1494-
if (err != 0) {
1495-
PMD_DRV_LOG(ERR, "Can't find suitable firmware.");
1496-
return err;
1497-
}
1498-
14991642
nsp = nfp_nsp_open(cpp);
15001643
if (nsp == NULL) {
15011644
PMD_DRV_LOG(ERR, "NFP error when obtaining NSP handle");
15021645
return -EIO;
15031646
}
15041647

1648+
err = nfp_fw_policy_value_get(nsp, "abi_drv_reset",
1649+
NFP_NSP_DRV_RESET_DEFAULT, NFP_NSP_DRV_RESET_NEVER,
1650+
&reset);
1651+
if (err != 0) {
1652+
PMD_DRV_LOG(ERR, "Get 'abi_drv_reset' from HWinfo failed.");
1653+
goto close_nsp;
1654+
}
1655+
1656+
err = nfp_fw_policy_value_get(nsp, "app_fw_from_flash",
1657+
NFP_NSP_APP_FW_LOAD_DEFAULT, NFP_NSP_APP_FW_LOAD_PREF,
1658+
&policy);
1659+
if (err != 0) {
1660+
PMD_DRV_LOG(ERR, "Get 'app_fw_from_flash' from HWinfo failed.");
1661+
goto close_nsp;
1662+
}
1663+
1664+
fw_name[0] = 0;
1665+
if (policy != NFP_NSP_APP_FW_LOAD_FLASH) {
1666+
err = nfp_fw_get_name(dev, cpp, nfp_eth_table, hwinfo, fw_name,
1667+
sizeof(fw_name));
1668+
if (err != 0) {
1669+
PMD_DRV_LOG(ERR, "Can't find suitable firmware.");
1670+
goto close_nsp;
1671+
}
1672+
}
1673+
15051674
if (multi_pf->enabled)
1506-
err = nfp_fw_reload_for_multi_pf(nsp, fw_name, cpp, dev_info, multi_pf,
1507-
force_reload_fw);
1675+
err = nfp_fw_reload_for_multi_pf(nsp, fw_name, cpp, dev_info,
1676+
multi_pf, force_reload_fw, reset, policy);
15081677
else
1509-
err = nfp_fw_reload_for_single_pf(nsp, fw_name, cpp, force_reload_fw);
1678+
err = nfp_fw_reload_for_single_pf(nsp, fw_name, cpp,
1679+
force_reload_fw, reset, policy);
15101680

1681+
close_nsp:
15111682
nfp_nsp_close(nsp);
15121683
return err;
15131684
}

0 commit comments

Comments
 (0)