From patchwork Mon Jun 29 02:32:55 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Peng Fan X-Patchwork-Id: 1318718 X-Patchwork-Delegate: lukma@denx.de 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=85.214.62.61; helo=phobos.denx.de; envelope-from=u-boot-bounces@lists.denx.de; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=nxp.com Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=nxp.com header.i=@nxp.com header.a=rsa-sha256 header.s=selector2 header.b=AE5aMHlN; dkim-atps=neutral Received: from phobos.denx.de (phobos.denx.de [85.214.62.61]) (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 49w9tJ4kc5z9sRk for ; Mon, 29 Jun 2020 12:10:00 +1000 (AEST) Received: from h2850616.stratoserver.net (localhost [IPv6:::1]) by phobos.denx.de (Postfix) with ESMTP id 254F981F0C; Mon, 29 Jun 2020 04:09:51 +0200 (CEST) Authentication-Results: phobos.denx.de; dmarc=pass (p=none dis=none) header.from=nxp.com 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=nxp.com header.i=@nxp.com header.b="AE5aMHlN"; dkim-atps=neutral Received: by phobos.denx.de (Postfix, from userid 109) id E644781EB0; Mon, 29 Jun 2020 04:09:26 +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=-1.0 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FORGED_SPF_HELO,MSGID_FROM_MTA_HEADER, SPF_HELO_PASS,URIBL_BLOCKED autolearn=no autolearn_force=no version=3.4.2 Received: from EUR04-DB3-obe.outbound.protection.outlook.com (mail-db3eur04on0612.outbound.protection.outlook.com [IPv6:2a01:111:f400:fe0c::612]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by phobos.denx.de (Postfix) with ESMTPS id 3140F81EF2 for ; Mon, 29 Jun 2020 04:08:52 +0200 (CEST) Authentication-Results: phobos.denx.de; dmarc=pass (p=none dis=none) header.from=nxp.com Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=peng.fan@nxp.com ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=KxbTTCqKBb5g7aM1WM+cVxMxeIazl+z4z5cBKAQQi3SkF4zliBAxuhHDJ7pb/0vC+iUKeu9W5R9IL3fIpp+ploGetlcCyjlcSi0CcdEUJN9LUY/9T+7vQVKwHBK6h25Nmk3hlula5KNJ39qW2pOocZD5bKgRyUk1BNgvYlXGDNtoKzKreY4E1M7/66nzjsgmGYKY4EWZZnIWChzuX66FJmf947kH+kQbXAtJLpOffr2Pin+N0VmD2bw0nC8Nzz0ADfaN63ZdsnIVnohzRNJD1jkAdDkoSvVMKwXSX1j3t9QEk2AMnCxpFw+6x7J82EZaVKazUSZSaL14n2vSsYQVNw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=KuQUKf8YIJkEg1bHKCcTeKcmhX/wwqaqNYcVrxWL7a8=; b=cmk/aJuwxjZh9zNO2hXL4CaiSGbxRBpb8UW3+DEf2YZJGNVSJoa+vTsD8+gTkcmF2pkWy72nfSUh1RzdzT+FOHBNpqc9V4hXzqfBs4pKEW7k2ZzAyCAgsIcLVjvf4PS+gL9oXSgh2oyft03tqspPN/aSnTX81e9P4hpRet2mvfJsrGMgyU1bpO/foUGxls2abiI5OQtT4+3PXiCY9jpEXdsxZdoGLG3ctEVbeaHUWs9QopDdvMj3SaetWAqGvQKKwUPO0zrkHho5QAyoUSXw1KFJPXfuWh40eTXS2KW/nidcdI78VYPoaVvVYGpkfiWJNPzPucmVhfCVI0JJvtbF/A== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=nxp.com; dmarc=pass action=none header.from=nxp.com; dkim=pass header.d=nxp.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=nxp.com; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=KuQUKf8YIJkEg1bHKCcTeKcmhX/wwqaqNYcVrxWL7a8=; b=AE5aMHlNQyNAxLzTp1i/+hL44MNpHEbuznUi+y3IBM0XN0QXPxYhdmpwioTnRXlfHklpB0uvrKkuQpT9gpBDF7lV6+W7SfAZVsMbVToVMXQ06peqyL/NKHTTCvWLCO5eBAWCutFHBBSGI2inAODoP97x6/+eSLJqHusDtRSdN/Y= Authentication-Results: denx.de; dkim=none (message not signed) header.d=none;denx.de; dmarc=none action=none header.from=nxp.com; Received: from DB6PR0402MB2760.eurprd04.prod.outlook.com (2603:10a6:4:a1::14) by DB3PR0402MB3913.eurprd04.prod.outlook.com (2603:10a6:8:3::15) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3131.25; Mon, 29 Jun 2020 02:08:43 +0000 Received: from DB6PR0402MB2760.eurprd04.prod.outlook.com ([fe80::2d36:b569:17c:7701]) by DB6PR0402MB2760.eurprd04.prod.outlook.com ([fe80::2d36:b569:17c:7701%4]) with mapi id 15.20.3131.026; Mon, 29 Jun 2020 02:08:43 +0000 From: Peng Fan To: sbabic@denx.de, marex@denx.de, lukma@denx.de Cc: uboot-imx@nxp.com, u-boot@lists.denx.de, Peng Fan Subject: [PATCH 4/7] f_sdp: Support searching and loading FIT or container image Date: Mon, 29 Jun 2020 10:32:55 +0800 Message-Id: <20200629023258.25452-4-peng.fan@nxp.com> X-Mailer: git-send-email 2.16.4 In-Reply-To: <20200629023258.25452-1-peng.fan@nxp.com> References: <20200629023258.25452-1-peng.fan@nxp.com> X-ClientProxiedBy: SG2PR06CA0185.apcprd06.prod.outlook.com (2603:1096:4:1::17) To DB6PR0402MB2760.eurprd04.prod.outlook.com (2603:10a6:4:a1::14) MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 Received: from linux-1xn6.ap.freescale.net (119.31.174.71) by SG2PR06CA0185.apcprd06.prod.outlook.com (2603:1096:4:1::17) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3131.20 via Frontend Transport; Mon, 29 Jun 2020 02:08:40 +0000 X-Mailer: git-send-email 2.16.4 X-Originating-IP: [119.31.174.71] X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-HT: Tenant X-MS-Office365-Filtering-Correlation-Id: 92994ccb-c492-45b8-560b-08d81bd158f8 X-MS-TrafficTypeDiagnostic: DB3PR0402MB3913: X-MS-Exchange-Transport-Forked: True X-Microsoft-Antispam-PRVS: X-MS-Oob-TLC-OOBClassifiers: OLM:3513; X-Forefront-PRVS: 044968D9E1 X-MS-Exchange-SenderADCheck: 1 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: VW57MdzT6EZRm8bfAaGvPMIPv01vHnbywljf0LbiStc7YCat24e28RFhDOcQDhf2Npd5Hi9jgiKq06gK8smCf+eL8vmHdJzBn2um8FABq0a7BJpH2F2amr9+tcUJsM0NJyMakz44fr6M5861xFRdQJjpzwc4tBkw8C637MtfOjQzdol2tPQn23PL17N20bB/1LGqtH1mE59XYe4kh+cvWSnAEUVOsnssHIH2yrBxp26yywzhePs3ctQ947ewPH+aSdcrZX676qtDhEZ+/ALmKqohJ1I713g2WyrCoBapTY7kRJ74VemJ8ll6xkbWW6kxtZI1CFM2Ie6OZDG+kP4R9Q== X-Forefront-Antispam-Report: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:DB6PR0402MB2760.eurprd04.prod.outlook.com; PTR:; CAT:NONE; SFTY:; SFS:(4636009)(39860400002)(136003)(366004)(396003)(346002)(376002)(6486002)(6666004)(86362001)(52116002)(66946007)(5660300002)(316002)(2906002)(66476007)(66556008)(1076003)(26005)(4326008)(36756003)(6512007)(8676002)(186003)(83380400001)(16526019)(6506007)(478600001)(44832011)(956004)(8936002)(2616005); DIR:OUT; SFP:1101; X-MS-Exchange-AntiSpam-MessageData: GrbZXAkSTQOQDr7oNupdfXFotRGwNINa++EcTY+rwj2e8soArthzhxljuCu3kMp4dvEs2+l250Pk3gjD+TRcPSW3TXExNnvs+jmpSjBHbAx6fZBE21PQ58DzHsbCwUKznJwDshdd662mBhb64BxZiqrf6i8QNY4qjyAhDe0Rlz86UNjyULOB2OWae4LSeRrcqQaByFR5zX1rTSLyo2Pj17A3FkiIZjBurCN2j2o9IAbENdaGj8GHD1jhDoIfACWGyy27BSKtGbLJP8Nex2tlkx09+1xFtrbOZ/iV6FwzWB7UYlk1IktoHOhe/Gr69l62x91/3HSntEvnbbY2asrNwa9xTqmhoaILILmCTszK88ryevS/XlPJaspqKxwSBXg3FwX58Xa3cB9pYb3zws6f9tw8MAQI6x44JhotkCjczfPzds0CS1b1CLIMjJld6hLbR0m4ijryPduYfmM9TjLbylG7kV6wBoVINbGjLxDLKhmRICyLMeKvzxdwgB+YpkVM X-OriginatorOrg: nxp.com X-MS-Exchange-CrossTenant-Network-Message-Id: 92994ccb-c492-45b8-560b-08d81bd158f8 X-MS-Exchange-CrossTenant-AuthSource: DB6PR0402MB2760.eurprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 29 Jun 2020 02:08:43.0058 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 686ea1d3-bc2b-4c6f-a92c-d99c5c301635 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: Jycqi1qVQYBB/CRGC5xhIMztU+Nr24SFOSMV3QL/eP8h2LapfNV2Wid1Z01Zn0nL5075WNvP4t+EBObvPcy7BA== X-MS-Exchange-Transport-CrossTenantHeadersStamped: DB3PR0402MB3913 X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.30rc1 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.102.2 at phobos.denx.de X-Virus-Status: Clean Add support to f_sdp to search and load iMX8 container image or iMX8M FIT image by new UUU command SDPV. When using the SDPV, the uuu will continue to send out data after first level boot loader used by ROM. This means uuu won't skip to the offset of the second boot loader, and the padding data before second boot loader will be sent out. So we have to search the FIT header or container header in the buffer that SDP received. Also change to more common method to exit f_sdp handler not depending on SPL_FIT_FOUND flag because container loader won't set this. Signed-off-by: Peng Fan --- drivers/usb/gadget/f_sdp.c | 72 +++++++++++++++++++++++++++++++++++++--------- 1 file changed, 59 insertions(+), 13 deletions(-) diff --git a/drivers/usb/gadget/f_sdp.c b/drivers/usb/gadget/f_sdp.c index eec7560fc2..9f5dab23d7 100644 --- a/drivers/usb/gadget/f_sdp.c +++ b/drivers/usb/gadget/f_sdp.c @@ -71,6 +71,8 @@ struct hid_report { #define SDP_COMMAND_LEN 16 +#define SDP_EXIT 1 + struct sdp_command { u16 cmd; u32 addr; @@ -667,19 +669,42 @@ static u32 sdp_jump_imxheader(void *address) } #ifdef CONFIG_SPL_BUILD -#ifdef CONFIG_SPL_LOAD_FIT -static ulong sdp_fit_read(struct spl_load_info *load, ulong sector, - ulong count, void *buf) +static ulong sdp_load_read(struct spl_load_info *load, ulong sector, + ulong count, void *buf) { debug("%s: sector %lx, count %lx, buf %lx\n", __func__, sector, count, (ulong)buf); memcpy(buf, (void *)(load->dev + sector), count); return count; } -#endif -#endif -static void sdp_handle_in_ep(struct spl_image_info *spl_image) +static ulong search_fit_header(ulong p, int size) +{ + int i; + + for (i = 0; i < size; i += 4) { + if (genimg_get_format((const void *)(p + i)) == IMAGE_FORMAT_FIT) + return p + i; + } + + return 0; +} + +static ulong search_container_header(ulong p, int size) +{ + int i; + u8 *hdr; + + for (i = 0; i < size; i += 4) { + hdr = (u8 *)(p + i); + if (*(hdr + 3) == 0x87 && *hdr == 0) + if (*(hdr + 1) != 0 || *(hdr + 2) != 0) + return p + i; + } + return 0; +} + +static int sdp_handle_in_ep(struct spl_image_info *spl_image) { u8 *data = sdp_func->in_req->buf; u32 status; @@ -731,6 +756,16 @@ static void sdp_handle_in_ep(struct spl_image_info *spl_image) /* If imx header fails, try some U-Boot specific headers */ if (status) { #ifdef CONFIG_SPL_BUILD + if (IS_ENABLED(CONFIG_SPL_LOAD_IMX_CONTAINER)) + sdp_func->jmp_address = (u32)search_container_header((ulong)sdp_func->jmp_address, sdp_func->dnl_bytes); + else if (IS_ENABLED(CONFIG_SPL_LOAD_FIT)) + sdp_func->jmp_address = (u32)search_fit_header((ulong)sdp_func->jmp_address, sdp_func->dnl_bytes); +#endif + if (sdp_func->jmp_address == 0) + panic("Error in search header, failed to jump\n"); + + printf("Found header at 0x%08x\n", sdp_func->jmp_address); + image_header_t *header = sdp_ptr(sdp_func->jmp_address); #ifdef CONFIG_SPL_LOAD_FIT @@ -740,13 +775,23 @@ static void sdp_handle_in_ep(struct spl_image_info *spl_image) debug("Found FIT\n"); load.dev = header; load.bl_len = 1; - load.read = sdp_fit_read; + load.read = sdp_load_read; spl_load_simple_fit(spl_image, &load, 0, header); - return; + return SDP_EXIT; } #endif + if (IS_ENABLED(CONFIG_SPL_LOAD_IMX_CONTAINER)) { + struct spl_load_info load; + + load.dev = header; + load.bl_len = 1; + load.read = sdp_load_read; + spl_load_imx_container(spl_image, &load, 0); + return SDP_EXIT; + } + /* In SPL, allow jumps to U-Boot images */ struct spl_image_info spl_image = {}; spl_parse_image_header(&spl_image, header); @@ -769,6 +814,8 @@ static void sdp_handle_in_ep(struct spl_image_info *spl_image) default: break; }; + + return 0; } #ifndef CONFIG_SPL_BUILD @@ -777,6 +824,7 @@ int sdp_handle(int controller_index) int spl_sdp_handle(int controller_index, struct spl_image_info *spl_image) #endif { + int flag = 0; printf("SDP: handle requests...\n"); while (1) { if (ctrlc()) { @@ -784,18 +832,16 @@ int spl_sdp_handle(int controller_index, struct spl_image_info *spl_image) return -EINVAL; } -#ifdef CONFIG_SPL_BUILD - if (spl_image->flags & SPL_FIT_FOUND) + if (flag == SDP_EXIT) return 0; -#endif WATCHDOG_RESET(); usb_gadget_handle_interrupts(controller_index); #ifdef CONFIG_SPL_BUILD - sdp_handle_in_ep(spl_image); + flag = sdp_handle_in_ep(spl_image); #else - sdp_handle_in_ep(NULL); + flag = sdp_handle_in_ep(NULL); #endif } }