From patchwork Tue Feb 26 20:20:14 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jakub Kicinski X-Patchwork-Id: 1048539 X-Patchwork-Delegate: dsahern@gmail.com Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=netronome.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=netronome-com.20150623.gappssmtp.com header.i=@netronome-com.20150623.gappssmtp.com header.b="BaOYa/Ze"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 4489DB3nqSz9s5c for ; Wed, 27 Feb 2019 07:20:26 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728945AbfBZUUY (ORCPT ); Tue, 26 Feb 2019 15:20:24 -0500 Received: from mail-qt1-f193.google.com ([209.85.160.193]:34727 "EHLO mail-qt1-f193.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727054AbfBZUUY (ORCPT ); Tue, 26 Feb 2019 15:20:24 -0500 Received: by mail-qt1-f193.google.com with SMTP id w4so16559404qtc.1 for ; Tue, 26 Feb 2019 12:20:23 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=netronome-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=vvjYYImLWU8PuSv02YyaLP7D7O8BqiZmG6mLD+vH+9A=; b=BaOYa/Zemn5QKbNtAN8ssFMgEfYNkqV9D18nsbqJ9V4l4Xr7ZWTF9Htpqc09zt/Tlc zqhdWVXbeip0DPqmHOCEfa/0oTZeKnKc9R830sSVfjhuJBD/bPT6CbuXfAL182LXzrPD N6c2eoXYNXrpjsGaKXK0HwzxrF0qNkdv66m7YIR8O/0hqJC98u2f/BfS0IAuDQ5Ewx30 EuhpwZVzKe+Mp0St/G8se3gq6GEXgJIRQI90YF+qspEdZ3jbbWQyAp+ElGbd0euOpqwz h8SHmw9Z0hQ8bEnLVGkZIMgXMx6VRIvQpAGYkRgBBe/lO+xReXNyIr3DyncviBTpVv3y FWGA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=vvjYYImLWU8PuSv02YyaLP7D7O8BqiZmG6mLD+vH+9A=; b=ZKbGA6o5vGfD4bmZdql1F84x9z1DOTQ/RhlGVMCilH3YjNjG/VLe3KtMAYb4xTb+dE R/KQSWoQtmUXD76kbGfCcRktPiIQpR5Bimu/iqkwXRZZC0jfXfUxm2QHOTB/AVuSsKB6 GJlidAPrcYej0q60Hetdk2SQev3t/0FgjdubQV0atghX+PtQyFaBvveG+KIMocGAhSkC 0+HIYjl4Rg3LYmGV56ifrXVin4dAa6PJ5BIQdAnMPFJ64CvNO/3i4VyQeVi62tfmJSZH tmmWF54jiW+XB9+/BGtwd0xZN6oqx/ypApSYn4Nns2/fxh2PyA7v7S3AxXecOSVz5ach AIiA== X-Gm-Message-State: AHQUAuaKuep+FTJFyzx3qxcoNl/IylhdglGdfq5S1eczMOJex8SIiOu4 GmXrydjX/0ez/yqdazO6/cTmpH6T+gU= X-Google-Smtp-Source: AHgI3IYGr+/aCoatnJQLgJrfpwVT93BzDct+9zSWYG7BAqMepY9SHL8VRhLAVpVovTJ4NiwWs9GjQw== X-Received: by 2002:ac8:37f6:: with SMTP id e51mr19260596qtc.1.1551212423061; Tue, 26 Feb 2019 12:20:23 -0800 (PST) Received: from jkicinski-Precision-T1700.netronome.com ([66.60.152.14]) by smtp.gmail.com with ESMTPSA id r68sm6992782qkd.68.2019.02.26.12.20.21 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 26 Feb 2019 12:20:22 -0800 (PST) From: Jakub Kicinski To: dsahern@gmail.com, jiri@resnulli.us, stephen@networkplumber.org Cc: oss-drivers@netronome.com, netdev@vger.kernel.org, Jakub Kicinski Subject: [PATCH iproute2-next] devlink: add support for updating device flash Date: Tue, 26 Feb 2019 12:20:14 -0800 Message-Id: <20190226202014.23626-1-jakub.kicinski@netronome.com> X-Mailer: git-send-email 2.19.2 MIME-Version: 1.0 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Add new command for updating flash of devices via devlink API. Example: $ cp flash-boot.bin /lib/firmware/ $ devlink dev flash pci/0000:05:00.0 file flash-boot.bin Signed-off-by: Jakub Kicinski Acked-by: Jiri Pirko --- devlink/devlink.c | 54 ++++++++++++++++++++++++++++++++++++++++++ man/man8/devlink-dev.8 | 32 +++++++++++++++++++++++++ 2 files changed, 86 insertions(+) diff --git a/devlink/devlink.c b/devlink/devlink.c index 960cdda99b5b..5c6cac1f76dd 100644 --- a/devlink/devlink.c +++ b/devlink/devlink.c @@ -199,6 +199,8 @@ static void ifname_map_free(struct ifname_map *ifname_map) #define DL_OPT_REGION_SNAPSHOT_ID BIT(22) #define DL_OPT_REGION_ADDRESS BIT(23) #define DL_OPT_REGION_LENGTH BIT(24) +#define DL_OPT_FLASH_FILE_NAME BIT(25) +#define DL_OPT_FLASH_COMPONENT BIT(26) struct dl_opts { uint32_t present; /* flags of present items */ @@ -230,6 +232,8 @@ struct dl_opts { uint32_t region_snapshot_id; uint64_t region_address; uint64_t region_length; + const char *flash_file_name; + const char *flash_component; }; struct dl { @@ -1185,6 +1189,20 @@ static int dl_argv_parse(struct dl *dl, uint32_t o_required, if (err) return err; o_found |= DL_OPT_REGION_LENGTH; + } else if (dl_argv_match(dl, "file") && + (o_all & DL_OPT_FLASH_FILE_NAME)) { + dl_arg_inc(dl); + err = dl_argv_str(dl, &opts->flash_file_name); + if (err) + return err; + o_found |= DL_OPT_FLASH_FILE_NAME; + } else if (dl_argv_match(dl, "component") && + (o_all & DL_OPT_FLASH_COMPONENT)) { + dl_arg_inc(dl); + err = dl_argv_str(dl, &opts->flash_component); + if (err) + return err; + o_found |= DL_OPT_FLASH_COMPONENT; } else { pr_err("Unknown option \"%s\"\n", dl_argv(dl)); return -EINVAL; @@ -1389,6 +1407,12 @@ static void dl_opts_put(struct nlmsghdr *nlh, struct dl *dl) if (opts->present & DL_OPT_REGION_LENGTH) mnl_attr_put_u64(nlh, DEVLINK_ATTR_REGION_CHUNK_LEN, opts->region_length); + if (opts->present & DL_OPT_FLASH_FILE_NAME) + mnl_attr_put_strz(nlh, DEVLINK_ATTR_FLASH_UPDATE_FILE_NAME, + opts->flash_file_name); + if (opts->present & DL_OPT_FLASH_COMPONENT) + mnl_attr_put_strz(nlh, DEVLINK_ATTR_FLASH_UPDATE_COMPONENT, + opts->flash_component); } static int dl_argv_parse_put(struct nlmsghdr *nlh, struct dl *dl, @@ -1451,6 +1475,7 @@ static void cmd_dev_help(void) pr_err(" devlink dev param show [DEV name PARAMETER]\n"); pr_err(" devlink dev reload DEV\n"); pr_err(" devlink dev info [ DEV ]\n"); + pr_err(" devlink dev flash DEV file PATH [ component NAME ]\n"); } static bool cmp_arr_last_handle(struct dl *dl, const char *bus_name, @@ -2583,6 +2608,32 @@ static int cmd_dev_info(struct dl *dl) return err; } +static void cmd_dev_flash_help(void) +{ + pr_err("Usage: devlink dev flash DEV file PATH [ component NAME ]\n"); +} + +static int cmd_dev_flash(struct dl *dl) +{ + struct nlmsghdr *nlh; + int err; + + if (dl_argv_match(dl, "help") || dl_no_arg(dl)) { + cmd_dev_flash_help(); + return 0; + } + + nlh = mnlg_msg_prepare(dl->nlg, DEVLINK_CMD_FLASH_UPDATE, + NLM_F_REQUEST | NLM_F_ACK); + + err = dl_argv_parse_put(nlh, dl, DL_OPT_HANDLE | DL_OPT_FLASH_FILE_NAME, + DL_OPT_FLASH_COMPONENT); + if (err) + return err; + + return _mnlg_socket_sndrcv(dl->nlg, nlh, NULL, NULL); +} + static int cmd_dev(struct dl *dl) { if (dl_argv_match(dl, "help")) { @@ -2604,6 +2655,9 @@ static int cmd_dev(struct dl *dl) } else if (dl_argv_match(dl, "info")) { dl_arg_inc(dl); return cmd_dev_info(dl); + } else if (dl_argv_match(dl, "flash")) { + dl_arg_inc(dl); + return cmd_dev_flash(dl); } pr_err("Command \"%s\" not found\n", dl_argv(dl)); return -ENOENT; diff --git a/man/man8/devlink-dev.8 b/man/man8/devlink-dev.8 index 47838371fecd..1804463b2321 100644 --- a/man/man8/devlink-dev.8 +++ b/man/man8/devlink-dev.8 @@ -69,6 +69,16 @@ devlink-dev \- devlink device configuration .IR DEV .RI "]" +.ti -8 +.BR "devlink dev flash" +.IR DEV +.BR file +.IR PATH +.RI "[" +.BR target +.IR ID +.RI "]" + .SH "DESCRIPTION" .SS devlink dev show - display devlink device attributes @@ -177,6 +187,28 @@ versions may differ after flash has been updated, but before reboot. - specifies the devlink device to show. If this argument is omitted all devices are listed. +.SS devlink dev flash - write device's non-volatile memory. + +.PP +.I "DEV" +- specifies the devlink device to write to. + +.BR file +.I PATH +- Path to the file which will be written into device's flash. The path needs +to be relative to one of the directories searched by the kernel firmware loaded, +such as /lib/firmware. + +.BR component +.I NAME +- If device stores multiple firmware images in non-volatile memory, this +parameter may be used to indicate which firmware image should be written. +The value of +.I NAME +should match the component names from +.B "devlink dev info" +and may be driver-dependent. + .SH "EXAMPLES" .PP devlink dev show