From patchwork Sun Aug 1 18:02:43 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Simon Glass X-Patchwork-Id: 1512095 X-Patchwork-Delegate: jagannadh.teki@gmail.com Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=lists.denx.de (client-ip=2a01:238:438b:c500:173d:9f52:ddab:ee01; helo=phobos.denx.de; envelope-from=u-boot-bounces@lists.denx.de; receiver=) Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=chromium.org header.i=@chromium.org header.a=rsa-sha256 header.s=google header.b=a8Ou8bur; dkim-atps=neutral Received: from phobos.denx.de (phobos.denx.de [IPv6:2a01:238:438b:c500:173d:9f52:ddab:ee01]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 4Gd8C91xNqz9sT6 for ; Mon, 2 Aug 2021 04:03:49 +1000 (AEST) Received: from h2850616.stratoserver.net (localhost [IPv6:::1]) by phobos.denx.de (Postfix) with ESMTP id 436EC832D6; Sun, 1 Aug 2021 20:03:14 +0200 (CEST) Authentication-Results: phobos.denx.de; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=u-boot-bounces@lists.denx.de Authentication-Results: phobos.denx.de; dkim=pass (1024-bit key; unprotected) header.d=chromium.org header.i=@chromium.org header.b="a8Ou8bur"; dkim-atps=neutral Received: by phobos.denx.de (Postfix, from userid 109) id 82E4E831DD; Sun, 1 Aug 2021 20:03:03 +0200 (CEST) X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on phobos.denx.de X-Spam-Level: X-Spam-Status: No, score=-2.7 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,SPF_HELO_NONE autolearn=ham autolearn_force=no version=3.4.2 Received: from mail-ot1-x331.google.com (mail-ot1-x331.google.com [IPv6:2607:f8b0:4864:20::331]) (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits)) (No client certificate requested) by phobos.denx.de (Postfix) with ESMTPS id EABB682BB2 for ; Sun, 1 Aug 2021 20:02:54 +0200 (CEST) Authentication-Results: phobos.denx.de; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=sjg@chromium.org Received: by mail-ot1-x331.google.com with SMTP id h63-20020a9d14450000b02904ce97efee36so4706927oth.7 for ; Sun, 01 Aug 2021 11:02:54 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=V1UCts+zYbmLeJNJmNUurS8HWR4rMxCCSQxR4ka85Xo=; b=a8Ou8buruV2H7FDYJEp3AJ/JhTyK96dzBA7CBH6xjdJHufU5gkL1WiYbACS9noi3r4 h8V5gp2Dp7P+y7gRUMUPZLvAWOBi0qSsRdjWJY/XPLUjOhccgV5jCnu5rRc0Q6hCFSZ7 Ltpt8nTF0kOmm/9tHsWGM5EbO8knqw2uZ3S0I= 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=V1UCts+zYbmLeJNJmNUurS8HWR4rMxCCSQxR4ka85Xo=; b=mq/c/EtrVYpzrjgE/Yqd4Fl7x+miqydrb3LOSbMYYSL5h0L+qyeN5D70HzPzCJWpsB emW66Ndn8AlL1OQE2Iw15WHqEjz6VRQzhGWDnGVh96wACx3WM4qj7hbCd1I/xZAAHfgF CyNboabRjjdJ1tiztSoHyPnrX7pdMVAo7g0+MgGBGh0/kLCleLPQcT3CY4upgvF6Ym+m xDeu+FHs0dbfGjpUgt4vcpV6BImq0USrcQ1KH5SsFmpGhyc8bbGN/Ja8Ake1G9md5uh3 k13jvPSHANbuCbMv0ALsyCFVXrspAU3s4BbtsMrRihanhJ9pUJlxLlIQRhBg8KGqO3bX v+dg== X-Gm-Message-State: AOAM533IuP7GIlxrOcrF6++vwGchTQY2+NW8MZBiXlfwkh305gKI7x2J TB1HYAP2pHd+06F1EWHI2RxqmiyLxs1NkZ0X X-Google-Smtp-Source: ABdhPJyEWflU3Ea6hifT7QwgV2dXFU3uKydIWql0WmkfOlZQvbhoZ9nsXzMzrs/KM5hF/f9+WjFNfw== X-Received: by 2002:a05:6830:2a0b:: with SMTP id y11mr9581923otu.275.1627840973058; Sun, 01 Aug 2021 11:02:53 -0700 (PDT) Received: from kiwi.bld.corp.google.com (c-67-190-101-114.hsd1.co.comcast.net. [67.190.101.114]) by smtp.gmail.com with ESMTPSA id s184sm1386744oig.25.2021.08.01.11.02.51 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 01 Aug 2021 11:02:52 -0700 (PDT) From: Simon Glass To: U-Boot Mailing List Cc: Heinrich Schuchardt , Jagan Teki , Simon Glass , Bin Meng , =?utf-8?q?Fr=C3=A9d=C3=A9ric_Danis?= , =?utf-8?q?Marek_Beh=C3=BAn?= , Michal Simek , Mike Frysinger , Ovidiu Panait , Patrick Delaunay , Peng Fan , Pragnesh Patel , Pratyush Yadav , Priyanka Jain , Sean Anderson , Wasim Khan Subject: [PATCH v2 4/4] sf: Provide a command to access memory-mapped SPI Date: Sun, 1 Aug 2021 12:02:43 -0600 Message-Id: <20210801180243.2166525-5-sjg@chromium.org> X-Mailer: git-send-email 2.32.0.554.ge1b32706d8-goog In-Reply-To: <20210801180243.2166525-1-sjg@chromium.org> References: <20210801180243.2166525-1-sjg@chromium.org> MIME-Version: 1.0 X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.34 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" X-Virus-Scanned: clamav-milter 0.103.2 at phobos.denx.de X-Virus-Status: Clean Add a new 'sf mmap' function to show the address of a SPI offset, if the hardware supports it. This is useful on x86 systems. Signed-off-by: Simon Glass --- (no changes since v1) arch/Kconfig | 2 ++ cmd/Kconfig | 8 ++++++++ cmd/sf.c | 35 +++++++++++++++++++++++++++++++++ doc/usage/sf.rst | 50 ++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 95 insertions(+) diff --git a/arch/Kconfig b/arch/Kconfig index b6f9e177b64..0c718535279 100644 --- a/arch/Kconfig +++ b/arch/Kconfig @@ -136,6 +136,7 @@ config SANDBOX imply CMD_LZMADEC imply CMD_SATA imply CMD_SF + imply CMD_SF_MMAP imply CMD_SF_TEST imply CRC32_VERIFY imply FAT_WRITE @@ -201,6 +202,7 @@ config X86 imply CMD_IRQ imply CMD_PCI imply CMD_SF + imply CMD_SF_MMAP imply CMD_SF_TEST imply CMD_ZBOOT imply DM_ETH diff --git a/cmd/Kconfig b/cmd/Kconfig index ffef3cc76ca..e96b6e798bb 100644 --- a/cmd/Kconfig +++ b/cmd/Kconfig @@ -1273,6 +1273,14 @@ config CMD_SF help SPI Flash support +config CMD_SF_MMAP + bool "sf mmap - Access memory-mapped SPI flash" + depends on CMD_SF + help + On some systems part of the SPI flash is mapped into mmemory. This + command provides a way to map a SPI-flash offset to a memory address, + so that the contents can be browsed using 'md', for example. + config CMD_SF_TEST bool "sf test - Allow testing of SPI flash" depends on CMD_SF diff --git a/cmd/sf.c b/cmd/sf.c index d4f5ecee38c..28b480acc58 100644 --- a/cmd/sf.c +++ b/cmd/sf.c @@ -384,6 +384,36 @@ static int do_spi_protect(int argc, char *const argv[]) return ret == 0 ? 0 : 1; } +static int do_spi_flash_mmap(int argc, char *const argv[]) +{ + loff_t offset, len, maxsize; + uint map_offset, map_size; + ulong map_base; + int dev = 0; + int ret; + + if (argc < 2) + return CMD_RET_USAGE; + + ret = mtd_arg_off_size(argc - 1, &argv[1], &dev, &offset, &len, + &maxsize, MTD_DEV_TYPE_NOR, flash->size); + if (ret) + return ret; + + ret = dm_spi_get_mmap(flash->dev, &map_base, &map_size, &map_offset); + if (ret) { + printf("Mapping not available (err=%d)\n", ret); + return CMD_RET_FAILURE; + } + if (offset < 0 || offset + len > map_size) { + printf("Offset out of range (map size %x)\n", map_size); + return CMD_RET_FAILURE; + } + printf("%lx\n", map_base + (ulong)offset); + + return 0; +} + enum { STAGE_ERASE, STAGE_CHECK, @@ -580,6 +610,8 @@ static int do_spi_flash(struct cmd_tbl *cmdtp, int flag, int argc, ret = do_spi_flash_erase(argc, argv); else if (strcmp(cmd, "protect") == 0) ret = do_spi_protect(argc, argv); + else if (IS_ENABLED(CONFIG_CMD_SF_MMAP) && !strcmp(cmd, "mmap")) + ret = do_spi_flash_mmap(argc, argv); else if (IS_ENABLED(CONFIG_CMD_SF_TEST) && !strcmp(cmd, "test")) ret = do_spi_flash_test(argc, argv); else @@ -611,6 +643,9 @@ static const char long_help[] = " or to start of mtd `partition'\n" "sf protect lock/unlock sector len - protect/unprotect 'len' bytes starting\n" " at address 'sector'" +#ifdef CONFIG_CMD_SF_MMAP + "\nsf mmap offset len - get memory address of SPI-flash offset\n" +#endif #ifdef CONFIG_CMD_SF_TEST "\nsf test offset len - run a very basic destructive test" #endif diff --git a/doc/usage/sf.rst b/doc/usage/sf.rst index 6ace1b428d9..daf26273553 100644 --- a/doc/usage/sf.rst +++ b/doc/usage/sf.rst @@ -14,6 +14,7 @@ Synopis sf erase | sf update | sf protect lock|unlock + sf mmap | sf test | Description @@ -143,6 +144,16 @@ lock|unlock Number of bytes to lock/unlock +Memory-mapped flash +------------------- + +On some systems part of the SPI flash is mapped into mmemory. With *sf mmap* +you can map a SPI-flash offset to a memory address, so that the contents can be +browsed using 'md', for example. + +The command will fail if this is not supported by the hardware or driver. + + Test ~~~~ @@ -236,6 +247,45 @@ This second example is running on coral, an x86 Chromebook:: 2 write: 227 ticks, 2255 KiB/s 18.040 Mbps 3 read: 189 ticks, 2708 KiB/s 21.664 Mbps + # On coral, SPI flash offset 0 corresponds to address ff081000 in memory + => sf mmap 0 1000 + device 0 offset 0x0, size 0x1000 + ff081000 + + # See below for how this address was obtained + => sf mmap e80000 11e18 + device 0 offset 0xe80000, size 0x11e18 + fff01000 + => md fff01000 + fff01000: b2e8e089 89000030 30b4e8c4 c0310000 ....0......0..1. + fff01010: 002c95e8 2ce8e800 feeb0000 dfe8c489 ..,....,........ + fff01020: f400002c 83f4fdeb d4e80cec 3100001e ,..............1 + fff01030: 0cc483c0 f883c3c3 8b0b770a df408504 .........w....@. + fff01040: c085fef1 c8b80575 c3fef1e5 53565755 ....u.......UWVS + fff01050: 89c38951 2404c7c5 80000002 8924048b Q......$......$. + fff01060: 89a20fdf 89fb89de 75890045 084d8904 ........E..u..M. + fff01070: ff0c5589 c5832404 243c8110 80000005 .U...$....<$.... + fff01080: 43c6da75 3b800030 43037520 d889f8eb u..C0..; u.C.... + fff01090: 5f5e5b5a 80e6c35d 535657c3 e7e8c689 Z[^_]....WVS.... + fff010a0: 89000069 00a164c3 8b000000 408b4c56 i....d......VL.@ + fff010b0: 0cec837c ddb9ff6a e8fef1e5 00004e01 |...j........N.. + fff010c0: a1640389 00000000 1c80b60f 66000001 ..d............f + fff010d0: b80c4389 00000001 a20fdf89 fb89de89 .C.............. + fff010e0: 89104389 c4831453 5bc03110 56c35f5e .C..S....1.[^_.V + fff010f0: 14ec8353 ce89d389 0000a164 b60f0000 S.......d....... + + +The offset e80000 was obtained using the following binman command, to find the +location of U-Boot SPL:: + + $ binman ls -i /tmp/b/chromebook_coral/u-boot.rom + Name Image-pos Size Entry-type Offset Uncomp-size + ------------------------------------------------------------------------------------------------------ + main-section 0 1000000 section 0 + spl e80000 11e18 u-boot-spl ffe80000 + u-boot d00000 9106e u-boot ffd00000 + ... + .. _SPI documentation: https://en.wikipedia.org/wiki/Serial_Peripheral_Interface