From patchwork Tue Jun 9 10:34:44 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ye Li X-Patchwork-Id: 1305782 X-Patchwork-Delegate: sbabic@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=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; 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=cQf3P8hT; 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 49h62p4TQcz9sSy for ; Tue, 9 Jun 2020 20:35:30 +1000 (AEST) Received: from h2850616.stratoserver.net (localhost [IPv6:::1]) by phobos.denx.de (Postfix) with ESMTP id F36AA8158A; Tue, 9 Jun 2020 12:35:14 +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="cQf3P8hT"; dkim-atps=neutral Received: by phobos.denx.de (Postfix, from userid 109) id 262318195D; Tue, 9 Jun 2020 12:35:13 +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 EUR03-AM5-obe.outbound.protection.outlook.com (mail-am5eur03on0628.outbound.protection.outlook.com [IPv6:2a01:111:f400:fe08::628]) (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 4D3EE813B7 for ; Tue, 9 Jun 2020 12:35:10 +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=ye.li@nxp.com ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=M7LZkc4bik9JG79xhd/4stlH4sPTje8P3aTklxNtLW/PYT4sv+nGlvBja7UuZZSV8gsVZU3B4s+n+pqi28Dat9xKg0SHb1UfflbSqJO/E4yGnDDKpKZ3Z1Cnjvv0GR7qmBYBvvaRMidDYzKoI0gtdH7i/gZaxChI79ExFDgo24FFybPrTyrn8hcM3sk1FZ94qgpSmTuOgbzoVpdO+b3VkBxEHyH5x32nrD6DMKYa+w3bjzDzOexRmy7NY68zRZxscqLs3l6u5qcQfBqqNOHeU4j5lysqM9AGd5n9X6fb6eUEXty+FAWh5XtbURTFhYVXY7EP94/LXEF20sMCyhFEsQ== 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=iOpZY7J8e+I3ZmsZVzP+UMGHQsIZ28SfCprg5NssCYM=; b=IJdnbEB2j8qmHg4LWB1BOG4vWXRKaKuiNifROoEC5ACi70k646HjkHxXamsyaRevRSWeDh5CF+PUe2bqx4tel3o8rZMOaQUWGkS+R9DF4Ce7VFNwFwNquDN4hg0oesXSlt3PPUj0Puw6RBbfoehrr3RogGcOTSCcMZv+Y7M/2qH0Nw6J5nJgAU7StUAfYtdjOxOr8cPTrMieavqw9y+iPJ7NEQERgQAYAHIfEonQiHJ2qEFbzF0UdOsB++mXvm3+f+Z5BFotsrGj7FkjDyYuTmD0LO2el5AT5edPya3HKpZg7YC7IBcZ023VkKdnCGYkTzuGeU8ZjQkLTsh2qXilfQ== 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=iOpZY7J8e+I3ZmsZVzP+UMGHQsIZ28SfCprg5NssCYM=; b=cQf3P8hT2iYB4RocBP2yUFTJRkNO+gtl1jmvIRXLFpAAjlz+7YkJFz6Nkt5T1afyzUSrSq4Tui2fyPTGgkojczIwXbcEf5QoYChqKmeP0PtWr0f6B1vcNnmAe2me+gdOHckIDS0gjfMG58n6AaIyAV1b1j5h6I+xIsQfuOVSuLc= Authentication-Results: denx.de; dkim=none (message not signed) header.d=none;denx.de; dmarc=none action=none header.from=nxp.com; Received: from VI1PR04MB4414.eurprd04.prod.outlook.com (2603:10a6:803:69::13) by VI1PR04MB4493.eurprd04.prod.outlook.com (2603:10a6:803:76::19) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3066.18; Tue, 9 Jun 2020 10:35:07 +0000 Received: from VI1PR04MB4414.eurprd04.prod.outlook.com ([fe80::450f:3c2f:20f2:1bf5]) by VI1PR04MB4414.eurprd04.prod.outlook.com ([fe80::450f:3c2f:20f2:1bf5%6]) with mapi id 15.20.3066.023; Tue, 9 Jun 2020 10:35:07 +0000 From: Ye Li To: sbabic@denx.de, u-boot@lists.denx.de Cc: fabio.estevam@nxp.com, peng.fan@nxp.com, uboot-imx@nxp.com Subject: [PATCH 3/3] imx8: spl: Support booting from secondary container set Date: Tue, 9 Jun 2020 03:34:44 -0700 Message-Id: <1591698884-72174-3-git-send-email-ye.li@nxp.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1591698884-72174-1-git-send-email-ye.li@nxp.com> References: <1591698884-72174-1-git-send-email-ye.li@nxp.com> X-ClientProxiedBy: SG2PR02CA0027.apcprd02.prod.outlook.com (2603:1096:3:18::15) To VI1PR04MB4414.eurprd04.prod.outlook.com (2603:10a6:803:69::13) MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 Received: from ubuntu.localdomain (119.31.174.68) by SG2PR02CA0027.apcprd02.prod.outlook.com (2603:1096:3:18::15) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256) id 15.20.3066.20 via Frontend Transport; Tue, 9 Jun 2020 10:35:05 +0000 X-Mailer: git-send-email 2.7.4 X-Originating-IP: [119.31.174.68] X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-HT: Tenant X-MS-Office365-Filtering-Correlation-Id: 90cd5cae-382a-4951-e517-08d80c60c743 X-MS-TrafficTypeDiagnostic: VI1PR04MB4493: X-MS-Exchange-Transport-Forked: True X-Microsoft-Antispam-PRVS: X-MS-Oob-TLC-OOBClassifiers: OLM:279; X-Forefront-PRVS: 042957ACD7 X-MS-Exchange-SenderADCheck: 1 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: Rj81JnBc9nCGgUSe2MxRM053uZD+t9FfSOtTDm2Bk/dsxc3dQthSMTBjnuXh5fEFHxL4Kwdk23qHYjfTjlv3j19QsA7lSywGNr1ybTgKA1J8r7YXt/6ZG6IZY45j1bIgCJKVTurlMXBbxFvd/It2w/Ev9REVbhc0MpA2b8YWfBMqMuHTipQ/9ZhMlyz58MwLrdAZ3dibB2YLHfpW9KJy+UDLSsPW7Ra299AwTvmVTn6wHtzBAvGlmXVQAw2RS4f19s8Jqu+cNY6t+yN4NLW12/oX5fvThwKqd1uhRgL2a/rngXkGecuth26QIuPOwMStH9iJEa45SCALBP7qodTgsA== X-Forefront-Antispam-Report: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:VI1PR04MB4414.eurprd04.prod.outlook.com; PTR:; CAT:NONE; SFTY:; SFS:(4636009)(346002)(376002)(396003)(366004)(136003)(39860400002)(2616005)(956004)(478600001)(8936002)(44832011)(316002)(52116002)(6506007)(8676002)(66946007)(86362001)(83380400001)(6512007)(5660300002)(26005)(36756003)(6486002)(66476007)(186003)(2906002)(16526019)(4326008)(66556008)(6666004); DIR:OUT; SFP:1101; X-MS-Exchange-AntiSpam-MessageData: 3yV791Y3Be4+sC8tPS55IzLBZw51UEcDt9XEWtSyTEhjxCOtBZg9jD2q0op/VsPiI3uCgnuejG9E4wEJE7KiEre/v06g3rmigVI2QdWtcGUBzpbSv/2SI8NNtR2D5MI+Uhw5SofIvVgbxjS1Ml+VTq/JlBhV60CMw5NqGxLeL8qNc9Wby/Vy/j7hOQtDGoySfzR4KSBGhOEYd698QFYpu8j2Oc4BEzpWpiX4MwOuJeDZdtCKgEpKUu8ZXlmBA5inBGqzCFoyfyB2XPMzEDma0dfQzP2/HFP0Cuye29vqVrAuETiuKMvLVN7+cDIA2wUNDA8Ivo6kNcCPS2x/GKctMiwjMhEcdnkv1iOiaa09QlzV+Mguim+1DuSJ5cnG/auu9Hv1rGen0mur/Tva5GrowZSs/s/KuOrPznkESl/KVGUC7PYtMKHU+v38vVIQpJm0GpIYrhGqoSY5e3vRGpzQkmFd/5KasmzytNgFapfealU= X-OriginatorOrg: nxp.com X-MS-Exchange-CrossTenant-Network-Message-Id: 90cd5cae-382a-4951-e517-08d80c60c743 X-MS-Exchange-CrossTenant-OriginalArrivalTime: 09 Jun 2020 10:35:07.6152 (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: nK8a2iqZdd+apj8COO88/hRApiF7G+CDWw8GY2OajegTJLBv/n5Umve4MrEKpUgj X-MS-Exchange-Transport-CrossTenantHeadersStamped: VI1PR04MB4493 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 On i.MX8QM B0 and i.MX8QXP C0, ROM supports to boot from secondary container set when either booting from primary container set is failed or secondary container set has higher SW version. Add the support to SPL to load u-boot container from secondary set when ROM boots from the secondary set. Using the SCFW API to get current container set index. If it is the secondary boot, get the offset from fuse and apply it to the offset of primary container set. For emmc boot from boot0/1 part, override the emmc boot partition function to check secondary boot and switch to correct boot part. Signed-off-by: Ye Li Reviewed-by: Peng Fan --- arch/arm/mach-imx/imx8/image.c | 81 +++++++++++++++++++++++++++++++++++++++--- 1 file changed, 76 insertions(+), 5 deletions(-) diff --git a/arch/arm/mach-imx/imx8/image.c b/arch/arm/mach-imx/imx8/image.c index 5abc0d3..bd0e0a2 100644 --- a/arch/arm/mach-imx/imx8/image.c +++ b/arch/arm/mach-imx/imx8/image.c @@ -20,6 +20,23 @@ #define NAND_DEV 2 #define QSPI_NOR_DEV 3 +/* The unit of second image offset number which provision by the fuse bits */ +#define SND_IMG_OFF_UNIT (0x100000UL) + +/* + * If num = 0, off = (2 ^ 2) * 1MB + * else If num = 2, off = (2 ^ 0) * 1MB + * else off = (2 ^ num) * 1MB + */ +#define SND_IMG_NUM_TO_OFF(num) \ + ((1UL << ((0 == (num)) ? 2 : (2 == (num)) ? 0 : (num))) * SND_IMG_OFF_UNIT) + +#if IS_ENABLED(CONFIG_IMX8QM) +#define FUSE_IMG_SET_OFF_WORD 464 +#elif IS_ENABLED(CONFIG_IMX8QXP) +#define FUSE_IMG_SET_OFF_WORD 720 +#endif + static int __get_container_size(ulong addr) { struct container_hdr *phdr; @@ -122,15 +139,46 @@ static int get_container_size(void *dev, int dev_type, unsigned long offset) return ret; } +static bool check_secondary_cnt_set(unsigned long *set_off) +{ + int ret; + u8 set_id = 1; + u32 fuse_val = 0; + + if (!(is_imx8qxp() && is_soc_rev(CHIP_REV_B))) { + ret = sc_misc_get_boot_container(-1, &set_id); + if (!ret) { + /* Secondary boot */ + if (set_id == 2) { + ret = sc_misc_otp_fuse_read(-1, FUSE_IMG_SET_OFF_WORD, &fuse_val); + if (!ret) { + if (set_off) + *set_off = SND_IMG_NUM_TO_OFF(fuse_val); + return true; + } + } + } + } + + return false; +} + static unsigned long get_boot_device_offset(void *dev, int dev_type) { - unsigned long offset = 0; + unsigned long offset = 0, sec_set_off = 0; + bool sec_boot = false; + + sec_boot = check_secondary_cnt_set(&sec_set_off); + if (sec_boot) + printf("Secondary set selected\n"); + else + printf("Primary set selected\n"); if (dev_type == MMC_DEV) { struct mmc *mmc = (struct mmc *)dev; if (IS_SD(mmc) || mmc->part_config == MMCPART_NOAVAILABLE) { - offset = CONTAINER_HDR_MMCSD_OFFSET; + offset = sec_boot ? sec_set_off : CONTAINER_HDR_MMCSD_OFFSET; } else { u8 part = EXT_CSD_EXTRACT_BOOT_PART(mmc->part_config); @@ -140,17 +188,21 @@ static unsigned long get_boot_device_offset(void *dev, int dev_type) else offset = CONTAINER_HDR_EMMC_OFFSET; } else { - offset = CONTAINER_HDR_MMCSD_OFFSET; + offset = sec_boot ? sec_set_off : CONTAINER_HDR_MMCSD_OFFSET; } } } else if (dev_type == QSPI_DEV) { - offset = CONTAINER_HDR_QSPI_OFFSET; + offset = sec_boot ? (sec_set_off + CONTAINER_HDR_QSPI_OFFSET) : + CONTAINER_HDR_QSPI_OFFSET; } else if (dev_type == NAND_DEV) { - offset = CONTAINER_HDR_NAND_OFFSET; + offset = sec_boot ? (sec_set_off + CONTAINER_HDR_NAND_OFFSET) : + CONTAINER_HDR_NAND_OFFSET; } else if (dev_type == QSPI_NOR_DEV) { offset = CONTAINER_HDR_QSPI_OFFSET + 0x08000000; } + debug("container set offset 0x%lx\n", offset); + return offset; } @@ -210,6 +262,25 @@ unsigned long spl_mmc_get_uboot_raw_sector(struct mmc *mmc, return end / mmc->read_bl_len; } + +int spl_mmc_emmc_boot_partition(struct mmc *mmc) +{ + int part = 0; + + part = EXT_CSD_EXTRACT_BOOT_PART(mmc->part_config); + if (part == 1 || part == 2) { + unsigned long sec_set_off = 0; + bool sec_boot = false; + + sec_boot = check_secondary_cnt_set(&sec_set_off); + if (sec_boot) + part = (part == 1) ? 2 : 1; + } else if (part == 7) { + part = 0; + } + + return part; +} #endif #ifdef CONFIG_SPL_NAND_SUPPORT