From patchwork Mon Oct 21 13:38:59 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Igor Opaniuk X-Patchwork-Id: 1180611 X-Patchwork-Delegate: sbabic@denx.de Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (no SPF record) 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; dmarc=fail (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="FIsOOcwO"; dkim-atps=neutral Received: from lists.denx.de (dione.denx.de [81.169.180.215]) by ozlabs.org (Postfix) with ESMTP id 46xd8h2swBz9sR3 for ; Tue, 22 Oct 2019 00:41:39 +1100 (AEDT) Received: by lists.denx.de (Postfix, from userid 105) id 709F6C21E6A; Mon, 21 Oct 2019 13:40:24 +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=FREEMAIL_FROM, RCVD_IN_MSPIKE_H2, 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 8952EC21DB3; Mon, 21 Oct 2019 13:40:07 +0000 (UTC) Received: by lists.denx.de (Postfix, from userid 105) id A5A27C21DED; Mon, 21 Oct 2019 13:39:13 +0000 (UTC) Received: from mail-wr1-f68.google.com (mail-wr1-f68.google.com [209.85.221.68]) by lists.denx.de (Postfix) with ESMTPS id C1324C21DB6 for ; Mon, 21 Oct 2019 13:39:10 +0000 (UTC) Received: by mail-wr1-f68.google.com with SMTP id c6so1833213wrm.6 for ; Mon, 21 Oct 2019 06:39:10 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=CWdoml6p3iXKOo9G7jmsB5JLSIoUiOfe/pPcqFc3skc=; b=FIsOOcwO7zjD3bN+tTyGPdAPyYOuLex6ScYNWmbkDB7agJaD6V57tghnr+SMX51GwW exVjTIXLGrjREf30kPVf85kiZD8Pv5CgefJOQ18340QjykQ+GJGv1WznilA/22LwlsM5 EPIBvni3jcDoUqC2y8ImwZS4DJWiiSmoju5h3dGSnep7PtumO/X12o36kxGkpLJolE3b fB39UEOMRZrS+Tf5Lc7wjs6Hdt4jliJnqOckB3AyJTSa8wgIc2cLcSVLdAkXCsHEuofq qF2Mlq1wjorE0WAMW+rIYnizSDw+OE3F0af8kbOZ3y5X7itqg3oZy5H6aXA4KD/k+aDu v0bA== 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=CWdoml6p3iXKOo9G7jmsB5JLSIoUiOfe/pPcqFc3skc=; b=NCpnMTUShwwhqsIBZZV8J0Ve47xbmwAJEHVd/oO7wuBz+FBbRdH7ewYe+icZmtbg5A a9F2AIKPskORTVA56H+9Pm9nV03vcclI498UFIaskhGjm4Z3mzna6Y4Bl6v5zNNvNc4a SGkswxOnJhjL/YjQst0e/6yMLCQbinHhyYzVu3sNaWfbSNRJYY4XU7oP3VBA+QQddjbS BHr9Mkq982D5o8O9qArRcCN78qvaaz57r4j5d464palbV2mBe0+Cxi6w5Mq/ZhcyP2Ze aImaUCGpT2yu4yhaLWFOIFoWofP9IJ66kv/0SOEU8ziTpUCoIqWi+46zhEdLh0NZe8kT kF+Q== X-Gm-Message-State: APjAAAVWlEYFRsV1lInBcH6f4+4vDMuTfEfX8v+njBci2qSgRXnVaX4U t4sVtC5D3sa2w86G6jhqBoYsvJ389pk= X-Google-Smtp-Source: APXvYqx5DEHJCLmTxZgby1o+FdaD0m4vEqShlVedCk8T9vK11y1RvF1Qc+Y8nippZe7UJEkJx5h8bg== X-Received: by 2002:adf:f101:: with SMTP id r1mr2246110wro.320.1571665150065; Mon, 21 Oct 2019 06:39:10 -0700 (PDT) Received: from localhost ([194.105.145.90]) by smtp.gmail.com with ESMTPSA id k3sm1846092wro.77.2019.10.21.06.39.09 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Mon, 21 Oct 2019 06:39:09 -0700 (PDT) From: Igor Opaniuk To: u-boot@lists.denx.de Date: Mon, 21 Oct 2019 16:38:59 +0300 Message-Id: <20191021133859.23824-6-igor.opaniuk@gmail.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20191021133859.23824-1-igor.opaniuk@gmail.com> References: <20191021133859.23824-1-igor.opaniuk@gmail.com> Cc: Anti Sullin , Igor Opaniuk , "NXP i.MX U-Boot Team" , Marcel Ziswiler , Max Krummenacher Subject: [U-Boot] [PATCH v2 5/5] imx: nandbcb: add support for writing BCB only 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" From: Igor Opaniuk Add subcommand for add writing BCB only, where we provide appropriate offsets for firmware1 and firmware2 and size. Example of usage: - nandbcb bcbonly 0x00180000 0x00080000 0x00200000 Writing 1024 bytes to 0x0: randomizing OK Writing 1024 bytes to 0x20000: randomizing OK Signed-off-by: Igor Opaniuk Reviewed-by: Oleksandr Suvorov Tested-by: Max Krummenacher --- arch/arm/mach-imx/cmd_nandbcb.c | 92 ++++++++++++++++++++++++++++++++- 1 file changed, 91 insertions(+), 1 deletion(-) diff --git a/arch/arm/mach-imx/cmd_nandbcb.c b/arch/arm/mach-imx/cmd_nandbcb.c index fbe780ccda..d11e16cf83 100644 --- a/arch/arm/mach-imx/cmd_nandbcb.c +++ b/arch/arm/mach-imx/cmd_nandbcb.c @@ -364,6 +364,88 @@ err: return ret; } +static int do_nandbcb_bcbonly(int argc, char * const argv[]) +{ + struct fcb_block *fcb; + struct dbbt_block *dbbt; + u32 fw_len, fw1_off, fw2_off; + struct mtd_info *mtd; + void *dbbt_page, *dbbt_data_page; + int dev, ret; + + dev = nand_curr_device; + if ((dev < 0) || (dev >= CONFIG_SYS_MAX_NAND_DEVICE) || + (!get_nand_dev_by_index(dev))) { + puts("No devices available\n"); + return CMD_RET_FAILURE; + } + + mtd = get_nand_dev_by_index(dev); + + if (argc < 3) + return CMD_RET_FAILURE; + + fw_len = simple_strtoul(argv[1], NULL, 16); + fw1_off = simple_strtoul(argv[2], NULL, 16); + + if (argc > 3) + fw2_off = simple_strtoul(argv[3], NULL, 16); + else + fw2_off = fw1_off; + + /* fill fcb */ + fcb = kzalloc(sizeof(*fcb), GFP_KERNEL); + if (!fcb) { + debug("failed to allocate fcb\n"); + ret = -ENOMEM; + return CMD_RET_FAILURE; + } + + fill_fcb(fcb, mtd, fw1_off / mtd->writesize, + fw2_off / mtd->writesize, fw_len / mtd->writesize); + + /* fill dbbt */ + dbbt_page = kzalloc(mtd->writesize, GFP_KERNEL); + if (!dbbt_page) { + debug("failed to allocate dbbt_page\n"); + ret = -ENOMEM; + goto fcb_err; + } + + dbbt_data_page = kzalloc(mtd->writesize, GFP_KERNEL); + if (!dbbt_data_page) { + debug("failed to allocate dbbt_data_page\n"); + ret = -ENOMEM; + goto dbbt_page_err; + } + + dbbt = dbbt_page; + dbbt->checksum = 0; + dbbt->fingerprint = DBBT_FINGERPRINT2; + dbbt->version = DBBT_VERSION_1; + ret = dbbt_fill_data(mtd, dbbt_data_page, 0); + if (ret < 0) + goto dbbt_data_page_err; + else if (ret > 0) + dbbt->dbbtpages = 1; + + /* write fcb and dbbt to nand */ + ret = write_fcb_dbbt(mtd, fcb, dbbt, dbbt_data_page, 0); +dbbt_data_page_err: + kfree(dbbt_data_page); +dbbt_page_err: + kfree(dbbt_page); +fcb_err: + kfree(fcb); + + if (ret < 0) { + printf("failed to write FCB/DBBT\n"); + return CMD_RET_FAILURE; + } + + return CMD_RET_SUCCESS; +} + static int do_nandbcb_update(int argc, char * const argv[]) { struct mtd_info *mtd; @@ -420,6 +502,11 @@ static int do_nandbcb(cmd_tbl_t *cmdtp, int flag, int argc, goto done; } + if (strcmp(cmd, "bcbonly") == 0) { + ret = do_nandbcb_bcbonly(argc, argv); + goto done; + } + done: if (ret != -1) return ret; @@ -430,7 +517,10 @@ usage: #ifdef CONFIG_SYS_LONGHELP static char nandbcb_help_text[] = "update addr off|partition len - update 'len' bytes starting at\n" - " 'off|part' to memory address 'addr', skipping bad blocks"; + " 'off|part' to memory address 'addr', skipping bad blocks\n" + "bcbonly fw-size fw1-off [fw2-off] - write only BCB (FCB and DBBT)\n" + " where `fw-size` is fw sizes in bytes, `fw1-off` and\n" + " and `fw2-off` - firmware offsets "; #endif U_BOOT_CMD(nandbcb, 5, 1, do_nandbcb,