From patchwork Thu Jun 19 20:52:07 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Steve Rae X-Patchwork-Id: 32249 Return-Path: X-Original-To: linaro@patches.linaro.org Delivered-To: linaro@patches.linaro.org Received: from mail-qa0-f70.google.com (mail-qa0-f70.google.com [209.85.216.70]) by ip-10-151-82-157.ec2.internal (Postfix) with ESMTPS id E2B50203F4 for ; Thu, 19 Jun 2014 20:52:14 +0000 (UTC) Received: by mail-qa0-f70.google.com with SMTP id dc16sf7259677qab.9 for ; Thu, 19 Jun 2014 13:52:14 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:delivered-to:from:to:date:message-id:in-reply-to :references:mime-version:cc:subject:precedence:list-id :list-unsubscribe:list-archive:list-post:list-help:list-subscribe :sender:errors-to:x-original-sender :x-original-authentication-results:mailing-list:content-type :content-transfer-encoding; bh=TWBTCUYuM4FoM0VydIFJwxTIlaVRsspZEtaDCZdSlKA=; b=bDvvxLpWT/zy5rFxHfQgPqOl7N/NkWrKf+rPfKQciSluuiIkVVBQtlD9DLdCFF8JUp LN5K01dZqQ7GIPvxC5HZZGbeto2KhqvAfxuPvmwEaDpMvTjIzxTTEz3/zIiaM2NKRVV8 7aSzwSrnJzsefyltWQH4ptPNFrYeCuXZ2vf87woJHare0kIYGpG5C/SUl+pDYMKpkKlw +Z9uh02nRrKKDFclZkDd6iqhPaX16yIRuqcw73Gvla0GGMEnRkw9AWs/+Tf5qu9o29+9 jiCQjFFiCZls6j10rtIMJMIvO3YwYNT3Q4hNI60WlXoc57T1MuYSVI8Q2TVYYSLpsZ2n KH/w== X-Gm-Message-State: ALoCoQkW3DtNU7SW1tEpefW2FS53W9KIRvVXkQw6lI9FicrWsybWIgv3OW4Ly/KS7OIj7BuxUCS7 X-Received: by 10.236.138.113 with SMTP id z77mr3018129yhi.25.1403211134784; Thu, 19 Jun 2014 13:52:14 -0700 (PDT) X-BeenThere: patchwork-forward@linaro.org Received: by 10.140.87.38 with SMTP id q35ls706268qgd.98.gmail; Thu, 19 Jun 2014 13:52:14 -0700 (PDT) X-Received: by 10.52.139.101 with SMTP id qx5mr4915352vdb.17.1403211134638; Thu, 19 Jun 2014 13:52:14 -0700 (PDT) Received: from mail-ve0-f175.google.com (mail-ve0-f175.google.com [209.85.128.175]) by mx.google.com with ESMTPS id ev7si2947575vdb.36.2014.06.19.13.52.14 for (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Thu, 19 Jun 2014 13:52:14 -0700 (PDT) Received-SPF: pass (google.com: domain of patch+caf_=patchwork-forward=linaro.org@linaro.org designates 209.85.128.175 as permitted sender) client-ip=209.85.128.175; Received: by mail-ve0-f175.google.com with SMTP id jx11so2817771veb.6 for ; Thu, 19 Jun 2014 13:52:14 -0700 (PDT) X-Received: by 10.58.246.132 with SMTP id xw4mr5979688vec.2.1403211134554; Thu, 19 Jun 2014 13:52:14 -0700 (PDT) X-Forwarded-To: patchwork-forward@linaro.org X-Forwarded-For: patch@linaro.org patchwork-forward@linaro.org Delivered-To: patch@linaro.org Received: by 10.221.54.6 with SMTP id vs6csp390446vcb; Thu, 19 Jun 2014 13:52:14 -0700 (PDT) X-Received: by 10.180.86.199 with SMTP id r7mr9627251wiz.20.1403211133649; Thu, 19 Jun 2014 13:52:13 -0700 (PDT) Received: from theia.denx.de (theia.denx.de. [85.214.87.163]) by mx.google.com with ESMTP id ma5si8672809wjb.14.2014.06.19.13.52.13 for ; Thu, 19 Jun 2014 13:52:13 -0700 (PDT) Received-SPF: none (google.com: u-boot-bounces@lists.denx.de does not designate permitted sender hosts) client-ip=85.214.87.163; Received: from localhost (localhost [127.0.0.1]) by theia.denx.de (Postfix) with ESMTP id 267464B81F; Thu, 19 Jun 2014 22:52:12 +0200 (CEST) X-Virus-Scanned: Debian amavisd-new at theia.denx.de Received: from theia.denx.de ([127.0.0.1]) by localhost (theia.denx.de [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id 6FPZVDn+D7xg; Thu, 19 Jun 2014 22:52:11 +0200 (CEST) Received: from theia.denx.de (localhost [127.0.0.1]) by theia.denx.de (Postfix) with ESMTP id 35AB6A7400; Thu, 19 Jun 2014 22:52:06 +0200 (CEST) Received: from localhost (localhost [127.0.0.1]) by theia.denx.de (Postfix) with ESMTP id 576EB4B818 for ; Thu, 19 Jun 2014 22:51:59 +0200 (CEST) X-Virus-Scanned: Debian amavisd-new at theia.denx.de Received: from theia.denx.de ([127.0.0.1]) by localhost (theia.denx.de [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id uiix8UxS68EA for ; Thu, 19 Jun 2014 22:51:55 +0200 (CEST) X-policyd-weight: NOT_IN_SBL_XBL_SPAMHAUS=-1.5 NOT_IN_SPAMCOP=-1.5 NOT_IN_BL_NJABL=-1.5 (only DNSBL check requested) Received: from mail-gw2-out.broadcom.com (mail-gw2-out.broadcom.com [216.31.210.63]) by theia.denx.de (Postfix) with ESMTP id 16AF24B80F for ; Thu, 19 Jun 2014 22:51:51 +0200 (CEST) X-IronPort-AV: E=Sophos;i="5.01,508,1400050800"; d="scan'208";a="35291762" Received: from irvexchcas06.broadcom.com (HELO IRVEXCHCAS06.corp.ad.broadcom.com) ([10.9.208.53]) by mail-gw2-out.broadcom.com with ESMTP; 19 Jun 2014 13:56:27 -0700 Received: from IRVEXCHSMTP2.corp.ad.broadcom.com (10.9.207.52) by IRVEXCHCAS06.corp.ad.broadcom.com (10.9.208.53) with Microsoft SMTP Server (TLS) id 14.3.174.1; Thu, 19 Jun 2014 13:51:49 -0700 Received: from mail-irva-13.broadcom.com (10.10.10.20) by IRVEXCHSMTP2.corp.ad.broadcom.com (10.9.207.52) with Microsoft SMTP Server id 14.3.174.1; Thu, 19 Jun 2014 13:51:49 -0700 Received: from mail.broadcom.com (lbrmn-vmlnx03.ric.broadcom.com [10.136.4.105]) by mail-irva-13.broadcom.com (Postfix) with ESMTP id DDC219F9F7; Thu, 19 Jun 2014 13:51:48 -0700 (PDT) From: Steve Rae To: Rob Herring , Sebastian Siewior Date: Thu, 19 Jun 2014 13:52:07 -0700 Message-ID: <1403211128-19631-3-git-send-email-srae@broadcom.com> X-Mailer: git-send-email 1.8.5 In-Reply-To: <1403211128-19631-1-git-send-email-srae@broadcom.com> References: <1403211128-19631-1-git-send-email-srae@broadcom.com> MIME-Version: 1.0 Cc: Tom Rini , u-boot@lists.denx.de, Steve Rae , Pantelis Antoniou Subject: [U-Boot] [RFC PATCH 2/3] usb/gadget: fastboot: add eMMC support for flash command X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.11 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: , List-Help: , List-Subscribe: , Sender: u-boot-bounces@lists.denx.de Errors-To: u-boot-bounces@lists.denx.de X-Removed-Original-Auth: Dkim didn't pass. X-Original-Sender: srae@broadcom.com X-Original-Authentication-Results: mx.google.com; spf=pass (google.com: domain of patch+caf_=patchwork-forward=linaro.org@linaro.org designates 209.85.128.175 as permitted sender) smtp.mail=patch+caf_=patchwork-forward=linaro.org@linaro.org Mailing-list: list patchwork-forward@linaro.org; contact patchwork-forward+owners@linaro.org X-Google-Group-Id: 836684582541 - add support for 'fastboot flash' command for eMMC devices Signed-off-by: Steve Rae --- I suspect that the "sparse image" handling (ie. the "while (remaining_chunks)" loop) has been implemented elsewhere -- I need help finding the original code to determine any licensing issues.... Thanks, Steve common/Makefile | 5 ++ common/fb_mmc.c | 144 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ include/fb_mmc.h | 8 ++++ 3 files changed, 157 insertions(+) create mode 100644 common/fb_mmc.c create mode 100644 include/fb_mmc.h diff --git a/common/Makefile b/common/Makefile index f6cd980..c825c2c 100644 --- a/common/Makefile +++ b/common/Makefile @@ -264,4 +264,9 @@ obj-$(CONFIG_FIT_SIGNATURE) += image-sig.o obj-y += memsize.o obj-y += stdio.o +# This option is not just y/n - it can have a numeric value +ifdef CONFIG_FASTBOOT_FLASH_MMC_DEV +obj-y += fb_mmc.o +endif + CFLAGS_env_embedded.o := -Wa,--no-warn -DENV_CRC=$(shell tools/envcrc 2>/dev/null) diff --git a/common/fb_mmc.c b/common/fb_mmc.c new file mode 100644 index 0000000..de6a4c7 --- /dev/null +++ b/common/fb_mmc.c @@ -0,0 +1,144 @@ +/* + * Copyright TODO + * + * SPDX-License-Identifier: GPL-2.0+ + */ + +#include +#include +#include +#include + +void fb_mmc_flash_write(const char *cmd, void *download_buffer, + unsigned int download_bytes, char *response) +{ + int ret; + block_dev_desc_t *mmc_dev; + disk_partition_t info; + lbaint_t blk; + lbaint_t blkcnt; + ulong blks; + sparse_header_t *s_header = (sparse_header_t *)download_buffer; + chunk_header_t *c_header; + void *buffer; + uint32_t blk_sz; + uint32_t remaining_chunks; + uint32_t bytes_written = 0; + + mmc_dev = mmc_get_dev(CONFIG_FASTBOOT_FLASH_MMC_DEV); + if (!mmc_dev || mmc_dev->type == DEV_TYPE_UNKNOWN) { + printf("%s: invalid mmc device\n", __func__); + strcpy(response, "FAILinvalid mmc device"); + return; + } + + ret = get_partition_info_efi_by_name(mmc_dev, cmd, &info); + if (ret) { + printf("%s: cannot find partition: '%s'\n", __func__, cmd); + strcpy(response, "FAILcannot find partition"); + return; + } + + if ((le32_to_cpu(s_header->magic) == SPARSE_HEADER_MAGIC) && + (le16_to_cpu(s_header->major_version) == 1)) { + /* sparse image */ + + blk_sz = le32_to_cpu(s_header->blk_sz); + + /* verify s_header->blk_sz is exact multiple of info.blksz */ + if (blk_sz != (blk_sz & ~(info.blksz - 1))) { + printf("%s: Sparse image block size issue [%u]\n", + __func__, blk_sz); + strcpy(response, "FAILsparse image block size issue"); + return; + } + + if ((le32_to_cpu(s_header->total_blks) * blk_sz) > + (info.size * info.blksz)) { + printf("%s: Sparse image is too large for the partition\n", + __func__); + strcpy(response, "FAILsparse image is too large"); + return; + } + + printf("Flashing Sparse Image\n"); + + blk = info.start; + remaining_chunks = le32_to_cpu(s_header->total_chunks); + c_header = (chunk_header_t *)(download_buffer + + le16_to_cpu(s_header->file_hdr_sz)); + while (remaining_chunks) { + switch (le16_to_cpu(c_header->chunk_type)) { + case CHUNK_TYPE_RAW: + blkcnt = + (le32_to_cpu(c_header->chunk_sz) * blk_sz) / + info.blksz; + buffer = + (void *)c_header + + le16_to_cpu(s_header->chunk_hdr_sz); + + blks = mmc_dev->block_write(mmc_dev->dev, blk, + blkcnt, buffer); + if (blks != blkcnt) { + printf("Write failed %lu\n", blks); + strcpy(response, + "FAILmmc write failure"); + return; + } + + bytes_written += blkcnt * info.blksz; + break; + + case CHUNK_TYPE_FILL: + case CHUNK_TYPE_DONT_CARE: + case CHUNK_TYPE_CRC32: + /* do nothing */ + break; + + default: + /* error */ + printf("Unknown chunk type\n"); + strcpy(response, + "FAILunknown chunk type in sparse image"); + return; + } + + blk += (le32_to_cpu(c_header->chunk_sz) * blk_sz) / + info.blksz; + c_header = (chunk_header_t *)((void *)c_header + + le32_to_cpu(c_header->total_sz)); + remaining_chunks--; + } + + printf("........ wrote %u bytes to '%s'\n", bytes_written, cmd); + } else { + /* raw image */ + + /* determine number of blocks to write */ + blkcnt = + ((download_bytes + (info.blksz - 1)) & ~(info.blksz - 1)); + blkcnt = blkcnt / info.blksz; + + if (blkcnt > info.size) { + printf("%s: too large for partition: '%s'\n", + __func__, cmd); + strcpy(response, "FAILtoo large for partition"); + return; + } + + printf("Flashing Raw Image\n"); + + blks = mmc_dev->block_write(mmc_dev->dev, info.start, blkcnt, + download_buffer); + if (blks != blkcnt) { + printf("%s: failed writing to mmc device %d\n", + __func__, mmc_dev->dev); + strcpy(response, "FAILfailed writing to mmc device"); + return; + } + + printf("........ wrote %lu bytes to '%s'\n", + blkcnt * info.blksz, cmd); + } + strcpy(response, "OKAY"); +} diff --git a/include/fb_mmc.h b/include/fb_mmc.h new file mode 100644 index 0000000..1ad1d13 --- /dev/null +++ b/include/fb_mmc.h @@ -0,0 +1,8 @@ +/* + * Copyright 2014 Broadcom Corporation. + * + * SPDX-License-Identifier: GPL-2.0+ + */ + +void fb_mmc_flash_write(const char *cmd, void *download_buffer, + unsigned int download_bytes, char *response);