From patchwork Thu Dec 28 06:12:28 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jagan Teki X-Patchwork-Id: 853353 X-Patchwork-Delegate: trini@ti.com Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=lists.denx.de (client-ip=81.169.180.215; helo=lists.denx.de; envelope-from=u-boot-bounces@lists.denx.de; receiver=) Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=amarulasolutions-com.20150623.gappssmtp.com header.i=@amarulasolutions-com.20150623.gappssmtp.com header.b="J+vSpA0W"; dkim-atps=neutral Received: from lists.denx.de (dione.denx.de [81.169.180.215]) by ozlabs.org (Postfix) with ESMTP id 3z6fyL5ZJlz9s4s for ; Thu, 28 Dec 2017 17:31:54 +1100 (AEDT) Received: by lists.denx.de (Postfix, from userid 105) id 65CF8C21DA9; Thu, 28 Dec 2017 06:21:59 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on lists.denx.de X-Spam-Level: X-Spam-Status: No, score=-0.0 required=5.0 tests=RCVD_IN_DNSWL_BLOCKED, RCVD_IN_MSPIKE_H3, RCVD_IN_MSPIKE_WL, T_DKIM_INVALID autolearn=unavailable autolearn_force=no version=3.4.0 Received: from lists.denx.de (localhost [IPv6:::1]) by lists.denx.de (Postfix) with ESMTP id 5D4C8C21DCE; Thu, 28 Dec 2017 06:18:03 +0000 (UTC) Received: by lists.denx.de (Postfix, from userid 105) id 103D1C21DB0; Thu, 28 Dec 2017 06:14:43 +0000 (UTC) Received: from mail-pg0-f67.google.com (mail-pg0-f67.google.com [74.125.83.67]) by lists.denx.de (Postfix) with ESMTPS id 1607DC21DE8 for ; Thu, 28 Dec 2017 06:14:39 +0000 (UTC) Received: by mail-pg0-f67.google.com with SMTP id f18so2937144pga.10 for ; Wed, 27 Dec 2017 22:14:39 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=amarulasolutions-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=IbTrGrf+mN6g0FWisNBuaHdgrA/rHO9FWS4XX1tfmvs=; b=J+vSpA0Wbrdzr86D7H4hjiXzzcBHhmR07SDkOfnQPEARbIf7qoKgHvigUwGntu5PC3 wJ+LCZJaOhEiD2+JoV1mtR2uIiz3EQxtnSBZjebO4z9OxJjDI4KXrN3pD16XsEkGFE7n /onrP0k+wZ2dJnI2hD9tZCce2Ms0kcp1ETVC2OMk95+/F/dbLuWdqfcYGGVwNrtYbHvE WBRuQ+NDpSKnkn7JCY/IGulXxKRU+yb6Mo9tq59ta938Ny7k/MA4F5wCAGuYpDz2lxjI RBt6BPptYBhdzyXIlpF6lzl+Dc0Up3HmvHYftYq9zY0Q+dcRfEIXyqVYuau1LNW2f+U+ wDRQ== 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; bh=IbTrGrf+mN6g0FWisNBuaHdgrA/rHO9FWS4XX1tfmvs=; b=QUQzsW0oDZghtHwlgM0RyDeiIjRjEEscJLsrLfIPLbOISyvN1xZ1O+GcJZqQkgw8LP W30HIRcLNX1CdkOt8p/twY8iD6espc4ZVcjG9bcbHr+cnZpvKzV7Dr17cMuJGIemmVTv vPrZ4CzPuaz7SD2DFyC2Ki7aC7QAEaAYjOGWERRG19Ff0PiHvFFiAn98iXojnL3Pc0Uj PXlbr/C6vvXAyOMXLC30a4K9V2JXz7p7IQ0DLETO2oLxT+T8C62Ru6iLKY9YtsnGiDIT R4IE7yYuBtUlKUvATsctuUQlV4c0seCSoBcyzwwvieCgWQkgx2IkIE90Igbbb56rbRpr gBWw== X-Gm-Message-State: AKGB3mIf9nmnzhhPjbte7goPow3DDsIDl53WXpuqcxRNUceh4Uy/4Jjk d5gEKONVVpy2ktB2jFfPmSFrksZS X-Google-Smtp-Source: ACJfBotg2bP1MdaLeCtyqP/fm9NVdNPMNgbX7/4hZfitm6foUusPuSHVJ7fMOZbs19a05SMBYYQ7Iw== X-Received: by 10.98.204.198 with SMTP id j67mr30961356pfk.41.1514441677378; Wed, 27 Dec 2017 22:14:37 -0800 (PST) Received: from localhost.localdomain ([27.59.176.39]) by smtp.gmail.com with ESMTPSA id s189sm16789697pgc.5.2017.12.27.22.14.34 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Wed, 27 Dec 2017 22:14:36 -0800 (PST) From: Jagan Teki To: u-boot@lists.denx.de Date: Thu, 28 Dec 2017 11:42:28 +0530 Message-Id: <1514441553-27543-23-git-send-email-jagan@amarulasolutions.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1514441553-27543-1-git-send-email-jagan@amarulasolutions.com> References: <1514441553-27543-1-git-send-email-jagan@amarulasolutions.com> Cc: Tom Rini Subject: [U-Boot] [PATCH v10 22/27] cmd: spinor: sync/update protect command X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.18 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: u-boot-bounces@lists.denx.de Sender: "U-Boot" sync the protect command from legacy cmd/sf.c and update them according to current spi-nor framework. Signed-off-by: Suneel Garapati Signed-off-by: Jagan Teki --- cmd/spinor.c | 47 ++++++++++++++++++++++++++++++++++++++++++++++- drivers/mtd/mtd-uclass.c | 19 +++++++++++++++++++ include/mtd.h | 11 +++++++++++ 3 files changed, 76 insertions(+), 1 deletion(-) diff --git a/cmd/spinor.c b/cmd/spinor.c index b781151..ef8decf 100644 --- a/cmd/spinor.c +++ b/cmd/spinor.c @@ -151,6 +151,44 @@ static int do_spinor_write_read(int argc, char * const argv[]) return ret == 0 ? CMD_RET_SUCCESS : CMD_RET_FAILURE; } +static int do_spinor_protect(int argc, char * const argv[]) +{ + struct mtd_info *mtd; + struct spi_nor *nor; + loff_t sector, len, maxsize; + char *endp; + int idx = 0; + bool prot = false; + int ret = CMD_RET_FAILURE; + + if (argc != 4) + return CMD_RET_USAGE; + + nor = init_spinor_device(curr_device, false); + if (!nor) + return CMD_RET_FAILURE; + + sector = simple_strtoul(argv[2], &endp, 16); + if (*argv[2] == 0 || *endp != 0) + return CMD_RET_FAILURE; + + mtd = spi_nor_get_mtd_info(nor); + if (mtd_arg_off_size(argc - 3, &argv[3], &idx, §or, &len, + &maxsize, MTD_DEV_TYPE_NOR, mtd->size)) + return CMD_RET_FAILURE; + + if (strcmp(argv[1], "lock") == 0) + prot = true; + else if (strcmp(argv[1], "unlock") == 0) + prot = false; + else + return -1; /* Unknown parameter */ + + ret = mtd_dprotect(mtd, sector, len, prot); + + return ret == 0 ? CMD_RET_SUCCESS : CMD_RET_FAILURE; +} + static int mtd_parse_len_arg(struct mtd_info *mtd, char *arg, loff_t *len) { char *ep; @@ -258,6 +296,11 @@ static int do_spinor(cmd_tbl_t *cmdtp, int flag, int argc, goto done; } + if (strcmp(cmd, "protect") == 0) { + ret = do_spinor_protect(argc, argv); + goto done; + } + done: if (ret != -1) return ret; @@ -272,7 +315,9 @@ static char spinor_help_text[] = "spinor dev [devnum] - show or set current spinor device\n" "spinor erase offset len - erase 'len' bytes from 'offset'\n" "spinor write addr to len - write 'len' bytes to 'to' from 'addr'\n" - "spinor read addr from len - read 'len' bytes from 'from' to 'addr'"; + "spinor read addr from len - read 'len' bytes from 'from' to 'addr'\n" + "spinor protect lock/unlock sector len - protect/unprotect 'len' bytes starting\n" + " at address 'sector'"; U_BOOT_CMD( spinor, 5, 1, do_spinor, diff --git a/drivers/mtd/mtd-uclass.c b/drivers/mtd/mtd-uclass.c index d9ecfea..535f68e 100644 --- a/drivers/mtd/mtd-uclass.c +++ b/drivers/mtd/mtd-uclass.c @@ -73,6 +73,25 @@ int mtd_dwrite(struct mtd_info *mtd, loff_t to, size_t len, size_t *retlen, return ops->write(dev, to, len, retlen, buf); } +int mtd_dprotect(struct mtd_info *mtd, loff_t ofs, uint64_t len, bool prot) +{ + struct udevice *dev = mtd->dev; + const struct mtd_ops *ops = mtd_get_ops(dev); + + if (!ops->lock || !ops->unlock) + return -ENOSYS; + + if (ofs < 0 || ofs > mtd->size || len > mtd->size - ofs) + return -EINVAL; + if (!len) + return 0; + + if (prot) + return ops->lock(dev, ofs, len); + else + return ops->unlock(dev, ofs, len); +} + int mtd_find_device(int mtd_if_type, int devnum, struct udevice **devp) { struct uclass *uc; diff --git a/include/mtd.h b/include/mtd.h index acb2256..6390133 100644 --- a/include/mtd.h +++ b/include/mtd.h @@ -61,6 +61,17 @@ int mtd_dwrite(struct mtd_info *mtd, loff_t to, size_t len, size_t *retlen, const u_char *buf); /** + * mtd_dprotect - protect area of MTD device + * + * @mtd: MTD device + * @ofs: sector start offset into device in bytes to protect to + * @len: len of bytes to protect + * @prot: protect boolean, true for lock, false for unlock + * @return 0 if OK, -ve on error + */ +int mtd_dprotect(struct mtd_info *mtd, loff_t ofs, uint64_t len, bool prot); + +/** * mtd_derase() - erase blocks of the MTD device * * @mtd: MTD device