From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-8.5 required=3.0 tests=DKIMWL_WL_MED,DKIM_SIGNED, DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI, SIGNED_OFF_BY,SPF_PASS,USER_AGENT_MUTT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 666F0C43381 for ; Wed, 27 Feb 2019 13:44:34 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 1A0F920C01 for ; Wed, 27 Feb 2019 13:44:34 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=resnulli-us.20150623.gappssmtp.com header.i=@resnulli-us.20150623.gappssmtp.com header.b="aGYVvOXD" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1730355AbfB0Nod (ORCPT ); Wed, 27 Feb 2019 08:44:33 -0500 Received: from mail-wr1-f65.google.com ([209.85.221.65]:42760 "EHLO mail-wr1-f65.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1730166AbfB0Noc (ORCPT ); Wed, 27 Feb 2019 08:44:32 -0500 Received: by mail-wr1-f65.google.com with SMTP id r5so18007479wrg.9 for ; Wed, 27 Feb 2019 05:44:31 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=resnulli-us.20150623.gappssmtp.com; s=20150623; h=date:from:to:cc:subject:message-id:references:mime-version :content-disposition:in-reply-to:user-agent; bh=cZxO4p9/ovn+Q07ynlte57fi0yU+zRGDzEACvyZQLCw=; b=aGYVvOXD9GQH010pLwoClMb66wvjlHYD00XFhg53ZabouIHe3zyGpuRYbujgS35u+Q uYtN4p9NI25IpH59IBSLgsrDMFIK4s0s7zAm4rGdVMYnUqKvz/L52PSJPTuxD6YRAItR E4l/WCuAsynAKOJKr0dDgtX79ifEjq3pju1mrkTyZXoT3jE7/VOqjSpb88HR0Ky8OhOw pFt7N4lf7k33WCvcQswPx+eBMt5BDrCfzOqOvCRa1EmtqmzJGwh6wtu8D3752Cr1kXV4 q2Ii8Pm4uYKrnTd4QxTvoLY+ovAVtIEbaxSqjQSIvqw3hNrzjPvjDY/HFIl9AJ/Q50yf uKzw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:from:to:cc:subject:message-id:references :mime-version:content-disposition:in-reply-to:user-agent; bh=cZxO4p9/ovn+Q07ynlte57fi0yU+zRGDzEACvyZQLCw=; b=cESI51J4YygOqlvjFD2FM/GyU3oEzzOtgnzV2DwJ1P+h18lmaP3bV7GINvzaft3Fod GzlVh79kmiqdZ352lelWT42ANRNaynO2/uJzxNpVOQh11wclasSAuJQfz9dOt44p6Rg/ 4dPYaJtxIY7m3gGv4mbmGxj6HsDPFeT6mdZVdcJgqfyXv+yPx/KVgXwIKsdZc6II2UPY ZpZyMirf+x5DeZsyoP8qNl/lwrDXnsaK9ginA385oo1NunXuj9yVIlF6JFFavCfeIzqo 9V6aKarhwzFLBE92M4CDvbBKlpKKQ+JZDJjhzeyqnDlDm12tfKyfKIfcYe65nJA7ckbK L1nw== X-Gm-Message-State: APjAAAWsKPP5jAmVcCHyBW3Aua/KJYZIeWY6P87vXyc3jHUgPXZkhHNu JberdVUtlLAPOsVcHnjjmnE9VA== X-Google-Smtp-Source: APXvYqwhE3irW81Q3d6LN1PciE/jSV/Du1xfO+Wp2lp+3qSTQm+2WB0BNXx4So977eWoFYdw/6a+ew== X-Received: by 2002:adf:d08d:: with SMTP id y13mr2261754wrh.99.1551275070278; Wed, 27 Feb 2019 05:44:30 -0800 (PST) Received: from localhost (mail.chocen-mesto.cz. [85.163.43.2]) by smtp.gmail.com with ESMTPSA id w3sm16668798wrl.22.2019.02.27.05.44.29 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Wed, 27 Feb 2019 05:44:29 -0800 (PST) Date: Wed, 27 Feb 2019 14:44:29 +0100 From: Jiri Pirko To: Jakub Kicinski Cc: dsahern@gmail.com, stephen@networkplumber.org, oss-drivers@netronome.com, netdev@vger.kernel.org Subject: Re: [PATCH iproute2-next] devlink: add support for updating device flash Message-ID: <20190227134429.GE2240@nanopsycho> References: <20190226202014.23626-1-jakub.kicinski@netronome.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20190226202014.23626-1-jakub.kicinski@netronome.com> User-Agent: Mutt/1.10.1 (2018-07-13) Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Tue, Feb 26, 2019 at 09:20:14PM CET, jakub.kicinski@netronome.com wrote: >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 Thanks! >--- > 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 >-- >2.19.2 >