get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 2219343,
    "url": "http://patchwork.ozlabs.org/api/1.0/patches/2219343/?format=api",
    "project": {
        "id": 14,
        "url": "http://patchwork.ozlabs.org/api/1.0/projects/14/?format=api",
        "name": "QEMU Development",
        "link_name": "qemu-devel",
        "list_id": "qemu-devel.nongnu.org",
        "list_email": "qemu-devel@nongnu.org",
        "web_url": "",
        "scm_url": "",
        "webscm_url": ""
    },
    "msgid": "<20260402215629.745866-21-ruslichenko.r@gmail.com>",
    "date": "2026-04-02T21:56:05",
    "name": "[v3,20/33] hw/arm: add generic ARM machine initialized by FDT",
    "commit_ref": null,
    "pull_url": null,
    "state": "new",
    "archived": false,
    "hash": "7a928f3b9cf25abdef380874955ac99112ca1b2c",
    "submitter": {
        "id": 92275,
        "url": "http://patchwork.ozlabs.org/api/1.0/people/92275/?format=api",
        "name": "Ruslan Ruslichenko",
        "email": "ruslichenko.r@gmail.com"
    },
    "delegate": null,
    "mbox": "http://patchwork.ozlabs.org/project/qemu-devel/patch/20260402215629.745866-21-ruslichenko.r@gmail.com/mbox/",
    "series": [
        {
            "id": 498555,
            "url": "http://patchwork.ozlabs.org/api/1.0/series/498555/?format=api",
            "date": "2026-04-02T21:55:47",
            "name": "hw/arm: Introduce generic FDT-driven machine",
            "version": 3,
            "mbox": "http://patchwork.ozlabs.org/series/498555/mbox/"
        }
    ],
    "check": "pending",
    "checks": "http://patchwork.ozlabs.org/api/patches/2219343/checks/",
    "tags": {},
    "headers": {
        "Return-Path": "<qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org>",
        "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=qkQMl+rX;\n\tdkim-atps=neutral",
            "legolas.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=nongnu.org\n (client-ip=209.51.188.17; helo=lists.gnu.org;\n envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org;\n receiver=patchwork.ozlabs.org)"
        ],
        "Received": [
            "from lists.gnu.org (lists.gnu.org [209.51.188.17])\n\t(using TLSv1.2 with cipher ECDHE-ECDSA-AES256-GCM-SHA384 (256/256 bits))\n\t(No client certificate requested)\n\tby legolas.ozlabs.org (Postfix) with ESMTPS id 4fmwj10mFXz1yD3\n\tfor <incoming@patchwork.ozlabs.org>; Fri, 03 Apr 2026 08:58:29 +1100 (AEDT)",
            "from localhost ([::1] helo=lists1p.gnu.org)\n\tby lists.gnu.org with esmtp (Exim 4.90_1)\n\t(envelope-from <qemu-devel-bounces@nongnu.org>)\n\tid 1w8Q2g-0000BK-5K; Thu, 02 Apr 2026 17:57:34 -0400",
            "from eggs.gnu.org ([2001:470:142:3::10])\n by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)\n (Exim 4.90_1) (envelope-from <ruslichenko.r@gmail.com>)\n id 1w8Q2V-0008WN-Gf\n for qemu-devel@nongnu.org; Thu, 02 Apr 2026 17:57:24 -0400",
            "from mail-ej1-x62b.google.com ([2a00:1450:4864:20::62b])\n by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128)\n (Exim 4.90_1) (envelope-from <ruslichenko.r@gmail.com>)\n id 1w8Q2S-0007Bx-L4\n for qemu-devel@nongnu.org; Thu, 02 Apr 2026 17:57:22 -0400",
            "by mail-ej1-x62b.google.com with SMTP id\n a640c23a62f3a-b97e6e48b24so206789366b.2\n for <qemu-devel@nongnu.org>; Thu, 02 Apr 2026 14:57:20 -0700 (PDT)",
            "from thinkpad-t470s.. (93-143-182-244.adsl.net.t-com.hr.\n [93.143.182.244]) by smtp.googlemail.com with ESMTPSA id\n a640c23a62f3a-b9c3cac0e1asm134009166b.27.2026.04.02.14.57.17\n (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);\n Thu, 02 Apr 2026 14:57:17 -0700 (PDT)"
        ],
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=gmail.com; s=20251104; t=1775167038; x=1775771838; darn=nongnu.org;\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=bR48XpEfrTAurqrwxi3w+VRNBBsgCOfbhfQQhlmqcQo=;\n b=qkQMl+rXJ/i5LPkZjJk83bSwIpCUFnB+a3uJA5sN/1PCu+j8D1tKjaHCGp8L44hgvX\n mI7x+dFC2/CEDe39ET401qGsdanAhUJKNObnNH43KSTQSWzy1QSiXCHMA/5Jc1xC2BnJ\n pXO3T+49Fs/P3VhcjnpPrgbvy++YmzQgvmlZEue57nROBuTZsZlwUQ47fom0bN4Uruv4\n qjuO/EevcXpqvZ8KGYyhU7zX2cOIbEq5PRK49/2MWyfFfD0BgG5HE3H4t06WBTnXBiK3\n x2LFbRsabMdXbc1D/ihoX/wbRIzAXNu9bGAkEHYnBVm2qICXWt3w2HS60pJ6A7MkH4Kl\n xKwg==",
        "X-Google-DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=1e100.net; s=20251104; t=1775167038; x=1775771838;\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=bR48XpEfrTAurqrwxi3w+VRNBBsgCOfbhfQQhlmqcQo=;\n b=QcAcsGU/Ryx4e5jpwrMmk0r1YMmoQqM5IcL3Th9h/4M3lp15UvBuO3dfgU8O6CHcWQ\n WKp5sftoC/Ajg9xxsa9ZQDEh94QewP1UnYwHdBZ6tX8nkyOO0AJk6KaoZNjROx1CIiJs\n BBkJ5dbOCoc/W1rd8qz0aE3ufIkoScqc/751evzt+yCrb3cirtnE4AgXGop1AMhf0An2\n HOSLlObL2J92K2BUW3TVNyRl80BvkjClFzgiTS7GbGomoBHzR3F6Hdw5+zXGVc7DeHe7\n ovUzjG821n9nuvPNQaP6vGAWqG5aBEnUsiQXFV19dJpXfaGEJqcWl4XwaZKC5wUQN1Lt\n RnIA==",
        "X-Gm-Message-State": "AOJu0Yy1vENXR1gBkBoFOlLMrSoPQASk+lFFijNIdyQgmNCXFLLMQiAo\n cZCHhRHI6c/9cB1AgyV598mnSR+umRxwg2k0kdSD9bkElzy53ajfIU2tMkA2tbgm",
        "X-Gm-Gg": "AeBDiessStP2ImBNBCHOErEESGjmueY/F4FkQPiKN4My/mkoovUvuwLJNEUUvNLw9J0\n /+sbKsENZFQSGaGTgl7m+mFeVmsGYtKFxaoTIf4HceDNPsUvzZC9ch5d8qiuL6jBcz05lj3xDM0\n +Ab/SC5Mdsueo/Nq3fB1RCXqVyNRr16oEM1kcOz2RhrVRk1XOiJE4YNilmJRyYY6MOXZihLjtIe\n qPp68FQvk+cBuDLFHPYBIV0f4ITiYDcTRTZHtz3kWczbvQmuWf/JMe85FRYERFOI4iVim0bQJl+\n MniRhz/m6YdkBPp6z/vCK2/lTYchi4OPVbqzy1J845rdHg8+zbnxel3gndQAj4MbLmiIBBwpXFT\n jatJaPrYQkims3yad7je39F1adL5gVljpfc4f4k0AvigrPiu78+W2hvoYf5dom4706qgDPWBEsp\n ONTnT5O5A+nELXu0Wl0pQ56zqK06R5yBHWt67i6xaqrKIBKERbhQIohhc4JATAzQC8jGaORg==",
        "X-Received": "by 2002:a17:907:802:b0:b9c:530b:7986 with SMTP id\n a640c23a62f3a-b9c67422988mr24737266b.6.1775167038411;\n Thu, 02 Apr 2026 14:57:18 -0700 (PDT)",
        "From": "Ruslan Ruslichenko <ruslichenko.r@gmail.com>",
        "To": "qemu-devel@nongnu.org",
        "Cc": "qemu-arm@nongnu.org, alex.bennee@linaro.org, peter.maydell@linaro.org,\n artem_mygaiev@epam.com, volodymyr_babchuk@epam.com,\n takahiro.nakata.wr@renesas.com,\n \"Edgar E . Iglesias\" <edgar.iglesias@gmail.com>,\n Ruslan_Ruslichenko@epam.com, balaton@eik.bme.hu",
        "Subject": "[PATCH v3 20/33] hw/arm: add generic ARM machine initialized by FDT",
        "Date": "Thu,  2 Apr 2026 23:56:05 +0200",
        "Message-ID": "<20260402215629.745866-21-ruslichenko.r@gmail.com>",
        "X-Mailer": "git-send-email 2.43.0",
        "In-Reply-To": "<20260402215629.745866-1-ruslichenko.r@gmail.com>",
        "References": "<20260402215629.745866-1-ruslichenko.r@gmail.com>",
        "MIME-Version": "1.0",
        "Content-Transfer-Encoding": "8bit",
        "Received-SPF": "pass client-ip=2a00:1450:4864:20::62b;\n envelope-from=ruslichenko.r@gmail.com; helo=mail-ej1-x62b.google.com",
        "X-Spam_score_int": "-20",
        "X-Spam_score": "-2.1",
        "X-Spam_bar": "--",
        "X-Spam_report": "(-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1,\n DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, FREEMAIL_FROM=0.001,\n RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001,\n SPF_PASS=-0.001 autolearn=unavailable autolearn_force=no",
        "X-Spam_action": "no action",
        "X-BeenThere": "qemu-devel@nongnu.org",
        "X-Mailman-Version": "2.1.29",
        "Precedence": "list",
        "List-Id": "qemu development <qemu-devel.nongnu.org>",
        "List-Unsubscribe": "<https://lists.nongnu.org/mailman/options/qemu-devel>,\n <mailto:qemu-devel-request@nongnu.org?subject=unsubscribe>",
        "List-Archive": "<https://lists.nongnu.org/archive/html/qemu-devel>",
        "List-Post": "<mailto:qemu-devel@nongnu.org>",
        "List-Help": "<mailto:qemu-devel-request@nongnu.org?subject=help>",
        "List-Subscribe": "<https://lists.nongnu.org/mailman/listinfo/qemu-devel>,\n <mailto:qemu-devel-request@nongnu.org?subject=subscribe>",
        "Errors-To": "qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org",
        "Sender": "qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org"
    },
    "content": "From: Ruslan Ruslichenko <Ruslan_Ruslichenko@epam.com>\n\nThis patch introduces new ARM machine model, which is\nfully instantiated from a Device Tree description.\n\nThis model uses fdt_generic framework to dynamically\nconstruct system topology based on provided DTB, instead\nof standard machines which rely on hardcoded models in\nC files.\n\nThis allows to contruct machines with custom memory maps,\ndevice structures without the need to modify and re-build\nQEMU sources each time.\n\nSigned-off-by: Ruslan Ruslichenko <Ruslan_Ruslichenko@epam.com>\n---\n hw/arm/arm_generic_fdt.c | 172 +++++++++++++++++++++++++++++++++++++++\n hw/arm/meson.build       |   2 +\n 2 files changed, 174 insertions(+)\n create mode 100644 hw/arm/arm_generic_fdt.c",
    "diff": "diff --git a/hw/arm/arm_generic_fdt.c b/hw/arm/arm_generic_fdt.c\nnew file mode 100644\nindex 0000000000..7b50957a82\n--- /dev/null\n+++ b/hw/arm/arm_generic_fdt.c\n@@ -0,0 +1,172 @@\n+/*\n+ * SPDX-License-Identifier: GPL-2.0-or-later\n+ *\n+ * Copyright (c) 2012 Xilinx. Inc\n+ * Copyright (c) 2012 Peter A.G. Crosthwaite (peter.crosthwaite@xilinx.com)\n+ *\n+ * This program is free software; you can redistribute it and/or\n+ * modify it under the terms of the GNU General Public License\n+ * as published by the Free Software Foundation; either version\n+ * 2 of the License, or (at your option) any later version.\n+ *\n+ * You should have received a copy of the GNU General Public License along\n+ * with this program; if not, see <http://www.gnu.org/licenses/>.\n+ */\n+\n+#include \"qemu/osdep.h\"\n+#include \"cpu.h\"\n+#include \"hw/core/boards.h\"\n+#include \"hw/core/hw-error.h\"\n+#include \"qapi/error.h\"\n+#include \"qemu/error-report.h\"\n+#include \"qemu/option.h\"\n+#include \"qom/object.h\"\n+#include \"system/system.h\"\n+#include \"system/qtest.h\"\n+#include \"hw/arm/boot.h\"\n+#include \"hw/arm/machines-qom.h\"\n+\n+#include <libfdt.h>\n+#include \"hw/core/fdt_generic_util.h\"\n+\n+#define QTEST_RUNNING (qtest_enabled() && qtest_driver())\n+\n+struct ARMGenericFDTState {\n+    MachineState parent;\n+\n+    struct arm_boot_info bootinfo;\n+\n+    char *hw_dtb;\n+};\n+\n+#define TYPE_ARM_GENERIC_FDT_MACHINE MACHINE_TYPE_NAME(\"arm-generic-fdt\")\n+\n+OBJECT_DECLARE_SIMPLE_TYPE(ARMGenericFDTState, ARM_GENERIC_FDT_MACHINE)\n+\n+static void init_machine(void *fdt, ARMGenericFDTState *s)\n+{\n+    FDTMachineInfo *fdti;\n+    MemoryRegion *mem_area;\n+    Error *errp = NULL;\n+    char **node_path;\n+\n+    node_path = qemu_fdt_node_unit_path(fdt, \"memory\", &errp);\n+    if (errp) {\n+        error_report_err(errp);\n+        exit(1);\n+    }\n+    if (!node_path || !g_str_has_prefix(node_path[0], \"/memory\")) {\n+        error_report(\"Failed to find /memory node\");\n+        exit(1);\n+    }\n+\n+    /* Instantiate peripherals from the FDT.  */\n+    fdti = fdt_generic_create_machine(fdt, NULL);\n+\n+    mem_area = MEMORY_REGION(object_resolve_path(node_path[0], NULL));\n+\n+    s->bootinfo.loader_start = object_property_get_int(OBJECT(mem_area),\n+                                                            \"addr\", NULL);\n+\n+    s->bootinfo.ram_size = object_property_get_int(OBJECT(mem_area),\n+                                                          \"size\", NULL);\n+\n+    fdt_init_destroy_fdti(fdti);\n+    g_strfreev(node_path);\n+}\n+\n+static void arm_generic_fdt_init(MachineState *machine)\n+{\n+    int fdt_size;\n+    void *hw_fdt = NULL;\n+    ARMGenericFDTState *s = ARM_GENERIC_FDT_MACHINE(machine);\n+\n+    if (!s->hw_dtb) {\n+        if (!QTEST_RUNNING) {\n+            /*\n+             * Just return without error if running qtest, as we never have a\n+             * device tree\n+             */\n+            hw_error(\"DTB must be specified for %s machine model\\n\",\n+                     MACHINE_GET_CLASS(machine)->name);\n+        }\n+        return;\n+    }\n+\n+    hw_fdt = load_device_tree(s->hw_dtb, &fdt_size);\n+    if (!hw_fdt) {\n+        error_report(\"Error: Unable to load Device Tree %s\", s->hw_dtb);\n+        exit(1);\n+    }\n+\n+    init_machine(hw_fdt, s);\n+\n+    s->bootinfo.kernel_filename = machine->kernel_filename;\n+    s->bootinfo.kernel_cmdline = machine->kernel_cmdline;\n+    s->bootinfo.initrd_filename = machine->initrd_filename;\n+    s->bootinfo.board_id = -1;\n+    s->bootinfo.psci_conduit = QEMU_PSCI_CONDUIT_DISABLED;\n+\n+    /*\n+     * Expect a direct kernel boot if the '-kernel' option is specified.\n+     * In this case, QEMU provides the PSCI implementation.\n+     */\n+    if (machine->kernel_filename) {\n+        s->bootinfo.psci_conduit = QEMU_PSCI_CONDUIT_SMC;\n+    }\n+\n+    arm_load_kernel(ARM_CPU(first_cpu), machine, &s->bootinfo);\n+\n+    return;\n+}\n+\n+static char *arm_generic_fdt_get_hw_dtb(Object *obj, Error **errp)\n+{\n+    ARMGenericFDTState *s = ARM_GENERIC_FDT_MACHINE(obj);\n+\n+    return g_strdup(s->hw_dtb);\n+}\n+\n+static void arm_generic_fdt_set_hw_dtb(Object *obj, const char *value,\n+                                       Error **errp)\n+{\n+    ARMGenericFDTState *s = ARM_GENERIC_FDT_MACHINE(obj);\n+\n+    s->hw_dtb = g_strdup(value);\n+}\n+\n+static void arm_generic_fdt_class_init(ObjectClass *oc, const void *data)\n+{\n+    MachineClass *mc = MACHINE_CLASS(oc);\n+\n+    mc->desc = \"ARM device tree driven machine model\";\n+    mc->init = arm_generic_fdt_init;\n+    mc->max_cpus = 64;\n+    mc->default_cpus = 4;\n+\n+    mc->pci_allow_0_address = true;\n+    mc->minimum_page_bits = 12;\n+    mc->smp_props.clusters_supported = true;\n+\n+    object_class_property_add_str(oc, \"hw-dtb\",\n+                              arm_generic_fdt_get_hw_dtb,\n+                                  arm_generic_fdt_set_hw_dtb);\n+    object_class_property_set_description(oc, \"hw-dtb\",\n+                    \"Hardware device-tree file with description \"\n+                                \"used to create the emulated machine\");\n+}\n+\n+static const TypeInfo arm_generic_fdt_machine_info = {\n+    .name           = TYPE_ARM_GENERIC_FDT_MACHINE,\n+    .parent         = TYPE_MACHINE,\n+    .instance_size  = sizeof(ARMGenericFDTState),\n+    .class_init     = arm_generic_fdt_class_init,\n+    .interfaces     = arm_machine_interfaces,\n+};\n+\n+static void arm_generic_fdt_register_type(void)\n+{\n+    type_register_static(&arm_generic_fdt_machine_info);\n+}\n+\n+type_init(arm_generic_fdt_register_type)\ndiff --git a/hw/arm/meson.build b/hw/arm/meson.build\nindex b187b946f0..e62fabbb6c 100644\n--- a/hw/arm/meson.build\n+++ b/hw/arm/meson.build\n@@ -1,4 +1,6 @@\n arm_ss = ss.source_set()\n+arm_ss.add(files('arm_generic_fdt.c'))\n+\n arm_common_ss = ss.source_set()\n arm_common_ss.add(when: 'CONFIG_ARM_VIRT', if_true: files('virt.c'))\n arm_common_ss.add(when: 'CONFIG_ACPI', if_true: files('virt-acpi-build.c'))\n",
    "prefixes": [
        "v3",
        "20/33"
    ]
}