[{"id":3675433,"web_url":"http://patchwork.ozlabs.org/comment/3675433/","msgid":"<CABjd4Yx3ckxysb20=vCL6xUADByOQA7bsRx1ZSCoRFp5MBE4FQ@mail.gmail.com>","list_archive_url":null,"date":"2026-04-09T15:39:00","subject":"Re: [PATCH 1/4] spl: ufs: Add partition support and flexible loading","submitter":{"id":5517,"url":"http://patchwork.ozlabs.org/api/people/5517/","name":"Alexey Charkov","email":"alchark@gmail.com"},"content":"On Thu, Apr 9, 2026 at 6:43 PM Balaji Selvanathan\n<balaji.selvanathan@oss.qualcomm.com> wrote:\n>\n> Add partition-based loading support to SPL UFS, similar to the\n> existing implementation in spl_mmc.c. This allows loading from\n> named partitions or partition numbers instead of hardcoded sector\n> offsets.\n>\n> The loading strategy tries methods in order: absolute sector if\n> configured, partition by name, partition by number, then filesystem\n> mode (placeholder for future implementation).\n>\n> This brings UFS boot flexibility on par with MMC/SD boot.\n>\n> Signed-off-by: Balaji Selvanathan <balaji.selvanathan@oss.qualcomm.com>\n> ---\n>  common/spl/Kconfig   |  40 ++++++++++-\n>  common/spl/spl_ufs.c | 188 +++++++++++++++++++++++++++++++++++++++++++++------\n>  include/part.h       |   3 +-\n>  include/spl.h        |   4 ++\n>  4 files changed, 214 insertions(+), 21 deletions(-)\n>\n> diff --git a/common/spl/Kconfig b/common/spl/Kconfig\n> index a21b71ad5d1..b3c7a1d8aa3 100644\n> --- a/common/spl/Kconfig\n> +++ b/common/spl/Kconfig\n> @@ -1637,9 +1637,47 @@ config SPL_UFS_RAW_U_BOOT_SECTOR\n>         depends on SPL_UFS_SUPPORT\n>         default 0x800 if ARCH_ROCKCHIP\n>         help\n> -         Address on the block device to load U-Boot from.\n> +         Absolute sector offset on the UFS LUN to load U-Boot from.\n> +         This is tried first before partition-based loading.\n> +         Set to 0x0 to skip absolute sector loading and use partition mode.\n>           Units: UFS sectors (1 sector = 4096 bytes).\n\nHi Balaji,\n\nWhat if I want to load the FIT image from the start of a dedicated LUN?\n\n> +config SPL_UFS_RAW_U_BOOT_USE_PARTITION\n> +       bool \"Enable UFS partition support for raw mode\"\n> +       depends on SPL_UFS_SUPPORT\n> +       select SPL_LIBDISK_SUPPORT\n> +       help\n> +         Enable support for loading from a specific partition on UFS\n> +         in raw mode. When enabled, you can specify either a partition\n> +         name or partition number to load from.\n> +\n> +config SPL_UFS_RAW_U_BOOT_PARTITION_NAME\n> +       string \"Partition name to load U-Boot from\"\n> +       depends on SPL_UFS_RAW_U_BOOT_USE_PARTITION\n> +       help\n> +         Name of the partition to load U-Boot from in UFS raw mode.\n> +         This is tried before partition number lookup.\n> +         Leave empty to skip name-based lookup.\n> +         Example: \"boot\", \"uefi\", \"dtb_a\"\n> +\n> +config SPL_UFS_RAW_U_BOOT_PARTITION_NUM\n> +       int \"Partition number to load U-Boot from\"\n> +       depends on SPL_UFS_RAW_U_BOOT_USE_PARTITION\n> +       help\n> +         Partition number to load U-Boot from when using UFS raw mode\n> +         with partition support. This is used if partition name is not\n> +         specified or not found.\n> +\n> +config SPL_UFS_FS\n> +       bool \"Enable UFS filesystem boot mode\"\n> +       depends on SPL_UFS_SUPPORT\n> +       help\n> +         Enable filesystem-based boot from UFS. This allows loading\n> +         U-Boot from FAT or EXT4 filesystems on UFS partitions.\n> +         This is tried as a fallback if raw mode loading fails.\n> +\n> +         Note: Filesystem support is not yet fully implemented.\n\nMaybe split those into separate commits for easier review?\n\n>  config SPL_WATCHDOG\n>         bool \"Support watchdog drivers\"\n>         imply SPL_WDT if !HW_WATCHDOG\n> diff --git a/common/spl/spl_ufs.c b/common/spl/spl_ufs.c\n> index cef1843f40f..c4e793bf701 100644\n> --- a/common/spl/spl_ufs.c\n> +++ b/common/spl/spl_ufs.c\n> @@ -3,15 +3,19 @@\n>   * (C) Copyright 2025 Alexey Charkov <alchark@gmail.com>\n>   */\n>\n> +#include <dm.h>\n> +#include <log.h>\n>  #include <spl.h>\n>  #include <spl_load.h>\n>  #include <scsi.h>\n> -#include <errno.h>\n> -#include <image.h>\n> +#include <part.h>\n> +#include <blk.h>\n>  #include <linux/compiler.h>\n> -#include <log.h>\n> +#include <errno.h>\n>\n> -static ulong spl_ufs_load_read(struct spl_load_info *load, ulong off, ulong size, void *buf)\n> +/* Block read callback for spl_load framework */\n> +static ulong h_spl_ufs_load_read(struct spl_load_info *load, ulong off,\n> +                                ulong size, void *buf)\n>  {\n>         struct blk_desc *bd = load->priv;\n>         lbaint_t sector = off >> bd->log2blksz;\n> @@ -20,30 +24,176 @@ static ulong spl_ufs_load_read(struct spl_load_info *load, ulong off, ulong size\n>         return blk_dread(bd, sector, count, buf) << bd->log2blksz;\n>  }\n>\n> -static int spl_ufs_load_image(struct spl_image_info *spl_image,\n> -                             struct spl_boot_device *bootdev)\n> +/* Load image from raw sector */\n> +static int ufs_load_image_raw_sector(struct spl_image_info *spl_image,\n> +                                    struct spl_boot_device *bootdev,\n> +                                    struct blk_desc *bd,\n> +                                    unsigned long sector)\n>  {\n> -       unsigned long sector = CONFIG_SPL_UFS_RAW_U_BOOT_SECTOR;\n> -       int devnum = CONFIG_SPL_UFS_RAW_U_BOOT_DEVNUM;\n>         struct spl_load_info load;\n> +       int ret;\n> +\n> +       debug(\"spl: ufs loading from sector 0x%lx\\n\", sector);\n> +\n> +       spl_load_init(&load, h_spl_ufs_load_read, bd, bd->blksz);\n> +       ret = spl_load(spl_image, bootdev, &load, 0, sector << bd->log2blksz);\n> +\n> +       if (ret) {\n> +               debug(\"spl: ufs load failed: %d\\n\", ret);\n> +               return ret;\n> +       }\n> +\n> +       debug(\"spl: ufs load successful\\n\");\n> +       return 0;\n> +}\n> +\n> +u32 __weak spl_ufs_boot_mode(const u32 boot_device)\n> +{\n> +       return UFS_MODE_RAW;\n> +}\n> +\n> +int spl_ufs_load(struct spl_image_info *spl_image,\n> +                struct spl_boot_device *bootdev,\n> +                const char *filename)\n> +{\n> +       u32 boot_mode;\n> +       int ret = 0;\n> +       int devnum = CONFIG_SPL_UFS_RAW_U_BOOT_DEVNUM;\n>         struct blk_desc *bd;\n> -       int err;\n> +       unsigned long sector = 0;\n> +\n> +       log_debug(\"spl: ufs devnum=%d\\n\", devnum);\n> +\n> +       ret = scsi_scan(false);\n> +       if (ret) {\n> +               printf(\"spl: scsi scan failed: %d\\n\", ret);\n> +               return ret;\n> +       }\n>\n> -       /* try to recognize storage devices immediately */\n> -       scsi_scan(false);\n>         bd = blk_get_devnum_by_uclass_id(UCLASS_SCSI, devnum);\n> -       if (!bd)\n> +       if (!bd) {\n> +               printf(\"spl: could not get UFS device %d\\n\", devnum);\n>                 return -ENODEV;\n> +       }\n>\n> -       spl_load_init(&load, spl_ufs_load_read, bd, bd->blksz);\n> -       err = spl_load(spl_image, bootdev, &load, 0, sector << bd->log2blksz);\n> -       if (err) {\n> -               puts(\"spl_ufs_load_image: ufs block read error\\n\");\n> -               log_debug(\"(error=%d)\\n\", err);\n> -               return err;\n> +       boot_mode = spl_ufs_boot_mode(bootdev->boot_device);\n> +\n> +       switch (boot_mode) {\n> +       case UFS_MODE_RAW:\n> +               debug(\"spl: ufs raw mode\\n\");\n> +\n> +               /* Step 1: Try absolute sector (if configured and non-zero) */\n> +#ifdef CONFIG_SPL_UFS_RAW_U_BOOT_SECTOR\n\nPerhaps if this and the below blocks are split out into helper\nfunctions which compile to a no-op when the respective Kconfig option\nis not set the code would be prettier :)\n\nPreprocessor defines really break the flow visually by going across\nthe indentation of the surrounding code.\n\n> +               if (CONFIG_SPL_UFS_RAW_U_BOOT_SECTOR != 0) {\n> +                       debug(\"spl: trying absolute sector 0x%x\\n\",\n> +                             CONFIG_SPL_UFS_RAW_U_BOOT_SECTOR);\n> +\n> +                       ret = ufs_load_image_raw_sector(spl_image, bootdev, bd,\n> +                                                       CONFIG_SPL_UFS_RAW_U_BOOT_SECTOR);\n> +\n> +                       if (!ret) {\n> +                               debug(\"spl: loaded from absolute sector\\n\");\n> +                               return 0;\n> +                       }\n> +                       debug(\"spl: absolute sector failed: %d\\n\", ret);\n> +               }\n> +#endif\n> +\n> +               /* Step 2-4: Try partition-based loading */\n> +#ifdef CONFIG_SPL_UFS_RAW_U_BOOT_USE_PARTITION\n> +               {\n> +                       struct disk_partition part_info;\n> +                       int part_found = 0;\n\n... especially since you want to use scoped blocks with local\nvariables. These really ask to go into a helper function instead.\n\n> +                       /* Step 2: Try partition name (if configured) */\n> +#ifdef CONFIG_SPL_UFS_RAW_U_BOOT_PARTITION_NAME\n> +                       if (strlen(CONFIG_SPL_UFS_RAW_U_BOOT_PARTITION_NAME) > 0) {\n> +                               debug(\"spl: trying partition name '%s'\\n\",\n> +                                     CONFIG_SPL_UFS_RAW_U_BOOT_PARTITION_NAME);\n> +\n> +                               ret = part_get_info_by_name(bd,\n> +                                                           CONFIG_SPL_UFS_RAW_U_BOOT_PARTITION_NAME,\n> +                                       &part_info);\n> +\n> +                               if (ret >= 0) {\n> +                                       debug(\"spl: found partition '%s' at 0x%lx\\n\",\n> +                                             CONFIG_SPL_UFS_RAW_U_BOOT_PARTITION_NAME,\n> +                                             (ulong)part_info.start);\n> +                                       sector = part_info.start;\n> +                                       part_found = 1;\n> +                               } else {\n> +                                       debug(\"spl: partition name not found: %d\\n\", ret);\n> +                               }\n> +                       }\n> +#endif\n> +\n> +                       /* Step 3: Try partition number (if name not found) */\n> +#ifdef CONFIG_SPL_UFS_RAW_U_BOOT_PARTITION_NUM\n> +                       if (!part_found) {\n> +                               debug(\"spl: trying partition number %d\\n\",\n> +                                     CONFIG_SPL_UFS_RAW_U_BOOT_PARTITION_NUM);\n> +\n> +                               ret = part_get_info(bd,\n> +                                                   CONFIG_SPL_UFS_RAW_U_BOOT_PARTITION_NUM,\n> +                                                   &part_info);\n> +\n> +                               if (ret >= 0) {\n> +                                       debug(\"spl: found partition %d at 0x%lx\\n\",\n> +                                             CONFIG_SPL_UFS_RAW_U_BOOT_PARTITION_NUM,\n> +                                             (ulong)part_info.start);\n> +                                       sector = part_info.start;\n> +                                       part_found = 1;\n> +                               } else {\n> +                                       debug(\"spl: partition number not found: %d\\n\", ret);\n> +                               }\n> +                       }\n> +#endif\n> +\n> +                       /* Load from partition if found */\n> +                       if (part_found) {\n> +                               ret = ufs_load_image_raw_sector(spl_image, bootdev, bd, sector);\n> +\n> +                               if (!ret) {\n> +                                       debug(\"spl: loaded from partition\\n\");\n> +                                       return 0;\n> +                               }\n> +                               debug(\"spl: partition load failed: %d\\n\", ret);\n> +                       }\n> +               }\n> +#endif /* CONFIG_SPL_UFS_RAW_U_BOOT_USE_PARTITION */\n> +\n> +               /* Step 4: Fall through to FS mode if enabled */\n\nWouldn't a raw offset be a more natural fallback, given that it has\nfewest dependencies out of all these options?\n\n> +               debug(\"spl: raw mode failed, trying fs\\n\");\n> +               fallthrough;\n> +\n> +#ifdef CONFIG_SPL_UFS_FS\n> +       case UFS_MODE_FS:\n> +               debug(\"spl: ufs fs mode\\n\");\n> +\n> +               /* TODO: Implement filesystem support */\n> +               printf(\"spl: ufs filesystem boot not implemented\\n\");\n> +               ret = -ENOSYS;\n> +               break;\n> +#endif\n> +\n> +       default:\n> +               puts(\"spl: ufs: invalid boot mode\\n\");\n> +               ret = -EINVAL;\n>         }\n>\n> -       return 0;\n> +       return ret;\n> +}\n> +\n> +/* SPL load image entry point */\n> +static int spl_ufs_load_image(struct spl_image_info *spl_image,\n> +                             struct spl_boot_device *bootdev)\n> +{\n> +       return spl_ufs_load(spl_image, bootdev,\n> +#ifdef CONFIG_SPL_FS_LOAD_PAYLOAD_NAME\n> +                           CONFIG_SPL_FS_LOAD_PAYLOAD_NAME);\n> +#else\n> +                           NULL);\n> +#endif\n\nHow about config_enabled(...) instead? Gives fewer repetitions of the\nsame symbol.\n\nBest regards,\nAlexey","headers":{"Return-Path":"<u-boot-bounces@lists.denx.de>","X-Original-To":"incoming@patchwork.ozlabs.org","Delivered-To":"patchwork-incoming@legolas.ozlabs.org","Authentication-Results":["legolas.ozlabs.org;\n\tdkim=pass (2048-bit key;\n unprotected) header.d=gmail.com header.i=@gmail.com header.a=rsa-sha256\n header.s=20251104 header.b=nL6rBFzt;\n\tdkim-atps=neutral","legolas.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=lists.denx.de\n (client-ip=2a01:238:438b:c500:173d:9f52:ddab:ee01; helo=phobos.denx.de;\n envelope-from=u-boot-bounces@lists.denx.de; receiver=patchwork.ozlabs.org)","phobos.denx.de;\n dmarc=pass (p=none dis=none) header.from=gmail.com","phobos.denx.de;\n spf=pass smtp.mailfrom=u-boot-bounces@lists.denx.de","phobos.denx.de;\n\tdkim=pass (2048-bit key;\n unprotected) header.d=gmail.com header.i=@gmail.com header.b=\"nL6rBFzt\";\n\tdkim-atps=neutral","phobos.denx.de;\n dmarc=pass (p=none dis=none) header.from=gmail.com","phobos.denx.de;\n spf=pass smtp.mailfrom=alchark@gmail.com"],"Received":["from phobos.denx.de (phobos.denx.de\n [IPv6:2a01:238:438b:c500:173d:9f52:ddab:ee01])\n\t(using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n\t key-exchange x25519 server-signature ECDSA (secp384r1) server-digest SHA384)\n\t(No client certificate requested)\n\tby legolas.ozlabs.org (Postfix) with ESMTPS id 4fs7Lz2B0rz1yCv\n\tfor <incoming@patchwork.ozlabs.org>; Fri, 10 Apr 2026 04:12:27 +1000 (AEST)","from h2850616.stratoserver.net (localhost [IPv6:::1])\n\tby phobos.denx.de (Postfix) with ESMTP id 2279383DC9;\n\tThu,  9 Apr 2026 20:12:17 +0200 (CEST)","by phobos.denx.de (Postfix, from userid 109)\n id B11DF8412A; Thu,  9 Apr 2026 17:39:18 +0200 (CEST)","from mail-qv1-xf34.google.com (mail-qv1-xf34.google.com\n [IPv6:2607:f8b0:4864:20::f34])\n (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits))\n (No client certificate requested)\n by phobos.denx.de (Postfix) with ESMTPS id D3A728419E\n for <u-boot@lists.denx.de>; Thu,  9 Apr 2026 17:39:13 +0200 (CEST)","by mail-qv1-xf34.google.com with SMTP id\n 6a1803df08f44-8a23f802e0cso16153956d6.1\n for <u-boot@lists.denx.de>; Thu, 09 Apr 2026 08:39:13 -0700 (PDT)"],"X-Spam-Checker-Version":"SpamAssassin 3.4.2 (2018-09-13) on phobos.denx.de","X-Spam-Level":"","X-Spam-Status":"No, score=-1.1 required=5.0 tests=BAYES_00,DKIM_SIGNED,\n DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,FORGED_GMAIL_RCVD,FREEMAIL_FROM,\n RCVD_IN_DNSWL_BLOCKED,SPF_HELO_NONE,SPF_PASS autolearn=no\n autolearn_force=no version=3.4.2","ARC-Seal":"i=1; a=rsa-sha256; t=1775749153; cv=none;\n d=google.com; s=arc-20240605;\n b=GaL0Mw4N5xFs2+48t3uUQ0ZR36y/ksA34jzrnWFzJq+VIpSVQ2NdPd67kLuSt6SmRG\n MyXGAcLsc2epCUUn09+npDJcExgLDHRWQpntQU2wSEX20HiJnHs1KHhrLGAoq+XHKagW\n a8ZN+n8Qch9nODZvTBUinVlzY5uwR1bC962CaXvDwcdbIViGsagu1yWcCDyFsA3vGPLq\n KAmvdNT3oGSAwRKbvwbg7N4lGkMVNzS9j4RMNab+g7PSZyIlBAd0Dl2qY8aBmAA63oaS\n B310dzT0Vu4ZO6qAkH28bqBF8GabsVvNIpmXVxCtsu0SWzOXJE2dhTF3T527SDFAYGMQ\n V/6w==","ARC-Message-Signature":"i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com;\n s=arc-20240605;\n h=content-transfer-encoding:cc:to:subject:message-id:date:from\n :in-reply-to:references:mime-version:dkim-signature;\n bh=4Ww8dkl4RVp/tg7Hf8/JC0HJ8TBmICYn8SJV5AwG/B0=;\n fh=uOhV1t+0iFcV5eYFRMCyQ4vbcPD89Ro005zURaNYH3A=;\n b=eUL7Iv+6wsOeAa/8QXkCpQkt4H4BfRjYLNphfZD/eN3FqxM4klfyQ173SXKFcZiBbo\n PnvlWXPhXleKDI3IDWDgFoVtwPKUMY1WVi3hwbhM7A3XWtTBpRsINtSk3Zw9ar4TPGyh\n mad/cGfHOo6CrABQqUwiiT5fFIvBCwZXsvtQC2ppf7UQtIeCFUuOaa2lmT8z2LXsQ/6X\n eQUd0uBLbx+4zEjunaNHE+011Lv0gxbefEEL3eOE1o37Rin7lu+H6hs3QaC7pAMPDfii\n chN4jE91tVNIU7ctD+My/724H5CbFOP/OXUUw+xTGKuW9sWL8sywpA+XLXOB3ohDPkOX\n ywZw==; darn=lists.denx.de","ARC-Authentication-Results":"i=1; mx.google.com; arc=none","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=gmail.com; s=20251104; t=1775749153; x=1776353953; darn=lists.denx.de;\n h=content-transfer-encoding:cc:to:subject:message-id:date:from\n :in-reply-to:references:mime-version:from:to:cc:subject:date\n :message-id:reply-to;\n bh=4Ww8dkl4RVp/tg7Hf8/JC0HJ8TBmICYn8SJV5AwG/B0=;\n b=nL6rBFztF8YzGKdk34SFRuCcRTxIiQ4QDknzfiTezbCipmLVXDt5y/ztcya6nMCMUn\n EPXp8sCj2oVophzUZClCYxWQhZcHdpja/btYZtrVryhl9k+e+bdMtTyd3Jb1h1JQgjkN\n KC/kCbs0hL62LM6c1nRZttLajhxgoT5wPMvGwlcBSnXhLlYqgYQ4ocmm0wtmCGRCO+MC\n He6BRXC5bsof4nhPyCoSBPq6UJ4z1y4UKo1kC2aSHgM5cXQNePJOvzX/M4LzEt5NKjEG\n i4aR6rviOglb8np/1/s2X9cKQoMWZfnW1cHGTmY9inBw0pdn4FLyGq/v7Sy/2WjHSNdC\n WwRQ==","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=1e100.net; s=20251104; t=1775749153; x=1776353953;\n h=content-transfer-encoding:cc:to:subject:message-id:date:from\n :in-reply-to:references:mime-version:x-gm-gg:x-gm-message-state:from\n :to:cc:subject:date:message-id:reply-to;\n bh=4Ww8dkl4RVp/tg7Hf8/JC0HJ8TBmICYn8SJV5AwG/B0=;\n b=E5mYYSeCy4QzNK7PdfurbvAEumWiqfRlUcxSrbBBaOTylwCtiHCWNuT7I8SvBAGrq9\n +5diWJ8F7XvbEvpsWxg+6IbSa4bP9h+nzKg29Ap9bxwhXXzPE5bKnOj1De+xP8w3+BHO\n tmZu0Ni/QftOZRaIjN23pgHLgc18XWmrdPMp6rzcJ+gVtaePIr5ugxE4RBTPj6VTECrP\n 9VldW2Mpp0ldVBXrQUZx0DTSgI+oC1mg1wFX9PV9X3CG+ZZUnBv4gwMfB1XOfcW13OPR\n h5WZfZIv5qhRTAbbl61usthh+imOlhB36cKh8iW68C7RlJOptPnFheS1Pziq+mp053FB\n SRsQ==","X-Gm-Message-State":"AOJu0Yw+89X76QDWW++Sb35Reba0y06ot9Q5NwuB9IbMOlq9Xo6SNfub\n nYXoUAGe5gcj8Tqa/RUvujVkT4c0qrCFsW+KN8Q+HQ9jf0fEaWt6c9Wc66KqiPIYsPlAp2y31fp\n Q6ihhSvWk6eSwoPGlld03RgG4VS9nTSqyPEqYiSdmxQ==","X-Gm-Gg":"AeBDievKLpGHNtWgrfVyo5QVolNiD6KcskH4NHKWEGZE6ptdCFnObvhtIffB/pnTmfs\n RUSfD7aaVdsRl8JfIHh0Ascm2q47RVFjGEI12gEtfuJ3EvOMY1KSDUj30u+tQXsgIbtT9t7EHvx\n kdPYtGkZgKzYzqZUseqEw38PqmeMV8xthcfiebi8Q1WMqIynRmg6WqoOwOAqUbnSIpPGl5kmiJN\n KEgJ5IbK3QDFJ8qRdAW6pUgnrK8fL3zz1SWut7W2e6JXcNCr5xf8CoB6+1i6/eN2fAJdfJEBAY2\n vxl0J/I=","X-Received":"by 2002:a05:6214:3114:b0:8a5:e0a7:d9ac with SMTP id\n 6a1803df08f44-8ac7422bf46mr65143426d6.27.1775749152522; Thu, 09 Apr 2026\n 08:39:12 -0700 (PDT)","MIME-Version":"1.0","References":"<20260409-spl_ufs_only-v1-0-f7e0e243d805@oss.qualcomm.com>\n <20260409-spl_ufs_only-v1-1-f7e0e243d805@oss.qualcomm.com>","In-Reply-To":"<20260409-spl_ufs_only-v1-1-f7e0e243d805@oss.qualcomm.com>","From":"Alexey Charkov <alchark@gmail.com>","Date":"Thu, 9 Apr 2026 19:39:00 +0400","X-Gm-Features":"AQROBzCVzRo2bW4hOcPGaxdHb7P7HQDkEofoZCOqd0f_GXZvTPsBeVTequItJaE","Message-ID":"\n <CABjd4Yx3ckxysb20=vCL6xUADByOQA7bsRx1ZSCoRFp5MBE4FQ@mail.gmail.com>","Subject":"Re: [PATCH 1/4] spl: ufs: Add partition support and flexible loading","To":"Balaji Selvanathan <balaji.selvanathan@oss.qualcomm.com>","Cc":"u-boot@lists.denx.de, Sumit Garg <sumit.garg@kernel.org>,\n u-boot-qcom@groups.io,  Tom Rini <trini@konsulko.com>,\n Neil Armstrong <neil.armstrong@linaro.org>,\n  Bhupesh Sharma <bhupesh.linux@gmail.com>,\n Neha Malcom Francis <n-francis@ti.com>,  Anshul Dalal <anshuld@ti.com>,\n Peng Fan <peng.fan@nxp.com>,  Mattijs Korpershoek <mkorpershoek@kernel.org>,\n Quentin Schulz <quentin.schulz@cherry.de>,\n  Hrushikesh Salunke <h-salunke@ti.com>,\n Dario Binacchi <dario.binacchi@amarulasolutions.com>,\n  Andre Przywara <andre.przywara@arm.com>,\n Ilias Apalodimas <ilias.apalodimas@linaro.org>,\n  Javier Martinez Canillas <javierm@redhat.com>,\n Jan Kiszka <jan.kiszka@siemens.com>,  Javier Tia <javier.tia@linaro.org>,\n Rasmus Villemoes <ravi@prevas.dk>,\n  Varadarajan Narayanan <quic_varada@quicinc.com>, =?utf-8?q?Jo=C3=A3o_Marco?=\n\t=?utf-8?q?s_Costa?= <joaomarcos.costa@bootlin.com>,\n  Dhruva Gole <d-gole@ti.com>, Richard Genoud <richard.genoud@bootlin.com>,\n  Marek Vasut <marek.vasut+renesas@mailbox.org>,\n Simon Glass <sjg@chromium.org>,\n  Igor Belwon <igor.belwon@mentallysanemainliners.org>,\n  Shawn Lin <shawn.lin@rock-chips.com>,\n Tuyen Dang <tuyen.dang.xa@renesas.com>,\n  Casey Connolly <casey.connolly@linaro.org>, Lukasz Majewski <lukma@denx.de>,\n  Patrice Chotard <patrice.chotard@foss.st.com>,\n  Patrick Delaunay <patrick.delaunay@foss.st.com>,\n Michal Simek <michal.simek@amd.com>,  Yao Zi <me@ziyao.cc>,\n Peter Korsgaard <peter@korsgaard.com>","Content-Type":"text/plain; charset=\"UTF-8\"","Content-Transfer-Encoding":"quoted-printable","X-Mailman-Approved-At":"Thu, 09 Apr 2026 20:12:16 +0200","X-BeenThere":"u-boot@lists.denx.de","X-Mailman-Version":"2.1.39","Precedence":"list","List-Id":"U-Boot discussion <u-boot.lists.denx.de>","List-Unsubscribe":"<https://lists.denx.de/options/u-boot>,\n <mailto:u-boot-request@lists.denx.de?subject=unsubscribe>","List-Archive":"<https://lists.denx.de/pipermail/u-boot/>","List-Post":"<mailto:u-boot@lists.denx.de>","List-Help":"<mailto:u-boot-request@lists.denx.de?subject=help>","List-Subscribe":"<https://lists.denx.de/listinfo/u-boot>,\n <mailto:u-boot-request@lists.denx.de?subject=subscribe>","Errors-To":"u-boot-bounces@lists.denx.de","Sender":"\"U-Boot\" <u-boot-bounces@lists.denx.de>","X-Virus-Scanned":"clamav-milter 0.103.8 at phobos.denx.de","X-Virus-Status":"Clean"}},{"id":3675435,"web_url":"http://patchwork.ozlabs.org/comment/3675435/","msgid":"<7b42b6bd-8164-4f56-93f4-368d3b437507@oss.qualcomm.com>","list_archive_url":null,"date":"2026-04-09T16:04:01","subject":"Re: [PATCH 1/4] spl: ufs: Add partition support and flexible loading","submitter":{"id":90810,"url":"http://patchwork.ozlabs.org/api/people/90810/","name":"Balaji Selvanathan","email":"balaji.selvanathan@oss.qualcomm.com"},"content":"Hi Alexey,\n\nThanks for the feedbacks. Pls find replies below:\n\nOn 4/9/2026 9:09 PM, Alexey Charkov wrote:\n> On Thu, Apr 9, 2026 at 6:43 PM Balaji Selvanathan\n> <balaji.selvanathan@oss.qualcomm.com> wrote:\n>> Add partition-based loading support to SPL UFS, similar to the\n>> existing implementation in spl_mmc.c. This allows loading from\n>> named partitions or partition numbers instead of hardcoded sector\n>> offsets.\n>>\n>> The loading strategy tries methods in order: absolute sector if\n>> configured, partition by name, partition by number, then filesystem\n>> mode (placeholder for future implementation).\n>>\n>> This brings UFS boot flexibility on par with MMC/SD boot.\n>>\n>> Signed-off-by: Balaji Selvanathan <balaji.selvanathan@oss.qualcomm.com>\n>> ---\n>>   common/spl/Kconfig   |  40 ++++++++++-\n>>   common/spl/spl_ufs.c | 188 +++++++++++++++++++++++++++++++++++++++++++++------\n>>   include/part.h       |   3 +-\n>>   include/spl.h        |   4 ++\n>>   4 files changed, 214 insertions(+), 21 deletions(-)\n>>\n>> diff --git a/common/spl/Kconfig b/common/spl/Kconfig\n>> index a21b71ad5d1..b3c7a1d8aa3 100644\n>> --- a/common/spl/Kconfig\n>> +++ b/common/spl/Kconfig\n>> @@ -1637,9 +1637,47 @@ config SPL_UFS_RAW_U_BOOT_SECTOR\n>>          depends on SPL_UFS_SUPPORT\n>>          default 0x800 if ARCH_ROCKCHIP\n>>          help\n>> -         Address on the block device to load U-Boot from.\n>> +         Absolute sector offset on the UFS LUN to load U-Boot from.\n>> +         This is tried first before partition-based loading.\n>> +         Set to 0x0 to skip absolute sector loading and use partition mode.\n>>            Units: UFS sectors (1 sector = 4096 bytes).\n> Hi Balaji,\n>\n> What if I want to load the FIT image from the start of a dedicated LUN?\nYes, thats an issue, we can have sector as last step if partition name \nor number is not provided.\n>\n>> +config SPL_UFS_RAW_U_BOOT_USE_PARTITION\n>> +       bool \"Enable UFS partition support for raw mode\"\n>> +       depends on SPL_UFS_SUPPORT\n>> +       select SPL_LIBDISK_SUPPORT\n>> +       help\n>> +         Enable support for loading from a specific partition on UFS\n>> +         in raw mode. When enabled, you can specify either a partition\n>> +         name or partition number to load from.\n>> +\n>> +config SPL_UFS_RAW_U_BOOT_PARTITION_NAME\n>> +       string \"Partition name to load U-Boot from\"\n>> +       depends on SPL_UFS_RAW_U_BOOT_USE_PARTITION\n>> +       help\n>> +         Name of the partition to load U-Boot from in UFS raw mode.\n>> +         This is tried before partition number lookup.\n>> +         Leave empty to skip name-based lookup.\n>> +         Example: \"boot\", \"uefi\", \"dtb_a\"\n>> +\n>> +config SPL_UFS_RAW_U_BOOT_PARTITION_NUM\n>> +       int \"Partition number to load U-Boot from\"\n>> +       depends on SPL_UFS_RAW_U_BOOT_USE_PARTITION\n>> +       help\n>> +         Partition number to load U-Boot from when using UFS raw mode\n>> +         with partition support. This is used if partition name is not\n>> +         specified or not found.\n>> +\n>> +config SPL_UFS_FS\n>> +       bool \"Enable UFS filesystem boot mode\"\n>> +       depends on SPL_UFS_SUPPORT\n>> +       help\n>> +         Enable filesystem-based boot from UFS. This allows loading\n>> +         U-Boot from FAT or EXT4 filesystems on UFS partitions.\n>> +         This is tried as a fallback if raw mode loading fails.\n>> +\n>> +         Note: Filesystem support is not yet fully implemented.\n> Maybe split those into separate commits for easier review?\nOkay.\n>\n>>   config SPL_WATCHDOG\n>>          bool \"Support watchdog drivers\"\n>>          imply SPL_WDT if !HW_WATCHDOG\n>> diff --git a/common/spl/spl_ufs.c b/common/spl/spl_ufs.c\n>> index cef1843f40f..c4e793bf701 100644\n>> --- a/common/spl/spl_ufs.c\n>> +++ b/common/spl/spl_ufs.c\n>> @@ -3,15 +3,19 @@\n>>    * (C) Copyright 2025 Alexey Charkov <alchark@gmail.com>\n>>    */\n>>\n>> +#include <dm.h>\n>> +#include <log.h>\n>>   #include <spl.h>\n>>   #include <spl_load.h>\n>>   #include <scsi.h>\n>> -#include <errno.h>\n>> -#include <image.h>\n>> +#include <part.h>\n>> +#include <blk.h>\n>>   #include <linux/compiler.h>\n>> -#include <log.h>\n>> +#include <errno.h>\n>>\n>> -static ulong spl_ufs_load_read(struct spl_load_info *load, ulong off, ulong size, void *buf)\n>> +/* Block read callback for spl_load framework */\n>> +static ulong h_spl_ufs_load_read(struct spl_load_info *load, ulong off,\n>> +                                ulong size, void *buf)\n>>   {\n>>          struct blk_desc *bd = load->priv;\n>>          lbaint_t sector = off >> bd->log2blksz;\n>> @@ -20,30 +24,176 @@ static ulong spl_ufs_load_read(struct spl_load_info *load, ulong off, ulong size\n>>          return blk_dread(bd, sector, count, buf) << bd->log2blksz;\n>>   }\n>>\n>> -static int spl_ufs_load_image(struct spl_image_info *spl_image,\n>> -                             struct spl_boot_device *bootdev)\n>> +/* Load image from raw sector */\n>> +static int ufs_load_image_raw_sector(struct spl_image_info *spl_image,\n>> +                                    struct spl_boot_device *bootdev,\n>> +                                    struct blk_desc *bd,\n>> +                                    unsigned long sector)\n>>   {\n>> -       unsigned long sector = CONFIG_SPL_UFS_RAW_U_BOOT_SECTOR;\n>> -       int devnum = CONFIG_SPL_UFS_RAW_U_BOOT_DEVNUM;\n>>          struct spl_load_info load;\n>> +       int ret;\n>> +\n>> +       debug(\"spl: ufs loading from sector 0x%lx\\n\", sector);\n>> +\n>> +       spl_load_init(&load, h_spl_ufs_load_read, bd, bd->blksz);\n>> +       ret = spl_load(spl_image, bootdev, &load, 0, sector << bd->log2blksz);\n>> +\n>> +       if (ret) {\n>> +               debug(\"spl: ufs load failed: %d\\n\", ret);\n>> +               return ret;\n>> +       }\n>> +\n>> +       debug(\"spl: ufs load successful\\n\");\n>> +       return 0;\n>> +}\n>> +\n>> +u32 __weak spl_ufs_boot_mode(const u32 boot_device)\n>> +{\n>> +       return UFS_MODE_RAW;\n>> +}\n>> +\n>> +int spl_ufs_load(struct spl_image_info *spl_image,\n>> +                struct spl_boot_device *bootdev,\n>> +                const char *filename)\n>> +{\n>> +       u32 boot_mode;\n>> +       int ret = 0;\n>> +       int devnum = CONFIG_SPL_UFS_RAW_U_BOOT_DEVNUM;\n>>          struct blk_desc *bd;\n>> -       int err;\n>> +       unsigned long sector = 0;\n>> +\n>> +       log_debug(\"spl: ufs devnum=%d\\n\", devnum);\n>> +\n>> +       ret = scsi_scan(false);\n>> +       if (ret) {\n>> +               printf(\"spl: scsi scan failed: %d\\n\", ret);\n>> +               return ret;\n>> +       }\n>>\n>> -       /* try to recognize storage devices immediately */\n>> -       scsi_scan(false);\n>>          bd = blk_get_devnum_by_uclass_id(UCLASS_SCSI, devnum);\n>> -       if (!bd)\n>> +       if (!bd) {\n>> +               printf(\"spl: could not get UFS device %d\\n\", devnum);\n>>                  return -ENODEV;\n>> +       }\n>>\n>> -       spl_load_init(&load, spl_ufs_load_read, bd, bd->blksz);\n>> -       err = spl_load(spl_image, bootdev, &load, 0, sector << bd->log2blksz);\n>> -       if (err) {\n>> -               puts(\"spl_ufs_load_image: ufs block read error\\n\");\n>> -               log_debug(\"(error=%d)\\n\", err);\n>> -               return err;\n>> +       boot_mode = spl_ufs_boot_mode(bootdev->boot_device);\n>> +\n>> +       switch (boot_mode) {\n>> +       case UFS_MODE_RAW:\n>> +               debug(\"spl: ufs raw mode\\n\");\n>> +\n>> +               /* Step 1: Try absolute sector (if configured and non-zero) */\n>> +#ifdef CONFIG_SPL_UFS_RAW_U_BOOT_SECTOR\n> Perhaps if this and the below blocks are split out into helper\n> functions which compile to a no-op when the respective Kconfig option\n> is not set the code would be prettier :)\n>\n> Preprocessor defines really break the flow visually by going across\n> the indentation of the surrounding code.\nGot it, will implement this.\n>\n>> +               if (CONFIG_SPL_UFS_RAW_U_BOOT_SECTOR != 0) {\n>> +                       debug(\"spl: trying absolute sector 0x%x\\n\",\n>> +                             CONFIG_SPL_UFS_RAW_U_BOOT_SECTOR);\n>> +\n>> +                       ret = ufs_load_image_raw_sector(spl_image, bootdev, bd,\n>> +                                                       CONFIG_SPL_UFS_RAW_U_BOOT_SECTOR);\n>> +\n>> +                       if (!ret) {\n>> +                               debug(\"spl: loaded from absolute sector\\n\");\n>> +                               return 0;\n>> +                       }\n>> +                       debug(\"spl: absolute sector failed: %d\\n\", ret);\n>> +               }\n>> +#endif\n>> +\n>> +               /* Step 2-4: Try partition-based loading */\n>> +#ifdef CONFIG_SPL_UFS_RAW_U_BOOT_USE_PARTITION\n>> +               {\n>> +                       struct disk_partition part_info;\n>> +                       int part_found = 0;\n> ... especially since you want to use scoped blocks with local\n> variables. These really ask to go into a helper function instead.\nOkay.\n>\n>> +                       /* Step 2: Try partition name (if configured) */\n>> +#ifdef CONFIG_SPL_UFS_RAW_U_BOOT_PARTITION_NAME\n>> +                       if (strlen(CONFIG_SPL_UFS_RAW_U_BOOT_PARTITION_NAME) > 0) {\n>> +                               debug(\"spl: trying partition name '%s'\\n\",\n>> +                                     CONFIG_SPL_UFS_RAW_U_BOOT_PARTITION_NAME);\n>> +\n>> +                               ret = part_get_info_by_name(bd,\n>> +                                                           CONFIG_SPL_UFS_RAW_U_BOOT_PARTITION_NAME,\n>> +                                       &part_info);\n>> +\n>> +                               if (ret >= 0) {\n>> +                                       debug(\"spl: found partition '%s' at 0x%lx\\n\",\n>> +                                             CONFIG_SPL_UFS_RAW_U_BOOT_PARTITION_NAME,\n>> +                                             (ulong)part_info.start);\n>> +                                       sector = part_info.start;\n>> +                                       part_found = 1;\n>> +                               } else {\n>> +                                       debug(\"spl: partition name not found: %d\\n\", ret);\n>> +                               }\n>> +                       }\n>> +#endif\n>> +\n>> +                       /* Step 3: Try partition number (if name not found) */\n>> +#ifdef CONFIG_SPL_UFS_RAW_U_BOOT_PARTITION_NUM\n>> +                       if (!part_found) {\n>> +                               debug(\"spl: trying partition number %d\\n\",\n>> +                                     CONFIG_SPL_UFS_RAW_U_BOOT_PARTITION_NUM);\n>> +\n>> +                               ret = part_get_info(bd,\n>> +                                                   CONFIG_SPL_UFS_RAW_U_BOOT_PARTITION_NUM,\n>> +                                                   &part_info);\n>> +\n>> +                               if (ret >= 0) {\n>> +                                       debug(\"spl: found partition %d at 0x%lx\\n\",\n>> +                                             CONFIG_SPL_UFS_RAW_U_BOOT_PARTITION_NUM,\n>> +                                             (ulong)part_info.start);\n>> +                                       sector = part_info.start;\n>> +                                       part_found = 1;\n>> +                               } else {\n>> +                                       debug(\"spl: partition number not found: %d\\n\", ret);\n>> +                               }\n>> +                       }\n>> +#endif\n>> +\n>> +                       /* Load from partition if found */\n>> +                       if (part_found) {\n>> +                               ret = ufs_load_image_raw_sector(spl_image, bootdev, bd, sector);\n>> +\n>> +                               if (!ret) {\n>> +                                       debug(\"spl: loaded from partition\\n\");\n>> +                                       return 0;\n>> +                               }\n>> +                               debug(\"spl: partition load failed: %d\\n\", ret);\n>> +                       }\n>> +               }\n>> +#endif /* CONFIG_SPL_UFS_RAW_U_BOOT_USE_PARTITION */\n>> +\n>> +               /* Step 4: Fall through to FS mode if enabled */\n> Wouldn't a raw offset be a more natural fallback, given that it has\n> fewest dependencies out of all these options?\nYes, will do this.\n>\n>> +               debug(\"spl: raw mode failed, trying fs\\n\");\n>> +               fallthrough;\n>> +\n>> +#ifdef CONFIG_SPL_UFS_FS\n>> +       case UFS_MODE_FS:\n>> +               debug(\"spl: ufs fs mode\\n\");\n>> +\n>> +               /* TODO: Implement filesystem support */\n>> +               printf(\"spl: ufs filesystem boot not implemented\\n\");\n>> +               ret = -ENOSYS;\n>> +               break;\n>> +#endif\n>> +\n>> +       default:\n>> +               puts(\"spl: ufs: invalid boot mode\\n\");\n>> +               ret = -EINVAL;\n>>          }\n>>\n>> -       return 0;\n>> +       return ret;\n>> +}\n>> +\n>> +/* SPL load image entry point */\n>> +static int spl_ufs_load_image(struct spl_image_info *spl_image,\n>> +                             struct spl_boot_device *bootdev)\n>> +{\n>> +       return spl_ufs_load(spl_image, bootdev,\n>> +#ifdef CONFIG_SPL_FS_LOAD_PAYLOAD_NAME\n>> +                           CONFIG_SPL_FS_LOAD_PAYLOAD_NAME);\n>> +#else\n>> +                           NULL);\n>> +#endif\n> How about config_enabled(...) instead? Gives fewer repetitions of the\n> same symbol.\nOkay.\n>\n> Best regards,\n> Alexey","headers":{"Return-Path":"<u-boot-bounces@lists.denx.de>","X-Original-To":"incoming@patchwork.ozlabs.org","Delivered-To":"patchwork-incoming@legolas.ozlabs.org","Authentication-Results":["legolas.ozlabs.org;\n\tdkim=pass (2048-bit key;\n unprotected) header.d=qualcomm.com header.i=@qualcomm.com header.a=rsa-sha256\n header.s=qcppdkim1 header.b=GQceI+QL;\n\tdkim=pass (2048-bit key;\n unprotected) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com\n header.a=rsa-sha256 header.s=google header.b=cZB/g+ft;\n\tdkim-atps=neutral","legolas.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=lists.denx.de\n (client-ip=2a01:238:438b:c500:173d:9f52:ddab:ee01; helo=phobos.denx.de;\n envelope-from=u-boot-bounces@lists.denx.de; receiver=patchwork.ozlabs.org)","phobos.denx.de;\n dmarc=none (p=none dis=none) header.from=oss.qualcomm.com","phobos.denx.de;\n spf=pass smtp.mailfrom=u-boot-bounces@lists.denx.de","phobos.denx.de;\n\tdkim=pass (2048-bit key;\n unprotected) header.d=qualcomm.com header.i=@qualcomm.com\n header.b=\"GQceI+QL\";\n\tdkim=pass (2048-bit key;\n unprotected) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com\n header.b=\"cZB/g+ft\";\n\tdkim-atps=neutral","phobos.denx.de; dmarc=none (p=none dis=none)\n header.from=oss.qualcomm.com","phobos.denx.de; spf=pass\n smtp.mailfrom=balaji.selvanathan@oss.qualcomm.com"],"Received":["from phobos.denx.de (phobos.denx.de\n [IPv6:2a01:238:438b:c500:173d:9f52:ddab:ee01])\n\t(using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n\t key-exchange x25519)\n\t(No client certificate requested)\n\tby legolas.ozlabs.org (Postfix) with ESMTPS id 4fs7M91tpyz1yCv\n\tfor <incoming@patchwork.ozlabs.org>; Fri, 10 Apr 2026 04:12:37 +1000 (AEST)","from h2850616.stratoserver.net (localhost [IPv6:::1])\n\tby phobos.denx.de (Postfix) with ESMTP id A6C7884142;\n\tThu,  9 Apr 2026 20:12:17 +0200 (CEST)","by phobos.denx.de (Postfix, from userid 109)\n id 66E3C84099; Thu,  9 Apr 2026 18:04:21 +0200 (CEST)","from mx0b-0031df01.pphosted.com (mx0b-0031df01.pphosted.com\n [205.220.180.131])\n (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits))\n (No client certificate requested)\n by phobos.denx.de (Postfix) with ESMTPS id DA4B683D8A\n for <u-boot@lists.denx.de>; Thu,  9 Apr 2026 18:04:18 +0200 (CEST)","from pps.filterd (m0279871.ppops.net [127.0.0.1])\n by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id\n 639BtpT34107636\n for <u-boot@lists.denx.de>; Thu, 9 Apr 2026 16:04:17 GMT","from mail-pj1-f72.google.com (mail-pj1-f72.google.com\n [209.85.216.72])\n by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4ddxhakq5u-1\n (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT)\n for <u-boot@lists.denx.de>; Thu, 09 Apr 2026 16:04:17 +0000 (GMT)","by mail-pj1-f72.google.com with SMTP id\n 98e67ed59e1d1-358df8fbd1cso1229223a91.0\n for <u-boot@lists.denx.de>; Thu, 09 Apr 2026 09:04:16 -0700 (PDT)","from [192.168.0.4] ([183.82.207.245])\n by smtp.gmail.com with ESMTPSA id\n 98e67ed59e1d1-35e4123a29fsm154334a91.8.2026.04.09.09.04.03\n (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128);\n Thu, 09 Apr 2026 09:04:14 -0700 (PDT)"],"X-Spam-Checker-Version":"SpamAssassin 3.4.2 (2018-09-13) on phobos.denx.de","X-Spam-Level":"","X-Spam-Status":"No, score=-2.1 required=5.0 tests=BAYES_00,DKIM_SIGNED,\n DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_BLOCKED,\n RCVD_IN_VALIDITY_CERTIFIED_BLOCKED,RCVD_IN_VALIDITY_RPBL_BLOCKED,\n SPF_HELO_NONE,SPF_PASS autolearn=ham autolearn_force=no version=3.4.2","DKIM-Signature":["v=1; a=rsa-sha256; c=relaxed/relaxed; d=qualcomm.com; h=\n cc:content-transfer-encoding:content-type:date:from:in-reply-to\n :message-id:mime-version:references:subject:to; s=qcppdkim1; bh=\n KUG9XQMEBnpP39R2zd3i6Ct1z/spiDFYI82wiC+lj3c=; b=GQceI+QL4gNQi54e\n lfio1vG97O32XRuKJiLnRhiXXrNOJ+bFgTvNn8YpM9TxM9GfN0cv8uxu8AB3SZrL\n eghAvgLF0yq+dKZTSYO2R4eXJzZryjabWVYYC8EMDJLO5gt/1+nX4M8ZeIPCZWM2\n DZeFu5tt/RUtfXDRMBybn2GbKjWJ2V6UT+x+X93cKTtB/TGp0P3WlZFwVJTOLP8o\n 0GnVW5Sbfd9yclY3DzjNzCQDg25FZDotqI1KQyKtrVsmro3hBJqsSn/r50fAcPAD\n I3ph1suVhM1AaIVpmAPwj7T8zyH2P52sLZOSSyc6AOW3RZdAlIZQNjsyJHWh/8ki\n hDV4YQ==","v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=oss.qualcomm.com; s=google; t=1775750656; x=1776355456; darn=lists.denx.de;\n h=content-transfer-encoding:in-reply-to:from:content-language\n :references:cc:to:subject:user-agent:mime-version:date:message-id\n :from:to:cc:subject:date:message-id:reply-to;\n bh=KUG9XQMEBnpP39R2zd3i6Ct1z/spiDFYI82wiC+lj3c=;\n b=cZB/g+ft7YyAPKDwACfbmLxhC04qRZbNpU/yopfBKFwK3uL2ZOA1utdtjKbShpEbj2\n uxttzCqTFM6CO+ZX1sWTJzGdiTKEHsH0jRCiJuT2XAlOHuI7np/ww/VjfkSjDqS87xCh\n AHSJhPHlE24wEV5jiE4pOn4RxsruCKHPtZXs/0a5tze4YLiYgb2mTenzP4+qR6y3ukUu\n rHq6YATiBG/e0imu/4jW/A75lPYCiBz097rg4Pf09McrEMerLGZyvt/fhfXsy8IJqmUc\n j5hX+s0J+STbiFkNoFF1Cl2zdh9e/ydGMfmDW1Voev2Hff1Hk8wVGI8ACguLrQkCx6dC\n hZAQ=="],"X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=1e100.net; s=20251104; t=1775750656; x=1776355456;\n h=content-transfer-encoding:in-reply-to:from:content-language\n :references:cc:to:subject:user-agent:mime-version:date:message-id\n :x-gm-gg:x-gm-message-state:from:to:cc:subject:date:message-id\n :reply-to;\n bh=KUG9XQMEBnpP39R2zd3i6Ct1z/spiDFYI82wiC+lj3c=;\n b=UydTkFv0rik+oDueL9spSZKbShGpQsw0afMigysFqAwCR6QagyrqUers6FwSF7YORl\n vRGaABaR8WD2FJLK8eulOjR9UoRh9j80QNP7eGxoYnji5z9qQQc9jrcalQ5MlD8RFOuY\n u2fatUIeJgsKAHqtcB7dUzNu4GBCE8AplXynQinmiHvIewM9ctQ5xMtXkdFRfaIRQC7A\n 9kh2i9YcQOjRLnzlloU6s8qvrolJW9hXbTeidGFv4Ao9KIIe4yLMyciZ9KtJHXX9iLk8\n VxYNvvsbVU86tfct7/46NOnuSjCv2lpBoVNOVcgqcFAt8fuZ0dzFzIDsg2kKWLxFfBNV\n DHIQ==","X-Gm-Message-State":"AOJu0Yzo6LuAzWNEOe8g99yAnuXzBw0Wu9VSgrToZ5RdTbeimH1Gpry6\n g+kpE2sveeZhvvjouN6C47TAIVYKI5KByMEQu39gIxShoug9xK7M8TU1/FmkCgmAnxO6DsFkhpl\n ST/UXXCrS7unaM1LPK6jnUpKcoEdgNDqyqBapWvprl1iPd0Vu0TuZLxn7","X-Gm-Gg":"AeBDieuti86C45c+KE7XYRtKub+jMuHyfUFqU0VpK+MhQbNsLqURpbZnZ05dcq3KCIk\n WO33oWm+E9IgQ5B+xFEIUfo9XYnMyv+47FCCuHAfLIU6PkuJvo70SIjOzNKloN10O+klATgGGRW\n 0PjAOsfStuLf5+WBn7nFK9MQ6ekP26TBkvCcdDUFTHGOBTr0QWudpYaH7psgqoXPb2/w8FIbIfw\n g10fWENdCdjxrOmyer0CHRMsKYn13/xAhLBEMy5naXIZWEceq9YtrMopJsopcLHE/lApWUg7bqp\n kqC9ZV+E+ydsyL+LsKjP9w5XixkHs89/uuTfYdevAecYGxMp94fC2mc/tIUgnCr4psEy7MeTsMh\n OrIkLvEAWzfw6cgJHROv/8wynSIH+/ym0w/hI+giiZ82zTDB7F6yJikM3KqQ=","X-Received":["by 2002:a17:90b:52c7:b0:359:8dfd:64c8 with SMTP id\n 98e67ed59e1d1-35de69702cdmr23316493a91.24.1775750655845;\n Thu, 09 Apr 2026 09:04:15 -0700 (PDT)","by 2002:a17:90b:52c7:b0:359:8dfd:64c8 with SMTP id\n 98e67ed59e1d1-35de69702cdmr23316412a91.24.1775750654956;\n Thu, 09 Apr 2026 09:04:14 -0700 (PDT)"],"Message-ID":"<7b42b6bd-8164-4f56-93f4-368d3b437507@oss.qualcomm.com>","Date":"Thu, 9 Apr 2026 21:34:01 +0530","MIME-Version":"1.0","User-Agent":"Mozilla Thunderbird","Subject":"Re: [PATCH 1/4] spl: ufs: Add partition support and flexible loading","To":"Alexey Charkov <alchark@gmail.com>","Cc":"u-boot@lists.denx.de, Sumit Garg <sumit.garg@kernel.org>,\n u-boot-qcom@groups.io, Tom Rini <trini@konsulko.com>,\n Neil Armstrong <neil.armstrong@linaro.org>,\n Bhupesh Sharma <bhupesh.linux@gmail.com>,\n Neha Malcom Francis <n-francis@ti.com>, Anshul Dalal <anshuld@ti.com>,\n Peng Fan <peng.fan@nxp.com>, Mattijs Korpershoek <mkorpershoek@kernel.org>,\n Quentin Schulz <quentin.schulz@cherry.de>,\n Hrushikesh Salunke <h-salunke@ti.com>,\n Dario Binacchi <dario.binacchi@amarulasolutions.com>,\n Andre Przywara <andre.przywara@arm.com>,\n Ilias Apalodimas <ilias.apalodimas@linaro.org>,\n Javier Martinez Canillas <javierm@redhat.com>,\n Jan Kiszka <jan.kiszka@siemens.com>, Javier Tia <javier.tia@linaro.org>,\n Rasmus Villemoes <ravi@prevas.dk>,\n Varadarajan Narayanan <quic_varada@quicinc.com>, =?utf-8?q?Jo=C3=A3o_Marcos?=\n\t=?utf-8?q?_Costa?= <joaomarcos.costa@bootlin.com>,\n Dhruva Gole <d-gole@ti.com>, Richard Genoud <richard.genoud@bootlin.com>,\n Marek Vasut <marek.vasut+renesas@mailbox.org>,\n Simon Glass <sjg@chromium.org>,\n Igor Belwon <igor.belwon@mentallysanemainliners.org>,\n Shawn Lin <shawn.lin@rock-chips.com>, Tuyen Dang <tuyen.dang.xa@renesas.com>,\n Casey Connolly <casey.connolly@linaro.org>, Lukasz Majewski <lukma@denx.de>,\n Patrice Chotard <patrice.chotard@foss.st.com>,\n Patrick Delaunay <patrick.delaunay@foss.st.com>,\n Michal Simek <michal.simek@amd.com>, Yao Zi <me@ziyao.cc>,\n Peter Korsgaard <peter@korsgaard.com>","References":"<20260409-spl_ufs_only-v1-0-f7e0e243d805@oss.qualcomm.com>\n <20260409-spl_ufs_only-v1-1-f7e0e243d805@oss.qualcomm.com>\n <CABjd4Yx3ckxysb20=vCL6xUADByOQA7bsRx1ZSCoRFp5MBE4FQ@mail.gmail.com>","Content-Language":"en-US","From":"Balaji Selvanathan <balaji.selvanathan@oss.qualcomm.com>","In-Reply-To":"\n <CABjd4Yx3ckxysb20=vCL6xUADByOQA7bsRx1ZSCoRFp5MBE4FQ@mail.gmail.com>","Content-Type":"text/plain; charset=UTF-8; format=flowed","Content-Transfer-Encoding":"8bit","X-Proofpoint-ORIG-GUID":"oVn9caXQTdG2IRssT8fRHZGqDNmq5BCl","X-Proofpoint-GUID":"oVn9caXQTdG2IRssT8fRHZGqDNmq5BCl","X-Proofpoint-Spam-Details-Enc":"AW1haW4tMjYwNDA5MDE0NyBTYWx0ZWRfXwEqZk0mgIzfn\n UyO2oWdBBsMzhOvqA4UWp0mymKlGe15gGVxQhgGq070VRRtiQYwc7Vc/Ve9nehSqzz27lUVkMvP\n vuXeHuGaQVRUPpqpiYZHri1mRsAztUtiycqmc9WlFJH4GB7GltZh2ktiIpgSB7JTIFfF1qPT91O\n 3w7ArFpEA+3Ank52J+rHH0C+jqXKJMY7fy3c1kGZ7+1QHniOXhhAZuqBsKSFUjfvZu+jBXLtSID\n c7VZBwMlny/ZKzbGWVIzrGW9sImQ28uya82/4AttkkPyHDB6tU1LHv1zxc+1iwfhqkCFeXVZgAH\n Zptt2ag1tRfK4yo9XPoN/P9U18je7KXA7LWLKUxi7yOfhQVkTzcMwuXrtnSQ4g5LB4SYcKPYZnB\n OD8gwy+8Kyt+rw0VJPpJrDBncBhHdYR0M3AGlrMgvDHuw8Kc51pN++54F4bu2dLWT5ZisdBs649\n ykUIUHuVQaf/c/6P8jA==","X-Authority-Analysis":"v=2.4 cv=BefoFLt2 c=1 sm=1 tr=0 ts=69d7ce01 cx=c_pps\n a=RP+M6JBNLl+fLTcSJhASfg==:117 a=A13norTQGndBH59Ws6Bpcg==:17\n a=IkcTkHD0fZMA:10 a=A5OVakUREuEA:10 a=s4-Qcg_JpJYA:10\n a=VkNPw1HP01LnGYTKEx00:22 a=u7WPNUs3qKkmUXheDGA7:22 a=3WHJM1ZQz_JShphwDgj5:22\n a=EUspDBNiAAAA:8 a=pGLkceISAAAA:8 a=PUyR3O8LRKCDiOPGNpMA:9 a=3ZKOabzyN94A:10\n a=QEXdDO2ut3YA:10 a=iS9zxrgQBfv6-_F4QbHw:22","X-Proofpoint-Virus-Version":"vendor=baseguard\n engine=ICAP:2.0.293,Aquarius:18.0.1143,Hydra:6.1.51,FMLib:17.12.100.49\n definitions=2026-04-09_04,2026-04-09_02,2025-10-01_01","X-Proofpoint-Spam-Details":"rule=outbound_notspam policy=outbound score=0\n impostorscore=0 adultscore=0 suspectscore=0 spamscore=0 priorityscore=1501\n phishscore=0 malwarescore=0 bulkscore=0 clxscore=1015 lowpriorityscore=0\n classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0\n reason=mlx scancount=1 engine=8.22.0-2604010000 definitions=main-2604090147","X-Mailman-Approved-At":"Thu, 09 Apr 2026 20:12:16 +0200","X-BeenThere":"u-boot@lists.denx.de","X-Mailman-Version":"2.1.39","Precedence":"list","List-Id":"U-Boot discussion <u-boot.lists.denx.de>","List-Unsubscribe":"<https://lists.denx.de/options/u-boot>,\n <mailto:u-boot-request@lists.denx.de?subject=unsubscribe>","List-Archive":"<https://lists.denx.de/pipermail/u-boot/>","List-Post":"<mailto:u-boot@lists.denx.de>","List-Help":"<mailto:u-boot-request@lists.denx.de?subject=help>","List-Subscribe":"<https://lists.denx.de/listinfo/u-boot>,\n <mailto:u-boot-request@lists.denx.de?subject=subscribe>","Errors-To":"u-boot-bounces@lists.denx.de","Sender":"\"U-Boot\" <u-boot-bounces@lists.denx.de>","X-Virus-Scanned":"clamav-milter 0.103.8 at phobos.denx.de","X-Virus-Status":"Clean"}}]