@@ -1324,16 +1324,30 @@ nfp_fw_check_change(struct nfp_cpp *cpp,
13241324
13251325static int
13261326nfp_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
13391353static bool
@@ -1399,11 +1413,27 @@ nfp_fw_skip_load(const struct nfp_dev_info *dev_info,
13991413
14001414 return false;
14011415}
1416+
14021417static 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
14271457static 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+
14801627static int
14811628nfp_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