Patch Detail
get:
Show a patch.
patch:
Update a patch.
put:
Update a patch.
GET /api/1.0/patches/2219358/?format=api
{ "id": 2219358, "url": "http://patchwork.ozlabs.org/api/1.0/patches/2219358/?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-17-ruslichenko.r@gmail.com>", "date": "2026-04-02T21:56:01", "name": "[v3,16/33] hw/core/fdt_generic_util: map device memory regions", "commit_ref": null, "pull_url": null, "state": "new", "archived": false, "hash": "6398aa8811955e5b75479c6da54e3a23d3720ba3", "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-17-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/2219358/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=CRDjOgcA;\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 4fmwmJ3syLz1xtJ\n\tfor <incoming@patchwork.ozlabs.org>; Fri, 03 Apr 2026 09:01:20 +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 1w8Q2X-00005m-Au; Thu, 02 Apr 2026 17:57:25 -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 1w8Q2N-0008MW-2s\n for qemu-devel@nongnu.org; Thu, 02 Apr 2026 17:57:15 -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 1w8Q2L-00079c-0p\n for qemu-devel@nongnu.org; Thu, 02 Apr 2026 17:57:14 -0400", "by mail-ej1-x62b.google.com with SMTP id\n a640c23a62f3a-b9b1ffbb9f5so154422666b.2\n for <qemu-devel@nongnu.org>; Thu, 02 Apr 2026 14:57:12 -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.09\n (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);\n Thu, 02 Apr 2026 14:57:10 -0700 (PDT)" ], "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=gmail.com; s=20251104; t=1775167031; x=1775771831; 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=5+ZNPSdOIRkRVr+Q/vKL8bV00FekXBJXM/FhoKVAOes=;\n b=CRDjOgcAh58OJ7vin24HmML8Gq+2IYTHWuOSAj2c1I7zq71oJONs358IqTplJBVtV8\n aP8b4E+eTNbvn7+9yWHvN1Pp5hrI3Pas8m3J0q+0WgmSBqIwz166SfFZ5ckDCzVyAkvE\n dbcO+h10dpQHXPUbpOgV9KSk8Hm4LbDDa/wruKjvzcicC/RMKHPO9raQg4qtQeDgAOop\n 6snYzHoie8MV39Xz13mF976NUQgyokHUXJZVd32Bq1PVseAd9jvbw6DRXYUD9R1/5ozp\n /91LOVDiYPUkLfkPt3c4eNerog/F5G9gthDYVXAyXB20eLzuE3O6U4qYA3IHQ2/Vl/UI\n CXZA==", "X-Google-DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=1e100.net; s=20251104; t=1775167031; x=1775771831;\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=5+ZNPSdOIRkRVr+Q/vKL8bV00FekXBJXM/FhoKVAOes=;\n b=cyP7QXSXI5BjbtDyN6x9oP975A+hYKP1yWBIBnDvaOyPhKw/OsLaL1JBAOL5l4OOLk\n 2PLSxKRTJXX8kWrLCNyCle0kiub5+Jx0AFFtwvphgbqUMkRcT00JGXOgOqBZfMvyi7Xy\n xDf6B4C+nr4fGIL5pl8xKt0NEN7JPXIAbwndHPWoQWkXsaV6MYBAChkAK5jv06X1AH23\n c6BLaH0BRhkHDQc0r4SMqL17HTEqbXUQmNPwwdKIl3Et/QNDSrauFMyOG6p/u9BKHvq+\n k4b9rgE0sdP0pr/7OERnBvQwB85VpsLNN4eahGmfIvar2MgJeowb1RhQN1pyzvwZfYMd\n xe9g==", "X-Gm-Message-State": "AOJu0YwC5DE97PfqjTMjKj1IOC1xFBn/3XGXrJ3XX4tFH4VLWOzHsWrN\n mgXmYZwdg/Urv8ilG4EdNAd30sKUrg9qLMazFyNRdxZ4mnNFdx9+1b+UJDnM6Xb2", "X-Gm-Gg": "AeBDieu0gguWhQ+jgGX54bIdZ+zkQLDkKa1D7F0ISzMGTHbrHMJaMUe3afcpGdwJJfY\n i8/QtTsaO16Oy0Uiq35aIg1uUE7esJth6qCItozAQoaTcvhhlJVQy1E6LXObbLWLSggdVJsK4nT\n DzYZQcR/qDe+AGacZ7t1fm/koKWoxr5PX89mosPXM4V+Mf+Mnb69I9/oU9v3Box8O5CeClxGwMc\n 7c90e+UTpjytJw2WEEO5DY0M+Fyr4YVf6TRxKZ4SU8ILTEnCC/gOtvHPftojN3kuQQUYZMnyaK0\n 1EAdoqVOPIaF3cMZULOZX8SWhAR+LcPLQgwiWMvQNNLg8CLz/87gaWpDgWGHH3Ug/P4pf/RF913\n fc0m+lcJNf6rL4stO8WdXJw93oRpiOwKhQdZpOQGXXfiAzFp5J5Cc1/yJT7fjbKmU4YcIAFsAhn\n kL4UuFW/oCU5Q+u2nj86aRp+QGW5RhXKg6wYJ0fVqM4wPqWuD1BCrNhqLNTkDhJh6aQQjGbQ==", "X-Received": "by 2002:a17:907:984:b0:b9c:1c26:9eb with SMTP id\n a640c23a62f3a-b9c672d42afmr26531666b.10.1775167031039;\n Thu, 02 Apr 2026 14:57:11 -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 16/33] hw/core/fdt_generic_util: map device memory regions", "Date": "Thu, 2 Apr 2026 23:56:01 +0200", "Message-ID": "<20260402215629.745866-17-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\nParse device mmio regions provided within standard 'reg' and\ncustom 'reg-extended' device tree properties.\n\nFor 'reg-extended' properties, the parent phandle is extracted\nalong with the standard io memory region specification, which allows\nadding these regions to specified parent memory regions.\n\nThe mapping itself is delegated to the device via the\n'TYPE_FDT_GENERIC_MMAP' interface.\n\nSigned-off-by: Ruslan Ruslichenko <Ruslan_Ruslichenko@epam.com>\n---\n hw/core/fdt_generic_util.c | 158 +++++++++++++++++++++++++++++\n include/hw/core/fdt_generic_util.h | 6 ++\n 2 files changed, 164 insertions(+)", "diff": "diff --git a/hw/core/fdt_generic_util.c b/hw/core/fdt_generic_util.c\nindex 51b808d9d0..0b374b550d 100644\n--- a/hw/core/fdt_generic_util.c\n+++ b/hw/core/fdt_generic_util.c\n@@ -403,6 +403,22 @@ static inline uint64_t get_int_be(const void *p, int len)\n }\n }\n \n+/* FIXME: use structs instead of parallel arrays */\n+\n+static const char *fdt_generic_reg_size_prop_names[] = {\n+ \"#address-cells\",\n+ \"#size-cells\",\n+ \"#bus-cells\",\n+ \"#priority-cells\",\n+};\n+\n+static const int fdt_generic_reg_cells_defaults[] = {\n+ 1,\n+ 1,\n+ 0,\n+ 0,\n+};\n+\n static void fdt_init_qdev_link_prop(Object *obj, ObjectProperty *p,\n FDTMachineInfo *fdti,\n const char *node_path,\n@@ -616,6 +632,146 @@ static void fdt_init_qdev_properties(char *node_path, FDTMachineInfo *fdti,\n }\n }\n \n+FDTGenericRegPropInfo*\n+fdt_get_reg_info(FDTMachineInfo *fdti, char *node_path, Object *dev)\n+{\n+ FDTGenericRegPropInfo *reg;\n+ Object *parent = NULL;\n+ char *parent_path = NULL;\n+ int cell_idx = 0;\n+ bool extended = true;\n+ Error *errp = NULL;\n+ int i;\n+\n+ if (!object_dynamic_cast(dev, TYPE_SYS_BUS_DEVICE) &&\n+ !object_dynamic_cast(dev, TYPE_FDT_GENERIC_MMAP)) {\n+ return NULL;\n+ }\n+\n+ reg = g_new0(FDTGenericRegPropInfo, 1);\n+\n+ qemu_fdt_getprop_cell(fdti->fdt, node_path, \"reg-extended\", 0,\n+ &errp);\n+ if (errp) {\n+ error_free(errp);\n+ errp = NULL;\n+ extended = false;\n+ parent_path = qemu_devtree_getparent(fdti->fdt, node_path);\n+ }\n+\n+ if (parent_path) {\n+ parent = fdt_init_get_opaque(fdti, parent_path);\n+ }\n+\n+ for (reg->n = 0;; reg->n++) {\n+ char ph_parent[DT_PATH_LENGTH];\n+ const char *pnp = parent_path;\n+\n+ reg->parents = g_renew(Object *, reg->parents, reg->n + 1);\n+ reg->parents[reg->n] = parent;\n+\n+ if (extended) {\n+ int p_ph = qemu_fdt_getprop_cell(fdti->fdt, node_path,\n+ \"reg-extended\", cell_idx++,\n+ &errp);\n+ if (errp) {\n+ error_free(errp);\n+ errp = NULL;\n+ goto exit_reg_parse;\n+ }\n+ if (qemu_devtree_get_node_by_phandle(fdti->fdt, ph_parent,\n+ p_ph)) {\n+ goto exit_reg_parse;\n+ }\n+\n+ while (!fdt_init_has_opaque(fdti, ph_parent) &&\n+ qemu_in_coroutine()) {\n+ fdt_init_yield(fdti);\n+ }\n+\n+ if (!fdt_init_has_opaque(fdti, ph_parent)) {\n+ goto exit_reg_parse;\n+ }\n+\n+ reg->parents[reg->n] = fdt_init_get_opaque(fdti, ph_parent);\n+ pnp = ph_parent;\n+ }\n+\n+ for (i = 0; i < FDT_GENERIC_REG_TUPLE_LENGTH; ++i) {\n+ const char *size_prop_name = fdt_generic_reg_size_prop_names[i];\n+ int nc = qemu_fdt_getprop_cell_inherited(fdti->fdt, node_path,\n+ size_prop_name, 0, &errp);\n+ uint64_t val = 0;\n+\n+ if (errp) {\n+ int size_default = fdt_generic_reg_cells_defaults[i];\n+\n+ fdt_debug_np(\"WARNING: no %s for %s container, assuming \"\n+ \"default of %d\\n\", size_prop_name, pnp,\n+ size_default);\n+ nc = size_default;\n+ error_free(errp);\n+ errp = NULL;\n+ }\n+\n+ reg->x[i] = g_renew(uint64_t, reg->x[i], reg->n + 1);\n+ for (int j = 0; j < nc; ++j) {\n+ val <<= 32;\n+ val |= qemu_fdt_getprop_cell(fdti->fdt, node_path,\n+ extended ? \"reg-extended\"\n+ : \"reg\",\n+ cell_idx + j, &errp);\n+ if (errp) {\n+ val = 0;\n+ break;\n+ }\n+ }\n+ reg->x[i][reg->n] = val;\n+ cell_idx += nc;\n+ if (errp) {\n+ goto exit_reg_parse;\n+ }\n+ }\n+ }\n+exit_reg_parse:\n+ if (errp) {\n+ error_free(errp);\n+ }\n+\n+ g_free(parent_path);\n+\n+ return reg;\n+}\n+\n+static void fdt_parse_node_reg_prop(FDTMachineInfo *fdti, char *node_path,\n+ Object *dev)\n+{\n+ int i;\n+\n+ FDTGenericRegPropInfo *reg = fdt_get_reg_info(fdti, node_path, dev);\n+ if (!reg) {\n+ return;\n+ }\n+\n+ if (object_dynamic_cast(dev, TYPE_FDT_GENERIC_MMAP)) {\n+ FDTGenericMMapClass *fmc = FDT_GENERIC_MMAP_GET_CLASS(dev);\n+ if (fmc->parse_reg) {\n+ while (fmc->parse_reg(FDT_GENERIC_MMAP(dev), *reg,\n+ &error_abort) && qemu_in_coroutine()) {\n+ fdt_init_yield(fdti);\n+ }\n+ }\n+ }\n+\n+ g_free(reg->parents);\n+\n+ for (i = 0; i < FDT_GENERIC_REG_TUPLE_LENGTH; ++i) {\n+ g_free(reg->x[i]);\n+ }\n+\n+ g_free(reg);\n+}\n+\n static void fdt_init_parent_node(Object *dev, Object *parent, char *node_path)\n {\n if (dev->parent) {\n@@ -744,6 +900,8 @@ static int fdt_init_qdev(char *node_path, FDTMachineInfo *fdti, char *compat)\n \n fdt_init_device_realize(fdti, node_path, dev);\n \n+ fdt_parse_node_reg_prop(fdti, node_path, dev);\n+\n g_free(parent_node_path);\n \n return 0;\ndiff --git a/include/hw/core/fdt_generic_util.h b/include/hw/core/fdt_generic_util.h\nindex 6fb0708d7a..a04ded41ae 100644\n--- a/include/hw/core/fdt_generic_util.h\n+++ b/include/hw/core/fdt_generic_util.h\n@@ -127,6 +127,12 @@ typedef struct FDTGenericRegPropInfo {\n Object **parents;\n } FDTGenericRegPropInfo;\n \n+/*\n+ * Get parsed 'reg' or 'reg-extended' properties from dts node\n+ */\n+FDTGenericRegPropInfo*\n+fdt_get_reg_info(FDTMachineInfo *fdti, char *node_path, Object *dev);\n+\n typedef struct FDTGenericMMapClass {\n /*< private >*/\n InterfaceClass parent_class;\n", "prefixes": [ "v3", "16/33" ] }