From mboxrd@z Thu Jan 1 00:00:00 1970 Return-path: Received: from mail-pl0-x244.google.com ([2607:f8b0:400e:c01::244]) by bombadil.infradead.org with esmtps (Exim 4.90_1 #2 (Red Hat Linux)) id 1fQdRA-0000tT-H2 for barebox@lists.infradead.org; Wed, 06 Jun 2018 18:46:35 +0000 Received: by mail-pl0-x244.google.com with SMTP id i5-v6so4361608plt.2 for ; Wed, 06 Jun 2018 11:45:26 -0700 (PDT) From: Andrey Smirnov Date: Wed, 6 Jun 2018 11:44:17 -0700 Message-Id: <20180606184431.10348-25-andrew.smirnov@gmail.com> In-Reply-To: <20180606184431.10348-1-andrew.smirnov@gmail.com> References: <20180606184431.10348-1-andrew.smirnov@gmail.com> List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Sender: "barebox" Errors-To: barebox-bounces+u.kleine-koenig=pengutronix.de@lists.infradead.org Subject: [PATCH v3 24/38] ARM: i.MX: xload-esdhc: Allow custom buffer address, device offset To: barebox@lists.infradead.org Cc: Andrey Smirnov Add code to support specifying different buffer address and SD/MMC device offset to read it from in esdhc_start_image(). This change is needed to support i.MX8. NOTE: We intentionnaly "emulate" reading at arbitrary offset in esdhc_start_image() as opposed to implementing it in esdhc_read_blocks() in order to avoid having to detect if units of blocks or bytes should be used to specify offset to CMD18. Signed-off-by: Andrey Smirnov --- arch/arm/mach-imx/xload-esdhc.c | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/arch/arm/mach-imx/xload-esdhc.c b/arch/arm/mach-imx/xload-esdhc.c index 4580f53cd..6ab4cabb7 100644 --- a/arch/arm/mach-imx/xload-esdhc.c +++ b/arch/arm/mach-imx/xload-esdhc.c @@ -216,10 +216,11 @@ static int esdhc_read_blocks(struct esdhc *esdhc, void *dst, size_t len) return 0; } -static int esdhc_start_image(struct esdhc *esdhc) +static int +esdhc_start_image(struct esdhc *esdhc, ptrdiff_t address, u32 offset) { - void *buf = (void *)0x10000000; - u32 *ivt = buf + SZ_1K; + void *buf = (void *)address; + u32 *ivt = buf + offset + SZ_1K; int ret, len; void __noreturn (*bb)(void); unsigned int ofs; @@ -227,9 +228,10 @@ static int esdhc_start_image(struct esdhc *esdhc) len = imx_image_size(); len = ALIGN(len, SECTOR_SIZE); - ret = esdhc_read_blocks(esdhc, buf, 3 * SECTOR_SIZE); + ret = esdhc_read_blocks(esdhc, buf, offset + SZ_1K + SECTOR_SIZE); if (ret) return ret; + if (*(u32 *)(ivt) != 0x402000d1) { pr_debug("IVT header not found on SD card. Found 0x%08x instead of 0x402000d1\n", *ivt); @@ -238,7 +240,7 @@ static int esdhc_start_image(struct esdhc *esdhc) pr_debug("Check ok, loading image\n"); - ret = esdhc_read_blocks(esdhc, buf, len); + ret = esdhc_read_blocks(esdhc, buf, offset + len); if (ret) { pr_err("Loading image failed with %d\n", ret); return ret; @@ -246,7 +248,7 @@ static int esdhc_start_image(struct esdhc *esdhc) pr_debug("Image loaded successfully\n"); - ofs = *(ivt + 1) - *(ivt + 8); + ofs = offset + *(ivt + 1) - *(ivt + 8); bb = buf + ofs; @@ -288,5 +290,5 @@ int imx6_esdhc_start_image(int instance) esdhc.is_mx6 = 1; - return esdhc_start_image(&esdhc); + return esdhc_start_image(&esdhc, 0x10000000, 0); } -- 2.17.0 _______________________________________________ barebox mailing list barebox@lists.infradead.org http://lists.infradead.org/mailman/listinfo/barebox