get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

GET /api/1.2/patches/2221521/?format=api
HTTP 200 OK
Allow: GET, PUT, PATCH, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

{
    "id": 2221521,
    "url": "http://patchwork.ozlabs.org/api/1.2/patches/2221521/?format=api",
    "web_url": "http://patchwork.ozlabs.org/project/uboot/patch/20260409-spl_ufs_only-v1-1-f7e0e243d805@oss.qualcomm.com/",
    "project": {
        "id": 18,
        "url": "http://patchwork.ozlabs.org/api/1.2/projects/18/?format=api",
        "name": "U-Boot",
        "link_name": "uboot",
        "list_id": "u-boot.lists.denx.de",
        "list_email": "u-boot@lists.denx.de",
        "web_url": null,
        "scm_url": null,
        "webscm_url": null,
        "list_archive_url": "",
        "list_archive_url_format": "",
        "commit_url_format": ""
    },
    "msgid": "<20260409-spl_ufs_only-v1-1-f7e0e243d805@oss.qualcomm.com>",
    "list_archive_url": null,
    "date": "2026-04-09T14:43:31",
    "name": "[1/4] spl: ufs: Add partition support and flexible loading",
    "commit_ref": null,
    "pull_url": null,
    "state": "new",
    "archived": false,
    "hash": "05dc94865f359c0c10a6737072258a4f3d74ad2e",
    "submitter": {
        "id": 90810,
        "url": "http://patchwork.ozlabs.org/api/1.2/people/90810/?format=api",
        "name": "Balaji Selvanathan",
        "email": "balaji.selvanathan@oss.qualcomm.com"
    },
    "delegate": {
        "id": 151538,
        "url": "http://patchwork.ozlabs.org/api/1.2/users/151538/?format=api",
        "username": "kcxt",
        "first_name": "Casey",
        "last_name": "Connolly",
        "email": "casey.connolly@linaro.org"
    },
    "mbox": "http://patchwork.ozlabs.org/project/uboot/patch/20260409-spl_ufs_only-v1-1-f7e0e243d805@oss.qualcomm.com/mbox/",
    "series": [
        {
            "id": 499320,
            "url": "http://patchwork.ozlabs.org/api/1.2/series/499320/?format=api",
            "web_url": "http://patchwork.ozlabs.org/project/uboot/list/?series=499320",
            "date": "2026-04-09T14:43:30",
            "name": "spl: Add UFS boot support for SPL on Qualcomm",
            "version": 1,
            "mbox": "http://patchwork.ozlabs.org/series/499320/mbox/"
        }
    ],
    "comments": "http://patchwork.ozlabs.org/api/patches/2221521/comments/",
    "check": "pending",
    "checks": "http://patchwork.ozlabs.org/api/patches/2221521/checks/",
    "tags": {},
    "related": [],
    "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=KCcePmoN;\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=aslZFf5S;\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=\"KCcePmoN\";\n\tdkim=pass (2048-bit key;\n unprotected) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com\n header.b=\"aslZFf5S\";\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 4fs3xp6Fs6z1xy1\n\tfor <incoming@patchwork.ozlabs.org>; Fri, 10 Apr 2026 01:38:54 +1000 (AEST)",
            "from h2850616.stratoserver.net (localhost [IPv6:::1])\n\tby phobos.denx.de (Postfix) with ESMTP id AD85F84105;\n\tThu,  9 Apr 2026 17:38:44 +0200 (CEST)",
            "by phobos.denx.de (Postfix, from userid 109)\n id BCEDF84099; Thu,  9 Apr 2026 16:44:03 +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 20F6783CF5\n for <u-boot@lists.denx.de>; Thu,  9 Apr 2026 16:43:57 +0200 (CEST)",
            "from pps.filterd (m0279869.ppops.net [127.0.0.1])\n by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id\n 639ACesl1727413\n for <u-boot@lists.denx.de>; Thu, 9 Apr 2026 14:43:55 GMT",
            "from mail-pl1-f197.google.com (mail-pl1-f197.google.com\n [209.85.214.197])\n by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4ddwcrutds-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 14:43:55 +0000 (GMT)",
            "by mail-pl1-f197.google.com with SMTP id\n d9443c01a7336-2b24e45271cso12938135ad.2\n for <u-boot@lists.denx.de>; Thu, 09 Apr 2026 07:43:55 -0700 (PDT)",
            "from hu-bselvana-blr.qualcomm.com\n (blr-bdr-fw-01_GlobalNAT_AllZones-Outside.qualcomm.com. [103.229.18.19])\n by smtp.gmail.com with ESMTPSA id\n d9443c01a7336-2b2749cbd85sm235083535ad.74.2026.04.09.07.43.43\n (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);\n Thu, 09 Apr 2026 07:43:52 -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 BKJ5oFYiXc+M8jgsNod0+ZBiakITyVze44e4H2WEVSc=; b=KCcePmoNUl7JGCzS\n joqt+D8BpfJrkVKb6T6zmCxjXRCJ9bhdBu9vZ/7zyvu0oIuusKI+BhhU9ygdMOf0\n JieXR1PP56MKp+FRCnf9/zGrBy7eu98Qg2fIbXPOhJ67PS3hHl8K9ugi/3J8UpN3\n 9DPggQGrjUaTfcax0ZmYf+bSw10fVR1WLyJ2Lpz0bVhcVvJPzSEDisoi944SaCos\n E20L09dGzEoS4XGN6BNf0fpkmyVaZYcBjdapyZk6DCQf0o1VGboFI4IQ73ZmS6iH\n 5x0WGoTIrTMnkxAL2zDxow5OUGW8lhHhUudUZ/enhwn1qjopeJfy6a/KO4Hejq24\n Es7DtA==",
            "v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=oss.qualcomm.com; s=google; t=1775745834; x=1776350634; darn=lists.denx.de;\n h=cc:to:in-reply-to:references:message-id:content-transfer-encoding\n :mime-version:subject:date:from:from:to:cc:subject:date:message-id\n :reply-to; bh=BKJ5oFYiXc+M8jgsNod0+ZBiakITyVze44e4H2WEVSc=;\n b=aslZFf5S4jDvvyZGIpZ1CrJKTgZY3mB1eno6nARLGyUDK1ntQ8Sa8V3Mbht51c3cY5\n Bd6urZtsu75wDeQWEZxdfWytReXMyj/IpNG7RL+Yy24xm0KXololffn2JJz1BWfJrrAL\n Sci/7ks9NE/3YeKFZAAw9BF7kiB0Hv3cuRLLJ2WcA0CXhpH5e3qJixJCUxb2XB2G/Ctc\n EGM5nT0KXH53TT4KLNi998t0jFbGpuDHHtieIWmamjeWir8MZbBaPZFdXO7mGOA/Clzz\n XuwP6eCB9qdwrxmC8ljuW+E9277y9yz5QJgdsK7QDBZcba9YS/Sknag3k1KCjn6Mm16a\n wYNg=="
        ],
        "X-Google-DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=1e100.net; s=20251104; t=1775745834; x=1776350634;\n h=cc:to:in-reply-to:references:message-id:content-transfer-encoding\n :mime-version:subject:date:from:x-gm-gg:x-gm-message-state:from:to\n :cc:subject:date:message-id:reply-to;\n bh=BKJ5oFYiXc+M8jgsNod0+ZBiakITyVze44e4H2WEVSc=;\n b=V/Tf/IuX0sdejum3mLUugJBWy1qFT+vQaukLkqq4WzlFFTIbxUMXTB5dTDC6ING61/\n OMpV+k/cAVU0Dh/I6YsX4Bw1v7d8eeAoRpP89sagnA3E9BqIAPn7qhoiTxvfWTC1/Z8V\n IJNZXJZT++HIDAb2J8ePWRYBqX4QMEhtbXZoK5jDTDrtXtY6SL07LNNXkLpwaGtN4Qqo\n M8ThEn9mPqaCQA8X4N4UK5f12s8X528KxM+ernx6ik/9+4W3KDekjLSEW6/gfQuBAwcb\n 8qYzFSVVOBf45tuVHup+hYmiCxUz3mZKb9pCJ6+N6KKp/6zfmcpMm0l/l7aoJX2zxyq1\n 3XPQ==",
        "X-Gm-Message-State": "AOJu0YwdV8fc7peFKx70dEbZJAW8GZ6OOAhE+nNQdKR0I1O6SoZ4RjGF\n pt5k7reAu3IFGoN+WKjvHxXYs4vmlFjzbG6/eSpZEj7aCoiDeG1qReQyVs3vyuP8755rlaH32OI\n Vih86CGFPVKBcdvcqAuFhu17Ey83Lr5MI4r8pF93iRhecDnkWy1MXVQEq",
        "X-Gm-Gg": "AeBDieuDDmzEDxorOyx+y4WFThom5JEWWWlZkIn+gLIP/uUScbHhoia5nGxqQwBAwHR\n LwPFwpQjj1/pu+qArgn42YCIxP+5h1r9iYJXFWQNwaXsHeLNABM0qKy/JPwtCUgqZ1WDVynUHn0\n wwA7BeWQ8LTZzz9EQGcxV/u5CCF+3qiq3fXpj4D+rTWvwdljRMFBKdRu6JWsuGHswn6YYto+2Fs\n /Phs4jYUYicx5nRZA9kvY3DcwX99EMEgHA06/eWRQoG70l1EotZ0cIAvoZ84gK9C1kz1PORn29H\n 6lkFYrtjPO5w0MCMJhENkki4mYvhyj7dyWBHnv5BIqcmk4suXVVYVeJqb56luBxmrR4VCSyLB1o\n v8Ma0A/G51bkwCyw/Q6g6EZL6yT6D9pkrbMvi5kMunQ5qA/I1ae31qZ0h47xSb4hHO4eVySLX/a\n eSpq4Q0d7tI9oBt8sOtn6lfX4Bk20qAJezeQqRn8HmuizfpSElbQ==",
        "X-Received": [
            "by 2002:a17:903:22c6:b0:2ae:3b9b:db34 with SMTP id\n d9443c01a7336-2b28188da6amr268315345ad.42.1775745834300;\n Thu, 09 Apr 2026 07:43:54 -0700 (PDT)",
            "by 2002:a17:903:22c6:b0:2ae:3b9b:db34 with SMTP id\n d9443c01a7336-2b28188da6amr268314535ad.42.1775745833454;\n Thu, 09 Apr 2026 07:43:53 -0700 (PDT)"
        ],
        "From": "Balaji Selvanathan <balaji.selvanathan@oss.qualcomm.com>",
        "Date": "Thu, 09 Apr 2026 20:13:31 +0530",
        "Subject": "[PATCH 1/4] spl: ufs: Add partition support and flexible loading",
        "MIME-Version": "1.0",
        "Content-Type": "text/plain; charset=\"utf-8\"",
        "Content-Transfer-Encoding": "7bit",
        "Message-Id": "<20260409-spl_ufs_only-v1-1-f7e0e243d805@oss.qualcomm.com>",
        "References": "<20260409-spl_ufs_only-v1-0-f7e0e243d805@oss.qualcomm.com>",
        "In-Reply-To": "<20260409-spl_ufs_only-v1-0-f7e0e243d805@oss.qualcomm.com>",
        "To": "u-boot@lists.denx.de, Sumit Garg <sumit.garg@kernel.org>,\n u-boot-qcom@groups.io",
        "Cc": "Tom Rini <trini@konsulko.com>, 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>, Alexey Charkov <alchark@gmail.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>,\n Balaji Selvanathan <balaji.selvanathan@oss.qualcomm.com>",
        "X-Mailer": "b4 0.14.3",
        "X-Developer-Signature": "v=1; a=ed25519-sha256; t=1775745813; l=10124;\n i=balaji.selvanathan@oss.qualcomm.com; s=20260213; h=from:subject:message-id;\n bh=vzonfL9BkiOIqHJiTsEKEDkpVU9zuuCD325/L9I8XRw=;\n b=JG5e44/zjzUTPP5+iamvXosYTD8mP6MAoY148BXWZRAap4cy7kWM/w/tzOSe7q4SByMiMV+X0\n vN1xPzfeYU2Cqx8YSPbLNwZ8YUA+hvOJjHPWb5TSV1JBbQK5NabAGPS",
        "X-Developer-Key": "i=balaji.selvanathan@oss.qualcomm.com; a=ed25519;\n pk=CDpYiUU3SH7KGEtsBvY2tBGPiWfMxqWJF0p2LftOfnc=",
        "X-Proofpoint-Spam-Details-Enc": "AW1haW4tMjYwNDA5MDEzNCBTYWx0ZWRfX8CuTdt6EvK5+\n 4BZLlA2jjotjGl6lXV6f6ECV2zSLT+89NVFxd8Aa2WXkLK04G2yphPxqvQ9SjDmu+UkIme3rsZa\n ZYjOc3mBWNxr8c3aqxmNNgJY1QdqYwy+ACTrkMOZ4NudTe0pUkUGMlB0jROOlbpoLjmBJA8RAKW\n 3C30A0/e9yDbWZ5LBFHDUoI0cSupfV4qML2Z+pHWvmfHRqf4is9KX0PWOmLsoqFmk24enaknAxy\n NC1DqrNIu120yQlTkVIgWJI/EryySaTfx0fd66QnYZM90QYw+khun3cencUDeJjHm9LPkkm1WiB\n qEMkWRgAcSnSHcXR0DZ6OvJTHDJCBgwpmMMYhkkeHTYckm7OLPtGOPpKKVkRaWtVU/n8PRj3Y3B\n 5z/XdumUYOp2uW9w9NVQkQHW58hjoEpJmu8E9eDovcZc+GGQTnHc+vh7lQ3ITqni637NcHSfs/H\n fuPqlD3EM7u8SvdBn0g==",
        "X-Authority-Analysis": "v=2.4 cv=SsWgLvO0 c=1 sm=1 tr=0 ts=69d7bb2b cx=c_pps\n a=cmESyDAEBpBGqyK7t0alAg==:117 a=Ou0eQOY4+eZoSc0qltEV5Q==:17\n a=IkcTkHD0fZMA:10 a=A5OVakUREuEA:10 a=s4-Qcg_JpJYA:10\n a=VkNPw1HP01LnGYTKEx00:22 a=u7WPNUs3qKkmUXheDGA7:22 a=_glEPmIy2e8OvE2BGh3C:22\n a=EUspDBNiAAAA:8 a=pGLkceISAAAA:8 a=KMwvg-qJkY4bAsvMzlMA:9 a=QEXdDO2ut3YA:10\n a=1OuFwYUASf3TG4hYMiVC:22",
        "X-Proofpoint-GUID": "zTFR7xWQQKDkIfVnUfpJNEZeW2wZy6KJ",
        "X-Proofpoint-ORIG-GUID": "zTFR7xWQQKDkIfVnUfpJNEZeW2wZy6KJ",
        "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 malwarescore=0 suspectscore=0 lowpriorityscore=0 priorityscore=1501\n spamscore=0 impostorscore=0 adultscore=0 bulkscore=0 clxscore=1015\n phishscore=0 classifier=typeunknown authscore=0 authtc= authcc=\n route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2604010000\n definitions=main-2604090134",
        "X-Mailman-Approved-At": "Thu, 09 Apr 2026 17:38:43 +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"
    },
    "content": "Add partition-based loading support to SPL UFS, similar to the\nexisting implementation in spl_mmc.c. This allows loading from\nnamed partitions or partition numbers instead of hardcoded sector\noffsets.\n\nThe loading strategy tries methods in order: absolute sector if\nconfigured, partition by name, partition by number, then filesystem\nmode (placeholder for future implementation).\n\nThis brings UFS boot flexibility on par with MMC/SD boot.\n\nSigned-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(-)",
    "diff": "diff --git a/common/spl/Kconfig b/common/spl/Kconfig\nindex 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 \tdepends on SPL_UFS_SUPPORT\n \tdefault 0x800 if ARCH_ROCKCHIP\n \thelp\n-\t  Address on the block device to load U-Boot from.\n+\t  Absolute sector offset on the UFS LUN to load U-Boot from.\n+\t  This is tried first before partition-based loading.\n+\t  Set to 0x0 to skip absolute sector loading and use partition mode.\n \t  Units: UFS sectors (1 sector = 4096 bytes).\n \n+config SPL_UFS_RAW_U_BOOT_USE_PARTITION\n+\tbool \"Enable UFS partition support for raw mode\"\n+\tdepends on SPL_UFS_SUPPORT\n+\tselect SPL_LIBDISK_SUPPORT\n+\thelp\n+\t  Enable support for loading from a specific partition on UFS\n+\t  in raw mode. When enabled, you can specify either a partition\n+\t  name or partition number to load from.\n+\n+config SPL_UFS_RAW_U_BOOT_PARTITION_NAME\n+\tstring \"Partition name to load U-Boot from\"\n+\tdepends on SPL_UFS_RAW_U_BOOT_USE_PARTITION\n+\thelp\n+\t  Name of the partition to load U-Boot from in UFS raw mode.\n+\t  This is tried before partition number lookup.\n+\t  Leave empty to skip name-based lookup.\n+\t  Example: \"boot\", \"uefi\", \"dtb_a\"\n+\n+config SPL_UFS_RAW_U_BOOT_PARTITION_NUM\n+\tint \"Partition number to load U-Boot from\"\n+\tdepends on SPL_UFS_RAW_U_BOOT_USE_PARTITION\n+\thelp\n+\t  Partition number to load U-Boot from when using UFS raw mode\n+\t  with partition support. This is used if partition name is not\n+\t  specified or not found.\n+\n+config SPL_UFS_FS\n+\tbool \"Enable UFS filesystem boot mode\"\n+\tdepends on SPL_UFS_SUPPORT\n+\thelp\n+\t  Enable filesystem-based boot from UFS. This allows loading\n+\t  U-Boot from FAT or EXT4 filesystems on UFS partitions.\n+\t  This is tried as a fallback if raw mode loading fails.\n+\n+\t  Note: Filesystem support is not yet fully implemented.\n+\n config SPL_WATCHDOG\n \tbool \"Support watchdog drivers\"\n \timply SPL_WDT if !HW_WATCHDOG\ndiff --git a/common/spl/spl_ufs.c b/common/spl/spl_ufs.c\nindex 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+\t\t\t\t ulong size, void *buf)\n {\n \tstruct blk_desc *bd = load->priv;\n \tlbaint_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 \treturn blk_dread(bd, sector, count, buf) << bd->log2blksz;\n }\n \n-static int spl_ufs_load_image(struct spl_image_info *spl_image,\n-\t\t\t      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+\t\t\t\t     struct spl_boot_device *bootdev,\n+\t\t\t\t     struct blk_desc *bd,\n+\t\t\t\t     unsigned long sector)\n {\n-\tunsigned long sector = CONFIG_SPL_UFS_RAW_U_BOOT_SECTOR;\n-\tint devnum = CONFIG_SPL_UFS_RAW_U_BOOT_DEVNUM;\n \tstruct spl_load_info load;\n+\tint ret;\n+\n+\tdebug(\"spl: ufs loading from sector 0x%lx\\n\", sector);\n+\n+\tspl_load_init(&load, h_spl_ufs_load_read, bd, bd->blksz);\n+\tret = spl_load(spl_image, bootdev, &load, 0, sector << bd->log2blksz);\n+\n+\tif (ret) {\n+\t\tdebug(\"spl: ufs load failed: %d\\n\", ret);\n+\t\treturn ret;\n+\t}\n+\n+\tdebug(\"spl: ufs load successful\\n\");\n+\treturn 0;\n+}\n+\n+u32 __weak spl_ufs_boot_mode(const u32 boot_device)\n+{\n+\treturn UFS_MODE_RAW;\n+}\n+\n+int spl_ufs_load(struct spl_image_info *spl_image,\n+\t\t struct spl_boot_device *bootdev,\n+\t\t const char *filename)\n+{\n+\tu32 boot_mode;\n+\tint ret = 0;\n+\tint devnum = CONFIG_SPL_UFS_RAW_U_BOOT_DEVNUM;\n \tstruct blk_desc *bd;\n-\tint err;\n+\tunsigned long sector = 0;\n+\n+\tlog_debug(\"spl: ufs devnum=%d\\n\", devnum);\n+\n+\tret = scsi_scan(false);\n+\tif (ret) {\n+\t\tprintf(\"spl: scsi scan failed: %d\\n\", ret);\n+\t\treturn ret;\n+\t}\n \n-\t/* try to recognize storage devices immediately */\n-\tscsi_scan(false);\n \tbd = blk_get_devnum_by_uclass_id(UCLASS_SCSI, devnum);\n-\tif (!bd)\n+\tif (!bd) {\n+\t\tprintf(\"spl: could not get UFS device %d\\n\", devnum);\n \t\treturn -ENODEV;\n+\t}\n \n-\tspl_load_init(&load, spl_ufs_load_read, bd, bd->blksz);\n-\terr = spl_load(spl_image, bootdev, &load, 0, sector << bd->log2blksz);\n-\tif (err) {\n-\t\tputs(\"spl_ufs_load_image: ufs block read error\\n\");\n-\t\tlog_debug(\"(error=%d)\\n\", err);\n-\t\treturn err;\n+\tboot_mode = spl_ufs_boot_mode(bootdev->boot_device);\n+\n+\tswitch (boot_mode) {\n+\tcase UFS_MODE_RAW:\n+\t\tdebug(\"spl: ufs raw mode\\n\");\n+\n+\t\t/* Step 1: Try absolute sector (if configured and non-zero) */\n+#ifdef CONFIG_SPL_UFS_RAW_U_BOOT_SECTOR\n+\t\tif (CONFIG_SPL_UFS_RAW_U_BOOT_SECTOR != 0) {\n+\t\t\tdebug(\"spl: trying absolute sector 0x%x\\n\",\n+\t\t\t      CONFIG_SPL_UFS_RAW_U_BOOT_SECTOR);\n+\n+\t\t\tret = ufs_load_image_raw_sector(spl_image, bootdev, bd,\n+\t\t\t\t\t\t\tCONFIG_SPL_UFS_RAW_U_BOOT_SECTOR);\n+\n+\t\t\tif (!ret) {\n+\t\t\t\tdebug(\"spl: loaded from absolute sector\\n\");\n+\t\t\t\treturn 0;\n+\t\t\t}\n+\t\t\tdebug(\"spl: absolute sector failed: %d\\n\", ret);\n+\t\t}\n+#endif\n+\n+\t\t/* Step 2-4: Try partition-based loading */\n+#ifdef CONFIG_SPL_UFS_RAW_U_BOOT_USE_PARTITION\n+\t\t{\n+\t\t\tstruct disk_partition part_info;\n+\t\t\tint part_found = 0;\n+\n+\t\t\t/* Step 2: Try partition name (if configured) */\n+#ifdef CONFIG_SPL_UFS_RAW_U_BOOT_PARTITION_NAME\n+\t\t\tif (strlen(CONFIG_SPL_UFS_RAW_U_BOOT_PARTITION_NAME) > 0) {\n+\t\t\t\tdebug(\"spl: trying partition name '%s'\\n\",\n+\t\t\t\t      CONFIG_SPL_UFS_RAW_U_BOOT_PARTITION_NAME);\n+\n+\t\t\t\tret = part_get_info_by_name(bd,\n+\t\t\t\t\t\t\t    CONFIG_SPL_UFS_RAW_U_BOOT_PARTITION_NAME,\n+\t\t\t\t\t&part_info);\n+\n+\t\t\t\tif (ret >= 0) {\n+\t\t\t\t\tdebug(\"spl: found partition '%s' at 0x%lx\\n\",\n+\t\t\t\t\t      CONFIG_SPL_UFS_RAW_U_BOOT_PARTITION_NAME,\n+\t\t\t\t\t      (ulong)part_info.start);\n+\t\t\t\t\tsector = part_info.start;\n+\t\t\t\t\tpart_found = 1;\n+\t\t\t\t} else {\n+\t\t\t\t\tdebug(\"spl: partition name not found: %d\\n\", ret);\n+\t\t\t\t}\n+\t\t\t}\n+#endif\n+\n+\t\t\t/* Step 3: Try partition number (if name not found) */\n+#ifdef CONFIG_SPL_UFS_RAW_U_BOOT_PARTITION_NUM\n+\t\t\tif (!part_found) {\n+\t\t\t\tdebug(\"spl: trying partition number %d\\n\",\n+\t\t\t\t      CONFIG_SPL_UFS_RAW_U_BOOT_PARTITION_NUM);\n+\n+\t\t\t\tret = part_get_info(bd,\n+\t\t\t\t\t\t    CONFIG_SPL_UFS_RAW_U_BOOT_PARTITION_NUM,\n+\t\t\t\t\t\t    &part_info);\n+\n+\t\t\t\tif (ret >= 0) {\n+\t\t\t\t\tdebug(\"spl: found partition %d at 0x%lx\\n\",\n+\t\t\t\t\t      CONFIG_SPL_UFS_RAW_U_BOOT_PARTITION_NUM,\n+\t\t\t\t\t      (ulong)part_info.start);\n+\t\t\t\t\tsector = part_info.start;\n+\t\t\t\t\tpart_found = 1;\n+\t\t\t\t} else {\n+\t\t\t\t\tdebug(\"spl: partition number not found: %d\\n\", ret);\n+\t\t\t\t}\n+\t\t\t}\n+#endif\n+\n+\t\t\t/* Load from partition if found */\n+\t\t\tif (part_found) {\n+\t\t\t\tret = ufs_load_image_raw_sector(spl_image, bootdev, bd, sector);\n+\n+\t\t\t\tif (!ret) {\n+\t\t\t\t\tdebug(\"spl: loaded from partition\\n\");\n+\t\t\t\t\treturn 0;\n+\t\t\t\t}\n+\t\t\t\tdebug(\"spl: partition load failed: %d\\n\", ret);\n+\t\t\t}\n+\t\t}\n+#endif /* CONFIG_SPL_UFS_RAW_U_BOOT_USE_PARTITION */\n+\n+\t\t/* Step 4: Fall through to FS mode if enabled */\n+\t\tdebug(\"spl: raw mode failed, trying fs\\n\");\n+\t\tfallthrough;\n+\n+#ifdef CONFIG_SPL_UFS_FS\n+\tcase UFS_MODE_FS:\n+\t\tdebug(\"spl: ufs fs mode\\n\");\n+\n+\t\t/* TODO: Implement filesystem support */\n+\t\tprintf(\"spl: ufs filesystem boot not implemented\\n\");\n+\t\tret = -ENOSYS;\n+\t\tbreak;\n+#endif\n+\n+\tdefault:\n+\t\tputs(\"spl: ufs: invalid boot mode\\n\");\n+\t\tret = -EINVAL;\n \t}\n \n-\treturn 0;\n+\treturn ret;\n+}\n+\n+/* SPL load image entry point */\n+static int spl_ufs_load_image(struct spl_image_info *spl_image,\n+\t\t\t      struct spl_boot_device *bootdev)\n+{\n+\treturn spl_ufs_load(spl_image, bootdev,\n+#ifdef CONFIG_SPL_FS_LOAD_PAYLOAD_NAME\n+\t\t\t    CONFIG_SPL_FS_LOAD_PAYLOAD_NAME);\n+#else\n+\t\t\t    NULL);\n+#endif\n }\n \n SPL_LOAD_IMAGE_METHOD(\"UFS\", 0, BOOT_DEVICE_UFS, spl_ufs_load_image);\ndiff --git a/include/part.h b/include/part.h\nindex 15daacd7faa..47b91e2043c 100644\n--- a/include/part.h\n+++ b/include/part.h\n@@ -463,7 +463,8 @@ ulong disk_blk_erase(struct udevice *dev, lbaint_t start, lbaint_t blkcnt);\n # if defined(CONFIG_SPL_FS_EXT4) || defined(CONFIG_SPL_FS_FAT) || \\\n \tdefined(CONFIG_SPL_FS_SQUASHFS) || \\\n \tdefined(CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_USE_PARTITION) || \\\n-\tdefined(CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_USE_PARTITION_TYPE)\n+\tdefined(CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_USE_PARTITION_TYPE) || \\\n+\tdefined(CONFIG_SPL_UFS_RAW_U_BOOT_USE_PARTITION)\n #  define part_get_info_ptr(x)\tx\n # else\n #  define part_get_info_ptr(x)\tNULL\ndiff --git a/include/spl.h b/include/spl.h\nindex 5078d7525ab..a617bc26c04 100644\n--- a/include/spl.h\n+++ b/include/spl.h\n@@ -29,6 +29,10 @@ struct legacy_img_hdr;\n #define MMCSD_MODE_FS\t\t2\n #define MMCSD_MODE_EMMCBOOT\t3\n \n+/* UFS boot modes */\n+#define UFS_MODE_RAW\t\t1\n+#define UFS_MODE_FS\t\t2\n+\n struct blk_desc;\n struct legacy_img_hdr;\n struct spl_boot_device;\n",
    "prefixes": [
        "1/4"
    ]
}