From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id B53C2C433EF for ; Fri, 1 Oct 2021 06:17:21 +0000 (UTC) Received: from phobos.denx.de (phobos.denx.de [85.214.62.61]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 0F9BD61A54 for ; Fri, 1 Oct 2021 06:17:21 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.4.1 mail.kernel.org 0F9BD61A54 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=denx.de Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=lists.denx.de Received: from h2850616.stratoserver.net (localhost [IPv6:::1]) by phobos.denx.de (Postfix) with ESMTP id 49F0E8311B; Fri, 1 Oct 2021 08:17:19 +0200 (CEST) Authentication-Results: phobos.denx.de; dmarc=none (p=none dis=none) header.from=denx.de Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=u-boot-bounces@lists.denx.de DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=denx.de; s=phobos-20191101; t=1633069039; bh=RudJsJyuym/9g35LDNwW2NmVBbFBBTsRroat7lSPwuQ=; h=Subject:To:Cc:References:From:Date:In-Reply-To:List-Id: List-Unsubscribe:List-Archive:List-Post:List-Help:List-Subscribe: From; b=uepdPPp3ecsN7v9EY7IjpYukH1oWrmWy5XI48xltNGcJO+Z6uX1bRCJQiGXNeZhH7 O5D+hsMcB5pWOvzVCtSiW2p8ldvBf3oEfI1H3HvF8rI+4WtsXK2xogl92WDXujEO4v jUCvQ0i5Gf+XUvuo8AW+t5j//4XfmU43Au2WGsTO1qu95vYjlzJIUj0rSDdnN9ximJ w6OsGXGyz8kfivjFVs01dNkfvPc5S934ePZJ77brrxfUDf/QvDSS3HopgPEfrpJIhs CWN/6k54Og+9H/PBOOoMmNOszx2jyfxf6xHmAGCAmCi8NBQmJDKlY/TMSShDHgbG7o +ijCeWcMBMjVA== Received: by phobos.denx.de (Postfix, from userid 109) id E49BC82128; Fri, 1 Oct 2021 08:17:16 +0200 (CEST) Received: from mout-u-204.mailbox.org (mout-u-204.mailbox.org [91.198.250.253]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) (No client certificate requested) by phobos.denx.de (Postfix) with ESMTPS id E01518311B for ; Fri, 1 Oct 2021 08:17:08 +0200 (CEST) Authentication-Results: phobos.denx.de; dmarc=none (p=none dis=none) header.from=denx.de Authentication-Results: phobos.denx.de; spf=fail smtp.mailfrom=sr@denx.de Received: from smtp202.mailbox.org (smtp202.mailbox.org [IPv6:2001:67c:2050:105:465:1:4:0]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange ECDHE (P-384) server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by mout-u-204.mailbox.org (Postfix) with ESMTPS id 4HLKdc5lpKzQkd5; Fri, 1 Oct 2021 08:17:08 +0200 (CEST) Subject: Re: [PATCH u-boot-marvell v3 11/39] tools: kwboot: Split sending image into header and data stages To: =?UTF-8?Q?Marek_Beh=c3=ban?= Cc: u-boot@lists.denx.de, pali@kernel.org, Chris Packham , Baruch Siach , Dennis Gilmore , Mario Six , Jon Nettleton , =?UTF-8?Q?Marek_Beh=c3=ban?= References: <20210924210716.29752-1-kabel@kernel.org> <20210924210716.29752-12-kabel@kernel.org> From: Stefan Roese Message-ID: <1e19c756-cd60-8d65-637b-e7111a581360@denx.de> Date: Fri, 1 Oct 2021 08:17:03 +0200 MIME-Version: 1.0 In-Reply-To: <20210924210716.29752-12-kabel@kernel.org> Content-Type: text/plain; charset=utf-8; format=flowed Content-Language: de-DE Content-Transfer-Encoding: 8bit X-Rspamd-Queue-Id: 2C626269 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 On 24.09.21 23:06, Marek Behún wrote: > From: Pali Rohár > > This change is required to implement other features in kwboot. > > Split sending header and data parts of the image into two stages. > > Signed-off-by: Pali Rohár > [ refactored ] > Signed-off-by: Marek Behún Reviewed-by: Stefan Roese Thanks, Stefan > --- > tools/kwbimage.h | 8 +++-- > tools/kwboot.c | 84 +++++++++++++++++++++++++++++++----------------- > 2 files changed, 61 insertions(+), 31 deletions(-) > > diff --git a/tools/kwbimage.h b/tools/kwbimage.h > index e063e3e41e..074bdfbe46 100644 > --- a/tools/kwbimage.h > +++ b/tools/kwbimage.h > @@ -195,6 +195,10 @@ struct register_set_hdr_v1 { > #define OPT_HDR_V1_BINARY_TYPE 0x2 > #define OPT_HDR_V1_REGISTER_TYPE 0x3 > > +#define KWBHEADER_V0_SIZE(hdr) \ > + (((hdr)->ext & 0x1) ? sizeof(struct kwb_header) : \ > + sizeof(struct main_hdr_v0)) > + > #define KWBHEADER_V1_SIZE(hdr) \ > (((hdr)->headersz_msb << 16) | le16_to_cpu((hdr)->headersz_lsb)) > > @@ -225,9 +229,9 @@ void init_kwb_image_type (void); > * header, byte 8 was reserved, and always set to 0. In the v1 header, > * byte 8 has been changed to a proper field, set to 1. > */ > -static inline unsigned int image_version(void *header) > +static inline unsigned int image_version(const void *header) > { > - unsigned char *ptr = header; > + const unsigned char *ptr = header; > return ptr[8]; > } > > diff --git a/tools/kwboot.c b/tools/kwboot.c > index 0e533e3698..7f231c0823 100644 > --- a/tools/kwboot.c > +++ b/tools/kwboot.c > @@ -57,11 +57,13 @@ static unsigned char kwboot_msg_debug[] = { > #define NAK 21 /* target block negative ack */ > #define CAN 24 /* target/sender transfer cancellation */ > > +#define KWBOOT_XM_BLKSZ 128 /* xmodem block size */ > + > struct kwboot_block { > uint8_t soh; > uint8_t pnum; > uint8_t _pnum; > - uint8_t data[128]; > + uint8_t data[KWBOOT_XM_BLKSZ]; > uint8_t csum; > } __packed; > > @@ -356,16 +358,15 @@ static size_t > kwboot_xm_makeblock(struct kwboot_block *block, const void *data, > size_t size, int pnum) > { > - const size_t blksz = sizeof(block->data); > size_t i, n; > > block->soh = SOH; > block->pnum = pnum; > block->_pnum = ~block->pnum; > > - n = size < blksz ? size : blksz; > + n = size < KWBOOT_XM_BLKSZ ? size : KWBOOT_XM_BLKSZ; > memcpy(&block->data[0], data, n); > - memset(&block->data[n], 0, blksz - n); > + memset(&block->data[n], 0, KWBOOT_XM_BLKSZ - n); > > block->csum = 0; > for (i = 0; i < n; i++) > @@ -425,48 +426,73 @@ kwboot_xm_sendblock(int fd, struct kwboot_block *block) > } > > static int > -kwboot_xmodem(int tty, const void *_data, size_t size) > +kwboot_xmodem_one(int tty, int *pnum, int header, const uint8_t *data, > + size_t size) > { > - const uint8_t *data = _data; > - int rc, pnum, N, err; > - > - pnum = 1; > - N = 0; > + size_t sent, left; > + int rc; > > - kwboot_printv("Sending boot image...\n"); > + kwboot_printv("Sending boot image %s (%zu bytes)...\n", > + header ? "header" : "data", size); > > - sleep(2); /* flush isn't effective without it */ > - tcflush(tty, TCIOFLUSH); > + left = size; > + sent = 0; > > - do { > + while (sent < size) { > struct kwboot_block block; > - int n; > + size_t blksz; > > - n = kwboot_xm_makeblock(&block, > - data + N, size - N, > - pnum++); > - if (!n) > - break; > + blksz = kwboot_xm_makeblock(&block, data, left, (*pnum)++); > + data += blksz; > > rc = kwboot_xm_sendblock(tty, &block); > if (rc) > goto out; > > - N += n; > - kwboot_progress(N * 100 / size, '.'); > - } while (1); > + sent += blksz; > + left -= blksz; > + > + kwboot_progress(sent * 100 / size, '.'); > + } > > - rc = kwboot_tty_send_char(tty, EOT); > + kwboot_printv("Done\n"); > > + return 0; > out: > kwboot_printv("\n"); > return rc; > +} > > -can: > - err = errno; > - kwboot_tty_send_char(tty, CAN); > - errno = err; > - goto out; > +static int > +kwboot_xmodem(int tty, const void *_img, size_t size) > +{ > + const uint8_t *img = _img; > + int rc, pnum; > + size_t hdrsz; > + > + if (image_version(img) == 0) > + hdrsz = KWBHEADER_V0_SIZE((struct main_hdr_v0 *)img); > + else > + hdrsz = KWBHEADER_V1_SIZE((struct main_hdr_v1 *)img); > + > + kwboot_printv("Waiting 2s and flushing tty\n"); > + sleep(2); /* flush isn't effective without it */ > + tcflush(tty, TCIOFLUSH); > + > + pnum = 1; > + > + rc = kwboot_xmodem_one(tty, &pnum, 1, img, hdrsz); > + if (rc) > + return rc; > + > + img += hdrsz; > + size -= hdrsz; > + > + rc = kwboot_xmodem_one(tty, &pnum, 0, img, size); > + if (rc) > + return rc; > + > + return kwboot_tty_send_char(tty, EOT); > } > > static int > Viele Grüße, Stefan -- DENX Software Engineering GmbH, Managing Director: Wolfgang Denk HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany Phone: (+49)-8142-66989-51 Fax: (+49)-8142-66989-80 Email: sr@denx.de