get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 2195221,
    "url": "http://patchwork.ozlabs.org/api/patches/2195221/?format=api",
    "web_url": "http://patchwork.ozlabs.org/project/uboot/patch/20260210151459.2348758-14-raymondmaoca@gmail.com/",
    "project": {
        "id": 18,
        "url": "http://patchwork.ozlabs.org/api/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": "<20260210151459.2348758-14-raymondmaoca@gmail.com>",
    "list_archive_url": null,
    "date": "2026-02-10T15:14:56",
    "name": "[v2,13/16] spacemit: k1: Add DDR firmware support to SPL",
    "commit_ref": null,
    "pull_url": null,
    "state": "new",
    "archived": false,
    "hash": "762439646b9382706c1b8fb97786f94b8562568a",
    "submitter": {
        "id": 91989,
        "url": "http://patchwork.ozlabs.org/api/people/91989/?format=api",
        "name": "Raymond Mao",
        "email": "raymondmaoca@gmail.com"
    },
    "delegate": {
        "id": 20174,
        "url": "http://patchwork.ozlabs.org/api/users/20174/?format=api",
        "username": "Andes",
        "first_name": "Andes",
        "last_name": "",
        "email": "uboot@andestech.com"
    },
    "mbox": "http://patchwork.ozlabs.org/project/uboot/patch/20260210151459.2348758-14-raymondmaoca@gmail.com/mbox/",
    "series": [
        {
            "id": 491690,
            "url": "http://patchwork.ozlabs.org/api/series/491690/?format=api",
            "web_url": "http://patchwork.ozlabs.org/project/uboot/list/?series=491690",
            "date": "2026-02-10T15:14:43",
            "name": "Add board support for Spacemit K1 SoC in SPL",
            "version": 2,
            "mbox": "http://patchwork.ozlabs.org/series/491690/mbox/"
        }
    ],
    "comments": "http://patchwork.ozlabs.org/api/patches/2195221/comments/",
    "check": "pending",
    "checks": "http://patchwork.ozlabs.org/api/patches/2195221/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=gmail.com header.i=@gmail.com header.a=rsa-sha256\n header.s=20230601 header.b=RrSRzQk+;\n\tdkim-atps=neutral",
            "legolas.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=lists.denx.de\n (client-ip=85.214.62.61; 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=\"RrSRzQk+\";\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=raymondmaoca@gmail.com"
        ],
        "Received": [
            "from phobos.denx.de (phobos.denx.de [85.214.62.61])\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 4f9QD245r2z1xwG\n\tfor <incoming@patchwork.ozlabs.org>; Wed, 11 Feb 2026 02:17:38 +1100 (AEDT)",
            "from h2850616.stratoserver.net (localhost [IPv6:::1])\n\tby phobos.denx.de (Postfix) with ESMTP id 8C87E83E69;\n\tTue, 10 Feb 2026 16:15:52 +0100 (CET)",
            "by phobos.denx.de (Postfix, from userid 109)\n id 2D0EC83E62; Tue, 10 Feb 2026 16:15:52 +0100 (CET)",
            "from mail-qk1-x729.google.com (mail-qk1-x729.google.com\n [IPv6:2607:f8b0:4864:20::729])\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 E93D383E36\n for <u-boot@lists.denx.de>; Tue, 10 Feb 2026 16:15:49 +0100 (CET)",
            "by mail-qk1-x729.google.com with SMTP id\n af79cd13be357-8c6d76b9145so94263785a.2\n for <u-boot@lists.denx.de>; Tue, 10 Feb 2026 07:15:49 -0800 (PST)",
            "from ubuntu.localdomain (174-138-202-16.cpe.distributel.net.\n [174.138.202.16]) by smtp.gmail.com with ESMTPSA id\n 6a1803df08f44-8953c057751sm101019286d6.43.2026.02.10.07.15.47\n (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);\n Tue, 10 Feb 2026 07:15:47 -0800 (PST)"
        ],
        "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",
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=gmail.com; s=20230601; t=1770736548; x=1771341348; darn=lists.denx.de;\n h=content-transfer-encoding:mime-version:references:in-reply-to\n :message-id:date:subject:cc:to:from:from:to:cc:subject:date\n :message-id:reply-to;\n bh=DnEY15WFH29BD2eveTVAWYJuxb6x5cm4NpzOAJJf0QQ=;\n b=RrSRzQk+oz7qJYv8EKgU90A4QFBwXPn9GPKbu8UEkvJkzoh0iqHeS+4EJ5O45FAR4I\n QDZbAIphRGFsnlQq0ZossnxHDCSfJcLhTuATKDSIYYCL7Q/1Ivl5yym7KZPuJ4MCuyeq\n 9vdJCWlFUuKp7CzZgTiOcRZ+2hvrGD2mEKLYrNyX7WiFpU4o2x5rPrX6fv2slGV6xfsR\n EhXwItMZtNWUTjtsgdY28taN5PY4dQUmGFmlL6gXe6Ig/RZ5ow9SthKOW3p3LvtqH7hZ\n hBuCrAeIZLUaCG20To1RaQux61H9MZ8vmjY2XU4mrYj6EHbI0qcKiJxahN13H5Mb5fHm\n S2Eg==",
        "X-Google-DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=1e100.net; s=20230601; t=1770736548; x=1771341348;\n h=content-transfer-encoding:mime-version:references:in-reply-to\n :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from\n :to:cc:subject:date:message-id:reply-to;\n bh=DnEY15WFH29BD2eveTVAWYJuxb6x5cm4NpzOAJJf0QQ=;\n b=VRcHzZThHnWPPLiOKCzcrI8vFXZEeFjZgqw9axuOaZ6XE1awwNQke/8AEt9bB2UzOy\n kDgHuY0GmFXxYklpnoUWL891346I09DvijB1EAF0NohcpA0CXCjl9yZbY4hOVFzNELbw\n SvuKMKSCa4vAF6PhSx5G2dIoK0/hI4C3wygJX6u4geaqMeupSRiyGVNCz5kHFVRJzGrV\n 2NoDZqTuPZZEcqPspZJT/LzaiCRnAC3OLbHU+0qAGIU07cGSiM0YCOR0f9lwskjUfmPF\n bZ7MtfoTSe4A/qPAk9tniRo8nTUtYGoyaJl+iDNyi0oENLZoDGowQDl3NA/VndC3kI9P\n 3LVA==",
        "X-Gm-Message-State": "AOJu0YweXlTJXLibZxMAzzkjfJ9i3/5PR/MhmULiCA7A7unAVaqFAbI4\n /FovHGzqHtkbjWx3yJoFc7AU806Idx2/LvWQEfPDJyj+cZ9EEOH7TXPSqx5MBg==",
        "X-Gm-Gg": "AZuq6aJ9bBV4OjHIw9TR0nSg6K9/h9ixwEtorph1KZePzVatvBJNSq3SwwCsefadIXH\n cxfNRNLrgY59r3iJxbZmQoOc0YYVlCMHXGIPueUyzEsEHukLYv3oMwGc19cl2UxuvKUhneyYIfc\n oNiHppATSR0TqvwF/wnG2tg3g+sBDqq0dFkEN8GwA/zV/plhJGjOtEnhHO9spT75RHUTCeaEhRp\n FnpXjMNS/gQkENLr2dryXF9USrWF7UmCuod2tP9iNwgWn18WyYFMO1J1Fqjx0HlpnXoxJCToxd8\n G3kkUBZgsI2GyP5Pris7tf/4SDw97F4cnG/eDT3YLOYPRrHYIdppEMCQb0dUI087D7PA5BkZZe9\n qxPSwo0GgE3OqjD1g7ck6cLlk7DIOaHRuXczbj4Q7WflH6ljrct/ud9RkNfKe3JV6ax6uO6kmBD\n PVChpbiAOjgAVkLRtPoMz059De8MzGQBqCp0m8QZpvnnihoPYXzXAHIMpx5yc/ooP17K6jHLhXa\n lwZz/R2lhg=",
        "X-Received": "by 2002:a05:620a:1929:b0:8c7:1643:c1c4 with SMTP id\n af79cd13be357-8caf16ea1admr1954207285a.72.1770736548384;\n Tue, 10 Feb 2026 07:15:48 -0800 (PST)",
        "From": "Raymond Mao <raymondmaoca@gmail.com>",
        "To": "u-boot@lists.denx.de",
        "Cc": "uboot@riscstar.com, u-boot-spacemit@groups.io, raymond.mao@riscstar.com,\n rick@andestech.com, ycliang@andestech.com, trini@konsulko.com,\n lukma@denx.de, hs@nabladev.com, jh80.chung@samsung.com, peng.fan@nxp.com,\n xypron.glpk@gmx.de, randolph@andestech.com, dlan@gentoo.org,\n junhui.liu@pigmoral.tech, neil.armstrong@linaro.org,\n quentin.schulz@cherry.de, samuel@sholland.org, raymondmaoca@gmail.com,\n Guodong Xu <guodong.xu@riscstar.com>",
        "Subject": "[PATCH v2 13/16] spacemit: k1: Add DDR firmware support to SPL",
        "Date": "Tue, 10 Feb 2026 10:14:56 -0500",
        "Message-Id": "<20260210151459.2348758-14-raymondmaoca@gmail.com>",
        "X-Mailer": "git-send-email 2.25.1",
        "In-Reply-To": "<20260210151459.2348758-1-raymondmaoca@gmail.com>",
        "References": "<20260210151459.2348758-1-raymondmaoca@gmail.com>",
        "MIME-Version": "1.0",
        "Content-Transfer-Encoding": "8bit",
        "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": "From: Raymond Mao <raymond.mao@riscstar.com>\n\nInclude DDR initialization firmware in the SPL image. The firmware\npath can be specified via the DDR_FW_FILE environment variable. If\nthe firmware is not found, an empty placeholder file is created to\nallow the build to proceed without DDR initialization support.\n\nSigned-off-by: Raymond Mao <raymond.mao@riscstar.com>\nSigned-off-by: Guodong Xu <guodong.xu@riscstar.com>\n---\n arch/riscv/dts/k1-spl.dts  |  24 +++++++-\n board/spacemit/k1/Makefile |  20 ++++++\n board/spacemit/k1/spl.c    | 122 +++++++++++++++++++++++++++++++++++++\n 3 files changed, 165 insertions(+), 1 deletion(-)",
    "diff": "diff --git a/arch/riscv/dts/k1-spl.dts b/arch/riscv/dts/k1-spl.dts\nindex 74e9957b83a..e118767e6db 100644\n--- a/arch/riscv/dts/k1-spl.dts\n+++ b/arch/riscv/dts/k1-spl.dts\n@@ -7,7 +7,6 @@\n /dts-v1/;\n \n #include \"k1.dtsi\"\n-#include \"binman.dtsi\"\n \n / {\n \tmodel = \"spacemit k1 spl\";\n@@ -20,6 +19,29 @@\n \tchosen {\n \t\tstdout-path = \"serial0:115200n8\";\n \t};\n+\n+\tbinman {\n+\t\tu-boot-spl-ddr {\n+\t\t\ttype = \"section\";\n+\t\t\tfilename = \"u-boot-spl-ddr.bin\";\n+\t\t\tpad-byte = <0xff>;\n+\n+\t\t\tu-boot-spl {\n+\t\t\t};\n+\n+\t\t\tddr-fw {\n+\t\t\t\ttype = \"blob\";\n+\t\t\t\tfilename = \"ddr_fw.bin\";\n+\t\t\t\talign = <64>;\n+\t\t\t};\n+\n+\t\t\tu-boot-any {\n+\t\t\t\ttype = \"section\";\n+\t\t\t\tsize = <0>;\n+\t\t\t\toffset = <0>;\n+\t\t\t};\n+\t\t};\n+\t};\n };\n \n &vctcxo_1m {\ndiff --git a/board/spacemit/k1/Makefile b/board/spacemit/k1/Makefile\nindex f9cbf4b0e06..827b1e507c7 100644\n--- a/board/spacemit/k1/Makefile\n+++ b/board/spacemit/k1/Makefile\n@@ -5,3 +5,23 @@\n \n obj-y := board.o\n obj-$(CONFIG_SPL_BUILD) += spl.o\n+\n+DDR_FW_SRC ?= $(DDR_FW_FILE)\n+FW_TARGET = $(objtree)/ddr_fw.bin\n+\n+$(obj)/spl.o: $(FW_TARGET)\n+\n+$(FW_TARGET):\n+\t@echo \"Preparing DDR firmware...\"\n+\t@if [ -n \"$(DDR_FW_SRC)\" ] && [ -f \"$(DDR_FW_SRC)\" ]; then \\\n+\t\techo \"  Copying from: $(DDR_FW_SRC)\"; \\\n+\t\tcp \"$(DDR_FW_SRC)\" $@; \\\n+\telif [ -f $@ ]; then \\\n+\t\techo \"  Using existing $@\"; \\\n+\telse \\\n+\t\techo \"  Note: No firmware found, creating empty file\"; \\\n+\t\techo \"  (Set DDR_FW_FILE to specify firmware location)\"; \\\n+\t\ttouch $@; \\\n+\tfi\n+\n+clean-files += $(FW_TARGET)\ndiff --git a/board/spacemit/k1/spl.c b/board/spacemit/k1/spl.c\nindex 182e833849d..95b61f5aa90 100644\n--- a/board/spacemit/k1/spl.c\n+++ b/board/spacemit/k1/spl.c\n@@ -4,8 +4,11 @@\n  */\n \n #include <asm/io.h>\n+#include <binman.h>\n+#include <binman_sym.h>\n #include <clk.h>\n #include <clk-uclass.h>\n+#include <cpu_func.h>\n #include <configs/k1.h>\n #include <dm/device.h>\n #include <dm/uclass.h>\n@@ -14,6 +17,7 @@\n #include <log.h>\n #include <spl.h>\n #include <tlv_eeprom.h>\n+#include \"tlv_codes.h\"\n \n #define MUX_MODE4\t\t4\n #define EDGE_NONE\t\tBIT(6)\n@@ -26,6 +30,29 @@\n #define MFP_GPIO_84\t\t0xd401e154\n #define MFP_GPIO_85\t\t0xd401e158\n \n+#define DDR_FIRMWARE_BASE\t0xc082d000\n+\n+#define DDR_DEFAULT_CS_NUM      2\n+#define DDR_DEFAULT_TYPE        \"LPDDR4X\"\n+#define DDR_DEFAULT_TX_ODT      80\n+#define DDR_DEFAULT_DATA_RATE   2400\n+\n+#define MAGIC_NUM\t\t0xaa55aa55\n+\n+typedef void (*puts_func_t)(const char *s);\n+typedef int (*ddr_init_func_t)(u64 ddr_base, u32 cs_num, u32 data_rate,\n+\t\t\t       puts_func_t puts);\n+\n+struct ddr_cfg {\n+\tu32     data_rate;\n+\tu32     cs_num;\n+\tu32     tx_odt;\n+\tu8      type[I2C_BUF_SIZE];\n+};\n+\n+binman_sym_declare(ulong, ddr_fw, image_pos);\n+binman_sym_declare(ulong, ddr_fw, size);\n+\n static void reset_early_init(void)\n {\n \tstruct udevice *dev;\n@@ -119,6 +146,100 @@ void serial_early_init(void)\n \t\tpanic(\"Serial uclass init failed: %d\\n\", ret);\n }\n \n+/* Set default value for DDR chips */\n+static void ddr_cfg_init(struct ddr_cfg *cfg)\n+{\n+\tmemset(cfg, 0, sizeof(struct ddr_cfg));\n+\tcfg->data_rate = DDR_DEFAULT_DATA_RATE;\n+\tcfg->cs_num = DDR_DEFAULT_CS_NUM;\n+\tcfg->tx_odt = DDR_DEFAULT_TX_ODT;\n+\tstrcpy(cfg->type, DDR_DEFAULT_TYPE);\n+}\n+\n+int read_ddr_info(struct ddr_cfg *cfg)\n+{\n+\tu8 eeprom_data[TLV_TOTAL_LEN_MAX], *p;\n+\tstruct tlvinfo_header *tlv_hdr;\n+\tstruct tlvinfo_tlv *tlv_entry;\n+\tu32 size, entry_size;\n+\tint ret, i;\n+\tbool found = false;\n+\n+\tif (!cfg)\n+\t\treturn -EINVAL;\n+\tddr_cfg_init(cfg);\n+\tret = read_tlvinfo_tlv_eeprom(eeprom_data, &tlv_hdr,\n+\t\t\t\t      &tlv_entry, i);\n+\tif (ret)\n+\t\treturn ret;\n+\tp = (u8 *)tlv_entry;\n+\tfor (i = 0; i < tlv_hdr->totallen; ) {\n+\t\tswitch (tlv_entry->type) {\n+\t\tcase TLV_CODE_DDR_CSNUM:\n+\t\t\tmemcpy(&cfg->cs_num, &tlv_entry->value[0], 1);\n+\t\t\tfound = true;\n+\t\t\tbreak;\n+\t\tcase TLV_CODE_DDR_TYPE:\n+\t\t\tsize = min((u32)tlv_entry->length, (u32)I2C_BUF_SIZE);\n+\t\t\tmemcpy(&cfg->type[0], &tlv_entry->value[0], size);\n+\t\t\tfound = true;\n+\t\t\tbreak;\n+\t\tcase TLV_CODE_DDR_DATARATE:\n+\t\t\tmemcpy(&cfg->data_rate, &tlv_entry->value[0], 2);\n+\t\t\tfound = true;\n+\t\t\tbreak;\n+\t\tcase TLV_CODE_DDR_TX_ODT:\n+\t\t\tmemcpy(&cfg->tx_odt, &tlv_entry->value[0], 1);\n+\t\t\tfound = true;\n+\t\t\tbreak;\n+\t\tcase TLV_CODE_CRC_32:\n+\t\t\tif (!found)\n+\t\t\t\treturn -ENOENT;\n+\t\t\treturn 0;\n+\t\t}\n+\t\tentry_size = tlv_entry->length + sizeof(struct tlvinfo_tlv);\n+\t\ti += entry_size;\n+\t\tp += entry_size;\n+\t\ttlv_entry = (struct tlvinfo_tlv *)p;\n+\t}\n+\tif (!found)\n+\t\treturn -ENOENT;\n+\treturn 0;\n+}\n+\n+/* Load DDR firmware */\n+void ddr_early_init(void)\n+{\n+\tvoid __iomem *src, *dst;\n+\tulong pos, size;\n+\tstruct ddr_cfg cfg;\n+\tddr_init_func_t ddr_init;\n+\n+\tpos = binman_sym(ulong, ddr_fw, image_pos);\n+\tsize = binman_sym(ulong, ddr_fw, size);\n+\tsrc = (void __iomem *)pos;\n+\tdst = (void __iomem *)(DDR_FIRMWARE_BASE);\n+\tlog_info(\"DDR firmware: [0x%lx]:0x%x, size:0x%lx\\n\", pos, readl(src), size);\n+\tmemcpy((u8 *)dst, (u8 *)src, size);\n+\tsize = round_up(size, 64);\n+\tflush_dcache_range((u32)(u64)dst, (u32)(u64)dst + size);\n+\n+\tread_ddr_info(&cfg);\n+\tddr_init = (ddr_init_func_t)DDR_FIRMWARE_BASE;\n+#ifdef DEBUG\n+\tddr_init(0xc0000000, cfg.cs_num, cfg.data_rate, puts);\n+#else\n+\tddr_init(0xc0000000, cfg.cs_num, cfg.data_rate, NULL);\n+#endif\n+\twritel(MAGIC_NUM, (void __iomem *)0x00000000);\n+\tflush_dcache_range(0, 64);\n+\tinvalidate_dcache_range(0, 64);\n+\tif (readl((void __iomem *)0x00000000) == MAGIC_NUM)\n+\t\tlog_info(\"DDR is ready\\n\");\n+\telse\n+\t\tlog_info(\"DDR isn't invalid\\n\");\n+}\n+\n void board_init_f(ulong dummy)\n {\n \tu8 i2c_buf[I2C_BUF_SIZE];\n@@ -142,6 +263,7 @@ void board_init_f(ulong dummy)\n \t\tlog_info(\"Fail to detect board:%d\\n\", ret);\n \telse\n \t\tlog_info(\"Get board name:%s\\n\", (char *)i2c_buf);\n+\tddr_early_init();\n }\n \n u32 spl_boot_device(void)\n",
    "prefixes": [
        "v2",
        "13/16"
    ]
}