From patchwork Mon Feb 11 06:59:23 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jakub Kicinski X-Patchwork-Id: 1039665 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="pBJjrvt7"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 43yc9K0mQrz9sML for ; Mon, 11 Feb 2019 17:59:49 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726363AbfBKG7r (ORCPT ); Mon, 11 Feb 2019 01:59:47 -0500 Received: from mail-qt1-f195.google.com ([209.85.160.195]:43066 "EHLO mail-qt1-f195.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726253AbfBKG7p (ORCPT ); Mon, 11 Feb 2019 01:59:45 -0500 Received: by mail-qt1-f195.google.com with SMTP id y4so10979887qtc.10 for ; Sun, 10 Feb 2019 22:59:44 -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:in-reply-to:references :mime-version:content-transfer-encoding; bh=tuk9vfyEPf1C7m8xlSMvR2YCMlxDOgoMw/Yea67kJA4=; b=pBJjrvt7v2JmzknYQcfynRJcrgFDPYvUPAUDWvSsIxWc9/ChaDYuVmD+Ys+nBC7djD FQcjCTLhzQD1hUmtXw/Oplz0gkQg8wv3uMuWLncHV2LKtB5WOPF115YGFH/MsRjYVshf iyuIJfiC9mz17vMioEAOPfXtjMjoUkcEESYJQEEATxCYPNxtwBodh1B4LRKOHOHHIjeU 9Y/ITF3Uw4rP/nojPSV5OoWx/QAQwXaenyuccc8dwWuLHZl1ByTW/mF5HpJnhxN4uzr/ Mic1cb9h13sMoj5weGvIm0vbHh5KS8M7dqXo8UevI6SXU+9S9FZhEeeu4pYGc8DzjeRD KIEQ== 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:in-reply-to :references:mime-version:content-transfer-encoding; bh=tuk9vfyEPf1C7m8xlSMvR2YCMlxDOgoMw/Yea67kJA4=; b=uQ/eLVMJ0LM7OunXF6W2dvO/asEQeh3sff+9ABw76Zi7TLYZx+sBJg3qS0P5pZP+Qi G40zHI/FKNQ0erUVsXQO1lPADy7LvIexS0qxaVcu8PXX5K87yv2IXZEvLuauAOwB1/zg 0tfu904jfQ4caDAHywG+ymRwit7IFBAp0MQE+nfxzG4IlVyMg2OExOz+YNu1Eqvxy++X qiXfzg5sMBQzalTt1sAsVScX30rAbzRQr85e7OkDQepDXnaim3hnLJI5LALGhlRmdrjc Vorivycbc7p7bdu1AtRdh1RZoWUrog6tDFiO+Og1VEI6T97PIdL9+oQlOe1e+gYR9lOb eMug== X-Gm-Message-State: AHQUAuZ2bCYS1Tt82ifcOYQQ+VeA1Wdg2pdLmYnDztGA7PcrnLS2+Sbc bXQeMF8Ul6OSWZpGz97EormDuupgEDYEcw== X-Google-Smtp-Source: AHgI3IbehuzQWu0E/5gi+Mszs/aWD4JGLSFv1KnLpE9Oq9hialZHJyFvWN1e2HSKBbu6D/QQhbWaoQ== X-Received: by 2002:a0c:9c89:: with SMTP id i9mr25165936qvf.153.1549868384513; Sun, 10 Feb 2019 22:59:44 -0800 (PST) Received: from jkicinski-Precision-T1700.netronome.com ([66.60.152.14]) by smtp.gmail.com with ESMTPSA id c68sm9677990qkf.65.2019.02.10.22.59.43 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 10 Feb 2019 22:59:44 -0800 (PST) From: Jakub Kicinski To: davem@davemloft.net, jiri@resnulli.us Cc: netdev@vger.kernel.org, oss-drivers@netronome.com, mkubecek@suse.cz, andrew@lunn.ch, Jakub Kicinski Subject: [RFC iproute2] devlink: add support for updating device flash Date: Sun, 10 Feb 2019 22:59:23 -0800 Message-Id: <20190211065923.22670-5-jakub.kicinski@netronome.com> X-Mailer: git-send-email 2.19.2 In-Reply-To: <20190211065923.22670-1-jakub.kicinski@netronome.com> References: <20190211065923.22670-1-jakub.kicinski@netronome.com> 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 --- devlink/devlink.c | 54 ++++++++++++++++++++++++++++++++++++++++++ man/man8/devlink-dev.8 | 29 +++++++++++++++++++++++ 2 files changed, 83 insertions(+) diff --git a/devlink/devlink.c b/devlink/devlink.c index d823512a4030..dd5f153eddc6 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_TARGET_ID 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; + uint32_t flash_target_id; }; 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, "target") && + (o_all & DL_OPT_FLASH_TARGET_ID)) { + dl_arg_inc(dl); + err = dl_argv_uint32_t(dl, &opts->flash_target_id); + if (err) + return err; + o_found |= DL_OPT_FLASH_TARGET_ID; } 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_TARGET_ID) + mnl_attr_put_u32(nlh, DEVLINK_ATTR_FLASH_UPDATE_TARGET_ID, + opts->flash_target_id); } 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 [ target ID ]\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 [ target ID ]\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_TARGET_ID); + 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..dda35fb09ee0 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,25 @@ 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 target +.I ID +- If device stores multiple firmware images in non-volatile memory, this +parameter may be used to indicate which firmware image should be written. +The default value of 0 means that all regions should be updated. +Interpretation of other values is driver-dependent. + .SH "EXAMPLES" .PP devlink dev show