Acked-by: Ray Kinsella <m...@ashroe.eu>

On 10/07/2019 05:16, Qi Zhang wrote:
> Safe mode support is not necessary by default.
> Driver be initialized without OS package silently may confuse users
> since most advanced feature are disabled.
> Add devarg for safe mode enabling only for when user intend to do this.
> 
> Signed-off-by: Qi Zhang <qi.z.zh...@intel.com>
> ---
> -v3:
>   fix wrong logic in parse_bool.
> 
> -v2:
>   fix missing return value check from ice_parse_devargs.
>   minor document update.
> 
>  doc/guides/nics/ice.rst      | 11 +++++++
>  drivers/net/ice/ice_ethdev.c | 68 
> +++++++++++++++++++++++++++++++++++++++++++-
>  drivers/net/ice/ice_ethdev.h |  8 ++++++
>  3 files changed, 86 insertions(+), 1 deletion(-)
> 
> diff --git a/doc/guides/nics/ice.rst b/doc/guides/nics/ice.rst
> index e9b3a48bc..03819d29f 100644
> --- a/doc/guides/nics/ice.rst
> +++ b/doc/guides/nics/ice.rst
> @@ -49,6 +49,17 @@ Please note that enabling debugging options may affect 
> system performance.
>  Runtime Config Options
>  ~~~~~~~~~~~~~~~~~~~~~~
>  
> +- ``Safe Mode Support`` (default ``0``)
> +
> +  If driver failed to load OS package, by default driver's initialization 
> failed.
> +  But if user intend to use the device without OS package, user can take 
> ``devargs``
> +  parameter ``safe-mode-support``, for example::
> +
> +    -w 80:00.0,safe-mode-support=1
> +
> +  Then the driver will be initialized successfully and the device will enter 
> Safe Mode.
> +  NOTE: In Safe mode, only very limited features are available, features 
> like RSS,
> +  checksum, fdir, tunneling ... are all disabled.
>  
>  Driver compilation and testing
>  ------------------------------
> diff --git a/drivers/net/ice/ice_ethdev.c b/drivers/net/ice/ice_ethdev.c
> index 4b5cd8269..a7cbe0848 100644
> --- a/drivers/net/ice/ice_ethdev.c
> +++ b/drivers/net/ice/ice_ethdev.c
> @@ -17,6 +17,14 @@
>  #include "ice_rxtx.h"
>  #include "ice_switch_filter.h"
>  
> +/* devargs */
> +#define ICE_SAFE_MODE_SUPPORT_ARG "safe-mode-support"
> +
> +static const char * const ice_valid_args[] = {
> +     ICE_SAFE_MODE_SUPPORT_ARG,
> +     NULL
> +};
> +
>  #define ICE_DFLT_OUTER_TAG_TYPE ICE_AQ_VSI_OUTER_TAG_VLAN_9100
>  #define ICE_DFLT_PKG_FILE "/lib/firmware/intel/ice/ddp/ice.pkg"
>  
> @@ -1334,6 +1342,50 @@ ice_base_queue_get(struct ice_pf *pf)
>  }
>  
>  static int
> +parse_bool(const char *key, const char *value, void *args)
> +{
> +     int *i = (int *)args;
> +     char *end;
> +     int num;
> +
> +     num = strtoul(value, &end, 10);
> +
> +     if (num != 0 && num != 1) {
> +             PMD_DRV_LOG(WARNING, "invalid value:\"%s\" for key:\"%s\", "
> +                     "value must be 0 or 1",
> +                     value, key);
> +             return -1;
> +     }
> +
> +     *i = num;
> +     return 0;
> +}
> +
> +static int ice_parse_devargs(struct rte_eth_dev *dev)
> +{
> +     struct ice_adapter *ad =
> +             ICE_DEV_PRIVATE_TO_ADAPTER(dev->data->dev_private);
> +     struct rte_devargs *devargs = dev->device->devargs;
> +     struct rte_kvargs *kvlist;
> +     int ret;
> +
> +     if (devargs == NULL)
> +             return 0;
> +
> +     kvlist = rte_kvargs_parse(devargs->args, ice_valid_args);
> +     if (kvlist == NULL) {
> +             PMD_INIT_LOG(ERR, "Invalid kvargs key\n");
> +             return -EINVAL;
> +     }
> +
> +     ret = rte_kvargs_process(kvlist, ICE_SAFE_MODE_SUPPORT_ARG,
> +                              &parse_bool, &ad->devargs.safe_mode_support);
> +
> +     rte_kvargs_free(kvlist);
> +     return ret;
> +}
> +
> +static int
>  ice_dev_init(struct rte_eth_dev *dev)
>  {
>       struct rte_pci_device *pci_dev;
> @@ -1366,6 +1418,12 @@ ice_dev_init(struct rte_eth_dev *dev)
>       hw->bus.device = pci_dev->addr.devid;
>       hw->bus.func = pci_dev->addr.function;
>  
> +     ret = ice_parse_devargs(dev);
> +     if (ret) {
> +             PMD_INIT_LOG(ERR, "Failed to parse devargs");
> +             return -EINVAL;
> +     }
> +
>       ice_init_controlq_parameter(hw);
>  
>       ret = ice_init_hw(hw);
> @@ -1376,8 +1434,14 @@ ice_dev_init(struct rte_eth_dev *dev)
>  
>       ret = ice_load_pkg(dev);
>       if (ret) {
> +             if (ad->devargs.safe_mode_support == 0) {
> +                     PMD_INIT_LOG(ERR, "Failed to load the DDP package,"
> +                                     "Use safe-mode-support=1 to enter Safe 
> Mode");
> +                     return ret;
> +             }
> +
>               PMD_INIT_LOG(WARNING, "Failed to load the DDP package,"
> -                             "Entering Safe Mode");
> +                                     "Entering Safe Mode");
>               ad->is_safe_mode = 1;
>       }
>  
> @@ -3693,6 +3757,8 @@ static struct rte_pci_driver rte_ice_pmd = {
>  RTE_PMD_REGISTER_PCI(net_ice, rte_ice_pmd);
>  RTE_PMD_REGISTER_PCI_TABLE(net_ice, pci_id_ice_map);
>  RTE_PMD_REGISTER_KMOD_DEP(net_ice, "* igb_uio | uio_pci_generic | vfio-pci");
> +RTE_PMD_REGISTER_PARAM_STRING(net_ice,
> +                           ICE_SAFE_MODE_SUPPORT_ARG "=<0|1>");
>  
>  RTE_INIT(ice_init_log)
>  {
> diff --git a/drivers/net/ice/ice_ethdev.h b/drivers/net/ice/ice_ethdev.h
> index 8a52239f5..f569da833 100644
> --- a/drivers/net/ice/ice_ethdev.h
> +++ b/drivers/net/ice/ice_ethdev.h
> @@ -274,6 +274,13 @@ struct ice_pf {
>  };
>  
>  /**
> + * Cache devargs parse result.
> + */
> +struct ice_devargs {
> +     int safe_mode_support;
> +};
> +
> +/**
>   * Structure to store private data for each PF/VF instance.
>   */
>  struct ice_adapter {
> @@ -286,6 +293,7 @@ struct ice_adapter {
>       /* ptype mapping table */
>       uint32_t ptype_tbl[ICE_MAX_PKT_TYPE] __rte_cache_min_aligned;
>       bool is_safe_mode;
> +     struct ice_devargs devargs;
>  };
>  
>  struct ice_vsi_vlan_pvid_info {
> 

Reply via email to