From nobody Sat Feb 7 07:11:40 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1769449912; cv=none; d=zohomail.com; s=zohoarc; b=cZ3l4mYFjVjNFfO9fAQSs67YG0quCNmXlprcqOPEnJW3LBqsfQ1cHuWL9MHEYqLeOcNpLOSd4/JLRnikzztu2YSBiDr725FadL0cC6qw/Wn2FLh9MUAfYfG4MNRJDQ/U9/8bEcVGpo07gN3Aqeh4IemY7idbjUyJEiVGF9AMm5k= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1769449912; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=9aM6zWLKlmtgCmD6m3GCHJyyGI3WEHXBduIqZsS8oug=; b=AJUcOYTD3D+PyDbTqaTg+B6rUPWgjzNaM464qaKGjAnQIdTR2fRe9BcqTrDmS/A92eU4Qj4RrH/Hn7ofRmn6OQdOmEtR37//jccyROTdygoClGHzoY65/BTtC/zVj8M2voVOSsSR1X+dkk4iEjMSWczd8zy6WzvFHk8GZVD35fk= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 176944991288030.410532574985837; Mon, 26 Jan 2026 09:51:52 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vkQd4-0001Z8-La; Mon, 26 Jan 2026 12:43:58 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vkQck-0001M1-6F for qemu-devel@nongnu.org; Mon, 26 Jan 2026 12:43:40 -0500 Received: from mail-wr1-x42d.google.com ([2a00:1450:4864:20::42d]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1vkQch-0008WD-IC for qemu-devel@nongnu.org; Mon, 26 Jan 2026 12:43:37 -0500 Received: by mail-wr1-x42d.google.com with SMTP id ffacd0b85a97d-42fb2314f52so2766587f8f.0 for ; Mon, 26 Jan 2026 09:43:34 -0800 (PST) Received: from thinkpad-t470s.. (93-143-71-105.adsl.net.t-com.hr. [93.143.71.105]) by smtp.googlemail.com with ESMTPSA id ffacd0b85a97d-435b1e71730sm34199603f8f.26.2026.01.26.09.43.32 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 26 Jan 2026 09:43:32 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1769449413; x=1770054213; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=9aM6zWLKlmtgCmD6m3GCHJyyGI3WEHXBduIqZsS8oug=; b=c+0n3tco8qdT95arUobksKieFrqoh74Q8VZBGLeDG3+QcFLUAA1WV4hVz7Xk+KD+Mo wCpBkcJiMflrPpqFIWAMMoglKwaPr/du2L7NE1VzKWqhFD5MgvKy3Si7KkJT14Xxrsr6 0GLnIRiHPIOtr2PPgoCC9ZfDCm1MZa2WNiLHVHfmSx3ZtwqfvWDJLM9WfHGBOdeP/dsY 9ZD54wu0i+5iETvgrPXiSz9cnYh8GwFR2P+4yVSq03n7ZS7ZytuBJG87FY8sEwegKPv7 AlY/2dyi6aErGFFYigkmPjUiGlc1EgDDffobJ3N4Ml/goHcIm+X8u1A/NwyO+gQynEM8 UqFQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1769449413; x=1770054213; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=9aM6zWLKlmtgCmD6m3GCHJyyGI3WEHXBduIqZsS8oug=; b=P1qUtuQGfLCskQfuyJAvNVmM8Vb2r6h/wsKjDjmYpchXG4Eu2fO4HvOpI4nIFMzdUS 3PwAFQnTmj5j9M6IYrl2vAhwoNcY0/H0OSZr1iRzJ+AvgjTw5idQ+CxDduZwYxT+OotN 43mD3le1OiLyyGw/ZkBK+zI20ayy10FUgdNSHOtqLtJpvxemeuqhOXYgVWclLtKwrU4X DLWIET1serWkh/4eGFox0uHAt2j6RSak+N/qp5tC0s6sD+e9L7xh0mfsSoCafxf37jiM dloINRgbne/iZVLTHflBInAnFX4N7e3AbV7cho0i0QbIiYzMW02mAgIj4Tto1lVeFRZF dOhw== X-Gm-Message-State: AOJu0Yw63n795NisgXs6fNdGf567mxvEJcL9REP87cMM1hu3YS2VEO1e qx1iBrPB5wrn35ASxDtEGyytdTLBSxOyq/fJWJHDUhLCIhiF2OGGeNWqstVrOJjn X-Gm-Gg: AZuq6aLuWPVp/spgX6xylkPlVLsdZBVEeiGrSG1RZQFfc8fem2gqP6CFiwEoIJbcdep 0CDnRWMDhW+61ugxJZDQHAqyjl25hL0oST8QYsGB7BaKa47MVMLc3dgaQLUZSrNSpipHCuYufAJ 6jlX0DFJZG0aePWe8bmMCioho9qV/If0dxCYjAiWAVk0JOM0uAUARmAAwD8lGc2PjuHHS+4qc2u 5n/+TO25DOmkVIau6tj737wloXb19u6CADHOQ8Vh6KDpnLQcg4KiH35XEDYPiOYdYqJhdb5Xy3T mIYpfHm4fQFTknOtGbzSF16KQbsmtOE1aUw16rOImXdrfDcpJFbyUwR0bQbYQ1/w07Aq4Dqd94W wiEWxNUZSeScQ7dm39o/fIT7JVCq4enZIntvQfI/7oCXbbwbJiGgfHGiFclFD+2GJmgFa4buwDX 7EVAzmCeNgdIJrrNfDqJh5x8A5e7lAy+f9mH/9uA0SSWhK1A08UI4INCkZAigVuvdl X-Received: by 2002:a05:6000:1849:b0:435:8fe2:e690 with SMTP id ffacd0b85a97d-435ca3a8ffdmr9751383f8f.58.1769449413091; Mon, 26 Jan 2026 09:43:33 -0800 (PST) From: Ruslan Ruslichenko To: qemu-devel@nongnu.org Cc: qemu-arm@nongnu.org, peter.maydell@linaro.org, artem_mygaiev@epam.com, volodymyr_babchuk@epam.com, takahiro.nakata.wr@renesas.com, "Edgar E . Iglesias" , Ruslan_Ruslichenko@epam.com Subject: [PATCH 09/27] hw/core/fdt_generic_util: initilize qdev properties from fdt Date: Mon, 26 Jan 2026 18:42:55 +0100 Message-ID: <20260126174313.1418150-10-ruslichenko.r@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260126174313.1418150-1-ruslichenko.r@gmail.com> References: <20260126174313.1418150-1-ruslichenko.r@gmail.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=2a00:1450:4864:20::42d; envelope-from=ruslichenko.r@gmail.com; helo=mail-wr1-x42d.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, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, FREEMAIL_FROM=0.001, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, 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 List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @gmail.com) X-ZM-MESSAGEID: 1769449914003158500 Content-Type: text/plain; charset="utf-8" From: Ruslan Ruslichenko The patch adds possibility to read and parse device tree node properties and set them to newly created object. Signed-off-by: Ruslan Ruslichenko --- hw/core/fdt_generic_util.c | 282 +++++++++++++++++++++++++++++++++++++ 1 file changed, 282 insertions(+) diff --git a/hw/core/fdt_generic_util.c b/hw/core/fdt_generic_util.c index 74310e9eb3..c1d6ed9105 100644 --- a/hw/core/fdt_generic_util.c +++ b/hw/core/fdt_generic_util.c @@ -40,6 +40,7 @@ #include "qemu/config-file.h" #include "hw/core/boards.h" #include "qemu/option.h" +#include "hw/core/qdev-properties.h" #include "hw/cpu/cluster.h" =20 #ifndef FDT_GENERIC_UTIL_ERR_DEBUG @@ -59,6 +60,8 @@ } \ } while (0) =20 +#define PROP_ARRAY_LEN_PREFIX "len-" + /* FIXME: wrap direct calls into libfdt */ =20 #include @@ -339,6 +342,25 @@ static Object *fdt_create_from_compat(const char *comp= at, char **dev_type) return ret; } =20 +/*FIXME: roll into device tree functionality */ + +static inline uint64_t get_int_be(const void *p, int len) +{ + switch (len) { + case 1: + return *((uint8_t *)p); + case 2: + return be16_to_cpu(*((uint16_t *)p)); + case 4: + return be32_to_cpu(*((uint32_t *)p)); + case 8: + return be32_to_cpu(*((uint64_t *)p)); + default: + fprintf(stderr, "unsupported integer length\n"); + abort(); + } +} + /* * Error handler for device creation failure. * @@ -368,10 +390,248 @@ static void fdt_dev_error(FDTMachineInfo *fdti, char= *node_path, char *compat) } } =20 +static void fdt_init_qdev_link_prop(Object *obj, ObjectProperty *p, + FDTMachineInfo *fdti, + const char *node_path, + const QEMUDevtreeProp *prop) +{ + int len =3D prop->len; + void *val =3D prop->value; + const char *propname =3D prop->name; + + Object *linked_dev, *proxy; + char target_node_path[DT_PATH_LENGTH]; + g_autofree char *propname_target =3D g_strconcat(propname, "-target", = NULL); + Error *errp =3D NULL; + + if (qemu_devtree_get_node_by_phandle(fdti->fdt, target_node_path, + get_int_be(val, len))) { + abort(); + } + + while (!fdt_init_has_opaque(fdti, target_node_path)) { + fdt_init_yield(fdti); + } + linked_dev =3D fdt_init_get_opaque(fdti, target_node_path); + + proxy =3D linked_dev ? object_property_get_link(linked_dev, + propname_target, + &errp) : NULL; + if (!errp && proxy) { + DB_PRINT_NP(0, "detected proxy object for %s connection\n", propna= me); + linked_dev =3D proxy; + } + + if (!linked_dev) { + return; + } + + errp =3D NULL; + object_property_set_link(obj, propname, linked_dev, &errp); + if (errp) { + /* Unable to set the property, maybe it is a memory alias? */ + MemoryRegion *alias_mr; + int offset =3D len / 2; + int region =3D 0; + + if (len > 4) { + region =3D get_int_be(val + offset, len - offset); + } + + alias_mr =3D sysbus_mmio_get_region(SYS_BUS_DEVICE(linked_dev), re= gion); + + object_property_set_link(obj, propname, OBJECT(alias_mr), &error_a= bort); + + } + + DB_PRINT_NP(0, "set link %s\n", propname); +} + +static void fdt_init_qdev_scalar_prop(Object *obj, ObjectProperty *p, + FDTMachineInfo *fdti, + const char *node_path, + const QEMUDevtreeProp *prop) +{ + const char *propname =3D trim_vendor(prop->name); + void *val =3D prop->value; + int len =3D prop->len; + + /* FIXME: handle generically using accessors and stuff */ + if (!strncmp(p->type, "link", 4)) { + fdt_init_qdev_link_prop(obj, p, fdti, node_path, prop); + return; + } + + if (!strcmp(p->type, "uint8") || !strcmp(p->type, "uint16") || + !strcmp(p->type, "uint32") || !strcmp(p->type, "uint64") || + !strcmp(p->type, "int8") || !strcmp(p->type, "int16") || + !strcmp(p->type, "int32") || !strcmp(p->type, "int64")) { + object_property_set_int(obj, propname, + get_int_be(val, len), &error_abort); + DB_PRINT_NP(0, "set property %s to 0x%llx\n", propname, + (unsigned long long)get_int_be(val, len)); + return; + } + + if (!strcmp(p->type, "boolean") || !strcmp(p->type, "bool")) { + object_property_set_bool(obj, propname, + !!get_int_be(val, len), &error_abort); + DB_PRINT_NP(0, "set property %s to %s\n", propname, + get_int_be(val, len) ? "true" : "false"); + return; + } + + if (!strcmp(p->type, "string") || !strcmp(p->type, "str")) { + object_property_set_str(obj, propname, + (const char *)val, &error_abort); + DB_PRINT_NP(0, "set property %s to %s\n", propname, (const char *)= val); + return; + } + + DB_PRINT_NP(0, "WARNING: property is of unknown type\n"); +} + +static size_t fdt_array_elem_len(FDTMachineInfo *fdti, + const char *node_path, + const char *propname) +{ + g_autofree char *elem_cells_propname =3D NULL; + Error *err =3D NULL; + uint32_t elem_cells; + + /* + * Default element size to 1 uint32_t cell, unless it is explicitly + * given in the same FDT node (not inherited). + */ + elem_cells_propname =3D g_strconcat("#", propname, "-cells", NULL); + elem_cells =3D qemu_fdt_getprop_cell(fdti->fdt, node_path, + elem_cells_propname, 0, false, &err= ); + + return (err ? 1 : elem_cells) * 4; +} + +static ObjectProperty *fdt_array_elem_prop(Object *obj, + const char *propname, int k) +{ + g_autofree char *elem_name =3D g_strdup_printf("%s[%d]", propname, k); + + return object_property_find(obj, elem_name); +} + +static char *fdt_array_elem_type(ObjectProperty *e) +{ + size_t n =3D strlen(e->type); + + if (strncmp(e->type, "link", 4)) { + return NULL; + } + if (n > 6) { + return g_strndup(&e->type[5], (n - 6)); + } + + return g_strdup(TYPE_OBJECT); +} + +static ObjectProperty *fdt_array_link_elem_prop(Object *obj, ObjectPropert= y *e, + const char *elem_link_type) +{ + /* + * Starting QEMU 8.2.0, the array-scheme has changed to be a single + * property of list. See: + * https://mail.gnu.org/archive/html/qemu-devel/2023-09/msg01832.html + * + * Thus, fdt_init_qdev_array_prop() below will have to be changed + * substantially. + * + * So for now, use a temporary hack to work around DEFINE_PROP_ARRAY()= not + * creating the proper elements of type "link" (see set_prop_arraylen(= )). + */ + g_autofree char *elem_name =3D g_strdup(e->name); + void *elem_ptr =3D object_field_prop_ptr(obj, e->opaque); + + object_property_del(obj, elem_name); + e =3D object_property_add_link(obj, elem_name, + elem_link_type, elem_ptr, + qdev_prop_allow_set_link_before_realize, + OBJ_PROP_LINK_STRONG); + + return e; +} + +static void fdt_init_qdev_array_prop(Object *obj, + FDTMachineInfo *fdti, + const char *node_path, + QEMUDevtreeProp *prop) +{ + const char *propname =3D trim_vendor(prop->name); + int nr =3D prop->len; + Error *local_err =3D NULL; + char *len_name; + uint32_t elem_len; + g_autofree char *elem_link_type =3D NULL; + ObjectProperty *e; + + if (!prop->value || !nr) { + return; + } + + elem_len =3D fdt_array_elem_len(fdti, node_path, propname); + if (nr % elem_len) { + return; + } + + nr /=3D elem_len; + + /* + * Fail gracefully on setting the 'len-' property, due to: + * 1. The property does not exist, or + * 2. The property is not integer type, or + * 3. The property has been set, e.g., by the '-global' cmd option + */ + len_name =3D g_strconcat(PROP_ARRAY_LEN_PREFIX, propname, NULL); + object_property_set_int(obj, len_name, nr, &local_err); + g_free(len_name); + + if (local_err) { + error_free(local_err); + return; + } + + e =3D fdt_array_elem_prop(obj, propname, 0); + if (!e) { + return; + } + + elem_link_type =3D fdt_array_elem_type(e); + + while (nr--) { + QEMUDevtreeProp q; + + e =3D fdt_array_elem_prop(obj, propname, nr); + if (!e) { + continue; + } + + q =3D (QEMUDevtreeProp){.name =3D e->name, + .value =3D prop->value + nr * elem_len, + .len =3D elem_len, + }; + + if (elem_link_type) { + e =3D fdt_array_link_elem_prop(obj, e, elem_link_type); + q.name =3D e->name; + fdt_init_qdev_link_prop(obj, e, fdti, node_path, &q); + } else { + fdt_init_qdev_scalar_prop(obj, e, fdti, node_path, &q); + } + } +} + static int fdt_init_qdev(char *node_path, FDTMachineInfo *fdti, char *comp= at) { Object *dev, *parent; char *dev_type =3D NULL; + QEMUDevtreeProp *prop, *props; char parent_node_path[DT_PATH_LENGTH]; =20 if (!compat) { @@ -459,6 +719,28 @@ static int fdt_init_qdev(char *node_path, FDTMachineIn= fo *fdti, char *compat) } fdt_init_set_opaque(fdti, node_path, dev); =20 + props =3D qemu_devtree_get_props(fdti->fdt, node_path); + for (prop =3D props; prop->name; prop++) { + const char *propname =3D trim_vendor(prop->name); + ObjectProperty *p =3D NULL; + + p =3D object_property_find(OBJECT(dev), propname); + if (p) { + DB_PRINT_NP(1, "matched property: %s of type %s, len %d\n", + propname, p->type, prop->len); + } + if (!p) { + fdt_init_qdev_array_prop(dev, fdti, node_path, prop); + continue; + } + + if (!strcmp(propname, "type")) { + continue; + } + + fdt_init_qdev_scalar_prop(OBJECT(dev), p, fdti, node_path, prop); + } + g_free(dev_type); =20 return 0; --=20 2.43.0