From patchwork Wed Nov 6 22:15:22 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Atish Patra X-Patchwork-Id: 1190729 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 (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=wdc.com Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=wdc.com header.i=@wdc.com header.b="ly+vlhTT"; dkim-atps=neutral Received: from lists.denx.de (dione.denx.de [81.169.180.215]) by ozlabs.org (Postfix) with ESMTP id 477gqc0Z0gz9sP7 for ; Thu, 7 Nov 2019 09:16:43 +1100 (AEDT) Received: by lists.denx.de (Postfix, from userid 105) id 69B5AC21D72; Wed, 6 Nov 2019 22:16:16 +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=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 0975AC21DB6; Wed, 6 Nov 2019 22:15:47 +0000 (UTC) Received: by lists.denx.de (Postfix, from userid 105) id C24D1C21BE5; Wed, 6 Nov 2019 22:15:43 +0000 (UTC) Received: from esa1.hgst.iphmx.com (esa1.hgst.iphmx.com [68.232.141.245]) by lists.denx.de (Postfix) with ESMTPS id 00814C21C3F for ; Wed, 6 Nov 2019 22:15:42 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=wdc.com; i=@wdc.com; q=dns/txt; s=dkim.wdc.com; t=1573078543; x=1604614543; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=HNcClMr/t4RA/K4xiT3x6jYZXLdCQugS/d8GytmZN5w=; b=ly+vlhTTCI0V/WRL+hhR2goAhoTJgkGy+B0DC4kpPsvj9xGA0FvWGwfc +atoc3Ye1f43vKv/9JpbWWgqDOSH2UaC+WK2OOFRfn9RstAvMj4tluYX+ x3wg+9iqjLPxYa/5cCsFJLaNK4JW1M5vEyvM2GeJwFY6LF9ocxsRLTHSX tRJ2ptX1obDnc9bBFFJyep96lNTVQby0dsdp8zAJ+F0WVnV12B5nYIC/G cVxGPmnbcYPP/2gAmFiayhVO/+2e/eEZjLbpo6XKAUsRxHEZJ6TOxQFAB HQs7SkC4AKb40yVGneIF0GAUR4kr90rvfq9R8eqoBcenLiQe1tKSUhMTo g==; IronPort-SDR: HZk/XbD46FcnMRojpn73m2KXyv4RUADxPJ5devnIB0bo8xzHF5DAE2E0lnEhCTuV0Fda5pXslN mL/KT8tc+qAC8enrCS26l1oKMox01E4QJ1gS9mfgUTM5yThYxE3gXkMgbqtwW2ERjFIEnx8Eul 1tjiocmam3BQpNvjTrw83sVNclzMYk5DRvqMBqvglWtYPOG77Mvnoc6TtKMm3+GQRY0ogQBZ3W WjW97AAIdNxsChVqyH2E8A74+Ww/5UVjldfG5AGbxQKP0BkjApuwgifvZZz7STARYlDfFIaxCE qss= X-IronPort-AV: E=Sophos;i="5.68,275,1569254400"; d="scan'208";a="229562751" Received: from uls-op-cesaip02.wdc.com (HELO uls-op-cesaep02.wdc.com) ([199.255.45.15]) by ob1.hgst.iphmx.com with ESMTP; 07 Nov 2019 06:15:39 +0800 IronPort-SDR: Eg/5ua8IwHeukeV+AOThtf70EHBhTUMXIgj09EHn0QreL4U/WIoVaX9dz+F1Uh8U+5GA/Jr21W N2azba4Ht5g3YvTLtRi6Qyg3gcGGk1tlwsqabmqzPyt8dlmRUoAs/tntczo/i2hO0fflDYuBro V3Hv+zkntztiyBhKfjY3ptHhVVDJ22WfPSWUtJB/H6osYpW+2LhINTmMHeN8WfjEiea15lxBoC i+bS04dYidaBKaGQ2v79piTb7A7p45GXMib99KnT3l/0LnrB9MYLMWq7STekGcfXzjzIusaOO9 MiFWOHT/BrJ7cs7CHMjfw1o5 Received: from uls-op-cesaip01.wdc.com ([10.248.3.36]) by uls-op-cesaep02.wdc.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 06 Nov 2019 14:10:51 -0800 IronPort-SDR: rciDLnN0970DVMMrIgotJMXR/mQfiFIINf+CjGkVoFgnK6CdfhOrdrJOKK/LCeqnUmx7fyxU3s /Pr+uiWkDLw5LoLASUEham1EQMb7o9L2UaGvX6XbRzjT/xQyl13LDYOiKceSkChQ8TY4yBG7Ip Jx3iXx53FO1E6VhxqJGBk+LL7aZKU3MkShqVPOy8vcSui+EsSaPdJvQtWjsIoIMzAm9F2vQcO+ GaUvFbm7p92RFeNo98d0ZE84rvdMNbpHRwaGj8zGHE4PrpxcE/OtpehOLxohd5eutBihW0+7U8 cPg= WDCIronportException: Internal Received: from jedi-01.sdcorp.global.sandisk.com (HELO jedi-01.int.fusionio.com) ([10.11.143.218]) by uls-op-cesaip01.wdc.com with ESMTP; 06 Nov 2019 14:15:39 -0800 From: Atish Patra To: u-boot@lists.denx.de Date: Wed, 6 Nov 2019 14:15:22 -0800 Message-Id: <20191106221522.28246-4-atish.patra@wdc.com> X-Mailer: git-send-email 2.21.0 In-Reply-To: <20191106221522.28246-1-atish.patra@wdc.com> References: <20191106221522.28246-1-atish.patra@wdc.com> MIME-Version: 1.0 Cc: Thierry Reding , Loic Pallardy , Joe Hershberger , Alexander Graf , trini@konsulko.com Subject: [U-Boot] [RFC/RFT PATCH v3 3/3] image: Add compressed Image parsing support in booti. 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: , Errors-To: u-boot-bounces@lists.denx.de Sender: "U-Boot" Add compressed Image parsing support so that booti can parse both flat and compressed Image to boot Linux. Currently, it is difficult to calculate a safe address for every board where the compressed image can be decompressed. It is also not possible to figure out the size of the compressed file as well. Thus, user need to set two additional environment variables kernel_comp_addr_r and filesize to make this work. Following compression methods are supported for now. lzma, lzo, bzip2, gzip. lz4 support is not added as ARM64 kernel generates a lz4 compressed image with legacy header which U-Boot doesn't know how to parse and decompress. Tested on HiFive Unleashed and Qemu for RISC-V. Tested on Qemu for ARM64. Signed-off-by: Atish Patra Reviewed-by: Tom Rini --- I could not test this patch on any ARM64 boards due to lack of access to any ARM64 board. If anybody can test it on ARM64, that would be great. --- cmd/booti.c | 39 ++++++++++++++++++++++++++- doc/README.distro | 12 +++++++++ doc/board/sifive/fu540.rst | 55 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 105 insertions(+), 1 deletion(-) diff --git a/cmd/booti.c b/cmd/booti.c index c36b0235df8c..531de507149c 100644 --- a/cmd/booti.c +++ b/cmd/booti.c @@ -13,6 +13,7 @@ #include #include +DECLARE_GLOBAL_DATA_PTR; /* * Image booting support */ @@ -23,6 +24,11 @@ static int booti_start(cmd_tbl_t *cmdtp, int flag, int argc, ulong ld; ulong relocated_addr; ulong image_size; + uint8_t *temp; + ulong dest; + ulong dest_end; + unsigned long comp_len; + int ctype; ret = do_bootm_states(cmdtp, flag, argc, argv, BOOTM_STATE_START, images, 1); @@ -37,6 +43,33 @@ static int booti_start(cmd_tbl_t *cmdtp, int flag, int argc, debug("* kernel: cmdline image address = 0x%08lx\n", ld); } + temp = map_sysmem(ld, 0); + ctype = image_decomp_type(temp, 2); + if (ctype > 0) { + dest = env_get_ulong("kernel_comp_addr_r", 16, 0); + comp_len = env_get_ulong("filesize", 16, 0); + if (!dest || !comp_len) { + puts("kernel_comp_addr_r or filesize is not provided!\n"); + return -EINVAL; + } + if (dest < gd->ram_base || dest > gd->ram_top) { + puts("kernel_comp_addr_r is outside of DRAM range!\n"); + return -EINVAL; + } + + debug("kernel image compression type %d size = 0x%08lx address = 0x%08lx\n", + ctype, comp_len, (ulong)dest); + + ret = image_decomp(ctype, 0, ld, IH_TYPE_KERNEL, + (void *)dest, (void *)ld, comp_len, + CONFIG_SYS_BOOTM_LEN, &dest_end); + if (ret) + return ret; + /* dest_end contains the uncompressed Image size */ + memmove((void *) ld, (void *)dest, dest_end); + } + unmap_sysmem((void *)ld); + ret = booti_setup(ld, &relocated_addr, &image_size, false); if (ret != 0) return 1; @@ -96,10 +129,14 @@ int do_booti(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) #ifdef CONFIG_SYS_LONGHELP static char booti_help_text[] = "[addr [initrd[:size]] [fdt]]\n" - " - boot Linux 'Image' stored at 'addr'\n" + " - boot Linux flat or compressed 'Image' stored at 'addr'\n" "\tThe argument 'initrd' is optional and specifies the address\n" "\tof an initrd in memory. The optional parameter ':size' allows\n" "\tspecifying the size of a RAW initrd.\n" + "\tCurrently only booting from gz, bz2, lzma and lz4 compression\n" + "\ttypes are supported. In order to boot from any of these compressed\n" + "\timages, user have to set kernel_comp_addr_r and filesize enviornment\n" + "\tvariables beforehand.\n" #if defined(CONFIG_OF_LIBFDT) "\tSince booting a Linux kernel requires a flat device-tree, a\n" "\tthird argument providing the address of the device-tree blob\n" diff --git a/doc/README.distro b/doc/README.distro index ab6e6f4e74be..67b49e1e4b6a 100644 --- a/doc/README.distro +++ b/doc/README.distro @@ -246,6 +246,18 @@ kernel_addr_r: A size of 16MB for the kernel is likely adequate. +kernel_comp_addr_r: + Optional. This is only required if user wants to boot Linux from a compressed + Image(.gz, .bz2, .lzma, .lzo) using booti command. It represents the location + in RAM where the compressed Image will be decompressed temporarily. Once the + decompression is complete, decompressed data will be moved kernel_addr_r for + booting. + +filesize: + Optional. This is only required if user wants to boot Linux from a compressed + Image using booti command. It represents the size of the compressed file. The + size has to at least the size of loaded image for decompression to succeed. + pxefile_addr_r: Mandatory. The location in RAM where extlinux.conf will be loaded to prior diff --git a/doc/board/sifive/fu540.rst b/doc/board/sifive/fu540.rst index 7807f5b2c128..df2c5ad8d3e3 100644 --- a/doc/board/sifive/fu540.rst +++ b/doc/board/sifive/fu540.rst @@ -138,6 +138,10 @@ load uImage. => setenv netmask 255.255.252.0 => setenv serverip 10.206.4.143 => setenv gateway 10.206.4.1 + +If you want to use a flat kernel image such as Image file + +.. code-block:: none => tftpboot ${kernel_addr_r} /sifive/fu540/Image ethernet@10090000: PHY present at 0 ethernet@10090000: Starting autonegotiation... @@ -177,6 +181,57 @@ load uImage. 1.2 MiB/s done Bytes transferred = 8867100 (874d1c hex) + +Or if you want to use a compressed kernel image file such as Image.gz + +.. code-block:: none + => tftpboot ${kernel_addr_r} /sifive/fu540/Image.gz + ethernet@10090000: PHY present at 0 + ethernet@10090000: Starting autonegotiation... + ethernet@10090000: Autonegotiation complete + ethernet@10090000: link up, 1000Mbps full-duplex (lpa: 0x3c00) + Using ethernet@10090000 device + TFTP from server 10.206.4.143; our IP address is 10.206.7.133 + Filename '/sifive/fu540/Image.gz'. + Load address: 0x84000000 + Loading: ################################################################# + ################################################################# + ################################################################# + ################################################################# + ################################################################# + ################################################################# + ################################################################# + ################################################################# + ################################################################# + ################################################################# + ################################################################# + ################################################################# + ################################################################# + ################################################################# + ################################################################# + ################################################################# + ################################################################# + ################################################################# + ################################################################# + ################################################################# + ################################################################# + ################################################################# + ################################################################# + ################################################################# + ################################################################# + ################################################################# + ########################################## + 1.2 MiB/s + done + Bytes transferred = 4809458 (4962f2 hex) + =>setenv kernel_comp_addr_r 0x90000000 + =>setenv filesize 0x500000 + +By this time, correct kernel image is loaded and required enviornment variables +are set. You can proceed to load the ramdisk and device tree from the tftp server +as well. + +.. code-block:: none => tftpboot ${ramdisk_addr_r} /sifive/fu540/uRamdisk ethernet@10090000: PHY present at 0 ethernet@10090000: Starting autonegotiation...