The devlink interface recently gained support for a new "overwrite mask"
parameter that allows specifying how various sub-sections of a flash
component are modified when updating.

Add support for this to netdevsim, to enable easily testing the
interface. Make the allowed overwrite mask values controllable via
a debugfs parameter. This enables testing a flow where the driver
rejects an unsupportable overwrite mask.

Signed-off-by: Jacob Keller <jacob.e.kel...@intel.com>
Reviewed-by: Jakub Kicinski <k...@kernel.org>
---
 drivers/net/netdevsim/dev.c                    | 10 +++++++++-
 drivers/net/netdevsim/netdevsim.h              |  1 +
 .../selftests/drivers/net/netdevsim/devlink.sh | 18 ++++++++++++++++++
 3 files changed, 28 insertions(+), 1 deletion(-)

diff --git a/drivers/net/netdevsim/dev.c b/drivers/net/netdevsim/dev.c
index 505f6edfc1d1..cc53b240e56a 100644
--- a/drivers/net/netdevsim/dev.c
+++ b/drivers/net/netdevsim/dev.c
@@ -201,6 +201,8 @@ static int nsim_dev_debugfs_init(struct nsim_dev *nsim_dev)
                return PTR_ERR(nsim_dev->ports_ddir);
        debugfs_create_bool("fw_update_status", 0600, nsim_dev->ddir,
                            &nsim_dev->fw_update_status);
+       debugfs_create_u32("fw_update_overwrite_mask", 0600, nsim_dev->ddir,
+                           &nsim_dev->fw_update_overwrite_mask);
        debugfs_create_u32("max_macs", 0600, nsim_dev->ddir,
                           &nsim_dev->max_macs);
        debugfs_create_bool("test1", 0600, nsim_dev->ddir,
@@ -747,6 +749,9 @@ static int nsim_dev_flash_update(struct devlink *devlink,
        struct nsim_dev *nsim_dev = devlink_priv(devlink);
        int i;
 
+       if ((params->overwrite_mask & ~nsim_dev->fw_update_overwrite_mask) != 0)
+               return -EOPNOTSUPP;
+
        if (nsim_dev->fw_update_status) {
                devlink_flash_update_begin_notify(devlink);
                devlink_flash_update_status_notify(devlink,
@@ -877,7 +882,8 @@ nsim_dev_devlink_trap_policer_counter_get(struct devlink 
*devlink,
 }
 
 static const struct devlink_ops nsim_dev_devlink_ops = {
-       .supported_flash_update_params = DEVLINK_SUPPORT_FLASH_UPDATE_COMPONENT,
+       .supported_flash_update_params = DEVLINK_SUPPORT_FLASH_UPDATE_COMPONENT 
|
+                                        
DEVLINK_SUPPORT_FLASH_UPDATE_OVERWRITE_MASK,
        .reload_down = nsim_dev_reload_down,
        .reload_up = nsim_dev_reload_up,
        .info_get = nsim_dev_info_get,
@@ -992,6 +998,7 @@ static int nsim_dev_reload_create(struct nsim_dev *nsim_dev,
        INIT_LIST_HEAD(&nsim_dev->port_list);
        mutex_init(&nsim_dev->port_list_lock);
        nsim_dev->fw_update_status = true;
+       nsim_dev->fw_update_overwrite_mask = 0;
 
        nsim_dev->fib_data = nsim_fib_create(devlink, extack);
        if (IS_ERR(nsim_dev->fib_data))
@@ -1050,6 +1057,7 @@ int nsim_dev_probe(struct nsim_bus_dev *nsim_bus_dev)
        INIT_LIST_HEAD(&nsim_dev->port_list);
        mutex_init(&nsim_dev->port_list_lock);
        nsim_dev->fw_update_status = true;
+       nsim_dev->fw_update_overwrite_mask = 0;
        nsim_dev->max_macs = NSIM_DEV_MAX_MACS_DEFAULT;
        nsim_dev->test1 = NSIM_DEV_TEST1_DEFAULT;
        spin_lock_init(&nsim_dev->fa_cookie_lock);
diff --git a/drivers/net/netdevsim/netdevsim.h 
b/drivers/net/netdevsim/netdevsim.h
index 0c86561e6d8d..0a1b28aea894 100644
--- a/drivers/net/netdevsim/netdevsim.h
+++ b/drivers/net/netdevsim/netdevsim.h
@@ -196,6 +196,7 @@ struct nsim_dev {
        struct list_head port_list;
        struct mutex port_list_lock; /* protects port list */
        bool fw_update_status;
+       u32 fw_update_overwrite_mask;
        u32 max_macs;
        bool test1;
        bool dont_allow_reload;
diff --git a/tools/testing/selftests/drivers/net/netdevsim/devlink.sh 
b/tools/testing/selftests/drivers/net/netdevsim/devlink.sh
index 1e7541688978..40909c254365 100755
--- a/tools/testing/selftests/drivers/net/netdevsim/devlink.sh
+++ b/tools/testing/selftests/drivers/net/netdevsim/devlink.sh
@@ -26,6 +26,24 @@ fw_flash_test()
        devlink dev flash $DL_HANDLE file dummy component fw.mgmt
        check_err $? "Failed to flash with component attribute"
 
+       devlink dev flash $DL_HANDLE file dummy overwrite settings
+       check_fail $? "Flash with overwrite settings should be rejected"
+
+       echo "1"> $DEBUGFS_DIR/fw_update_overwrite_mask
+       check_err $? "Failed to change allowed overwrite mask"
+
+       devlink dev flash $DL_HANDLE file dummy overwrite settings
+       check_err $? "Failed to flash with settings overwrite enabled"
+
+       devlink dev flash $DL_HANDLE file dummy overwrite identifiers
+       check_fail $? "Flash with overwrite settings should be identifiers"
+
+       echo "3"> $DEBUGFS_DIR/fw_update_overwrite_mask
+       check_err $? "Failed to change allowed overwrite mask"
+
+       devlink dev flash $DL_HANDLE file dummy overwrite identifiers overwrite 
settings
+       check_err $? "Failed to flash with settings and identifiers overwrite 
enabled"
+
        echo "n"> $DEBUGFS_DIR/fw_update_status
        check_err $? "Failed to disable status updates"
 
-- 
2.28.0.497.g54e85e7af1ac

Reply via email to